nl::Weave::TLV::TLVUpdater

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

מספק ממשק מאוחד של Reader/Writer לעריכה, להוספה או למחיקה של רכיבים בקידוד TLV.

סיכום

ה-TLVUpdater הוא איחוד של האובייקטים TLVReader ו-TLVWriter. הוא מספק שיטות ממשק לעריכה/מחיקה של נתונים בקידוד ולהוספת רכיבים חדשים לקידוד TLV. האובייקט TLVUpdater פועל במהותו כשני סמנים – אחד לקריאת הקידוד הקיים והשני לכתיבה (להעתקה של נתונים קיימים או לכתיבת נתונים חדשים).

מבחינה סמנטית, האובייקט TLVUpdater פועל כמו איחוד של TLVReader ו-TLVWriter. ל-methods של TLVUpdater יש משמעות דומה או פחות דומה למילים דומות ב-TLVReader/TLVWriter. כאשר יש הבדלים בסמנטיקה, ההבדלים מתועדים בבירור בקטע התגובות של הפונקציה ב-WeaveTLVUpdater.cpp.

הערה חשובה במיוחד לגבי שיטות PutBytes() ו-PutBytes() של TLVUpdater, היא העובדה שהן יכולות להשאיר את הקידוד במצב פגום, כאשר רק כותרת הרכיב נכתבת כאשר מתרחשת גלישת טקסט. אפליקציות יכולות לקרוא ל-Get StartedFreeLength() כדי לוודא שיש מספיק מקום פנוי בערך כדי לכתוב את הקידוד. חשוב לשים לב ש- GetשימורFreeLength() מציין רק את הבייטים הזמינים בחינם, ואין דרך לאפליקציה לדעת את האורך של הנתונים המקודדים שנכתבים. במקרה של עומס יתר, גם פעולת PutBytes() וגם PutString() יחזירו WEAVE_ERROR_BUFFER_TOO_small למבצע הקריאה.

חשוב גם לשים לב שבשיטת Next() יש עומס יתר גם כדי לדלג על הרכיב הנוכחי וגם כדי לקדם את הקורא הפנימי לרכיב הבא. מאחר שדילוג על אלמנטים שכבר מקודדים מחייב שינוי של משתני המצב הפנויים של הכותב הפנימי כדי להביא בחשבון את השטח הפנוי החדש (שניתן לעשות זאת על ידי דילוג), האפליקציה צפויה לקרוא ל-Next() במעדכן אחרי שיטת Get() שהערך שלה לא מעוניין לכתוב בחזרה (פעולה שזהה לזה של דילוג על הרכיב הנוכחי).

תפקידים ציבוריים

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)
הכנת אובייקט TLVUpdater לקריאת רכיבים של מאגר.
ExitContainer(TLVType outerContainerType)
מילוי הקריאה של רכיב מאגר TLV וקידוד של סוף רכיב TLV בפלט 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)
מפעילים אובייקט TLVUpdater כדי לערוך מאגר נתונים זמני של קלט.
Init(TLVReader & aReader, uint32_t freeLen)
מפעילים אובייקט TLVUpdater באמצעות TLVReader.
Move(void)
מעתיק את הרכיב הנוכחי מהקלט TLV לפלט TLV.
MoveUntilEnd(void)
void
מעבירים את כל המידע מנקודת הקריאה הנוכחית של ה-TLVUpdater עד לסוף מאגר הנתונים הזמני TLV אל הפלט.
Next(void)
מדלגים על הרכיב הנוכחי ומתקדמים את האובייקט TLVUpdater לרכיב הבא בקלט 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
מגדירים את מזהה הפרופיל המרומז לאובייקט TLVUpdater.
StartContainer(uint64_t tag, TLVType containerType, TLVType & outerContainerType)
VerifyEndOfContainer(void)

תפקידים ציבוריים

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
)

הכנת אובייקט TLVUpdater לקריאת רכיבים של מאגר.

הוא מקודד גם התחלה של אובייקט קונטיינר בפלט TLV.

השיטה EnterContainer() מכינה את אובייקט TLVUpdater הנוכחי כך שיתחיל לקרוא את הרכיבים החברים במאגר TLV (מבנה, מערך או נתיב). בכל קריאה ל-EnterContainer(), צריך לבצע קריאה תואמת אל ExitContainer().

