nl::Weave::TLV::TLVUpdater

#include <src/lib/core/WeaveTLV.h>

Cung cấp giao diện Reader/Writer hợp nhất để chỉnh sửa/thêm/xoá các phần tử trong bộ mã hoá TLV.

Tóm tắt

TLVUpdater là một tập hợp các đối tượng TLVReaderTLVWriter đồng thời cung cấp các phương thức giao diện để chỉnh sửa/xoá dữ liệu trong một bộ mã hoá cũng như thêm các phần tử mới vào bộ mã hoá TLV. Về cơ bản, đối tượng TLVUpdater hoạt động như 2 con trỏ, một để đọc bộ mã hoá hiện có và một con trỏ để ghi (để sao chép trên 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 hợp nhất của TLVReaderTLVWriter. Các phương thức TLVUpdater có ý nghĩa tương tự hoặc ít tương tự như các phương thức có tên tương tự trong TLVReader/TLVWriter. Nếu có sự khác biệt về ngữ nghĩa, những khác biệt đó sẽ đượ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ề phương thức PutBytes() và PutString() của TLVUpdater là phương thức này có thể khiến quá trình mã hoá ở trạng thái bị hỏng chỉ với tiêu đề phần tử được ghi khi xảy ra tràn. Các ứng dụng có thể gọi GetRemainingFreeLength() để đảm bảo có khoảng đủ dung lượng trống để ghi mã hoá. Lưu ý rằng GetRemainingFreeLength() chỉ cho bạn biết các byte trống và không có cách nào để ứng dụng biết độ dài của dữ liệu đã mã hóa được ghi. Trong trường hợp bị tràn, cả PutBytes() và PutString() đều sẽ trả về WEAVE_ERROR_BUFFER_TOO_Small cho phương thức 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 trình đọc nội bộ sang phần tử tiếp theo. Vì việc bỏ qua các phần tử đã được mã hoá đòi hỏi phải thay đổi các biến trạng thái không gian trống của trình ghi nội bộ để tính đến không gian được giải phóng mới (được cung cấp bằng cách bỏ qua), ứ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 bỏ qua phần tử hiện tại).

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)
Hoàn tất việc đọc một phần tử vùng chứa TLV và mã hoá phần cuối của phần tử TLV trong TLV đầu ra.
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)
Sao chép phần tử hiện tại trong dữ liệu đầu vào TLV để xuất TLV.
MoveUntilEnd(void)
void
Di chuyển mọi thứ từ điểm đọc hiện tại của TLVUpdater cho đến khi kết thúc bộ đệm TLV đầu vào sang đầu ra.
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ã nhận dạng hồ sơ ngầm ẩn cho đối tượng TLVUpdater.
StartContainer(uint64_t tag, TLVType containerType, TLVType & outerContainerType)
VerifyEndOfContainer(void)

Hàm công khai

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
)

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á điểm bắt đầu của đố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 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(), phải thực hiện lệnh gọi tương ứng đến ExitContainer().

Khi gọi EnterContainer(), trình đọc của TLVUpdater phải được định vị trên phần tử vùng chứa. Phương thức này lấy làm một đối số và 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 trong khi đọc vùng chứa.

Khi phương thức EnterContainer() trả về, trình cập nhật được đặt ngay trước thành phần đầu tiên của vùng chứa. Việc gọi Next() nhiều lần sẽ chuyển trình cập nhật thông qua các thành phần của tập hợp cho đến khi kết thúc, 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
Tham số
[out] outerContainerType
Tham chiếu đến giá trị TLVType sẽ nhận ngữ cảnh của trình cập nhật.
Giá trị trả về
WEAVE_NO_ERROR
Nếu phương thức này thành công.
WEAVE_ERROR_INCORRECT_STATE
Nếu trình đọc TLVUpdater không được định vị trên một phần tử vùng chứa.
other
Mọi mã lỗi nền tảng hoặc Weave khác do TLVWriter::StartContainer() hoặc TLVReader::EnterContainer() trả về.

