nl::Weave::TLV::TLVUpdater

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

Bietet eine einheitliche Reader/Writer-Benutzeroberfläche zum Bearbeiten, Hinzufügen/Löschen von Elementen in der TLV-Codierung.

Zusammenfassung

Der TLVUpdater vereint die Objekte TLVReader und TLVWriter und bietet Schnittstellenmethoden zum Bearbeiten/Löschen von Daten in einer Codierung sowie zum Hinzufügen neuer Elemente zur TLV-Codierung. Das Objekt TLVUpdater verhält sich im Grunde wie zwei Cursor: einer zum Lesen der vorhandenen Codierung und der andere zum Schreiben (entweder zum Kopieren vorhandener Daten oder zum Schreiben neuer Daten).

Semantisch funktioniert das TLVUpdater-Objekt wie eine Vereinigung von TLVReader und TLVWriter. Die Methoden TLVUpdater haben mehr oder weniger ähnliche Bedeutungen als die gleichnamigen Gegenstücke in TLVReader/TLVWriter. Bei unterschiedlichen Semantiken werden diese klar im Kommentarbereich der Funktion in WeaveTLVUpdater.cpp dokumentiert.

Ein besonders wichtiger Hinweis zu den PutBytes()- und PutString()-Methoden von TLVUpdater ist, dass die Codierung beschädigt bleibt und nur bei einem Überlauf der Element-Header geschrieben wird. Die Anwendungen GetGetFreeLength() können aufgerufen werden, um sicherzustellen, dass ungefähr genügend freier Speicherplatz für die Codierung verfügbar ist. Mit GetÜlingFreeLength() werden Sie nur über die verfügbaren kostenlosen Byte informiert. Außerdem kann die Anwendung die Länge der codierten Daten nicht ermitteln. Bei einem Überlauf geben sowohl PutBytes() als auch PutString() WEAVE_ERROR_BUFFER_TOO_METRIC an den Aufrufer zurück.

Die Methode Next() wird überladen, um sowohl das aktuelle Element zu überspringen als auch den internen Leser zum nächsten Element weiterzuleiten. Weil beim Überspringen bereits codierter Elemente die internen Variablen des kostenlosen Leerzeichens vom Schreiber geändert werden müssen, um den neuen kostenlos gewordenen Speicherplatz (durch Überspringen verfügbar) zu berücksichtigen, wird von der App erwartet, dass sie nach einer Get()-Methode, deren Wert nicht zurückgeschrieben werden soll, Next() für den Updater aufruft. Dies entspricht dem Überspringen des aktuellen Elements.

Öffentliche Funktionen

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)
Bereitet ein TLVUpdater-Objekt für das Lesen von Elementen eines Containers vor.
ExitContainer(TLVType outerContainerType)
Damit wird das Lesen eines TLV-Containerelements abgeschlossen und das Ende des TLV-Elements in der Ausgabe TLV codiert.
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)
Initialisieren Sie ein TLVUpdater-Objekt, um einen einzelnen Eingabepuffer zu bearbeiten.
Init(TLVReader & aReader, uint32_t freeLen)
Initialisieren Sie ein TLVUpdater-Objekt mit einem TLVReader.
Move(void)
Kopiert das aktuelle Element von der Eingabe TLV in die Ausgabe TLV.
MoveUntilEnd(void)
void
Verschiebt alles vom aktuellen Lesepunkt des TLVUpdater bis zum Ende des TLV-Eingabepuffers in die Ausgabe.
Next(void)
Überspringen Sie das aktuelle Element und fahren Sie mit dem TLVUpdater-Objekt zum nächsten Element im Eingabe-TLV fort.
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
Legen Sie die implizite Profil-ID für das TLVUpdater-Objekt fest.
StartContainer(uint64_t tag, TLVType containerType, TLVType & outerContainerType)
VerifyEndOfContainer(void)

Öffentliche Funktionen

Textelement

WEAVE_ERROR CopyElement(
  TLVReader & reader
)

Textelement

WEAVE_ERROR CopyElement(
  uint64_t tag,
  TLVReader & reader
)

DupBytes

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

Dup-String

WEAVE_ERROR DupString(
  char *& buf
)

Endcontainer

WEAVE_ERROR EndContainer(
  TLVType outerContainerType
)

Eingabetaste

