توابع

توابع در میانای HIDL به روش‌هایی در اعلان کلاس C++‎ IFoo که به‌طور خودکار تولید شده است نگاشت می‌شوند. نام هر تابع در ++C یکسان باقی می‌ماند؛ بخش‌های زیر نحوه ترجمه آرگومان‌های HIDL و مقادیر بازگشتی به ++C را توضیح می‌دهند.

پارامترهای تابع

متغیرهای مستقلی که در فایل .hal فهرست شده‌اند به انواع داده C++ نگاشت می‌شوند. آرگومان‌هایی که به نوع C++‎ اولیه نگاشت نمی‌شوند، با ارجاع const ارسال می‌شوند.

برای هر تابع HIDL که مقدار برگشتی دارد (دارای عبارت generates است)، فهرست پارامتر C++‎ برای آن تابع یک آرگومان اضافی دارد: تابع بازخوانی که با مقادیر برگشتی تابع HIDL فراخوانی می‌شود. یک استثنا وجود دارد: اگر بند generates حاوی یک پارامتر باشد که مستقیماً به یک نوع داده اولیه C++ نگاشت می‌شود، از حذف تابع برگشتی استفاده می‌شود (تابع برگشتی حذف می‌شود و مقدار برگشتی ازطریق یک دستور 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 خود دارد. با فراخوانی روش isOk() شیء Return، می‌توان آن را ازنظر خطاهای انتقال بررسی کرد. این بررسی الزامی نیست؛ بااین‌حال، اگر خطایی رخ دهد و تا زمانی که شیء Return ازبین برود بررسی نشود، یا تبدیل مقدار T انجام شود، فرایند کارخواه متوقف می‌شود و خطا ثبت می‌شود. اگر isOk() نشان‌دهنده خطای انتقال یا ناموفق بودن تماس به‌دلیل خطای منطقی در کد توسعه‌دهنده باشد (مثل ارسال nullptr به‌عنوان بازخوان همگام)، دراین‌صورت می‌توان 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() است، مقداری ارائه می‌دهد. این روش همچنین به‌طور خودکار شیء برگشتی را به‌عنوان «خوب» علامت‌گذاری می‌کند تا فرایند کارخواه متوقف نشود.

برگشت بااستفاده از پارامتر پاسخ تماس

فراخوانی می‌تواند مقدار برگشتی تابع HIDL را به تماس‌گیرنده برگرداند. نمونه اولیه برگشتی یک شیء 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 توابع ناهم‌زمان هستند (کارخواه‌ها در اجرای آن‌ها مسدود نمی‌شوند) و مقدار برگشتی ندارند. امضای C++ تابع oneway در فهرست پارامترها پارامتر فراخوانی ندارد و مقدار برگشتی C++ آن Return<void> است.