1 /***************************************************************************
2  $RCSfile$
3  -------------------
4  cvs         : $Id$
5  begin       : Sat Jun 28 2003
6  copyright   : (C) 2003 by Martin Preuss
7  email       : martin@libchipcard.de
8 
9  ***************************************************************************
10  *                                                                         *
11  *   This library is free software; you can redistribute it and/or         *
12  *   modify it under the terms of the GNU Lesser General Public            *
13  *   License as published by the Free Software Foundation; either          *
14  *   version 2.1 of the License, or (at your option) any later version.    *
15  *                                                                         *
16  *   This library is distributed in the hope that it will be useful,       *
17  *   but WITHOUT ANY WARRANTY; without even the implied warranty of        *
18  *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU     *
19  *   Lesser General Public License for more details.                       *
20  *                                                                         *
21  *   You should have received a copy of the GNU Lesser General Public      *
22  *   License along with this library; if not, write to the Free Software   *
23  *   Foundation, Inc., 59 Temple Place, Suite 330, Boston,                 *
24  *   MA  02111-1307  USA                                                   *
25  *                                                                         *
26  ***************************************************************************/
27 
28 #ifndef GWENHYWFAR_XML_P_H
29 #define GWENHYWFAR_XML_P_H
30 
31 #include "xml_l.h"
32 #include <gwenhywfar/fastbuffer.h>
33 
34 
35 
36 #define GWEN_XML_FLAGS__INTERNAL 0xf0000000
37 #define GWEN_XML_FLAGS__DATA     0x10000000
38 
39 #define GWEN_XML_MAX_DEPTH 32
40 
41 struct GWEN__XMLPROPERTY {
42   GWEN_XMLPROPERTY *next;
43   char *name;
44   char *value;
45   char *nameSpace;
46 };
47 
48 
49 GWEN_XMLPROPERTY *GWEN_XMLProperty_new(const char *name, const char *value);
50 void GWEN_XMLProperty_free(GWEN_XMLPROPERTY *p);
51 GWEN_XMLPROPERTY *GWEN_XMLProperty_dup(const GWEN_XMLPROPERTY *p);
52 void GWEN_XMLProperty_freeAll(GWEN_XMLPROPERTY *p);
53 
54 void GWEN_XMLProperty_add(GWEN_XMLPROPERTY *p, GWEN_XMLPROPERTY **head);
55 void GWEN_XMLProperty_insert(GWEN_XMLPROPERTY *p, GWEN_XMLPROPERTY **head);
56 void GWEN_XMLProperty_del(GWEN_XMLPROPERTY *p, GWEN_XMLPROPERTY **head);
57 
58 struct GWEN__XMLNODE {
59   GWEN_LIST_ELEMENT(GWEN_XMLNODE)
60 
61   GWEN_XMLNODE_LIST *children;
62   GWEN_XMLNODE *parent;
63 
64   GWEN_XMLNODE_LIST *headers;
65   GWEN_XMLNODE_NAMESPACE_LIST *nameSpaces;
66 
67   GWEN_XMLNODE_TYPE type;
68   GWEN_XMLPROPERTY *properties;
69   uint32_t usage;
70   char *data;
71   char *nameSpace;
72 };
73 
74 
75 struct GWEN_XMLNODE_PATH {
76   unsigned int pos;
77   GWEN_XMLNODE *nodes[GWEN_XML_MAX_DEPTH];
78 };
79 
80 
81 
82 struct GWEN_XMLNODE_NAMESPACE {
83   GWEN_LIST_ELEMENT(GWEN_XMLNODE_NAMESPACE)
84   char *name;
85   char *url;
86 };
87 
88 
89 
90 static void GWEN_XMLNode__SetProperty(GWEN_XMLNODE *n,
91                                       const char *name, const char *value,
92                                       int doInsert);
93 
94 static int GWEN_XMLNode__WriteToStream(const GWEN_XMLNODE *n,
95                                        GWEN_FAST_BUFFER *fb,
96                                        uint32_t flags,
97                                        const char *encoding,
98                                        unsigned int ind);
99 
100 
101 static GWEN_XMLNODE *GWEN_XMLNode_GetFirstOfType(const GWEN_XMLNODE *n,
102                                                  GWEN_XMLNODE_TYPE t);
103 static GWEN_XMLNODE *GWEN_XMLNode_GetNextOfType(const GWEN_XMLNODE *n,
104                                                 GWEN_XMLNODE_TYPE t);
105 
106 static GWEN_XMLNODE *GWEN_XMLNode_FindTag(const GWEN_XMLNODE *n,
107                                           const char *tname,
108                                           const char *pname,
109                                           const char *pvalue);
110 
111 
112 /**
113  * Removes all namespace declarations which have been declared in a higher
114  * level.
115  */
116 static int GWEN_XMLNode__CheckNameSpaceDecls1(GWEN_XMLNODE *n,
117                                               GWEN_STRINGLIST2 *sl,
118                                               const char *currentNameSpace);
119 
120 /**
121  * Moves all namespace declarations from this node to the nodes
122  * of first use
123  */
124 static int GWEN_XMLNode__CheckNameSpaceDecls3(GWEN_XMLNODE *n);
125 
126 
127 static int GWEN_XMLNode__SetNameSpaces(GWEN_XMLNODE *n,
128                                        const char *prefix,
129                                        const char *nspace);
130 static int GWEN_XMLNode__CheckAndSetNameSpace(GWEN_XMLNODE *n,
131                                               const char *prefix,
132                                               const char *nspace);
133 
134 static int GWEN_XML__ReadData(GWEN_XML_CONTEXT *ctx,
135                               GWEN_FAST_BUFFER *fb,
136                               uint32_t flags);
137 
138 static int GWEN_XML__ReadTag(GWEN_XML_CONTEXT *ctx,
139                              GWEN_FAST_BUFFER *fb,
140                              uint32_t flags,
141                              GWEN_BUFFER *workBuf);
142 
143 static int GWEN_XML__ReadAllFromIo(GWEN_XML_CONTEXT *ctx, GWEN_SYNCIO *sio);
144 
145 
146 static GWEN_XMLNODE_NAMESPACE *GWEN_XMLGL__GetNameSpaceByPrefix(GWEN_XMLNODE *n,
147                                                                 const char *prefix);
148 
149 static int GWEN_XMLGL__SampleNameSpaces(GWEN_XMLNODE *n,
150                                         GWEN_XMLNODE_NAMESPACE_LIST *l,
151                                         uint32_t *pLastId);
152 
153 static void GWEN_XMLGL__ClearNameSpaces(GWEN_XMLNODE *n);
154 
155 static int GWEN_XMLGL__TranslateName(GWEN_XMLNODE *n,
156                                      GWEN_XMLNODE_NAMESPACE_LIST *l,
157                                      char **pValue);
158 
159 
160 #endif
161