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