Projekt

Allgemein

Profil

« Zurück | Weiter » 

Revision 9300d8b9

Von admin vor fast 6 Jahren hinzugefügt

  • ID 9300d8b9710f1278a083b59985ba7b028ae7c246
  • Vorgänger d92401f8
  • Nachfolger bd89bb4d

Revert "MsgEngine: More work on improving maintainability."

This reverts commit 6c2f9046916ed0efcc6b40c07e6bd2b916959769.

Unterschiede anzeigen:

src/parser/msgengine_read.c
*/
static int _groupReadGroup(GWEN_MSGENGINE *e,
GWEN_BUFFER *msgbuf,
const char *type,
GWEN_XMLNODE *n,
GWEN_DB_NODE *dbData,
char currentDelimiter,
char currentTerminator,
const char *delimiters,
uint32_t flags);
static int _groupReadElement(GWEN_MSGENGINE *e,
GWEN_BUFFER *msgbuf,
GWEN_XMLNODE *n,
GWEN_XMLNODE *rnode,
GWEN_DB_NODE *dbData,
GWEN_DB_NODE *gr,
char currentDelimiter,
char currentTerminator,
const char *delimiters,
......
static int _skipRestOfSegment(GWEN_MSGENGINE *e, GWEN_BUFFER *mbuf, GWEN_DB_NODE *dbSegmentHead, uint32_t flags);
static int _readValue(GWEN_MSGENGINE *e,
GWEN_BUFFER *msgbuf,
GWEN_XMLNODE *xmlNode,
GWEN_XMLNODE *node,
GWEN_XMLNODE *rnode,
GWEN_BUFFER *vbuf,
const char *delimiters,
......
int GWEN_MsgEngine_ReadMessage(GWEN_MSGENGINE *e,
const char *gtype,
GWEN_BUFFER *mbuf,
GWEN_DB_NODE *dbData,
GWEN_DB_NODE *gr,
uint32_t flags)
{
unsigned int segments=0;
while (GWEN_Buffer_GetBytesLeft(mbuf)) {
GWEN_XMLNODE *xmlNode;
GWEN_XMLNODE *node;
unsigned int posSegmentStart;
const char *sSegmentCode;
GWEN_DB_NODE *dbSegmentHead;
......
/* find head segment description */
dbSegmentHead=GWEN_DB_Group_new("dbSegmentHead");
xmlNode=GWEN_MsgEngine_FindGroupByProperty(e, "id", 0, "SegHead");
if (xmlNode==0) {
node=GWEN_MsgEngine_FindGroupByProperty(e, "id", 0, "SegHead");
if (node==0) {
DBG_ERROR(GWEN_LOGDOMAIN, "Segment description not found");
GWEN_DB_Group_free(dbSegmentHead);
return GWEN_ERROR_GENERIC;
......
/* parse head segment */
posSegmentStart=GWEN_Buffer_GetPos(mbuf);
if (GWEN_MsgEngine_ParseMessage(e, xmlNode, mbuf, dbSegmentHead, flags)) {
if (GWEN_MsgEngine_ParseMessage(e, node, mbuf, dbSegmentHead, flags)) {
DBG_ERROR(GWEN_LOGDOMAIN, "Error parsing segment head");
GWEN_DB_Group_free(dbSegmentHead);
return GWEN_ERROR_GENERIC;
......
return GWEN_ERROR_GENERIC;
}
/* try to find corresponding XML xmlNode */
xmlNode=GWEN_MsgEngine_FindNodeByProperty(e, gtype, "code", segVer, sSegmentCode);
if (xmlNode==0) {
/* try to find corresponding XML node */
node=GWEN_MsgEngine_FindNodeByProperty(e, gtype, "code", segVer, sSegmentCode);
if (node==0) {
int rv;
rv=_skipRestOfSegment(e, mbuf, dbSegmentHead, flags);
......
}
}
else {
/* ok, xmlNode available, get the corresponding description and parse the segment */
/* ok, node available, get the corresponding description and parse the segment */
const char *id;
GWEN_DB_NODE *storegrp;
......
GWEN_Buffer_SetPos(mbuf, posSegmentStart);
/* create group in DB for this segment */
id=GWEN_XMLNode_GetProperty(xmlNode, "id", sSegmentCode);
storegrp=GWEN_DB_GetGroup(dbData, GWEN_PATH_FLAGS_CREATE_GROUP, id);
id=GWEN_XMLNode_GetProperty(node, "id", sSegmentCode);
storegrp=GWEN_DB_GetGroup(gr, GWEN_PATH_FLAGS_CREATE_GROUP, id);
assert(storegrp);
/* store the start position of this segment within the DB */
GWEN_DB_SetIntValue(storegrp, GWEN_DB_FLAGS_OVERWRITE_VARS, "segment/pos", posSegmentStart);
/* parse the segment */
if (GWEN_MsgEngine_ParseMessage(e, xmlNode, mbuf, storegrp, flags)) {
if (GWEN_MsgEngine_ParseMessage(e, node, mbuf, storegrp, flags)) {
DBG_ERROR(GWEN_LOGDOMAIN, "Error parsing segment \"%s\" at %d (%x)",
sSegmentCode,
GWEN_Buffer_GetPos(mbuf)-posSegmentStart,
......
ustart=GWEN_Buffer_GetPos(mbuf);
ustart++; /* skip delimiter */
/* xmlNode not found, skip it */
/* node not found, skip it */
DBG_NOTICE(GWEN_LOGDOMAIN,
"Unknown segment \"%s\" (Segnum=%d, version=%d, ref=%d), skipping",
sSegmentName,
......
int GWEN_MsgEngine__ReadGroup(GWEN_MSGENGINE *e,
GWEN_BUFFER *msgbuf,
GWEN_XMLNODE *xmlNode,
GWEN_XMLNODE *xmlReferencingNode,
GWEN_DB_NODE *dbData,
GWEN_XMLNODE *node,
GWEN_XMLNODE *rnode,
GWEN_DB_NODE *gr,
const char *delimiters,
uint32_t flags)
{
//unsigned int minsize;
//unsigned int maxsize;
unsigned int minnum;
unsigned int maxnum;
const char *p;
char delimiter;
char terminator;
GWEN_XMLNODE *n;
int abortLoop;
GWEN_BUFFER *delimBuffer=0;
/* get some settings */
if (xmlReferencingNode) {
if (rnode) {
/* get delimiter */
p=GWEN_XMLNode_GetProperty(xmlReferencingNode, "delimiter", GWEN_XMLNode_GetProperty(xmlNode, "delimiter", ""));
p=GWEN_XMLNode_GetProperty(rnode, "delimiter", GWEN_XMLNode_GetProperty(node, "delimiter", ""));
delimiter=*p;
/* get terminating char, if any */
p=GWEN_XMLNode_GetProperty(xmlReferencingNode, "terminator", GWEN_XMLNode_GetProperty(xmlNode, "terminator", ""));
p=GWEN_XMLNode_GetProperty(rnode, "terminator", GWEN_XMLNode_GetProperty(node, "terminator", ""));
terminator=*p;
}
else {
/* get delimiter */
p=GWEN_XMLNode_GetProperty(xmlNode, "delimiter", "");
p=GWEN_XMLNode_GetProperty(node, "delimiter", "");
delimiter=*p;
/* get terminating char, if any */
p=GWEN_XMLNode_GetProperty(xmlNode, "terminator", "");
p=GWEN_XMLNode_GetProperty(node, "terminator", "");
terminator=*p;
}
......
DBG_DEBUG(GWEN_LOGDOMAIN, "Delimiters are \"%s\" and \"%c\"", delimiters, delimiter);
n=GWEN_XMLNode_GetChild(xmlNode);
n=GWEN_XMLNode_GetChild(node);
while (n) {
if (GWEN_XMLNode_GetType(n)==GWEN_XMLNodeTypeTag) {
const char *type;
int rv;
if (GWEN_Buffer_GetBytesLeft(msgbuf)==0)
break;
......
3);
#endif
if (strcasecmp(type, "ELEM")==0) {
rv=_groupReadElement(e, msgbuf, n, xmlReferencingNode, dbData,
delimiter, terminator, GWEN_Buffer_GetStart(delimBuffer),
flags);
int rv;
rv=_groupReadElement(e, msgbuf, n, rnode, gr, delimiter, terminator, GWEN_Buffer_GetStart(delimBuffer), flags);
if (rv<0) {
DBG_INFO(GWEN_LOGDOMAIN, "here (%d)", rv);
GWEN_Buffer_free(delimBuffer);
......
n=GWEN_XMLNode_Next(n);
}
else {
/* group tag found */
rv=_groupReadGroup(e, msgbuf, type, n, dbData,
delimiter, terminator, GWEN_Buffer_GetStart(delimBuffer),
flags);
if (rv<0) {
DBG_INFO(GWEN_LOGDOMAIN, "here (%d)", rv);
GWEN_Buffer_free(delimBuffer);
return rv;
}
n=GWEN_XMLNode_Next(n);
/* group tag found */
GWEN_XMLNODE *gn;
GWEN_DB_NODE *gcfg;
const char *gname;
const char *gtype;
unsigned int gversion;
unsigned int loopNr;
DBG_VERBOUS(GWEN_LOGDOMAIN, "Reading group");
minnum=atoi(GWEN_XMLNode_GetProperty(n, "minnum", "1"));
maxnum=atoi(GWEN_XMLNode_GetProperty(n, "maxnum", "1"));
gversion=atoi(GWEN_XMLNode_GetProperty(n, "version", "0"));
gtype=GWEN_XMLNode_GetProperty(n, "type", 0);
if (!gtype) {
/* no "type" property, so use this group directly */
DBG_INFO(GWEN_LOGDOMAIN, "<%s> tag has no \"type\" property", type);
gtype="";
gn=n;
}
else {
gn=GWEN_MsgEngine_FindNodeByProperty(e, type, "id", gversion, gtype);
if (!gn) {
DBG_INFO(GWEN_LOGDOMAIN, "Definition for type \"%s\" not found", type);
GWEN_Buffer_free(delimBuffer);
return -1;
}
}
/* get configuration */
loopNr=0;
abortLoop=0;
while ((maxnum==0 || loopNr<maxnum) && !abortLoop) {
int c;
DBG_DEBUG(GWEN_LOGDOMAIN, "Reading group type %s", gtype);
if (GWEN_Buffer_GetBytesLeft(msgbuf)==0)
break;
c=GWEN_Buffer_PeekByte(msgbuf);
if (c && strchr(GWEN_Buffer_GetStart(delimBuffer), c)) {
abortLoop=1;
}
else {
gname=GWEN_XMLNode_GetProperty(n, "name", 0);
if (gname) {
DBG_DEBUG(GWEN_LOGDOMAIN, "Creating group \"%s\"", gname);
gcfg=GWEN_DB_GetGroup(gr, GWEN_PATH_FLAGS_CREATE_GROUP, gname);
if (!gcfg) {
DBG_ERROR(GWEN_LOGDOMAIN, "Could not select group \"%s\"", gname);
GWEN_Buffer_free(delimBuffer);
return -1;
}
DBG_DEBUG(GWEN_LOGDOMAIN, "Created group \"%s\"", gname);
} /* if name given */
else
gcfg=gr;
/* read group */
DBG_DEBUG(GWEN_LOGDOMAIN, "Reading group \"%s\"", gname);
if (GWEN_MsgEngine__ReadGroup(e,
msgbuf,
gn,
n,
gcfg,
GWEN_Buffer_GetStart(delimBuffer),
flags)) {
DBG_INFO(GWEN_LOGDOMAIN, "Could not read group \"%s\"", gtype);
GWEN_Buffer_free(delimBuffer);
return -1;
}
}
if (GWEN_Buffer_GetBytesLeft(msgbuf)) {
if (delimiter) {
if (GWEN_Buffer_PeekByte(msgbuf)==delimiter) {
GWEN_Buffer_IncrementPos(msgbuf, 1);
if (abortLoop && maxnum) {
uint32_t loopOpt=loopNr+1;
if (maxnum-loopOpt>GWEN_Buffer_GetBytesLeft(msgbuf))
/* Suspicious but not necessarily invalid, let's see */
maxnum=loopOpt+GWEN_Buffer_GetBytesLeft(msgbuf);
for (; loopOpt<maxnum; loopOpt++) {
if (GWEN_Buffer_PeekByte(msgbuf)!=delimiter)
break;
GWEN_Buffer_IncrementPos(msgbuf, 1);
}
if (loopOpt+1==maxnum && terminator) {
if (GWEN_Buffer_PeekByte(msgbuf)==terminator) {
GWEN_Buffer_IncrementPos(msgbuf, 1);
loopOpt++;
}
}
if (loopOpt<maxnum) {
DBG_ERROR(GWEN_LOGDOMAIN,
"Delimiting character missing (pos=%d [%x]) "
"expecting \"%c\", got \"%c\")",
GWEN_Buffer_GetPos(msgbuf),
GWEN_Buffer_GetPos(msgbuf),
delimiter,
GWEN_Buffer_PeekByte(msgbuf));
GWEN_XMLNode_Dump(n, 2);
GWEN_Buffer_free(delimBuffer);
return -1;
}
}
}
}
}
loopNr++;
} /* while */
if (loopNr<minnum) {
DBG_ERROR(GWEN_LOGDOMAIN, "Premature end of message (too few group repeats)");
GWEN_Buffer_free(delimBuffer);
return -1;
}
n=GWEN_XMLNode_Next(n);
} /* if GROUP */
} /* if TAG */
else {
......
strcasecmp(GWEN_XMLNode_GetData(n), "GROUP")==0) {
unsigned int i;
i=GWEN_XMLNode_GetIntProperty(n, "minnum", 1);
if (i) {
DBG_ERROR(GWEN_LOGDOMAIN, "Premature end of message (still tags to parse)");
GWEN_XMLNode_Dump(n, 2);
GWEN_Buffer_free(delimBuffer);
return -1;
}
i=atoi(GWEN_XMLNode_GetProperty(n, "minnum", "1"));
if (i) {
DBG_ERROR(GWEN_LOGDOMAIN, "Premature end of message (still tags to parse)");
GWEN_XMLNode_Dump(n, 2);
GWEN_Buffer_free(delimBuffer);
return -1;
}
}
}
n=GWEN_XMLNode_Next(n);
......
GWEN_Buffer_GetPos(msgbuf),
terminator,
GWEN_Buffer_PeekByte(msgbuf));
GWEN_XMLNode_Dump(xmlNode, 1);
GWEN_XMLNode_Dump(node, 1);
GWEN_Buffer_free(delimBuffer);
return -1;
}
......
int _groupReadGroup(GWEN_MSGENGINE *e,
GWEN_BUFFER *msgbuf,
const char *type,
GWEN_XMLNODE *xmlNode,
GWEN_DB_NODE *dbData,
char currentDelimiter,
char currentTerminator,
const char *delimiters,
uint32_t flags)
{
GWEN_XMLNODE *xmlReferredNode;
GWEN_DB_NODE *gcfg;
const char *gname;
const char *gtype;
unsigned int minnum;
unsigned int maxnum;
unsigned int gversion;
int abortLoop;
unsigned int loopNr;
DBG_VERBOUS(GWEN_LOGDOMAIN, "Reading group");
minnum=GWEN_XMLNode_GetIntProperty(xmlNode, "minnum", 1);
maxnum=GWEN_XMLNode_GetIntProperty(xmlNode, "maxnum", 1);
gversion=GWEN_XMLNode_GetIntProperty(xmlNode, "version", 0);
gtype=GWEN_XMLNode_GetProperty(xmlNode, "type", 0);
if (!gtype) {
/* no "type" property, so use this group directly */
DBG_INFO(GWEN_LOGDOMAIN, "<%s> tag has no \"type\" property", type);
gtype="";
xmlReferredNode=xmlNode;
}
else {
xmlReferredNode=GWEN_MsgEngine_FindNodeByProperty(e, type, "id", gversion, gtype);
if (!xmlReferredNode) {
DBG_INFO(GWEN_LOGDOMAIN, "Definition for type \"%s\" not found", type);
return GWEN_ERROR_GENERIC;
}
}
/* get configuration */
loopNr=0;
abortLoop=0;
while ((maxnum==0 || loopNr<maxnum) && !abortLoop) {
int c;
DBG_DEBUG(GWEN_LOGDOMAIN, "Reading group type %s", gtype);
if (GWEN_Buffer_GetBytesLeft(msgbuf)==0)
break;
c=GWEN_Buffer_PeekByte(msgbuf);
if (c && strchr(delimiters, c)) {
abortLoop=1;
}
else {
gname=GWEN_XMLNode_GetProperty(xmlNode, "name", 0);
if (gname) {
DBG_DEBUG(GWEN_LOGDOMAIN, "Creating group \"%s\"", gname);
gcfg=GWEN_DB_GetGroup(dbData, GWEN_PATH_FLAGS_CREATE_GROUP, gname);
if (!gcfg) {
DBG_ERROR(GWEN_LOGDOMAIN, "Could not select group \"%s\"", gname);
return GWEN_ERROR_GENERIC;
}
DBG_DEBUG(GWEN_LOGDOMAIN, "Created group \"%s\"", gname);
} /* if name given */
else
gcfg=dbData;
/* read group */
DBG_DEBUG(GWEN_LOGDOMAIN, "Reading group \"%s\"", gname);
if (GWEN_MsgEngine__ReadGroup(e,
msgbuf,
xmlReferredNode,
xmlNode,
gcfg,
delimiters,
flags)) {
DBG_INFO(GWEN_LOGDOMAIN, "Could not read group \"%s\"", gtype);
return GWEN_ERROR_GENERIC;
}
}
if (GWEN_Buffer_GetBytesLeft(msgbuf)) {
if (currentDelimiter) {
if (GWEN_Buffer_PeekByte(msgbuf)==currentDelimiter) {
GWEN_Buffer_IncrementPos(msgbuf, 1);
if (abortLoop && maxnum) {
uint32_t loopOpt=loopNr+1;
if (maxnum-loopOpt>GWEN_Buffer_GetBytesLeft(msgbuf))
/* Suspicious but not necessarily invalid, let's see */
maxnum=loopOpt+GWEN_Buffer_GetBytesLeft(msgbuf);
for (; loopOpt<maxnum; loopOpt++) {
if (GWEN_Buffer_PeekByte(msgbuf)!=currentDelimiter)
break;
GWEN_Buffer_IncrementPos(msgbuf, 1);
}
if (loopOpt+1==maxnum && currentTerminator) {
if (GWEN_Buffer_PeekByte(msgbuf)==currentTerminator) {
GWEN_Buffer_IncrementPos(msgbuf, 1);
loopOpt++;
}
}
if (loopOpt<maxnum) {
DBG_ERROR(GWEN_LOGDOMAIN,
"Delimiting character missing (pos=%d [%x]) "
"expecting \"%c\", got \"%c\")",
GWEN_Buffer_GetPos(msgbuf),
GWEN_Buffer_GetPos(msgbuf),
currentDelimiter,
GWEN_Buffer_PeekByte(msgbuf));
GWEN_XMLNode_Dump(xmlNode, 2);
return GWEN_ERROR_GENERIC;
}
}
}
}
}
loopNr++;
} /* while */
if (loopNr<minnum) {
DBG_ERROR(GWEN_LOGDOMAIN, "Premature end of message (too few group repeats)");
return GWEN_ERROR_GENERIC;
}
return 0;
}
int _groupReadElement(GWEN_MSGENGINE *e,
GWEN_BUFFER *msgbuf,
GWEN_XMLNODE *n,
GWEN_XMLNODE *xmlReferencingNode,
GWEN_DB_NODE *dbData,
GWEN_XMLNODE *rnode,
GWEN_DB_NODE *gr,
char currentDelimiter,
char currentTerminator,
const char *delimiters,
......
/* get some sizes */
//minsize=atoi(GWEN_XMLNode_GetProperty(n, "minsize","0"));
//maxsize=atoi(GWEN_XMLNode_GetProperty(n, "maxsize","0"));
minnum=GWEN_XMLNode_GetIntProperty(n, "minnum", 1);
maxnum=GWEN_XMLNode_GetIntProperty(n, "maxnum", 1);
minnum=atoi(GWEN_XMLNode_GetProperty(n, "minnum", "1"));
maxnum=atoi(GWEN_XMLNode_GetProperty(n, "maxnum", "1"));
name=GWEN_XMLNode_GetProperty(n, "name", 0);
loopNr=0;
......
1);
#endif
rv=_readValue(e, msgbuf, n, xmlReferencingNode, vbuf, delimiters, flags);
rv=_readValue(e, msgbuf, n, rnode, vbuf, delimiters, flags);
if (rv==1) {
DBG_INFO(GWEN_LOGDOMAIN, "Empty value");
}
else if (rv==-1) {
DBG_INFO(GWEN_LOGDOMAIN, "Error parsing xmlNode \"%s\" (ELEM)", name);
DBG_INFO(GWEN_LOGDOMAIN, "Error parsing node \"%s\" (ELEM)", name);
GWEN_Buffer_free(vbuf);
return -1;
}
......
dtype=GWEN_XMLNode_GetProperty(n, "type", "");
if (GWEN_MsgEngine__IsBinTyp(e, dtype)) {
if (atoi(GWEN_XMLNode_GetProperty(n, "readbin", "1")) && e->binTypeReadPtr) {
rv=e->binTypeReadPtr(e, n, dbData, vbuf);
rv=e->binTypeReadPtr(e, n, gr, vbuf);
}
else
rv=1;
......
}
else if (rv==1) {
/* bin type not handled, so handle it myself */
if (GWEN_DB_SetBinValue(dbData,
if (GWEN_DB_SetBinValue(gr,
GWEN_DB_FLAGS_DEFAULT,
name,
GWEN_Buffer_GetStart(vbuf),
......
DBG_INFO(GWEN_LOGDOMAIN, "Value for \"%s\" is not an integer", name);
return -1;
}
if (GWEN_DB_SetIntValue(dbData, GWEN_DB_FLAGS_DEFAULT, name, z)) {
if (GWEN_DB_SetIntValue(gr, GWEN_DB_FLAGS_DEFAULT, name, z)) {
DBG_INFO(GWEN_LOGDOMAIN, "Could not set int value for \"%s\"", name);
return -1;
}
} /* if type is int */
else {
DBG_DEBUG(GWEN_LOGDOMAIN, "Value is \"%s\"", GWEN_Buffer_GetStart(vbuf));
if (GWEN_DB_SetCharValue(dbData,
if (GWEN_DB_SetCharValue(gr,
GWEN_DB_FLAGS_DEFAULT,
name,
GWEN_Buffer_GetStart(vbuf))) {
......
int _readValue(GWEN_MSGENGINE *e,
GWEN_BUFFER *msgbuf,
GWEN_XMLNODE *xmlNode,
GWEN_XMLNODE *xmlReferencingNode,
GWEN_XMLNODE *node,
GWEN_XMLNODE *rnode,
GWEN_BUFFER *vbuf,
const char *delimiters,
uint32_t flags)
......
/* get some sizes */
//posInMsg=GWEN_Buffer_GetPos(msgbuf);
realSize=0;
size=atoi(GWEN_XMLNode_GetProperty(xmlNode, "size", "0"));
minsize=GWEN_XMLNode_GetIntProperty(xmlNode, "minsize", 0);
maxsize=GWEN_XMLNode_GetIntProperty(xmlNode, "maxsize", 0);
minnum=GWEN_XMLNode_GetIntProperty(xmlNode, "minnum", 0);
type=GWEN_XMLNode_GetProperty(xmlNode, "type", "ASCII");
size=atoi(GWEN_XMLNode_GetProperty(node, "size", "0"));
minsize=GWEN_XMLNode_GetIntProperty(node, "minsize", 0);
maxsize=GWEN_XMLNode_GetIntProperty(node, "maxsize", 0);
minnum=GWEN_XMLNode_GetIntProperty(node, "minnum", 0);
type=GWEN_XMLNode_GetProperty(node, "type", "ASCII");
rv=1;
if (e->typeReadPtr) {
rv=e->typeReadPtr(e, msgbuf, xmlNode, vbuf, e->escapeChar, delimiters);
rv=e->typeReadPtr(e, msgbuf, node, vbuf, e->escapeChar, delimiters);
}
if (rv<0) {
DBG_INFO(GWEN_LOGDOMAIN, "External type reading failed on type \"%s\" (%d)", type, rv);
......
}
else {
DBG_ERROR(GWEN_LOGDOMAIN, "Value missing");
GWEN_XMLNode_Dump(xmlNode, 1);
GWEN_XMLNode_Dump(node, 1);
return GWEN_ERROR_GENERIC;
}
}
......
/* add trust data to msgEngine */
const char *descr;
trustLevel=GWEN_MsgEngine_GetHighestTrustLevel(xmlNode, xmlReferencingNode);
trustLevel=GWEN_MsgEngine_GetHighestTrustLevel(node, rnode);
if (trustLevel) {
unsigned int ustart;
ustart=GWEN_Buffer_GetPos(msgbuf)-realSize;
descr=GWEN_XMLNode_GetProperty(xmlNode, "name", 0);
descr=GWEN_XMLNode_GetProperty(node, "name", 0);
if (GWEN_MsgEngine_AddTrustInfo(e,
GWEN_Buffer_GetStart(vbuf),
realSize,

Auch abrufbar als: Unified diff