פונקציות בממשק HIDL ממפות לשיטות בהצהרה של הכיתה IFoo
ב-C++ שנוצרה באופן אוטומטי. השם של כל פונקציה נשאר זהה ב-C++. בקטעים הבאים מוסבר איך מתבצעת התרגום של ארגומנטים וערכי החזרה של HIDL ל-C++.
פרמטרים של פונקציות
הארגומנטים שמפורטים בקובץ .hal
ממפים לסוגים של נתוני C++.
ארגומנטים שלא ממופים לסוג פרימיטיבי של C++ מועברים באמצעות הפניה קבועה.
לכל פונקציית HIDL שיש לה ערך מוחזר (יש לה generates
הצהרה), לרשימת הפרמטרים של C++ של אותה פונקציה יש ארגומנט נוסף:
פונקציית קריאה חוזרת (callback) שנקראת עם ערכי ההחזרה של פונקציית ה-HIDL.
יש חרגה אחת: אם התנאי generates
מכיל פרמטר יחיד שממופה ישירות ל-primitive של C++, נעשה שימוש ב-elision של קריאה חוזרת (הקריאה החוזרת מוסרת והערך המוחזר מוחזר מהפונקציה באמצעות משפט return
רגיל).
ערכים שמוחזרים על ידי פונקציות
לפונקציות הבאות יש ערכי החזרה.
שגיאות העברה וסוג ההחזרה
ההצהרה generates
יכולה להוביל לשלושה סוגים של חתימות פונקציה:
- אם יש רק ערך אחד להחזרה שהוא פרימיטיבי של C++, ערך ההחזרה
generates
מוחזר על ידי ערך מהפונקציה באובייקטReturn<T>
. - במקרים מורכבים יותר, ערכי ההחזרה של
generates
מוחזרים דרך פרמטר הקריאה החוזרת(callback) שסופק בקריאה לפונקציה עצמה, והפונקציה מחזירה את הערךReturn<void>
. - אם אין טענת
generates
, הפונקציה מחזירה את הערךReturn<void>
.
לפעמים קריאות RPC עלולות להיתקל בשגיאות תעבורה, למשל כשהשרת נכבה, כשמשאבי התעבורה לא מספיקים כדי להשלים את הקריאה או כשהפרמטרים שהועברו לא מאפשרים להשלים את הקריאה (למשל, חסרה פונקציית קריאה חוזרת נדרשת). אובייקטים מסוג Return
שומרים אינדיקציות של שגיאות בהעברה וגם ערך T
(למעט Return<void>
).
מכיוון שלפונקציות בצד הלקוח ובצד השרת יש את אותה חתימה, הפונקציה בצד השרת חייבת להחזיר את הטיפוס Return
גם אם ההטמעה שלה לא מסמנת שגיאות בהעברה. אובייקטים מסוג Return<T>
נוצרים באמצעות Return(myTValue)
(או אפשר ליצור אותם באופן משתמע מ-mTValue
, למשל במשפטי return
), ואובייקטים מסוג Return<void>
נוצרים באמצעות Void()
.
קיימת המרה משתמעת של אובייקטים מסוג Return<T>
אל הערך שלהם ב-T
וממנו. אפשר לבדוק אם יש באובייקט Return
שגיאות בהעברה על ידי קריאה לשיטה isOk()
שלו. הבדיקה הזו לא חובה, אבל אם מתרחשת שגיאה ולא בודקים אותה עד שהאובייקט Return
נהרס, או אם מנסים להמיר ערך T
, תהליך הלקוח יופסק ותירשם שגיאה ביומן. אם isOk()
מציין שגיאת תעבורה או כשל קריאה בגלל שגיאה לוגית בקוד של המפתח (למשל, העברה של nullptr
כקריאה חוזרת (callback) סינכרונית), אפשר להפעיל את description()
באובייקט Return כדי להחזיר מחרוזת שמתאימה לרישום ביומן. במקרים כאלה, אי אפשר לקבוע כמה קוד בוצע בשרת כתוצאה מהקריאה שנכשלה. השיטה isDeadObject()
זמינה גם כן. השיטה הזו מציינת שהערך של !isOk()
הוא 0 כי האובייקט המרוחק קרס או שהוא לא קיים יותר. 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()
.
השיטה הזו גם מסמנת באופן אוטומטי את אובייקט ההחזרה כתקין, כדי שתהליך הלקוח לא יופסק.
חזרה באמצעות פרמטר קריאה חוזרת
פונקציית קריאה חוזרת יכולה להעביר את הערך המוחזר של פונקציית ה-HIDL בחזרה למבצע הקריאה.
אב הטיפוס של פונקציית ה-callback הוא אובייקט std::function
עם פרמטרים (שנלקחים מהצהרה generates
) שממופים לסוגים של C++. ערך ההחזרה שלה הוא void – פונקציית ההתקשרות חזרה עצמה לא מחזירה ערך.
הערך המוחזר של פונקציית 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
לא יהיה פרמטר של קריאה חוזרת ברשימה של הפרמטרים. סוג ההחזרה שלו יהיה Return<void>.
פונקציות חד-כיווניות
פונקציות שמסומנות במילת המפתח oneway
הן פונקציות אסינכררוניות (הלקוחות לא ייחסמו בזמן ההפעלה שלהן) ואין להן ערכי חזרה. בחתימה של פונקציית oneway
ב-C++ לא יהיה פרמטר של קריאה חוזרת (callback) ברשימת הפרמטרים, וערך ההחזרה שלה ב-C++ יהיה Return<void>
.