Fungsi

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