ExitContainer

WEAVE_ERROR ExitContainer(
  TLVType outerContainerType
)

Hoàn tất việc đọc một phần tử vùng chứa TLV và mã hoá phần cuối của phần tử TLV trong TLV đầu ra.

Phương thức ExitContainer() sẽ khôi phục trạng thái của đối tượng TLVUpdater sau lệnh gọi đến EnterContainer(). Đối với mỗi lệnh gọi đến ứng dụng EnterContainer(), phải thực hiện lệnh gọi tương ứng đến ExitContainer(), chuyển giá trị ngữ cảnh được trả về bằng phương thức EnterContainer().

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, các ứng dụng có thể gọi Next() để chuyển qua mọi phần tử còn lại.

Sau khi gọi EnterContainer(), các ứng dụng có thể gọi ExitContainer() trên trình cập nhật bất kỳ lúc 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ập nhật bị cắt bớt trong TLV đầu ra.

Thông tin chi tiết
Tham số
[in] outerContainerType
Giá trị TLVType mà phương thức EnterContainer() trả về.
Giá trị trả về
WEAVE_NO_ERROR
Nếu phương thức này thành công.
WEAVE_ERROR_TLV_UNDERRUN
Nếu quá trình mã hoá TLV cơ bản đã kết thúc sớm.
WEAVE_ERROR_INVALID_TLV_ELEMENT
Nếu trình cập nhật gặp phải loại phần tử TLV không hợp lệ hoặc không được hỗ trợ.
WEAVE_ERROR_INVALID_TLV_TAG
Nếu trình cập nhật gặp phải thẻ TLV trong ngữ cảnh không hợp lệ.
other
Mọi mã lỗi nền tảng hoặc Weave khác do TLVWriter::EndContainer() hoặc TLVReader::ExitContainer() 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
)

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
)

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à một đối tượng TLVReader riêng tư sẽ được khởi động trên vùng đệm di chuyển này. Đố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 từ đầ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 phần tử mới vào bộ mã hoá.

Thông tin chi tiết
Tham số
[in] buf
Con trỏ trỏ đến vùng đệm chứa dữ liệu TLV cần chỉnh sửa.
[in] dataLen
Độ dài của dữ liệu TLV trong vùng đệm.
[in] maxLen
Tổng chiều dài của vùng đệm.
Giá trị trả về
WEAVE_NO_ERROR
Nếu phương thức này thành công.
WEAVE_ERROR_INVALID_ARGUMENT
Nếu địa chỉ vùng đệm không hợp lệ.
WEAVE_ERROR_BUFFER_TOO_SMALL
Nếu vùng đệm quá nhỏ.

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 do TLVReader trỏ đến sẽ được di chuyển từ điểm đọc hiện tại đến 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 một đối tượng TLVWriter riêng tư mới được khởi động để ghi vào không gian đệm đã giải phóng.

Lưu ý rằng nếu TLVReader đã được đặt ở vị trí "on" (bật) một phần tử thì đầu tiên phần tử đó sẽ được sao lưu vào phần đầu của phần tử đó. Ngoài ra, xin lưu ý rằng thao tác sao lưu này hoạt động tốt với các phần tử vùng chứa, tức là nếu TLVReader đã được dùng để gọi EnterContainer(), thì bạn không cần phải sao lưu. Nhưng nếu TLVReader được định vị trên phần tử vùng chứa và EnterContainer() chưa được gọi, thì đối tượng TLVReader sẽ được sao lưu vào phần đầu của tiêu đề vùng 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 đối tượng tương tự khi trả về.

