Fungsi

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 Objek Return<T>.
  • Untuk kasus yang lebih rumit, nilai return generates adalah ditampilkan melalui parameter callback yang disediakan dengan panggilan fungsi itu sendiri, dan fungsi tersebut menampilkan Return<void>.
  • Jika tidak ada pernyataan generates, fungsi akan menampilkan Return<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>.