nl:: Weave:: TLV:: TLVUpdater
#include <src/lib/core/WeaveTLV.h>
提供統一的 Reader/Writer 介面,方便在 TLV 編碼中編輯/新增/刪除元素。
摘要
TLVUpdater 是 TLVReader 和 TLVWriter 物件的聯集,並提供在編碼中編輯/刪除資料的介面方法,以及在 TLV 編碼中加入新元素。TLVUpdater 物件基本上與兩個遊標類似,一個用於讀取現有編碼,另一個用於寫入 (用於複製現有資料或寫入新資料)。
基本上,TLVUpdater 物件函式類似 TLVReader 和 TLVWriter 的聯集。TLVUpdater 方法與 TLVReader/TLVWriter 中名稱類似的對應項目並無相似之處。如果語意上有差異,我們會在 WeaveTLVUpdater.cpp 的函式註解部分中清楚記錄其中的差異。
關於 TLVUpdater 的 PutBytes() 和 PutString() 方法有一個特別的注意事項,就是可以讓編碼保持損毀狀態,而且只在發生溢位時寫入元素標頭。應用程式可以呼叫 GetRemainingFreeLength(),確保有足夠的可用空間可寫入編碼。請注意,GetRemainingFreeLength() 僅會顯示可用位元組,以及應用程式「無法」瞭解寫入的編碼資料長度。如果發生溢位,PutBytes() 和 PutString() 都會將 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 物件的隱含設定檔 ID。
|
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 元素的結尾進行編碼。
呼叫 EnterContainer() 之後,ExitContainer() 方法會還原 TLVUpdater 物件的狀態。每次呼叫 EnterContainer() 應用程式時,都必須對 ExitContainer() 發出對應的呼叫,並傳遞 EnterContainer() 方法傳回的結構定義值。
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 物件也會在一開始可用的空間上初始化。應用程式可以使用 TLVUpdater 物件剖析 TLV 資料,並修改/刪除現有元素,或在編碼中新增元素。
詳細說明 | |||||||
---|---|---|---|---|---|---|---|
參數 |
|
||||||
傳回值 |
|
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 )
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 物件的隱含設定檔 ID。
這個方法會為 TLVUpdater 物件設定隱含設定檔 ID。當更新工具要求為新元素編碼時,如果與新元素相關聯的標記設定檔 ID 與 profileId
的值相符,更新器就會以隱含形式將標記編碼,同時在過程中省略設定檔 ID。
詳細說明 | |||
---|---|---|---|
參數 |
|
StartContainer
WEAVE_ERROR StartContainer( uint64_t tag, TLVType containerType, TLVType & outerContainerType )