Esta función prepara un analizador para analizar un nuevo objeto de mensaje. Se invoca la primera vez (para cada mensaje) que el flujo de mensajes hace que se analice el contenido del mensaje.
El parámetro offset indica el desplazamiento en el almacenamiento intermedio de mensajes donde debe comenzar el análisis. Esta indicación es necesaria porque otro analizador puede ser propietario de una parte anterior del mensaje (por ejemplo, una cabecera MQMD la analiza un analizador interno propiedad del intermediario). El desplazamiento debe ser positivo y debe ser menor que el tamaño del almacenamiento intermedio. Compruebe en esta función que el desplazamiento sea válido, para eliminar problemas asociados con analizadores anteriores.
El analizador debe devolver el tamaño del almacenamiento intermedio restante del que se convierte en propietario. El tamaño debe ser menor o igual que el tamaño del almacenamiento intermedio, menos el desplazamiento actual.
Un analizador no debe intentar provocar el análisis de otras partes del árbol de elementos de sintaxis, por ejemplo navegando al elemento raíz y a otra rama. Esta acción puede producir resultados imprevisibles.
Si esta función de implementación se proporciona en la estructura CPI_VFT, no puede llamar a cpiParseBufferEncoded() ni a cpiParseBufferFormatted(), porque la función cpiDefineParserClass() falla con un código de retorno CCI_INVALID_IMPL_FUNCTION.
Definida en | Tipo | Miembro |
---|---|---|
CPI_VFT | Condicional | iFpParseBuffer |
int cpiParseBuffer(
CciParser* parser,
CciContext* context,
int offset);
Tamaño (en bytes) de la parte restante del almacenamiento intermedio de mensaje del que el analizador se convierte en propietario.
Este ejemplo se ha tomado del archivo de analizador de ejemplo BipSampPluginParser.c:
int cpiParseBuffer(
CciParser* parser,
CciContext* context,
int offset,
){
PARSER_CONTEXT_ST* pc = (PARSER_CONTEXT_ST *)context ;
int rc;
/* Obtener un puntero al almacenamiento intermedio de mensaje y establecer el desplazamiento */
pc->iBuffer = (void *)cpiBufferPointer(&rc, parser);
pc->iIndex = 0;
/* Guardar el tamaño del almacenamiento intermedio */
pc->iSize = cpiBufferSize(&rc, parser);
/* Cargar el primer byte en la corriente de datos */
pc->iCurrentCharacter = cpiBufferByte(&rc, parser, pc->iIndex);
/* Establecer el elemento actual en el elemento raíz */
pc->iCurrentElement = cpiRootElement(&rc, parser);
/* Restablecer el distintivo para asegurar que el análisis se restablece correctamente */
pc->iInTag = 0;
if (pc->trace) {
fprintf(pc->tracefile, "PLUGIN: <- cpiParseBuffer()
retvalue=%d\n", pc->iSize);
fflush(pc->tracefile);
}