nl::Weave:: TLV::TLVUpdater

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

ويوفّر واجهة موحّدة للقارئ/الكاتب لتعديل/إضافة/حذف العناصر في ترميز TLV.

ملخّص

TLVUpdater هو اتحاد بين عنصرَي TLVReader وTLVwriter، ويوفّر طرقًا لواجهة تعديل/حذف البيانات في ترميز، بالإضافة إلى إضافة عناصر جديدة إلى ترميز TLV. يعمل الكائن TLVUpdater بشكل أساسي كمؤشرين، أحدهما لقراءة الترميز الحالي والآخر للكتابة (إما لنسخ البيانات الحالية أو كتابة بيانات جديدة).

دلاليًا، يعمل الكائن TLVUpdater مثل اتحاد TLVReader وTLVwriter. تستخدم أساليب TLVUpdater معنًى مشابهًا أو أقل مقارنةً بنظريات مشابهة في TLVReader/TLVكتابة. في حال وجود اختلافات في الدلالة، يتم توثيق الاختلافات بوضوح في قسم التعليقات الخاص بالدالة في WeaveTLVUpdater.cpp.

من الملاحظات المهمة على وجه الخصوص حول الأمرين TLVUpdater's ButBytes() وPoString() أنه يمكن ترك الترميز في حالة تالفة مع كتابة عنوان العنصر فقط عند حدوث تجاوز. يمكن للتطبيقات استدعاء GetReprimaryingFreeLength() للتأكّد من وجود مساحة خالية تقريبية كافية لكتابة الترميز. يُرجى العِلم أنّ الخيار GetReleadingFreeLength() يُطلِعك وحدات البايت المجانية المتاحة فقط، متضمّنًا لا طريقة للتطبيق لمعرفة طول البيانات المشفّرة التي تتم كتابتها. في حال تجاوز الطلب، سيعرِض كل من ByBytes() وBoString() 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)

الوظائف العامة

نسخ العنصر

WEAVE_ERROR CopyElement(
  TLVReader & reader
)

نسخ العنصر

WEAVE_ERROR CopyElement(
  uint64_t tag,
  TLVReader & reader
)

دوبيت

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

سلسلة DupString

WEAVE_ERROR DupString(
  char *& buf
)

الحاوية النهائية

WEAVE_ERROR EndContainer(
  TLVType outerContainerType
)

إدخال الحاوية

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()

خروج حاوية

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 

الحصول على بيانات

WEAVE_ERROR GetDataPtr(
  const uint8_t *& data
)

الحصول على ImimpitProfileId

uint32_t GetImplicitProfileId(
  void
)

المدة

uint32_t GetLength(
  void
) const 

GetLengthRead

uint32_t GetLengthRead(
  void
) const 

GetLength خطي

uint32_t GetLengthWritten(
  void
)

GetReader

void GetReader(
  TLVReader & containerReader
)

المدة المتبقية مجانًا

uint32_t GetRemainingFreeLength(
  void
)

المدة المتبقية

uint32_t GetRemainingLength(
  void
) const 

الحصول على سلسلة

WEAVE_ERROR GetString(
  char *buf,
  uint32_t bufSize
)

الحصول على علامة

uint64_t GetTag(
  void
) const 

GetType

TLVType GetType(
  void
) const 

Init

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
إذا كان المخزن المؤقت صغيرًا جدًا.

Init

WEAVE_ERROR Init(
  TLVReader & aReader,
  uint32_t freeLen
)

إعداد كائن TLVUpdater باستخدام TLVReader.

عند استدعاء هذه الطريقة، يتم نقل بيانات TLV في المخزن المؤقت التي تشير إليها TLVReader من نقطة القراءة الحالية إلى نهاية المخزن المؤقت. يتم إعداد عنصر TLVReader خاص جديد للقراءة من هذا الموقع الجديد، بينما يتم إعداد كائن TLVwriter خاص جديد للكتابة في المساحة المخزَّنة المخزَّنة مؤقتًا.

يُرجى العِلم أنه في حال تحديد موضع TLVReader لعنصر، "on"، يتم التراجع عنه أولاً في بداية هذا العنصر. وتجدر الإشارة إلى أن عملية الاحتفاظ بنسخة احتياطية هذه تعمل بشكل جيد مع عناصر الحاوية، أي إذا تم استخدام 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's على عنصر قبل استدعاء هذه الطريقة. تمامًا مثل طريقة TLVReader::Next()، إذا تم وضع القارئ على عنصر حاوية عند إجراء الاستدعاء، سيتم نسخ جميع أعضاء الحاوية. إذا لم يتم وضع القارئ في أي عنصر، لن يحدث أي تغيير في استدعاء هذه الطريقة.

