gwenhywfar 5.10.1
xmldb.c
Go to the documentation of this file.
1/***************************************************************************
2 $RCSfile$
3 -------------------
4 cvs : $Id: xmldb.c 1020 2006-03-26 17:16:05Z aquamaniac $
5 begin : Thu Oct 30 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
29#ifdef HAVE_CONFIG_H
30# include <config.h>
31#endif
32
33#include "xmldb_p.h"
34#include <gwenhywfar/text.h>
35#include <gwenhywfar/debug.h>
36#include <gwenhywfar/stringlist.h>
37#include <gwenhywfar/xml.h>
38#include <gwenhywfar/dbio_be.h>
39#include <gwenhywfar/syncio_file.h>
40
41#include <stdlib.h>
42#include <string.h>
43#include <assert.h>
44#include <sys/types.h>
45#include <sys/stat.h>
46#include <fcntl.h>
47#include <string.h>
48#include <errno.h>
49
50
51
52
53
54
56 uint32_t flags,
57 GWEN_DB_NODE *data,
58 GWEN_DB_NODE *cfg,
59 GWEN_XMLNODE *node)
60{
61 GWEN_XMLNODE *n;
62
63 assert(node);
65 while (n) {
66 const char *tname;
67 const char *s;
68
69 tname=GWEN_XMLNode_GetData(n);
70 assert(tname && *tname);
71 s=GWEN_XMLNode_GetProperty(n, "type", 0);
72 if (s) {
73 if (strcasecmp(s, "group")==0) {
74 GWEN_DB_NODE *db;
75 int rv;
76
77 db=GWEN_DB_GetGroup(data, flags, tname);
78 if (db==0) {
79 DBG_INFO(GWEN_LOGDOMAIN, "here");
80 return GWEN_ERROR_INVALID;
81 }
82 rv=GWEN_DBIO__XmlDb_ImportGroup(dbio, flags, db, cfg, n);
83 if (rv) {
84 DBG_INFO(GWEN_LOGDOMAIN, "here (%d)", rv);
85 return rv;
86 }
87 }
88 else if (strcasecmp(s, "var")==0) {
89 int rv;
90
91 rv=GWEN_DBIO__XmlDb_ImportVar(dbio, flags, data, cfg, n);
92 if (rv) {
93 DBG_INFO(GWEN_LOGDOMAIN, "here (%d)", rv);
94 return rv;
95 }
96 }
97 else {
98 DBG_ERROR(GWEN_LOGDOMAIN, "Unexpected type \"%s\"", s);
99 return GWEN_ERROR_INVALID;
100 }
101 }
102
104 }
105
106 return 0;
107}
108
109
110
112{
113 GWEN_XMLNODE *ndata;
114 GWEN_BUFFER *tbuf;
115 int rv;
116
117 tbuf=GWEN_Buffer_new(0, 256, 0, 1);
118 ndata=GWEN_XMLNode_GetFirstData(node);
119 while (ndata) {
120 const char *s;
121
122 s=GWEN_XMLNode_GetData(ndata);
123 if (s) {
124 if (GWEN_Buffer_GetUsedBytes(tbuf))
125 GWEN_Buffer_AppendByte(tbuf, ' ');
127 }
128 ndata=GWEN_XMLNode_GetNextData(node);
129 }
131 if (rv<0) {
132 DBG_INFO(GWEN_LOGDOMAIN, "here (%d)", rv);
133 }
134 GWEN_Buffer_free(tbuf);
135}
136
137
138
140 uint32_t flags,
141 GWEN_DB_NODE *data,
143 GWEN_XMLNODE *node)
144{
145 GWEN_XMLNODE *n;
146 const char *vname;
147 GWEN_BUFFER *tbuf;
148
149 assert(node);
150 vname=GWEN_XMLNode_GetData(node);
151 assert(vname && *vname);
152 tbuf=GWEN_Buffer_new(0, 256, 0, 1);
153 n=GWEN_XMLNode_FindFirstTag(node, "value", 0, 0);
154 while (n) {
155 const char *s;
156 const char *d;
157 int rv;
158
160 d=GWEN_Buffer_GetStart(tbuf);
161 if (*d) {
163 assert(s && *s);
164 s=GWEN_XMLNode_GetProperty(n, "type", 0);
165 if (s) {
166 if (strcasecmp(s, "char")==0) {
167 rv=GWEN_DB_SetCharValue(data, flags, vname, d);
168 if (rv) {
169 DBG_INFO(GWEN_LOGDOMAIN, "here (%d)", rv);
170 GWEN_Buffer_free(tbuf);
171 return rv;
172 }
173 }
174 else if (strcasecmp(s, "int")==0) {
175 int val;
176
177 if (1!=sscanf(d, "%i", &val)) {
178 DBG_INFO(GWEN_LOGDOMAIN, "Non-integer value [%s]", d);
179 GWEN_Buffer_free(tbuf);
180 return GWEN_ERROR_INVALID;
181 }
182 rv=GWEN_DB_SetIntValue(data, flags, vname, val);
183 if (rv) {
184 DBG_INFO(GWEN_LOGDOMAIN, "here (%d)", rv);
185 GWEN_Buffer_free(tbuf);
186 return rv;
187 }
188 }
189 else if (strcasecmp(s, "bin")==0) {
190 GWEN_BUFFER *xbuf;
191
192 xbuf=GWEN_Buffer_new(0, 256, 0, 1);
193 rv=GWEN_Text_FromHexBuffer(d, xbuf);
194 if (rv) {
195 DBG_INFO(GWEN_LOGDOMAIN, "here (%d)", rv);
196 GWEN_Buffer_free(xbuf);
197 GWEN_Buffer_free(tbuf);
198 return rv;
199 }
200
201 rv=GWEN_DB_SetBinValue(data, flags, vname,
204 GWEN_Buffer_free(xbuf);
205 if (rv) {
206 DBG_INFO(GWEN_LOGDOMAIN, "here (%d)", rv);
207 GWEN_Buffer_free(tbuf);
208 return rv;
209 }
210 }
211 else {
213 "Unhandled value type \"%s\"", s);
214 GWEN_Buffer_free(tbuf);
215 return GWEN_ERROR_INVALID;
216 }
217 }
218 }
219 else {
220 DBG_DEBUG(GWEN_LOGDOMAIN, "Empty value");
221 }
222 GWEN_Buffer_Reset(tbuf);
223
224 n=GWEN_XMLNode_FindNextTag(n, "value", 0, 0);
225 }
226 GWEN_Buffer_free(tbuf);
227
228 return 0;
229}
230
231
232
233
235 GWEN_SYNCIO *sio,
236 GWEN_DB_NODE *data,
237 GWEN_DB_NODE *cfg,
238 uint32_t flags)
239{
240 int rv;
241 GWEN_XMLNODE *root;
242 GWEN_XMLNODE *n;
243 const char *rootName=0;
244 GWEN_XML_CONTEXT *ctx;
245
246 assert(data);
247
248 if (cfg)
249 rootName=GWEN_DB_GetCharValue(cfg, "rootElement", 0, 0);
250
252 ctx=GWEN_XmlCtxStore_new(root,
255 rv=GWEN_XMLContext_ReadFromIo(ctx, sio);
256 if (rv) {
257 DBG_INFO(GWEN_LOGDOMAIN, "here (%d)", rv);
258 GWEN_XmlCtx_free(ctx);
259 GWEN_XMLNode_free(root);
260 return rv;
261 }
262 GWEN_XmlCtx_free(ctx);
263
264 if (rootName) {
265 n=GWEN_XMLNode_FindFirstTag(root, rootName, 0, 0);
266 if (!n) {
268 "Root node in XML file is not \"%s\"", rootName);
269 GWEN_XMLNode_free(root);
270 return GWEN_ERROR_BAD_DATA;
271 }
272 }
273 else {
275 if (!n) {
277 "No root node in XML file");
278 GWEN_XMLNode_free(root);
279 return GWEN_ERROR_BAD_DATA;
280 }
281 }
282
283 rv=GWEN_DBIO__XmlDb_ImportGroup(dbio, flags, data, cfg, n);
284 if (rv) {
285 DBG_INFO(GWEN_LOGDOMAIN, "here (%d)", rv);
286 GWEN_XMLNode_free(root);
287 return rv;
288 }
289
290 GWEN_XMLNode_free(root);
291 return 0;
292}
293
294
295
297 GWEN_DB_NODE *data,
298 GWEN_XMLNODE *node,
299 const char *newName)
300{
301 const char *s;
302 GWEN_XMLNODE *n;
303 GWEN_DB_NODE *dbT;
304 int rv;
305
306 if (newName)
307 s=newName;
308 else
309 s=GWEN_DB_GroupName(data);
310 assert(s && *s);
311
313 GWEN_XMLNode_SetProperty(n, "type", "group");
314 GWEN_XMLNode_AddChild(node, n);
315
316 /* store variables */
317 dbT=GWEN_DB_GetFirstVar(data);
318 while (dbT) {
320 rv=GWEN_DBIO_XmlDb__ExportVar(dbio, dbT, n);
321 if (rv) {
322 DBG_INFO(GWEN_LOGDOMAIN, "here (%d)", rv);
323 return rv;
324 }
325 }
326 dbT=GWEN_DB_GetNextVar(dbT);
327 }
328
329 /* store groups */
330 dbT=GWEN_DB_GetFirstGroup(data);
331 while (dbT) {
333 rv=GWEN_DBIO_XmlDb__ExportGroup(dbio, dbT, n, 0);
334 if (rv) {
335 DBG_INFO(GWEN_LOGDOMAIN, "here (%d)", rv);
336 return rv;
337 }
338 }
339 dbT=GWEN_DB_GetNextGroup(dbT);
340 }
341
342 return 0;
343}
344
345
346
348 GWEN_DB_NODE *data,
349 GWEN_XMLNODE *node)
350{
351 const char *s;
352 GWEN_XMLNODE *n;
353 GWEN_DB_NODE *dbT;
354 int rv;
355
356 s=GWEN_DB_VariableName(data);
357 assert(s && *s);
358
360 GWEN_XMLNode_SetProperty(n, "type", "var");
361 GWEN_XMLNode_AddChild(node, n);
362
363 /* store variables */
364 dbT=GWEN_DB_GetFirstValue(data);
365 while (dbT) {
368 GWEN_XMLNODE *vn;
369
370 vt=GWEN_DB_GetValueType(dbT);
371 switch (vt) {
372
375 if (s && *s) {
376 GWEN_XMLNODE *dn;
377 GWEN_BUFFER *tbuf;
378
380 GWEN_XMLNode_SetProperty(vn, "type", "char");
382
383 tbuf=GWEN_Buffer_new(0, 64, 0, 1);
384 rv=GWEN_Text_EscapeXmlToBuffer(s, tbuf);
385 if (rv<0) {
386 DBG_INFO(GWEN_LOGDOMAIN, "here (%d)", rv);
387 GWEN_Buffer_free(tbuf);
388 return rv;
389 }
391 GWEN_Buffer_free(tbuf);
392 GWEN_XMLNode_AddChild(vn, dn);
393 }
394 break;
395
397 char nbuf[32];
398 GWEN_XMLNODE *dn;
399
400 snprintf(nbuf, sizeof(nbuf), "%i", GWEN_DB_GetIntValueFromNode(dbT));
401
403 GWEN_XMLNode_SetProperty(vn, "type", "int");
405
407 GWEN_XMLNode_AddChild(vn, dn);
408
409 break;
410 }
411
413 const void *vp;
414 unsigned int vsize;
415
416 vp=GWEN_DB_GetBinValueFromNode(dbT, &vsize);
417 if (vp && vsize) {
418 GWEN_BUFFER *bbuf;
419 GWEN_XMLNODE *dn;
420
421 bbuf=GWEN_Buffer_new(0, vsize*2, 0, 1);
422 rv=GWEN_Text_ToHexBuffer((const char *)vp,
423 vsize,
424 bbuf,
425 0, 0, 0);
426 if (rv) {
427 DBG_INFO(GWEN_LOGDOMAIN, "here (%d)", rv);
428 GWEN_Buffer_free(bbuf);
429 return rv;
430 }
431
433 GWEN_XMLNode_SetProperty(vn, "type", "bin");
435
438 GWEN_Buffer_free(bbuf);
439 GWEN_XMLNode_AddChild(vn, dn);
440 }
441
442 break;
443 }
444
446 DBG_DEBUG(GWEN_LOGDOMAIN, "Not storing pointer value");
447 break;
448
449 default:
451 "Unsupported variable type %d",
452 vt);
453 return GWEN_ERROR_INVALID;
454 }
455 } /* if non-volatile */
456
457 dbT=GWEN_DB_GetNextValue(dbT);
458 }
459
460 return 0;
461}
462
463
464
466 GWEN_SYNCIO *sio,
467 GWEN_DB_NODE *data,
468 GWEN_DB_NODE *cfg,
469 GWEN_UNUSED uint32_t flags)
470{
471 GWEN_XMLNODE *root;
472 GWEN_XMLNODE *nh;
473 int rv;
474 const char *rootName=0;
475 GWEN_XML_CONTEXT *ctx;
476
477 if (cfg)
478 rootName=GWEN_DB_GetCharValue(cfg, "rootElement", 0, 0);
479
482 GWEN_XMLNode_SetProperty(nh, "version", "1.0");
483 GWEN_XMLNode_SetProperty(nh, "encoding", "utf-8");
484 GWEN_XMLNode_AddHeader(root, nh);
485
486 rv=GWEN_DBIO_XmlDb__ExportGroup(dbio, data, root, rootName);
487 if (rv) {
488 DBG_INFO(GWEN_LOGDOMAIN, "here (%d)", rv);
489 GWEN_XMLNode_free(root);
490 return rv;
491 }
492
493
494 ctx=GWEN_XmlCtxStore_new(root,
498
499 rv=GWEN_XMLNode_WriteToStream(root, ctx, sio);
500 if (rv) {
501 DBG_INFO(GWEN_LOGDOMAIN, "here (%d)", rv);
502 GWEN_XmlCtx_free(ctx);
503 GWEN_XMLNode_free(root);
504 return rv;
505 }
506 GWEN_XmlCtx_free(ctx);
507 GWEN_XMLNode_free(root);
508
509 return 0;
510}
511
512
513
515 const char *fname)
516{
517 GWEN_SYNCIO *sio;
518 int rv;
519 uint8_t tbuf[256];
520
521 assert(dbio);
522 assert(fname);
523
526 rv=GWEN_SyncIo_Connect(sio);
527 if (rv<0) {
528 DBG_INFO(GWEN_LOGDOMAIN, "here (%d)", rv);
529 GWEN_SyncIo_free(sio);
531 }
532
533
534 rv=GWEN_SyncIo_Read(sio, tbuf, sizeof(tbuf)-1);
535 if (rv<1) {
537 "File \"%s\" is not supported by this plugin",
538 fname);
540 GWEN_SyncIo_free(sio);
542 }
543 tbuf[rv-1]=0;
544 if (-1!=GWEN_Text_ComparePattern((const char *) tbuf, "*<?xml*", 0)) {
545 /* match */
547 "File \"%s\" is supported by this plugin",
548 fname);
550 GWEN_SyncIo_free(sio);
551 /* don't be too sure about this, we *may* support the file,
552 * so we dont say we don't support this file */
554 }
556 GWEN_SyncIo_free(sio);
558}
559
560
561
563{
564 GWEN_DBIO *dbio;
565
566 dbio=GWEN_DBIO_new("XmlDb", "Imports and exports XML data");
570 return dbio;
571}
572
573
574
576 const char *modName,
577 const char *fileName)
578{
579 GWEN_PLUGIN *pl;
580
581 pl=GWEN_DBIO_Plugin_new(pm, modName, fileName);
582 assert(pl);
583
585
586 return pl;
587
588}
589
590
591
GWEN_BUFFER * GWEN_Buffer_new(char *buffer, uint32_t size, uint32_t used, int take)
Definition: buffer.c:42
void GWEN_Buffer_Reset(GWEN_BUFFER *bf)
Definition: buffer.c:650
void GWEN_Buffer_free(GWEN_BUFFER *bf)
Definition: buffer.c:89
int GWEN_Buffer_AppendString(GWEN_BUFFER *bf, const char *buffer)
Definition: buffer.c:989
uint32_t GWEN_Buffer_GetUsedBytes(const GWEN_BUFFER *bf)
Definition: buffer.c:277
char * GWEN_Buffer_GetStart(const GWEN_BUFFER *bf)
Definition: buffer.c:235
int GWEN_Buffer_AppendByte(GWEN_BUFFER *bf, char c)
Definition: buffer.c:394
const char * GWEN_DB_GetCharValue(GWEN_DB_NODE *n, const char *path, int idx, const char *defVal)
Definition: db.c:971
GWEN_DB_NODE * GWEN_DB_GetNextVar(GWEN_DB_NODE *n)
Definition: db.c:500
const char * GWEN_DB_GetCharValueFromNode(const GWEN_DB_NODE *n)
Definition: db.c:578
GWEN_DB_NODE_TYPE GWEN_DB_GetValueType(GWEN_DB_NODE *n)
Definition: db.c:563
int GWEN_DB_SetIntValue(GWEN_DB_NODE *n, uint32_t flags, const char *path, int val)
Definition: db.c:1202
uint32_t GWEN_DB_GetNodeFlags(const GWEN_DB_NODE *n)
Definition: db.c:1770
const char * GWEN_DB_GroupName(GWEN_DB_NODE *n)
Definition: db.c:1408
GWEN_DB_NODE * GWEN_DB_GetGroup(GWEN_DB_NODE *n, uint32_t flags, const char *path)
Definition: db.c:1381
const void * GWEN_DB_GetBinValueFromNode(const GWEN_DB_NODE *n, unsigned int *size)
Definition: db.c:634
GWEN_DB_NODE * GWEN_DB_GetFirstGroup(GWEN_DB_NODE *n)
Definition: db.c:440
GWEN_DB_NODE * GWEN_DB_GetFirstVar(GWEN_DB_NODE *n)
Definition: db.c:479
int GWEN_DB_SetCharValue(GWEN_DB_NODE *n, uint32_t flags, const char *path, const char *val)
Definition: db.c:997
int GWEN_DB_SetBinValue(GWEN_DB_NODE *n, uint32_t flags, const char *path, const void *val, unsigned int valSize)
Definition: db.c:1269
const char * GWEN_DB_VariableName(GWEN_DB_NODE *n)
Definition: db.c:1928
GWEN_DB_NODE * GWEN_DB_GetNextGroup(GWEN_DB_NODE *n)
Definition: db.c:461
GWEN_DB_NODE * GWEN_DB_GetNextValue(GWEN_DB_NODE *n)
Definition: db.c:541
GWEN_DB_NODE * GWEN_DB_GetFirstValue(GWEN_DB_NODE *n)
Definition: db.c:518
int GWEN_DB_GetIntValueFromNode(const GWEN_DB_NODE *n)
Definition: db.c:607
#define GWEN_DB_NODE_FLAGS_VOLATILE
Definition: db.h:209
GWEN_DB_NODE_TYPE
Definition: db.h:233
@ GWEN_DB_NodeType_ValueInt
Definition: db.h:243
@ GWEN_DB_NodeType_ValueChar
Definition: db.h:241
@ GWEN_DB_NodeType_ValuePtr
Definition: db.h:247
@ GWEN_DB_NodeType_ValueBin
Definition: db.h:245
struct GWEN_DB_NODE GWEN_DB_NODE
Definition: db.h:228
GWEN_PLUGIN * GWEN_DBIO_Plugin_new(GWEN_PLUGIN_MANAGER *pm, const char *name, const char *fileName)
Definition: dbio.c:147
void GWEN_DBIO_SetCheckFileFn(GWEN_DBIO *dbio, GWEN_DBIO_CHECKFILEFN f)
Definition: dbio.c:344
void GWEN_DBIO_SetImportFn(GWEN_DBIO *dbio, GWEN_DBIO_IMPORTFN f)
Definition: dbio.c:329
GWEN_DBIO * GWEN_DBIO_new(const char *name, const char *descr)
Definition: dbio.c:207
void GWEN_DBIO_Plugin_SetFactoryFn(GWEN_PLUGIN *pl, GWEN_DBIO_PLUGIN_FACTORYFN f)
Definition: dbio.c:188
void GWEN_DBIO_SetExportFn(GWEN_DBIO *dbio, GWEN_DBIO_EXPORTFN f)
Definition: dbio.c:337
GWEN_DBIO_CHECKFILE_RESULT
Definition: dbio.h:79
@ GWEN_DBIO_CheckFileResultUnknown
Definition: dbio.h:82
@ GWEN_DBIO_CheckFileResultNotOk
Definition: dbio.h:81
struct GWEN_DBIO GWEN_DBIO
Definition: dbio.h:43
#define DBG_DEBUG(dbg_logger, format, args...)
Definition: debug.h:214
#define DBG_INFO(dbg_logger, format, args...)
Definition: debug.h:181
#define DBG_ERROR(dbg_logger, format, args...)
Definition: debug.h:97
#define GWEN_ERROR_INVALID
Definition: error.h:67
#define GWEN_ERROR_BAD_DATA
Definition: error.h:121
struct GWEN_BUFFER GWEN_BUFFER
A dynamically resizeable text buffer.
Definition: buffer.h:38
#define GWEN_UNUSED
#define GWEN_LOGDOMAIN
Definition: logger.h:35
struct GWEN_PLUGIN_MANAGER GWEN_PLUGIN_MANAGER
Definition: plugin.h:40
struct GWEN_PLUGIN GWEN_PLUGIN
Definition: plugin.h:39
int GWEN_SyncIo_Connect(GWEN_SYNCIO *sio)
Definition: syncio.c:97
void GWEN_SyncIo_AddFlags(GWEN_SYNCIO *sio, uint32_t fl)
Definition: syncio.c:179
void GWEN_SyncIo_free(GWEN_SYNCIO *sio)
Definition: syncio.c:78
int GWEN_SyncIo_Read(GWEN_SYNCIO *sio, uint8_t *buffer, uint32_t size)
Definition: syncio.c:133
int GWEN_SyncIo_Disconnect(GWEN_SYNCIO *sio)
Definition: syncio.c:109
struct GWEN_SYNCIO GWEN_SYNCIO
Definition: syncio.h:40
@ GWEN_SyncIo_File_CreationMode_OpenExisting
Definition: syncio_file.h:38
GWENHYWFAR_API GWEN_SYNCIO * GWEN_SyncIo_File_new(const char *path, GWEN_SYNCIO_FILE_CREATIONMODE cm)
#define GWEN_SYNCIO_FILE_FLAGS_READ
Definition: syncio_file.h:53
int GWEN_Text_UnescapeXmlToBuffer(const char *src, GWEN_BUFFER *buf)
Definition: text.c:1856
int GWEN_Text_ToHexBuffer(const char *src, unsigned l, GWEN_BUFFER *buf, unsigned int groupsize, char delimiter, int skipLeadingZeroes)
Definition: text.c:777
int GWEN_Text_EscapeXmlToBuffer(const char *src, GWEN_BUFFER *buf)
Definition: text.c:1978
int GWEN_Text_ComparePattern(const char *w, const char *p, int sensecase)
Definition: text.c:1208
int GWEN_Text_FromHexBuffer(const char *src, GWEN_BUFFER *buf)
Definition: text.c:897
GWEN_XMLNODE * GWEN_XMLNode_GetNextData(const GWEN_XMLNODE *n)
Definition: xml.c:731
const char * GWEN_XMLNode_GetProperty(const GWEN_XMLNODE *n, const char *name, const char *defaultValue)
Definition: xml.c:239
GWEN_XMLNODE * GWEN_XMLNode_FindFirstTag(const GWEN_XMLNODE *n, const char *tname, const char *pname, const char *pvalue)
Definition: xml.c:776
void GWEN_XMLNode_AddHeader(GWEN_XMLNODE *n, GWEN_XMLNODE *nh)
Definition: xml.c:1331
GWEN_XMLNODE * GWEN_XMLNode_GetFirstTag(const GWEN_XMLNODE *n)
Definition: xml.c:705
void GWEN_XMLNode_SetProperty(GWEN_XMLNODE *n, const char *name, const char *value)
Definition: xml.c:322
GWEN_XMLNODE * GWEN_XMLNode_new(GWEN_XMLNODE_TYPE t, const char *data)
Definition: xml.c:144
GWEN_XMLNODE * GWEN_XMLNode_GetNextTag(const GWEN_XMLNODE *n)
Definition: xml.c:712
GWEN_XMLNODE * GWEN_XMLNode_FindNextTag(const GWEN_XMLNODE *n, const char *tname, const char *pname, const char *pvalue)
Definition: xml.c:794
void GWEN_XMLNode_AddChild(GWEN_XMLNODE *n, GWEN_XMLNODE *child)
Definition: xml.c:423
GWEN_XMLNODE * GWEN_XMLNode_GetFirstData(const GWEN_XMLNODE *n)
Definition: xml.c:724
void GWEN_XMLNode_free(GWEN_XMLNODE *n)
Definition: xml.c:160
const char * GWEN_XMLNode_GetData(const GWEN_XMLNODE *n)
Definition: xml.c:370
GWENHYWFAR_API int GWEN_XMLContext_ReadFromIo(GWEN_XML_CONTEXT *ctx, GWEN_SYNCIO *io)
Definition: xmlrw.c:1203
#define GWEN_XML_FLAGS_HANDLE_HEADERS
Definition: xml.h:94
struct GWEN__XMLNODE GWEN_XMLNODE
Definition: xml.h:156
#define GWEN_XML_FLAGS_DEFAULT
Definition: xml.h:117
GWENHYWFAR_API int GWEN_XMLNode_WriteToStream(const GWEN_XMLNODE *n, GWEN_XML_CONTEXT *ctx, GWEN_SYNCIO *sio)
Definition: xmlrw.c:480
@ GWEN_XMLNodeTypeData
Definition: xml.h:147
@ GWEN_XMLNodeTypeTag
Definition: xml.h:145
#define GWEN_XML_FLAGS_SIMPLE
Definition: xml.h:89
void GWEN_XmlCtx_free(GWEN_XML_CONTEXT *ctx)
Definition: xmlctx.c:81
GWEN_XML_CONTEXT * GWEN_XmlCtxStore_new(GWEN_XMLNODE *n, uint32_t flags)
Definition: xmlctx.c:385
struct GWEN_XML_CONTEXT GWEN_XML_CONTEXT
Definition: xmlctx.h:39
void GWEN_DBIO__XmlDb_ReadDataTags(GWEN_XMLNODE *node, GWEN_BUFFER *buf)
Definition: xmldb.c:111
GWEN_PLUGIN * dbio_xmldb_factory(GWEN_PLUGIN_MANAGER *pm, const char *modName, const char *fileName)
Definition: xmldb.c:575
int GWEN_DBIO_XmlDb__ExportVar(GWEN_UNUSED GWEN_DBIO *dbio, GWEN_DB_NODE *data, GWEN_XMLNODE *node)
Definition: xmldb.c:347
GWEN_DBIO_CHECKFILE_RESULT GWEN_DBIO_XmlDb_CheckFile(GWEN_DBIO *dbio, const char *fname)
Definition: xmldb.c:514
int GWEN_DBIO_XmlDb_Import(GWEN_DBIO *dbio, GWEN_SYNCIO *sio, GWEN_DB_NODE *data, GWEN_DB_NODE *cfg, uint32_t flags)
Definition: xmldb.c:234
GWEN_DBIO * GWEN_DBIO_XmlDb_Factory(GWEN_UNUSED GWEN_PLUGIN *pl)
Definition: xmldb.c:562
int GWEN_DBIO__XmlDb_ImportVar(GWEN_UNUSED GWEN_DBIO *dbio, uint32_t flags, GWEN_DB_NODE *data, GWEN_UNUSED GWEN_DB_NODE *cfg, GWEN_XMLNODE *node)
Definition: xmldb.c:139
int GWEN_DBIO_XmlDb__ExportGroup(GWEN_DBIO *dbio, GWEN_DB_NODE *data, GWEN_XMLNODE *node, const char *newName)
Definition: xmldb.c:296
int GWEN_DBIO__XmlDb_ImportGroup(GWEN_DBIO *dbio, uint32_t flags, GWEN_DB_NODE *data, GWEN_DB_NODE *cfg, GWEN_XMLNODE *node)
Definition: xmldb.c:55
int GWEN_DBIO_XmlDb_Export(GWEN_DBIO *dbio, GWEN_SYNCIO *sio, GWEN_DB_NODE *data, GWEN_DB_NODE *cfg, GWEN_UNUSED uint32_t flags)
Definition: xmldb.c:465