Fungsi di antarmuka HIDL dipetakan ke metode yang dibuat otomatis
Deklarasi class C++ IFoo
. Nama setiap fungsi tetap
sama di C++; bagian berikut menjelaskan bagaimana argumen HIDL dan hasil
nilai tersebut akan
diterjemahkan ke dalam C++.
Parameter fungsi
Argumen yang tercantum dalam file .hal
dipetakan ke jenis data C++.
Argumen yang tidak dipetakan ke jenis C++ primitif diteruskan oleh konstanta
alamat IP internal.
Untuk setiap fungsi HIDL yang memiliki nilai hasil (memiliki generates
), daftar parameter C++ untuk fungsi tersebut memiliki argumen tambahan:
fungsi callback yang dipanggil dengan nilai hasil fungsi HIDL.
Ada satu pengecualian: Jika klausa generates
berisi parameter tunggal yang memetakan langsung ke callback primitif C++
elision digunakan (callback dihapus dan nilai yang ditampilkan adalah
ditampilkan dari fungsi melalui pernyataan return
normal).
Nilai yang ditampilkan fungsi
Fungsi berikut memiliki nilai hasil.
Error transportasi dan jenis nilai yang ditampilkan
Pernyataan generates
dapat menghasilkan tiga jenis fungsi
tanda tangan:
- Hanya untuk satu nilai yang ditampilkan yang merupakan primitif C++,
Nilai yang ditampilkan
generates
ditampilkan berdasarkan nilai dari fungsi dalam ObjekReturn<T>
. - Untuk kasus yang lebih rumit, nilai return
generates
adalah ditampilkan melalui parameter callback yang disediakan dengan panggilan fungsi itu sendiri, dan fungsi tersebut menampilkanReturn<void>
. - Jika tidak ada pernyataan
generates
, fungsi akan menampilkanReturn<void>
.
Panggilan RPC terkadang dapat mengalami error transportasi, misalnya saat server
mati, ketika sumber daya transpor tidak mencukupi untuk menyelesaikan panggilan, atau ketika
parameter yang diteruskan tidak mengizinkan penyelesaian panggilan (seperti kehilangan
fungsi callback yang diperlukan). Error transpor objek Return
indikasi 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
tidak menandakan error transpor. Return<T>
objek dibuat dengan Return(myTValue)
(atau dapat secara implisit
dibuat dari mTValue
, seperti di return
pernyataan) dan objek Return<void>
dibuat dengan
Void()
.
Objek Return<T>
memiliki konversi implisit ke dan dari
nilai T
-nya. Objek Return
dapat diperiksa
error transpor dengan memanggil metode isOk()
. Pemeriksaan ini tidak
diperlukan; akan tetapi, jika terjadi {i>error<i} dan tidak diperiksa pada saat
Objek Return
dihancurkan, atau konversi nilai T
dihancurkan
dicoba, proses klien akan dimatikan
dan {i>error<i} dicatat. Jika
isOk()
menunjukkan error transpor atau kegagalan panggilan karena logika
error dalam kode developer (seperti meneruskan nullptr
sebagai
callback), maka description()
dapat dipanggil pada objek Return ke
mengembalikan {i>string<i} yang cocok untuk {i>logging<i}. Dalam kasus tersebut, tidak ada cara untuk
menentukan berapa banyak kode yang mungkin
telah dieksekusi di server sebagai akibat dari
panggilan gagal. Metode isDeadObject()
juga disediakan. Ini
menunjukkan bahwa !isOk()
disebabkan karena objek jarak jauh memiliki
error atau sudah tidak ada. isDeadObject()
selalu menyiratkan
!isOk()
.
Tampilkan berdasarkan nilai
Jika pernyataan generates
dipetakan ke satu primitif C++, tidak
parameter callback yang ada dalam daftar parameter. Sebagai gantinya, implementasi menyediakan
nilai yang ditampilkan T
dalam objek Return<T>
, yang
secara implisit dapat dibuat dari jenis primitif T
. Contoh:
Return<uint32_t> someMethod() { uint32_t return_data = ...; // Compute return_data return return_data; };
Metode Return<*>::withDefault
juga disediakan. Ini
memberikan nilai jika nilai yang ditampilkan adalah !isOk()
.
Metode ini juga secara otomatis menandai objek yang ditampilkan sebagai baik-baik saja sehingga klien
proses tidak akan dimatikan.
Tampilkan menggunakan parameter callback
Callback dapat meneruskan nilai hasil fungsi HIDL kembali ke pemanggil.
Prototipe callback adalah objek std::function
dengan
parameter (diambil dari pernyataan generates
) yang dipetakan ke C++
jenis datanya. Nilai yang ditampilkan adalah void—callback itu sendiri tidak menampilkan nilai.
Nilai yang ditampilkan fungsi C++ dengan parameter callback memiliki jenis
Return<void>
. Implementasi server hanya
bertanggung jawab
untuk memberikan nilai yang ditampilkan. Karena nilai yang ditampilkan sudah ditransfer
menggunakan callback, parameter template T
adalah void
:
Return<void> someMethod(someMethod_cb _cb);
Dari implementasi C++-nya, implementasi server harus
Void()
, yang merupakan fungsi inline statis yang menampilkan
Objek Return<void>
. Contoh 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 yang ditampilkan
Tanda tangan C++ dari suatu 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
bersifat asinkron
fungsi (klien tidak akan memblokir eksekusi mereka) dan tidak memiliki hasil
masing-masing. Tanda tangan C++ dari fungsi oneway
tidak akan memiliki
dalam daftar parameter, dan nilai hasil C++-nya akan menjadi
Return<void>
.