nl::Weave::TLV::TLVUpdater

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

Zapewnia ujednolicony interfejs czytnika/zapisu do edycji, dodawania i usuwania elementów w kodowaniu TLV.

Podsumowanie

Komponent TLVUpdater łączy obiekty TLVReader i TLVWriter. Udostępnia metody interfejsu do edytowania/usuwania danych w kodowaniu oraz dodawania nowych elementów do kodowania TLV. Obiekt TLVUpdater działa zasadniczo jak 2 kursy – jeden do odczytu istniejącego kodowania, a drugi do zapisu (służącego do kopiowania istniejących danych lub zapisywania nowych).

Pod względem semantycznym obiekt TLVUpdater działa tak jak suma zbiorów TLVReader i TLVWriter. Metody TLVUpdater mają bardziej lub mniej podobne znaczenia co ich odpowiedniki w programie TLVReader/TLVWriter. Jeśli występują różnice w semantyce, różnice są wyraźnie udokumentowane w sekcji komentarzy funkcji w pliku WeaveTLVUpdater.cpp.

Szczególnie ważna uwaga dotycząca metod PutBytes() i PutString() w narzędziu TLVUpdater polega na tym, że kodowanie może pozostać w stanie uszkodzonego, a w przypadku wystąpienia przepełnienia może zostać zapisany tylko nagłówek elementu. Aplikacje mogą wywoływać metodę GetParametr FreeLength(), aby sprawdzić, czy jest w około ilość wolnego miejsca na zapisanie kodowania. Pamiętaj, że funkcja GetAllFreeLength() informuje tylko o dostępnych wolnych bajtach i nie ma sposobu, aby aplikacja mogła poznać długość zakodowanych danych. W przypadku przepełnienia funkcje PutBytes() i PutString() zwracają element wywołujący wartość WEAVE_ERROR_BUFFER_TOO_SMALL.

Pamiętaj też, że metoda Next() jest przeciążona, aby pominąć bieżący element, a także przejść do następnego elementu. Pomijanie już zakodowanych elementów wymaga zmiany zmiennych stanu wolnego miejsca wewnętrznego zapisującego, by uwzględnić nowe zwolnione miejsce (dostępne przez pominięcie), dlatego aplikacja powinna wywołać Next() w aktualizatorze po metodzie Get(), której wartości nie chce odpisywać (co odpowiada pominięciu bieżącego elementu).

Funkcje publiczne

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)
Przygotowuje obiekt TLVUpdater do odczytu elementów kontenera.
ExitContainer(TLVType outerContainerType)
Kończy odczyt elementu kontenera TLV i koduje koniec elementu TLV w wyjściowym 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)
Zainicjuj obiekt TLVUpdater, aby edytować pojedynczy bufor wejściowy.
Init(TLVReader & aReader, uint32_t freeLen)
Zainicjuj obiekt TLVUpdater za pomocą narzędzia TLVReader.
Move(void)
Kopiuje bieżący element z wejściowego elementu TLV do wyjściowego elementu TLV.
MoveUntilEnd(void)
void
Przenieś wszystko od bieżącego punktu odczytu narzędzia TLVUpdater do końca wejściowego bufora TLV do danych wyjściowych.
Next(void)
Pomiń bieżący element i przenieś obiekt TLVUpdater do następnego elementu w wejściowym 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
Ustaw identyfikator profilu niejawnego dla obiektu TLVUpdater.
StartContainer(uint64_t tag, TLVType containerType, TLVType & outerContainerType)
VerifyEndOfContainer(void)

Funkcje publiczne

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
)

Przygotowuje obiekt TLVUpdater do odczytu elementów kontenera.

Koduje też początek obiektu kontenera w wyjściu TLV.

Metoda EnterContainer() przygotowuje bieżący obiekt TLVUpdater do rozpoczynania odczytu elementów składowych kontenera TLV (struktury, tablicy lub ścieżki). Każde wywołanie aplikacji EnterContainer() musi odpowiadać wywołaniu ExitContainer().

Gdy metoda EnterContainer() jest wywoływana, czytnik TLVUpdater musi być umieszczony w elemencie kontenera. Ta metoda przyjmuje jako argument odwołanie do wartości TLVType, która zostanie użyta do zapisania kontekstu aktualizatora podczas odczytu kontenera.

Po zwróceniu metody EnterContainer() aktualizator znajduje się bezpośrednio przed pierwszym elementem kontenera. Powtarzające się wywoływanie funkcji Next() powoduje, że aktualizator przechodzi przez członków kolekcji aż do osiągnięcia końca kolekcji. Gdy to nastąpi, zwróci wartość WEAVE_END_OF_TLV.

Gdy aplikacja skończy odczytywać kontener, może kontynuować odczytywanie elementów, które znajdują się za kontenerem, wywołując metodę ExitContainer().

