ฟังก์ชันในอินเทอร์เฟซ HIDL จะแมปกับวิธีการในการสร้างโดยอัตโนมัติ
การประกาศคลาส C++ IFoo
รายการ ชื่อของแต่ละฟังก์ชันจะยังคงเป็น
เหมือนกันใน C++ ส่วนต่อไปนี้จะอธิบายวิธีที่อาร์กิวเมนต์ HIDL และการส่งกลับ
จะได้รับการแปลเป็น C++
พารามิเตอร์ฟังก์ชัน
อาร์กิวเมนต์ที่แสดงในไฟล์ .hal
จะแมปกับข้อมูลประเภท C++
อาร์กิวเมนต์ที่ไม่ได้แมปกับประเภท C++ พื้นฐานจะส่งผ่านด้วย const
ข้อมูลอ้างอิง
สำหรับฟังก์ชัน HIDL ทุกฟังก์ชันที่มีค่าการแสดงผล (มี generates
) รายการพารามิเตอร์ C++ สำหรับฟังก์ชันนั้นจะมีอาร์กิวเมนต์เพิ่มเติมดังนี้
ฟังก์ชัน Callback ที่ถูกเรียกด้วยค่าที่ส่งกลับของฟังก์ชัน HIDL
โดยจะมีข้อยกเว้น 1 ข้อ คือ หากวรรค generates
มีพารามิเตอร์เดียวที่แมปกับ C++ Primitive โดยตรง ซึ่งเรียกว่า Callback
ใช้ elision (นำ Callback ออกและค่าที่ส่งกลับคือ
ที่แสดงผลจากฟังก์ชันผ่านคำสั่ง return
ปกติ)
ค่าที่แสดงผลของฟังก์ชัน
ฟังก์ชันต่อไปนี้มีค่าแสดงผล
ข้อผิดพลาดในการขนส่งและประเภทการคืนสินค้า
คำสั่ง generates
จะส่งผลกับฟังก์ชัน 3 ประเภท
ลายเซ็น:
- สำหรับผลลัพธ์เพียงค่าเดียวที่เป็น Primitive ของ C++ พารามิเตอร์
ฟังก์ชันของฟังก์ชันในฟังก์ชันจะส่งกลับค่า
generates
Return<T>
ออบเจ็กต์ - สำหรับกรณีที่ซับซ้อนมากขึ้น ผลลัพธ์
generates
รายการจะเป็น แสดงผลผ่านพารามิเตอร์ Callback ที่ให้ไว้พร้อมกับการเรียกใช้ฟังก์ชัน และฟังก์ชันแสดงผลReturn<void>
- ในกรณีที่ไม่มีคำสั่ง
generates
ฟังก์ชันจะแสดงผลReturn<void>
การเรียกใช้ RPC อาจพบข้อผิดพลาดในการส่งในบางครั้ง เช่น เมื่อเซิร์ฟเวอร์
ตาย เมื่อทรัพยากรในการขนส่งไม่เพียงพอต่อการเรียกให้เสร็จสมบูรณ์ หรือเมื่อ
พารามิเตอร์ที่ส่งผ่านไม่อนุญาตให้ทำการเรียกให้เสร็จสมบูรณ์ (เช่น ไม่มี
ฟังก์ชัน Callback ที่ต้องใช้) เกิดข้อผิดพลาดในการขนส่งออบเจ็กต์ Return
รายการ
รวมถึงค่า T
(ยกเว้น
Return<void>
)
เนื่องจากฟังก์ชันฝั่งไคลเอ็นต์และฝั่งเซิร์ฟเวอร์มีลายเซ็นเดียวกัน
ฟังก์ชันฝั่งเซิร์ฟเวอร์ต้องแสดงผลประเภท Return
แม้ว่า
ไม่ได้ส่งสัญญาณข้อผิดพลาดในการรับส่ง Return<T>
ออบเจ็กต์สร้างขึ้นด้วย Return(myTValue)
(หรือโดยนัย
สร้างขึ้นจาก mTValue
เช่น ใน return
คำสั่ง) และ Return<void>
ออบเจ็กต์ถูกสร้างขึ้นด้วย
Void()
ออบเจ็กต์ Return<T>
รายการมีการแปลงโดยนัยเป็นและจาก
ค่า T
ตรวจสอบออบเจ็กต์ Return
ได้
ข้อผิดพลาดในการส่งด้วยการเรียกใช้เมธอด isOk()
การตรวจสอบนี้
ต้องระบุ แต่หากเกิดข้อผิดพลาดและไม่มีการตรวจสอบภายใน
ออบเจ็กต์ Return
ถูกทำลาย หรือ Conversion มูลค่า T
มีค่า
พยายามแล้ว กระบวนการของไคลเอ็นต์จะหยุดทำงานและจะมีการบันทึกข้อผิดพลาด ถ้า
isOk()
บ่งชี้ข้อผิดพลาดในการส่งหรือการโทรล้มเหลวเนื่องจากตรรกะ
ข้อผิดพลาดในโค้ดนักพัฒนาซอฟต์แวร์ (เช่น การส่ง nullptr
ในแบบซิงโครนัส
callback) แล้วสามารถเรียกใช้ description()
ในออบเจ็กต์ Return ไปยัง
แสดงผลสตริงที่เหมาะสำหรับการบันทึก ในกรณีดังกล่าว จะไม่มีทางที่
กำหนดจำนวนโค้ดที่จะเรียกใช้บนเซิร์ฟเวอร์ซึ่งเป็นผลมาจาก
สายที่ล้มเหลว นอกจากนี้ คุณยังระบุเมธอด isDeadObject()
ได้ด้วย ช่วงเวลานี้
บ่งบอกว่า !isOk()
เป็นเพราะวัตถุระยะไกลมี
ขัดข้องหรือไม่มีอยู่อีกต่อไป isDeadObject()
กล่าวเป็นนัยเสมอ
!isOk()
แสดงผลตามค่า
ถ้าคำสั่ง generates
แมปกับ C++ พื้นฐานตัวเดียว จะไม่มี
พารามิเตอร์ Callback อยู่ในรายการพารามิเตอร์ แต่การนำไปใช้จะให้
ผลลัพธ์ T
ในออบเจ็กต์ Return<T>
ซึ่ง
อาจสร้างขึ้นโดยปริยายจากประเภทพื้นฐาน T
สำหรับ
ตัวอย่าง:
Return<uint32_t> someMethod() { uint32_t return_data = ...; // Compute return_data return return_data; };
นอกจากนี้ คุณยังระบุเมธอด Return<*>::withDefault
ได้ด้วย ช่วงเวลานี้
ให้ค่าในกรณีที่ค่าผลลัพธ์เป็น !isOk()
วิธีการนี้ยังทำเครื่องหมายอ็อบเจกต์การแสดงผลว่าตกลงโดยอัตโนมัติด้วยเพื่อให้ไคลเอ็นต์
จะไม่ถูกปิด
ส่งคืนโดยใช้พารามิเตอร์ Callback
Callback จะส่งค่าที่ส่งกลับของฟังก์ชัน HIDL กลับไปยังผู้โทร
ต้นแบบของ Callback คือออบเจ็กต์ std::function
ที่มี
(นำมาจากคำสั่ง generates
) ที่แมปกับ C++
ประเภทต่างๆ ผลลัพธ์จะเป็นโมฆะ เนื่องจาก Callback จะไม่แสดงผลค่า
ค่าที่ส่งกลับของฟังก์ชัน C++ ที่มีพารามิเตอร์ Callback มีประเภท
Return<void>
เฉพาะการใช้งานเซิร์ฟเวอร์
สำหรับการระบุมูลค่าผลลัพธ์ เนื่องจากมีการโอนมูลค่าการคืนสินค้าแล้ว
โดยใช้ Callback พารามิเตอร์เทมเพลต T
คือ void
:
Return<void> someMethod(someMethod_cb _cb);
จากการใช้งาน C++ การติดตั้งใช้งานเซิร์ฟเวอร์ควรให้ผลลัพธ์เป็น
Void()
ซึ่งเป็นฟังก์ชันในบรรทัดแบบคงที่ซึ่งแสดงผล
Return<void>
ออบเจ็กต์ ตัวอย่างเมธอดของเซิร์ฟเวอร์ทั่วไป
การใช้งานที่มีพารามิเตอร์ 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(); };
ฟังก์ชันที่ไม่มีค่าส่งกลับ
ลายเซ็น C++ ของฟังก์ชันที่ไม่มีคำสั่ง generates
จะไม่มีพารามิเตอร์ Callback ในรายการพารามิเตอร์ ประเภทการแสดงผลจะ
เป็น Return<void>.
ฟังก์ชันทางเดียว
ฟังก์ชันที่มีเครื่องหมายคีย์เวิร์ด oneway
จะเป็นแบบไม่พร้อมกัน
(ไคลเอ็นต์จะไม่บล็อกเมื่อดำเนินการกับการดำเนินการ) และไม่มีฟังก์ชัน Return
ลายเซ็น C++ ของฟังก์ชัน oneway
จะไม่มี
พารามิเตอร์ Callback ในรายการพารามิเตอร์และค่า C++ ที่แสดงผลจะเป็น
Return<void>