Thông tin chi tiết
Tham số
[in,out] aReader
Tham chiếu đến một đối tượng TLVReader sẽ bị huỷ trước khi trả lại.
[in] freeLen
Độ dài không gian trống (tính bằng byte) có trong vùng đệm dữ liệu được mã hoá trước.
Giá trị trả về
WEAVE_NO_ERROR
Nếu phương thức này thành công.
WEAVE_ERROR_INVALID_ARGUMENT
Nếu địa chỉ vùng đệm không hợp lệ.
WEAVE_ERROR_NOT_IMPLEMENTED
Nếu trình đọc được khởi động trên một chuỗi vùng đệm.

Di chuyển

WEAVE_ERROR Move(
  void
)

Sao chép phần tử hiện tại trong dữ liệu đầu vào TLV để xuất TLV.

Phương thức Move() sẽ sao chép phần tử hiện tại nơi đặt trình đọc của TLVUpdater sang trình ghi của TLVUpdater. Ứng dụng sẽ gọi Next() và định vị trình đọc của TLVUpdater trên một phần tử trước khi gọi phương thức này. 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 gọi, thì tất cả thành phần của vùng chứa sẽ được sao chép. Nếu trình đọc không được đặt 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ề
WEAVE_NO_ERROR
Nếu trình đọc TLVUpdater được định vị thành công trên một phần tử mới.
WEAVE_END_OF_TLV
Nếu trình đọc của TLVUpdater đang trỏ đến cuối vùng chứa.
WEAVE_ERROR_INVALID_TLV_ELEMENT
Nếu trình đọc của TLVIpdater không được đặt trên phần tử TLV hợp lệ.
other
Trả về các mã lỗi khác do phương thức TLVReader::Skip() trả về.

MoveUntilEnd

void MoveUntilEnd(
  void
)

Di chuyển mọi thứ từ điểm đọc hiện tại của TLVUpdater cho đến khi kết thúc bộ đệm TLV đầu vào sang đầu ra.

Phương thức này hỗ trợ việc di chuyển mọi thứ từ điểm đọc hiện tại của TLVUpdater cho đến cuối vùng đệm trình đọc sang trình ghi của TLVUpdater.

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 TLV đầu vào và chuyển trình đọc của TLVUpdater 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 độ ngoài cùng của bộ mã hoá TLV, thì lệnh gọi Next() sẽ chuyển trình đọc lên phần tử tiếp theo ở trên cùng nhất. 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), thì lệnh gọi Next() sẽ chuyển trình đọc đến phần tử thành phần tiếp theo của vùng chứa.

Next() ràng buộc chuyển động của người đọc trong ngữ cảnh chứa hiện tại, nên việc gọi Next() khi trình đọc được định vị trên phần tử vùng chứa sẽ di chuyển qua vùng chứa, bỏ qua các phần tử thành phần của vùng chứa (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òn phần tử nào khác trong một 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ề
WEAVE_NO_ERROR
Nếu trình đọc TLVUpdater được định vị thành công trên một phần tử mới.
other
Trả về mã lỗi Weave hoặc nền tảng do phương thức TLVReader::Skip()TLVReader::Next() 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
)

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
)

Đặt mã nhận dạng hồ sơ ngầm ẩn cho đối tượng TLVUpdater.

Phương thức này sẽ đặt mã hồ sơ ngầm ẩn cho đối tượng TLVUpdater. Khi được yêu cầu mã hoá một phần tử mới, nếu mã cấu hình của thẻ liên kết với phần tử mới khớp với giá trị của profileId, thì trình cập nhật sẽ mã hoá thẻ ở dạng ngầm ẩn, do đó, bỏ qua mã cấu hình trong quá trình này.

Thông tin chi tiết
Tham số
[in] profileId
Mã hồ sơ của các thẻ được mã hoá ở dạng ngầm ẩn.

StartContainer

WEAVE_ERROR StartContainer(
  uint64_t tag,
  TLVType containerType,
  TLVType & outerContainerType
)

VerifyEndOfContainer

WEAVE_ERROR VerifyEndOfContainer(
  void
)