нл:: Переплетение:: ТЛВ:: TLVUpdater

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

Предоставляет унифицированный интерфейс чтения/записи для редактирования/добавления/удаления элементов в кодировке TLV .

Краткое содержание

TLVUpdater представляет собой объединение объектов TLVReader и TLVWriter и предоставляет методы интерфейса для редактирования/удаления данных в кодировке, а также добавления новых элементов в кодировку TLV . Объект TLVUpdater по сути действует как два курсора: один для чтения существующей кодировки, а другой для записи (либо для копирования существующих данных, либо для записи новых данных).

Семантически объект 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)
Завершает чтение элемента контейнера TLV и кодирует конец элемента TLV в выходном TLV .
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)
Копирует текущий элемент из входного TLV в выходной TLV .
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)

Общественные функции

КопироватьЭлемент

WEAVE_ERROR CopyElement(
  TLVReader & reader
)

КопироватьЭлемент

WEAVE_ERROR CopyElement(
  uint64_t tag,
  TLVReader & reader
)

DupBytes

WEAVE_ERROR DupBytes(
  uint8_t *& buf,
  uint32_t & dataLen
)

ДупСтрока

WEAVE_ERROR DupString(
  char *& buf
)

КонечныйКонтейнер

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() .

Подробности
Параметры
[out] outerContainerType
Ссылка на значение TLVType, которое получит контекст средства обновления.
Возвращаемые значения
WEAVE_NO_ERROR
Если метод удался.
WEAVE_ERROR_INCORRECT_STATE
Если средство чтения TLVUpdater не расположено на элементе контейнера.
other
Любой другой код ошибки Weave или платформы, возвращаемый TLVWriter::StartContainer() или TLVReader::EnterContainer() .

ВыходКонтейнер

WEAVE_ERROR ExitContainer(
  TLVType outerContainerType
)

Завершает чтение элемента контейнера TLV и кодирует конец элемента TLV в выходном TLV .

Метод ExitContainer() восстанавливает состояние объекта TLVUpdater после вызова EnterContainer() . Для каждого вызова EnterContainer() приложения должны выполнить соответствующий вызов ExitContainer() , передав значение контекста, возвращаемое методом EnterContainer() .

Когда ExitContainer() возвращает значение, средство чтения TLVUpdater располагается непосредственно перед первым элементом, который следует за контейнером во входном TLV . С этого момента приложения могут вызывать Next() для перемещения по оставшимся элементам.

После вызова EnterContainer() приложения могут вызвать ExitContainer() в средстве обновления в любой момент времени, независимо от того, все ли элементы в базовом контейнере были прочитаны. Также обратите внимание, что вызов ExitContainer() перед чтением всех элементов в контейнере приведет к усечению обновленного контейнера в выходном TLV .

Подробности
Параметры
[in] outerContainerType
Значение TLVType, возвращенное методом EnterContainer() .
Возвращаемые значения
WEAVE_NO_ERROR
Если метод удался.
WEAVE_ERROR_TLV_UNDERRUN
Если базовое кодирование TLV завершилось преждевременно.
WEAVE_ERROR_INVALID_TLV_ELEMENT
Если программа обновления обнаружила недопустимый или неподдерживаемый тип элемента TLV .
WEAVE_ERROR_INVALID_TLV_TAG
Если программа обновления обнаружила тег TLV в недопустимом контексте.
other
Любой другой код ошибки Weave или платформы, возвращаемый TLVWriter::EndContainer() или TLVReader::ExitContainer() .

Завершить

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
)

Получить длину

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 

Инициализировать

WEAVE_ERROR Init(
  uint8_t *buf,
  uint32_t dataLen,
  uint32_t maxLen
)

Инициализируйте объект TLVUpdater для редактирования одного входного буфера.

