Il parametro offset indica l'offset all'interno del buffer di messaggi da cui deve iniziare l'analisi. Ciò è necessario in quanto un altro programma di analisi potrebbe disporre di una parte precedente del messaggio (ad esempio, un'intestazione MQMD analizzata dal programma di analisi interno del broker dei messaggi). L'offset deve essere positivo e inferiore alla dimensione del buffer. E' consigliabile che la funzione di implementazione verifichi la validità dell'offset in quanto ciò potrebbe migliorare la determinazione dei problemi se un programma di analisi precedente è in errore.
Il programma di analisi deve restituire la dimensione del buffer rimanente per il quale assume la proprietà. Questa deve essere minore o uguale alla dimensione del buffer meno l'offset attuale.
Un programma di analisi non deve tentare di analizzare altre parti della struttura ad albero dell'elemento di sintassi; ad esempio, navigando nell'elemento root e su un altro branch. Ciò può provocare risultati imprevisti.
Se nella struttura CPI_VFT viene fornita questa funzione di implementazione, non è possibile specificare cpiParseBufferEncoded() né cpiParseBufferFormatted() in quanto la funzione cpiDefineParserClass() avrà esito negativo e viene restituito il codice di ritorno CCI_INVALID_IMPL_FUNCTION.
Definito in | Tipo | Membro |
CPI_VFT | Condizionale | iFpParseBuffer |
int cpiParseBuffer( CciParser* parser, CciContext* context, int offset);
La dimensione (in byte) della parte rimanente del buffer di messaggi per il quale il programma di analisi assume la proprietà.
Questo esempio è estratto dal file del programma di analisi di esempio BipSampPluginParser.c (da riga 428 a 466):
int cpiParseBuffer( CciParser* parser, CciContext* context, int offset, ){ PARSER_CONTEXT_ST* pc = (PARSER_CONTEXT_ST *)context ; int rc; /* Fornisce un puntatore nel buffer di messaggi e imposta l'offset */ pc->iBuffer = (void *)cpiBufferPointer(&rc, parser); pc->iIndex = 0; /* Salva la dimensione del buffer */ pc->iSize = cpiBufferSize(&rc, parser); /* Prepara il primo byte nel flusso */ pc->iCurrentCharacter = cpiBufferByte(&rc, parser, pc->iIndex); /* Imposta l'elemento attuale sull'elemento root */ pc->iCurrentElement = cpiRootElement(&rc, parser); /* Reimposta l'indicatore per garantire che l'analisi venga reimpostata correttamente */ pc->iInTag = 0; if (pc->trace) { fprintf(pc->tracefile, "PLUGIN: <- cpiParseBuffer() retvalue=%d\n", pc->iSize); fflush(pc->tracefile); }