nl:: Weave:: TLV:: TLVUpdater
#include <src/lib/core/WeaveTLV.h>
يوفر واجهة قارئ/كاتب موحدة لتعديل/إضافة/حذف العناصر بترميز TLV.
ملخّص
يعد TLVUpdater اتحادًا بين الكائنات TLVReader وTLVWriter ويوفر طرقًا للواجهة لتعديل/حذف البيانات في الترميز فضلاً عن إضافة عناصر جديدة إلى ترميز TLV. يعمل الكائن TLVUpdater بشكل أساسي كمؤشرين، أحدهما لقراءة الترميز الحالي والآخر للكتابة (إما لنسخ البيانات الحالية أو كتابة بيانات جديدة).
دلاليًا، يعمل الكائن TLVUpdater كاتحاد بين TLVReader وTLVWriter. تحمل طرق TLVUpdater معانٍ مشابهة أكثر أو أقل لنظيراتها في TLVReader/TLVWriter. في حال وجود اختلافات في المعنى، يتم توثيق الاختلافات بوضوح في قسم تعليقات الدالة في WeaveTLVUpdater.cpp.
من بين الملاحظات المهمة بشكل خاص بشأن الإجراءين PutBytes() وPutString() لـ TLVUpdater أنّه يمكن أن يترك الترميز في حالة تالفة مع كتابة عنوان العنصر فقط عند حدوث تجاوز. يمكن للتطبيقات استدعاء GetRemainingFreeLength() للتأكّد من توفُّر مساحة خالية تقريبية كافية لكتابة الترميز. تجدر الإشارة إلى أنّ الطريقة GetRemainingFreeLength() لا تُطلعك إلا على وحدات البايت المجانية المتاحة، ولا توجد طريقة يمكن للتطبيق من خلالها معرفة طول البيانات المشفرة التي تتم كتابتها. في حالة تجاوز السعة، سيعرض كل من 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 )