nl::Weave::TLV::TLVUpdater

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

Menyediakan antarmuka Pembaca/Penulis terpadu untuk mengedit/menambahkan/menghapus elemen dalam encoding TLV.

Ringkasan

TLVUpdater adalah gabungan objek TLVReader dan TLVWriter serta menyediakan metode antarmuka untuk mengedit/menghapus data dalam encoding serta menambahkan elemen baru ke encoding TLV. Objek TLVUpdater pada dasarnya berfungsi seperti dua kursor, satu untuk membaca encoding yang ada dan satu lagi untuk menulis (baik untuk menyalin data yang ada atau menulis data baru).

Secara semantik, objek TLVUpdater berfungsi seperti gabungan dari TLVReader dan TLVWriter. Metode TLVUpdater memiliki arti yang kurang lebih sama dengan metode yang memiliki nama serupa di TLVReader/TLVWriter. Jika ada perbedaan dalam semantik, perbedaan tersebut didokumentasikan dengan jelas di bagian komentar fungsi di WeaveTLVUpdater.cpp.

Salah satu catatan penting tentang metode PutBytes() dan PutString() TLVUpdater adalah bahwa metode ini dapat membiarkan encoding dalam status rusak dengan hanya header elemen yang ditulis saat terjadi overflow. Aplikasi dapat memanggil GetRemainingFreeLength() untuk memastikan ada sekitar ruang kosong yang cukup untuk menulis encoding. Perhatikan bahwa GetRemainingFreeLength() hanya memberi tahu Anda byte gratis yang tersedia dan tidak ada cara bagi aplikasi untuk mengetahui panjang data yang dienkode yang akan ditulis. Jika terjadi overflow, PutBytes() dan PutString() akan mengembalikan WEAVE_ERROR_BUFFER_TOO_SMALL ke pemanggil.

Selain itu, perhatikan bahwa metode Next() kelebihan beban sehingga melewati elemen saat ini dan juga memajukan pembaca internal ke elemen berikutnya. Karena melewatkan elemen yang sudah dienkode memerlukan perubahan variabel status ruang kosong penulis internal untuk memperhitungkan ruang kosong baru (disediakan dengan melewati), aplikasi diharapkan memanggil Next() pada updater setelah metode Get() yang nilainya tidak ingin ditulis kembali (yang setara dengan melewati elemen saat ini).

Fungsi publik

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)
Menyiapkan objek TLVUpdater untuk membaca elemen container.
ExitContainer(TLVType outerContainerType)
Menyelesaikan pembacaan elemen container TLV dan mengenkode akhir elemen TLV dalam TLV output.
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)
Lakukan inisialisasi objek TLVUpdater untuk mengedit buffer input tunggal.
Init(TLVReader & aReader, uint32_t freeLen)
Lakukan inisialisasi objek TLVUpdater menggunakan TLVReader.
Move(void)
Menyalin elemen saat ini dari input TLV ke output TLV.
MoveUntilEnd(void)
void
Pindahkan semuanya dari titik baca TLVUpdater saat ini hingga akhir buffer TLV input ke output.
Next(void)
Lewati elemen saat ini dan lanjutkan objek TLVUpdater ke elemen berikutnya dalam TLV input.
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
Tetapkan ID Profil Implisit untuk objek TLVUpdater.
StartContainer(uint64_t tag, TLVType containerType, TLVType & outerContainerType)
VerifyEndOfContainer(void)

Fungsi publik

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
)

Menyiapkan objek TLVUpdater untuk membaca elemen container.

Kode ini juga mengenkode awal objek container dalam TLV output.

Metode EnterContainer() menyiapkan objek TLVUpdater saat ini untuk mulai membaca elemen anggota penampung TLV (struktur, array, atau jalur). Untuk setiap panggilan ke aplikasi EnterContainer(), Anda harus melakukan panggilan yang sesuai ke ExitContainer().

Saat EnterContainer() dipanggil, pembaca TLVUpdater harus diposisikan pada elemen penampung. Metode ini mengambil referensi ke nilai TLVType sebagai argumen yang akan digunakan untuk menyimpan konteks updater saat membaca container.