Szczegóły
Parametry
[out] outerContainerType
Odwołanie do wartości TLVType, która otrzyma kontekst aktualizatora.
Zwracane wartości
WEAVE_NO_ERROR
Jeśli to się uda,
WEAVE_ERROR_INCORRECT_STATE
Jeśli czytnik TLVUpdater nie jest umieszczony w elemencie kontenera.
other
Dowolny inny kod błędu Weave lub platformy zwrócony przez metodę TLVWriter::StartContainer() lub TLVReader::EnterContainer().

ExitContainer

WEAVE_ERROR ExitContainer(
  TLVType outerContainerType
)

Kończy odczyt elementu kontenera TLV i koduje koniec elementu TLV w wyjściowym TLV.

Metoda ExitContainer() przywraca stan obiektu TLVUpdater po wywołaniu metody EnterContainer(). Każde wywołanie aplikacji EnterContainer() musi wywołać odpowiadające jej wywołanie ExitContainer(), przekazując wartość kontekstu zwracaną przez metodę EnterContainer().

Po zwróceniu metody ExitContainer() czytnik TLVUpdater zostanie umieszczony bezpośrednio przed pierwszym elementem, który występuje za kontenerem w wejściowym TLV. Od tego momentu aplikacje mogą wywoływać metodę Next(), aby przechodzić między pozostałymi elementami.

Po wywołaniu metody EnterContainer() aplikacje mogą w dowolnym momencie wywołać metodę ExitContainer() w aktualizatorze, niezależnie od tego, czy wszystkie elementy w kontenerze zostały odczytane. Pamiętaj też, że wywołanie metody ExitContainer() przed odczytaniem wszystkich elementów w kontenerze spowoduje obcięcie zaktualizowanego kontenera w TLV wyjściowego.

Szczegóły
Parametry
[in] outerContainerType
Wartość TLVType zwrócona przez metodę EnterContainer().
Zwracane wartości
WEAVE_NO_ERROR
Jeśli to się uda,
WEAVE_ERROR_TLV_UNDERRUN
Czy kodowanie TLV zakończyło się przedwcześnie.
WEAVE_ERROR_INVALID_TLV_ELEMENT
Aktualizator napotkał nieprawidłowy lub nieobsługiwany typ elementu TLV.
WEAVE_ERROR_INVALID_TLV_TAG
Aktualizator napotkał tag TLV w nieprawidłowym kontekście.
other
Dowolny inny kod błędu Weave lub platformy zwrócony przez metodę TLVWriter::EndContainer() lub TLVReader::ExitContainer().

Zakończ

WEAVE_ERROR Finalize(
  void
)

Pobierz

WEAVE_ERROR Get(
  bool & v
)

Pobierz

WEAVE_ERROR Get(
  int8_t & v
)

Pobierz

WEAVE_ERROR Get(
  int16_t & v
)

Pobierz

WEAVE_ERROR Get(
  int32_t & v
)

Pobierz

WEAVE_ERROR Get(
  int64_t & v
)

Pobierz

WEAVE_ERROR Get(
  uint8_t & v
)

Pobierz

WEAVE_ERROR Get(
  uint16_t & v
)

Pobierz

WEAVE_ERROR Get(
  uint32_t & v
)

Pobierz

WEAVE_ERROR Get(
  uint64_t & v
)

Pobierz

WEAVE_ERROR Get(
  float & v
)

Pobierz

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 

Zainicjuj

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

Zainicjuj obiekt TLVUpdater, aby edytować pojedynczy bufor wejściowy.

Po wywołaniu tej metody dane TLV w buforze są przenoszone na koniec bufora, a w tym przeniesionym buforze zainicjowany jest prywatny obiekt TLVReader. W wolnym miejscu, które jest teraz dostępne na początku, inicjowany jest również prywatny obiekt TLVWriter. Aplikacje mogą używać obiektu TLVUpdater do analizowania danych TLV oraz modyfikowania i usuwania istniejących elementów oraz dodawania nowych elementów do kodowania.

Szczegóły
Parametry
[in] buf
Wskaźnik do bufora zawierającego dane TLV, które mają być edytowane.
[in] dataLen
Długość danych TLV w buforze.
[in] maxLen
Całkowita długość bufora.
Zwracane wartości
WEAVE_NO_ERROR
Jeśli to się uda,
WEAVE_ERROR_INVALID_ARGUMENT
Jeśli adres bufora jest nieprawidłowy.
WEAVE_ERROR_BUFFER_TOO_SMALL
Jeśli bufor jest za mały.

Zainicjuj

WEAVE_ERROR Init(
  TLVReader & aReader,
  uint32_t freeLen
)

Zainicjuj obiekt TLVUpdater za pomocą narzędzia TLVReader.

Po wywołaniu tej metody dane TLV w buforze wskazywane przez tag TLVReader są przenoszone z bieżącego punktu odczytu na koniec bufora. Zainicjowano nowy prywatny obiekt TLVReader do odczytu z tej nowej lokalizacji, a nowy obiekt TLVWriter zostaje zainicjowany w celu zapisu w zwolnionym miejscu bufora.

