Các hàm trong giao diện HIDL được liên kết với các phương thức trong nội dung khai báo lớp C++ IFoo
được tạo tự động. Tên của mỗi hàm vẫn giữ nguyên trong C++; các phần sau đây mô tả cách các đối số HIDL và giá trị trả về được dịch sang C++.
Tham số hàm
Các đối số được liệt kê trong tệp .hal
ánh xạ đến các loại dữ liệu C++.
Các đối số không ánh xạ đến một loại C++ gốc đượ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 đó sẽ có một đối số bổ sung: một hàm gọi lại được gọi bằng 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 đến một hàm gốc C++, thì lệnh gọi lại lược bỏ sẽ được sử dụng (lệnh gọi lại sẽ bị xoá và giá trị trả về sẽ đượ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 truyền tải và loại dữ liệu trả về
Câu lệnh generates
có thể dẫn đến 3 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
đượ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 lệnh gọi hàm, và hàm này sẽ trả vềReturn<void>
. - Khi không có câu lệnh
generates
, hàm sẽ trả vềReturn<void>
.
Đôi khi, các lệnh gọi RPC có thể gặp lỗi truyền tải, chẳng hạn như khi máy chủ ngừng hoạt động, khi tài nguyên truyền tải không đủ để hoàn tất lệnh gọi hoặc khi các tham số được truyền không cho phép hoàn tất lệnh gọi (chẳng hạn như thiếu một hàm gọi lại bắt buộc). Các đối tượng Return
lưu trữ các chỉ báo lỗi truyề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ề một loại Return
mặc dù việc triển khai hàm này không báo hiệu lỗi truyền tải. Các đối tượng Return<T>
được tạo bằng Return(myTValue)
(hoặc có thể được tạo ngầm từ mTValue
, chẳng hạn như trong câu lệnh return
) và các đối tượng Return<void>
được tạo bằng Void()
.
Các đối tượng Return<T>
có lượt chuyển đổi ngầm ẩn đến và từ giá trị T
. Bạn có thể kiểm tra đối tượng Return
để tìm lỗi truyền tải bằng cách gọi phương thức isOk()
của đối tượng đó. Bạn không bắt buộc phải thực hiện bước kiểm tra này; tuy nhiên, nếu lỗi xảy ra và không được kiểm tra vào thời điểm đối tượng Return
bị huỷ bỏ hoặc khi bạn cố gắng chuyển đổi giá trị T
, thì quá trình của ứng dụng sẽ bị huỷ và lỗi sẽ được ghi lại. Nếu isOk()
cho biết lỗi truyền tải hoặc lỗi gọi do lỗi logic trong mã của nhà phát triển (chẳng hạn như truyền nullptr
dưới dạng lệnh gọi lại đồng bộ), thì bạn có thể gọi description()
trên đối tượng Return để trả về một chuỗi phù hợp để ghi nhật ký. Trong những trường hợp như vậy, không có cách nào để xác định lượng mã có thể đã 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 cho biết !isOk()
là do đối tượng từ xa đã gặp sự cố 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ạ đến một nguyên hàm C++ duy nhất, thì sẽ không có tham số gọi lại nào trong danh sách tham số. Thay vào đó, quá trình triển khai sẽ 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ừ loại gốc 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 để quy trình của ứng dụng không bị huỷ.
Trả về bằng tham số gọi lại
Lệnh gọi lại có thể truyền giá trị trả về của hàm HIDL trở lại phương thức gọi.
Nguyên mẫu của lệnh gọi lại là một đối tượng std::function
có các tham số (lấy từ câu lệnh generates
) được liên kết với các loại C++. Giá trị trả về của hàm này là rỗng – chính hàm gọi lại không trả về giá trị.
Giá trị trả về của một hàm C++ có tham số gọi lại có kiểu 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ừ quá trình triển khai C++, các quá trình triển khai máy chủ sẽ trả về Void()
, đây là một hàm nội tuyến tĩnh trả về đối tượng Return<void>
. Ví dụ về cách triển khai phương thức máy chủ thông thường bằng 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 một 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ố. Loại dữ liệu trả về sẽ là Return<void>.
Hàm một chiều
Các hàm được đánh dấu bằng từ khoá oneway
là các hàm không đồng bộ (ứng dụng sẽ không chặn khi thực thi) 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 hàm này sẽ là Return<void>
.