Der Parameter offset gibt die relative Position im Nachrichtenpuffer an, an der die Syntaxanalyse beginnen soll. Dies ist erforderlich, da möglicherweise ein anderer Parser Eigner eines vorherigen Teils der Nachricht ist (z. B. kann ein MQMD-Header vom internen Parser des Nachrichtenbrokers analysiert worden sein). Die relative Position muss positiv und kleiner als die Größer des Puffers sein. Es wird empfohlen, die Implementierungsfunktion überprüfen zu lassen, ob die relative Position gültig ist, da dies die Fehlerermittlung erleichtern könnte, wenn bei einem vorherigen Parser ein Fehler auftritt.
Der Parser muss die Größe des verbleibenden Puffers zurückgeben, für den er das Eigentumsrecht übernimmt. Dieser Wert muss kleiner-gleich der Größe des Puffers minus der aktuellen relativen Position sein.
Ein Parser darf nicht versuchen, die Syntaxanalyse anderer Teile der Syntaxelementstruktur beispielsweise durch Navigieren zum Stammelement und zu einer anderen Verzweigung zu veranlassen. Dies kann zu unvorhersehbaren Ergebnissen führen.
Wenn diese Implementierungsfunktion in der Struktur CPI_VFT bereitgestellt wird, kann weder cpiParseBufferEncoded() noch cpiParseBufferFormatted() angegeben werden, da die Funktion cpiDefineParserClass() mit dem Rückkehrcode CCI_INVALID_IMPL_FUNCTION fehlschlägt.
Definiert in | Typ | Mitglied |
CPI_VFT | Bedingt | iFpParseBuffer |
int cpiParseBuffer( CciParser* parser, CciContext* context, int offset);
Die Größe des verbleibenden Teils des Nachrichtenpuffers, für den der Parser das Eigentumsrecht übernimmt (in Byte).
Dieses Beispiel wurde aus der Parser-Beispieldatei BipSampPluginParser.c entnommen (Zeile 428 bis 466):
int cpiParseBuffer( CciParser* parser, CciContext* context, int offset, ){ PARSER_CONTEXT_ST* pc = (PARSER_CONTEXT_ST *)context ; int rc; /* Get a pointer to the message buffer and set the offset */ pc->iBuffer = (void *)cpiBufferPointer(&rc, parser); pc->iIndex = 0; /* Save size of the buffer */ pc->iSize = cpiBufferSize(&rc, parser); /* Prime the first byte in the stream */ pc->iCurrentCharacter = cpiBufferByte(&rc, parser, pc->iIndex); /* Set the current element to the root element */ pc->iCurrentElement = cpiRootElement(&rc, parser); /* Reset flag to ensure parsing is reset correctly */ pc->iInTag = 0; if (pc->trace) { fprintf(pc->tracefile, "PLUGIN: <- cpiParseBuffer() retvalue=%d\n", pc->iSize); fflush(pc->tracefile); }