nl::Weave::TLV::TLVUpdater

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

Fornisce un'interfaccia Reader/Writer unificata per modificare/aggiungere/eliminare elementi con codifica TLV.

Riepilogo

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

Dal punto di vista semantico, l'oggetto TLVUpdater funziona come l'unione di TLVReader e TLVWriter. I metodi TLVUpdater hanno significati più o meno simili a quelli delle controparti con nomi simili in TLVReader/TLVWriter. Qualora ci siano differenze nella semantica, le differenze 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 GetRemainingFreeLength() per assicurarsi che ci sia spazio libero circa per scrivere la codifica. Tieni presente che GetRemainingFreeLength() indica solo i byte senza costi disponibili e non è possibile che l'applicazione conosca la lunghezza dei dati codificati che vengono scritti. In caso di overflow, sia PutBytes() che PutString() restituiranno WEAVE_ERROR_BUFFER_TOO_Small al chiamante.

Inoltre, tieni presente che il metodo Next() è sovraccarico per ignorare l'elemento corrente e anche far avanzare il lettore interno all'elemento successivo. Poiché saltare elementi già codificati richiede la modifica delle variabili di stato dello spazio libero del writer interno per tenere conto del nuovo spazio liberato (reso disponibile saltando), l'applicazione dovrebbe chiamare Next() nell'aggiornamento dopo un metodo Get() di cui non desidera scrivere il valore (il che equivale a saltare l'elemento corrente).

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 una fine dell'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 all'output TLV.
MoveUntilEnd(void)
void
Sposta tutto dal punto di lettura attuale di TLVUpdater fino alla fine del buffer di input TLV all'output.
Next(void)
Salta l'elemento corrente e passa all'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 un inizio dell'oggetto container nell'output TLV.

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

Quando viene chiamato EnterContainer(), 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 contenitore. Se chiami ripetutamente Next(), il programma di aggiornamento avanza tra i membri della raccolta fino al raggiungimento della fine, dopodiché l'aggiornamento restituirà WEAVE_END_OF_TLV.

Quando 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 è riuscito.
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 una fine dell'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() deve 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 passare da un elemento all'altro.

Una volta chiamata 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, ricorda che se chiami ExitContainer() prima di leggere tutti gli elementi nel container, il container aggiornato verrà troncato nell'output TLV.

Dettagli
Parametri
[in] outerContainerType
Il valore TLVType restituito dal metodo EnterContainer().
Valori restituiti
WEAVE_NO_ERROR
Se il metodo è riuscito.
WEAVE_ERROR_TLV_UNDERRUN
Se la codifica TLV sottostante è terminata prematuramente.
WEAVE_ERROR_INVALID_TLV_ELEMENT
Se il programma di aggiornamento ha rilevato un tipo di elemento TLV non valido o non supportato.
WEAVE_ERROR_INVALID_TLV_TAG
Se il programma di aggiornamento ha rilevato 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 

Inizia

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 un oggetto TLVReader privato viene inizializzato su questo buffer riposizionato. 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 aggiungerne di nuovi 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 è riuscito.
WEAVE_ERROR_INVALID_ARGUMENT
Se l'indirizzo del buffer non è valido.
WEAVE_ERROR_BUFFER_TOO_SMALL
Se il buffer è troppo piccolo.

Inizia

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 privato viene inizializzato per la lettura da questa nuova posizione, mentre un nuovo oggetto TLVWriter privato viene inizializzato per la scrittura nello spazio di buffer liberato.

Tieni presente che se TLVReader è già posizionato "su" un elemento, viene prima eseguito il backup all'inizio di quell'elemento. Tieni inoltre presente che questo backup funziona bene con gli elementi container, ad esempio, se TLVReader è già stato utilizzato per chiamare EnterContainer(), non c'è nulla da eseguire il backoff. Tuttavia, se TLVReader è stato posizionato sull'elemento container e EnterContainer() non è stato ancora chiamato, viene eseguito il backup dell'oggetto TLVReader all'inizio dell'intestazione container.

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

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 è riuscito.
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 all'output TLV.

Il metodo Move() copia l'elemento corrente su cui è posizionato il lettore di TLVUpdater, nell'autore di TLVUpdater. L'applicazione deve chiamare Next() e posizionare il lettore 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, verranno copiati tutti i membri del contenitore. Se il lettore non è posizionato su alcun elemento, non cambia nulla quando chiami questo metodo.

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 punta alla fine del container.
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 dal punto di lettura attuale di TLVUpdater fino alla fine del buffer di input TLV all'output.

Questo metodo supporta lo spostamento di tutto dal punto di lettura corrente di TLVUpdater fino alla fine del buffer del lettore all'autore di TLVUpdater.

Avanti

WEAVE_ERROR Next(
  void
)

Salta l'elemento corrente e passa all'oggetto TLVUpdater all'elemento successivo nell'input TLV.

Il metodo Next() ignora l'elemento corrente nell'input TLV e fa avanzare il lettore TLVUpdater all'elemento successivo che risiede nello stesso contesto di contenimento. In particolare, se il lettore è posizionato al livello più esterno di una codifica TLV, chiamando Next() lo sposterà all'elemento più in alto successivo. Se il lettore è posizionato all'interno di un elemento contenitore TLV (una struttura, un array o un percorso), chiamando Next() lo sposterà all'elemento membro successivo del container.

Poiché Next() vincola il movimento del lettore al contesto di contenimento corrente, chiamando Next() quando il lettore è posizionato su un elemento contenitore, avanzerà sopra il container, saltando i relativi elementi membro (e i membri di qualsiasi contenitore nidificato) fino a raggiungere il primo elemento dopo il container.

Quando non ci sono altri elementi all'interno di un determinato 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 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 consente di impostare l'ID profilo implicito per l'oggetto TLVUpdater. Quando all'utente di aggiornamento viene chiesto di codificare un nuovo elemento, se l'ID profilo del tag associato al nuovo elemento corrisponde al valore di profileId, lo strumento 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 deve essere codificato in forma implicita.

StartContainer

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

VerifyEndOfContainer

WEAVE_ERROR VerifyEndOfContainer(
  void
)