Revision 9300d8b9
Von admin vor etwa 6 Jahren hinzugefügt
| 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
Revert "MsgEngine: More work on improving maintainability."
This reverts commit 6c2f9046916ed0efcc6b40c07e6bd2b916959769.