WEAVE_ERROR EnterContainer(
  TLVType & outerContainerType
)

Bereitet ein TLVUpdater-Objekt für das Lesen von Elementen eines Containers vor.

Außerdem wird ein Start des Containerobjekts im Ausgabe-TLV codiert.

Mit der Methode EnterContainer() wird das aktuelle Objekt TLVUpdater so vorbereitet, dass die Mitgliedselemente des Containers TLV (Struktur, Array oder Pfad) gelesen werden. Für jeden Aufruf von EnterContainer()-Anwendungen muss ein entsprechender Aufruf an ExitContainer() erfolgen.

Wenn EnterContainer() aufgerufen wird, muss der TLVUpdater im Containerelement positioniert werden. Die Methode akzeptiert als Argument einen Verweis auf einen TLVType-Wert, mit dem der Kontext des Updaters beim Lesen des Containers gespeichert wird.

Wenn die Methode EnterContainer() zurückgegeben wird, wird der Updater unmittelbar vor dem ersten Mitglied des Containers positioniert. Durch wiederholtes Aufrufen von Next() wird der Updater durch die Mitglieder der Sammlung weitergeleitet, bis das Ende erreicht ist. Dann gibt der Updater WEAVE_END_OF_TLV zurück.

Sobald die Anwendung einen Container gelesen hat, kann er die Elemente nach dem Container lesen. Dazu ruft er die Methode ExitContainer() auf.

Details
Parameter
[out] outerContainerType
Ein Verweis auf einen TLVType-Wert, der den Kontext des Updaters erhält.
Rückgabewerte
WEAVE_NO_ERROR
Wenn die Methode erfolgreich war.
WEAVE_ERROR_INCORRECT_STATE
Wenn der TLVUpdater-Leser nicht auf einem Containerelement positioniert ist
other
Jeder andere Weave- oder Plattformfehlercode, der von TLVWriter::StartContainer() oder TLVReader::EnterContainer() zurückgegeben wird.

Exit-Container

WEAVE_ERROR ExitContainer(
  TLVType outerContainerType
)

Damit wird das Lesen eines TLV-Containerelements abgeschlossen und das Ende des TLV-Elements in der Ausgabe TLV codiert.

Die Methode ExitContainer() stellt den Status eines TLVUpdater-Objekts nach einem Aufruf von EnterContainer() wieder her. Für jeden Aufruf von EnterContainer()-Anwendungen muss ein entsprechender Aufruf an ExitContainer() erfolgen. Dabei muss der von der Methode EnterContainer() zurückgegebene Kontextwert übergeben werden.

Wenn ExitContainer() zurückgegeben wird, wird der TLVUpdater-Leser unmittelbar vor dem ersten Element platziert, das dem Container im Eingabe-TLV folgt. Von hier aus können Anwendungen Next() aufrufen, um durch alle verbleibenden Elemente zu gelangen.

Sobald EnterContainer() aufgerufen wird, können Anwendungen ExitContainer() auf dem Updater jederzeit aufrufen, unabhängig davon, ob alle Elemente im zugrunde liegenden Container gelesen wurden. Außerdem führt das Aufrufen von ExitContainer() vor dem Lesen aller Elemente im Container dazu, dass der aktualisierte Container in der Ausgabe TLV abgeschnitten wird.

Details
Parameter
[in] outerContainerType
Der TLVType-Wert, der von der Methode EnterContainer() zurückgegeben wurde.
Rückgabewerte
WEAVE_NO_ERROR
Wenn die Methode erfolgreich war.
WEAVE_ERROR_TLV_UNDERRUN
Wenn die zugrunde liegende TLV-Codierung vorzeitig beendet wurde.
WEAVE_ERROR_INVALID_TLV_ELEMENT
Ob der Updater einen ungültigen oder nicht unterstützten Elementtyp TLV gefunden hat.
WEAVE_ERROR_INVALID_TLV_TAG
Ob der Updater in einem ungültigen Kontext ein TLV-Tag gefunden hat.
other
Jeder andere Weave- oder Plattformfehlercode, der von TLVWriter::EndContainer() oder TLVReader::ExitContainer() zurückgegeben wird.

Abschließen

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
)

GetByte

WEAVE_ERROR GetBytes(
  uint8_t *buf,
  uint32_t bufSize
)

GetContainerType

TLVType GetContainerType(
  void
) const 

GetDataPtr

