nl::Weave::TLV::TLVUpdater

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

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

요약

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가 이미 특정 요소 '위'에 배치된 경우 먼저 요소의 시작 부분부터 되돌려집니다. 또한 이 백오프는 컨테이너 요소에서 잘 작동합니다. 예를 들어 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 또는 플랫폼 오류 코드를 반환합니다.

데이터 기반의

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 객체의 암시적 프로필 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
)