כשהערך של EnterContainer() נקרא TLVUpdater, הקורא חייב להיות ממוקם ברכיב הקונטיינר. השיטה משתמשת כארגומנט של הפניה לערך TLVType שישמש לשמירת ההקשר של המעדכן בזמן קריאת הקונטיינר.

כאשר השיטה EnterContainer() חוזרת, המעדכן ממוקם ממש לפני האיבר הראשון במאגר. קריאות חוזרות ונשנות ל-Next() יעבירו את המעדכן בין חברי האוסף עד שיגיעו לסוף האוסף, ובשלב זה המעדכן יחזור WEAVE_END_OF_TLV.

לאחר שהאפליקציה מסיימת לקרוא מאגר, היא יכולה להמשיך לקרוא את הרכיבים אחרי המאגר על ידי קריאה לשיטה ExitContainer().

פרטים
פרמטרים
[out] outerContainerType
הפניה לערך TLVType שיקבל את ההקשר של המעדכן.
ערכים מוחזרים
WEAVE_NO_ERROR
אם השיטה הצליחה.
WEAVE_ERROR_INCORRECT_STATE
אם הקורא TLVUpdater לא ממוקם על רכיב של מאגר.
other
כל קוד שגיאה אחר ב-Weave או בפלטפורמה המוחזר על ידי TLVWriter::StartContainer() או TLVReader::EnterContainer().

ExitContainer

WEAVE_ERROR ExitContainer(
  TLVType outerContainerType
)

מילוי הקריאה של רכיב מאגר TLV וקידוד של סוף רכיב TLV בפלט TLV.

השיטה ExitContainer() משחזרת את המצב של אובייקט TLVUpdater אחרי קריאה ל-EnterContainer(). עבור כל קריאה ל-EnterContainer(), האפליקציות חייבות לבצע קריאה תואמת ל-ExitContainer(), ולהעביר את ערך ההקשר שהוחזר על ידי השיטה EnterContainer().

כאשר הפונקציה ExitContainer() מחזירה, הקורא של TLVUpdater ממוקם ממש לפני הרכיב הראשון שעוקב אחרי המאגר בקלט TLV. לאחר מכן האפליקציות יכולות לקרוא ל-Next() כדי להתקדם בין הרכיבים שנותרו.

לאחר הקריאה ל-EnterContainer(), אפליקציות יכולות לבצע קריאה ל-ExitContainer() במעדכן בכל שלב, גם אם כל הרכיבים בקונטיינר הבסיסי קראו. כמו כן, חשוב לזכור שקריאה ל-ExitContainer() לפני קריאת כל הרכיבים בקונטיינר תגרום לכך שהמאגר המעודכן ייחתך בפלט TLV.

פרטים
פרמטרים
[in] outerContainerType
ערך ה-TLVType שהוחזר על ידי השיטה EnterContainer().
ערכים מוחזרים
WEAVE_NO_ERROR
אם השיטה הצליחה.
WEAVE_ERROR_TLV_UNDERRUN
אם קידוד TLV הבסיסי הסתיים לפני הזמן.
WEAVE_ERROR_INVALID_TLV_ELEMENT
אם המעדכן נתקל בסוג רכיב TLV לא תקין או שאינו נתמך.
WEAVE_ERROR_INVALID_TLV_TAG
אם המעדכן נתקל בתג TLV בהקשר לא תקין.
other
כל קוד שגיאה אחר ב-Weave או בפלטפורמה המוחזר על ידי TLVWriter::EndContainer() או TLVReader::ExitContainer().

סיים

WEAVE_ERROR Finalize(
  void
)

הורדה

WEAVE_ERROR Get(
  bool & v
)

הורדה

WEAVE_ERROR Get(
  int8_t & v
)

הורדה

WEAVE_ERROR Get(
  int16_t & v
)

הורדה

WEAVE_ERROR Get(
  int32_t & v
)

הורדה

WEAVE_ERROR Get(
  int64_t & v
)

הורדה

WEAVE_ERROR Get(
  uint8_t & v
)

הורדה

WEAVE_ERROR Get(
  uint16_t & v
)

הורדה

WEAVE_ERROR Get(
  uint32_t & v
)

הורדה

