nl:: Weave:: TLV:: TLVReader
#include <src/lib/core/WeaveTLV.h>
針對以 Weave TLV 格式編碼的資料,提供記憶體效率剖析器。
摘要
TLVReader 為 Weave TLV 資料實作正向式的「pull-style」剖析器。TLVReader 物件會做為遊標運作,可用於疊代多個 TLV 元素並解讀其內容。放置在元素上時,應用程式可以呼叫讀取器的 Get() 方法,查詢目前元素的類型和標記,並擷取任何相關聯的值。讀取器的 Next() 方法用於從元素前往元素。
TLVReader 物件一律位於 TLV 元素之前、之後或之後。初次初始化時,TLVReader 會位於編碼的第一個元素之前。如要開始朗讀,應用程式必須對 Next() 方法發出初始呼叫,才能將讀取器置於第一個元素。容器元素遇到結構時,可以使用 OpenContainer() 或 EnterContainer() 方法進行陣列內容疊代。
當讀取器到達 TLV 編碼的結尾或容器中的最後一個元素時,它會從 Next() 方法傳回 WEAVE_END_OF_TLV 錯誤,以通知應用程式。在重新初始化或目前容器 (透過 CloseContainer() / ExitContainer()) 退出 WEAVE_END_OF_TLV 之前,讀取器會繼續傳回 WEAVE_END_OF_TLV。
TLVReader 物件可以直接從固定的輸入緩衝區或一或多個 PacketBuffer 的鏈結剖析資料。此外,應用程式也可以提供 GetNextBuffer
函式,從任意來源 (例如通訊埠或序列埠。
繼承
直接已知的子類別:nl::Weave::Profiles::DataManagement_Current::CircularEventReader
nl::Weave::TLV::CircularTLVReader
公開類型 |
|
---|---|
GetNextBufferFunct)(TLVReader &reader, uintptr_t &bufHandle, const uint8_t *&bufStart, uint32_t &bufLen)
|
WEAVE_ERROR(*) 這個函式可用來擷取要剖析的其他 TLV 資料。 |
公開屬性 |
|
---|---|
AppData
|
void *
可用於應用程式特定資料的指標欄位。
|
GetNextBuffer
|
可產生 TLVReader 物件輸入資料的函式指標。
|
ImplicitProfileId
|
uint32_t
設定檔 ID 要用於以隱含形式編碼的個人資料標記。
|
受保護的屬性 |
|
---|---|
mBufEnd
|
const uint8_t *
|
mBufHandle
|
uintptr_t
|
mContainerType
|
|
mControlByte
|
uint16_t
|
mElemLenOrVal
|
uint64_t
|
mElemTag
|
uint64_t
|
mLenRead
|
uint32_t
|
mMaxLen
|
uint32_t
|
mReadPoint
|
const uint8_t *
|
公開函式 |
|
---|---|
CloseContainer(TLVReader & containerReader)
|
在呼叫 OpenContainer() 後,完成 TLV 容器讀取。
|
DupBytes(uint8_t *& buf, uint32_t & dataLen)
|
分配並傳回包含目前位元組或 UTF8 字串值的緩衝區。
|
DupString(char *& buf)
|
分配並傳回含有目前位元組或 UTF8 字串之空值結束值的緩衝區。
|
EnterContainer(TLVType & outerContainerType)
|
|
ExitContainer(TLVType outerContainerType)
|
|
Get(bool & v)
|
取得目前元素的值做為布林值類型。
|
Get(int8_t & v)
|
取得目前元素的值,為 8 位元帶正負號整數。
|
Get(int16_t & v)
|
以 16 位元帶正負號整數取得目前元素的值。
|
Get(int32_t & v)
|
以 32 位元帶正負號整數取得目前元素的值。
|
Get(int64_t & v)
|
以 64 位元帶正負號整數取得目前元素的值。
|
Get(uint8_t & v)
|
以 8 位元無正負號整數取得目前元素的值。
|
Get(uint16_t & v)
|
以 16 位元無正負號整數取得目前元素的值。
|
Get(uint32_t & v)
|
以 32 位元無正負號整數取得目前元素的值。
|
Get(uint64_t & v)
|
以 64 位元無正負號整數取得目前元素的值。
|
Get(float & v)
|
|
Get(double & v)
|
取得目前元素的值,做為雙精度浮點數。
|
GetBufHandle(void) const
|
uintptr_t
|
GetBytes(uint8_t *buf, uint32_t bufSize)
|
取得目前位元組或 UTF8 字串元素的值。
|
GetContainerType(void) const
|
傳回 TLVReader 目前正在讀取的容器類型。
|
GetControlByte(void) const
|
uint16_t
傳回與目前 TLV 元素相關聯的控制位元組。
|
GetDataPtr(const uint8_t *& data)
|
取得 TLV 位元組或 UTF8 字串元素的初始編碼位元組指標。
|
GetLength(void) const
|
uint32_t
傳回與目前 TLV 元素相關聯的資料長度。
|
GetLengthRead(void) const
|
uint32_t
傳回讀取器初始化後讀取的位元組總數。
|
GetReadPoint(void) const
|
const uint8_t *
取得與讀取器目前位置相對應的基礎輸入緩衝區的點。
|
GetRemainingLength(void) const
|
uint32_t
傳回在達到讀取長度上限前可讀取的位元組總數。
|
GetString(char *buf, uint32_t bufSize)
|
取得目前位元組或 UTF8 字串元素的值,做為空值終止字串。
|
GetTag(void) const
|
uint64_t
傳回與目前 TLV 元素相關聯的標記。
|
GetType(void) const
|
傳回目前 TLV 元素的類型。
|
Init(const TLVReader & aReader)
|
void
|
Init(const uint8_t *data, uint32_t dataLen)
|
void
初始化要讀取單一輸入緩衝區的 TLVReader 物件。
|
Init(PacketBuffer *buf, uint32_t maxLen)
|
void
初始化要從單一 PacketBuffer 讀取的 TLVReader 物件。
|
Init(PacketBuffer *buf, uint32_t maxLen, bool allowDiscontiguousBuffers)
|
void
初始化 TLVReader 物件來讀取一或多個 PacketBuffer。
|
Next(void)
|
|
Next(TLVType expectedType, uint64_t expectedTag)
|
|
OpenContainer(TLVReader & containerReader)
|
|
Skip(void)
|
|
VerifyEndOfContainer(void)
|
驗證 TVLReader 物件是否位於 TLV 容器的結尾。
|
受保護的函式 |
|
---|---|
ClearElementState(void)
|
void
清除 TLVReader 狀態。
|
ElementType(void) const
|
TLVElementType
這是私人方法,會從 mControlByte 傳回 TLVElementType。
|
EnsureData(WEAVE_ERROR noDataErr)
|
|
GetElementHeadLength(uint8_t & elemHeadBytes) const
|
這是一種私人方法,用來計算 TLV 元素頭部的長度。
|
IsContainerOpen(void) const
|
bool
|
ReadData(uint8_t *buf, uint32_t len)
|
|
ReadElement(void)
|
|
ReadTag(TLVTagControl tagControl, const uint8_t *& p)
|
uint64_t
|
SetContainerOpen(bool aContainerOpen)
|
void
|
SkipData(void)
|
透過不使用目的地緩衝區的方式讀取,略過目前 TLV 中包含的任何資料。
|
SkipToEndOfContainer(void)
|
|
VerifyElement(void)
|
受保護的靜態函式 |
|
---|---|
FailGetNextBuffer(TLVReader & reader, uintptr_t & bufHandle, const uint8_t *& bufStart, uint32_t & bufLen)
|
|
GetNextPacketBuffer(TLVReader & reader, uintptr_t & bufHandle, const uint8_t *& bufStart, uint32_t & bufLen)
|
公開類型
GetNextBufferFunct
WEAVE_ERROR(* GetNextBufferFunct)(TLVReader &reader, uintptr_t &bufHandle, const uint8_t *&bufStart, uint32_t &bufLen)
這個函式可用來擷取要剖析的其他 TLV 資料。
這個類型的函式可用來將輸入資料提供給 TLVReader。呼叫該函式時,函式預期會產生額外資料,供讀取器剖析或告知讀取器已無其他可用資料。
詳細資料 | |||||||||
---|---|---|---|---|---|---|---|---|---|
參數 |
|
||||||||
傳回值 |
|
公開屬性
AppData
void * AppData
可用於應用程式特定資料的指標欄位。
GetNextBuffer
GetNextBufferFunct GetNextBuffer
可產生 TLVReader 物件輸入資料的函式指標。
如果設為 NULL (預設值),讀取器會假設沒有其他可用的輸入資料。
您可以隨時透過應用程式設定 GetNextBuffer,但通常會在讀取器初始化時設定。
如要進一步瞭解如何實作 GetNextBuffer 函式,請參閱 GetNextBufferFunct 類型定義。
ImplicitProfileId
uint32_t ImplicitProfileId
設定檔 ID 要用於以隱含形式編碼的個人資料標記。
讀取器碰到以隱含形式編碼的個人資料專屬標記時,會使用 ImplicitProfileId
屬性的值做為該標記的假設設定檔 ID。
ImplicitProfileId
屬性的預設設定是 kProfileIdNotSpecified。解碼包含隱含編碼標記的 TLV 時,應用程式必須先設定 ImplicitProfileId
,才能讀取具有這類標記的任何 TLV 元素。適當的個人資料 ID 通常取決於系統朗讀的應用程式或通訊協定。
如果在 ImplicitProfileId
設為 kProfileIdNotSpecified 時遇到隱含編碼的標記,讀取器會傳回 WEAVE_ERROR_UNKNOWN_IMPLICIT_TLV_TAG 錯誤。
受保護的屬性
mBufEnd
const uint8_t * mBufEnd
mBufHandle
uintptr_t mBufHandle
mContainerType
TLVType mContainerType
mControlByte
uint16_t mControlByte
mElemLenOrVal
uint64_t mElemLenOrVal
mElemTag
uint64_t mElemTag
mLenRead
uint32_t mLenRead
mMaxLen
uint32_t mMaxLen
mReadPoint
const uint8_t * mReadPoint
公開函式
CloseContainer
WEAVE_ERROR CloseContainer( TLVReader & containerReader )
在呼叫 OpenContainer() 後,完成 TLV 容器讀取。
CloseContainer() 方法會在呼叫 OpenContainer() 後,還原父項 TLVReader 物件的狀態。每次呼叫 OpenContainer() 應用程式時,都必須對 CloseContainer() 應用程式發出對應的呼叫,並將同一個容器讀取器的參照傳遞至這兩個方法。
CloseContainer() 傳回時,父項讀取器會位於容器後面的第一個元素之前。此時,應用程式可以利用 Next() 方法,前往任何剩餘元素。
無論基礎容器中的所有元素是否已讀取,應用程式隨時都可在父項讀取器上呼叫 CloseContainer()。呼叫 CloseContainer() 後,應用程式應將容器讀取器視為「de-initialized」且不需要重新初始化,即可進一步使用。
詳細資料 | |||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
參數 |
|
||||||||||||
傳回值 |
|
DupBytes
WEAVE_ERROR DupBytes( uint8_t *& buf, uint32_t & dataLen )
分配並傳回包含目前位元組或 UTF8 字串值的緩衝區。
這個方法會為 建立緩衝區,並傳回目前位置的位元組或 UTF-8 字串元素相關資料的副本。透過 malloc() 取得緩衝區的記憶體,如果不再需要記憶體,呼叫端應使用 Free() 釋出該緩衝區。
詳細資料 | |||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
參數 |
|
||||||||||||
傳回值 |
|
DupString
WEAVE_ERROR DupString( char *& buf )
分配並傳回含有目前位元組或 UTF8 字串之空值結束值的緩衝區。
這個方法會為 建立緩衝區,並傳回目前位置的位元組或 UTF-8 字串元素,並以空值結尾的資料副本。透過 malloc() 取得緩衝區的記憶體,如果不再需要記憶體,呼叫端應使用 Free() 釋出該緩衝區。
詳細資料 | |||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
參數 |
|
||||||||||||
傳回值 |
|
EnterContainer
WEAVE_ERROR EnterContainer( TLVType & outerContainerType )
準備用來讀取 TLV 容器元素成員的 TLVReader 物件。
EnterContainer() 方法會準備目前的 TLVReader 物件進行讀取,以便讀取 TLV 容器 (結構、陣列或路徑) 的成員元素。每次呼叫 EnterContainer() 應用程式時,都必須發出對應的 ExitContainer() 呼叫。
呼叫 EnterContainer() 時,TLVReader 物件必須放置在容器元素上才能讀取。這個方法會將 TLVType 值的參照做為引數,以便在讀取容器時儲存讀者背景資訊。
EnterContainer() 方法傳回時,讀取器的位置緊接在容器的第一個成員「之前」。重複呼叫 Next() 會將讀取器前進至集合的成員,直到抵達終點為止,屆時讀取器就會傳回 WEAVE_END_OF_TLV。
應用程式讀取完容器後,可以透過呼叫 ExitContainer() 方法繼續讀取容器之後的元素。
詳細資料 | |||||
---|---|---|---|---|---|
參數 |
|
||||
傳回值 |
|
ExitContainer
WEAVE_ERROR ExitContainer( TLVType outerContainerType )
完成 TLV 容器讀取作業,並準備 TLVReader 物件在容器之後讀取元素。
ExitContainer() 方法會在呼叫 EnterContainer() 後還原 TLVReader 物件狀態。每次呼叫 EnterContainer() 應用程式時,都必須對 ExitContainer() 應用程式發出對應的呼叫,傳遞 EnterContainer() 方法傳回的結構定義值。
ExitContainer() 傳回時,讀取器的位置緊跟著容器的第一個元素。此時,應用程式可以利用 Next() 方法,前往任何剩餘元素。
呼叫 EnterContainer() 後,應用程式可以隨時在讀取器上呼叫 ExitContainer(),不論基礎容器中的所有元素是否已讀取。
詳細資料 | |||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
參數 |
|
||||||||||||
傳回值 |
|
取得
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 )
GetBufHandle
uintptr_t GetBufHandle( void ) const
GetBytes
WEAVE_ERROR GetBytes( uint8_t *buf, uint32_t bufSize )
取得目前位元組或 UTF8 字串元素的值。
如要判斷所需的輸入緩衝區大小,請先呼叫 GetLength() 方法,再呼叫 GetBytes()。
詳細資料 | |||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|
參數 |
|
||||||||||
傳回值 |
|
GetContainerType
TLVType GetContainerType( void ) const
GetControlByte
uint16_t GetControlByte( void ) const
GetDataPtr
WEAVE_ERROR GetDataPtr( const uint8_t *& data )
取得 TLV 位元組或 UTF8 字串元素的初始編碼位元組指標。
這個方法會在基礎輸入緩衝區中,傳回已編碼字串值的直接指標。這個方法需要字串值全部存在於單一緩衝區中,才能成功。否則,此方法會傳回 WEAVE_ERROR_TLV_UNDERRUN。如此一來,從多個不連續緩衝區讀取資料時,這個方法就會受到限制。
詳細資料 | |||||||||
---|---|---|---|---|---|---|---|---|---|
參數 |
|
||||||||
傳回值 |
|
GetLength
uint32_t GetLength( void ) const
GetLengthRead
uint32_t GetLengthRead( void ) const
傳回讀取器初始化後讀取的位元組總數。
詳細資料 | |
---|---|
傳回 |
讀取器初始化後讀取的位元組總數。
|
GetReadPoint
const uint8_t * GetReadPoint( void ) const
取得與讀取器目前位置相對應的基礎輸入緩衝區的點。
詳細資料 | |
---|---|
傳回 |
指向對應讀取器目前位置的基礎輸入緩衝區的指標。
|
GetRemainingLength
uint32_t GetRemainingLength( void ) const
傳回在達到讀取長度上限前可讀取的位元組總數。
詳細資料 | |
---|---|
傳回 |
在達到讀取長度上限前可讀取的位元組總數。
|
GetString
WEAVE_ERROR GetString( char *buf, uint32_t bufSize )
取得目前位元組或 UTF8 字串元素的值,做為空值終止字串。
如要判斷所需的輸入緩衝區大小,請先呼叫 GetLength() 方法,再呼叫 GetBytes()。輸入緩衝區至少要有一個位元組,超過字串長度才能容納空值字元。
詳細資料 | |||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|
參數 |
|
||||||||||
傳回值 |
|
GetTag
uint64_t GetTag( void ) const
傳回與目前 TLV 元素相關聯的標記。
GetTag() 傳回的值可與標記公用程式函式 (IsProfileTag()、IsContextTag()、ProfileIdFromTag() 等) 搭配使用,以判斷代碼類型及擷取各種標記欄位值。
詳細資料 | |
---|---|
傳回 |
一個無正負號整數,內含與目前 TLV 元素相關聯的標記相關資訊。
|
GetType
TLVType GetType( void ) const
Init
void Init( const TLVReader & aReader )
Init
void Init( const uint8_t *data, uint32_t dataLen )
Init
void Init( PacketBuffer *buf, uint32_t maxLen )
Init
void Init( PacketBuffer *buf, uint32_t maxLen, bool allowDiscontiguousBuffers )
初始化 TLVReader 物件來讀取一或多個 PacketBuffer。
剖析會從初始緩衝區的起始位置 (buf->DataStart()) 開始。如果 allowDiscontiguousBuffers 為 true,讀取器會通過透過 Next() 指標連結的緩衝區鏈結。剖析作業會持續進行,直到已使用緩衝區鏈結中的所有資料 (如 buf->Datalen() 表示) 或 maxLen 位元組已剖析為止。
詳細資料 | |||||||
---|---|---|---|---|---|---|---|
參數 |
|
繼續
WEAVE_ERROR Next( void )
將 TLVReader 物件導向下一個要讀取的 TLV 元素。
Next() 方法會將讀者物件放置在位於相同遏制環境的 TLV 編碼中,下一個元素。特別是如果讀取器的位置位於 TLV 編碼的最外層,則呼叫 Next() 會將讀取器導向下一個最頂層的元素。如果讀取器位於 TLV 容器元素 (結構、陣列或路徑) 中,則呼叫 Next() 會引導讀取器前往容器的下一個成員元素。
由於 Next() 會將讀者的動作限制在目前的遏制環境下,因此當讀取器位於容器元素上時呼叫 Next(),會「移動」容器並略過其成員元素 (以及任何巢狀容器的成員),直到它到達容器之後的第一個元素為止。
如果特定容器內容中沒有其他元素,Next() 方法就會傳回 WEAVE_END_OF_TLV 錯誤,且讀取器的位置會維持不變。
詳細資料 | |||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
傳回值 |
|
繼續
WEAVE_ERROR Next( TLVType expectedType, uint64_t expectedTag )
將 TLVReader 物件移至下一個要讀取的 TLV 元素,宣告新元素的類型和標記。
Next(TLVTypeexpectedType, uint64_texpectedTag) 方法的行為與 Next() 相同,但會驗證新 TLV 元素的類型和標記是否與提供的引數相符,
詳細資料 | |||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
參數 |
|
||||||||||||||||
傳回值 |
|
OpenContainer
WEAVE_ERROR OpenContainer( TLVReader & containerReader )
初始化新的 TLVReader 物件來讀取 TLV 容器元素的成員。
OpenContainer() 方法會初始化新的 TLVReader 物件來讀取 TLV 容器 (結構、陣列或路徑) 的成員元素。呼叫 OpenContainer() 時,目前的 TLVReader 物件必須置於要讀取的容器元素上。此方法會將對新讀取器的參照當做唯一引數,初始化後即可讀取容器。這種讀取器稱為「容器讀取器」,而呼叫 OpenContainer() 的讀取器則稱為「父項讀取器」。
OpenContainer() 方法傳回時,容器讀取器會緊接在容器的第一個成員之前。在容器讀取器上呼叫 Next() 會穿越集合成員,直到到達結束為止,此時讀取器就會傳回 WEAVE_END_OF_TLV。
容器讀取器開啟時,應用程式不得呼叫父項讀取器,也不得以其他方式變更父項讀取器的狀態。應用程式使用容器讀取器完成之後,必須在父項讀取器上呼叫 CloseContainer(),並傳送容器讀取器做為引數,藉此關閉應用程式。應用程式可能隨時關閉容器讀取器,不論是否讀取基礎容器中的所有元素。容器讀取器關閉後,應用程式可能會繼續使用父項讀取器。
容器讀取器會繼承父項讀取器的各種設定屬性。包括:
- 隱含設定檔 ID (ImplicitProfileId)
- 應用程式資料點 (AppData)
- GetNextBuffer 函式指標
詳細資料 | |||||
---|---|---|---|---|---|
參數 |
|
||||
傳回值 |
|
略過
WEAVE_ERROR Skip( void )
Skip() 方法會在目前的 TLV 元素之後立即放置閱讀器物件,因此後續呼叫 Next() 時,系統會將讀取器導向下列元素。和 Next() 一樣,如果讀取器在呼叫期間位於容器元素上,就會略過容器的成員。如果讀取器尚未位於任何元素上,位置則維持不變。
詳細資料 | |||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
傳回值 |
|
VerifyEndOfContainer
WEAVE_ERROR VerifyEndOfContainer( void )
驗證 TVLReader 物件是否位於 TLV 容器的結尾。
VerifyEndOfContainer() 方法驗證在目前的 TLV 容器中,沒有其他可以讀取的 TLV 元素。這個方法十分便利,相當於呼叫 Next() 並檢查 WEAVE_END_OF_TLV 的回傳值。
詳細資料 | |||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
傳回值 |
|
受保護的函式
ClearElementState
void ClearElementState( void )
ElementType
TLVElementType ElementType( void ) const
這是私人方法,會從 mControlByte 傳回 TLVElementType。
EnsureData
WEAVE_ERROR EnsureData( WEAVE_ERROR noDataErr )
GetElementHeadLength
WEAVE_ERROR GetElementHeadLength( uint8_t & elemHeadBytes ) const
這是一種私人方法,用來計算 TLV 元素頭部的長度。
IsContainerOpen
bool IsContainerOpen( void ) const
ReadData
WEAVE_ERROR ReadData( uint8_t *buf, uint32_t len )
ReadElement
WEAVE_ERROR ReadElement( void )
ReadTag
uint64_t ReadTag( TLVTagControl tagControl, const uint8_t *& p )
SetContainerOpen
void SetContainerOpen( bool aContainerOpen )
SkipData
WEAVE_ERROR SkipData( void )
透過不使用目的地緩衝區的方式讀取,略過目前 TLV 中包含的任何資料。
詳細資料 | |||||
---|---|---|---|---|---|
傳回值 |
|
SkipToEndOfContainer
WEAVE_ERROR SkipToEndOfContainer( void )
VerifyElement
WEAVE_ERROR VerifyElement( void )
受保護的靜態函式
FailGetNextBuffer
WEAVE_ERROR FailGetNextBuffer( TLVReader & reader, uintptr_t & bufHandle, const uint8_t *& bufStart, uint32_t & bufLen )
GetNextPacketBuffer
WEAVE_ERROR GetNextPacketBuffer( TLVReader & reader, uintptr_t & bufHandle, const uint8_t *& bufStart, uint32_t & bufLen )