1 /***************************************************************************
2     begin       : Sat Apr 18 2018
3     copyright   : (C) 2020 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 #ifdef HAVE_CONFIG_H
27 # include <config.h>
28 #endif
29 
30 
31 
32 #include "xmlcmd_gxml_p.h"
33 
34 #include <gwenhywfar/debug.h>
35 
36 
37 #include <ctype.h>
38 
39 
40 GWEN_INHERIT(GWEN_XMLCOMMANDER, GWEN_XMLCMD_GXML)
41 
42 
43 
44 
45 static void GWENHYWFAR_CB _freeData(void *bp, void *p);
46 
47 
48 
49 
50 
51 
GWEN_XmlCommanderGwenXml_new(GWEN_XMLNODE * documentRoot,GWEN_DB_NODE * dbRoot)52 GWEN_XMLCOMMANDER *GWEN_XmlCommanderGwenXml_new(GWEN_XMLNODE *documentRoot, GWEN_DB_NODE *dbRoot)
53 {
54   GWEN_XMLCOMMANDER *cmd;
55   GWEN_XMLCMD_GXML *xcmd;
56 
57   cmd=GWEN_XmlCommander_new();
58   GWEN_NEW_OBJECT(GWEN_XMLCMD_GXML, xcmd);
59   GWEN_INHERIT_SETDATA(GWEN_XMLCOMMANDER, GWEN_XMLCMD_GXML, cmd, xcmd, _freeData);
60 
61   xcmd->docRoot=documentRoot;
62   xcmd->xmlNodeStack=GWEN_XMLNode_List2_new();
63   xcmd->dbRoot=dbRoot;
64   xcmd->tempDbRoot=GWEN_DB_Group_new("dbTempRoot");
65 
66   xcmd->currentDbGroup=xcmd->dbRoot;
67   xcmd->currentTempDbGroup=xcmd->tempDbRoot;
68   xcmd->currentDocNode=documentRoot;
69 
70   return cmd;
71 }
72 
73 
74 
_freeData(GWEN_UNUSED void * bp,void * p)75 void GWENHYWFAR_CB _freeData(GWEN_UNUSED void *bp, void *p)
76 {
77   GWEN_XMLCMD_GXML *xcmd;
78 
79   xcmd=(GWEN_XMLCMD_GXML*) p;
80 
81   GWEN_XMLNode_List2_free(xcmd->xmlNodeStack);
82   xcmd->xmlNodeStack=NULL;
83 
84   GWEN_DB_Group_free(xcmd->tempDbRoot);
85   GWEN_FREE_OBJECT(xcmd);
86 }
87 
88 
89 
GWEN_XmlCommanderGwenXml_GetDocRoot(const GWEN_XMLCOMMANDER * cmd)90 GWEN_XMLNODE *GWEN_XmlCommanderGwenXml_GetDocRoot(const GWEN_XMLCOMMANDER *cmd)
91 {
92   GWEN_XMLCMD_GXML *xcmd;
93 
94   assert(cmd);
95   xcmd=GWEN_INHERIT_GETDATA(GWEN_XMLCOMMANDER, GWEN_XMLCMD_GXML, cmd);
96   assert(xcmd);
97 
98   return xcmd->docRoot;
99 }
100 
101 
102 
GWEN_XmlCommanderGwenXml_GetCurrentDocNode(const GWEN_XMLCOMMANDER * cmd)103 GWEN_XMLNODE *GWEN_XmlCommanderGwenXml_GetCurrentDocNode(const GWEN_XMLCOMMANDER *cmd)
104 {
105   GWEN_XMLCMD_GXML *xcmd;
106 
107   assert(cmd);
108   xcmd=GWEN_INHERIT_GETDATA(GWEN_XMLCOMMANDER, GWEN_XMLCMD_GXML, cmd);
109   assert(xcmd);
110 
111   return xcmd->currentDocNode;
112 }
113 
114 
115 
GWEN_XmlCommanderGwenXml_SetCurrentDocNode(GWEN_XMLCOMMANDER * cmd,GWEN_XMLNODE * n)116 void GWEN_XmlCommanderGwenXml_SetCurrentDocNode(GWEN_XMLCOMMANDER *cmd, GWEN_XMLNODE *n)
117 {
118   GWEN_XMLCMD_GXML *xcmd;
119 
120   assert(cmd);
121   xcmd=GWEN_INHERIT_GETDATA(GWEN_XMLCOMMANDER, GWEN_XMLCMD_GXML, cmd);
122   assert(xcmd);
123 
124   xcmd->currentDocNode=n;
125 }
126 
127 
128 
GWEN_XmlCommanderGwenXml_GetDbRoot(const GWEN_XMLCOMMANDER * cmd)129 GWEN_DB_NODE *GWEN_XmlCommanderGwenXml_GetDbRoot(const GWEN_XMLCOMMANDER *cmd)
130 {
131   GWEN_XMLCMD_GXML *xcmd;
132 
133   assert(cmd);
134   xcmd=GWEN_INHERIT_GETDATA(GWEN_XMLCOMMANDER, GWEN_XMLCMD_GXML, cmd);
135   assert(xcmd);
136 
137   return xcmd->dbRoot;
138 }
139 
140 
141 
GWEN_XmlCommanderGwenXml_GetCurrentDbGroup(const GWEN_XMLCOMMANDER * cmd)142 GWEN_DB_NODE *GWEN_XmlCommanderGwenXml_GetCurrentDbGroup(const GWEN_XMLCOMMANDER *cmd)
143 {
144   GWEN_XMLCMD_GXML *xcmd;
145 
146   assert(cmd);
147   xcmd=GWEN_INHERIT_GETDATA(GWEN_XMLCOMMANDER, GWEN_XMLCMD_GXML, cmd);
148   assert(xcmd);
149 
150   return xcmd->currentDbGroup;
151 }
152 
153 
154 
GWEN_XmlCommanderGwenXml_SetCurrentDbGroup(GWEN_XMLCOMMANDER * cmd,GWEN_DB_NODE * db)155 void GWEN_XmlCommanderGwenXml_SetCurrentDbGroup(GWEN_XMLCOMMANDER *cmd, GWEN_DB_NODE *db)
156 {
157   GWEN_XMLCMD_GXML *xcmd;
158 
159   assert(cmd);
160   xcmd=GWEN_INHERIT_GETDATA(GWEN_XMLCOMMANDER, GWEN_XMLCMD_GXML, cmd);
161   assert(xcmd);
162 
163   xcmd->currentDbGroup=db;
164 }
165 
166 
167 
GWEN_XmlCommanderGwenXml_GetTempDbRoot(const GWEN_XMLCOMMANDER * cmd)168 GWEN_DB_NODE *GWEN_XmlCommanderGwenXml_GetTempDbRoot(const GWEN_XMLCOMMANDER *cmd)
169 {
170   GWEN_XMLCMD_GXML *xcmd;
171 
172   assert(cmd);
173   xcmd=GWEN_INHERIT_GETDATA(GWEN_XMLCOMMANDER, GWEN_XMLCMD_GXML, cmd);
174   assert(xcmd);
175 
176   return xcmd->tempDbRoot;
177 }
178 
179 
180 
GWEN_XmlCommanderGwenXml_GetCurrentTempDbGroup(const GWEN_XMLCOMMANDER * cmd)181 GWEN_DB_NODE *GWEN_XmlCommanderGwenXml_GetCurrentTempDbGroup(const GWEN_XMLCOMMANDER *cmd)
182 {
183   GWEN_XMLCMD_GXML *xcmd;
184 
185   assert(cmd);
186   xcmd=GWEN_INHERIT_GETDATA(GWEN_XMLCOMMANDER, GWEN_XMLCMD_GXML, cmd);
187   assert(xcmd);
188 
189   return xcmd->currentTempDbGroup;
190 }
191 
192 
193 
GWEN_XmlCommanderGwenXml_SetCurrentTempDbGroup(GWEN_XMLCOMMANDER * cmd,GWEN_DB_NODE * db)194 void GWEN_XmlCommanderGwenXml_SetCurrentTempDbGroup(GWEN_XMLCOMMANDER *cmd, GWEN_DB_NODE *db)
195 {
196   GWEN_XMLCMD_GXML *xcmd;
197 
198   assert(cmd);
199   xcmd=GWEN_INHERIT_GETDATA(GWEN_XMLCOMMANDER, GWEN_XMLCMD_GXML, cmd);
200   assert(xcmd);
201 
202   xcmd->currentTempDbGroup=db;
203 }
204 
205 
206 
GWEN_XmlCommanderGwenXml_EnterDocNode(GWEN_XMLCOMMANDER * cmd,GWEN_XMLNODE * xmlNode)207 void GWEN_XmlCommanderGwenXml_EnterDocNode(GWEN_XMLCOMMANDER *cmd, GWEN_XMLNODE *xmlNode)
208 {
209   GWEN_XMLCMD_GXML *xcmd;
210 
211   assert(cmd);
212   xcmd=GWEN_INHERIT_GETDATA(GWEN_XMLCOMMANDER, GWEN_XMLCMD_GXML, cmd);
213   assert(xcmd);
214 
215   assert(xmlNode);
216 
217   GWEN_XMLNode_List2_PushBack(xcmd->xmlNodeStack, xcmd->currentDocNode);
218   xcmd->currentDocNode=xmlNode;
219 }
220 
221 
222 
GWEN_XmlCommanderGwenXml_LeaveDocNode(GWEN_XMLCOMMANDER * cmd)223 void GWEN_XmlCommanderGwenXml_LeaveDocNode(GWEN_XMLCOMMANDER *cmd)
224 {
225   GWEN_XMLCMD_GXML *xcmd;
226   GWEN_XMLNODE *xmlNode;
227 
228   assert(cmd);
229   xcmd=GWEN_INHERIT_GETDATA(GWEN_XMLCOMMANDER, GWEN_XMLCMD_GXML, cmd);
230   assert(xcmd);
231 
232   xmlNode=GWEN_XMLNode_List2_GetBack(xcmd->xmlNodeStack);
233   if (xmlNode==NULL) {
234     DBG_ERROR(GWEN_LOGDOMAIN, "Nothing on stack");
235     assert(xmlNode);
236   }
237   xcmd->currentDocNode=xmlNode;
238   GWEN_XMLNode_List2_PopBack(xcmd->xmlNodeStack);
239 }
240 
241 
242 
243 
244 
245 
246 
247 
248