nl::Weave::TLV::TLVUpdater

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

Fornisce un'interfaccia di lettura/scrittura unificata per la modifica, l'aggiunta o l'eliminazione di elementi nella codifica TLV.

Riepilogo

TLVUpdater è una combinazione degli oggetti TLVReader e TLVWriter e fornisce metodi di interfaccia per modificare/eliminare i dati in una codifica e per aggiungere nuovi elementi alla codifica TLV. L'oggetto TLVUpdater funziona essenzialmente come due cursori, uno per la lettura della codifica esistente e un altro per la scrittura (per copiare dati esistenti o scrivere nuovi dati).

A livello semantico, l'oggetto TLVUpdater funziona come un'unione di TLVReader e TLVWriter. I metodi TLVUpdater hanno significati più o meno simili alle controparti con nomi simili in TLVReader/TLVWriter. In caso di differenze nella semantica, queste sono chiaramente documentate nella sezione dei commenti della funzione in WeaveTLVUpdater.cpp.

Una nota particolarmente importante sui metodi PutBytes() e PutString() di TLVUpdater è che possono lasciare la codifica in uno stato danneggiato con solo l'intestazione dell'elemento scritta quando si verifica un overflow. Le applicazioni possono chiamare Get StayingFreeLength() per assicurarsi che ci sia spazio libero circa sufficiente per scrivere la codifica. Tieni presente che GetStayingFreeLength() indica solo i byte senza costi disponibili e che non è in grado di determinare la lunghezza dei dati codificati che vengono scritti. In caso di overflow, sia PutBytes() che PutString() restituirà WEAVE_ERROR_BUFFER_TOO_Small al chiamante.

Inoltre, tieni presente che il metodo Next() è sovraccaricato per ignorare l'elemento corrente e far avanzare il lettore interno all'elemento successivo. Poiché per saltare elementi già codificati è necessario modificare le variabili di stato dello spazio libero dell'autore interno per tenere conto del nuovo spazio liberato (reso disponibile saltando), l'applicazione dovrebbe chiamare Next() sul programma di aggiornamento dopo un metodo Get() di cui non vuole scrivere il valore (equivalente a saltare l'elemento corrente).

di Gemini Advanced.

Funzioni pubbliche

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)
Prepara un oggetto TLVUpdater per la lettura degli elementi di un container.
ExitContainer(TLVType outerContainerType)
Completa la lettura di un elemento container TLV e codifica la fine di un elemento TLV nell'output 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)
Inizializza un oggetto TLVUpdater per modificare un singolo buffer di input.
Init(TLVReader & aReader, uint32_t freeLen)
Inizializza un oggetto TLVUpdater utilizzando un TLVReader.
Move(void)
Copia l'elemento corrente dall'input TLV in output TLV.
MoveUntilEnd(void)
void
Sposta tutto dall'attuale punto di lettura di TLVUpdater fino alla fine del buffer TLV di input nell'output.
Next(void)
Ignora l'elemento corrente e avanza l'oggetto TLVUpdater all'elemento successivo nell'input 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
Imposta l'ID profilo implicito per l'oggetto TLVUpdater.
StartContainer(uint64_t tag, TLVType containerType, TLVType & outerContainerType)
VerifyEndOfContainer(void)

Funzioni pubbliche

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
)

Prepara un oggetto TLVUpdater per la lettura degli elementi di un container.

Inoltre, codifica l'inizio di un oggetto container nel TLV di output.

Il metodo EnterContainer() prepara l'oggetto TLVUpdater corrente per iniziare a leggere gli elementi membri di un container TLV (una struttura, un array o un percorso). Per ogni chiamata alle applicazioni EnterContainer() devono effettuare una chiamata corrispondente a ExitContainer().

Quando EnterContainer() viene chiamato, il lettore di TLVUpdater deve essere posizionato sull'elemento contenitore. Il metodo prende come argomento un riferimento a un valore TLVType che verrà utilizzato per salvare il contesto del programma di aggiornamento durante la lettura del container.

Quando viene restituito il metodo EnterContainer(), il programma di aggiornamento viene posizionato immediatamente prima del primo membro del container. La chiamata ripetuta a Next() consente di avanzare tra i membri della raccolta fino al raggiungimento della fine; a quel punto, il programma di aggiornamento restituirà WEAVE_END_OF_TLV.

Una volta che l'applicazione ha terminato di leggere un container, può continuare a leggere gli elementi dopo il container chiamando il metodo ExitContainer().

Dettagli
Parametri
[out] outerContainerType
Un riferimento a un valore TLVType che riceverà il contesto del programma di aggiornamento.
Valori restituiti
WEAVE_NO_ERROR
Se il metodo ha esito positivo.
WEAVE_ERROR_INCORRECT_STATE
Se il lettore TLVUpdater non è posizionato su un elemento contenitore.
other
Qualsiasi altro codice di errore Weave o della piattaforma restituito da TLVWriter::StartContainer() o TLVReader::EnterContainer().