WEAVE_ERROR Get(
  uint64_t & v
)

הורדה

WEAVE_ERROR Get(
  float & v
)

הורדה

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 

הפעלה

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

מפעילים אובייקט TLVUpdater כדי לערוך מאגר נתונים זמני של קלט.

כשמפעילים את השיטה הזו, נתוני ה-TLV שבמאגר הזמני מועברים לסוף המאגר, ואובייקט TLVReader פרטי מופעל במאגר הנתונים הזמני שהועבר. אובייקט TLVWriter פרטי גם מאותחל בשטח הפנוי שזמין עכשיו בהתחלה. אפליקציות יכולות להשתמש באובייקט TLVUpdater כדי לנתח את נתוני TLV ולשנות/למחוק רכיבים קיימים או להוסיף רכיבים חדשים לקידוד.

פרטים
פרמטרים
[in] buf
מצביע למאגר המכיל את נתוני TLV לעריכה.
[in] dataLen
האורך של נתוני TLV במאגר הנתונים הזמני.
[in] maxLen
האורך הכולל של המאגר.
ערכים מוחזרים
WEAVE_NO_ERROR
אם השיטה הצליחה.
WEAVE_ERROR_INVALID_ARGUMENT
אם כתובת מאגר הנתונים הזמני לא חוקית.
WEAVE_ERROR_BUFFER_TOO_SMALL
אם המאגר קטן מדי.

הפעלה

WEAVE_ERROR Init(
  TLVReader & aReader,
  uint32_t freeLen
)

מפעילים אובייקט TLVUpdater באמצעות TLVReader.

כשמפעילים את השיטה הזו, נתוני TLV במאגר הנתונים הזמני שאליו מפנה TLVReader מועברים מנקודת הקריאה הנוכחית אל סוף המאגר. אובייקט TLVReader פרטי חדש מאותחל כדי לקרוא מהמיקום החדש הזה, ואילו אובייקט TLVWriter פרטי חדש מאותחל כדי לכתוב בשטח האחסון הזמני שהתפנה.

שימו לב שאם ה-TLVReader כבר ממוקם "על" רכיב, הוא מגובה לפני תחילת הרכיב. כמו כן, חשוב לשים לב שהגיבוי הזה פועל היטב עם רכיבי קונטיינרים. כלומר, אם TLVReader כבר שימש לקריאה ל-EnterContainer(), אין שום דבר שניתן לתקוף אותו חזרה. אבל אם ה-TLVReader ממוקם על רכיב הקונטיינר ו-EnterContainer() עדיין לא נקרא, האובייקט TLVReader מגובה להתחלת המאגר.

אובייקט הקלט TLVReader יושמד לפני החזרה, ואסור שהאפליקציה תשתמש בו בהחזרה.

פרטים
פרמטרים
[in,out] aReader
הפניה לאובייקט TLVReader שיושמד לפני החזרה.
[in] freeLen
אורך השטח הפנוי (בבייטים) שזמין במאגר הנתונים המקודד מראש.
ערכים מוחזרים
WEAVE_NO_ERROR
אם השיטה הצליחה.
WEAVE_ERROR_INVALID_ARGUMENT
אם כתובת מאגר הנתונים הזמני לא חוקית.
WEAVE_ERROR_NOT_IMPLEMENTED
אם הקורא הופעל בשרשרת של חוצצים.

העברה

WEAVE_ERROR Move(
  void
)

מעתיק את הרכיב הנוכחי מהקלט TLV לפלט TLV.

השיטה Move() מעתיקה את הרכיב הנוכחי שעליו ממוקם הקורא של TLVUpdater, לכותב של TLVUpdater. האפליקציה צריכה לקרוא ל-Next() ולמקם את הקורא של TLVUpdater על רכיב לפני הקריאה לשיטה הזו. בדיוק כמו השיטה TLVReader::Next(), אם הקורא ממוקם על רכיב מאגר תגים בזמן הקריאה, כל הרכיבים במאגר יועתקו. אם הקורא לא ממוקם על שום רכיב, שום דבר לא ישתנה בקריאה לשיטה הזו.

