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, ' ');
126  GWEN_Buffer_AppendString(tbuf, s);
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,
202  GWEN_Buffer_GetStart(xbuf),
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 {
274  n=GWEN_XMLNode_GetFirstTag(root);
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");
381  GWEN_XMLNode_AddChild(n, vn);
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");
404  GWEN_XMLNode_AddChild(n, vn);
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");
434  GWEN_XMLNode_AddChild(n, vn);
435 
437  GWEN_Buffer_GetStart(bbuf));
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 
struct GWEN_PLUGIN_MANAGER GWEN_PLUGIN_MANAGER
Definition: plugin.h:40
char * GWEN_Buffer_GetStart(const GWEN_BUFFER *bf)
Definition: buffer.c:235
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
int GWEN_SyncIo_Connect(GWEN_SYNCIO *sio)
Definition: syncio.c:97
void GWEN_XMLNode_AddHeader(GWEN_XMLNODE *n, GWEN_XMLNODE *nh)
Definition: xml.c:1331
struct GWEN_DB_NODE GWEN_DB_NODE
Definition: db.h:228
struct GWEN_PLUGIN GWEN_PLUGIN
Definition: plugin.h:39
GWEN_DBIO * GWEN_DBIO_new(const char *name, const char *descr)
Definition: dbio.c:207
#define GWEN_XML_FLAGS_DEFAULT
Definition: xml.h:117
#define GWEN_ERROR_INVALID
Definition: error.h:67
uint32_t GWEN_Buffer_GetUsedBytes(const GWEN_BUFFER *bf)
Definition: buffer.c:277
#define GWEN_SYNCIO_FILE_FLAGS_READ
Definition: syncio_file.h:53
#define GWEN_XML_FLAGS_SIMPLE
Definition: xml.h:89
const char * GWEN_XMLNode_GetProperty(const GWEN_XMLNODE *n, const char *name, const char *defaultValue)
Definition: xml.c:239
GWEN_XMLNODE * GWEN_XMLNode_GetNextData(const GWEN_XMLNODE *n)
Definition: xml.c:731
GWEN_XMLNODE * GWEN_XMLNode_FindNextTag(const GWEN_XMLNODE *n, const char *tname, const char *pname, const char *pvalue)
Definition: xml.c:794
int GWEN_SyncIo_Read(GWEN_SYNCIO *sio, uint8_t *buffer, uint32_t size)
Definition: syncio.c:133
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
GWEN_XMLNODE * GWEN_XMLNode_GetFirstData(const GWEN_XMLNODE *n)
Definition: xml.c:724
uint32_t GWEN_DB_GetNodeFlags(const GWEN_DB_NODE *n)
Definition: db.c:1770
void GWEN_XMLNode_SetProperty(GWEN_XMLNODE *n, const char *name, const char *value)
Definition: xml.c:322
void GWEN_DBIO_SetCheckFileFn(GWEN_DBIO *dbio, GWEN_DBIO_CHECKFILEFN f)
Definition: dbio.c:344
GWEN_DB_NODE * GWEN_DB_GetNextValue(GWEN_DB_NODE *n)
Definition: db.c:541
int GWEN_DBIO_XmlDb__ExportVar(GWEN_UNUSED GWEN_DBIO *dbio, GWEN_DB_NODE *data, GWEN_XMLNODE *node)
Definition: xmldb.c:347
#define GWEN_LOGDOMAIN
Definition: logger.h:35
GWENHYWFAR_API int GWEN_XMLNode_WriteToStream(const GWEN_XMLNODE *n, GWEN_XML_CONTEXT *ctx, GWEN_SYNCIO *sio)
Definition: xmlrw.c:480
void GWEN_DBIO_SetImportFn(GWEN_DBIO *dbio, GWEN_DBIO_IMPORTFN f)
Definition: dbio.c:329
GWEN_XMLNODE * GWEN_XMLNode_new(GWEN_XMLNODE_TYPE t, const char *data)
Definition: xml.c:144
GWEN_BUFFER * GWEN_Buffer_new(char *buffer, uint32_t size, uint32_t used, int take)
Definition: buffer.c:42
GWEN_DBIO_CHECKFILE_RESULT GWEN_DBIO_XmlDb_CheckFile(GWEN_DBIO *dbio, const char *fname)
Definition: xmldb.c:514
void GWEN_Buffer_Reset(GWEN_BUFFER *bf)
Definition: buffer.c:650
int GWEN_DBIO_XmlDb__ExportGroup(GWEN_DBIO *dbio, GWEN_DB_NODE *data, GWEN_XMLNODE *node, const char *newName)
Definition: xmldb.c:296
void GWEN_XmlCtx_free(GWEN_XML_CONTEXT *ctx)
Definition: xmlctx.c:81
#define GWEN_ERROR_BAD_DATA
Definition: error.h:121
GWEN_XMLNODE * GWEN_XMLNode_FindFirstTag(const GWEN_XMLNODE *n, const char *tname, const char *pname, const char *pvalue)
Definition: xml.c:776
GWEN_DB_NODE * GWEN_DB_GetFirstVar(GWEN_DB_NODE *n)
Definition: db.c:479
int GWEN_DB_SetBinValue(GWEN_DB_NODE *n, uint32_t flags, const char *path, const void *val, unsigned int valSize)
Definition: db.c:1269
struct GWEN_SYNCIO GWEN_SYNCIO
Definition: syncio.h:40
#define DBG_DEBUG(dbg_logger, format, args...)
Definition: debug.h:214
const char * GWEN_DB_GroupName(GWEN_DB_NODE *n)
Definition: db.c:1408
GWEN_XMLNODE * GWEN_XMLNode_GetNextTag(const GWEN_XMLNODE *n)
Definition: xml.c:712
GWEN_DB_NODE * GWEN_DB_GetNextGroup(GWEN_DB_NODE *n)
Definition: db.c:461
const void * GWEN_DB_GetBinValueFromNode(const GWEN_DB_NODE *n, unsigned int *size)
Definition: db.c:634
GWEN_XML_CONTEXT * GWEN_XmlCtxStore_new(GWEN_XMLNODE *n, uint32_t flags)
Definition: xmlctx.c:385
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
const char * GWEN_DB_VariableName(GWEN_DB_NODE *n)
Definition: db.c:1928
GWEN_DBIO * GWEN_DBIO_XmlDb_Factory(GWEN_UNUSED GWEN_PLUGIN *pl)
Definition: xmldb.c:562
int GWEN_Text_UnescapeXmlToBuffer(const char *src, GWEN_BUFFER *buf)
Definition: text.c:1856
GWEN_DB_NODE * GWEN_DB_GetGroup(GWEN_DB_NODE *n, uint32_t flags, const char *path)
Definition: db.c:1381
void GWEN_DBIO__XmlDb_ReadDataTags(GWEN_XMLNODE *node, GWEN_BUFFER *buf)
Definition: xmldb.c:111
int GWEN_Text_EscapeXmlToBuffer(const char *src, GWEN_BUFFER *buf)
Definition: text.c:1978
GWEN_PLUGIN * dbio_xmldb_factory(GWEN_PLUGIN_MANAGER *pm, const char *modName, const char *fileName)
Definition: xmldb.c:575
void GWEN_Buffer_free(GWEN_BUFFER *bf)
Definition: buffer.c:89
void GWEN_XMLNode_free(GWEN_XMLNODE *n)
Definition: xml.c:160
struct GWEN_BUFFER GWEN_BUFFER
A dynamically resizeable text buffer.
Definition: buffer.h:38
void GWEN_SyncIo_free(GWEN_SYNCIO *sio)
Definition: syncio.c:78
void GWEN_SyncIo_AddFlags(GWEN_SYNCIO *sio, uint32_t fl)
Definition: syncio.c:179
void GWEN_DBIO_Plugin_SetFactoryFn(GWEN_PLUGIN *pl, GWEN_DBIO_PLUGIN_FACTORYFN f)
Definition: dbio.c:188
#define DBG_ERROR(dbg_logger, format, args...)
Definition: debug.h:97
GWEN_XMLNODE * GWEN_XMLNode_GetFirstTag(const GWEN_XMLNODE *n)
Definition: xml.c:705
const char * GWEN_XMLNode_GetData(const GWEN_XMLNODE *n)
Definition: xml.c:370
struct GWEN_DBIO GWEN_DBIO
Definition: dbio.h:43
int GWEN_SyncIo_Disconnect(GWEN_SYNCIO *sio)
Definition: syncio.c:109
GWENHYWFAR_API int GWEN_XMLContext_ReadFromIo(GWEN_XML_CONTEXT *ctx, GWEN_SYNCIO *io)
Definition: xmlrw.c:1203
void GWEN_DBIO_SetExportFn(GWEN_DBIO *dbio, GWEN_DBIO_EXPORTFN f)
Definition: dbio.c:337
int GWEN_Text_ComparePattern(const char *w, const char *p, int sensecase)
Definition: text.c:1208
int GWEN_DB_SetCharValue(GWEN_DB_NODE *n, uint32_t flags, const char *path, const char *val)
Definition: db.c:997
GWEN_DB_NODE * GWEN_DB_GetFirstValue(GWEN_DB_NODE *n)
Definition: db.c:518
GWEN_DBIO_CHECKFILE_RESULT
Definition: dbio.h:79
#define DBG_INFO(dbg_logger, format, args...)
Definition: debug.h:181
GWEN_DB_NODE * GWEN_DB_GetNextVar(GWEN_DB_NODE *n)
Definition: db.c:500
#define GWEN_DB_NODE_FLAGS_VOLATILE
Definition: db.h:209
GWEN_DB_NODE_TYPE
Definition: db.h:233
#define GWEN_XML_FLAGS_HANDLE_HEADERS
Definition: xml.h:94
GWENHYWFAR_API GWEN_SYNCIO * GWEN_SyncIo_File_new(const char *path, GWEN_SYNCIO_FILE_CREATIONMODE cm)
GWEN_DB_NODE * GWEN_DB_GetFirstGroup(GWEN_DB_NODE *n)
Definition: db.c:440
int GWEN_DB_SetIntValue(GWEN_DB_NODE *n, uint32_t flags, const char *path, int val)
Definition: db.c:1202
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_DB_GetIntValueFromNode(const GWEN_DB_NODE *n)
Definition: db.c:607
int GWEN_Text_FromHexBuffer(const char *src, GWEN_BUFFER *buf)
Definition: text.c:897
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
int GWEN_Text_ToHexBuffer(const char *src, unsigned l, GWEN_BUFFER *buf, unsigned int groupsize, char delimiter, int skipLeadingZeroes)
Definition: text.c:777
struct GWEN__XMLNODE GWEN_XMLNODE
Definition: xml.h:156
struct GWEN_XML_CONTEXT GWEN_XML_CONTEXT
Definition: xmlctx.h:39
#define GWEN_UNUSED
int GWEN_Buffer_AppendString(GWEN_BUFFER *bf, const char *buffer)
Definition: buffer.c:989
GWEN_DB_NODE_TYPE GWEN_DB_GetValueType(GWEN_DB_NODE *n)
Definition: db.c:563
void GWEN_XMLNode_AddChild(GWEN_XMLNODE *n, GWEN_XMLNODE *child)
Definition: xml.c:423
GWEN_PLUGIN * GWEN_DBIO_Plugin_new(GWEN_PLUGIN_MANAGER *pm, const char *name, const char *fileName)
Definition: dbio.c:147
const char * GWEN_DB_GetCharValueFromNode(const GWEN_DB_NODE *n)
Definition: db.c:578