Pamiętaj, że jeśli element TLVReader jest już w pozycji „w” elementu, kopia zapasowa jest najpierw wykonywane na początku tego elementu. Pamiętaj też, że to zabezpieczenie działa dobrze w przypadku elementów kontenera, tj. jeśli obiekt TLVReader był już używany do wywołania EnterContainer(), nie ma niczego, co można by wycofać. Jeśli jednak obiekt TLVReader był umieszczony w elemencie kontenera, a metoda EnterContainer() nie została jeszcze wywołana, obiekt TLVReader zostaje wycofany na początku nagłówka kontenera.

Wejściowy obiekt TLVReader zostanie zniszczony przed zwróceniem, a aplikacja nie może go używać po zwróceniu.

Szczegóły
Parametry
[in,out] aReader
Odwołanie do obiektu TLVReader, który zostanie zniszczony przed zwróceniem.
[in] freeLen
Długość wolnego miejsca (w bajtach) dostępnego we wstępnie zakodowanym buforze danych.
Zwracane wartości
WEAVE_NO_ERROR
Jeśli to się uda,
WEAVE_ERROR_INVALID_ARGUMENT
Jeśli adres bufora jest nieprawidłowy.
WEAVE_ERROR_NOT_IMPLEMENTED
Jeśli czytnik został zainicjowany w łańcuchu buforów.

Przenieś

WEAVE_ERROR Move(
  void
)

Kopiuje bieżący element z wejściowego elementu TLV do wyjściowego elementu TLV.

Metoda Move() kopiuje bieżący element, w którym znajduje się czytnik TLVUpdater, do zapisującego w narzędziu TLVUpdater. Przed wywołaniem tej metody aplikacja powinna wywołać metodę Next() i umieścić czytnik TLVUpdater w elemencie. Podobnie jak w przypadku metody TLVReader::Next(), jeśli w czasie wywołania czytnik znajdzie się na elemencie kontenera, wszystkie jego elementy zostaną skopiowane. Jeśli czytnik nie znajduje się na żadnym elemencie, wywołanie tej metody nie ulegnie zmianie.

Szczegóły
Zwracane wartości
WEAVE_NO_ERROR
Czy czytnik TLVUpdater został umieszczony w nowym elemencie.
WEAVE_END_OF_TLV
Jeśli czytnik narzędzia TLVUpdater wskazuje koniec kontenera.
WEAVE_ERROR_INVALID_TLV_ELEMENT
Jeśli czytnik TLVIpdater nie jest umieszczony w prawidłowym elemencie TLV.
other
Zwraca inne kody błędów zwrócone przez metodę TLVReader::Pomiń().

MoveUntilEnd

void MoveUntilEnd(
  void
)

Przenieś wszystko od bieżącego punktu odczytu narzędzia TLVUpdater do końca wejściowego bufora TLV do danych wyjściowych.

Ta metoda umożliwia przeniesienie wszystkiego od bieżącego punktu odczytu w narzędziu TLVUpdater do końca bufora czytnika do zapisu w narzędziu TLVUpdater.

Dalej

WEAVE_ERROR Next(
  void
)

Pomiń bieżący element i przenieś obiekt TLVUpdater do następnego elementu w wejściowym TLV.

Metoda Next() pomija bieżący element w wejściowym TLV i przenosi czytnik TLVUpdater do następnego elementu, który znajduje się w tym samym kontekście izolacji. W szczególności, jeśli czytnik znajduje się na najwyższym poziomie kodu TLV, wywołanie metody Next() spowoduje przejście do kolejnego, najwyższego poziomu. Jeśli czytnik znajduje się w elemencie kontenera TLV (strukturze, tablicy lub ścieżce), wywołanie funkcji Next() spowoduje przejście do następnego elementu kontenera.

Funkcja Next() ogranicza ruch czytnika do bieżącego kontekstu izolacji, dlatego wywołanie metody Next(), gdy czytnik znajduje się w elemencie kontenera, powoduje przejście nad kontenera, pomijanie jego elementów składowych (i elementów zagnieżdżonych kontenerów), aż dotrze do pierwszego elementu za kontenerem.

Gdy w konkretnym kontekście izolacji nie ma więcej elementów, metoda Next() zwraca błąd WEAVE_END_OF_TLV, a położenie czytnika się nie zmienia.

Szczegóły
Zwracane wartości
WEAVE_NO_ERROR
Czy czytnik TLVUpdater został umieszczony w nowym elemencie.
other
Zwraca kody błędów splotu lub platformy zwrócone przez metody TLVReader::Pomiń() i 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
)

Ustaw identyfikator profilu niejawnego dla obiektu TLVUpdater.

Ta metoda ustawia niejawny identyfikator profilu dla obiektu TLVUpdater. Gdy aktualizator zostanie poproszony o zakodowanie nowego elementu, a identyfikator profilu tagu powiązanego z nowym elementem będzie zgodny z wartością parametru profileId, aktualizator zakoduje tag w sposób niejawny, co spowoduje pominięcie identyfikatora profilu.

Szczegóły
Parametry
[in] profileId
Identyfikator profilu tagów, które powinny być zakodowane w postaci niejawnej.

StartContainer

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

VerifyEndOfContainer

WEAVE_ERROR VerifyEndOfContainer(
  void
)