Diese Funktion bereitet einen Parser auf die Auswertung eines neuen Nachrichtenobjekts vor. Die Funktion wird zum ersten Mal (für jede Nachricht) aufgerufen, wenn der Nachrichtenfluss die Auswertung des Nachrichteninhalts verursacht.
Der Parameter offset gibt den Offset im Nachrichtenpuffer an, wo mit der Analyse begonnen werden soll. Diese Angabe ist erforderlich, da ein weiterer Parser möglicherweise Eigner eines vorherigen Teils der Nachricht ist (z. B. ein MQMD-Header wird von einem internen Parser des Brokers ausgewertet). Der Offset muss positiv und kleiner als die Puffergröße sein. Überprüfen Sie in dieser Funktion, ob der Offset gültig ist, um Probleme mit vorherigen Parsern zu beheben.
Der Parser muss die Größe des verbleibenden Puffers zurückgeben, für den er das Eigentumsrecht übernimmt. Die Größe muss kleiner-gleich der Größe des Puffers abzüglich des aktuellen Offsets sein.
Ein Parser darf nicht versuchen, die Auswertung anderer Teile der Syntaxelement-Baumstruktur zu verursachen, z. B. durch Navigation zum Stammelement und zu einem anderen Ast. Diese Aktion kann zu unvorhersehbaren Ergebnissen führen.
Wenn diese Implementierungsfunktion in der Struktur CPI_VFT bereitgestellt wird, können Sie weder cpiParseBufferEncoded() noch cpiParseBufferFormatted() aufrufen, 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.
Das folgende Beispiel stammt aus der Musterparserdatei BipSampPluginParser.c:
int cpiParseBuffer(
CciParser* parser,
CciContext* context,
int offset,
){
PARSER_CONTEXT_ST* pc = (PARSER_CONTEXT_ST *)context ;
int rc;
/* Zeiger auf den Nachrichtenpuffer abrufen und Offset festlegen */
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);
}