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