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 #ifdef HAVE_CONFIG_H
26 # include <config.h>
27 #endif
28 
29 
30 #include "xsdnode_p.h"
31 
32 #include <gwenhywfar/debug.h>
33 #include <gwenhywfar/misc.h>
34 
35 #include <stdlib.h>
36 #include <assert.h>
37 #include <string.h>
38 #include <ctype.h>
39 
40 
41 GWEN_INHERIT_FUNCTIONS(GWEN_XSD_NODE)
GWEN_LIST_FUNCTIONS(GWEN_XSD_NODE,GWEN_XsdNode)42 GWEN_LIST_FUNCTIONS(GWEN_XSD_NODE, GWEN_XsdNode)
43 
44 
45 
46 GWEN_XSD_NODE *GWEN_XsdNode_new(GWEN_XSD_NODE *parent,
47                                 GWEN_XSD_NODETYPE t,
48                                 const char *name)
49 {
50   GWEN_XSD_NODE *xsdNode;
51 
52   GWEN_NEW_OBJECT(GWEN_XSD_NODE, xsdNode);
53   GWEN_INHERIT_INIT(GWEN_XSD_NODE, xsdNode);
54   GWEN_LIST_INIT(GWEN_XSD_NODE, xsdNode);
55   xsdNode->nodeType=t;
56   xsdNode->parent=parent;
57   xsdNode->children=GWEN_XsdNode_List_new();
58   if (name)
59     xsdNode->name=strdup(name);
60 
61   return xsdNode;
62 }
63 
64 
65 
GWEN_XsdNode_free(GWEN_XSD_NODE * xsdNode)66 void GWEN_XsdNode_free(GWEN_XSD_NODE *xsdNode)
67 {
68   if (xsdNode) {
69     GWEN_LIST_FINI(GWEN_XSD_NODE, xsdNode);
70     GWEN_INHERIT_FINI(GWEN_XSD_NODE, xsdNode);
71     GWEN_XsdNode_List_free(xsdNode->children);
72     free(xsdNode->name);
73     GWEN_FREE_OBJECT(xsdNode);
74   }
75 }
76 
77 
78 
GWEN_XsdNode_GetNodeType(const GWEN_XSD_NODE * xsdNode)79 GWEN_XSD_NODETYPE GWEN_XsdNode_GetNodeType(const GWEN_XSD_NODE *xsdNode)
80 {
81   assert(xsdNode);
82   return xsdNode->nodeType;
83 }
84 
85 
86 
GWEN_XsdNode_GetName(const GWEN_XSD_NODE * xsdNode)87 const char *GWEN_XsdNode_GetName(const GWEN_XSD_NODE *xsdNode)
88 {
89   assert(xsdNode);
90   return xsdNode->name;
91 }
92 
93 
94 
GWEN_XsdNode_GetFlags(const GWEN_XSD_NODE * xsdNode)95 uint32_t GWEN_XsdNode_GetFlags(const GWEN_XSD_NODE *xsdNode)
96 {
97   assert(xsdNode);
98   return xsdNode->flags;
99 }
100 
101 
102 
GWEN_XsdNode_SetFlags(GWEN_XSD_NODE * xsdNode,uint32_t fl)103 void GWEN_XsdNode_SetFlags(GWEN_XSD_NODE *xsdNode, uint32_t fl)
104 {
105   assert(xsdNode);
106   xsdNode->flags=fl;
107 }
108 
109 
110 
GWEN_XsdNode_AddFlags(GWEN_XSD_NODE * xsdNode,uint32_t fl)111 void GWEN_XsdNode_AddFlags(GWEN_XSD_NODE *xsdNode, uint32_t fl)
112 {
113   assert(xsdNode);
114   xsdNode->flags|=fl;
115 }
116 
117 
118 
GWEN_XsdNode_SubFlags(GWEN_XSD_NODE * xsdNode,uint32_t fl)119 void GWEN_XsdNode_SubFlags(GWEN_XSD_NODE *xsdNode, uint32_t fl)
120 {
121   assert(xsdNode);
122   xsdNode->flags&=~fl;
123 }
124 
125 
126 
GWEN_XsdNode_GetParent(const GWEN_XSD_NODE * xsdNode)127 GWEN_XSD_NODE *GWEN_XsdNode_GetParent(const GWEN_XSD_NODE *xsdNode)
128 {
129   assert(xsdNode);
130   return xsdNode->parent;
131 }
132 
133 
134 
GWEN_XsdNode_GetChildren(const GWEN_XSD_NODE * xsdNode)135 GWEN_XSD_NODE_LIST *GWEN_XsdNode_GetChildren(const GWEN_XSD_NODE *xsdNode)
136 {
137   assert(xsdNode);
138   return xsdNode->children;
139 }
140 
141 
142 
GWEN_XsdNode_AddChild(GWEN_XSD_NODE * xsdNode,GWEN_XSD_NODE * newChild)143 void GWEN_XsdNode_AddChild(GWEN_XSD_NODE *xsdNode, GWEN_XSD_NODE *newChild)
144 {
145   assert(xsdNode);
146   assert(newChild);
147   GWEN_XsdNode_List_Add(newChild, xsdNode->children);
148   newChild->parent=xsdNode;
149 }
150 
151 
152 
GWEN_XsdNode_Unlink(GWEN_XSD_NODE * xsdNode)153 void GWEN_XsdNode_Unlink(GWEN_XSD_NODE *xsdNode)
154 {
155   GWEN_XsdNode_List_Del(xsdNode);
156   xsdNode->parent=NULL;
157 }
158 
159 
160 
GWEN_XsdNode_SetReadFn(GWEN_XSD_NODE * xsdNode,GWEN_XSDNODE_READ_FN fn)161 GWEN_XSDNODE_READ_FN GWEN_XsdNode_SetReadFn(GWEN_XSD_NODE *xsdNode,
162                                             GWEN_XSDNODE_READ_FN fn)
163 {
164   GWEN_XSDNODE_READ_FN oldFn;
165 
166   assert(xsdNode);
167   oldFn=xsdNode->readFn;
168   xsdNode->readFn=fn;
169   return oldFn;
170 }
171 
172 
173 
GWEN_XsdNode_SetWriteFn(GWEN_XSD_NODE * xsdNode,GWEN_XSDNODE_WRITE_FN fn)174 GWEN_XSDNODE_WRITE_FN GWEN_XsdNode_SetWriteFn(GWEN_XSD_NODE *xsdNode,
175                                               GWEN_XSDNODE_WRITE_FN fn)
176 {
177   GWEN_XSDNODE_WRITE_FN oldFn;
178 
179   assert(xsdNode);
180   oldFn=xsdNode->writeFn;
181   xsdNode->writeFn=fn;
182   return oldFn;
183 }
184 
185 
186 
GWEN_XsdNode_Read(GWEN_XSD_NODE * xsdNode,GWEN_XMLNODE * xmlNode,GWEN_DB_NODE * db)187 int GWEN_XsdNode_Read(GWEN_XSD_NODE *xsdNode,
188                       GWEN_XMLNODE *xmlNode,
189                       GWEN_DB_NODE *db)
190 {
191   assert(xsdNode);
192   if (xsdNode->readFn)
193     return xsdNode->readFn(xsdNode, xmlNode, db);
194   else
195     return GWEN_ERROR_NOT_SUPPORTED;
196 }
197 
198 
199 
GWEN_XsdNode_Write(GWEN_XSD_NODE * xsdNode,GWEN_XMLNODE * xmlNode,GWEN_DB_NODE * db)200 int GWEN_XsdNode_Write(GWEN_XSD_NODE *xsdNode,
201                        GWEN_XMLNODE *xmlNode,
202                        GWEN_DB_NODE *db)
203 {
204   assert(xsdNode);
205   if (xsdNode->writeFn)
206     return xsdNode->writeFn(xsdNode, xmlNode, db);
207   else
208     return GWEN_ERROR_NOT_SUPPORTED;
209 }
210 
211 
212 
213 
214