nl:: Weave:: TLV:: TLVUpdater
#include <src/lib/core/WeaveTLV.h>
इससे TLV एन्कोडिंग में एलिमेंट में बदलाव करने/जोड़ने/मिटाने के लिए एक यूनिफ़ाइड रीडर/राइटर इंटरफ़ेस मिलता है.
खास जानकारी
TLVUpdater, TLVReader और TLVWriter ऑब्जेक्ट को मिलाकर बनाया गया है. यह किसी एन्कोडिंग में डेटा में बदलाव करने/मिटाने के साथ-साथ, TLV एन्कोडिंग में नए एलिमेंट जोड़ने के लिए इंटरफ़ेस के तरीके उपलब्ध कराता है. TLVUpdater ऑब्जेक्ट, दो कर्सर की तरह काम करता है. पहला, मौजूदा डेटा को कोड में बदलने के तरीके को पढ़ने के लिए और दूसरा, लिखने के लिए (मौजूदा डेटा को कॉपी करने या नया डेटा लिखने के लिए).
मतलब, TLVUpdater ऑब्जेक्ट, TLVReader और TLVWriter को यूनियन के रूप में काम करता है. TLVUpdater तरीकों का मतलब, TLVReader/TLVWriter में, मिलते-जुलते नाम से मिलता-जुलता है. सिमेंटिक में अंतर होने पर, WeaveTLVUpdater.cpp में फ़ंक्शन के टिप्पणी सेक्शन में, इन अंतर को साफ़ तौर पर दस्तावेज़ में दिखाया जाता है.
TLVUpdater'sputBytes() और KeepString() तरीकों के बारे में खास तौर पर एक अहम बात यह है कि यह एन्कोडिंग को खराब स्थिति में छोड़ सकता है. ऐसा करते समय, सिर्फ़ एलिमेंट हेडर लिखा गया होता है, जो ओवरफ़्लो होता है. ऐप्लिकेशन GetRemainingFreeLength() को कॉल कर सकते हैं. इससे यह पक्का किया जा सकता है कि कोड में बदलने के लिए, ज़रूरत के मुताबिक करीब खाली जगह है. ध्यान दें कि GetRemainingFreeLength() आपको सिर्फ़ उपलब्ध मुफ़्त बाइट बताती है. साथ ही, ऐप्लिकेशन के पास लिखे जाने वाले कोड में बदले गए डेटा की लंबाई जानने का कोई तरीका नहीं है. ओवरफ़्लो होने की स्थिति में,putBytes() और पुटस्ट्रिंग(), दोनों ही कॉलर को WEAVE_ERROR_BUFFER_TOO_Small फ़ॉर्मैट में वापस भेज देंगे.
साथ ही, यह भी ध्यान रखें कि Next() तरीका ओवरलोड हो गया है, ताकि मौजूदा एलिमेंट को स्किप किया जा सके और इंटरनल रीडर को अगले एलिमेंट पर भी ले जाया जा सके. पहले से कोड में बदले गए एलिमेंट को छोड़ने पर, खाली जगह (जिसे स्किप करके उपलब्ध कराया जाता है) के लिए अंदरूनी राइटर के फ़्री स्पेस स्टेट वैरिएबल को बदलने की ज़रूरत होती है. इसलिए, किसी Get() तरीके के बाद ऐप्लिकेशन को अपडेटर पर Next() को कॉल करना चाहिए, जिसका मान उसे वापस लिखना नहीं है (यह मौजूदा एलिमेंट को स्किप करने के बराबर है).
सार्वजनिक फ़ंक्शन |
|
---|---|
CopyElement(TLVReader & reader)
|
|
CopyElement(uint64_t tag, TLVReader & reader)
|
|
DupBytes(uint8_t *& buf, uint32_t & dataLen)
|
|
DupString(char *& buf)
|
|
EndContainer(TLVType outerContainerType)
|
|
EnterContainer(TLVType & outerContainerType)
|
कंटेनर के एलिमेंट पढ़ने के लिए, TLVUpdater ऑब्जेक्ट तैयार करता है.
|
ExitContainer(TLVType outerContainerType)
|
|
Finalize(void)
|
|
Get(bool & v)
|
|
Get(int8_t & v)
|
|
Get(int16_t & v)
|
|
Get(int32_t & v)
|
|
Get(int64_t & v)
|
|
Get(uint8_t & v)
|
|
Get(uint16_t & v)
|
|
Get(uint32_t & v)
|
|
Get(uint64_t & v)
|
|
Get(float & v)
|
|
Get(double & v)
|
|
GetBytes(uint8_t *buf, uint32_t bufSize)
|
|
GetContainerType(void) const
|
|
GetDataPtr(const uint8_t *& data)
|
|
GetImplicitProfileId(void)
|
uint32_t
|
GetLength(void) const
|
uint32_t
|
GetLengthRead(void) const
|
uint32_t
|
GetLengthWritten(void)
|
uint32_t
|
GetReader(TLVReader & containerReader)
|
void
|
GetRemainingFreeLength(void)
|
uint32_t
|
GetRemainingLength(void) const
|
uint32_t
|
GetString(char *buf, uint32_t bufSize)
|
|
GetTag(void) const
|
uint64_t
|
GetType(void) const
|
|
Init(uint8_t *buf, uint32_t dataLen, uint32_t maxLen)
|
सिंगल इनपुट बफ़र में बदलाव करने के लिए, TLVUpdater ऑब्जेक्ट शुरू करें.
|
Init(TLVReader & aReader, uint32_t freeLen)
|
TLVReader का इस्तेमाल करके, TLVUpdater ऑब्जेक्ट को शुरू करें.
|
Move(void)
|
|
MoveUntilEnd(void)
|
void
TLVUpdater के मौजूदा रीड पॉइंट से इनपुट TLV बफ़र के खत्म होने तक आउटपुट में सभी को ले जाएं.
|
Next(void)
|
मौजूदा एलिमेंट को छोड़ें और TLVUpdater ऑब्जेक्ट को इनपुट TLV में अगले एलिमेंट पर ले जाएं.
|
Put(uint64_t tag, int8_t v)
|
|
Put(uint64_t tag, int16_t v)
|
|
Put(uint64_t tag, int32_t v)
|
|
Put(uint64_t tag, int64_t v)
|
|
Put(uint64_t tag, uint8_t v)
|
|
Put(uint64_t tag, uint16_t v)
|
|
Put(uint64_t tag, uint32_t v)
|
|
Put(uint64_t tag, uint64_t v)
|
|
Put(uint64_t tag, int8_t v, bool preserveSize)
|
|
Put(uint64_t tag, int16_t v, bool preserveSize)
|
|
Put(uint64_t tag, int32_t v, bool preserveSize)
|
|
Put(uint64_t tag, int64_t v, bool preserveSize)
|
|
Put(uint64_t tag, uint8_t v, bool preserveSize)
|
|
Put(uint64_t tag, uint16_t v, bool preserveSize)
|
|
Put(uint64_t tag, uint32_t v, bool preserveSize)
|
|
Put(uint64_t tag, uint64_t v, bool preserveSize)
|
|
Put(uint64_t tag, float v)
|
|
Put(uint64_t tag, double v)
|
|
PutBoolean(uint64_t tag, bool v)
|
|
PutBytes(uint64_t tag, const uint8_t *buf, uint32_t len)
|
|
PutNull(uint64_t tag)
|
|
PutString(uint64_t tag, const char *buf)
|
|
PutString(uint64_t tag, const char *buf, uint32_t len)
|
|
SetImplicitProfileId(uint32_t profileId)
|
void
TLVUpdater ऑब्जेक्ट के लिए इंप्लिसिट प्रोफ़ाइल आईडी सेट करें.
|
StartContainer(uint64_t tag, TLVType containerType, TLVType & outerContainerType)
|
|
VerifyEndOfContainer(void)
|
सार्वजनिक फ़ंक्शन
CopyElement
WEAVE_ERROR CopyElement( TLVReader & reader )
CopyElement
WEAVE_ERROR CopyElement( uint64_t tag, TLVReader & reader )
DupBytes
WEAVE_ERROR DupBytes( uint8_t *& buf, uint32_t & dataLen )
DupString
WEAVE_ERROR DupString( char *& buf )
EndContainer
WEAVE_ERROR EndContainer( TLVType outerContainerType )
EnterContainer
WEAVE_ERROR EnterContainer( TLVType & outerContainerType )
कंटेनर के एलिमेंट पढ़ने के लिए, TLVUpdater ऑब्जेक्ट तैयार करता है.
यह आउटपुट TLV में कंटेनर ऑब्जेक्ट की शुरुआत को भी एन्कोड करता है.
EnterContainer() तरीका, मौजूदा TLVUpdater ऑब्जेक्ट को तैयार करता है, ताकि TLV कंटेनर (स्ट्रक्चर, अरे या पाथ) के सदस्य एलिमेंट को पढ़ना शुरू किया जा सके. EnterContainer() को किए जाने वाले हर कॉल के लिए, ऐप्लिकेशन को ExitContainer() के हिसाब से कॉल करना चाहिए.
जब EnterContainer() को TLVUpdater को कॉल किया जाता है, तो इसके रीडर को कंटेनर एलिमेंट पर रखा जाना चाहिए. यह तरीका, आर्ग्युमेंट के तौर पर TLVType वैल्यू का रेफ़रंस लेता है. इसका इस्तेमाल, कंटेनर को पढ़ते समय अपडेटर का कॉन्टेक्स्ट सेव करने के लिए किया जाएगा.
जब EnterContainer() तरीका वापस लाया जाता है, तो अपडेटर को कंटेनर के पहले सदस्य से पहले तुरंत रखा जाता है. बार-बार Next() को कॉल करने से अपडेटर को कलेक्शन के सदस्यों के ज़रिए तब तक आगे बढ़ाया जाएगा, जब तक कि वह खत्म नहीं हो जाता. इसके बाद, अपडेटर WEAVE_END_OF_TLV को वापस कर देगा.
ऐप्लिकेशन के कंटेनर को पढ़ने के बाद, यह ExitContainer() तरीके को कॉल करके कंटेनर के बाद एलिमेंट को पढ़ना जारी रख सकता है.
ब्यौरा | |||||||
---|---|---|---|---|---|---|---|
पैरामीटर |
|
||||||
रिटर्न वैल्यू |
|
ExitContainer
WEAVE_ERROR ExitContainer( TLVType outerContainerType )
यह फ़ंक्शन, TLV कंटेनर एलिमेंट की रीडिंग को पूरा करता है. साथ ही, आउटपुट TLV में TLV एलिमेंट के आखिरी हिस्से को कोड में बदल देता है.
ExitContainer() का तरीका, EnterContainer() को कॉल करने के बाद TLVUpdater ऑब्जेक्ट की स्थिति को पहले जैसा करता है. EnterContainer() को किए जाने वाले हर कॉल के लिए, EnterContainer() तरीके से दी गई कॉन्टेक्स्ट वैल्यू को पास करते हुए ExitContainer() के लिए एक संबंधित कॉल करना चाहिए.
जब ExitContainer() वापस आता है, तो TLVUpdater रीडर को इनपुट TLV में कंटेनर के बाद आने वाले पहले एलिमेंट के ठीक पहले पोज़िशन किया जाता है. इस पॉइंट से ऐप्लिकेशन, बाकी बचे किसी भी एलिमेंट के ज़रिए आगे बढ़ने के लिए Next() को कॉल कर सकते हैं.
EnterContainer() को कॉल करने के बाद, ऐप्लिकेशन किसी भी समय अपडेटर पर ExitContainer() को कॉल कर सकते हैं, चाहे मौजूदा कंटेनर के सभी एलिमेंट पढ़े गए हों या नहीं. साथ ही, यह भी ध्यान रखें कि कंटेनर के सभी एलिमेंट को पढ़ने से पहले, ExitContainer() को कॉल करने से, आउटपुट TLV में अपडेट किया गया कंटेनर छोटा हो जाएगा.
ब्यौरा | |||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|
पैरामीटर |
|
||||||||||
रिटर्न वैल्यू |
|
बिलिंग करें
WEAVE_ERROR Finalize( void )
पाएं
WEAVE_ERROR Get( bool & v )
पाएं
WEAVE_ERROR Get( int8_t & v )
पाएं
WEAVE_ERROR Get( int16_t & v )
पाएं
WEAVE_ERROR Get( int32_t & v )
पाएं
WEAVE_ERROR Get( int64_t & v )
पाएं
WEAVE_ERROR Get( uint8_t & v )
पाएं
WEAVE_ERROR Get( uint16_t & v )
पाएं
WEAVE_ERROR Get( uint32_t & v )
पाएं
WEAVE_ERROR Get( uint64_t & v )
पाएं
WEAVE_ERROR Get( float & v )
पाएं
WEAVE_ERROR Get( double & v )
GetBytes
WEAVE_ERROR GetBytes( uint8_t *buf, uint32_t bufSize )
GetContainerType
TLVType GetContainerType( void ) const
GetDataPtr
WEAVE_ERROR GetDataPtr( const uint8_t *& data )
GetImplicitProfileId
uint32_t GetImplicitProfileId( void )
GetLength
uint32_t GetLength( void ) const
GetLengthRead
uint32_t GetLengthRead( void ) const
GetLengthWritten
uint32_t GetLengthWritten( void )
GetReader
void GetReader( TLVReader & containerReader )
GetRemainingFreeLength
uint32_t GetRemainingFreeLength( void )
GetRemainingLength
uint32_t GetRemainingLength( void ) const
GetString
WEAVE_ERROR GetString( char *buf, uint32_t bufSize )
GetTag
uint64_t GetTag( void ) const
GetType
TLVType GetType( void ) const
Init
WEAVE_ERROR Init( uint8_t *buf, uint32_t dataLen, uint32_t maxLen )
सिंगल इनपुट बफ़र में बदलाव करने के लिए, TLVUpdater ऑब्जेक्ट शुरू करें.
इस तरीके का इस्तेमाल करने पर, बफ़र में मौजूद TLV डेटा को बफ़र के आखिर में ले जाया जाता है और इस बफ़र में एक निजी TLVReader ऑब्जेक्ट शुरू किया जाता है. उस खाली जगह पर निजी TLVWriter ऑब्जेक्ट भी शुरू होता है जो अब शुरुआत में उपलब्ध होता है. ऐप्लिकेशन, TLV डेटा को पार्स करने और मौजूदा एलिमेंट में बदलाव करने/मिटाने या कोड में बदलने के तरीके में नए एलिमेंट जोड़ने के लिए, TLVUpdater ऑब्जेक्ट का इस्तेमाल कर सकते हैं.
ब्यौरा | |||||||
---|---|---|---|---|---|---|---|
पैरामीटर |
|
||||||
रिटर्न वैल्यू |
|
Init
WEAVE_ERROR Init( TLVReader & aReader, uint32_t freeLen )
TLVReader का इस्तेमाल करके, TLVUpdater ऑब्जेक्ट को शुरू करें.
इस तरीके का इस्तेमाल करने पर, TLVReader के ज़रिए बताए गए बफ़र में मौजूद TLV डेटा को मौजूदा रीड पॉइंट से बफ़र के आखिर में ले जाया जाता है. इस नई जगह से पढ़ने के लिए, एक नया निजी TLVReader ऑब्जेक्ट शुरू किया गया है. वहीं, खाली किए गए बफ़र स्पेस में लिखने के लिए, एक नया निजी TLVWriter ऑब्जेक्ट शुरू किया गया है.
ध्यान दें कि अगर TLVReader पहले से ही "चालू" है कोई एलिमेंट होता है, तो पहले उसका बैक-ऑफ़ उस एलिमेंट के शुरू में लिया जाता है. यह भी ध्यान रखें कि यह बैकिंग ऑफ़, कंटेनर एलिमेंट के साथ अच्छे से काम करता है. उदाहरण के लिए, अगर TLVReader का इस्तेमाल EnterContainer() को कॉल करने के लिए पहले ही किया जा चुका है, तो बैक-ऑफ़ करने के लिए कुछ भी नहीं है. हालांकि, अगर कंटेनर एलिमेंट में TLVReader को सेट किया गया था और EnterContainer() को कॉल नहीं किया गया था, तो TLVReader ऑब्जेक्ट को कंटेनर हेड की शुरुआत में बैक-ऑफ़ कर दिया जाता है.
वापस आने से पहले, इनपुट TLVReader ऑब्जेक्ट को मिटा दिया जाएगा. साथ ही, वापस लौटने पर ऐप्लिकेशन को इसका इस्तेमाल नहीं करना चाहिए.
ब्यौरा | |||||||
---|---|---|---|---|---|---|---|
पैरामीटर |
|
||||||
रिटर्न वैल्यू |
|
ले जाएं
WEAVE_ERROR Move( void )
मौजूदा एलिमेंट को इनपुट TLV से आउटपुट TLV तक कॉपी करता है.
Move() तरीका, उस मौजूदा एलिमेंट को कॉपी करता है जिस पर TLVUpdater के रीडर को रखा गया है. इसे TLVUpdater के राइटर के लिए सेट किया जाता है. इस तरीके को कॉल करने से पहले, ऐप्लिकेशन को Next() को कॉल करना चाहिए और TLVUpdater के रीडर को किसी एलिमेंट पर रखना चाहिए. TLVReader::Next() तरीके की तरह ही, अगर कॉल के समय रीडर को किसी कंटेनर एलिमेंट पर रखा जाता है, तो कंटेनर के सभी मेंबर कॉपी हो जाएंगे. अगर रीडर किसी एलिमेंट पर सेट नहीं है, तो इस तरीके को कॉल करने में कोई बदलाव नहीं होगा.
ब्यौरा | |||||||||
---|---|---|---|---|---|---|---|---|---|
रिटर्न वैल्यू |
|
MoveUntilEnd
void MoveUntilEnd( void )
TLVUpdater के मौजूदा रीड पॉइंट से इनपुट TLV बफ़र के खत्म होने तक आउटपुट में सभी को ले जाएं.
इस तरीके का इस्तेमाल करके, TLVUpdater के मौजूदा रीड पॉइंट से सब कुछ को, रीडर बफ़र के आखिर तक TLVUpdater के राइटर तक ट्रांसफ़र किया जा सकता है.
अगला
WEAVE_ERROR Next( void )
मौजूदा एलिमेंट को छोड़ें और TLVUpdater ऑब्जेक्ट को इनपुट TLV में अगले एलिमेंट पर ले जाएं.
Next() तरीका, इनपुट TLV के मौजूदा एलिमेंट को छोड़ देता है और TLVUpdater के रीडर को उस अगले एलिमेंट पर ले जाता है जो उसी कंटेनमेंट कॉन्टेक्स्ट में मौजूद होता है. खास तौर पर, अगर रीडर TLV एन्कोडिंग के सबसे बाहरी लेवल पर सेट है, तो Next() को कॉल करने पर, यह अगले सबसे टॉप एलिमेंट पर पहुंच जाएगा. अगर रीडर किसी TLV कंटेनर एलिमेंट (स्ट्रक्चर, अरे या पाथ) के अंदर है, तो Next() को कॉल करने से यह कंटेनर के अगले मेंबर एलिमेंट पर ले जाएगा.
Next(), पढ़ने वाले कॉन्टेंट को मौजूदा कंटेनमेंट कॉन्टेक्स्ट में आने से रोकता है. इसलिए, जब रीडर को किसी कंटेनर एलिमेंट पर रखा गया हो, तब Next() को कॉल किया जा सकता है. कॉल, कंटेनर के सदस्य एलिमेंट (और किसी भी नेस्ट किए गए कंटेनर के सदस्यों) के ऊपर होगा. ऐसा तब तक होगा, जब तक वह कंटेनर के बाद पहले एलिमेंट तक नहीं पहुंचता.
जब किसी खास कंटेनमेंट में कोई और एलिमेंट नहीं होगा, तो Next() तरीका WEAVE_END_OF_TLV दिखाएगा. साथ ही, पाठक की पोज़िशन में कोई बदलाव नहीं होगा.
ब्यौरा | |||||
---|---|---|---|---|---|
रिटर्न वैल्यू |
|
रखें
WEAVE_ERROR Put( uint64_t tag, int8_t v )
रखें
WEAVE_ERROR Put( uint64_t tag, int16_t v )
रखें
WEAVE_ERROR Put( uint64_t tag, int32_t v )
रखें
WEAVE_ERROR Put( uint64_t tag, int64_t v )
रखें
WEAVE_ERROR Put( uint64_t tag, uint8_t v )
रखें
WEAVE_ERROR Put( uint64_t tag, uint16_t v )
रखें
WEAVE_ERROR Put( uint64_t tag, uint32_t v )
रखें
WEAVE_ERROR Put( uint64_t tag, uint64_t v )
रखें
WEAVE_ERROR Put( uint64_t tag, int8_t v, bool preserveSize )
रखें
WEAVE_ERROR Put( uint64_t tag, int16_t v, bool preserveSize )
रखें
WEAVE_ERROR Put( uint64_t tag, int32_t v, bool preserveSize )
रखें
WEAVE_ERROR Put( uint64_t tag, int64_t v, bool preserveSize )
रखें
WEAVE_ERROR Put( uint64_t tag, uint8_t v, bool preserveSize )
रखें
WEAVE_ERROR Put( uint64_t tag, uint16_t v, bool preserveSize )
रखें
WEAVE_ERROR Put( uint64_t tag, uint32_t v, bool preserveSize )
रखें
WEAVE_ERROR Put( uint64_t tag, uint64_t v, bool preserveSize )
रखें
WEAVE_ERROR Put( uint64_t tag, float v )
रखें
WEAVE_ERROR Put( uint64_t tag, double v )
PutBoolean
WEAVE_ERROR PutBoolean( uint64_t tag, bool v )
PutBytes
WEAVE_ERROR PutBytes( uint64_t tag, const uint8_t *buf, uint32_t len )
PutNull
WEAVE_ERROR PutNull( uint64_t tag )
PutString
WEAVE_ERROR PutString( uint64_t tag, const char *buf )
PutString
WEAVE_ERROR PutString( uint64_t tag, const char *buf, uint32_t len )
SetImplicitProfileId
void SetImplicitProfileId( uint32_t profileId )
TLVUpdater ऑब्जेक्ट के लिए इंप्लिसिट प्रोफ़ाइल आईडी सेट करें.
यह तरीका, TLVUpdater ऑब्जेक्ट के लिए इंप्लिसिट प्रोफ़ाइल आईडी सेट करता है. जब अपडेटर से किसी नए एलिमेंट को कोड में बदलने के लिए कहा जाता है, तो अगर नए एलिमेंट से जुड़े टैग का प्रोफ़ाइल आईडी, profileId
की वैल्यू से मेल खाता है, तो अपडेटर टैग को इंप्लिसिट रूप में कोड में बदल देगा. इससे, इस प्रोसेस में प्रोफ़ाइल आईडी हट जाएगा.
ब्यौरा | |||
---|---|---|---|
पैरामीटर |
|
StartContainer
WEAVE_ERROR StartContainer( uint64_t tag, TLVType containerType, TLVType & outerContainerType )