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 */
100  ns=GWEN_XMLGL__GetNameSpaceByPrefix(n, prefix);
101  if (ns) {
102  GWEN_XMLNODE_NAMESPACE *newNs;
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) {
146  GWEN_XMLPROPERTY *pr;
147  int rv;
148 
149  ns=GWEN_XMLNode_NameSpace_List_First(n->nameSpaces);
150  while (ns) {
151  const char *url;
152 
154  if (url) {
155  if (GWEN_XMLGL__FindNameSpaceByUrl(l, url)==NULL) {
156  char namebuf[32];
157  GWEN_XMLNODE_NAMESPACE *newNs;
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;
202  nn=GWEN_XMLNode_List_Next(nn);
203  }
204 
205  return 0;
206 }
207 
208 
209 
211 {
212  GWEN_XMLNODE *nn;
213 
214  GWEN_XMLNode_NameSpace_List_Clear(n->nameSpaces);
215 
216  nn=GWEN_XMLNode_List_First(n->children);
217  while (nn) {
219  nn=GWEN_XMLNode_List_Next(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  }
256  GWEN_XMLNode_NameSpace_List_free(n->nameSpaces);
257  n->nameSpaces=l;
258 
259  return 0;
260 }
261 
262 
263 
264 
265 
266 
267 
268 
269 
270 
271 
272 
struct GWEN_XMLNODE_NAMESPACE GWEN_XMLNODE_NAMESPACE
Definition: xml.h:157
const char * GWEN_XMLNode_NameSpace_GetName(const GWEN_XMLNODE_NAMESPACE *ns)
Definition: xml.c:2032
struct GWEN__XMLPROPERTY GWEN_XMLPROPERTY
Definition: xml_l.h:37
const char * GWEN_XMLNode_NameSpace_GetUrl(const GWEN_XMLNODE_NAMESPACE *ns)
Definition: xml.c:2040
#define NULL
Definition: binreloc.c:300
#define GWEN_LOGDOMAIN
Definition: logger.h:35
GWEN_XMLNODE_NAMESPACE * GWEN_XMLGL__FindNameSpaceByUrl(GWEN_XMLNODE_NAMESPACE_LIST *l, const char *s)
Definition: xmlglobalize.c:28
GWEN_XMLNODE_NAMESPACE * GWEN_XMLNode_NameSpace_new(const char *name, const char *url)
Definition: xml.c:1991
GWEN_XMLNODE_NAMESPACE * GWEN_XMLGL__GetNameSpaceByPrefix(GWEN_XMLNODE *n, const char *prefix)
Definition: xmlglobalize.c:49
int GWEN_XMLGL__TranslateName(GWEN_XMLNODE *n, GWEN_XMLNODE_NAMESPACE_LIST *l, char **pValue)
Definition: xmlglobalize.c:76
void GWEN_XMLGL__ClearNameSpaces(GWEN_XMLNODE *n)
Definition: xmlglobalize.c:210
GWEN_XMLNODE * GWEN_XMLNode_List_Next(const GWEN_XMLNODE *element)
void GWEN_XMLNode_NameSpace_List_free(GWEN_XMLNODE_NAMESPACE_LIST *l)
#define DBG_ERROR(dbg_logger, format, args...)
Definition: debug.h:97
const char * GWEN_XMLNode_GetData(const GWEN_XMLNODE *n)
Definition: xml.c:370
void GWEN_XMLNode_NameSpace_List_Clear(GWEN_XMLNODE_NAMESPACE_LIST *l)
#define DBG_INFO(dbg_logger, format, args...)
Definition: debug.h:181
void GWEN_XMLNode_NameSpace_List_Add(GWEN_XMLNODE_NAMESPACE *element, GWEN_XMLNODE_NAMESPACE_LIST *list)
int GWEN_XMLGL__SampleNameSpaces(GWEN_XMLNODE *n, GWEN_XMLNODE_NAMESPACE_LIST *l, uint32_t *pLastId)
Definition: xmlglobalize.c:138
int GWEN_XMLNode_Globalize(GWEN_XMLNODE *n)
Definition: xmlglobalize.c:243
#define GWEN_ERROR_NO_DATA
Definition: error.h:94
GWEN_XMLNODE_NAMESPACE * GWEN_XMLNode_NameSpace_List_Next(const GWEN_XMLNODE_NAMESPACE *element)
GWEN_XMLNODE_NAMESPACE_LIST * GWEN_XMLNode_NameSpace_List_new()
struct GWEN__XMLNODE GWEN_XMLNODE
Definition: xml.h:156
GWEN_XMLNODE * GWEN_XMLNode_List_First(const GWEN_XMLNODE_LIST *l)
int GWEN_XMLNode_GlobalizeWithList(GWEN_XMLNODE *n, GWEN_XMLNODE_NAMESPACE_LIST *l, uint32_t *pLastId)
Definition: xmlglobalize.c:225
GWEN_XMLNODE_NAMESPACE * GWEN_XMLNode_NameSpace_List_First(const GWEN_XMLNODE_NAMESPACE_LIST *l)