nl:: Tạo văn bản:: TLV:: TLVUpdater
#include <src/lib/core/WeaveTLV.h>
Cung cấp giao diện Trình đọc/Viết hợp nhất để chỉnh sửa/thêm/xóa các phần tử trong phương thức mã hóa TLV.
Tóm tắt
TLVUpdater là sự hợp nhất của các đối tượng TLVReader và TLVWriter và cung cấp các phương thức giao diện để chỉnh sửa/xóa dữ liệu trong quá trình mã hóa cũng như thêm các phần tử mới vào phương thức mã hóa TLV. Về cơ bản, đối tượng TLVUpdater hoạt động như hai con trỏ, một con trỏ dùng để đọc chế độ mã hóa hiện có và một con khác dùng để ghi (để sao chép dữ liệu hiện có hoặc ghi dữ liệu mới).
Về mặt ngữ nghĩa, đối tượng TLVUpdater hoạt động như một sự hợp nhất của TLVReader và TLVWriter. Các phương thức TLVUpdater có nhiều hoặc ít ý nghĩa tương tự như các phương thức có tên tương tự trong TLVReader/TLVWriter. Khi có sự khác biệt về ngữ nghĩa, sự khác biệt được ghi lại rõ ràng trong phần nhận xét của hàm trong WeaveTLVUpdater.cpp.
Một lưu ý đặc biệt quan trọng về các phương thức PutBytes() và PutString() của TLVUpdater là nó có thể để mã hóa ở trạng thái bị hỏng chỉ có tiêu đề phần tử được ghi khi tràn. Các ứng dụng có thể gọi GetRemainingFreeLength() để đảm bảo có khoảng đủ dung lượng trống để viết mã. Lưu ý rằng GetRemainingFreeLength() chỉ cho bạn biết các byte miễn phí có sẵn và không có cách để ứng dụng biết độ dài của dữ liệu đã mã hoá được ghi. Trong trường hợp bị tràn, cả PutBytes() và PutString() sẽ trả về WEAVE_ERROR_BUFFER_TOO_SMALL cho người gọi.
Ngoài ra, xin lưu ý rằng phương thức Next() bị quá tải để vừa bỏ qua phần tử hiện tại, vừa chuyển tiếp trình đọc nội bộ sang phần tử tiếp theo. Vì việc bỏ qua các phần tử đã mã hoá yêu cầu thay đổi các biến trạng thái không gian trống của tác giả nội bộ để tính đến không gian được giải phóng mới (có sẵn bằng cách bỏ qua), nên ứng dụng dự kiến sẽ gọi Next() trên trình cập nhật sau phương thức Get() có giá trị mà ứng dụng không muốn ghi lại (tương đương với việc bỏ qua phần tử hiện tại).
Không hỗ trợ chuỗi vùng đệm (PacketBuffer).
Hàm công khai |
|
---|---|
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)
|
Chuẩn bị đối tượng TLVUpdater để đọc các phần tử của một vùng chứa.
|
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)
|
Khởi động đối tượng TLVUpdater để chỉnh sửa một vùng đệm đầu vào.
|
Init(TLVReader & aReader, uint32_t freeLen)
|
Khởi động đối tượng TLVUpdater bằng TLVReader.
|
Move(void)
|
|
MoveUntilEnd(void)
|
void
Di chuyển mọi thứ từ điểm đọc hiện tại TLVUpdater\39; cho đến khi kết thúc bộ đệm TLV đầu vào.
|
Next(void)
|
Bỏ qua phần tử hiện tại và chuyển đối tượng TLVUpdater sang phần tử tiếp theo trong đầu vào 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
Đặt mã hồ sơ ngầm cho đối tượng TLVUpdater.
|
StartContainer(uint64_t tag, TLVType containerType, TLVType & outerContainerType)
|
|
VerifyEndOfContainer(void)
|
Hàm công khai
Sao chép phần tử
WEAVE_ERROR CopyElement( TLVReader & reader )
Sao chép phần tử
WEAVE_ERROR CopyElement( uint64_t tag, TLVReader & reader )
DupBytes
WEAVE_ERROR DupBytes( uint8_t *& buf, uint32_t & dataLen )
Chuỗi Dup
WEAVE_ERROR DupString( char *& buf )
Vùng chứa kết thúc
WEAVE_ERROR EndContainer( TLVType outerContainerType )
EnterContainer
WEAVE_ERROR EnterContainer( TLVType & outerContainerType )
Chuẩn bị đối tượng TLVUpdater để đọc các phần tử của một vùng chứa.
Mã này cũng mã hoá phần đầu đối tượng vùng chứa trong TLV đầu ra.
Phương thức EnterContainer() chuẩn bị đối tượng TLVUpdater hiện tại để bắt đầu đọc các thành phần thành phần của một vùng chứa TLV (cấu trúc, mảng hoặc đường dẫn). Đối với mỗi lệnh gọi đến ứng dụng EnterContainer(), bạn phải thực hiện lệnh gọi tương ứng với ExitContainer().
Khi EnterContainer() được gọi là trình đọc TLVUpdater&39; phải được định vị trên phần tử vùng chứa. Phương thức này tham chiếu như một tham chiếu đến giá trị TLVType. Giá trị này sẽ được dùng để lưu ngữ cảnh của trình cập nhật khi đang đọc vùng chứa.
Khi phương thức EnterContainer() trả về, trình cập nhật sẽ được đặt ngay trước thành viên đầu tiên của vùng chứa. Việc gọi lại Next() nhiều lần sẽ chuyển trình cập nhật qua các thành viên của bộ sưu tập cho đến khi đạt đến điểm cuối. Tại thời điểm đó, trình cập nhật sẽ trả về WEAVE_END_OF_TLV.
Sau khi đọc xong một vùng chứa, ứng dụng có thể tiếp tục đọc các phần tử sau vùng chứa đó bằng cách gọi phương thức ExitContainer().
Thông tin chi tiết | |||||||
---|---|---|---|---|---|---|---|
Các tham số |
|
||||||
Giá trị trả về |
|
Thoát vùng chứa
WEAVE_ERROR ExitContainer( TLVType outerContainerType )
Hoàn thành việc đọc phần tử vùng chứa TLV và mã hóa phần cuối của phần tử TLV trong đầu ra TLV.
Phương thức ExitContainer() sẽ khôi phục trạng thái của đối tượng TLVUpdater sau khi gọi hàm EnterContainer(). Đối với mỗi lệnh gọi đến ứng dụng EnterContainer(), bạn phải thực hiện lệnh gọi tương ứng đến ExitContainer(), chuyển giá trị ngữ cảnh được phương thức EnterContainer() trả về.
Khi ExitContainer() trả về, trình đọc TLVUpdater được đặt ngay trước phần tử đầu tiên theo sau vùng chứa trong TLV đầu vào. Từ thời điểm này, ứng dụng có thể gọi Next() để chuyển qua bất kỳ phần tử còn lại nào.
Sau khi EnterContainer() được gọi, các ứng dụng có thể gọi ExitContainer() trên trình cập nhật vào bất kỳ thời điểm nào, bất kể tất cả các phần tử trong vùng chứa cơ bản đã được đọc hay chưa. Ngoài ra, xin lưu ý rằng việc gọi ExitContainer() trước khi đọc tất cả các phần tử trong vùng chứa, sẽ dẫn đến việc vùng chứa được cập nhật bị cắt bớt trong TLV đầu ra.
Do đó, ứng dụng có trách nhiệm điều chỉnh cấu hình cho phù hợp vào những thời điểm thích hợp.Thông tin chi tiết | |||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|
Các tham số |
|
||||||||||
Giá trị trả về |
|
Hoàn tất
WEAVE_ERROR Finalize( void )
Get
WEAVE_ERROR Get( bool & v )
Get
WEAVE_ERROR Get( int8_t & v )
Get
WEAVE_ERROR Get( int16_t & v )
Get
WEAVE_ERROR Get( int32_t & v )
Get
WEAVE_ERROR Get( int64_t & v )
Get
WEAVE_ERROR Get( uint8_t & v )
Get
WEAVE_ERROR Get( uint16_t & v )
Get
WEAVE_ERROR Get( uint32_t & v )
Get
WEAVE_ERROR Get( uint64_t & v )
Get
WEAVE_ERROR Get( float & v )
Get
WEAVE_ERROR Get( double & v )
Nhận byte
WEAVE_ERROR GetBytes( uint8_t *buf, uint32_t bufSize )
Nhận loại vùng chứa
TLVType GetContainerType( void ) const
Nhận dữ liệu
WEAVE_ERROR GetDataPtr( const uint8_t *& data )
Nhận IdProfileId
uint32_t GetImplicitProfileId( void )
Tải độ dài
uint32_t GetLength( void ) const
Nhận độ dài đọc
uint32_t GetLengthRead( void ) const
Viết có độ dài
uint32_t GetLengthWritten( void )
Tải xuống Reader
void GetReader( TLVReader & containerReader )
Nhận độ dài miễn phí
uint32_t GetRemainingFreeLength( void )
Lấy chiều dài còn lại
uint32_t GetRemainingLength( void ) const
Nhận chuỗi
WEAVE_ERROR GetString( char *buf, uint32_t bufSize )
Nhận thẻ
uint64_t GetTag( void ) const
Loại Get
TLVType GetType( void ) const
Init
WEAVE_ERROR Init( uint8_t *buf, uint32_t dataLen, uint32_t maxLen )
Khởi động đối tượng TLVUpdater để chỉnh sửa một vùng đệm đầu vào.
Khi gọi phương thức này, dữ liệu TLV trong vùng đệm được chuyển đến cuối vùng đệm và đối tượng TLVReader riêng tư được khởi tạo trên vùng đệm di chuyển này. Một đối tượng TLVWriter riêng tư cũng được khởi tạo trên không gian trống hiện có sẵn ở đầu. Các ứng dụng có thể dùng đối tượng TLVUpdater để phân tích cú pháp dữ liệu TLV và sửa đổi/xoá các phần tử hiện có hoặc thêm các phần tử mới vào phương thức mã hóa.
Thông tin chi tiết | |||||||
---|---|---|---|---|---|---|---|
Các tham số |
|
||||||
Giá trị trả về |
|
Init
WEAVE_ERROR Init( TLVReader & aReader, uint32_t freeLen )
Khởi động đối tượng TLVUpdater bằng TLVReader.
Khi gọi phương thức này, dữ liệu TLV trong vùng đệm được TLVReader trỏ đến sẽ được di chuyển từ điểm đọc hiện tại sang cuối vùng đệm. Một đối tượng TLVReader riêng tư mới được khởi tạo để đọc từ vị trí mới này, trong khi đối tượng TLVWriter riêng tư mới được khởi tạo để ghi vào không gian vùng đệm giải phóng.
Lưu ý rằng nếu TLVReader đã được định vị "on" một phần tử thì trước tiên sẽ được sao lưu vào đầu phần tử đó. Ngoài ra, xin lưu ý rằng tính năng sao lưu này hoạt động tốt với các phần tử của vùng chứa, tức là nếu TLVReader đã được dùng để gọi EnterContainer(), thì không có gì để đợi. Nhưng nếu TLVReader được đặt trên phần tử vùng chứa và EnterContainer() chưa được gọi, thì đối tượng TLVReader đã bị sao lưu vào đầu phần chứa.
Đối tượng TLVReader đầu vào sẽ bị huỷ trước khi quay lại và ứng dụng không được sử dụng cùng một đối tượng khi trả lại.
Thông tin chi tiết | |||||||
---|---|---|---|---|---|---|---|
Các tham số |
|
||||||
Giá trị trả về |
|
Di chuyển
WEAVE_ERROR Move( void )
Sao chép phần tử hiện tại từ đầu vào TLV sang đầu ra TLV.
Phương thức Move() sao chép phần tử hiện tại mà trình đọc TLVUpdater\39 được định vị, sang tác giả TLVUpdater&39;. Ứng dụng sẽ gọi Next() và định vị trình đọc TLVUpdater&39 trên một phần tử trước khi gọi phương thức này. Cũng giống như phương thức TLVReader::Next(), nếu trình đọc được định vị trên một phần tử vùng chứa tại thời điểm thực hiện lệnh gọi, thì tất cả thành viên của vùng chứa đó sẽ được sao chép. Nếu trình đọc không nằm trên bất kỳ phần tử nào thì sẽ không có gì thay đổi khi gọi phương thức này.
Thông tin chi tiết | |||||||||
---|---|---|---|---|---|---|---|---|---|
Giá trị trả về |
|
Di chuyển cho đến cuối
void MoveUntilEnd( void )
Di chuyển mọi thứ từ điểm đọc hiện tại TLVUpdater\39; cho đến khi kết thúc bộ đệm TLV đầu vào.
Phương thức này hỗ trợ di chuyển mọi thứ từ điểm đọc hiện tại TLVUpdater\39 cho đến khi vùng đệm trình đọc kết thúc sang trình ghi của TLVUpdater&39;
Tiếp theo
WEAVE_ERROR Next( void )
Bỏ qua phần tử hiện tại và chuyển đối tượng TLVUpdater sang phần tử tiếp theo trong đầu vào TLV.
Phương thức Next() bỏ qua phần tử hiện tại trong đầu vào TLV và chuyển trình đọc TLVUpdater#39; sang phần tử tiếp theo nằm trong cùng ngữ cảnh chứa. Cụ thể, nếu trình đọc được đặt ở cấp cao nhất bên ngoài của phương thức mã hóa TLV, thì lệnh gọi Next() sẽ chuyển đối tượng đó đến phần tử tiếp theo, trên cùng. Nếu trình đọc được đặt trong phần tử vùng chứa TLV (cấu trúc, mảng hoặc đường dẫn), lệnh gọi Next() sẽ chuyển phần tử đó đến phần tử thành viên tiếp theo của vùng chứa đó.
Vì Next() ràng buộc chuyển động của trình đọc đối với ngữ cảnh vùng chứa hiện tại, nên việc gọi Next() khi trình đọc được định vị trên một phần tử vùng chứa sẽ tiến lên vùng chứa đó, bỏ qua các phần tử thành phần (và các thành phần của bất kỳ vùng chứa lồng nhau nào) cho đến khi đến phần tử đầu tiên sau vùng chứa.
Khi không có thêm phần tử nào trong ngữ cảnh chứa cụ thể, phương thức Next() sẽ trả về lỗi WEAVE_END_OF_TLV và vị trí của trình đọc sẽ không thay đổi.
Thông tin chi tiết | |||||
---|---|---|---|---|---|
Giá trị trả về |
|
Đặt
WEAVE_ERROR Put( uint64_t tag, int8_t v )
Đặt
WEAVE_ERROR Put( uint64_t tag, int16_t v )
Đặt
WEAVE_ERROR Put( uint64_t tag, int32_t v )
Đặt
WEAVE_ERROR Put( uint64_t tag, int64_t v )
Đặt
WEAVE_ERROR Put( uint64_t tag, uint8_t v )
Đặt
WEAVE_ERROR Put( uint64_t tag, uint16_t v )
Đặt
WEAVE_ERROR Put( uint64_t tag, uint32_t v )
Đặt
WEAVE_ERROR Put( uint64_t tag, uint64_t v )
Đặt
WEAVE_ERROR Put( uint64_t tag, int8_t v, bool preserveSize )
Đặt
WEAVE_ERROR Put( uint64_t tag, int16_t v, bool preserveSize )
Đặt
WEAVE_ERROR Put( uint64_t tag, int32_t v, bool preserveSize )
Đặt
WEAVE_ERROR Put( uint64_t tag, int64_t v, bool preserveSize )
Đặt
WEAVE_ERROR Put( uint64_t tag, uint8_t v, bool preserveSize )
Đặt
WEAVE_ERROR Put( uint64_t tag, uint16_t v, bool preserveSize )
Đặt
WEAVE_ERROR Put( uint64_t tag, uint32_t v, bool preserveSize )
Đặt
WEAVE_ERROR Put( uint64_t tag, uint64_t v, bool preserveSize )
Đặt
WEAVE_ERROR Put( uint64_t tag, float v )
Đặt
WEAVE_ERROR Put( uint64_t tag, double v )
Boolean
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 )
Chuỗi dây
WEAVE_ERROR PutString( uint64_t tag, const char *buf )
Chuỗi dây
WEAVE_ERROR PutString( uint64_t tag, const char *buf, uint32_t len )
Đặt Hàm ProfileProfile
void SetImplicitProfileId( uint32_t profileId )
Đặt mã hồ sơ ngầm cho đối tượng TLVUpdater.
Phương thức này sẽ đặt mã hồ sơ ngầm cho đối tượng TLVUpdater. Khi trình cập nhật được yêu cầu mã hoá một phần tử mới, nếu mã hồ sơ của thẻ liên kết với phần tử mới khớp với giá trị của profileId
, trình cập nhật sẽ mã hoá thẻ ở dạng ngầm ẩn, do đó bỏ qua mã hồ sơ trong quá trình này.
Thông tin chi tiết | |||
---|---|---|---|
Các tham số |
|
StartContainer
WEAVE_ERROR StartContainer( uint64_t tag, TLVType containerType, TLVType & outerContainerType )