1/* $Id: igd_desc_parse.c,v 1.17 2015/09/15 13:30:04 nanard Exp $ */
2/* Project : miniupnp
3 * http://miniupnp.free.fr/
4 * Author : Thomas Bernard
5 * Copyright (c) 2005-2015 Thomas Bernard
6 * This software is subject to the conditions detailed in the
7 * LICENCE file provided in this distribution. */
8
9#include "igd_desc_parse.h"
10#include <stdio.h>
11#include <string.h>
12
13/* Start element handler :
14 * update nesting level counter and copy element name */
15void IGDstartelt(void * d, const char * name, int l)
16{
17 struct IGDdatas * datas = (struct IGDdatas *)d;
18 if(l >= MINIUPNPC_URL_MAXSIZE)
19 l = MINIUPNPC_URL_MAXSIZE-1;
20 memcpy(datas->cureltname, name, l);
21 datas->cureltname[l] = '\0';
22 datas->level++;
23 if( (l==7) && !memcmp(name, "service", l) ) {
24 datas->tmp.controlurl[0] = '\0';
25 datas->tmp.eventsuburl[0] = '\0';
26 datas->tmp.scpdurl[0] = '\0';
27 datas->tmp.servicetype[0] = '\0';
28 }
29}
30
31#define COMPARE(str, cstr) (0==memcmp(str, cstr, sizeof(cstr) - 1))
32
33/* End element handler :
34 * update nesting level counter and update parser state if
35 * service element is parsed */
36void IGDendelt(void * d, const char * name, int l)
37{
38 struct IGDdatas * datas = (struct IGDdatas *)d;
39 datas->level--;
40 /*printf("endelt %2d %.*s\n", datas->level, l, name);*/
41 if( (l==7) && !memcmp(name, "service", l) )
42 {
43 if(COMPARE(datas->tmp.servicetype,
44 "urn:schemas-upnp-org:service:WANCommonInterfaceConfig:")) {
45 memcpy(&datas->CIF, &datas->tmp, sizeof(struct IGDdatas_service));
46 } else if(COMPARE(datas->tmp.servicetype,
47 "urn:schemas-upnp-org:service:WANIPv6FirewallControl:")) {
48 memcpy(&datas->IPv6FC, &datas->tmp, sizeof(struct IGDdatas_service));
49 } else if(COMPARE(datas->tmp.servicetype,
50 "urn:schemas-upnp-org:service:WANIPConnection:")
51 || COMPARE(datas->tmp.servicetype,
52 "urn:schemas-upnp-org:service:WANPPPConnection:") ) {
53 if(datas->first.servicetype[0] == '\0') {
54 memcpy(&datas->first, &datas->tmp, sizeof(struct IGDdatas_service));
55 } else {
56 memcpy(&datas->second, &datas->tmp, sizeof(struct IGDdatas_service));
57 }
58 }
59 }
60}
61
62/* Data handler :
63 * copy data depending on the current element name and state */
64void IGDdata(void * d, const char * data, int l)
65{
66 struct IGDdatas * datas = (struct IGDdatas *)d;
67 char * dstmember = 0;
68 /*printf("%2d %s : %.*s\n",
69 datas->level, datas->cureltname, l, data); */
70 if( !strcmp(datas->cureltname, "URLBase") )
71 dstmember = datas->urlbase;
72 else if( !strcmp(datas->cureltname, "presentationURL") )
73 dstmember = datas->presentationurl;
74 else if( !strcmp(datas->cureltname, "serviceType") )
75 dstmember = datas->tmp.servicetype;
76 else if( !strcmp(datas->cureltname, "controlURL") )
77 dstmember = datas->tmp.controlurl;
78 else if( !strcmp(datas->cureltname, "eventSubURL") )
79 dstmember = datas->tmp.eventsuburl;
80 else if( !strcmp(datas->cureltname, "SCPDURL") )
81 dstmember = datas->tmp.scpdurl;
82/* else if( !strcmp(datas->cureltname, "deviceType") )
83 dstmember = datas->devicetype_tmp;*/
84 if(dstmember)
85 {
86 if(l>=MINIUPNPC_URL_MAXSIZE)
87 l = MINIUPNPC_URL_MAXSIZE-1;
88 memcpy(dstmember, data, l);
89 dstmember[l] = '\0';
90 }
91}
92
93#ifdef DEBUG
94void printIGD(struct IGDdatas * d)
95{
96 printf("urlbase = '%s'\n", d->urlbase);
97 printf("WAN Device (Common interface config) :\n");
98 /*printf(" deviceType = '%s'\n", d->CIF.devicetype);*/
99 printf(" serviceType = '%s'\n", d->CIF.servicetype);
100 printf(" controlURL = '%s'\n", d->CIF.controlurl);
101 printf(" eventSubURL = '%s'\n", d->CIF.eventsuburl);
102 printf(" SCPDURL = '%s'\n", d->CIF.scpdurl);
103 printf("primary WAN Connection Device (IP or PPP Connection):\n");
104 /*printf(" deviceType = '%s'\n", d->first.devicetype);*/
105 printf(" servicetype = '%s'\n", d->first.servicetype);
106 printf(" controlURL = '%s'\n", d->first.controlurl);
107 printf(" eventSubURL = '%s'\n", d->first.eventsuburl);
108 printf(" SCPDURL = '%s'\n", d->first.scpdurl);
109 printf("secondary WAN Connection Device (IP or PPP Connection):\n");
110 /*printf(" deviceType = '%s'\n", d->second.devicetype);*/
111 printf(" servicetype = '%s'\n", d->second.servicetype);
112 printf(" controlURL = '%s'\n", d->second.controlurl);
113 printf(" eventSubURL = '%s'\n", d->second.eventsuburl);
114 printf(" SCPDURL = '%s'\n", d->second.scpdurl);
115 printf("WAN IPv6 Firewall Control :\n");
116 /*printf(" deviceType = '%s'\n", d->IPv6FC.devicetype);*/
117 printf(" servicetype = '%s'\n", d->IPv6FC.servicetype);
118 printf(" controlURL = '%s'\n", d->IPv6FC.controlurl);
119 printf(" eventSubURL = '%s'\n", d->IPv6FC.eventsuburl);
120 printf(" SCPDURL = '%s'\n", d->IPv6FC.scpdurl);
121}
122#endif /* DEBUG */
123
124