nl:: Weave:: TLV:: TLVUpdater
#include <src/lib/core/WeaveTLV.h>
มีอินเทอร์เฟซ Reader/Writer แบบรวมสำหรับการแก้ไข/เพิ่ม/ลบองค์ประกอบในการเข้ารหัส TLV
สรุป
TLVUpdater คือการรวมออบเจ็กต์ TLVReader และ TLVWriter และให้คุณมีวิธีอินเทอร์เฟซสำหรับแก้ไข/ลบข้อมูลในการเข้ารหัส รวมทั้งเพิ่มองค์ประกอบใหม่ๆ ลงในการเข้ารหัส TLV ด้วย โดยพื้นฐานแล้ว ออบเจ็กต์ TLVUpdater ทำหน้าที่เหมือนเคอร์เซอร์ 2 อัน อันหนึ่งสำหรับอ่านการเข้ารหัสที่มีอยู่และอีกอันสำหรับการเขียน (ทั้งการคัดลอกข้อมูลที่มีอยู่หรือการเขียนข้อมูลใหม่)
ในเชิงความหมาย ออบเจ็กต์ TLVUpdater ทำงานเหมือนกับการรวมของ TLVReader และ TLVWriter เมธอด TLVUpdater มีความหมายคล้ายกันมากหรือน้อยไม่ต่างจากวิธีที่มีชื่อคล้ายกันใน TLVReader/TLVWriter หากคำที่ใช้ความหมายต่างกัน จะมีการบันทึกความแตกต่างไว้ชัดเจนในส่วนความคิดเห็นของฟังก์ชันใน WeaveTLVUpdater.cpp
สิ่งสำคัญที่ควรทราบอย่างหนึ่งเกี่ยวกับวิธีการ PutBytes() และ PutString() ของ TLVUpdater คือ ฟังก์ชันดังกล่าวอาจทำให้การเข้ารหัสอยู่ในสถานะเสียหายได้โดยเขียนส่วนหัวขององค์ประกอบไว้เมื่อเกิดการล้นเกิน แอปพลิเคชันสามารถเรียกใช้ GetRemainingFreeLength() เพื่อตรวจสอบว่ามีพื้นที่ว่างประมาณเพียงพอที่จะเขียนการเข้ารหัส โปรดทราบว่า GetRemainingFreeLength() บอกเฉพาะไบต์ว่างที่มีอยู่และไม่มีวิธีที่แอปพลิเคชันจะรู้ความยาวของข้อมูลที่เข้ารหัสซึ่งเขียนขึ้น ในกรณีที่มีรายการเพิ่มเติม ทั้ง PutBytes() และ PutString() จะแสดง WEAVE_ERROR_BUFFER_TOO_SMALL ไปยังผู้เรียก
นอกจากนี้ โปรดทราบว่าเมธอด Next() มีการใช้งานมากเกินไปจนทำให้ข้ามองค์ประกอบปัจจุบันและเลื่อนโปรแกรมอ่านภายในไปยังองค์ประกอบถัดไปด้วย เนื่องจากการข้ามองค์ประกอบที่เข้ารหัสอยู่แล้วจะต้องมีการเปลี่ยนแปลงตัวแปรสถานะพื้นที่ว่างของผู้เขียนภายในให้สอดคล้องกับพื้นที่ว่างใหม่ (ทำให้พร้อมใช้งานด้วยการข้าม) คาดว่าแอปพลิเคชันจะเรียกใช้ Next() ในโปรแกรมอัปเดตหลังเมธอด Get() ซึ่งไม่ต้องการเขียนกลับ (ซึ่งเทียบเท่ากับการข้ามองค์ประกอบปัจจุบัน)
ฟังก์ชันสาธารณะ |
|
---|---|
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)
|
เริ่มต้นออบเจ็กต์ TLVUpdater โดยใช้ TLVReader
|
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() จะคืนค่าสถานะของออบเจ็กต์ TLVUpdater หลังจากการเรียกใช้ EnterContainer() สำหรับการเรียกแอปพลิเคชัน 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 )
เริ่มต้นออบเจ็กต์ TLVUpdater โดยใช้ TLVReader
เมื่อเรียกใช้เมธอดนี้ ข้อมูล TLV ในบัฟเฟอร์ที่ TLVReader ชี้ไปจะถูกย้ายจากจุดอ่านปัจจุบันไปยังจุดสิ้นสุดของบัฟเฟอร์ ออบเจ็กต์ 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 )