nl:: بافت:: TLV:: TLVUpdater

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

یک رابط Reader/Writer یکپارچه برای ویرایش/افزودن/حذف عناصر در رمزگذاری 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() برای رد شدن عنصر فعلی و همچنین پیشبرد خواننده داخلی به عنصر بعدی، بارگذاری شده است. از آنجایی که پرش از عناصر کدگذاری شده از قبل مستلزم تغییر متغیرهای حالت فضای آزاد نویسنده داخلی برای در نظر گرفتن فضای آزاد شده جدید (با پرش در دسترس است)، انتظار می رود که برنامه بعد از متد Get() که مقدار آن را ندارد ، Next() را در به روز رسانی فراخوانی کند. نمی‌خواهم بنویسم (که معادل پرش از عنصر فعلی است).

توابع عمومی

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 مطابقت داشته باشد، به‌روزرسانی‌کننده برچسب را به صورت ضمنی رمزگذاری می‌کند و در نتیجه شناسه نمایه را در این فرآیند حذف می‌کند.

جزئیات
پارامترها
[در] شناسه پروفایل
شناسه پروفایل تگ هایی که باید به صورت ضمنی کدگذاری شوند.

StartContainer

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

VerifyEndOfContainer

WEAVE_ERROR VerifyEndOfContainer(
  void
)