Các hàm trong giao diện HIDL được ánh xạ tới các phương thức trong khai báo lớp IFoo
C++ được tạo tự động. Tên của từng hàm vẫn giữ nguyên trong C++; các phần sau đây mô tả cách dịch các đối số và giá trị trả về HIDL sang C++.
Thông số chức năng
Các đối số được liệt kê trong tệp .hal
ánh xạ tới các kiểu dữ liệu C++. Các đối số không ánh xạ tới kiểu C++ nguyên thủy được truyền bằng tham chiếu const.
Đối với mỗi hàm HIDL có giá trị trả về (có câu lệnh generates
), danh sách tham số C++ cho hàm đó có một đối số bổ sung: hàm gọi lại được gọi với các giá trị trả về của hàm HIDL. Có một ngoại lệ : Nếu mệnh đề generates
chứa một tham số duy nhất ánh xạ trực tiếp tới nguyên hàm C++, thì phép chọn lọc gọi lại được sử dụng (gọi lại bị loại bỏ và giá trị trả về được trả về từ hàm thông qua câu lệnh return
thông thường).
Giá trị trả về của hàm
Các hàm sau đây có giá trị trả về.
Lỗi vận chuyển và kiểu trả về
Câu lệnh generates
có thể dẫn đến ba loại chữ ký hàm:
- Đối với chỉ một giá trị trả về là giá trị gốc C++, giá trị trả về
generates
sẽ được trả về theo giá trị từ hàm trong đối tượngReturn<T>
. - Đối với các trường hợp phức tạp hơn, (các) giá trị trả về
generates
sẽ được trả về thông qua tham số gọi lại được cung cấp cùng với chính lệnh gọi hàm và hàm trả vềReturn<void>
. - Vì khi không có câu lệnh
generates
nào tồn tại, hàm sẽ trả vềReturn<void>
.
Các cuộc gọi RPC đôi khi có thể gặp phải lỗi truyền tải, ví dụ như khi máy chủ ngừng hoạt động, khi tài nguyên truyền tải không đủ để hoàn thành cuộc gọi hoặc khi các tham số được truyền không cho phép hoàn thành cuộc gọi (chẳng hạn như thiếu chức năng gọi lại bắt buộc). Đối tượng Return
lưu trữ các chỉ báo lỗi vận chuyển cũng như giá trị T
(ngoại trừ Return<void>
).
Vì các hàm phía máy khách và phía máy chủ có cùng chữ ký nên hàm phía máy chủ phải trả về kiểu Return
ngay cả khi việc triển khai nó không báo hiệu lỗi truyền tải. Các đối tượng Return<T>
được xây dựng bằng Return(myTValue)
(hoặc có thể được xây dựng ngầm từ mTValue
, chẳng hạn như trong câu lệnh return
) và các đối tượng Return<void>
được xây dựng bằng Void()
.
Các đối tượng Return<T>
có sự chuyển đổi tiềm ẩn sang và từ giá trị T
của chúng. Đối tượng Return
có thể được kiểm tra lỗi truyền tải bằng cách gọi phương thức isOk()
của nó. Việc kiểm tra này là không bắt buộc; tuy nhiên, nếu xảy ra lỗi và không được kiểm tra vào thời điểm đối tượng Return
bị hủy hoặc cố gắng chuyển đổi giá trị T
thì quy trình máy khách sẽ bị hủy và lỗi được ghi lại. Nếu isOk()
chỉ ra lỗi truyền tải hoặc lỗi cuộc gọi do lỗi logic trong mã nhà phát triển (chẳng hạn như chuyển nullptr
dưới dạng lệnh gọi lại đồng bộ), thì có thể gọi description()
trên đối tượng Return để trả về một chuỗi phù hợp cho việc ghi nhật ký. Trong những trường hợp như vậy, không có cách nào để xác định số lượng mã có thể đã được thực thi trên máy chủ do lệnh gọi không thành công. Phương thức isDeadObject()
cũng được cung cấp. Phương thức này chỉ ra rằng !isOk()
là do đối tượng từ xa đã bị hỏng hoặc không còn tồn tại. isDeadObject()
luôn ngụ ý !isOk()
.
Trả về theo giá trị
Nếu câu lệnh generates
ánh xạ tới một nguyên hàm C++ duy nhất thì không có tham số gọi lại nào có trong danh sách tham số. Thay vào đó, việc triển khai cung cấp giá trị trả về T
trong đối tượng Return<T>
, giá trị này có thể được tạo ngầm từ kiểu nguyên thủy T
. Ví dụ:
Return<uint32_t> someMethod() { uint32_t return_data = ...; // Compute return_data return return_data; };
Phương thức Return<*>::withDefault
cũng được cung cấp. Phương thức này cung cấp một giá trị trong trường hợp giá trị trả về là !isOk()
. Phương thức này cũng tự động đánh dấu đối tượng trả về là ổn nên tiến trình máy khách sẽ không bị hủy.
Trả về bằng tham số gọi lại
Lệnh gọi lại có thể chuyển giá trị trả về của hàm HIDL lại cho người gọi. Nguyên mẫu của lệnh gọi lại là một đối tượng std::function
với các tham số (lấy từ câu lệnh generates
) được ánh xạ tới các kiểu C++. Giá trị trả về của nó là void—bản thân lệnh gọi lại không trả về giá trị.
Giá trị trả về của hàm C++ với tham số gọi lại có loại Return<void>
. Việc triển khai máy chủ chỉ chịu trách nhiệm cung cấp giá trị trả về. Vì các giá trị trả về đã được chuyển bằng lệnh gọi lại nên tham số mẫu T
là void
:
Return<void> someMethod(someMethod_cb _cb);
Từ việc triển khai C++ của họ, việc triển khai máy chủ sẽ trả về Void()
, đây là một hàm nội tuyến tĩnh trả về một đối tượng Return<void>
. Ví dụ về cách triển khai phương thức máy chủ điển hình với tham số gọi lại:
Return<void> someMethod(someMethod_cb _cb) { // Do some processing, then call callback with return data hidl_vec<uint32_t> vec = ... _cb(vec); return Void(); };
Hàm không có giá trị trả về
Chữ ký C++ của hàm không có câu lệnh generates
sẽ không có tham số gọi lại trong danh sách tham số. Kiểu trả về của nó sẽ là Return<void>.
Chức năng một chiều
Các hàm được đánh dấu bằng từ khóa oneway
là các hàm không đồng bộ (máy khách sẽ không chặn quá trình thực thi của chúng) và không có giá trị trả về. Chữ ký C++ của hàm oneway
sẽ không có tham số gọi lại trong danh sách tham số và giá trị trả về C++ của nó sẽ là Return<void>
.