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 के PutBytes() और AskString() मेथड के बारे में एक खास बात यह है कि यह, कोड में बदलने के तरीके को खराब स्थिति में छोड़ सकता है. इसमें सिर्फ़ एलिमेंट हेडर वाला डेटा ओवरफ़्लो होने पर लिखा होता है. एन्कोडिंग लिखने के लिए करीब काफ़ी खाली जगह है, यह पक्का करने के लिए ऐप्लिकेशन getRemainingFreeLength() को कॉल कर सकते हैं. ध्यान दें कि getRemainingFreeLength() आपको सिर्फ़ उपलब्ध खाली बाइट के बारे में जानकारी देता है. साथ ही, ऐप्लिकेशन के पास यह जानने का कोई तरीका नहीं है कि कोड में बदले गए डेटा को कितना लंबा होना चाहिए. ओवरफ़्लो होने की स्थिति में, PushBytes() और पटास्ट्रिंग(), दोनों कॉलर को 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)
|
मौजूदा एलिमेंट को छोड़ें और इनपुट TLV में, TLVUpdater ऑब्जेक्ट को अगले एलिमेंट पर ले जाएं.
|
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 ऑब्जेक्ट तैयार करता है.
यह आउटपुट टीएलवी में, कंटेनर ऑब्जेक्ट की शुरुआत को भी कोड में बदलता है.
EnterContainer() तरीका, TLV कंटेनर (स्ट्रक्चर, अरे या पाथ) के मेंबर एलिमेंट पढ़ने के लिए, मौजूदा TLVUpdater ऑब्जेक्ट को तैयार करता है. EnterContainer() ऐप्लिकेशन को किए जाने वाले हर कॉल के लिए, आपको ExitContainer() को एक संबंधित कॉल करना होगा.
जब EnterContainer() को कहा जाता है, तो TLVUpdater के रीडर को कंटेनर एलिमेंट पर रखा जाना चाहिए. यह तरीका, तर्क के तौर पर TLVType वैल्यू का रेफ़रंस लेता है. इसका इस्तेमाल, कंटेनर को पढ़ते समय, अपडेटर के कॉन्टेक्स्ट को सेव करने के लिए किया जाएगा.
जब EnterContainer() तरीका वापस आता है, तो अपडेटर को कंटेनर के पहले सदस्य से ठीक पहले रखा जाता है. बार-बार Next() को कॉल करने से, कलेक्शन के सदस्यों के ज़रिए अपडेटर तब तक आगे बढ़ जाएगा, जब तक कि पूरा होने तक अपडेटर नहीं पहुंच जाता, इसके बाद अपडेटर WEAVE_END_OF_TLV दिखाएगा.
जब ऐप्लिकेशन किसी कंटेनर को पढ़ लेता है, तो वह ExitContainer() तरीके को कॉल करके, कंटेनर के बाद के एलिमेंट को पढ़ना जारी रख सकता है.
जानकारी | |||||||
---|---|---|---|---|---|---|---|
पैरामीटर |
|
||||||
रिटर्न वैल्यू |
|
ExitContainer
WEAVE_ERROR ExitContainer( TLVType outerContainerType )
यह फ़ंक्शन, टीएलवी कंटेनर एलिमेंट को पढ़ने की प्रोसेस पूरी करता है. साथ ही, आउटपुट 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
शुरू करें
WEAVE_ERROR Init( uint8_t *buf, uint32_t dataLen, uint32_t maxLen )
किसी एक इनपुट बफ़र में बदलाव करने के लिए, TLVUpdater ऑब्जेक्ट को शुरू करें.
इस तरीके को कॉल करने पर, बफ़र में मौजूद TLV डेटा को बफ़र के आखिर में ट्रांसफ़र कर दिया जाता है. साथ ही, जगह बदले गए इस बफ़र पर एक निजी TLVReader ऑब्जेक्ट शुरू किया जाता है. एक निजी TLVWriter ऑब्जेक्ट को भी उस खाली जगह पर शुरू किया गया है जो अब शुरुआत में उपलब्ध है. ऐप्लिकेशन TLV डेटा को पार्स करने और मौजूदा एलिमेंट को बदलने/मिटाने या एन्कोडिंग में नए एलिमेंट जोड़ने के लिए, TLVUpdater ऑब्जेक्ट का इस्तेमाल कर सकते हैं.
जानकारी | |||||||
---|---|---|---|---|---|---|---|
पैरामीटर |
|
||||||
रिटर्न वैल्यू |
|
शुरू करें
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 )
इनपुट टीएलवी से मौजूदा एलिमेंट को आउटपुट टीएलवी में कॉपी करता है.
Move() तरीका, उस मौजूदा एलिमेंट को TLVUpdater के लेखक के पास कॉपी करता है जिस पर TLVUpdater के रीडर को रखा जाता है. ऐप्लिकेशन को Next() को कॉल करना चाहिए और इस तरीके को कॉल करने से पहले TLVUpdater के रीडर को किसी एलिमेंट पर रखना चाहिए. TLVReader::Next() तरीके की तरह, अगर कॉल के समय रीडर को किसी कंटेनर एलिमेंट पर रखा जाता है, तो कंटेनर के सभी सदस्यों को कॉपी कर लिया जाएगा. अगर रीडर को किसी एलिमेंट पर नहीं रखा गया है, तो इस तरीके को कॉल करने पर कुछ भी नहीं बदलेगा.
जानकारी | |||||||||
---|---|---|---|---|---|---|---|---|---|
रिटर्न वैल्यू |
|
MoveUntilEnd
void MoveUntilEnd( void )
TLVUpdater के मौजूदा रीड पॉइंट से लेकर इनपुट TLV के बफ़र के आखिर तक, सब कुछ को आउटपुट में बदलें.
इस तरीके का इस्तेमाल करके, TLVUpdater के मौजूदा रीड पॉइंट से लेकर रीडर के बफ़र के आखिर तक और TLVUpdater के राइटर तक, सब कुछ ट्रांसफ़र किया जा सकता है.
आगे बढ़ें
WEAVE_ERROR Next( void )
मौजूदा एलिमेंट को छोड़ें और इनपुट TLV में, TLVUpdater ऑब्जेक्ट को अगले एलिमेंट पर ले जाएं.
Next() तरीका, इनपुट टीएलवी के मौजूदा एलिमेंट को छोड़ देता है और TLVUpdater के रीडर को अगले एलिमेंट पर ले जाता है. यह एलिमेंट उसी कंटेनमेंट कॉन्टेक्स्ट में मौजूद होता है. खास तौर पर, अगर रीडर को कोड में बदलने के लिए टीएलवी के सबसे बाहरी स्तर पर रखा गया है, तो Next() को कॉल करने से वह सबसे ऊपर मौजूद एलिमेंट पर पहुंच जाएगा. अगर रीडर को किसी टीएलवी कंटेनर एलिमेंट (स्ट्रक्चर, ऐरे या पाथ) के अंदर पोज़िशन किया गया है, तो 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 )