ฟังก์ชัน

ระบบจะแมปฟังก์ชันในอินเทอร์เฟซ 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>