presence_dialoginfo(k): fix bsd compilation
[sip-router] / modules_k / presence_dialoginfo / 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., 59 Temple Place, Suite 330, Boston, MA  02111-1307  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 #ifdef __OS_linux
40         #define _XOPEN_SOURCE 600          /* glibc2 on linux */
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 #elif defined __OS_solaris
45         #define _XOPEN_SOURCE_EXTENDED 1   /* solaris */
46 #endif
47
48 #include <time.h>
49
50 #undef _XOPEN_SOURCE
51 #undef _XOPEN_SOURCE_EXTENDED
52
53 #include <string.h>
54 #include <stdlib.h>
55 #include <libxml/parser.h>
56 #include "../../dprint.h"
57 #include "../../sr_module.h"
58 #include "pidf.h"
59
60 xmlAttrPtr xmlNodeGetAttrByName(xmlNodePtr node, const char *name)
61 {
62         xmlAttrPtr attr = node->properties;
63         while (attr) {
64                 if (xmlStrcasecmp(attr->name, (unsigned char*)name) == 0)
65                         return attr;
66                 attr = attr->next;
67         }
68         return NULL;
69 }
70
71 char *xmlNodeGetAttrContentByName(xmlNodePtr node, const char *name)
72 {
73         xmlAttrPtr attr = xmlNodeGetAttrByName(node, name);
74         if (attr)
75                 return (char*)xmlNodeGetContent(attr->children);
76         else
77                 return NULL;
78 }
79
80 xmlNodePtr xmlNodeGetChildByName(xmlNodePtr node, const char *name)
81 {
82         xmlNodePtr cur = node->children;
83         while (cur) {
84                 if (xmlStrcasecmp(cur->name, (unsigned char*)name) == 0)
85                         return cur;
86                 cur = cur->next;
87         }
88         return NULL;
89 }
90
91 xmlNodePtr xmlNodeGetNodeByName(xmlNodePtr node, const char *name,
92                                                                                                                         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