HIDL इंटरफ़ेस में मौजूद फ़ंक्शन, अपने-आप जनरेट होने वाले तरीकों के साथ मैप किए जाते हैं
IFoo
C++ क्लास का एलान. हर फ़ंक्शन का नाम वही रहता है
C++ में एक जैसा; यहां दिए सेक्शन में बताया गया है कि HIDL आर्ग्युमेंट और रिटर्न
वैल्यू का अनुवाद C++ में किया जाता है.
फ़ंक्शन पैरामीटर
.hal
फ़ाइल मैप में दिए गए आर्ग्युमेंट, C++ डेटा टाइप पर मैप किए गए हैं.
ऐसे तर्क जो प्रिमिटिव C++ टाइप से मैप नहीं करते हैं वे कॉन्सट से पास किए जाते हैं
संदर्भ.
हर HIDL फ़ंक्शन के लिए जिसमें रिटर्न वैल्यू है (इसमें generates
है
स्टेटमेंट से मिलता-जुलता है, तो उस फ़ंक्शन के C++ पैरामीटर सूची में एक और आर्ग्युमेंट है:
एक कॉलबैक फ़ंक्शन, जिसे HIDL फ़ंक्शन की रिटर्न वैल्यू के साथ कॉल किया जाता है.
इसका एक अपवाद है: अगर generates
क्लॉज़
इसमें एक ऐसा पैरामीटर होता है जो सीधे C++ प्रिमिटिव, कॉलबैक पर मैप करता है
elision का इस्तेमाल किया जाता है (कॉलबैक को हटा दिया जाता है और रिटर्न वैल्यू यह होती है)
यह फ़ंक्शन, सामान्य return
स्टेटमेंट से मिलता है).
फ़ंक्शन रिटर्न वैल्यू
इन फ़ंक्शन में रिटर्न वैल्यू होती हैं.
परिवहन से जुड़ी गड़बड़ियां और सामान लौटाने का टाइप
generates
स्टेटमेंट के नतीजे तीन तरह के फ़ंक्शन हो सकते हैं
हस्ताक्षर:
- C++ प्रिमिटिव वाले सिर्फ़ एक रिटर्न वैल्यू के लिए,
generates
रिटर्न वैल्यू, फ़ंक्शन से वैल्यू के तौर परReturn<T>
ऑब्जेक्ट. - ज़्यादा जटिल मामलों के लिए,
generates
रिटर्न वैल्यू फ़ंक्शन को कॉल के साथ दिए गए कॉलबैक पैरामीटर के ज़रिए लौटाया जाता है, और फ़ंक्शनReturn<void>
दिखाता है. - जब कोई
generates
स्टेटमेंट मौजूद नहीं होता है, तो फ़ंक्शन यह वैल्यू दिखाता हैReturn<void>
.
आरपीसी कॉल में, कभी-कभी ट्रांसपोर्ट से जुड़ी गड़बड़ियां हो सकती हैं. उदाहरण के लिए, जब सर्वर
मर जाता है, जब कॉल को पूरा करने के लिए परिवहन के संसाधन काफ़ी नहीं होते या जब
पास किए गए पैरामीटर कॉल पूर्ण करने की अनुमति नहीं देते (जैसे किसी
आवश्यक कॉलबैक फ़ंक्शन). 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++ फ़ंक्शन की रिटर्न वैल्यू इस तरह की है
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
कीवर्ड के साथ मार्क किए गए फ़ंक्शन एसिंक्रोनस होते हैं
फ़ंक्शन (क्लाइंट अपने एक्ज़ीक्यूशन के दौरान ब्लॉक नहीं होंगे) और उनके पास कोई रिटर्न नहीं है
वैल्यू. oneway
फ़ंक्शन के C++ हस्ताक्षर में
पैरामीटर सूची में कॉलबैक पैरामीटर है और इसकी C++ रिटर्न वैल्यू होगी
Return<void>
.