nl::Weave::TLV::TLVUpdater

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

TLV 인코딩에서 요소를 수정/추가/삭제하기 위한 통합된 리더/작성기 인터페이스를 제공합니다.

요약

TLVUpdaterTLVReaderTLVWriter 객체의 통합으로, 인코딩에서 데이터를 수정/삭제하고 새 요소를 TLV 인코딩에 추가하기 위한 인터페이스 메서드를 제공합니다. TLVUpdater 객체는 기본적으로 두 개의 커서처럼 작동합니다. 하나는 기존 인코딩을 읽는 데 사용되고, 다른 하나는 쓰기 (기존 데이터 복사 또는 새 데이터 쓰기)를 위한 커서입니다.

의미상 TLVUpdater 객체는 TLVReaderTLVWriter의 합집합과 같이 작동합니다. TLVUpdater 메서드는 TLVReader/TLVWriter의 유사한 이름이 지정된 대응 항목과 거의 비슷한 의미를 갖습니다. 시맨틱스에 차이가 있는 경우 차이점은 WeaveTLVUpdater.cpp의 함수의 주석 섹션에 명확하게 문서화됩니다.

TLVUpdater의 PutBytes() 및 PutString() 메서드에 대한 특히 중요한 점은 오버플로가 발생할 때 요소 헤더만 기록하여 인코딩을 손상된 상태로 둘 수 있다는 것입니다. 애플리케이션은 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)
TLVReader를 사용하여 TLVUpdater 객체를 초기화합니다.
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 객체의 암시적 프로필 ID를 설정합니다.
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
TLVWriter::StartContainer() 또는 TLVReader::EnterContainer()에서 반환된 기타 모든 Weave 또는 플랫폼 오류 코드입니다.

ExitContainer

WEAVE_ERROR ExitContainer(
  TLVType outerContainerType
)

TLV 컨테이너 요소의 읽기를 완료하고 출력 TLV에서 TLV 요소의 끝을 인코딩합니다.

ExitContainer() 메서드는 EnterContainer()를 호출한 후 TLVUpdater 객체의 상태를 복원합니다. EnterContainer()를 호출할 때마다 애플리케이션에서 해당하는 ExitContainer()를 호출하여 EnterContainer() 메서드에서 반환된 컨텍스트 값을 전달해야 합니다.

ExitContainer()가 반환되면 TLVUpdater 리더가 입력 TLV에서 컨테이너 뒤에 오는 첫 번째 요소 바로 앞에 배치됩니다. 이 시점부터 애플리케이션은 Next()를 호출하여 나머지 요소 간에 진행할 수 있습니다.

EnterContainer()가 호출되면 애플리케이션은 기본 컨테이너의 모든 요소를 읽었는지 여부에 관계없이 언제든지 업데이터에서 ExitContainer()를 호출할 수 있습니다. 또한 컨테이너의 모든 요소를 읽기 전에 ExitContainer()를 호출하면 업데이트된 컨테이너가 출력 TLV에서 잘립니다.

세부정보
매개변수
[in] outerContainerType
EnterContainer() 메서드에 의해 반환된 TLVType 값입니다.
반환 값
WEAVE_NO_ERROR
메서드가 성공한 경우입니다.
WEAVE_ERROR_TLV_UNDERRUN
기본 TLV 인코딩이 조기 종료된 경우입니다.
WEAVE_ERROR_INVALID_TLV_ELEMENT
업데이터에 잘못되거나 지원되지 않는 TLV 요소 유형이 발생한 경우
WEAVE_ERROR_INVALID_TLV_TAG
업데이터가 잘못된 컨텍스트에서 TLV 태그를 발견한 경우
other
TLVWriter::EndContainer() 또는 TLVReader::ExitContainer()에서 반환된 기타 모든 Weave 또는 플랫폼 오류 코드입니다.

마무리

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 

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
)

TLVReader를 사용하여 TLVUpdater 객체를 초기화합니다.

이 메서드를 호출하면 TLVReader가 가리키는 버퍼의 TLV 데이터가 현재 읽기 포인트에서 버퍼의 끝으로 이동합니다. 새로운 비공개 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의 리더를 요소에 배치해야 합니다. 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
TLVReader::Skip()TLVReader::Next() 메서드에서 반환된 Weave 또는 플랫폼 오류 코드를 반환합니다.

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
)

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 객체의 암시적 프로필 ID를 설정합니다.

이 메서드는 TLVUpdater 객체의 암시적 프로필 ID를 설정합니다. 업데이터에 새 요소를 인코딩하라는 메시지가 표시될 때 새 요소와 연결된 태그의 프로필 ID가 profileId 값과 일치하면 업데이터가 태그를 암시적 형식으로 인코딩하므로 프로세스에서 프로필 ID가 생략됩니다.

세부정보
매개변수
[in] profileId
암시적 형식으로 인코딩되어야 하는 태그의 프로필 ID입니다.

StartContainer

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

VerifyEndOfContainer

WEAVE_ERROR VerifyEndOfContainer(
  void
)