lost: adds HELD (RFC6155) and LOST (RFC5222) queries for location-based routing
[sip-router] / src / modules / lost / pidf.c
1 /*\r
2  * $Id: pidf.c 1953 2007-04-04 08:50:33Z anca_vamanu $\r
3  *\r
4  * presence module - presence server implementation\r
5  *\r
6  * Copyright (C) 2006 Voice Sistem S.R.L.\r
7  *\r
8  * This file is part of Kamailio, a free SIP server.\r
9  *\r
10  * Kamailio is free software; you can redistribute it and/or modify\r
11  * it under the terms of the GNU General Public License as published by\r
12  * the Free Software Foundation; either version 2 of the License, or\r
13  * (at your option) any later version\r
14  *\r
15  * Kamailio is distributed in the hope that it will be useful,\r
16  * but WITHOUT ANY WARRANTY; without even the implied warranty of\r
17  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r
18  * GNU General Public License for more details.\r
19  *\r
20  * You should have received a copy of the GNU General Public License\r
21  * along with this program; if not, write to the Free Software\r
22  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA\r
23  *\r
24  * History:\r
25  * --------\r
26  *  2007-04-14  initial version (anca)\r
27  */\r
28 \r
29 /*! \file\r
30  * \brief Kamailio lost ::  PIDF handling\r
31  * \ingroup lost\r
32  */\r
33 \r
34 \r
35 /**\r
36  * make strptime available\r
37  * use 600 for 'Single UNIX Specification, Version 3'\r
38  * _XOPEN_SOURCE creates conflict in header definitions in Solaris\r
39  */\r
40 #ifndef __OS_solaris\r
41 #define _XOPEN_SOURCE 600 /* glibc2 on linux, bsd */\r
42 #define _BSD_SOURCE \\r
43         1                                         /* needed on linux to "fix" the effect\r
44                                                                                   of the above define on\r
45                                                                                   features.h/unistd.h syscall() */\r
46 #define _DEFAULT_SOURCE 1 /* _BSD_SOURCE is deprecated */\r
47 #define _DARWIN_C_SOURCE 1\r
48 #else\r
49 #define _XOPEN_SOURCE_EXTENDED 1 /* solaris */\r
50 #endif\r
51 \r
52 #include <time.h>\r
53 \r
54 #undef _XOPEN_SOURCE\r
55 #undef _XOPEN_SOURCE_EXTENDED\r
56 \r
57 #include <string.h>\r
58 #include <stdlib.h>\r
59 #include <libxml/parser.h>\r
60 \r
61 #include "../../core/mem/mem.h"\r
62 #include "../../core/dprint.h"\r
63 \r
64 #include "pidf.h"\r
65 \r
66 xmlAttrPtr xmlNodeGetAttrByName(xmlNodePtr node, const char *name)\r
67 {\r
68         xmlAttrPtr attr = node->properties;\r
69         while(attr) {\r
70                 if(xmlStrcasecmp(attr->name, (unsigned char *)name) == 0)\r
71                         return attr;\r
72                 attr = attr->next;\r
73         }\r
74         return NULL;\r
75 }\r
76 \r
77 char *xmlNodeGetAttrContentByName(xmlNodePtr node, const char *name)\r
78 {\r
79         xmlAttrPtr attr = xmlNodeGetAttrByName(node, name);\r
80         if(attr)\r
81                 return (char *)xmlNodeGetContent(attr->children);\r
82         else\r
83                 return NULL;\r
84 }\r
85 \r
86 xmlNodePtr xmlNodeGetChildByName(xmlNodePtr node, const char *name)\r
87 {\r
88         xmlNodePtr cur = node->children;\r
89         while(cur) {\r
90                 if(xmlStrcasecmp(cur->name, (unsigned char *)name) == 0)\r
91                         return cur;\r
92                 cur = cur->next;\r
93         }\r
94         return NULL;\r
95 }\r
96 \r
97 xmlNodePtr xmlNodeGetNodeByName(\r
98                 xmlNodePtr node, const char *name, const char *ns)\r
99 {\r
100         xmlNodePtr cur = node;\r
101         while(cur) {\r
102                 xmlNodePtr match = NULL;\r
103                 if(xmlStrcasecmp(cur->name, (unsigned char *)name) == 0) {\r
104                         if(!ns\r
105                                         || (cur->ns\r
106                                                            && xmlStrcasecmp(\r
107                                                                                   cur->ns->prefix, (unsigned char *)ns)\r
108                                                                                   == 0))\r
109                                 return cur;\r
110                 }\r
111                 match = xmlNodeGetNodeByName(cur->children, name, ns);\r
112                 if(match)\r
113                         return match;\r
114                 cur = cur->next;\r
115         }\r
116         return NULL;\r
117 }\r
118 \r
119 char *xmlNodeGetNodeContentByName(\r
120                 xmlNodePtr root, const char *name, const char *ns)\r
121 {\r
122         xmlNodePtr node = xmlNodeGetNodeByName(root, name, ns);\r
123         if(node)\r
124                 return (char *)xmlNodeGetContent(node->children);\r
125         else\r
126                 return NULL;\r
127 }\r
128 \r
129 xmlNodePtr xmlDocGetNodeByName(xmlDocPtr doc, const char *name, const char *ns)\r
130 {\r
131         xmlNodePtr cur = doc->children;\r
132         return xmlNodeGetNodeByName(cur, name, ns);\r
133 }\r
134 \r
135 char *xmlDocGetNodeContentByName(\r
136                 xmlDocPtr doc, const char *name, const char *ns)\r
137 {\r
138         xmlNodePtr node = xmlDocGetNodeByName(doc, name, ns);\r
139         if(node)\r
140                 return (char *)xmlNodeGetContent(node->children);\r
141         else\r
142                 return NULL;\r
143 }\r