Der Parameter offset gibt den Offset im Nachrichtenpuffer an, wo mit der Analyse begonnen werden soll. Dies ist erforderlich, da ein weiterer Parser möglicherweise Eigner eines vorherigen Teils der Nachricht ist (z. B. ein MQMD-Header wird vom internen Parser des Nachrichtenbrokers ausgewertet). Der Offset muss positiv und kleiner als die Puffergröße sein. Es wird empfohlen, dass die Implementierungsfunktion die Gültigkeit des Offset überprüft, da dies die Fehlerbestimmung im Falle eines Fehlers bei einem vorherigen Parser verbessern könnte.
Der Parser muss die Größe des verbleibenden Puffers zurückgeben, für den er das Eigentumsrecht übernimmt. Diese muss kleiner-gleich der Größe des Puffers abzüglich des aktuellen Offset sein.
Ein Parser darf nicht versuchen, die Auswertung anderer Teile der Syntaxelementbaumstruktur zu verursachen, z. B. durch Navigation zum Stammelement und zu einem anderen Ast. 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 (in Byte) des restlichen Teils des Nachrichtenpuffers, für den der Parser das Eigentumsrecht übernimmt.
Dieses Beispiel stammt aus der Beispiel-Parserdatei BipSampPluginParser.c (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; /* Größe des Puffers speichern */ pc->iSize = cpiBufferSize(&rc, parser); /* Ersten Byte im Datenstrom einsetzen */ pc->iCurrentCharacter = cpiBufferByte(&rc, parser, pc->iIndex); /* Aktuelles Element für das Stammelement festlegen */ pc->iCurrentElement = cpiRootElement(&rc, parser); /* Flag zurücksetzen, um sicherzustellen, dass die Analyse korrekt zurückgesetzt wird */ pc->iInTag = 0; if (pc->trace) { fprintf(pc->tracefile, "PLUGIN: <- cpiParseBuffer() retvalue=%d\n", pc->iSize); fflush(pc->tracefile); }