nl:: Weave:: TLV:: TLVUpdater
#include <src/lib/core/WeaveTLV.h>
Fornece uma interface unificada do leitor/escritor para editar/adicionar/excluir elementos na codificação TLV.
Resumo
O TLVUpdater é uma união dos objetos TLVReader e TLVWriter e oferece métodos de interface para editar/excluir dados em uma codificação, bem como adicionar novos elementos à codificação TLV. O objeto TLVUpdater atua basicamente como dois cursores, um para ler a codificação atual e outro para a gravação (para copiar dados atuais ou gravar novos dados).
Semanticamente, o objeto TLVUpdater funciona como uma união do TLVReader e TLVWriter. Os métodos TLVUpdater têm significados mais ou menos semelhantes como colegas com nomes semelhantes em TLVReader/TLVWriter. Quando houver diferenças na semântica, elas serão documentadas claramente na seção de comentários da função em WeaveTLVUpdater.cpp.
Uma observação importante sobre os métodos TLVUpdater's PutBytes() e PutString() é que eles podem deixar a codificação em estado corrompido, com somente o cabeçalho do elemento escrito quando ocorre um estouro. Os aplicativos podem chamar GetPersistentFreeLength() para garantir que haja aproximadamente espaço suficiente para escrever a codificação. Observe GetGetFreeLength() informa apenas os bytes sem custo financeiro disponíveis e não há como o aplicativo saber o tamanho dos dados codificados que são gravados. No caso de um estouro excessivo, PutBytes() e PutString() retornarão WEAVE_ERROR_BUFFER_TOO_SMALL para o autor da chamada.
Além disso, o método Next() está sobrecarregado para pular o elemento atual e avançar o leitor interno para o próximo elemento. Como pular elementos já codificados precisa exigir a alteração das variáveis internas de estado de espaço livre do gravador interno para considerar o novo espaço liberado (disponível ao pular), o aplicativo precisa chamar Next() no atualizador após um método Get() com um valor que não quer gravar de volta (o que é equivalente a ignorar o elemento atual).
Funções públicas |
|
---|---|
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)
|
Prepara um objeto TLVUpdater para ler elementos de um contêiner.
|
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)
|
Inicialize um objeto TLVUpdater para editar um único buffer de entrada.
|
Init(TLVReader & aReader, uint32_t freeLen)
|
Inicialize um objeto TLVUpdater usando um TLVReader.
|
Move(void)
|
|
MoveUntilEnd(void)
|
void
Move tudo do ponto de leitura atual do TLVUpdater' até o fim do buffer de TLV de entrada para a saída.
|
Next(void)
|
Pule o elemento atual e avance o objeto TLVUpdater para o próximo elemento no TLV de entrada.
|
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
Defina o ID do perfil implícito para o objeto TLVUpdater.
|
StartContainer(uint64_t tag, TLVType containerType, TLVType & outerContainerType)
|
|
VerifyEndOfContainer(void)
|
Funções públicas
Copiar
WEAVE_ERROR CopyElement( TLVReader & reader )
Copiar
WEAVE_ERROR CopyElement( uint64_t tag, TLVReader & reader )
Bytes duplos
WEAVE_ERROR DupBytes( uint8_t *& buf, uint32_t & dataLen )
String DupString
WEAVE_ERROR DupString( char *& buf )
Contêiner final
WEAVE_ERROR EndContainer( TLVType outerContainerType )
Inserir contêiner
WEAVE_ERROR EnterContainer( TLVType & outerContainerType )
Prepara um objeto TLVUpdater para ler elementos de um contêiner.
Ele também codifica um início de objeto de contêiner no TLV de saída.
O método EnterContainer() prepara o objeto TLVUpdater atual para começar a ler os elementos do membro de um contêiner TLV (uma estrutura, matriz ou caminho). Para cada chamada para EnterContainer(), os aplicativos precisam fazer uma chamada correspondente para ExitContainer().
Quando EnterContainer() é chamado, o leitor de TLVUpdater's precisa ser posicionado no elemento do contêiner. O método usa como argumento uma referência a um valor de TLVType que será usado para salvar o contexto do atualizador enquanto estiver lendo o contêiner.
Quando o método EnterContainer() retorna, o atualizador é posicionado imediatamente antes do primeiro membro do contêiner. Chamar Next() repetidamente repetirá o atualizador com os membros da coleção até que o fim seja atingido, quando o atualizador retornará WEAVE_END_OF_TLV.
Depois que o aplicativo terminar de ler um contêiner, ele poderá continuar lendo os elementos após o contêiner chamando o método ExitContainer().
Detalhes | |||||||
---|---|---|---|---|---|---|---|
Parâmetros |
|
||||||
Valores de retorno |
|
Sair do Container
WEAVE_ERROR ExitContainer( TLVType outerContainerType )
Conclua a leitura de um elemento de contêiner TLV e codifica um fim do elemento TLV no TLV de saída.
O método ExitContainer() restaura o estado de um objeto TLVUpdater após uma chamada para EnterContainer(). Para cada chamada para aplicativos EnterContainer(), é necessário fazer uma chamada correspondente para ExitContainer(), transmitindo o valor de contexto retornado pelo método EnterContainer().
Quando ExitContainer() retorna, o leitor TLVUpdater é posicionado imediatamente antes do primeiro elemento que acompanha o contêiner no TLV de entrada. A partir desse ponto, os aplicativos podem chamar Next() para avançar com os elementos restantes.
Depois que EnterContainer() for chamado, os aplicativos poderão chamar ExitContainer() no atualizador a qualquer momento, independentemente de todos os elementos no contêiner subjacente terem sido lidos. Além disso, chamar ExitContainer() antes de ler todos os elementos no contêiner fará com que ele seja truncado no TLV de saída.
Detalhes | |||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|
Parâmetros |
|
||||||||||
Valores de retorno |
|
Finalizar
WEAVE_ERROR Finalize( void )
Get
WEAVE_ERROR Get( bool & v )
Get
WEAVE_ERROR Get( int8_t & v )
Get
WEAVE_ERROR Get( int16_t & v )
Get
WEAVE_ERROR Get( int32_t & v )
Get
WEAVE_ERROR Get( int64_t & v )
Get
WEAVE_ERROR Get( uint8_t & v )
Get
WEAVE_ERROR Get( uint16_t & v )
Get
WEAVE_ERROR Get( uint32_t & v )
Get
WEAVE_ERROR Get( uint64_t & v )
Get
WEAVE_ERROR Get( float & v )
Get
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 )
GetrestFreeLength
uint32_t GetRemainingFreeLength( void )
Get solicitarLength
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 )
Inicialize um objeto TLVUpdater para editar um único buffer de entrada.
Ao chamar esse método, os dados TLV no buffer são movidos para o fim do buffer e um objeto TLVReader particular é inicializado neste buffer realocado. Um objeto TLVWriter particular também é inicializado no espaço livre, que agora está disponível no início. Os aplicativos podem usar o objeto TLVUpdater para analisar os dados TLV e modificar/excluir elementos existentes ou adicionar novos elementos à codificação.
Detalhes | |||||||
---|---|---|---|---|---|---|---|
Parâmetros |
|
||||||
Valores de retorno |
|
Init
WEAVE_ERROR Init( TLVReader & aReader, uint32_t freeLen )
Inicialize um objeto TLVUpdater usando um TLVReader.
Ao chamar esse método, os dados TLV no buffer apontados pelo TLVReader são movidos do ponto de leitura atual para o fim do buffer. Um novo objeto TLVReader particular é inicializado para ler nesse novo local, e um novo objeto particular TLVWriter é inicializado para gravar no espaço do buffer liberado.
Se o TLVReader já estiver posicionado "on" um elemento, ele terá o backup feito no início desse elemento. Além disso, esse backup funciona bem com elementos de contêiner, ou seja, se o TLVReader já foi usado para chamar EnterContainer(), não há nada para retroceder. Mas se o TLVReader ainda estava posicionado no elemento do contêiner e EnterContainer() ainda não foi chamado, o objeto TLVReader é salvo no início do cabeçalho do contêiner.
O objeto TLVReader de entrada será destruído antes de retornar, e o aplicativo não poderá usar o mesmo ao retornar.
Detalhes | |||||||
---|---|---|---|---|---|---|---|
Parâmetros |
|
||||||
Valores de retorno |
|
Mover
WEAVE_ERROR Move( void )
Copia o elemento atual da TLV de entrada para a TLV de saída.
O método Move() copia o elemento atual em que o leitor de TLVUpdater's é posicionado para o gravador do TLVUpdater' O aplicativo deve chamar Next() e posicionar o leitor do TLVUpdater's em um elemento antes de chamar esse método. Assim como o método TLVReader::Next(), se o leitor for posicionado em um elemento do contêiner no momento da chamada, todos os membros do contêiner serão copiados. Se o leitor não estiver posicionado em nenhum elemento, nada mudará ao chamar esse método.
Detalhes | |||||||||
---|---|---|---|---|---|---|---|---|---|
Valores de retorno |
|
MoverUntilEnd
void MoveUntilEnd( void )
Move tudo do ponto de leitura atual do TLVUpdater' até o fim do buffer de TLV de entrada para a saída.
Esse método oferece suporte à mudança de tudo do ponto de leitura atual do TLVUpdater' até o final do buffer do leitor para o gravador do TLVUpdater'
Próxima
WEAVE_ERROR Next( void )
Pule o elemento atual e avance o objeto TLVUpdater para o próximo elemento no TLV de entrada.
O método Next() pula o elemento atual no TLV de entrada e avança o leitor de TLVUpdater's para o próximo elemento que reside no mesmo contexto de contenção. Se o leitor estiver posicionado no nível mais externo de uma codificação TLV, chamar Next() a avançará para o próximo elemento superior. Se o leitor for posicionado em um elemento do contêiner de TLV (uma estrutura, uma matriz ou um caminho), chamar Next() o avançará para o próximo elemento de membro do contêiner.
Como Next() restringe o movimento do leitor ao contexto de contenção atual, chamar Next() quando o leitor é posicionado em um elemento do contêiner avança no contêiner, ignorando os elementos (e membros de contêineres aninhados) até que chegue ao primeiro elemento após o contêiner.
Quando não há mais elementos em um contexto de contenção específico, o método Next() retorna um erro WEAVE_END_OF_TLV e a posição do leitor permanece inalterada.
Detalhes | |||||
---|---|---|---|---|---|
Valores de retorno |
|
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 )
Defina o ID do perfil implícito para o objeto TLVUpdater.
Esse método define o ID de perfil implícito para o objeto TLVUpdater. Quando o atualizador precisa codificar um novo elemento, se o ID do perfil da tag associada ao novo elemento corresponder ao valor de profileId
, o atualizador codificará a tag na forma implícita, omitindo, assim, o ID do perfil no processo.
Detalhes | |||
---|---|---|---|
Parâmetros |
|
Iniciar contêiner
WEAVE_ERROR StartContainer( uint64_t tag, TLVType containerType, TLVType & outerContainerType )