ExitContainer

WEAVE_ERROR ExitContainer(
  TLVType outerContainerType
)

Completa la lettura di un elemento container TLV e codifica la fine di un elemento TLV nell'output TLV.

Il metodo ExitContainer() ripristina lo stato di un oggetto TLVUpdater dopo una chiamata a EnterContainer(). Per ogni chiamata alle applicazioni EnterContainer() devono effettuare una chiamata corrispondente a ExitContainer(), passando il valore di contesto restituito dal metodo EnterContainer().

Quando viene restituito ExitContainer(), il lettore TLVUpdater viene posizionato immediatamente prima del primo elemento che segue il container nell'input TLV. A questo punto le applicazioni possono chiamare Next() per avanzare attraverso gli elementi rimanenti.

Una volta chiamato EnterContainer(), le applicazioni possono chiamare ExitContainer() sul programma di aggiornamento in qualsiasi momento, indipendentemente dal fatto che tutti gli elementi nel contenitore sottostante siano stati letti. Inoltre, tieni presente che chiamando ExitContainer() prima di leggere tutti gli elementi nel container, il container aggiornato verrà troncato nel TLV di output.

Dettagli
Parametri
[in] outerContainerType
Il valore TLVType restituito dal metodo EnterContainer().
Valori restituiti
WEAVE_NO_ERROR
Se il metodo ha esito positivo.
WEAVE_ERROR_TLV_UNDERRUN
Se la codifica TLV sottostante è terminata prematuramente.
WEAVE_ERROR_INVALID_TLV_ELEMENT
Se il programma di aggiornamento ha riscontrato un tipo di elemento TLV non valido o non supportato.
WEAVE_ERROR_INVALID_TLV_TAG
Se il programma di aggiornamento ha riscontrato un tag TLV in un contesto non valido.
other
Qualsiasi altro codice di errore Weave o della piattaforma restituito da TLVWriter::EndContainer() o TLVReader::ExitContainer().

Finalizza

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
)

Inizializza un oggetto TLVUpdater per modificare un singolo buffer di input.

Quando chiami questo metodo, i dati TLV nel buffer vengono spostati alla fine del buffer e in questo buffer riposizionato viene inizializzato un oggetto TLVReader privato. Viene inizializzato anche un oggetto TLVWriter privato nello spazio libero ora disponibile all'inizio. Le applicazioni possono utilizzare l'oggetto TLVUpdater per analizzare i dati TLV e modificare/eliminare elementi esistenti o aggiungere nuovi elementi alla codifica.

Dettagli
Parametri
[in] buf
Un puntatore a un buffer contenente i dati TLV da modificare.
[in] dataLen
La lunghezza dei dati TLV nel buffer.
[in] maxLen
La lunghezza totale del buffer.
Valori restituiti
WEAVE_NO_ERROR
Se il metodo ha esito positivo.
WEAVE_ERROR_INVALID_ARGUMENT
Se l'indirizzo del buffer non è valido.
WEAVE_ERROR_BUFFER_TOO_SMALL
Se il buffer è troppo piccolo.

Init

WEAVE_ERROR Init(
  TLVReader & aReader,
  uint32_t freeLen
)

Inizializza un oggetto TLVUpdater utilizzando un TLVReader.

Quando chiami questo metodo, i dati TLV nel buffer a cui punta TLVReader vengono spostati dal punto di lettura corrente alla fine del buffer. Un nuovo oggetto TLVReader viene inizializzato per la lettura da questa nuova posizione, mentre un nuovo oggetto TLVWriter privato viene inizializzato per scrivere nello spazio del buffer liberato.

Tieni presente che se TLVReader è già posizionato su "On" di un elemento, ne viene prima eseguito il backup all'inizio di quell'elemento. Tieni inoltre presente che questo backoff funziona bene con gli elementi container, ad esempio se TLVReader è già stato utilizzato per chiamare EnterContainer(), non c'è nulla di cui eseguire il backoff. Tuttavia, se TLVReader è stato posizionato sull'elemento container e la funzione EnterContainer() non è ancora stata chiamata, l'oggetto TLVReader viene eseguito il back-off all'inizio dell'intestazione del container.

L'oggetto TLVReader di input verrà eliminato prima della restituzione e l'applicazione non deve utilizzarlo al momento del ritorno.

Dettagli
Parametri
[in,out] aReader
Riferimento a un oggetto TLVReader che verrà eliminato prima della restituzione.
[in] freeLen
La lunghezza dello spazio libero (in byte) disponibile nel buffer di dati precodificato.
Valori restituiti
WEAVE_NO_ERROR
Se il metodo ha esito positivo.
WEAVE_ERROR_INVALID_ARGUMENT
Se l'indirizzo del buffer non è valido.
WEAVE_ERROR_NOT_IMPLEMENTED
Se il lettore è stato inizializzato su una catena di buffer.

