Fungsi dalam antarmuka HIDL dipetakan ke metode dalam deklarasi kelas IFoo
C++ yang dibuat secara otomatis. Nama setiap fungsi tetap sama di C++; bagian berikut menjelaskan bagaimana argumen HIDL dan nilai kembalian diterjemahkan ke C++.
Parameter fungsi
Argumen yang tercantum dalam peta file .hal
ke tipe data C++. Argumen yang tidak dipetakan ke tipe C++ primitif dilewatkan oleh referensi const.
Untuk setiap fungsi HIDL yang memiliki nilai kembalian (memiliki pernyataan generates
), daftar parameter C++ untuk fungsi tersebut memiliki argumen tambahan: fungsi panggilan balik yang dipanggil dengan nilai kembalian fungsi HIDL. Ada satu pengecualian : Jika klausa generates
berisi parameter tunggal yang langsung dipetakan ke primitif C++, penghapusan panggilan balik digunakan (panggilan balik dihapus dan nilai kembalian dikembalikan dari fungsi melalui pernyataan return
normal).
Fungsi mengembalikan nilai
Fungsi berikut memiliki nilai kembalian.
Kesalahan transportasi dan jenis pengembalian
Pernyataan generates
dapat menghasilkan tiga jenis tanda tangan fungsi:
- Untuk hanya satu nilai pengembalian yang merupakan primitif C++, nilai pengembalian yang
generates
dikembalikan oleh nilai dari fungsi dalam objekReturn<T>
. - Untuk kasus yang lebih rumit, nilai pengembalian yang
generates
dikembalikan melalui parameter panggilan balik yang disediakan dengan pemanggilan fungsi itu sendiri, dan fungsi mengembalikanReturn<void>
. - Karena ketika tidak ada pernyataan
generates
, fungsi mengembalikanReturn<void>
.
Panggilan RPC kadang-kadang dapat mengalami kesalahan transpor, misalnya saat server mati, saat sumber daya transportasi tidak mencukupi untuk menyelesaikan panggilan, atau saat parameter yang diteruskan tidak mengizinkan penyelesaian panggilan (seperti kehilangan fungsi panggilan balik yang diperlukan). Objek Return
menyimpan indikasi kesalahan transportasi serta nilai T
(kecuali Return<void>
).
Karena fungsi sisi klien dan sisi server memiliki tanda tangan yang sama, fungsi sisi server harus mengembalikan tipe Return
meskipun implementasinya tidak menandakan kesalahan transportasi. 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 kesalahan transportasi dengan memanggil metode isOk()
-nya. Pemeriksaan ini tidak diperlukan; namun, jika kesalahan terjadi dan tidak diperiksa pada saat objek Return
dihancurkan, atau konversi nilai T
dicoba, proses klien akan dihentikan dan kesalahan dicatat. Jika isOk()
menunjukkan kesalahan transport atau kegagalan panggilan karena kesalahan logika dalam kode pengembang (seperti meneruskan nullptr
sebagai panggilan balik sinkron), maka description()
dapat dipanggil pada objek Return untuk mengembalikan string yang sesuai untuk logging. Dalam kasus seperti itu, tidak ada cara untuk menentukan berapa banyak kode yang mungkin telah dieksekusi di server sebagai akibat dari panggilan yang gagal. Metode isDeadObject()
juga disediakan. Metode ini menunjukkan bahwa !isOk()
adalah karena objek jarak jauh telah rusak atau tidak ada lagi. isDeadObject()
selalu menyiratkan !isOk()
.
Kembali dengan nilai
Jika pernyataan generates
memetakan ke primitif C++ tunggal, tidak ada parameter panggilan balik dalam daftar parameter. Sebagai gantinya, sebuah implementasi memberikan nilai kembalian T
dalam objek Return<T>
, yang dapat dihasilkan secara implisit dari tipe primitif T
. Sebagai 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 dikembalikan adalah !isOk()
. Metode ini juga secara otomatis menandai objek yang dikembalikan sebagai oke sehingga proses klien tidak akan dimatikan.
Kembali menggunakan parameter panggilan balik
Panggilan balik dapat meneruskan nilai pengembalian fungsi HIDL kembali ke pemanggil. Prototipe dari callback adalah objek std::function
dengan parameter (diambil dari pernyataan generates
) yang dipetakan ke tipe C++. Nilai kembaliannya batal—panggilan balik itu sendiri tidak mengembalikan nilai.
Nilai kembalian fungsi C++ dengan parameter panggilan balik memiliki tipe Return<void>
. Implementasi server hanya bertanggung jawab untuk memberikan nilai pengembalian. Karena nilai yang dikembalikan sudah ditransfer menggunakan callback, parameter template T
adalah void
:
Return<void> someMethod(someMethod_cb _cb);
Dari implementasi C++ mereka, implementasi server harus mengembalikan Void()
, yang merupakan fungsi inline statis yang mengembalikan objek Return<void>
. Contoh implementasi metode server tipikal 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 balik
Tanda tangan C++ dari suatu fungsi tanpa pernyataan generates
tidak akan memiliki parameter panggilan balik dalam daftar parameter. Jenis pengembaliannya adalah Return<void>.
Fungsi satu arah
Fungsi yang ditandai dengan kata kunci oneway
adalah fungsi asinkron (klien tidak akan memblokir eksekusinya) dan tidak memiliki nilai balik. Tanda tangan C++ dari fungsi oneway
tidak akan memiliki parameter panggilan balik dalam daftar parameter, dan nilai pengembalian C++ akan menjadi Return<void>
.