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