При вызове этого метода данные TLV в буфере перемещаются в конец буфера, и в этом перемещенном буфере инициализируется частный объект TLVReader . Частный объект TLVWriter также инициализируется на свободном пространстве, которое теперь доступно вначале. Приложения могут использовать объект TLVUpdater для анализа данных TLV и изменения/удаления существующих элементов или добавления новых элементов в кодировку.

Подробности
Параметры
[in] buf
Указатель на буфер, содержащий данные TLV , подлежащие редактированию.
[in] dataLen
Длина данных TLV в буфере.
[in] maxLen
Общая длина буфера.
Возвращаемые значения
WEAVE_NO_ERROR
Если метод удался.
WEAVE_ERROR_INVALID_ARGUMENT
Если адрес буфера недействителен.
WEAVE_ERROR_BUFFER_TOO_SMALL
Если буфер слишком мал.

Инициализировать

WEAVE_ERROR Init(
  TLVReader & aReader,
  uint32_t freeLen
)

Инициализируйте объект TLVUpdater с помощью TLVReader .

При вызове этого метода данные TLV в буфере, на который указывает TLVReader, перемещаются из текущей точки чтения в конец буфера. Новый частный объект TLVReader инициализируется для чтения из этого нового места, а новый частный объект TLVWriter инициализируется для записи в освобожденное буферное пространство.

Обратите внимание: если TLVReader уже расположен «на» элементе, он сначала возвращается к началу этого элемента. Также обратите внимание, что это отключение хорошо работает с элементами-контейнерами, т. е. если TLVReader уже использовался для вызова EnterContainer() , то отступать нечего. Но если TLVReader был расположен в элементе контейнера и EnterContainer() еще не был вызван, то объект TLVReader перемещается в начало заголовка контейнера.

Входной объект TLVReader будет уничтожен перед возвратом, и приложение не должно использовать его при возврате.

Подробности
Параметры
[in,out] aReader
Ссылка на объект TLVReader , который будет уничтожен перед возвратом.
[in] freeLen
Длина свободного пространства (в байтах), доступного в буфере предварительно закодированных данных.
Возвращаемые значения
WEAVE_NO_ERROR
Если метод удался.
WEAVE_ERROR_INVALID_ARGUMENT
Если адрес буфера недействителен.
WEAVE_ERROR_NOT_IMPLEMENTED
Если считыватель был инициализирован на цепочке буферов.

Двигаться

WEAVE_ERROR Move(
  void
)

Копирует текущий элемент из входного TLV в выходной TLV .

Метод Move() копирует текущий элемент, на котором находится средство чтения TLVUpdater , в средство записи TLVUpdater . Приложение должно вызвать Next() и разместить считыватель TLVUpdater на элементе перед вызовом этого метода. Как и в случае с методом TLVReader::Next() , если во время вызова средство чтения находится на элементе контейнера, все элементы контейнера будут скопированы. Если средство чтения не позиционировано ни на одном элементе, при вызове этого метода ничего не изменится.

Подробности
Возвращаемые значения
WEAVE_NO_ERROR
Если средство чтения TLVUpdater было успешно размещено на новом элементе.
WEAVE_END_OF_TLV
Если читатель TLVUpdater указывает на конец контейнера.
WEAVE_ERROR_INVALID_TLV_ELEMENT
Если считыватель TLVpdater не расположен на допустимом элементе TLV .
other
Возвращает другие коды ошибок, возвращенные методом TLVReader::Skip() .

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_NO_ERROR
Если средство чтения TLVUpdater было успешно размещено на новом элементе.
other
Возвращает коды ошибок Weave или платформы, возвращаемые методами TLVReader::Skip() и TLVReader::Next() .

Помещать

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 , программа обновления закодирует тег в неявной форме, тем самым опуская идентификатор профиля в процессе.

Подробности
Параметры
[в] идентификатор профиля
Идентификатор профиля тегов, которые следует закодировать в неявной форме.

СтартКонтейнер

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

Верифиендофконтейнер

WEAVE_ERROR VerifyEndOfContainer(
  void
)