Sposta

WEAVE_ERROR Move(
  void
)

Copia l'elemento corrente dall'input TLV in output TLV.

Il metodo Sposta() copia l'elemento corrente su cui è posizionato il lettore di TLVUpdater nel writer di TLVUpdater. L'applicazione deve chiamare Next() e posizionare il lettore di TLVUpdater su un elemento prima di chiamare questo metodo. Come nel caso del metodo TLVReader::Next(), se il lettore è posizionato su un elemento contenitore al momento della chiamata, tutti i membri del contenitore verranno copiati. Se il lettore non è posizionato su alcun elemento, la chiamata di questo metodo non cambia.

Dettagli
Valori restituiti
WEAVE_NO_ERROR
Se il lettore TLVUpdater è stato posizionato correttamente su un nuovo elemento.
WEAVE_END_OF_TLV
Se il lettore di TLVUpdater rimanda alla fine del contenitore.
WEAVE_ERROR_INVALID_TLV_ELEMENT
Se il lettore di TLVIpdater non è posizionato su un elemento TLV valido.
other
Restituisce altri codici di errore restituiti dal metodo TLVReader::Skip().

MoveUntilEnd

void MoveUntilEnd(
  void
)

Sposta tutto dall'attuale punto di lettura di TLVUpdater fino alla fine del buffer TLV di input nell'output.

Questo metodo supporta lo spostamento di tutto dall'attuale punto di lettura di TLVUpdater fino alla fine del buffer del lettore al writer di TLVUpdater.

Avanti

WEAVE_ERROR Next(
  void
)

Ignora l'elemento corrente e avanza l'oggetto TLVUpdater all'elemento successivo nell'input TLV.

Il metodo Next() ignora l'elemento corrente nell'input TLV e fa avanzare il lettore di TLVUpdater all'elemento successivo che risiede nello stesso contesto di contenimento. In particolare, se il lettore è posizionato all'estremità più esterna di una codifica TLV, la chiamata a Next() consente di avanzare all'elemento immediatamente successivo. Se il lettore viene posizionato all'interno di un elemento contenitore TLV (una struttura, un array o un percorso), la chiamata a Next() lo avanza all'elemento membro successivo del contenitore.

Poiché Next() vincola il movimento del lettore al contesto di contenimento corrente, la chiamata a Next() quando il lettore è posizionato su un elemento contenitore avanza oltre il container, saltando i relativi elementi membri (e i membri di eventuali contenitori nidificati) fino a raggiungere il primo elemento dopo il contenitore.

Quando non ci sono altri elementi in un particolare contesto di contenimento, il metodo Next() restituirà un errore WEAVE_END_OF_TLV e la posizione del lettore rimarrà invariata.

Dettagli
Valori restituiti
WEAVE_NO_ERROR
Se il lettore TLVUpdater è stato posizionato correttamente su un nuovo elemento.
other
Restituisce i codici di errore di Weave o della piattaforma restituiti dai metodi TLVReader::Skip() e TLVReader::Next().

Adotta

WEAVE_ERROR Put(
  uint64_t tag,
  int8_t v
)

Adotta

WEAVE_ERROR Put(
  uint64_t tag,
  int16_t v
)

Adotta

WEAVE_ERROR Put(
  uint64_t tag,
  int32_t v
)

Adotta

WEAVE_ERROR Put(
  uint64_t tag,
  int64_t v
)

Adotta

WEAVE_ERROR Put(
  uint64_t tag,
  uint8_t v
)

Adotta

WEAVE_ERROR Put(
  uint64_t tag,
  uint16_t v
)

Adotta

WEAVE_ERROR Put(
  uint64_t tag,
  uint32_t v
)

Adotta

WEAVE_ERROR Put(
  uint64_t tag,
  uint64_t v
)

Adotta

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

Adotta

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

Adotta

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

Adotta

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

Adotta

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

Adotta

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

Adotta

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

Adotta

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

Adotta

WEAVE_ERROR Put(
  uint64_t tag,
  float v
)

Adotta

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
)

Imposta l'ID profilo implicito per l'oggetto TLVUpdater.

Questo metodo imposta l'ID profilo implicito per l'oggetto TLVUpdater. Quando al programma di aggiornamento viene chiesto di codificare un nuovo elemento, se l'ID profilo del tag associato al nuovo elemento corrisponde al valore dell'elemento profileId, il programma di aggiornamento codifica il tag in forma implicita, omettendo così l'ID profilo nel processo.

Dettagli
Parametri
[in] profileId
L'ID profilo dei tag che devono essere codificati in forma implicita.

StartContainer

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

VerifyEndOfContainer

WEAVE_ERROR VerifyEndOfContainer(
  void
)