Esta função prepara um analisador para analisar um novo objeto de mensagem. É chamada na primeira vez (para cada mensagem) que o fluxo de mensagens faz com que o conteúdo da mensagem seja analisado.
O parâmetro offset indica o deslocamento dentro do buffer de mensagem onde a análise deve começar. Esta indicação é necessária porque outro analisador pode possuir uma parte anterior da mensagem (por exemplo, um cabeçalho MQMD é analisado por um analisador interno pertencente ao broker). O deslocamento deve ser positivo e menor que o tamanho do buffer. Verifique nesta função que o deslocamento é válido para remover problemas associados aos analisadores anteriores.
O analisador deve retornar o tamanho do buffer restante para o qual assume o direito à propriedade. O tamanho deve ser menor ou igual ao tamanho do buffer, menor que o deslocamento atual.
Um analisador não deve tentar causar a análise de outras partes da árvore de elementos de sintaxe, por exemplo, navegando até o elemento raiz e para outra ramificação. Esta ação pode causar resultados imprevisíveis.
Se esta função de implementação for fornecida na estrutura CPI_VFT, você não poderá chamar cpiParseBufferEncoded() nem cpiParseBufferFormatted(), porque a função cpiDefineParserClass() falha com um código de retorno igual a CCI_INVALID_IMPL_FUNCTION.
Definido em | Type | Membro |
---|---|---|
CPI_VFT | Condicional | iFpParseBuffer |
int cpiParseBuffer(
CciParser* parser,
CciContext* context,
int offset);
O tamanho (em bytes) da parte restante do buffer de mensagem para o qual o analisador assume a propriedade.
Este exemplo é obtido do arquivo analisador de amostra BipSampPluginParser.c:
int cpiParseBuffer(
CciParser* parser,
CciContext* context,
int offset,
){
PARSER_CONTEXT_ST* pc = (PARSER_CONTEXT_ST *)context ;
int rc;
/* Obter um ponteiro para o buffer de mensagem e definir o
deslocamento */
pc->iBuffer = (void *)cpiBufferPointer(&rc, parser);
pc->iIndex = 0;
/* Salvar o tamanho do buffer */
pc->iSize = cpiBufferSize(&rc, parser);
/* Obter o primeiro byte no fluxo */
pc->iCurrentCharacter = cpiBufferByte(&rc, parser, pc->iIndex);
/* Definir o elemento atual como o elemento raiz */
pc->iCurrentElement = cpiRootElement(&rc, parser);
/* Reconfigurar o sinalizador para garantir que a análise
seja redefinida corretamente */
pc->iInTag = 0;
if (pc->trace) {
fprintf(pc->tracefile, "PLUGIN: <- cpiParseBuffer()
retvalue=%d\n", pc->iSize);
fflush(pc->tracefile);
}