توابع در یک رابط HIDL به روشهای موجود در اعلان کلاس IFoo
C++ که به صورت خودکار تولید میشوند، نگاشت میشوند. نام هر تابع در C++ ثابت می ماند. بخشهای زیر نحوه ترجمه آرگومانهای HIDL و مقادیر بازگشتی به C++ را توضیح میدهند.
پارامترهای تابع
آرگومان های فهرست شده در فایل .hal
به انواع داده های C++ نگاشت می شوند. آرگومان هایی که به یک نوع C++ اولیه نگاشت نمی شوند با مرجع const منتقل می شوند.
برای هر تابع HIDL که دارای مقدار بازگشتی است (دارای یک دستور generates
است)، لیست پارامترهای C++ برای آن تابع دارای یک آرگومان اضافی است: یک تابع فراخوانی که با مقادیر بازگشتی تابع HIDL فراخوانی می شود. یک استثنا وجود دارد: اگر بند generates
شامل یک پارامتر واحد باشد که مستقیماً به یک C++ اولیه نگاشت میشود، از callback elision استفاده میشود (بازگشت مجدد حذف میشود و مقدار بازگشتی از طریق یک دستور return
عادی از تابع برگردانده میشود).
مقادیر برگردانده تابع
توابع زیر دارای مقادیر بازگشتی هستند.
خطاهای حمل و نقل و نوع بازگشت
دستور generates
می تواند منجر به سه نوع امضای تابع شود:
- فقط برای یک مقدار بازگشتی که یک C++ اولیه است، مقدار بازگشتی
generates
توسط مقدار تابع در یک شیReturn<T>
برگردانده می شود. - برای موارد پیچیده تر، مقدار(های) بازگشتی
generates
از طریق پارامتر برگشتی که با خود فراخوانی تابع ارائه شده است، برمی گردند و تابع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
به عنوان یک فراخوان همزمان)، سپس description()
را می توان در شی Return فراخوانی کرد تا رشته ای مناسب برای ورود به سیستم را برگرداند. در چنین مواردی، هیچ راهی برای تعیین تعداد کد ممکن در سرور در نتیجه تماس ناموفق وجود ندارد. متد isDeadObject()
نیز ارائه شده است. این متد نشان می دهد که !isOk()
به این دلیل است که شیء راه دور خراب شده یا دیگر وجود ندارد. isDeadObject()
همیشه به معنای !isOk()
.
بازگشت بر اساس ارزش
اگر دستورات به یک C++ اولیه generates
، هیچ پارامتر برگشتی در لیست پارامترها وجود ندارد. در عوض، یک پیاده سازی مقدار بازگشتی T
در یک شی Return<T>
ارائه می دهد که می تواند به طور ضمنی از نوع اولیه T
تولید شود. به عنوان مثال:
Return<uint32_t> someMethod() { uint32_t return_data = ...; // Compute return_data return return_data; };
روش Return<*>::withDefault
نیز ارائه شده است. این متد در مواردی که مقدار بازگشتی !isOk()
باشد مقداری را ارائه می دهد. این روش همچنین به طور خودکار شی بازگشتی را به عنوان Okay علامت گذاری می کند تا فرآیند مشتری از بین نرود.
با استفاده از پارامتر برگشت به تماس برگردید
یک تماس برگشتی می تواند مقدار برگشتی تابع HIDL را به تماس گیرنده برگرداند. نمونه اولیه callback یک شیء std::function
با پارامترهای (برگرفته از دستور generates
) است که به انواع C++ نگاشت شده است. مقدار برگشتی آن باطل است - پاسخ به خود مقداری را بر نمی گرداند.
مقدار بازگشتی یک تابع C++ با پارامتر برگشت تماس دارای نوع Return<void>
است. اجرای سرور فقط مسئول ارائه مقدار بازگشتی است. از آنجایی که مقادیر برگشتی قبلاً با استفاده از تماس برگشتی منتقل شده اند، پارامتر الگوی 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
، پارامتری برای بازگشت به تماس در لیست پارامترها نخواهد داشت. نوع برگشتی آن Return<void>.
توابع یک طرفه
توابع علامت گذاری شده با کلمه کلیدی oneway
توابع ناهمزمان هستند (کلاینت ها در اجرای آنها مسدود نمی شوند) و مقادیر برگشتی ندارند. امضای C++ یک تابع oneway
در لیست پارامترها پارامتر برگشتی ندارد و مقدار بازگشتی C++ آن Return<void>
خواهد بود.