13436413476434916364

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 objek Return<T> .
  • Untuk kasus yang lebih rumit, nilai pengembalian yang generates dikembalikan melalui parameter panggilan balik yang disediakan dengan pemanggilan fungsi itu sendiri, dan fungsi mengembalikan Return<void> .
  • Karena ketika tidak ada pernyataan generates , fungsi mengembalikan Return<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> .