gwenhywfar  5.10.1
xml.c
Go to the documentation of this file.
1 /***************************************************************************
2  begin : Sat Jun 28 2003
3  copyright : (C) 2003-2010 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 #ifdef HAVE_CONFIG_H
26 # include <config.h>
27 #endif
28 
29 #define DISABLE_DEBUGLOG
30 
31 #include "xml_p.h"
32 #include "xmlctx_l.h"
33 #include "i18n_l.h"
34 
35 #include <gwenhywfar/debug.h>
36 #include <gwenhywfar/misc.h>
37 #include <gwenhywfar/text.h>
38 #include <gwenhywfar/path.h>
39 #include <gwenhywfar/fastbuffer.h>
40 #include <gwenhywfar/syncio_file.h>
41 #include <gwenhywfar/syncio_memory.h>
42 
43 #include <stdlib.h>
44 #include <assert.h>
45 #include <string.h>
46 #include <ctype.h>
47 #include <sys/types.h>
48 #ifdef HAVE_SYS_STAT_H
49 # include <sys/stat.h>
50 #endif
51 #ifdef HAVE_FCNTL_H
52 # include <fcntl.h>
53 #endif
54 #include <errno.h>
55 #ifdef HAVE_UNISTD_H
56 # include <unistd.h>
57 #endif
58 
59 
60 #define GWEN_XML_BUFFERSIZE 512
61 
62 
63 
64 GWEN_LIST_FUNCTIONS(GWEN_XMLNODE, GWEN_XMLNode)
66 
67 GWEN_LIST_FUNCTIONS(GWEN_XMLNODE_NAMESPACE, GWEN_XMLNode_NameSpace)
68 
69 
70 
71 
72 GWEN_XMLPROPERTY *GWEN_XMLProperty_new(const char *name, const char *value)
73 {
75 
77  if (name)
78  p->name=GWEN_Memory_strdup(name);
79  if (value)
80  p->value=GWEN_Memory_strdup(value);
81  return p;
82 }
83 
84 
85 
87 {
88  if (p) {
89  GWEN_Memory_dealloc(p->name);
90  GWEN_Memory_dealloc(p->value);
91  GWEN_Memory_dealloc(p->nameSpace);
93  }
94 }
95 
96 
97 
99 {
100  GWEN_XMLPROPERTY *pp;
101 
102  pp=GWEN_XMLProperty_new(p->name, p->value);
103  if (p->nameSpace)
104  pp->nameSpace=strdup(p->nameSpace);
105 
106  return pp;
107 }
108 
109 
110 
112 {
114 }
115 
116 
117 
119 {
121 }
122 
123 
125 {
127 }
128 
129 
131 {
132  while (p) {
133  GWEN_XMLPROPERTY *next;
134 
135  next=p->next;
137  p=next;
138  } /* while */
139 }
140 
141 
142 
143 
145 {
146  GWEN_XMLNODE *n;
147 
150  n->type=t;
151  n->children=GWEN_XMLNode_List_new();
152  n->headers=GWEN_XMLNode_List_new();
153  if (data)
154  n->data=GWEN_Memory_strdup(data);
155  n->nameSpaces=GWEN_XMLNode_NameSpace_List_new();
156  return n;
157 }
158 
159 
161 {
162  if (n) {
164  GWEN_XMLProperty_freeAll(n->properties);
165  GWEN_Memory_dealloc(n->nameSpace);
166  GWEN_Memory_dealloc(n->data);
167  GWEN_XMLNode_List_free(n->headers);
168  GWEN_XMLNode_List_free(n->children);
169  GWEN_XMLNode_NameSpace_List_free(n->nameSpaces);
170  GWEN_FREE_OBJECT(n);
171  }
172 }
173 
174 
176 {
177  while (n) {
178  GWEN_XMLNODE *next;
179 
180  next=GWEN_XMLNode_List_Next(n);
182  n=next;
183  } /* while */
184 }
185 
186 
188 {
189  GWEN_XMLNODE *nn, *cn, *ncn;
190  const GWEN_XMLPROPERTY *p;
191  const GWEN_XMLNODE_NAMESPACE *nns;
192 
193  /* duplicate node itself */
194  nn=GWEN_XMLNode_new(n->type, n->data);
195  if (n->nameSpace)
196  nn->nameSpace=strdup(n->nameSpace);
197 
198  /* duplicate properties */
199  p=n->properties;
200  while (p) {
201  GWEN_XMLPROPERTY *np;
202 
203  np=GWEN_XMLProperty_dup(p);
204  GWEN_XMLProperty_add(np, &(nn->properties));
205  p=p->next;
206  } /* while */
207 
208  /* duplicate children */
209  cn=GWEN_XMLNode_List_First(n->children);
210  while (cn) {
211  ncn=GWEN_XMLNode_dup(cn);
212  GWEN_XMLNode_AddChild(nn, ncn);
213  cn=GWEN_XMLNode_Next(cn);
214  } /* while */
215 
216  /* duplicate headers */
217  cn=GWEN_XMLNode_List_First(n->headers);
218  while (cn) {
219  ncn=GWEN_XMLNode_dup(cn);
220  GWEN_XMLNode_AddHeader(nn, ncn);
221  cn=GWEN_XMLNode_Next(cn);
222  } /* while */
223 
224  /* duplicate namespaces */
225  nns=GWEN_XMLNode_NameSpace_List_First(n->nameSpaces);
226  while (nns) {
228 
229  nnns=GWEN_XMLNode_NameSpace_dup(nns);
230  GWEN_XMLNode_NameSpace_List_Add(nnns, nn->nameSpaces);
232  }
233 
234  return nn;
235 }
236 
237 
238 
239 const char *GWEN_XMLNode_GetProperty(const GWEN_XMLNODE *n, const char *name,
240  const char *defaultValue)
241 {
242  GWEN_XMLPROPERTY *p;
243 
244  assert(n);
245  assert(name);
246  p=n->properties;
247  while (p) {
248  assert(p->name);
249  if (strcasecmp(p->name, name)==0)
250  break;
251  p=p->next;
252  } /* while */
253 
254  if (p) {
255  if (p->value)
256  return p->value;
257  }
258  return defaultValue;
259 }
260 
261 
262 
263 int GWEN_XMLNode_GetIntProperty(const GWEN_XMLNODE *n, const char *name,
264  int defaultValue)
265 {
266  GWEN_XMLPROPERTY *p;
267 
268  assert(n);
269  assert(name);
270  p=n->properties;
271  while (p) {
272  assert(p->name);
273  if (strcasecmp(p->name, name)==0)
274  break;
275  p=p->next;
276  } /* while */
277 
278  if (p) {
279  if (p->value) {
280  int i;
281 
282  if (1==sscanf(p->value, "%i", &i))
283  return i;
284  }
285  }
286  return defaultValue;
287 }
288 
289 
291  const char *name, const char *value,
292  int doInsert)
293 {
294  GWEN_XMLPROPERTY *p;
295 
296  p=n->properties;
297  while (p) {
298  assert(p->name);
299  if (strcasecmp(p->name, name)==0)
300  break;
301  p=p->next;
302  } /* while */
303 
304  if (p) {
305  GWEN_Memory_dealloc(p->value);
306  if (value)
307  p->value=GWEN_Memory_strdup(value);
308  else
309  p->value=0;
310  }
311  else {
312  p=GWEN_XMLProperty_new(name, value);
313  if (doInsert)
314  GWEN_XMLProperty_insert(p, &(n->properties));
315  else
316  GWEN_XMLProperty_add(p, &(n->properties));
317  }
318 }
319 
320 
321 
323  const char *name, const char *value)
324 {
325  GWEN_XMLNode__SetProperty(n, name, value, 0);
326 }
327 
328 
329 
331  const char *name, int value)
332 {
333  char numbuf[256];
334 
335  snprintf(numbuf, sizeof(numbuf)-1, "%i", value);
336  numbuf[sizeof(numbuf)-1]=0;
337  GWEN_XMLNode__SetProperty(n, name, numbuf, 0);
338 }
339 
340 
341 
343 {
344  assert(n);
345  n->usage++;
346 }
347 
348 
349 
351 {
352  assert(n);
353  if (n->usage==0) {
354  DBG_WARN(GWEN_LOGDOMAIN, "Node usage already is zero");
355  }
356  else
357  n->usage--;
358 }
359 
360 
361 
363 {
364  assert(n);
365  return n->usage;
366 }
367 
368 
369 
370 const char *GWEN_XMLNode_GetData(const GWEN_XMLNODE *n)
371 {
372  assert(n);
373  return n->data;
374 }
375 
376 
377 void GWEN_XMLNode_SetData(GWEN_XMLNODE *n, const char *data)
378 {
379  assert(n);
380  GWEN_Memory_dealloc(n->data);
381  if (data)
382  n->data=GWEN_Memory_strdup(data);
383  else
384  n->data=0;
385 }
386 
387 
388 
390 {
391  assert(n);
392  return n->nameSpace;
393 }
394 
395 
396 
398 {
399  assert(n);
400  GWEN_Memory_dealloc(n->nameSpace);
401  if (s)
402  n->nameSpace=GWEN_Memory_strdup(s);
403  else
404  n->nameSpace=NULL;
405 }
406 
407 
408 
410 {
411  assert(n);
412  return GWEN_XMLNode_List_First(n->children);
413 }
414 
415 
417 {
418  assert(n);
419  return n->parent;
420 }
421 
422 
424 {
425  assert(n);
426  GWEN_XMLNode_List_Add(child, n->children);
427  child->parent=n;
428 }
429 
430 
431 
433  int copythem)
434 {
435  GWEN_XMLNODE *ch;
436 
437  assert(n);
438  assert(nn);
439 
440  ch=GWEN_XMLNode_GetChild(nn);
441  while (ch) {
442  GWEN_XMLNODE *nc;
443 
444  nc=GWEN_XMLNode_Next(ch);
445  if (!copythem) {
446  GWEN_XMLNode_UnlinkChild(nn, ch);
447  GWEN_XMLNode_AddChild(n, ch);
448  }
449  else {
451  }
452  ch=nc;
453  } /* while */
454 }
455 
456 
457 
459 {
460  assert(n);
461  return n->type;
462 }
463 
464 
466 {
467  assert(n);
468  return GWEN_XMLNode_List_Next(n);
469 }
470 
471 
472 void GWEN_XMLNode_Dump(const GWEN_XMLNODE *n, int ind)
473 {
474  GWEN_XMLPROPERTY *p;
475  GWEN_XMLNODE *c;
476  int i;
477  int simpleTag;
478 
479  assert(n);
480 
481  for (i=0; i<ind; i++)
482  fprintf(stderr, " ");
483 
484  simpleTag=0;
485  if (n->type==GWEN_XMLNodeTypeTag) {
486  if (n->data)
487  fprintf(stderr, "<%s", n->data);
488  else
489  fprintf(stderr, "<UNKNOWN");
490  p=n->properties;
491  while (p) {
492  if (p->value)
493  fprintf(stderr, " %s=\"%s\"", p->name, p->value);
494  else
495  fprintf(stderr, " %s", p->name);
496  p=p->next;
497  }
498 
499  if (n->data) {
500  if (n->data[0]=='?') {
501  simpleTag=1;
502  fprintf(stderr, "?");
503  }
504  else if (n->data[0]=='!') {
505  simpleTag=1;
506  }
507  }
508 
509  fprintf(stderr, ">\n");
510  if (!simpleTag) {
512  while (c) {
513  GWEN_XMLNode_Dump(c, ind+2);
514  c=GWEN_XMLNode_Next(c);
515  }
516  for (i=0; i<ind; i++)
517  fprintf(stderr, " ");
518  if (n->data)
519  fprintf(stderr, "</%s>\n", n->data);
520  else
521  fprintf(stderr, "</UNKNOWN>\n");
522  }
523  }
524  else if (n->type==GWEN_XMLNodeTypeData) {
525  if (n->data) {
526  fprintf(stderr, "%s\n", n->data);
527  }
528  }
529  else if (n->type==GWEN_XMLNodeTypeComment) {
530  fprintf(stderr, "<!--");
531  if (n->data) {
532  fprintf(stderr, "%s", n->data);
533  }
534  fprintf(stderr, "-->\n");
535  }
536  else {
537  DBG_ERROR(GWEN_LOGDOMAIN, "Unknown tag type (%d)", n->type);
538  }
539 }
540 
541 
542 
544  GWEN_XMLNODE_TYPE t, const char *data)
545 {
546  GWEN_XMLNODE *n;
547 
548  assert(node);
549  assert(data);
550 
551  n=GWEN_XMLNode_GetChild(node);
552  while (n) {
553  if (n->type==t)
554  if (n->data)
555  if (strcasecmp(n->data, data)==0)
556  break;
557  n=GWEN_XMLNode_Next(n);
558  } /* while */
559 
560  if (!n) {
561  DBG_DEBUG(GWEN_LOGDOMAIN, "Node %d:\"%s\" not found", t, data);
562  return 0;
563  }
564 
565  return n;
566 }
567 
568 
569 
571 {
572  assert(n);
573  assert(child);
574  GWEN_XMLNode_List_Del(child);
575  child->parent=0;
576 }
577 
578 
579 
581 {
582  assert(n);
583  GWEN_XMLNode_List_Clear(n->children);
584 }
585 
586 
587 
589  const GWEN_XMLNODE *sn,
590  int overwrite)
591 {
592  const GWEN_XMLPROPERTY *sp;
593  GWEN_XMLPROPERTY *tp;
594 
595  assert(tn);
596  assert(sn);
597 
598  sp=sn->properties;
599  while (sp) {
600  GWEN_XMLPROPERTY *np;
601 
602  assert(sp->name);
603  tp=tn->properties;
604  /* lookup property in target */
605  while (tp) {
606 
607  assert(tp->name);
608  if (strcasecmp(tp->name, sp->name)==0) {
609  /* property already exists */
610  if (overwrite) {
611  /* overwrite old property */
612  GWEN_Memory_dealloc(tp->value);
613  tp->value=0;
614  if (sp->value)
615  tp->value=GWEN_Memory_strdup(sp->value);
616  }
617  break;
618  }
619  tp=tp->next;
620  } /* while */
621 
622  if (!tp) {
623  /* property not found, simply copy and add it */
624  np=GWEN_XMLProperty_dup(sp);
625  GWEN_XMLProperty_add(np, &(tn->properties));
626  }
627 
628  sp=sp->next;
629  } /* while */
630 }
631 
632 
633 
635 {
636  GWEN_XMLPROPERTY *sp;
637 
638  assert(n);
639 
640  sp=n->properties;
641  if (sp) {
642  GWEN_BUFFER *tmpBuf;
643 
644  tmpBuf=GWEN_Buffer_new(0, 256, 0, 1);
645 
646  while(sp) {
647  if (sp->value) {
648  int rv;
649 
650  rv=GWEN_DB_ReplaceVars(dbVars, sp->value, tmpBuf);
651  if (rv<0) {
653  "Error expanding value for property \"%s\": [%s] (%d)",
654  (sp->name)?(sp->name):"<no name>",
655  (sp->value)?(sp->value):"<no value>",
656  rv);
657  return rv;
658  }
659  GWEN_Memory_dealloc(sp->value);
660  sp->value=GWEN_Memory_strdup(GWEN_Buffer_GetStart(tmpBuf));
661  GWEN_Buffer_Reset(tmpBuf);
662  } /* if sp->value */
663 
664  sp=sp->next;
665  } /* while */
666  GWEN_Buffer_free(tmpBuf);
667  }
668 
669  return 0;
670 }
671 
672 
673 
676 {
677  GWEN_XMLNODE *nn;
678 
679  assert(n);
680  nn=GWEN_XMLNode_GetChild(n);
681  while (nn) {
682  if (nn->type==t)
683  return nn;
684  nn=GWEN_XMLNode_Next(nn);
685  } /* while */
686  return 0;
687 }
688 
689 
690 
693 {
694  assert(n);
695  while (n) {
696  if (n->type==t)
697  return (GWEN_XMLNODE *)n;
698  n=GWEN_XMLNode_Next(n);
699  } /* while */
700  return 0;
701 }
702 
703 
704 
706 {
708 }
709 
710 
711 
713 {
714  GWEN_XMLNODE *next;
715 
716  next=GWEN_XMLNode_Next(n);
717  if (!next)
718  return 0;
720 }
721 
722 
723 
725 {
727 }
728 
729 
730 
732 {
733  GWEN_XMLNODE *next;
734 
735  next=GWEN_XMLNode_Next(n);
736  if (!next)
737  return 0;
739 }
740 
741 
742 
744  const char *tname,
745  const char *pname,
746  const char *pvalue)
747 {
748  while (n) {
749  if (-1!=GWEN_Text_ComparePattern(n->data, tname, 0)) {
750  if (pname) {
751  const char *p;
752 
753  p=GWEN_XMLNode_GetProperty(n, pname, 0);
754  if (p) {
755  if (!pvalue)
756  return (GWEN_XMLNODE *)n;
757  if (-1!=GWEN_Text_ComparePattern(pvalue, p, 0))
758  return (GWEN_XMLNODE *)n;
759  }
760  else {
761  /* return this node if pvalue is 0 an the property does not exist */
762  if (!pvalue)
763  return (GWEN_XMLNODE *)n;
764  }
765  } /* if pname */
766  else
767  return (GWEN_XMLNODE *)n;
768  }
770  } /* while */
771  return 0;
772 }
773 
774 
775 
777  const char *tname,
778  const char *pname,
779  const char *pvalue)
780 {
781  GWEN_XMLNODE *nn;
782 
784  if (!nn)
785  return 0;
786  return GWEN_XMLNode_FindTag(nn,
787  tname,
788  pname,
789  pvalue);
790 }
791 
792 
793 
795  const char *tname,
796  const char *pname,
797  const char *pvalue)
798 {
799  GWEN_XMLNODE *nn;
800 
802  if (!nn)
803  return 0;
804  return GWEN_XMLNode_FindTag(nn,
805  tname,
806  pname,
807  pvalue);
808 }
809 
810 
811 
813  const char *name,
814  const char *defValue)
815 {
816  GWEN_XMLNODE *nn;
817 
818  if (name && *name) {
819  nn=GWEN_XMLNode_FindFirstTag(n, name, 0, 0);
820 
821  while (nn) {
822  GWEN_XMLNODE *dn;
823 
825  if (dn) {
826  if (dn->data)
827  return dn->data;
828  }
829  nn=GWEN_XMLNode_FindNextTag(nn, name, 0, 0);
830  }
831  }
832  else {
833  GWEN_XMLNODE *dn;
834 
836  if (dn) {
837  if (dn->data)
838  return dn->data;
839  }
840  }
841  return defValue;
842 }
843 
844 
845 
847  const char *name,
848  const char *defValue)
849 {
850  GWEN_XMLNODE *nn=0;
851  GWEN_STRINGLIST *langl;
852 
854  if (langl) {
856 
857  se=GWEN_StringList_FirstEntry(langl);
858  while (se) {
859  const char *l;
860 
862  DBG_DEBUG(GWEN_LOGDOMAIN, "Trying locale \"%s\"", l);
863  assert(l);
864  nn=GWEN_XMLNode_FindFirstTag(n, name, "lang", l);
865  while (nn) {
866  GWEN_XMLNODE *dn;
867 
869  if (dn) {
870  if (dn->data && *(dn->data))
871  return dn->data;
872  }
873  nn=GWEN_XMLNode_FindNextTag(nn, name, "lang", l);
874  } /* while nn */
876  } /* while */
877  } /* if language list available */
878 
879  /* otherwise try without locale */
880  nn=GWEN_XMLNode_FindFirstTag(n, name, 0, 0);
881  while (nn) {
882  GWEN_XMLNODE *dn;
883 
885  if (dn) {
886  if (dn->data)
887  return dn->data;
888  }
889  nn=GWEN_XMLNode_FindNextTag(nn, name, 0, 0);
890  }
891 
892  return defValue;
893 }
894 
895 
896 
898  const char *name,
899  const char *value)
900 {
901  if (name && *name) {
902  GWEN_XMLNODE *nn;
903 
905  if (value) {
906  GWEN_XMLNODE *nnn;
907 
909  GWEN_XMLNode_AddChild(nn, nnn);
910  }
911  GWEN_XMLNode_AddChild(n, nn);
912  }
913  else {
914  GWEN_XMLNODE *nn;
915 
917  GWEN_XMLNode_AddChild(n, nn);
918  }
919 }
920 
921 
922 
924  const char *name,
925  int defValue)
926 {
927  const char *p;
928  int res;
929 
930  p=GWEN_XMLNode_GetCharValue(n, name, 0);
931  if (!p)
932  return defValue;
933  if (1!=sscanf(p, "%i", &res))
934  return defValue;
935  return res;
936 }
937 
938 
939 
941  const char *name,
942  int value)
943 {
944  char numbuf[32];
945 
946  snprintf(numbuf, sizeof(numbuf)-1, "%d", value);
947  numbuf[sizeof(numbuf)-1]=0;
948  GWEN_XMLNode_SetCharValue(n, name, numbuf);
949 }
950 
951 
952 
954  const char *name,
955  const char *value)
956 {
957  GWEN_XMLNODE *nn;
958 
959  nn=GWEN_XMLNode_GetNodeByXPath(n, name, 0);
960  if (nn) {
961  GWEN_XMLNODE *nnn;
962 
963  /* clear current entries */
965  GWEN_XMLNode_List_Clear(nn->children);
966 
967  /* create value node */
969  GWEN_XMLNode_AddChild(nn, nnn);
970 
971  return 0;
972  }
973  else {
974  DBG_ERROR(GWEN_LOGDOMAIN, "Unable to create node [%s]", name);
975  return GWEN_ERROR_INVALID;
976  }
977 }
978 
979 
980 
982  const char *name,
983  const char *defValue)
984 {
985  GWEN_XMLNODE *nn;
986 
987  nn=GWEN_XMLNode_GetNodeByXPath(n, name, 0);
988  if (nn) {
989  GWEN_XMLNODE *dn;
990 
992  if (dn) {
993  if (dn->data)
994  return dn->data;
995  }
996  }
997 
998  return defValue;
999 }
1000 
1001 
1002 
1004  const char *name,
1005  int value)
1006 {
1007  char numbuf[32];
1008  int rv;
1009 
1010  /* create int value */
1011  snprintf(numbuf, sizeof(numbuf)-1, "%d", value);
1012  numbuf[sizeof(numbuf)-1]=0;
1013 
1014  rv=GWEN_XMLNode_SetCharValueByPath(n, flags, name, numbuf);
1015  if (rv<0) {
1016  DBG_INFO(GWEN_LOGDOMAIN, "here (%d)", rv);
1017  return rv;
1018  }
1019 
1020  return rv;
1021 }
1022 
1023 
1024 
1026  const char *name,
1027  int defValue)
1028 {
1029  const char *p;
1030  int res;
1031 
1033  if (!p)
1034  return defValue;
1035  if (1!=sscanf(p, "%i", &res))
1036  return defValue;
1037  return res;
1038 }
1039 
1040 
1041 
1042 
1043 
1044 
1046 {
1047  assert(n);
1048  return n->properties;
1049 }
1050 
1051 
1052 
1054  const GWEN_XMLPROPERTY *pr)
1055 {
1056  assert(n);
1057  assert(pr);
1058  return pr->next;
1059 }
1060 
1061 
1062 
1064 {
1065  assert(pr);
1066  return pr->name;
1067 }
1068 
1069 
1070 
1072 {
1073  assert(pr);
1074  return pr->value;
1075 }
1076 
1077 
1078 
1080  const GWEN_XMLNODE *child)
1081 {
1082  GWEN_XMLNODE *n;
1083 
1084  if (!child || !parent || child==parent)
1085  return 0;
1086  n=child->parent;
1087  while (n) {
1088  if (n==parent)
1089  return 1;
1090  n=n->parent;
1091  }
1092  return 0;
1093 }
1094 
1095 
1096 
1098  const GWEN_XMLNODE *n2,
1099  GWEN_BUFFER *nbuf)
1100 {
1101  GWEN_BUFFER *lbuf;
1102  const GWEN_XMLNODE *ln1;
1103  const GWEN_XMLNODE *ln2;
1104 
1105  if (!n1 && !n2) {
1106  DBG_ERROR(GWEN_LOGDOMAIN, "Both nodes are NULL");
1107  return -1;
1108  }
1109 
1110  if (!n1) {
1111  n1=n2;
1112  while (n1->parent)
1113  n1=n1->parent;
1114  }
1115 
1116  if (!n2) {
1117  n2=n1;
1118  while (n2->parent)
1119  n2=n2->parent;
1120  }
1121 
1122  if (n2==n1) {
1123  GWEN_Buffer_AppendString(nbuf, "here()");
1124  return 0;
1125  }
1126 
1127  lbuf=GWEN_Buffer_new(0, 256, 0, 1);
1128  GWEN_Buffer_ReserveBytes(lbuf, 128);
1129 
1130  ln1=n1->parent;
1131  if (ln1) {
1132  GWEN_Buffer_AppendString(lbuf, "../");
1133  while (ln1) {
1134  if (ln1==n2) {
1135  /* found n2 */
1136  GWEN_Buffer_AppendBuffer(nbuf, lbuf);
1137  GWEN_Buffer_free(lbuf);
1138  return 0;
1139  }
1140  if (GWEN_XMLNode_IsChildOf(ln1, n2))
1141  break;
1142  ln1=ln1->parent;
1143  GWEN_Buffer_AppendString(lbuf, "../");
1144  }
1145 
1146  if (!ln1) {
1147  DBG_ERROR(GWEN_LOGDOMAIN, "Nodes do not share root node");
1148  GWEN_Buffer_free(lbuf);
1149  return -1;
1150  }
1151 
1152  /* append path to n1 */
1153  GWEN_Buffer_AppendBuffer(nbuf, lbuf);
1154  }
1155  DBG_DEBUG(GWEN_LOGDOMAIN, "Path so far: %s", GWEN_Buffer_GetStart(lbuf));
1156 
1157  /* get path to n2 */
1158  GWEN_Buffer_Reset(lbuf);
1159 
1160  ln2=n2;
1161  while (ln2) {
1162  GWEN_XMLNODE *tn;
1163  int idx;
1164  char idxbuf[32];
1165 
1166  if (ln2->parent==ln1)
1167  break;
1168 
1169  /* count occurences of this tag in this level */
1170  idx=1;
1171  tn=ln2->parent;
1172  if (tn) {
1173  tn=GWEN_XMLNode_FindFirstTag(tn, ln2->data, 0, 0);
1174 
1175  while (tn) {
1176  if (tn==ln2)
1177  break;
1178  idx++;
1179  tn=GWEN_XMLNode_FindNextTag(tn, ln2->data, 0, 0);
1180  }
1181  }
1182 
1183  snprintf(idxbuf, sizeof(idxbuf), "[%d]", idx);
1184  idxbuf[sizeof(idxbuf)-1]=0;
1185  GWEN_Buffer_InsertString(lbuf, idxbuf);
1187  GWEN_Buffer_InsertByte(lbuf, '/');
1188  ln2=ln2->parent;
1189  }
1190  /*DBG_ERROR(GWEN_LOGDOMAIN, "Path so far: %s", GWEN_Buffer_GetStart(lbuf)); */
1191  assert(ln2);
1192 
1193  /* append path to n2 */
1194  GWEN_Buffer_AppendBuffer(nbuf, lbuf);
1195  GWEN_Buffer_free(lbuf);
1196  return 0;
1197 }
1198 
1199 
1200 
1201 void *GWEN_XMLNode_HandlePath(const char *entry,
1202  void *data,
1203  int idx,
1204  uint32_t flags)
1205 {
1206  GWEN_XMLNODE *n;
1207  GWEN_XMLNODE *nn;
1208  int i;
1209 
1210  n=(GWEN_XMLNODE *)data;
1211 
1212  if (flags & GWEN_PATH_FLAGS_VARIABLE) {
1214  "GWEN_PATH_FLAGS_VARIABLE not allowed for XPATH");
1215  return 0;
1216  }
1217 
1218  if (flags & GWEN_PATH_FLAGS_ROOT) {
1219  while (n->parent)
1220  n=n->parent;
1221  if (*entry=='/')
1222  entry++;
1223  }
1224 
1225  if (strcasecmp(entry, "..")==0) {
1226  return n->parent;
1227  }
1228  else if (strcasecmp(entry, ".")==0 ||
1229  strcasecmp(entry, "here()")==0) {
1230  return n;
1231  }
1232 
1233  /* check whether we are allowed to simply create the node */
1234  if (
1235  ((flags & GWEN_PATH_FLAGS_LAST) &&
1236  (((flags & GWEN_PATH_FLAGS_VARIABLE) &&
1237  (flags & GWEN_PATH_FLAGS_CREATE_VAR)) ||
1238  (!(flags & GWEN_PATH_FLAGS_VARIABLE) &&
1239  (flags & GWEN_PATH_FLAGS_CREATE_GROUP)))
1240  ) ||
1241  (
1242  !(flags & GWEN_PATH_FLAGS_LAST) &&
1243  (flags & GWEN_PATH_FLAGS_PATHCREATE))
1244  ) {
1245  /* simply create the new variable/group */
1246  if (flags & GWEN_PATH_FLAGS_VARIABLE) {
1247  /* not allowed for now */
1248  return 0;
1249  }
1250  else {
1251  if (idx!=0) {
1253  "Can not create tag with index!=1 (%s)", entry);
1254  return 0;
1255  }
1257  "Unconditionally creating tag \"%s\"", entry);
1259  GWEN_XMLNode_AddChild(n, nn);
1260  return nn;
1261  }
1262  }
1263 
1264  /* find the node */
1265  i=idx;
1266  nn=GWEN_XMLNode_FindFirstTag(n, entry, 0, 0);
1267  while (nn && i--) {
1268  nn=GWEN_XMLNode_FindNextTag(nn, entry, 0, 0);
1269  }
1270 
1271  if (!nn) {
1272  /* node not found, check, if we are allowed to create it */
1273  if (
1274  (!(flags & GWEN_PATH_FLAGS_LAST) &&
1275  (flags & GWEN_PATH_FLAGS_PATHMUSTEXIST)) ||
1277  ) {
1279  "Tag \"%s\" does not exist", entry);
1280  return 0;
1281  }
1282  /* create the new variable/group */
1283  if (idx!=0) {
1285  "Can not create tag with index!=1 (%s)", entry);
1286  return 0;
1287  }
1289  "Tag \"%s\" not found, creating", entry);
1291  GWEN_XMLNode_AddChild(n, nn);
1292  } /* if node not found */
1293  else {
1294  /* node does exist, check whether this is ok */
1295  if (
1296  ((flags & GWEN_PATH_FLAGS_LAST) &&
1297  (flags & GWEN_PATH_FLAGS_NAMEMUSTNOTEXIST)) ||
1298  (!(flags & GWEN_PATH_FLAGS_LAST) &&
1300  ) {
1301  DBG_VERBOUS(GWEN_LOGDOMAIN, "Entry \"%s\" already exists", entry);
1302  return 0;
1303  }
1304  }
1305 
1306  return nn;
1307 }
1308 
1309 
1310 
1312  const char *path,
1313  uint32_t flags)
1314 {
1315  return (GWEN_XMLNODE *)GWEN_Path_HandleWithIdx(path,
1316  (void *)n,
1317  flags,
1319 }
1320 
1321 
1322 
1324 {
1325  assert(n);
1326  return GWEN_XMLNode_List_First(n->headers);
1327 }
1328 
1329 
1330 
1332 {
1333  assert(n);
1334  assert(nh);
1335  GWEN_XMLNode_List_Add(nh, n->headers);
1336 }
1337 
1338 
1339 
1341 {
1342  assert(n);
1343  assert(nh);
1345 }
1346 
1347 
1348 
1350 {
1351  assert(n);
1352  GWEN_XMLNode_List_Clear(n->headers);
1353 }
1354 
1355 
1356 
1358 {
1359  assert(n);
1360  return n->nameSpaces;
1361 }
1362 
1363 
1364 
1366  const char *s)
1367 {
1369 
1370  assert(n);
1371  ns=GWEN_XMLNode_NameSpace_List_First(n->nameSpaces);
1372  while (ns) {
1373  const char *d;
1374 
1376  if (d && strcasecmp(d, s)==0)
1377  return ns;
1379  }
1380 
1381  return NULL;
1382 }
1383 
1384 
1385 
1387  const char *s)
1388 {
1390 
1391  assert(n);
1392  ns=GWEN_XMLNode_NameSpace_List_First(n->nameSpaces);
1393  while (ns) {
1394  const char *d;
1395 
1397  if (d && strcasecmp(d, s)==0)
1398  return ns;
1400  }
1401 
1402  return NULL;
1403 }
1404 
1405 
1406 
1408 {
1409  assert(n);
1410  assert(ns);
1412 }
1413 
1414 
1415 
1416 
1417 
1418 
1419 
1420 
1421 
1422 
1423 
1425  const char *prefix,
1426  const char *name)
1427 {
1428  GWEN_BUFFER *nbuf;
1429  int rv;
1430 
1431  nbuf=GWEN_Buffer_new(0, 32, 0, 1);
1432  if (prefix)
1433  GWEN_Buffer_AppendString(nbuf, prefix);
1434  GWEN_Buffer_AppendByte(nbuf, ':');
1435  GWEN_Buffer_AppendString(nbuf, name);
1438  GWEN_Buffer_free(nbuf);
1439  return rv;
1440 }
1441 
1442 
1443 
1445  const char *s)
1446 {
1448 
1449  it=GWEN_StringList2_First(sl);
1450  if (it) {
1451  const char *t;
1452 
1454  assert(t);
1455  while (t) {
1456  const char *p;
1457 
1458  p=strchr(t, ':');
1459  assert(p);
1460  if ((s==0 && p==t) || (s && strncasecmp(t, s, p-t)==0))
1461  return t;
1463  } /* while */
1465  }
1466  return 0;
1467 }
1468 
1469 
1470 
1472  const char *s)
1473 {
1475 
1476  it=GWEN_StringList2_First(sl);
1477  if (it) {
1478  const char *t;
1479 
1481  assert(t);
1482  while (t) {
1483  const char *p;
1484 
1485  p=strchr(t, ':');
1486  assert(p);
1487  p++;
1488  if (strcasecmp(p, s)==0) {
1490  return t;
1491  }
1493  } /* while */
1495  }
1496  return 0;
1497 }
1498 
1499 
1500 
1502  const char *prefix,
1503  const char *name)
1504 {
1505  GWEN_BUFFER *nbuf;
1507 
1508  nbuf=GWEN_Buffer_new(0, 32, 0, 1);
1509  if (prefix)
1510  GWEN_Buffer_AppendString(nbuf, prefix);
1511  GWEN_Buffer_AppendByte(nbuf, ':');
1512  GWEN_Buffer_AppendString(nbuf, name);
1513 
1514  it=GWEN_StringList2_First(sl);
1515  if (it) {
1516  const char *t;
1517 
1519  assert(t);
1520  while (t) {
1521  const char *p;
1522 
1523  p=strchr(t, ':');
1524  assert(p);
1525  p++;
1526  if (strcasecmp(p, GWEN_Buffer_GetStart(nbuf))==0) {
1528  GWEN_Buffer_free(nbuf);
1529  return t;
1530  }
1532  } /* while */
1534  }
1535 
1536  GWEN_Buffer_free(nbuf);
1537  return 0;
1538 }
1539 
1540 
1541 
1543  GWEN_STRINGLIST2 *sl,
1544  const char *currentNameSpace)
1545 {
1546  GWEN_XMLPROPERTY *pr;
1547  GWEN_XMLNODE *nn;
1548  char *localNameSpace;
1549 
1550  localNameSpace=0;
1551 
1552  /* remove all unnecessary namespace declarations from this node */
1553  pr=n->properties;
1554  while (pr) {
1555  GWEN_XMLPROPERTY *prNext;
1556 
1557  prNext=pr->next;
1558  if (strcasecmp(pr->name, "xmlns")==0) {
1559  /* default namespace changed ? */
1560  if (localNameSpace) {
1561  if (strcasecmp(pr->value, localNameSpace)==0) {
1562  /* already mentioned name space, remove duplicate property */
1563  GWEN_XMLProperty_del(pr, &n->properties);
1565  }
1566  else {
1567  /* current namespace changed */
1568  GWEN_Memory_dealloc(localNameSpace);
1569  localNameSpace=GWEN_Memory_strdup(pr->value);
1570  }
1571  }
1572  else if (currentNameSpace) {
1573  if (strcasecmp(pr->value, currentNameSpace)==0) {
1574  /* already active name space, remove property */
1575  GWEN_XMLProperty_del(pr, &n->properties);
1577  }
1578  else {
1579  /* current namespace changed */
1580  GWEN_Memory_dealloc(localNameSpace);
1581  localNameSpace=GWEN_Memory_strdup(pr->value);
1582  }
1583  }
1584  else {
1585  /* set current namespace */
1586  GWEN_Memory_dealloc(localNameSpace);
1587  localNameSpace=GWEN_Memory_strdup(pr->value);
1588  }
1589  }
1590  else if (strncasecmp(pr->name, "xmlns:", 6)==0) {
1591  const char *prefix;
1592  const char *x;
1593 
1594  prefix=strchr(pr->name, ':');
1595  prefix++;
1596 
1597  /* check for redefinition */
1598  x=GWEN_XML_FindNameSpaceByName(sl, prefix);
1599  if (x) {
1600  const char *p;
1601 
1602  /* prefix already in use, check whether it is the same namespace */
1603  p=strchr(x, ':');
1604  assert(p);
1605  p++;
1606  if (strcasecmp(p, pr->value)!=0) {
1607  GWEN_BUFFER *xpath;
1608 
1609  /* same prefix, different namespace */
1610  xpath=GWEN_Buffer_new(0, 256, 0, 1);
1611  GWEN_XMLNode_GetXPath(0, n, xpath);
1613  "Redefinition of namespace prefix \"%s\" in \"%s\"",
1614  prefix, GWEN_Buffer_GetStart(xpath));
1615  GWEN_Buffer_free(xpath);
1616  return -1;
1617  } /* if different namespace for same prefix */
1618  else {
1619  /* already in list, remove property here */
1620  GWEN_XMLProperty_del(pr, &n->properties);
1622  }
1623  }
1624  else {
1625  GWEN_XML_AddNameSpace(sl, prefix, pr->value);
1626  }
1627  }
1628  pr=prNext;
1629  } /* while */
1630 
1631  /* do the same on all sub nodes */
1633  while (nn) {
1634  int rv;
1635 
1637  localNameSpace?localNameSpace:
1638  currentNameSpace);
1639  if (rv) {
1640  GWEN_Memory_dealloc(localNameSpace);
1641  return rv;
1642  }
1643  nn=GWEN_XMLNode_GetNextTag(nn);
1644  }
1645 
1646  GWEN_Memory_dealloc(localNameSpace);
1647  return 0;
1648 }
1649 
1650 
1651 
1653  const char *prefix,
1654  const char *nspace)
1655 {
1656  GWEN_XMLPROPERTY *pr;
1657  const char *p;
1658  int inUse;
1659 
1660  inUse=0;
1661  /* check current tag for prefix */
1662  if (prefix) {
1663  p=strchr(n->data, ':');
1664  if (p) {
1665  if (strncasecmp(n->data, prefix, p-n->data)==0) {
1666  DBG_DEBUG(GWEN_LOGDOMAIN, "Prefix \"%s\" used in tag \"%s\"",
1667  prefix, n->data);
1668  inUse=1;
1669  }
1670  }
1671 
1672  if (!inUse) {
1673  /* check all attributes for prefixes */
1674  pr=n->properties;
1675  while (pr) {
1676  p=strchr(pr->name, ':');
1677  if (p) {
1678  if (strncasecmp(pr->name, prefix, p-pr->name)==0) {
1680  "Prefix \"%s\" used in attribute \"%s\" of tag \"%s\"",
1681  prefix, pr->name, n->data);
1682  inUse=1;
1683  break;
1684  }
1685  else {
1687  "Prefix \"%s\" not used in attribute \"%s\" of tag \"%s\"",
1688  prefix, pr->name, n->data);
1689  }
1690  }
1691  pr=pr->next;
1692  } /* while */
1693  }
1694  } /* if prefix */
1695  else {
1696  /* no prefix, check whether the current element hasn't any */
1697  p=strchr(n->data, ':');
1698  if (!p) {
1699  /* current tag has no prefix, check whether we have a namespace
1700  * declaration here */
1701  if (GWEN_XMLNode_GetProperty(n, "xmlns", 0)==0) {
1702  /* no, so the current namespace from above is used */
1704  "No prefix, current namespace is used");
1705  inUse=1;
1706  }
1707  }
1708  } /* if no prefix */
1709 
1710  if (inUse) {
1711  GWEN_BUFFER *nbuf;
1712 
1713  nbuf=GWEN_Buffer_new(0, 32, 0, 1);
1714  GWEN_Buffer_AppendString(nbuf, "xmlns");
1715  if (prefix) {
1716  GWEN_Buffer_AppendByte(nbuf, ':');
1717  GWEN_Buffer_AppendString(nbuf, prefix);
1718  }
1719  GWEN_XMLNode__SetProperty(n, GWEN_Buffer_GetStart(nbuf), nspace, 1);
1720  GWEN_Buffer_free(nbuf);
1721  return 1;
1722  }
1723 
1724  return 0;
1725 }
1726 
1727 
1728 
1730  const char *prefix,
1731  const char *nspace)
1732 {
1733  GWEN_XMLNODE *nn;
1734  int rv;
1735 
1736  rv=GWEN_XMLNode__CheckAndSetNameSpace(n, prefix, nspace);
1737  if (rv)
1738  return rv;
1739 
1741  while (nn) {
1742  rv=GWEN_XMLNode__CheckAndSetNameSpace(nn, prefix, nspace);
1743  if (rv==-1)
1744  return rv;
1745  else if (rv==0) {
1746  /* check children */
1747  rv=GWEN_XMLNode__SetNameSpaces(nn, prefix, nspace);
1748  if (rv)
1749  return rv;
1750  }
1751 
1752  nn=GWEN_XMLNode_GetNextTag(nn);
1753  }
1754 
1755  return 0;
1756 }
1757 
1758 
1759 
1761 {
1762  GWEN_XMLPROPERTY *pr;
1763  GWEN_XMLNODE *nn;
1764  int rv;
1765 
1766  /* move all namespace declarations from this node to the nodes
1767  * of first use */
1768  pr=n->properties;
1769  while (pr) {
1770  GWEN_XMLPROPERTY *prNext;
1771 
1772  prNext=pr->next;
1773  if (strcasecmp(pr->name, "xmlns")==0 ||
1774  strncasecmp(pr->name, "xmlns:", 6)==0) {
1775  const char *prefix;
1776 
1777  prefix=strchr(pr->name, ':');
1778  if (prefix)
1779  prefix++;
1780 
1781  GWEN_XMLProperty_del(pr, &n->properties);
1782  rv=GWEN_XMLNode__SetNameSpaces(n, prefix, pr->value);
1783  DBG_DEBUG(GWEN_LOGDOMAIN, "Removing property \"%s\"",
1784  pr->name);
1786  if (rv==-1)
1787  return rv;
1788  }
1789  pr=prNext;
1790  } /* while */
1791 
1792  /* do the same on all sub nodes */
1794  while (nn) {
1796  if (rv) {
1797  return rv;
1798  }
1799  nn=GWEN_XMLNode_GetNextTag(nn);
1800  }
1801 
1802  return 0;
1803 }
1804 
1805 
1806 
1807 
1809 {
1810  const char *ns;
1811  int rv;
1812  GWEN_STRINGLIST2 *sl;
1813 
1814  ns=GWEN_XMLNode_GetProperty(n, "xmlns", 0);
1815  sl=GWEN_StringList2_new();
1816  rv=GWEN_XMLNode__CheckNameSpaceDecls1(n, sl, ns);
1818  if (rv) {
1819  DBG_INFO(GWEN_LOGDOMAIN, "here");
1820  return rv;
1821  }
1822 
1823  //rv=GWEN_XMLNode__CheckNameSpaceDecls2(n, ns);
1825  if (rv==-1)
1826  return rv;
1827  return 0;
1828 }
1829 
1830 
1831 
1833 {
1834  if (n && n->type==GWEN_XMLNodeTypeTag && n->data) {
1835  GWEN_XMLNODE *nn;
1836  GWEN_XMLPROPERTY *pp;
1837 
1838  if (n->nameSpace==0) {
1839  char *p;
1840 
1841  p=strchr(n->data, ':');
1842  if (p) {
1843  int len=p-n->data;
1844  char *s;
1845 
1846  n->nameSpace=(char *)GWEN_Memory_malloc(len);
1847  assert(n->nameSpace);
1848  memmove(n->nameSpace, n->data, len);
1849  n->nameSpace[len-1]=0;
1850  s=GWEN_Memory_strdup(p+1);
1851  free(n->data);
1852  n->data=s;
1853  }
1854  }
1855 
1856  pp=n->properties;
1857  while (pp) {
1858  if (pp->nameSpace==0) {
1859  char *p;
1860 
1861  p=strchr(pp->name, ':');
1862  if (p) {
1863  int len=p-pp->name;
1864  char *s;
1865 
1866  pp->nameSpace=(char *)GWEN_Memory_malloc(len);
1867  assert(pp->nameSpace);
1868  memmove(pp->nameSpace, pp->name, len);
1869  pp->nameSpace[len-1]=0;
1870  s=GWEN_Memory_strdup(p+1);
1871  free(pp->name);
1872  pp->name=s;
1873  }
1874  }
1875 
1876  pp=pp->next;
1877  }
1878 
1879  nn=GWEN_XMLNode_List_First(n->children);
1880  while (nn) {
1881  int rv;
1882 
1884  if (rv<0) {
1885  DBG_DEBUG(GWEN_LOGDOMAIN, "here (%d)", rv);
1886  return rv;
1887  }
1888  nn=GWEN_XMLNode_List_Next(nn);
1889  }
1890  }
1891 
1892  return 0;
1893 }
1894 
1895 
1896 
1897 
1898 
1899 
1900 
1901 
1902 
1904 {
1905  GWEN_XMLNODE_PATH *p;
1906 
1908  return p;
1909 }
1910 
1911 
1912 
1914 {
1915  GWEN_XMLNODE_PATH *p;
1916  unsigned int i;
1917 
1919  p->pos=np->pos;
1920  for (i=0; i<np->pos; i++) {
1921  p->nodes[i]=np->nodes[i];
1922  }
1923  return p;
1924 }
1925 
1926 
1927 
1929 {
1930  GWEN_FREE_OBJECT(np);
1931 }
1932 
1933 
1934 
1936  GWEN_XMLNODE *n)
1937 {
1938  unsigned int i;
1939 
1940  if (np->pos>=GWEN_XML_MAX_DEPTH) {
1941  DBG_ERROR(GWEN_LOGDOMAIN, "Path too deep");
1942  return 1;
1943  }
1944 
1945  /* check for double entries */
1946  for (i=0; i<np->pos; i++) {
1947  assert(np->nodes[i]!=n);
1948  }
1949  np->nodes[np->pos++]=n;
1950  DBG_DEBUG(GWEN_LOGDOMAIN, "Dived to %d", np->pos);
1951  return 0;
1952 }
1953 
1954 
1955 
1957 {
1958  if (np->pos==0) {
1959  DBG_DEBUG(GWEN_LOGDOMAIN, "Root reached");
1960  return 0;
1961  }
1962  DBG_DEBUG(GWEN_LOGDOMAIN, "Surfaced to %d", np->pos-1);
1963  return np->nodes[--np->pos];
1964 }
1965 
1966 
1967 
1969 {
1970  unsigned int i;
1971 
1972  if (np->pos==0) {
1973  DBG_NOTICE(GWEN_LOGDOMAIN, "Empty path");
1974  }
1975  for (i=0; i<np->pos; i++) {
1976  DBG_NOTICE(GWEN_LOGDOMAIN, "Path entry %d:", i);
1977  GWEN_XMLNode_Dump(np->nodes[i], 1);
1978  }
1979 }
1980 
1981 
1982 
1983 
1984 
1985 
1986 
1987 
1988 
1989 
1990 
1992  const char *url)
1993 {
1995 
1998 
1999  if (name)
2000  ns->name=GWEN_Memory_strdup(name);
2001  if (url)
2002  ns->url=GWEN_Memory_strdup(url);
2003 
2004  return ns;
2005 }
2006 
2007 
2008 
2010 {
2011  if (ns) {
2013  free(ns->url);
2014  free(ns->name);
2015  GWEN_FREE_OBJECT(ns);
2016  }
2017 }
2018 
2019 
2020 
2022 {
2024 
2025  assert(ns);
2026  nns=GWEN_XMLNode_NameSpace_new(ns->name, ns->url);
2027  return nns;
2028 }
2029 
2030 
2031 
2033 {
2034  assert(ns);
2035  return ns->name;
2036 }
2037 
2038 
2039 
2041 {
2042  assert(ns);
2043  return ns->url;
2044 }
2045 
2046 
2047 
2048 
2049 
2050 
2051 #include "xmlrw.c"
2052 #include "xmlglobalize.c"
2053 
2054 
2055 
int GWEN_DB_ReplaceVars(GWEN_DB_NODE *db, const char *s, GWEN_BUFFER *dbuf)
Definition: db.c:1951
GWEN_XMLNODE * GWEN_XMLNode_GetHeader(const GWEN_XMLNODE *n)
Definition: xml.c:1323
uint32_t GWEN_XMLNode_GetUsage(const GWEN_XMLNODE *n)
Definition: xml.c:362
char * GWEN_Buffer_GetStart(const GWEN_BUFFER *bf)
Definition: buffer.c:235
struct GWEN_STRINGLISTENTRYSTRUCT GWEN_STRINGLISTENTRY
Definition: stringlist.h:53
int GWEN_Buffer_InsertString(GWEN_BUFFER *bf, const char *buffer)
Definition: buffer.c:999
#define GWEN_LIST2_FUNCTIONS(t, pr)
Definition: list2.h:99
struct GWEN_XMLNODE_NAMESPACE GWEN_XMLNODE_NAMESPACE
Definition: xml.h:157
void GWEN_XMLNode_AddHeader(GWEN_XMLNODE *n, GWEN_XMLNODE *nh)
Definition: xml.c:1331
const char * GWEN_XML_FindNameSpace(GWEN_STRINGLIST2 *sl, const char *prefix, const char *name)
Definition: xml.c:1501
GWEN_XMLNODE_NAMESPACE_LIST * GWEN_XMLNode_GetNameSpaces(const GWEN_XMLNODE *n)
Definition: xml.c:1357
struct GWEN_DB_NODE GWEN_DB_NODE
Definition: db.h:228
#define GWEN_ERROR_INVALID
Definition: error.h:67
const char * GWEN_XMLNode_GetProperty(const GWEN_XMLNODE *n, const char *name, const char *defaultValue)
Definition: xml.c:239
const char * GWEN_XMLNode_NameSpace_GetName(const GWEN_XMLNODE_NAMESPACE *ns)
Definition: xml.c:2032
GWEN_XMLNODE * GWEN_XMLNode_GetNextData(const GWEN_XMLNODE *n)
Definition: xml.c:731
GWEN_XMLNODE_NAMESPACE * GWEN_XMLNode_FindNameSpaceByName(const GWEN_XMLNODE *n, const char *s)
Definition: xml.c:1365
int GWEN_XML_AddNameSpace(GWEN_STRINGLIST2 *sl, const char *prefix, const char *name)
Definition: xml.c:1424
void GWEN_XMLProperty_freeAll(GWEN_XMLPROPERTY *p)
Definition: xml.c:130
GWEN_XMLNODE * GWEN_XMLNode_FindNextTag(const GWEN_XMLNODE *n, const char *tname, const char *pname, const char *pvalue)
Definition: xml.c:794
char * GWEN_Memory_strdup(const char *s)
Definition: memory.c:76
int GWEN_XMLNode__SetNameSpaces(GWEN_XMLNODE *n, const char *prefix, const char *nspace)
Definition: xml.c:1729
#define DBG_NOTICE(dbg_logger, format, args...)
Definition: debug.h:152
GWEN_XMLNODE * GWEN_XMLNode_GetFirstData(const GWEN_XMLNODE *n)
Definition: xml.c:724
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 GWEN_FREE_OBJECT(varname)
Definition: memory.h:61
#define NULL
Definition: binreloc.c:300
void GWEN_Memory_dealloc(void *p)
Definition: memory.c:69
#define GWEN_PATH_FLAGS_CREATE_GROUP
Definition: path.h:96
GWEN_XMLNODE * GWEN_XMLNode_GetFirstOfType(const GWEN_XMLNODE *n, GWEN_XMLNODE_TYPE t)
Definition: xml.c:674
#define DBG_VERBOUS(dbg_logger, format, args...)
Definition: debug.h:224
void GWEN_XMLNode_SetProperty(GWEN_XMLNODE *n, const char *name, const char *value)
Definition: xml.c:322
void GWEN_XMLNode_Path_Dump(GWEN_XMLNODE_PATH *np)
Definition: xml.c:1968
void GWEN_XMLNode_Dump(const GWEN_XMLNODE *n, int ind)
Definition: xml.c:472
#define DBG_WARN(dbg_logger, format, args...)
Definition: debug.h:125
GWEN_XMLNODE * GWEN_XMLNode_FindTag(const GWEN_XMLNODE *n, const char *tname, const char *pname, const char *pvalue)
Definition: xml.c:743
int GWEN_XMLNode_IsChildOf(const GWEN_XMLNODE *parent, const GWEN_XMLNODE *child)
Definition: xml.c:1079
void GWEN_XMLNode_RemoveChildren(GWEN_XMLNODE *n)
Definition: xml.c:580
void GWEN_XMLNode_SetCharValue(GWEN_XMLNODE *n, const char *name, const char *value)
Definition: xml.c:897
#define GWEN_LOGDOMAIN
Definition: logger.h:35
struct GWEN_XMLNODE_PATH GWEN_XMLNODE_PATH
Definition: xml.h:866
void GWEN_XMLNode_AddNameSpace(GWEN_XMLNODE *n, const GWEN_XMLNODE_NAMESPACE *ns)
Definition: xml.c:1407
GWEN_XMLNODE * GWEN_XMLNode_new(GWEN_XMLNODE_TYPE t, const char *data)
Definition: xml.c:144
int GWEN_Buffer_ReserveBytes(GWEN_BUFFER *bf, uint32_t res)
Definition: buffer.c:157
void GWEN_XMLNode_NameSpace_free(GWEN_XMLNODE_NAMESPACE *ns)
Definition: xml.c:2009
GWEN_BUFFER * GWEN_Buffer_new(char *buffer, uint32_t size, uint32_t used, int take)
Definition: buffer.c:42
void GWEN_XMLNode_CopyProperties(GWEN_XMLNODE *tn, const GWEN_XMLNODE *sn, int overwrite)
Definition: xml.c:588
void GWEN_XMLNode_SetData(GWEN_XMLNODE *n, const char *data)
Definition: xml.c:377
GWEN_XMLPROPERTY * GWEN_XMLNode_GetFirstProperty(const GWEN_XMLNODE *n)
Definition: xml.c:1045
#define GWEN_LIST_DEL(typ, sr, head)
Definition: misc.h:116
GWEN_STRINGLISTENTRY * GWEN_StringList_FirstEntry(const GWEN_STRINGLIST *sl)
Definition: stringlist.c:390
const char * GWEN_StringList2Iterator_Data(GWEN_STRINGLIST2_ITERATOR *li)
Definition: stringlist2.c:456
void GWEN_Buffer_Reset(GWEN_BUFFER *bf)
Definition: buffer.c:650
GWEN_XMLNODE_NAMESPACE * GWEN_XMLNode_NameSpace_new(const char *name, const char *url)
Definition: xml.c:1991
const char * GWEN_StringListEntry_Data(const GWEN_STRINGLISTENTRY *se)
Definition: stringlist.c:406
int GWEN_XMLNode_GetIntValue(const GWEN_XMLNODE *n, const char *name, int defValue)
Definition: xml.c:923
GWEN_XMLNODE * GWEN_XMLNode_GetChild(const GWEN_XMLNODE *n)
Definition: xml.c:409
#define GWEN_PATH_FLAGS_LAST
Definition: path.h:166
const char * GWEN_XML_FindNameSpaceByPrefix(GWEN_STRINGLIST2 *sl, const char *s)
Definition: xml.c:1444
#define GWEN_PATH_FLAGS_NAMEMUSTNOTEXIST
Definition: path.h:89
GWEN_XMLNODE * GWEN_XMLNode_FindFirstTag(const GWEN_XMLNODE *n, const char *tname, const char *pname, const char *pvalue)
Definition: xml.c:776
GWEN_XMLNODE_NAMESPACE * GWEN_XMLNode_FindNameSpaceByUrl(const GWEN_XMLNODE *n, const char *s)
Definition: xml.c:1386
#define GWEN_PATH_FLAGS_ROOT
Definition: path.h:174
void GWEN_XMLNode_DelHeader(GWEN_XMLNODE *n, GWEN_XMLNODE *nh)
Definition: xml.c:1340
void GWEN_XMLProperty_insert(GWEN_XMLPROPERTY *p, GWEN_XMLPROPERTY **head)
Definition: xml.c:118
#define GWEN_NEW_OBJECT(typ, varname)
Definition: memory.h:55
int GWEN_XMLNode_GetIntProperty(const GWEN_XMLNODE *n, const char *name, int defaultValue)
Definition: xml.c:263
GWEN_XMLNODE_TYPE GWEN_XMLNode_GetType(const GWEN_XMLNODE *n)
Definition: xml.c:458
GWEN_XMLNODE_PATH * GWEN_XMLNode_Path_new(void)
Definition: xml.c:1903
const char * GWEN_StringList2Iterator_Next(GWEN_STRINGLIST2_ITERATOR *li)
Definition: stringlist2.c:449
const char * GWEN_XMLNode_GetCharValue(const GWEN_XMLNODE *n, const char *name, const char *defValue)
Definition: xml.c:812
GWEN_XMLPROPERTY * GWEN_XMLNode_GetNextProperty(const GWEN_XMLNODE *n, const GWEN_XMLPROPERTY *pr)
Definition: xml.c:1053
int GWEN_XMLNode_SetIntValueByPath(GWEN_XMLNODE *n, uint32_t flags, const char *name, int value)
Definition: xml.c:1003
int GWEN_XMLNode__CheckAndSetNameSpace(GWEN_XMLNODE *n, const char *prefix, const char *nspace)
Definition: xml.c:1652
#define DBG_DEBUG(dbg_logger, format, args...)
Definition: debug.h:214
int GWEN_Buffer_AppendBuffer(GWEN_BUFFER *bf, GWEN_BUFFER *sf)
Definition: buffer.c:507
int GWEN_XMLNode__CheckNameSpaceDecls3(GWEN_XMLNODE *n)
Definition: xml.c:1760
GWEN_XMLPROPERTY * GWEN_XMLProperty_new(const char *name, const char *value)
Definition: xml.c:72
void GWEN_StringList2_free(GWEN_STRINGLIST2 *sl2)
Definition: stringlist2.c:63
GWEN_XMLNODE * GWEN_XMLNode_GetNextTag(const GWEN_XMLNODE *n)
Definition: xml.c:712
const char * GWEN_XMLNode_GetNamespace(const GWEN_XMLNODE *n)
Definition: xml.c:389
int GWEN_Buffer_InsertByte(GWEN_BUFFER *bf, char c)
Definition: buffer.c:911
#define GWEN_PATH_FLAGS_VARIABLE
Definition: path.h:111
void * GWEN_Memory_malloc(size_t wsize)
Definition: memory.c:39
GWEN_XMLNODE * GWEN_XMLNode_Path_Surface(GWEN_XMLNODE_PATH *np)
Definition: xml.c:1956
GWEN_XMLNODE * GWEN_XMLNode_GetNodeByXPath(GWEN_XMLNODE *n, const char *path, uint32_t flags)
Definition: xml.c:1311
GWEN_XMLNODE * GWEN_XMLNode_Next(const GWEN_XMLNODE *n)
Definition: xml.c:465
GWEN_XMLNODE * GWEN_XMLNode_FindNode(const GWEN_XMLNODE *node, GWEN_XMLNODE_TYPE t, const char *data)
Definition: xml.c:543
struct GWEN_STRINGLISTSTRUCT GWEN_STRINGLIST
Definition: stringlist.h:56
void GWEN_XMLNode_SetNamespace(GWEN_XMLNODE *n, const char *s)
Definition: xml.c:397
GWEN_XMLNODE * GWEN_XMLNode_List_Next(const GWEN_XMLNODE *element)
int GWEN_Buffer_AppendByte(GWEN_BUFFER *bf, char c)
Definition: buffer.c:394
void * GWEN_XMLNode_HandlePath(const char *entry, void *data, int idx, uint32_t flags)
Definition: xml.c:1201
void GWEN_XMLNode_List_Del(GWEN_XMLNODE *element)
void GWEN_Buffer_free(GWEN_BUFFER *bf)
Definition: buffer.c:89
void GWEN_XMLNode_free(GWEN_XMLNODE *n)
Definition: xml.c:160
void GWEN_XMLNode_UnlinkChild(GWEN_XMLNODE *n, GWEN_XMLNODE *child)
Definition: xml.c:570
struct GWEN_BUFFER GWEN_BUFFER
A dynamically resizeable text buffer.
Definition: buffer.h:38
GWEN_XMLNODE * GWEN_XMLNode_GetParent(const GWEN_XMLNODE *n)
Definition: xml.c:416
void GWEN_XMLNode_DecUsage(GWEN_XMLNODE *n)
Definition: xml.c:350
int GWEN_XMLNode_GetXPath(const GWEN_XMLNODE *n1, const GWEN_XMLNODE *n2, GWEN_BUFFER *nbuf)
Definition: xml.c:1097
#define GWEN_PATH_FLAGS_PATHCREATE
Definition: path.h:78
#define GWEN_PATH_FLAGS_CREATE_VAR
Definition: path.h:103
void GWEN_XMLNode_SetIntProperty(GWEN_XMLNODE *n, const char *name, int value)
Definition: xml.c:330
GWEN_XMLNODE_TYPE
Definition: xml.h:142
#define GWEN_PATH_FLAGS_PATHMUSTNOTEXIST
Definition: path.h:70
void GWEN_XMLNode_NameSpace_List_free(GWEN_XMLNODE_NAMESPACE_LIST *l)
#define GWEN_LIST_INSERT(typ, sr, head)
Definition: misc.h:100
#define DBG_ERROR(dbg_logger, format, args...)
Definition: debug.h:97
GWEN_XMLNODE * GWEN_XMLNode_GetFirstTag(const GWEN_XMLNODE *n)
Definition: xml.c:705
int GWEN_XMLNode_SetCharValueByPath(GWEN_XMLNODE *n, uint32_t flags, const char *name, const char *value)
Definition: xml.c:953
const char * GWEN_XMLNode_GetData(const GWEN_XMLNODE *n)
Definition: xml.c:370
GWEN_XMLNODE_NAMESPACE * GWEN_XMLNode_NameSpace_dup(const GWEN_XMLNODE_NAMESPACE *ns)
Definition: xml.c:2021
const char * GWEN_XMLNode_GetLocalizedCharValue(const GWEN_XMLNODE *n, const char *name, const char *defValue)
Definition: xml.c:846
struct GWEN_STRINGLIST2 GWEN_STRINGLIST2
Definition: stringlist2.h:43
void GWEN_XMLProperty_del(GWEN_XMLPROPERTY *p, GWEN_XMLPROPERTY **head)
Definition: xml.c:124
void GWEN_XMLNode__SetProperty(GWEN_XMLNODE *n, const char *name, const char *value, int doInsert)
Definition: xml.c:290
int GWEN_Text_ComparePattern(const char *w, const char *p, int sensecase)
Definition: text.c:1208
GWEN_XMLNODE * GWEN_XMLNode_GetNextOfType(const GWEN_XMLNODE *n, GWEN_XMLNODE_TYPE t)
Definition: xml.c:691
GWEN_STRINGLISTENTRY * GWEN_StringListEntry_Next(const GWEN_STRINGLISTENTRY *se)
Definition: stringlist.c:398
GWEN_XMLNODE_PATH * GWEN_XMLNode_Path_dup(const GWEN_XMLNODE_PATH *np)
Definition: xml.c:1913
void GWEN_XMLNode_List_Add(GWEN_XMLNODE *element, GWEN_XMLNODE_LIST *list)
#define GWEN_PATH_FLAGS_PATHMUSTEXIST
Definition: path.h:66
GWEN_STRINGLIST2 * GWEN_StringList2_new(void)
Definition: stringlist2.c:45
GWEN_XMLNODE * GWEN_XMLNode_dup(const GWEN_XMLNODE *n)
Definition: xml.c:187
void GWEN_XMLNode_List_free(GWEN_XMLNODE_LIST *l)
int GWEN_XMLNode__CheckNameSpaceDecls1(GWEN_XMLNODE *n, GWEN_STRINGLIST2 *sl, const char *currentNameSpace)
Definition: xml.c:1542
#define DBG_INFO(dbg_logger, format, args...)
Definition: debug.h:181
int GWEN_XMLNode_Path_Dive(GWEN_XMLNODE_PATH *np, GWEN_XMLNODE *n)
Definition: xml.c:1935
void GWEN_StringList2Iterator_free(GWEN_STRINGLIST2_ITERATOR *li)
Definition: stringlist2.c:435
void GWEN_XMLNode_NameSpace_List_Add(GWEN_XMLNODE_NAMESPACE *element, GWEN_XMLNODE_NAMESPACE_LIST *list)
int GWEN_XMLNode_GetIntValueByPath(GWEN_XMLNODE *n, const char *name, int defValue)
Definition: xml.c:1025
#define GWEN_LIST_INIT(t, element)
Definition: list1.h:465
const char * GWEN_XMLProperty_GetName(const GWEN_XMLPROPERTY *pr)
Definition: xml.c:1063
int GWEN_XMLNode_NormalizeNameSpaces(GWEN_XMLNODE *n)
Definition: xml.c:1808
void GWEN_XMLNode_ClearHeaders(GWEN_XMLNODE *n)
Definition: xml.c:1349
const char * GWEN_XMLNode_GetCharValueByPath(GWEN_XMLNODE *n, const char *name, const char *defValue)
Definition: xml.c:981
void GWEN_XMLNode_AddChildrenOnly(GWEN_XMLNODE *n, GWEN_XMLNODE *nn, int copythem)
Definition: xml.c:432
void GWEN_XMLNode_Path_free(GWEN_XMLNODE_PATH *np)
Definition: xml.c:1928
const char * GWEN_XMLProperty_GetValue(const GWEN_XMLPROPERTY *pr)
Definition: xml.c:1071
int GWEN_XMLNode_ExpandProperties(const GWEN_XMLNODE *n, GWEN_DB_NODE *dbVars)
Definition: xml.c:634
#define GWEN_LIST_ADD(typ, sr, head)
Definition: misc.h:82
#define GWEN_LIST_FUNCTIONS(t, pr)
Definition: list1.h:366
void * GWEN_Path_HandleWithIdx(const char *path, void *data, uint32_t flags, GWEN_PATHIDXHANDLERPTR elementFunction)
Definition: path.c:210
void GWEN_XMLNode_IncUsage(GWEN_XMLNODE *n)
Definition: xml.c:342
void GWEN_XMLProperty_free(GWEN_XMLPROPERTY *p)
Definition: xml.c:86
void GWEN_XMLNode_List_Clear(GWEN_XMLNODE_LIST *l)
GWEN_STRINGLIST2_ITERATOR * GWEN_StringList2_First(const GWEN_STRINGLIST2 *l)
Definition: stringlist2.c:419
GWEN_STRINGLIST * GWEN_I18N_GetCurrentLocaleList(void)
Definition: i18n.c:241
const char * GWEN_XML_FindNameSpaceByName(GWEN_STRINGLIST2 *sl, const char *s)
Definition: xml.c:1471
GWEN_XMLNODE_NAMESPACE * GWEN_XMLNode_NameSpace_List_Next(const GWEN_XMLNODE_NAMESPACE *element)
GWEN_XMLPROPERTY * GWEN_XMLProperty_dup(const GWEN_XMLPROPERTY *p)
Definition: xml.c:98
GWEN_XMLNODE_LIST * GWEN_XMLNode_List_new()
#define GWEN_PATH_FLAGS_NAMEMUSTEXIST
Definition: path.h:84
#define GWEN_LIST_FINI(t, element)
Definition: list1.h:474
GWEN_XMLNODE_NAMESPACE_LIST * GWEN_XMLNode_NameSpace_List_new()
int GWEN_StringList2_AppendString(GWEN_STRINGLIST2 *sl2, const char *s, int take, GWEN_STRINGLIST2_INSERTMODE m)
Definition: stringlist2.c:196
struct GWEN__XMLNODE GWEN_XMLNODE
Definition: xml.h:156
GWEN_XMLNODE * GWEN_XMLNode_List_First(const GWEN_XMLNODE_LIST *l)
void GWEN_XMLProperty_add(GWEN_XMLPROPERTY *p, GWEN_XMLPROPERTY **head)
Definition: xml.c:111
int GWEN_Buffer_AppendString(GWEN_BUFFER *bf, const char *buffer)
Definition: buffer.c:989
GWEN_LIST_ITERATOR GWEN_STRINGLIST2_ITERATOR
Definition: stringlist2.h:44
#define GWEN_XML_PATH_FLAGS_OVERWRITE_VALUES
Definition: xml.h:133
GWEN_XMLNODE_NAMESPACE * GWEN_XMLNode_NameSpace_List_First(const GWEN_XMLNODE_NAMESPACE_LIST *l)
int GWEN_XMLNode_StripNamespaces(GWEN_XMLNODE *n)
Definition: xml.c:1832
void GWEN_XMLNode_AddChild(GWEN_XMLNODE *n, GWEN_XMLNODE *child)
Definition: xml.c:423
void GWEN_XMLNode_SetIntValue(GWEN_XMLNODE *n, const char *name, int value)
Definition: xml.c:940
void GWEN_XMLNode_freeAll(GWEN_XMLNODE *n)
Definition: xml.c:175