WEAVE_ERROR GetDataPtr(
  const uint8_t *& data
)

ImpliziteProfil-ID

uint32_t GetImplicitProfileId(
  void
)

GetLength

uint32_t GetLength(
  void
) const 

GetLengthRead

uint32_t GetLengthRead(
  void
) const 

GetLengthWriter

uint32_t GetLengthWritten(
  void
)

GetReader

void GetReader(
  TLVReader & containerReader
)

Übrige FreeLength

uint32_t GetRemainingFreeLength(
  void
)

Restlänge

uint32_t GetRemainingLength(
  void
) const 

GetString

WEAVE_ERROR GetString(
  char *buf,
  uint32_t bufSize
)

GetTag

uint64_t GetTag(
  void
) const 

GetType (Typ)

TLVType GetType(
  void
) const 

Init

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

Initialisieren Sie ein TLVUpdater-Objekt, um einen einzelnen Eingabepuffer zu bearbeiten.

Beim Aufrufen dieser Methode werden die TLV-Daten im Zwischenspeicher an das Ende des Zwischenspeichers verschoben und ein privates TLVReader-Objekt für diesen verschobenen Zwischenspeicher initialisiert. Ein privates TLVWriter-Objekt wird auch im freien Speicherplatz initialisiert, der jetzt am Anfang verfügbar ist. Anwendungen können das Objekt TLVUpdater verwenden, um die TLV-Daten zu parsen und vorhandene Elemente zu ändern oder zu löschen oder der Codierung neue Elemente hinzuzufügen.

Details
Parameter
[in] buf
Ein Zeiger auf einen Zwischenspeicher mit den zu bearbeitenden TLV-Daten.
[in] dataLen
Die Länge der TLV-Daten im Zwischenspeicher.
[in] maxLen
Die Gesamtlänge des Zwischenspeichers.
Rückgabewerte
WEAVE_NO_ERROR
Wenn die Methode erfolgreich war.
WEAVE_ERROR_INVALID_ARGUMENT
Wenn die Pufferadresse ungültig ist.
WEAVE_ERROR_BUFFER_TOO_SMALL
Wenn der Zwischenspeicher zu klein ist.

Init

WEAVE_ERROR Init(
  TLVReader & aReader,
  uint32_t freeLen
)

Initialisieren Sie ein TLVUpdater-Objekt mit einem TLVReader.

Beim Aufrufen dieser Methode werden die TLV-Daten im Zwischenspeicher, auf die der TLVReader verweist, vom aktuellen Lesepunkt an das Ende des Zwischenspeichers verschoben. Ein neues privates TLVReader-Objekt wird initialisiert, um von diesem neuen Speicherort zu lesen. Ein neues privates TLVWriter-Objekt wird initialisiert, um in den freigegebenen Zwischenspeicher zu schreiben.

Hinweis: Wenn der TLVReader bereits auf einem Element positioniert ist, wird er zuerst an den Anfang des Elements zurückgesetzt. Beachten Sie auch, dass diese Sicherung gut mit Containerelementen funktioniert, d.h., wenn der TLVReader bereits zum Aufrufen von EnterContainer() verwendet wurde, gibt es nichts zu Backoff. Wenn der TLVReader jedoch auf dem Containerelement platziert war und EnterContainer() noch nicht aufgerufen wurde, wird das TLVReader-Objekt am Anfang des Containerkopfs gesichert.

Das Eingabeobjekt TLVReader wird vor der Rückkehr gelöscht und die Anwendung darf bei der Rückgabe nicht dasselbe verwenden.

Details
Parameter
[in,out] aReader
Verweis auf ein TLVReader-Objekt, das vor der Rückgabe gelöscht wird.
[in] freeLen
Die Länge des freien Speicherplatzes (in Byte), der im vorcodierten Datenzwischenspeicher verfügbar ist.
Rückgabewerte
WEAVE_NO_ERROR
Wenn die Methode erfolgreich war.
WEAVE_ERROR_INVALID_ARGUMENT
Wenn die Pufferadresse ungültig ist.
WEAVE_ERROR_NOT_IMPLEMENTED
Wenn der Reader über eine Zwischenspeicherkette initialisiert wurde:

Verschieben

WEAVE_ERROR Move(
  void
)

Kopiert das aktuelle Element von der Eingabe TLV in die Ausgabe TLV.

