all: updated FSF address in GPL text
[sip-router] / modules / presence_conference / pidf.c
1 /*
2  * $Id: pidf.c 1953 2007-04-04 08:50:33Z anca_vamanu $
3  *
4  * presence module - presence server implementation
5  *
6  * Copyright (C) 2006 Voice Sistem S.R.L.
7  *
8  * This file is part of Kamailio, a free SIP server.
9  *
10  * Kamailio is free software; you can redistribute it and/or modify
11  * it under the terms of the GNU General Public License as published by
12  * the Free Software Foundation; either version 2 of the License, or
13  * (at your option) any later version
14  *
15  * Kamailio is distributed in the hope that it will be useful,
16  * but WITHOUT ANY WARRANTY; without even the implied warranty of
17  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18  * GNU General Public License for more details.
19  *
20  * You should have received a copy of the GNU General Public License 
21  * along with this program; if not, write to the Free Software 
22  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
23  *
24  * History:
25  * --------
26  *  2007-04-14  initial version (anca)
27  */
28
29 /*! \file
30  * \brief Kamailio Presence_XML ::  PIDF handling
31  * \ingroup presence_xml
32  */
33
34 /**
35  * make strptime available
36  * use 600 for 'Single UNIX Specification, Version 3'
37  * _XOPEN_SOURCE creates conflict in header definitions in Solaris
38  */
39 #ifndef __OS_solaris
40         #define _XOPEN_SOURCE 600          /* glibc2 on linux, bsd */
41         #define _BSD_SOURCE 1                           /* needed on linux to "fix" the effect
42                                                                                   of the above define on
43                                                                                   features.h/unistd.h syscall() */
44    #define _DARWIN_C_SOURCE 1
45 #else
46         #define _XOPEN_SOURCE_EXTENDED 1   /* solaris */
47 #endif
48
49 #include <time.h>
50
51 #undef _XOPEN_SOURCE
52 #undef _XOPEN_SOURCE_EXTENDED
53
54 #include <string.h>
55 #include <stdlib.h>
56 #include <libxml/parser.h>
57 #include "../../dprint.h"
58 #include "../../sr_module.h"
59 #include "pidf.h"
60
61 xmlAttrPtr xmlNodeGetAttrByName(xmlNodePtr node, const char *name)
62 {
63         xmlAttrPtr attr = node->properties;
64         while (attr) {
65                 if (xmlStrcasecmp(attr->name, (unsigned char*)name) == 0)
66                         return attr;
67                 attr = attr->next;
68         }
69         return NULL;
70 }
71
72 char *xmlNodeGetAttrContentByName(xmlNodePtr node, const char *name)
73 {
74         xmlAttrPtr attr = xmlNodeGetAttrByName(node, name);
75         if (attr)
76                 return (char*)xmlNodeGetContent(attr->children);
77         else
78                 return NULL;
79 }
80
81 xmlNodePtr xmlNodeGetChildByName(xmlNodePtr node, const char *name)
82 {
83         xmlNodePtr cur = node->children;
84         while (cur) {
85                 if (xmlStrcasecmp(cur->name, (unsigned char*)name) == 0)
86                         return cur;
87                 cur = cur->next;
88         }
89         return NULL;
90 }
91
92 xmlNodePtr xmlNodeGetNodeByName(xmlNodePtr node, const char *name, const char *ns)
93 {
94         xmlNodePtr cur = node;
95         while (cur) {
96                 xmlNodePtr match = NULL;
97                 if (xmlStrcasecmp(cur->name, (unsigned char*)name) == 0) {
98                         if (!ns || (cur->ns && xmlStrcasecmp(cur->ns->prefix,
99                                                         (unsigned char*)ns) == 0))
100                                 return cur;
101                 }
102                 match = xmlNodeGetNodeByName(cur->children, name, ns);
103                 if (match)
104                         return match;
105                 cur = cur->next;
106         }
107         return NULL;
108 }
109
110 char *xmlNodeGetNodeContentByName(xmlNodePtr root, const char *name,
111                 const char *ns)
112 {
113         xmlNodePtr node = xmlNodeGetNodeByName(root, name, ns);
114         if (node)
115                 return (char*)xmlNodeGetContent(node->children);
116         else
117                 return NULL;
118 }
119
120 xmlNodePtr xmlDocGetNodeByName(xmlDocPtr doc, const char *name, const char *ns)
121 {
122         xmlNodePtr cur = doc->children;
123         return xmlNodeGetNodeByName(cur, name, ns);
124 }
125
126 char *xmlDocGetNodeContentByName(xmlDocPtr doc, const char *name, 
127                 const char *ns)
128 {
129         xmlNodePtr node = xmlDocGetNodeByName(doc, name, ns);
130         if (node)
131                 return (char*)xmlNodeGetContent(node->children);
132         else
133                 return NULL;
134 }
135
136 time_t xml_parse_dateTime(char* xml_time_str)
137 {
138         struct tm tm;
139         char * p;
140         int h, m;
141         char h1, h2, m1, m2;
142         int sign= 1;
143         signed int timezone_diff= 0;
144
145         p= strptime(xml_time_str, "%F", &tm);
146         if(p== NULL)
147         {
148                 printf("error: failed to parse time\n");
149                 return 0;
150         }
151         p++;
152         p= strptime(p, "%T", &tm);
153         if(p== NULL)
154         {
155                 printf("error: failed to parse time\n");
156                 return 0;
157         }
158         
159         if(*p== '\0')
160                 goto done;
161
162         if(*p== '.')
163         {
164                 p++;
165                 /* read the fractionar part of the seconds*/
166                 while(*p!= '\0' && *p>= '0' && *p<= '9')
167                 {
168                         p++;
169                 }
170         }
171
172         if(*p== '\0')
173                 goto done;
174
175         
176         /* read time zone */
177
178         if(*p== 'Z')
179         {
180                 goto done;
181         }
182
183         if(*p== '+')
184                 sign= -1;
185
186         p++;
187
188         if(sscanf(p, "%c%c:%c%c", &h1, &h2, &m1, &m2) < 0) {
189                 printf("error: failed to parse time\n");
190                 return 0;
191         }
192         
193         h= (h1- '0')*10+ h2- '0';
194         m= (m1- '0')*10+ m2- '0';
195
196         timezone_diff= sign* ((m+ h* 60)* 60);
197
198 done:
199         return (mktime(&tm) + timezone_diff);   
200 }
201
202