/* $Id: igd_desc_parse.c,v 1.8 2008/04/23 11:51:06 nanard Exp $ */ /* Project : miniupnp * http://miniupnp.free.fr/ * Author : Thomas Bernard * Copyright (c) 2005-2008 Thomas Bernard * This software is subject to the conditions detailed in the * LICENCE file provided in this distribution. * */ #include "igd_desc_parse.h" #include #include /* TODO : rewrite this code so it correctly handle descriptions with * both WANIPConnection and/or WANPPPConnection */ /* Start element handler : * update nesting level counter and copy element name */ void IGDstartelt(void * d, const char * name, int l) { struct IGDdatas * datas = (struct IGDdatas *)d; memcpy( datas->cureltname, name, l); datas->cureltname[l] = '\0'; datas->level++; if( (l==7) && !memcmp(name, "service", l) ) { datas->controlurl_tmp[0] = '\0'; datas->eventsuburl_tmp[0] = '\0'; datas->scpdurl_tmp[0] = '\0'; datas->servicetype_tmp[0] = '\0'; } } /* End element handler : * update nesting level counter and update parser state if * service element is parsed */ void IGDendelt(void * d, const char * name, int l) { struct IGDdatas * datas = (struct IGDdatas *)d; datas->level--; /*printf("endelt %2d %.*s\n", datas->level, l, name);*/ if( (l==7) && !memcmp(name, "service", l) ) { /* if( datas->state < 1 && !strcmp(datas->servicetype, // "urn:schemas-upnp-org:service:WANIPConnection:1") ) "urn:schemas-upnp-org:service:WANCommonInterfaceConfig:1")) datas->state ++; */ if(0==strcmp(datas->servicetype_tmp, "urn:schemas-upnp-org:service:WANCommonInterfaceConfig:1")) { memcpy(datas->controlurl_CIF, datas->controlurl_tmp, MINIUPNPC_URL_MAXSIZE); memcpy(datas->eventsuburl_CIF, datas->eventsuburl_tmp, MINIUPNPC_URL_MAXSIZE); memcpy(datas->scpdurl_CIF, datas->scpdurl_tmp, MINIUPNPC_URL_MAXSIZE); memcpy(datas->servicetype_CIF, datas->servicetype_tmp, MINIUPNPC_URL_MAXSIZE); } else if(0==strcmp(datas->servicetype_tmp, "urn:schemas-upnp-org:service:WANIPConnection:1") || 0==strcmp(datas->servicetype_tmp, "urn:schemas-upnp-org:service:WANPPPConnection:1") ) { memcpy(datas->controlurl, datas->controlurl_tmp, MINIUPNPC_URL_MAXSIZE); memcpy(datas->eventsuburl, datas->eventsuburl_tmp, MINIUPNPC_URL_MAXSIZE); memcpy(datas->scpdurl, datas->scpdurl_tmp, MINIUPNPC_URL_MAXSIZE); memcpy(datas->servicetype, datas->servicetype_tmp, MINIUPNPC_URL_MAXSIZE); } } } /* Data handler : * copy data depending on the current element name and state */ void IGDdata(void * d, const char * data, int l) { struct IGDdatas * datas = (struct IGDdatas *)d; char * dstmember = 0; /*printf("%2d %s : %.*s\n", datas->level, datas->cureltname, l, data); */ if( !strcmp(datas->cureltname, "URLBase") ) dstmember = datas->urlbase; else if( !strcmp(datas->cureltname, "serviceType") ) dstmember = datas->servicetype_tmp; else if( !strcmp(datas->cureltname, "controlURL") ) dstmember = datas->controlurl_tmp; else if( !strcmp(datas->cureltname, "eventSubURL") ) dstmember = datas->eventsuburl_tmp; else if( !strcmp(datas->cureltname, "SCPDURL") ) dstmember = datas->scpdurl_tmp; /* else if( !strcmp(datas->cureltname, "deviceType") ) dstmember = datas->devicetype_tmp;*/ if(dstmember) { if(l>=MINIUPNPC_URL_MAXSIZE) l = MINIUPNPC_URL_MAXSIZE-1; memcpy(dstmember, data, l); dstmember[l] = '\0'; } } void printIGD(struct IGDdatas * d) { printf("urlbase = %s\n", d->urlbase); printf("WAN Device (Common interface config) :\n"); /*printf(" deviceType = %s\n", d->devicetype_CIF);*/ printf(" serviceType = %s\n", d->servicetype_CIF); printf(" controlURL = %s\n", d->controlurl_CIF); printf(" eventSubURL = %s\n", d->eventsuburl_CIF); printf(" SCPDURL = %s\n", d->scpdurl_CIF); printf("WAN Connection Device (IP or PPP Connection):\n"); /*printf(" deviceType = %s\n", d->devicetype);*/ printf(" servicetype = %s\n", d->servicetype); printf(" controlURL = %s\n", d->controlurl); printf(" eventSubURL = %s\n", d->eventsuburl); printf(" SCPDURL = %s\n", d->scpdurl); }