Saat metode EnterContainer() ditampilkan, updater diposisikan tepat sebelum anggota pertama penampung. Memanggil Next() berulang kali akan melanjutkan updater melalui anggota koleksi hingga akhir tercapai, lalu updater akan menampilkan WEAVE_END_OF_TLV.

Setelah selesai membaca penampung, aplikasi dapat terus membaca elemen setelah penampung dengan memanggil metode ExitContainer().

Detail
Parameter
[out] outerContainerType
Referensi ke nilai TLVType yang akan menerima konteks updater.
Nilai yang Ditampilkan
WEAVE_NO_ERROR
Jika metode ini berhasil.
WEAVE_ERROR_INCORRECT_STATE
Jika pembaca TLVUpdater tidak diposisikan di elemen container.
other
Kode error platform atau Weave lainnya yang ditampilkan oleh TLVWriter::StartContainer() atau TLVReader::EnterContainer().

ExitContainer

WEAVE_ERROR ExitContainer(
  TLVType outerContainerType
)

Menyelesaikan pembacaan elemen container TLV dan mengenkode akhir elemen TLV dalam TLV output.

Metode ExitContainer() memulihkan status objek TLVUpdater setelah panggilan ke EnterContainer(). Untuk setiap panggilan ke EnterContainer(), aplikasi harus melakukan panggilan yang sesuai ke ExitContainer(), dengan meneruskan nilai konteks yang ditampilkan oleh metode EnterContainer().

Saat ExitContainer() ditampilkan, pembaca TLVUpdater diposisikan tepat sebelum elemen pertama yang mengikuti penampung dalam TLV input. Dari sini aplikasi dapat memanggil Next() untuk maju melalui elemen yang tersisa.

Setelah EnterContainer() dipanggil, aplikasi dapat memanggil ExitContainer() pada updater kapan saja, terlepas dari apakah semua elemen dalam penampung pokok telah dibaca atau belum. Selain itu, perhatikan bahwa memanggil ExitContainer() sebelum membaca semua elemen dalam container, akan mengakibatkan container yang diupdate terpotong dalam output TLV.

Detail
Parameter
[in] outerContainerType
Nilai TLVType yang ditampilkan oleh metode EnterContainer().
Nilai yang Ditampilkan
WEAVE_NO_ERROR
Jika metode ini berhasil.
WEAVE_ERROR_TLV_UNDERRUN
Jika encoding TLV yang mendasarinya berakhir sebelum waktunya.
WEAVE_ERROR_INVALID_TLV_ELEMENT
Jika updater mengalami jenis elemen TLV yang tidak valid atau tidak didukung.
WEAVE_ERROR_INVALID_TLV_TAG
Jika updater menemukan tag TLV dalam konteks yang tidak valid.
other
Kode error platform atau Weave lainnya yang ditampilkan oleh TLVWriter::EndContainer() atau TLVReader::ExitContainer().

Finalisasi

WEAVE_ERROR Finalize(
  void
)

Dapatkan

WEAVE_ERROR Get(
  bool & v
)

Dapatkan

WEAVE_ERROR Get(
  int8_t & v
)

Dapatkan

WEAVE_ERROR Get(
  int16_t & v
)

Dapatkan

WEAVE_ERROR Get(
  int32_t & v
)

Dapatkan

WEAVE_ERROR Get(
  int64_t & v
)

Dapatkan

WEAVE_ERROR Get(
  uint8_t & v
)

Dapatkan

WEAVE_ERROR Get(
  uint16_t & v
)

Dapatkan

WEAVE_ERROR Get(
  uint32_t & v
)

Dapatkan

WEAVE_ERROR Get(
  uint64_t & v
)

Dapatkan

WEAVE_ERROR Get(
  float & v
)

Dapatkan

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
)

Lakukan inisialisasi objek TLVUpdater untuk mengedit buffer input tunggal.

