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 file .hal
dipetakan ke tipe data C++. Argumen yang tidak dipetakan ke tipe C++ primitif diteruskan dengan 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 secara langsung dipetakan ke primitif C++, callback elision digunakan (callback dihapus dan nilai kembalian dikembalikan dari fungsi melalui pernyataan return
normal).
Nilai pengembalian fungsi
Fungsi berikut memiliki nilai kembalian.
Kesalahan transportasi dan jenis pengembalian
Pernyataan generates
dapat menghasilkan tiga jenis tanda tangan fungsi:
- Hanya untuk satu nilai kembalian yang merupakan primitif C++, nilai kembalian
generates
dikembalikan berdasarkan nilai dari fungsi dalam objekReturn<T>
. - Untuk kasus yang lebih rumit, nilai kembalian
generates
dikembalikan melalui parameter panggilan balik yang disediakan dengan pemanggilan fungsi itu sendiri, dan fungsi tersebut mengembalikanReturn<void>
. - Karena ketika tidak ada pernyataan
generates
, fungsi akan mengembalikanReturn<void>
.
Panggilan RPC kadang-kadang dapat mengalami kesalahan transportasi, misalnya ketika server mati, ketika sumber daya transportasi tidak mencukupi untuk menyelesaikan panggilan, atau ketika parameter yang diteruskan tidak mengizinkan penyelesaian panggilan (seperti kehilangan fungsi panggilan balik yang diperlukan). Objek Return
menyimpan indikasi kesalahan pengangkutan 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 kesalahan pengangkutannya 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 transportasi 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 ini, 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()
karena objek jarak jauh telah mogok atau tidak ada lagi. isDeadObject()
selalu menyiratkan !isOk()
.
Kembalikan berdasarkan nilai
Jika pernyataan generates
peta ke satu primitif C++, tidak ada parameter panggilan balik dalam daftar parameter. Sebaliknya, implementasi memberikan nilai kembalian T
dalam objek Return<T>
, yang secara implisit dapat dihasilkan dari tipe primitif T
. Misalnya:
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 terhenti.
Kembali menggunakan parameter panggilan balik
Panggilan balik dapat meneruskan nilai kembalian fungsi HIDL kembali ke pemanggil. Prototipe callback adalah objek std::function
dengan parameter (diambil dari pernyataan generates
) yang dipetakan ke tipe C++. Nilai pengembaliannya tidak berlaku—callback itu sendiri tidak mengembalikan nilai.
Nilai kembalian fungsi C++ dengan parameter panggilan balik memiliki tipe Return<void>
. Implementasi server hanya bertanggung jawab untuk menyediakan nilai kembalian. Karena nilai kembalian sudah ditransfer menggunakan callback, parameter template T
adalah void
:
Return<void> someMethod(someMethod_cb _cb);
Dari implementasi C++, implementasi server harus mengembalikan Void()
, yang merupakan fungsi sebaris statis yang mengembalikan objek Return<void>
. Contoh implementasi metode server pada umumnya 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 kembalian
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 kembalian. Tanda tangan C++ dari fungsi oneway
tidak akan memiliki parameter panggilan balik dalam daftar parameter, dan nilai kembalian C++-nya adalah Return<void>
.