HIDL ইন্টারফেসে ফাংশনগুলি অটোমেটিক জেনারেট করা
IFoo C++ ক্লাস ডিক্লারেশনে মেথডের সাথে ম্যাপ করা হয়। 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 ভ্যালু থেকে এবং ভ্যালুতে
ইমপ্লিসিট কনভার্সন আছে। Return অবজেক্টের isOk() মেথড কল করে
ট্রান্সপোর্ট সংক্রান্ত সমস্যা চেক করা যেতে পারে। এই চেক করার
প্রয়োজন নেই; তবে, কোনও সমস্যা হলে এবং Return অবজেক্টটি
ধ্বংস হওয়ার আগে চেক করা না হলে অথবা T ভ্যালু কনভার্সন করার
চেষ্টা করা হলে, ক্লায়েন্ট প্রসেস বন্ধ করে দেওয়া হবে এবং একটি সমস্যা লগ করা হবে। যদি
isOk() ডেভেলপার কোডে লজিক
সংক্রান্ত সমস্যার কারণে ট্রান্সপোর্ট সংক্রান্ত সমস্যা বা কল ব্যর্থতা নির্দেশ করে (যেমন, nullptr-কে সিঙ্ক্রোনাস
কলব্যাক হিসেবে পাস করা), তাহলে description()-কে Return অবজেক্টে কল করে
লগ করার উপযুক্ত স্ট্রিং রিটার্ন করা যেতে পারে। এই ধরনের ক্ষেত্রে, ব্যর্থ কলের ফলে সার্ভারে কতটা কোড এক্সিকিউট করা হয়েছে তা নির্ধারণ করার কোনও উপায় নেই। এছাড়াও, isDeadObject() পদ্ধতি প্রদান করা হয়েছে। এই
পদ্ধতি থেকে বোঝা যায় যে !isOk()-এর কারণ হল রিমোট অবজেক্ট
ক্র্যাশ করেছে বা আর নেই। isDeadObject()-এর অর্থ সবসময়
!isOk()।
ভ্যালু অনুযায়ী রিটার্ন করুন
generates স্টেটমেন্ট যদি একটি C++ প্রিমিটিভের সাথে ম্যাপ করে, তাহলে প্যারামিটার তালিকায় কোনও
কলব্যাক প্যারামিটার থাকে না। পরিবর্তে, একটি ইমপ্লিমেন্টেশন Return<T> অবজেক্টে T রিটার্ন ভ্যালু প্রদান করে, যা
প্রিমিটিভ টাইপ T থেকে ইমপ্লিসিটভাবে জেনারেট করা যায়। যেমন:
Return<uint32_t> someMethod() { uint32_t return_data = ...; // Compute return_data return return_data; };
এছাড়াও, Return<*>::withDefault পদ্ধতি প্রদান করা হয়েছে। রিটার্ন ভ্যালু !isOk() হলে এই
পদ্ধতি একটি ভ্যালু প্রদান করে।
এছাড়াও, এই পদ্ধতিটি রিটার্ন অবজেক্টকে অটোমেটিক 'ঠিক আছে' হিসেবে চিহ্নিত করে, যাতে ক্লায়েন্ট
প্রসেস বন্ধ না হয়ে যায়।
কলব্যাক প্যারামিটার ব্যবহার করে রিটার্ন করা
কলব্যাক, HIDL ফাংশনের রিটার্ন ভ্যালু কলারকে পাস করতে পারে।
কলব্যাকের প্রোটোটাইপ হল একটি std::function অবজেক্ট যার
প্যারামিটার (generates স্টেটমেন্ট থেকে নেওয়া) C++
টাইপে ম্যাপ করা হয়েছে। এর রিটার্ন ভ্যালু হল ভয়েড—কলব্যাক নিজে কোনও ভ্যালু রিটার্ন করে না।
কলব্যাক প্যারামিটার সহ C++ ফাংশনের রিটার্ন ভ্যালু হল type
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(); };
রিটার্ন ভ্যালু ছাড়া ফাংশন
generates স্টেটমেন্ট
ছাড়া কোনও ফাংশনের C++ সিগনেচারে প্যারামিটার তালিকায় কলব্যাক প্যারামিটার থাকবে না। এর রিটার্ন টাইপ Return<void>.
হবে
একমুখী ফাংশন
oneway কীওয়ার্ড দিয়ে চিহ্নিত ফাংশন হল অ্যাসিঙ্ক্রোনাস
ফাংশন (ক্লায়েন্ট এগুলি এক্সিকিউট করার সময় ব্লক করবে না) এবং এগুলির কোনও রিটার্ন
ভ্যালু থাকে না। oneway ফাংশনের C++ সিগনেচারে প্যারামিটার তালিকায় কোনও
কলব্যাক প্যারামিটার থাকবে না এবং এর C++ রিটার্ন ভ্যালু হবে
Return<void>.