Fungsi di antarmuka HIDL dipetakan ke metode dalam deklarasi class C++
IFoo
yang dibuat secara otomatis. Nama setiap fungsi tetap
sama di C++; bagian berikut menjelaskan cara argumen HIDL dan nilai
kembali diterjemahkan ke C++.
Parameter fungsi
Argumen yang tercantum dalam file .hal
dipetakan ke jenis data C++.
Argumen yang tidak dipetakan ke jenis C++ primitif diteruskan oleh referensi
const.
Untuk setiap fungsi HIDL yang memiliki nilai yang ditampilkan (memiliki pernyataan
generates
), daftar parameter C++ untuk fungsi tersebut memiliki argumen tambahan:
fungsi callback yang dipanggil dengan nilai yang ditampilkan dari fungsi HIDL.
Ada satu pengecualian: Jika klausa generates
berisi satu parameter yang langsung dipetakan ke primitif C++, penghapusan callback akan digunakan (callback dihapus dan nilai return
ditampilkan dari fungsi melalui pernyataan return
normal).
Nilai yang ditampilkan fungsi
Fungsi berikut memiliki nilai yang ditampilkan.
Error transpor dan jenis nilai yang ditampilkan
Pernyataan generates
dapat menghasilkan tiga jenis tanda tangan
fungsi:
- Hanya untuk satu nilai return yang merupakan primitif C++, nilai return
generates
ditampilkan berdasarkan nilai dari fungsi dalam objekReturn<T>
. - Untuk kasus yang lebih rumit, nilai return
generates
ditampilkan melalui parameter callback yang disediakan dengan panggilan fungsi itu sendiri, dan fungsi menampilkanReturn<void>
. - Jika tidak ada pernyataan
generates
, fungsi akan menampilkanReturn<void>
.
Panggilan RPC terkadang dapat mengalami error transpor, misalnya saat server berhenti berfungsi, saat resource transpor tidak memadai untuk menyelesaikan panggilan, atau saat parameter yang diteruskan tidak mengizinkan penyelesaian panggilan (seperti tidak adanya fungsi callback yang diperlukan). Objek Return
menyimpan indikasi error
transpor serta nilai T
(kecuali
Return<void>
).
Karena fungsi sisi klien dan sisi server memiliki tanda tangan yang sama, fungsi sisi server harus menampilkan jenis Return
meskipun penerapannya tidak menandakan error transpor. Objek Return<T>
dibuat dengan Return(myTValue)
(atau dapat dibuat secara implisit
dari mTValue
, seperti dalam pernyataan
return
) dan objek Return<void>
dibuat dengan
Void()
.
Objek Return<T>
memiliki konversi implisit ke dan dari nilai T
-nya. Objek Return
dapat diperiksa untuk
error transpor dengan memanggil metode isOk()
. Pemeriksaan ini tidak
diperlukan; namun, jika error terjadi dan tidak diperiksa pada saat
objek Return
dihancurkan, atau konversi nilai T
dicoba, proses klien akan dihentikan dan error akan dicatat dalam log. Jika
isOk()
menunjukkan error transpor atau kegagalan panggilan karena error
logika dalam kode developer (seperti meneruskan nullptr
sebagai callback
sinkron), description()
dapat dipanggil pada objek Return untuk
menampilkan string yang sesuai untuk logging. Dalam kasus seperti itu, tidak ada cara untuk
menentukan jumlah kode yang mungkin telah dieksekusi di server sebagai akibat dari
panggilan yang gagal. Metode isDeadObject()
juga disediakan. Metode
ini menunjukkan bahwa !isOk()
karena objek jarak jauh telah
error atau tidak ada lagi. isDeadObject()
selalu menyiratkan
!isOk()
.
Menampilkan berdasarkan nilai
Jika pernyataan generates
dipetakan ke satu primitif C++, tidak ada
parameter callback dalam daftar parameter. Sebagai gantinya, implementasi menyediakan
nilai return T
dalam objek Return<T>
, yang
dapat dihasilkan secara implisit dari jenis primitif T
. Contoh:
Return<uint32_t> someMethod() { uint32_t return_data = ...; // Compute return_data return return_data; };
Metode Return<*>::withDefault
juga disediakan. Metode ini
memberikan nilai jika nilai yang ditampilkan adalah !isOk()
.
Metode ini juga otomatis menandai objek yang ditampilkan sebagai baik sehingga proses
klien tidak akan dihentikan.
Menampilkan menggunakan parameter callback
Callback dapat meneruskan nilai return fungsi HIDL kembali ke pemanggil.
Prototipe callback adalah objek std::function
dengan
parameter (diambil dari pernyataan generates
) yang dipetakan ke jenis
C++. Nilai yang ditampilkannya tidak valid—callback itu sendiri tidak menampilkan nilai.
Nilai yang ditampilkan dari fungsi C++ dengan parameter callback memiliki jenis
Return<void>
. Implementasi server hanya bertanggung jawab
untuk memberikan nilai return. Karena nilai return sudah ditransfer menggunakan callback, parameter template T
adalah void
:
Return<void> someMethod(someMethod_cb _cb);
Dari implementasi C++, implementasi server harus menampilkan
Void()
, yang merupakan fungsi inline statis yang menampilkan
objek Return<void>
. Contoh implementasi metode server
umum dengan parameter callback:
Return<void> someMethod(someMethod_cb _cb) { // Do some processing, then call callback with return data hidl_vec<uint32_t> vec = ... _cb(vec); return Void(); };
Fungsi tanpa nilai return
Tanda tangan C++ fungsi tanpa pernyataan generates
tidak akan memiliki parameter callback dalam daftar parameter. Jenis nilai yang ditampilkan akan
menjadi Return<void>.
Fungsi satu arah
Fungsi yang ditandai dengan kata kunci oneway
adalah fungsi asinkron (klien tidak akan memblokir eksekusi) dan tidak memiliki nilai yang ditampilkan. Tanda tangan C++ fungsi oneway
tidak akan memiliki
parameter callback dalam daftar parameter, dan nilai yang ditampilkan C++-nya akan
Return<void>
.