Saat memanggil metode ini, data TLV dalam buffer dipindahkan ke akhir buffer dan objek TLVReader pribadi diinisialisasi pada buffer yang direlokasi ini. Objek TLVWriter pribadi juga diinisialisasi di ruang kosong yang sekarang tersedia di awal. Aplikasi dapat menggunakan objek TLVUpdater untuk mengurai data TLV dan mengubah/menghapus elemen yang ada atau menambahkan elemen baru ke encoding.

Detail
Parameter
[in] buf
Pointer ke buffer yang berisi data TLV yang akan diedit.
[in] dataLen
Panjang data TLV dalam buffer.
[in] maxLen
Panjang total buffer.
Nilai yang Ditampilkan
WEAVE_NO_ERROR
Jika metode ini berhasil.
WEAVE_ERROR_INVALID_ARGUMENT
Jika alamat buffer tidak valid.
WEAVE_ERROR_BUFFER_TOO_SMALL
Jika buffer terlalu kecil.

Init

WEAVE_ERROR Init(
  TLVReader & aReader,
  uint32_t freeLen
)

Lakukan inisialisasi objek TLVUpdater menggunakan TLVReader.

Saat memanggil metode ini, data TLV dalam buffer yang ditunjuk oleh TLVReader akan dipindahkan dari titik baca saat ini ke akhir buffer. Objek TLVReader pribadi baru diinisialisasi untuk membaca dari lokasi baru ini, sedangkan objek TLVWriter pribadi baru diinisialisasi untuk menulis ke ruang buffer yang dikosongkan.

Perhatikan bahwa jika TLVReader sudah diposisikan "aktif" sebuah elemen, maka hal itu pertama-tama dimundurkan ke awal elemen itu. Perhatikan juga bahwa pencadangan ini berfungsi baik dengan elemen container, yaitu, jika TLVReader sudah digunakan untuk memanggil EnterContainer(), tidak ada yang perlu dicadangkan. Namun, jika TLVReader diposisikan pada elemen container dan EnterContainer() belum dipanggil, objek TLVReader akan dicadangkan ke awal head container.

Objek TLVReader input akan dihancurkan sebelum ditampilkan dan aplikasi tidak boleh menggunakan objek yang sama saat ditampilkan.

Detail
Parameter
[in,out] aReader
Referensi ke objek TLVReader yang akan dihancurkan sebelum ditampilkan.
[in] freeLen
Panjang ruang kosong (dalam byte) yang tersedia di buffer data yang telah dienkode sebelumnya.
Nilai yang Ditampilkan
WEAVE_NO_ERROR
Jika metode ini berhasil.
WEAVE_ERROR_INVALID_ARGUMENT
Jika alamat buffer tidak valid.
WEAVE_ERROR_NOT_IMPLEMENTED
Jika pembaca diinisialisasi pada rantai buffer.

Pindahkan

WEAVE_ERROR Move(
  void
)

Menyalin elemen saat ini dari input TLV ke output TLV.

Metode Move() menyalin elemen saat ini tempat pembaca TLVUpdater berada di posisi penulis TLVUpdater. Aplikasi harus memanggil Next() dan memosisikan pembaca TLVUpdater pada elemen sebelum memanggil metode ini. Sama seperti metode TLVReader::Next(), jika pembaca diposisikan pada elemen container saat panggilan, semua anggota container akan disalin. Jika pembaca tidak diposisikan pada elemen apa pun, tidak ada yang berubah saat memanggil metode ini.

Detail
Nilai yang Ditampilkan
WEAVE_NO_ERROR
Jika pembaca TLVUpdater berhasil diposisikan di elemen baru.
WEAVE_END_OF_TLV
Jika pembaca TLVUpdater mengarah ke akhir container.
WEAVE_ERROR_INVALID_TLV_ELEMENT
Jika pembaca TLVIpadater tidak diposisikan pada elemen TLV yang valid.
other
Menampilkan kode error lain yang ditampilkan oleh metode TLVReader::Skip().

MoveUntilEnd

void MoveUntilEnd(
  void
)

Pindahkan semuanya dari titik baca TLVUpdater saat ini hingga akhir buffer TLV input ke output.

