gwenhywfar 5.10.1
xmlglobalize.c
Go to the documentation of this file.
1/***************************************************************************
2 begin : Wed Feb 27 2008
3 copyright : (C) 2008 by Martin Preuss
4 email : martin@libchipcard.de
5
6 ***************************************************************************
7 * *
8 * This library is free software; you can redistribute it and/or *
9 * modify it under the terms of the GNU Lesser General Public *
10 * License as published by the Free Software Foundation; either *
11 * version 2.1 of the License, or (at your option) any later version. *
12 * *
13 * This library is distributed in the hope that it will be useful, *
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of *
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU *
16 * Lesser General Public License for more details. *
17 * *
18 * You should have received a copy of the GNU Lesser General Public *
19 * License along with this library; if not, write to the Free Software *
20 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, *
21 * MA 02111-1307 USA *
22 * *
23 ***************************************************************************/
24
25
26
27
29 const char *s)
30{
32
33 assert(l);
35 while (ns) {
36 const char *d;
37
39 if (d && strcasecmp(d, s)==0)
40 return ns;
42 }
43
44 return NULL;
45}
46
47
48
50 const char *prefix)
51{
52 while (n) {
53 if (n->type==GWEN_XMLNodeTypeTag) {
55
56 DBG_ERROR(0, "Checking in node [%s]", GWEN_XMLNode_GetData(n));
57 ns=GWEN_XMLNode_NameSpace_List_First(n->nameSpaces);
58 while (ns) {
59 const char *d;
60
62 if (d && strcasecmp(d, prefix)==0)
63 return ns;
65 }
66 }
67
68 n=n->parent;
69 }
70
71 return NULL;
72}
73
74
75
78 char **pValue)
79{
81 char *dcopy=NULL;
82 char *v;
83 const char *prefix;
84 const char *name;
85
86 /* split into prefix and value */
87 dcopy=strdup(*pValue);
88 v=strchr(dcopy, ':');
89 if (v) {
90 *v=0;
91 prefix=dcopy;
92 name=v+1;
93 }
94 else {
95 prefix="";
96 name=dcopy;
97 }
98
99 /* find definition for namespace in this and parent nodes */
101 if (ns) {
103
104 /* find new namespace in list of redefined namespaces */
106 if (newNs) {
107 char *newValue;
108
109 /* translate prefix part of the name */
110 newValue=(char *)malloc(strlen(GWEN_XMLNode_NameSpace_GetName(newNs))+
111 strlen(name)+1+1);
112 assert(newValue);
113 strcpy(newValue, GWEN_XMLNode_NameSpace_GetName(newNs));
114 strcat(newValue, ":");
115 strcat(newValue, name);
116 free(*pValue);
117 *pValue=newValue;
118 }
119 else {
121 "Namespace for [%s] not in list, should not happen.",
123 abort();
124 }
125 free(dcopy);
126 }
127 else {
128 DBG_ERROR(GWEN_LOGDOMAIN, "No definition for namespace \"%s\" found", prefix);
129 free(dcopy);
130 return GWEN_ERROR_NO_DATA;
131 }
132
133 return 0;
134}
135
136
137
140 uint32_t *pLastId)
141{
142 GWEN_XMLNODE *nn;
143
144 if (n->type==GWEN_XMLNodeTypeTag) {
147 int rv;
148
149 ns=GWEN_XMLNode_NameSpace_List_First(n->nameSpaces);
150 while (ns) {
151 const char *url;
152
154 if (url) {
156 char namebuf[32];
158
159 snprintf(namebuf, sizeof(namebuf)-1, "_%d_", ++(*pLastId));
160 newNs=GWEN_XMLNode_NameSpace_new(namebuf, url);
162 }
163 }
165 }
166
167 /* translate some properties */
168 pr=n->properties;
169 while (pr) {
170 if (pr->name && pr->value) {
171 if (strcasecmp(pr->name, "type")==0 ||
172 strcasecmp(pr->name, "ref")==0 ||
173 strcasecmp(pr->name, "base")==0) {
174 rv=GWEN_XMLGL__TranslateName(n, l, &(pr->value));
175 if (rv) {
176 DBG_INFO(GWEN_LOGDOMAIN, "here (%d)", rv);
177 return rv;
178 }
179 }
180 }
181 pr=pr->next;
182 }
183
184 /* translate this node */
185 if (n->data) {
186 rv=GWEN_XMLGL__TranslateName(n, l, &(n->data));
187 if (rv) {
188 DBG_INFO(GWEN_LOGDOMAIN, "here (%d)", rv);
189 return rv;
190 }
191 }
192 }
193
194 /* sample and rename children */
195 nn=GWEN_XMLNode_List_First(n->children);
196 while (nn) {
197 int rv;
198
199 rv=GWEN_XMLGL__SampleNameSpaces(nn, l, pLastId);
200 if (rv)
201 return rv;
203 }
204
205 return 0;
206}
207
208
209
211{
212 GWEN_XMLNODE *nn;
213
215
216 nn=GWEN_XMLNode_List_First(n->children);
217 while (nn) {
220 }
221}
222
223
224
227 uint32_t *pLastId)
228{
229 int rv;
230
231 rv=GWEN_XMLGL__SampleNameSpaces(n, l, pLastId);
232 if (rv<0) {
233 DBG_INFO(GWEN_LOGDOMAIN, "here (%d)", rv);
234 return rv;
235 }
237
238 return 0;
239}
240
241
242
244{
246 uint32_t lastId=0;
247 int rv;
248
250 rv=GWEN_XMLNode_GlobalizeWithList(n, l, &lastId);
251 if (rv<0) {
252 DBG_INFO(GWEN_LOGDOMAIN, "here (%d)", rv);
254 return rv;
255 }
257 n->nameSpaces=l;
258
259 return 0;
260}
261
262
263
264
265
266
267
268
269
270
271
272
#define NULL
Definition: binreloc.c:300
#define DBG_INFO(dbg_logger, format, args...)
Definition: debug.h:181
#define DBG_ERROR(dbg_logger, format, args...)
Definition: debug.h:97
#define GWEN_ERROR_NO_DATA
Definition: error.h:94
void GWEN_XMLNode_NameSpace_List_Clear(GWEN_XMLNODE_NAMESPACE_LIST *l)
GWEN_XMLNODE * GWEN_XMLNode_List_First(const GWEN_XMLNODE_LIST *l)
GWEN_XMLNODE_NAMESPACE * GWEN_XMLNode_NameSpace_List_First(const GWEN_XMLNODE_NAMESPACE_LIST *l)
void GWEN_XMLNode_NameSpace_List_Add(GWEN_XMLNODE_NAMESPACE *element, GWEN_XMLNODE_NAMESPACE_LIST *list)
void GWEN_XMLNode_NameSpace_List_free(GWEN_XMLNODE_NAMESPACE_LIST *l)
GWEN_XMLNODE_NAMESPACE * GWEN_XMLNode_NameSpace_List_Next(const GWEN_XMLNODE_NAMESPACE *element)
GWEN_XMLNODE_NAMESPACE_LIST * GWEN_XMLNode_NameSpace_List_new()
GWEN_XMLNODE * GWEN_XMLNode_List_Next(const GWEN_XMLNODE *element)
#define GWEN_LOGDOMAIN
Definition: logger.h:35
GWEN_XMLNODE_NAMESPACE * GWEN_XMLNode_NameSpace_new(const char *name, const char *url)
Definition: xml.c:1991
const char * GWEN_XMLNode_NameSpace_GetName(const GWEN_XMLNODE_NAMESPACE *ns)
Definition: xml.c:2032
const char * GWEN_XMLNode_NameSpace_GetUrl(const GWEN_XMLNODE_NAMESPACE *ns)
Definition: xml.c:2040
const char * GWEN_XMLNode_GetData(const GWEN_XMLNODE *n)
Definition: xml.c:370
struct GWEN_XMLNODE_NAMESPACE GWEN_XMLNODE_NAMESPACE
Definition: xml.h:157
struct GWEN__XMLNODE GWEN_XMLNODE
Definition: xml.h:156
@ GWEN_XMLNodeTypeTag
Definition: xml.h:145
struct GWEN__XMLPROPERTY GWEN_XMLPROPERTY
Definition: xml_l.h:37
int GWEN_XMLNode_Globalize(GWEN_XMLNODE *n)
Definition: xmlglobalize.c:243
int GWEN_XMLNode_GlobalizeWithList(GWEN_XMLNODE *n, GWEN_XMLNODE_NAMESPACE_LIST *l, uint32_t *pLastId)
Definition: xmlglobalize.c:225
int GWEN_XMLGL__TranslateName(GWEN_XMLNODE *n, GWEN_XMLNODE_NAMESPACE_LIST *l, char **pValue)
Definition: xmlglobalize.c:76
int GWEN_XMLGL__SampleNameSpaces(GWEN_XMLNODE *n, GWEN_XMLNODE_NAMESPACE_LIST *l, uint32_t *pLastId)
Definition: xmlglobalize.c:138
void GWEN_XMLGL__ClearNameSpaces(GWEN_XMLNODE *n)
Definition: xmlglobalize.c:210
GWEN_XMLNODE_NAMESPACE * GWEN_XMLGL__GetNameSpaceByPrefix(GWEN_XMLNODE *n, const char *prefix)
Definition: xmlglobalize.c:49
GWEN_XMLNODE_NAMESPACE * GWEN_XMLGL__FindNameSpaceByUrl(GWEN_XMLNODE_NAMESPACE_LIST *l, const char *s)
Definition: xmlglobalize.c:28