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