Die Methode Move() kopiert das aktuelle Element, auf dem sich der TLVUpdater befindet, in den Autor des TLVUpdaters. Die Anwendung muss Next() aufrufen und den TLVUpdater-Leser in einem Element positionieren, bevor diese Methode aufgerufen wird. Genau wie bei der Methode TLVReader::Next() werden alle Mitglieder des Containers kopiert, wenn der Leser zum Zeitpunkt des Aufrufs in einem Containerelement positioniert ist. Wenn sich der Leser nicht in der Nähe eines Elements befindet, ändert sich beim Aufruf dieser Methode nichts.

Details
Rückgabewerte
WEAVE_NO_ERROR
Wenn der TLVUpdater-Leser erfolgreich in einem neuen Element positioniert wurde.
WEAVE_END_OF_TLV
Wenn der TLVUpdater-Leser auf das Ende des Containers zeigt
WEAVE_ERROR_INVALID_TLV_ELEMENT
Wenn der TLVIpdater nicht an einem gültigen TLV-Element positioniert ist
other
Gibt andere Fehlercodes zurück, die von der TLVReader::Skip()-Methode zurückgegeben werden.

Verschieben bis Ende

void MoveUntilEnd(
  void
)

Verschiebt alles vom aktuellen Lesepunkt des TLVUpdater bis zum Ende des TLV-Eingabepuffers in die Ausgabe.

Diese Methode unterstützt die Verschiebung alles vom aktuellen Lesepunkt des TLVUpdater bis zum Ende des Lesepuffers bis zum Autor des TLVUpdaters.

Weiter

WEAVE_ERROR Next(
  void
)

Überspringen Sie das aktuelle Element und fahren Sie mit dem TLVUpdater-Objekt zum nächsten Element im Eingabe-TLV fort.

Mit der Methode Next() wird das aktuelle Element im Eingabe-TLV übersprungen und der TLVUpdater wird zum nächsten Element weitergeleitet, das sich im selben Begleitkontext befindet. Wenn der Leser insbesondere auf der äußersten Ebene einer TLV-Codierung positioniert ist, wird er durch Aufrufen von Next() zum nächsten, obersten Element weitergeleitet. Wenn sich der Reader in einem TLV-Containerelement (einer Struktur, einem Array oder einem Pfad) befindet, wird er beim Aufrufen von Next() zum nächsten Element des Containers weitergeleitet.

Da Next() die Lesebewegung auf den aktuellen Einschlusskontext einschränkt, wird durch Aufrufen von Next(), wenn der Leser auf einem Containerelement positioniert wird, über den Container verschoben. Dabei werden die zugehörigen Elementelemente (und die Mitglieder aller verschachtelten Container) übersprungen, bis das erste Element nach dem Container erreicht ist.

Wenn es in einem bestimmten Einschlusskontext keine weiteren Elemente gibt, gibt die Methode Next() den Fehlerwert WEAVE_END_OF_TLV zurück und die Position des Readers bleibt unverändert.

Details
Rückgabewerte
WEAVE_NO_ERROR
Wenn der TLVUpdater-Leser erfolgreich in einem neuen Element positioniert wurde.
other
Gibt die von den Methoden TLVReader::Skip() und TLVReader::Next() zurückgegebenen Fehlercodes für Weave oder Plattform zurück.

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
)

Put-String

WEAVE_ERROR PutString(
  uint64_t tag,
  const char *buf
)

Put-String

WEAVE_ERROR PutString(
  uint64_t tag,
  const char *buf,
  uint32_t len
)

SetImplicitProfileId

void SetImplicitProfileId(
  uint32_t profileId
)

Legen Sie die implizite Profil-ID für das TLVUpdater-Objekt fest.

Mit dieser Methode wird die implizite Profil-ID für das Objekt TLVUpdater festgelegt. Wenn der Updater aufgefordert wird, ein neues Element zu codieren, und wenn die Profil-ID des mit dem neuen Element verknüpften Tags mit dem Wert von profileId übereinstimmt, codiert das Updater das Tag implizit, wodurch die Profil-ID dabei wegfällt.

Details
Parameter
[in] profileId
Die Profil-ID der Tags, die implizit codiert werden sollte.

Startcontainer

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

Ende des Containers bestätigen

WEAVE_ERROR VerifyEndOfContainer(
  void
)