פרטים
ערכים מוחזרים
WEAVE_NO_ERROR
אם הקורא TLVUpdater מוקם בהצלחה ברכיב חדש.
WEAVE_END_OF_TLV
אם הקורא של ה-TLVUpdater מצביע על קצה המאגר.
WEAVE_ERROR_INVALID_TLV_ELEMENT
אם הקורא של TLVIpdater לא ממוקם על רכיב TLV חוקי.
other
מחזירה קודי שגיאה אחרים שהוחזרו על ידי השיטה TLVReader::Skip().

MoveUntilEnd

void MoveUntilEnd(
  void
)

מעבירים את כל המידע מנקודת הקריאה הנוכחית של ה-TLVUpdater עד לסוף מאגר הנתונים הזמני TLV אל הפלט.

שיטה זו תומכת בהעברת כל המידע, מנקודת הקריאה הנוכחית של ה-TLVUpdater עד לסוף מאגר הנתונים הזמני של הקורא, אל המחבר של TLVUpdater.

הבא

WEAVE_ERROR Next(
  void
)

מדלגים על הרכיב הנוכחי ומתקדמים את האובייקט TLVUpdater לרכיב הבא בקלט TLV.

שיטת Next() מדלגת על הרכיב הנוכחי בקלט TLV ומתקדמות את הקורא של TLVUpdater לרכיב הבא שנמצא באותו הקשר של הפרדה. באופן ספציפי, אם הקורא ממוקם ברמה החיצונית ביותר של קידוד TLV, קריאה ל-Next() תקדם אותו לרכיב הבא ברמה העליונה. אם הקורא ממוקם בתוך רכיב מאגר תגים מסוג TLV (מבנה, מערך או נתיב), קריאה ל-Next() תקדם אותו לרכיב החבר הבא במאגר.

מאחר ש-Next() מגבילה את תנועת הקוראים בהקשר המאגר הנוכחי, קריאה ל-Next() כשהקורא ממוקם על רכיב קונטיינר יתקדם מעל המאגר, תוך דילוג על הרכיבים שלו (ועל החברים בכל מאגרי תגים בתוך מאגר) עד שהם יגיעו לרכיב הראשון אחרי המאגר.

כשאין רכיבים נוספים בהקשר של עצירה מסוימת, שיטת Next() תחזיר שגיאת WEAVE_END_OF_TLV ומיקום הקורא לא ישתנה.

פרטים
ערכים מוחזרים
WEAVE_NO_ERROR
אם הקורא TLVUpdater מוקם בהצלחה ברכיב חדש.
other
מחזירה את קודי השגיאה של Weave או של הפלטפורמה שהוחזרו על ידי השיטה TLVReader::Skip() ו-TLVReader::Next().

הצב

WEAVE_ERROR Put(
  uint64_t tag,
  int8_t v
)

הצב

WEAVE_ERROR Put(
  uint64_t tag,
  int16_t v
)

הצב

WEAVE_ERROR Put(
  uint64_t tag,
  int32_t v
)

הצב

WEAVE_ERROR Put(
  uint64_t tag,
  int64_t v
)

הצב

WEAVE_ERROR Put(
  uint64_t tag,
  uint8_t v
)

הצב

WEAVE_ERROR Put(
  uint64_t tag,
  uint16_t v
)

הצב

WEAVE_ERROR Put(
  uint64_t tag,
  uint32_t v
)

הצב

WEAVE_ERROR Put(
  uint64_t tag,
  uint64_t v
)

הצב

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

הצב

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

הצב

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

הצב

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

הצב

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

הצב

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

הצב

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

הצב

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

הצב

WEAVE_ERROR Put(
  uint64_t tag,
  float v
)

הצב

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
)

מגדירים את מזהה הפרופיל המרומז לאובייקט TLVUpdater.

השיטה הזו מגדירה את מזהה הפרופיל המשתמע לאובייקט TLVUpdater. כשהמעדכן מתבקש לקודד רכיב חדש, אם מזהה הפרופיל של התג שמשויך לרכיב החדש תואם לערך של profileId, המעדכן יקודד את התג בצורה מרומזת, ולכן הוא ישמיט את מזהה הפרופיל בתהליך.

פרטים
פרמטרים
[in] profileId
מזהה הפרופיל של התגים שיש לקודד בצורה מרומזת.

StartContainer

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

VerifyEndOfContainer

WEAVE_ERROR VerifyEndOfContainer(
  void
)