Metode ini mendukung pemindahan apa saja dari titik baca TLVUpdater saat ini hingga akhir buffer pembaca ke penulis TLVUpdater.

Berikutnya

WEAVE_ERROR Next(
  void
)

Lewati elemen saat ini dan lanjutkan objek TLVUpdater ke elemen berikutnya dalam TLV input.

Metode Next() melewati elemen saat ini dalam TLV input dan memajukan pembaca TLVUpdater ke elemen berikutnya yang berada dalam konteks pembatasan yang sama. Khususnya, jika pembaca diposisikan di level paling luar dari encoding TLV, memanggil Next() akan melanjutkannya ke elemen berikutnya yang paling atas. Jika pembaca diposisikan dalam elemen penampung TLV (struktur, array, atau jalur), memanggil Next() akan memajukannya ke elemen anggota container berikutnya.

Karena Next() membatasi gerakan pembaca ke konteks pembatasan saat ini, memanggil Next() saat pembaca diposisikan pada elemen penampung akan memajukan ke atas penampung, melewati elemen anggotanya (dan anggota penampung bertingkat) hingga mencapai elemen pertama setelah penampung.

Jika tidak ada elemen lebih lanjut dalam konteks pembatasan tertentu, metode Next() akan menampilkan error WEAVE_END_OF_TLV dan posisi pembaca tidak akan berubah.

Detail
Nilai yang Ditampilkan
WEAVE_NO_ERROR
Jika pembaca TLVUpdater berhasil diposisikan di elemen baru.
other
Menampilkan kode error platform atau Weave yang ditampilkan oleh metode TLVReader::Skip() dan TLVReader::Next().

Put

WEAVE_ERROR Put(
  uint64_t tag,
  int8_t v
)

Put

WEAVE_ERROR Put(
  uint64_t tag,
  int16_t v
)

Put

WEAVE_ERROR Put(
  uint64_t tag,
  int32_t v
)

Put

WEAVE_ERROR Put(
  uint64_t tag,
  int64_t v
)

Put

WEAVE_ERROR Put(
  uint64_t tag,
  uint8_t v
)

Put

WEAVE_ERROR Put(
  uint64_t tag,
  uint16_t v
)

Put

WEAVE_ERROR Put(
  uint64_t tag,
  uint32_t v
)

Put

WEAVE_ERROR Put(
  uint64_t tag,
  uint64_t v
)

Put

WEAVE_ERROR Put(
  uint64_t tag,
  int8_t v,
  bool preserveSize
)

Put

WEAVE_ERROR Put(
  uint64_t tag,
  int16_t v,
  bool preserveSize
)

Put

WEAVE_ERROR Put(
  uint64_t tag,
  int32_t v,
  bool preserveSize
)

Put

WEAVE_ERROR Put(
  uint64_t tag,
  int64_t v,
  bool preserveSize
)

Put

WEAVE_ERROR Put(
  uint64_t tag,
  uint8_t v,
  bool preserveSize
)

Put

WEAVE_ERROR Put(
  uint64_t tag,
  uint16_t v,
  bool preserveSize
)

Put

WEAVE_ERROR Put(
  uint64_t tag,
  uint32_t v,
  bool preserveSize
)

Put

WEAVE_ERROR Put(
  uint64_t tag,
  uint64_t v,
  bool preserveSize
)

Put

WEAVE_ERROR Put(
  uint64_t tag,
  float v
)

Put

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
)

Tetapkan ID Profil Implisit untuk objek TLVUpdater.

Metode ini menetapkan ID profil implisit untuk objek TLVUpdater. Saat updater diminta untuk mengenkode elemen baru, jika ID profil tag yang terkait dengan elemen baru cocok dengan nilai profileId, updater akan mengenkode tag dalam bentuk implisit, sehingga menghilangkan ID profil dalam prosesnya.

Detail
Parameter
[in] profileId
ID profil tag yang harus dienkode dalam bentuk implisit.

StartContainer

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

VerifyEndOfContainer

WEAVE_ERROR VerifyEndOfContainer(
  void
)