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