التفاصيل
قيم الإرجاع
WEAVE_NO_ERROR
إذا تم وضع قارئ TLVUpdater بنجاح في عنصر جديد.
WEAVE_END_OF_TLV
إذا كان قارئ TLVUpdater' يشير إلى نهاية الحاوية.
WEAVE_ERROR_INVALID_TLV_ELEMENT
في حال عدم وضع قارئ القارئ TLVIpdater&#39 على عنصر TLV صالح
other
عرض رموز الخطأ الأخرى التي تعرضها طريقة TLVReader::Skip().

نقل حتى النهاية

void MoveUntilEnd(
  void
)

انقل كل عنصر من نقطة القراءة الحالية في TLVUpdater' حتى نهاية مدخل الإدخال TLV المؤقت إلى الإخراج.

تتيح هذه الطريقة نقل كل شيء من نقطة القراءة الحالية في TLVUpdater' حتى نهاية المخزن المؤقت للقارئ وصولاً إلى كاتب TLVUpdater' .

التالي

WEAVE_ERROR Next(
  void
)

تخطي العنصر الحالي وتقديم العنصر TLVUpdater إلى العنصر التالي في إدخال TLV.

تتجاوز الطريقة Next() العنصر الحالي في الإدخال TLV وتتقدّم قارئ TLVUpdater's إلى العنصر التالي الذي يتوفّر في سياق الاحتواء نفسه. وعلى وجه الخصوص، إذا تم وضع القارئ في المستوى العلوي لترميز TLV، سيؤدي طلب Next() إلى نقله إلى العنصر العلوي التالي. إذا تم وضع القارئ ضمن عنصر حاوية TLV (بنية أو مصفوفة أو مسار)، سيؤدي طلب Next() إلى نقله إلى العنصر التالي من الحاوية.

بما أنّ المعلّمة Next() تقيّد حركة القارئ في سياق الاحتواء الحالي، يؤدي استدعاء Next() عند وضع القارئ على عنصر الحاوية إلى تقديم أكثر من الحاوية، مع تخطي عناصرها (وأعضاء أي حاويات متداخلة) حتى يصل إلى العنصر الأول بعد الحاوية.

وعندما لا تكون هناك عناصر أخرى في سياق احتواء معيّن، ستعرض طريقة Next() خطأ WEAVE_END_OF_TLV وسيظل موضع القارئ بدون تغيير.

التفاصيل
قيم الإرجاع
WEAVE_NO_ERROR
إذا تم وضع قارئ TLVUpdater بنجاح في عنصر جديد.
other
عرض رموز خطأ Weave أو Platform التي تعرضها طريقة TLVReader::Skip() وTLVReader::Next().

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
)

وضع منطقية

WEAVE_ERROR PutBoolean(
  uint64_t tag,
  bool v
)

بايت

WEAVE_ERROR PutBytes(
  uint64_t tag,
  const uint8_t *buf,
  uint32_t len
)

بوتنول

WEAVE_ERROR PutNull(
  uint64_t tag
)

سلسلة السلاسل

WEAVE_ERROR PutString(
  uint64_t tag,
  const char *buf
)

سلسلة السلاسل

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

ضبط معرّف ضمني للملف الشخصي

void SetImplicitProfileId(
  uint32_t profileId
)

اضبط معرّف الملف الشخصي الضمني للكائن TLVUpdater.

تحدّد هذه الطريقة رقم تعريف الملف الشخصي الضمني لكائن TLVUpdater. عند طلب أداة التحديث ترميز عنصر جديد، إذا كان رقم تعريف الملف الشخصي للعلامة المرتبطة بالعنصر الجديد يتطابق مع قيمة profileId، ستُشفّر أداة التعديل العلامة ضمنيًا، ما يؤدي إلى حذف رقم تعريف الملف الشخصي في هذه العملية.

التفاصيل
المَعلمات
[in] profileId
رقم تعريف الملف الشخصي للعلامات التي يجب أن يتم ترميزها في شكل ضمني.

حاوية الحاوية

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

التحقّق من النهاية

WEAVE_ERROR VerifyEndOfContainer(
  void
)