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