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)
|
|
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)
|
|
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 |
|
||||||
Zwracane wartości |
|
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 |
|
||||||||||
Zwracane wartości |
|
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 |
|
||||||
Zwracane wartości |
|
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 |
|
||||||
Zwracane wartości |
|
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 |
|
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 |
|
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 |
|
StartContainer
WEAVE_ERROR StartContainer( uint64_t tag, TLVType containerType, TLVType & outerContainerType )