Home | Info | Community | Development | myReactOS | Contact Us
ReactOS Development > Doxygendocuments.c
Go to the documentation of this file.
00001 /* 00002 * documents.c: Implementation of the documents handling 00003 * 00004 * See Copyright for the status of this software. 00005 * 00006 * daniel@veillard.com 00007 */ 00008 00009 #define IN_LIBXSLT 00010 #include "libxslt.h" 00011 00012 #include <string.h> 00013 00014 #include <libxml/xmlmemory.h> 00015 #include <libxml/tree.h> 00016 #include <libxml/hash.h> 00017 #include <libxml/parser.h> 00018 #include <libxml/parserInternals.h> 00019 #include "xslt.h" 00020 #include "xsltInternals.h" 00021 #include "xsltutils.h" 00022 #include "documents.h" 00023 #include "transform.h" 00024 #include "imports.h" 00025 #include "keys.h" 00026 #include "security.h" 00027 00028 #ifdef LIBXML_XINCLUDE_ENABLED 00029 #include <libxml/xinclude.h> 00030 #endif 00031 00032 #define WITH_XSLT_DEBUG_DOCUMENTS 00033 00034 #ifdef WITH_XSLT_DEBUG 00035 #define WITH_XSLT_DEBUG_DOCUMENTS 00036 #endif 00037 00038 /************************************************************************ 00039 * * 00040 * Hooks for the document loader * 00041 * * 00042 ************************************************************************/ 00043 00060 static xmlDocPtr 00061 xsltDocDefaultLoaderFunc(const xmlChar * URI, xmlDictPtr dict, int options, 00062 void *ctxt ATTRIBUTE_UNUSED, 00063 xsltLoadType type ATTRIBUTE_UNUSED) 00064 { 00065 xmlParserCtxtPtr pctxt; 00066 xmlParserInputPtr inputStream; 00067 xmlDocPtr doc; 00068 00069 pctxt = xmlNewParserCtxt(); 00070 if (pctxt == NULL) 00071 return(NULL); 00072 if ((dict != NULL) && (pctxt->dict != NULL)) { 00073 xmlDictFree(pctxt->dict); 00074 pctxt->dict = NULL; 00075 } 00076 if (dict != NULL) { 00077 pctxt->dict = dict; 00078 xmlDictReference(pctxt->dict); 00079 #ifdef WITH_XSLT_DEBUG 00080 xsltGenericDebug(xsltGenericDebugContext, 00081 "Reusing dictionary for document\n"); 00082 #endif 00083 } 00084 xmlCtxtUseOptions(pctxt, options); 00085 inputStream = xmlLoadExternalEntity((const char *) URI, NULL, pctxt); 00086 if (inputStream == NULL) { 00087 xmlFreeParserCtxt(pctxt); 00088 return(NULL); 00089 } 00090 inputPush(pctxt, inputStream); 00091 if (pctxt->directory == NULL) 00092 pctxt->directory = xmlParserGetDirectory((const char *) URI); 00093 00094 xmlParseDocument(pctxt); 00095 00096 if (pctxt->wellFormed) { 00097 doc = pctxt->myDoc; 00098 } 00099 else { 00100 doc = NULL; 00101 xmlFreeDoc(pctxt->myDoc); 00102 pctxt->myDoc = NULL; 00103 } 00104 xmlFreeParserCtxt(pctxt); 00105 00106 return(doc); 00107 } 00108 00109 00110 xsltDocLoaderFunc xsltDocDefaultLoader = xsltDocDefaultLoaderFunc; 00111 00120 void 00121 xsltSetLoaderFunc(xsltDocLoaderFunc f) { 00122 if (f == NULL) 00123 xsltDocDefaultLoader = xsltDocDefaultLoaderFunc; 00124 else 00125 xsltDocDefaultLoader = f; 00126 } 00127 00128 /************************************************************************ 00129 * * 00130 * Module interfaces * 00131 * * 00132 ************************************************************************/ 00133 00143 xsltDocumentPtr 00144 xsltNewDocument(xsltTransformContextPtr ctxt, xmlDocPtr doc) { 00145 xsltDocumentPtr cur; 00146 00147 cur = (xsltDocumentPtr) xmlMalloc(sizeof(xsltDocument)); 00148 if (cur == NULL) { 00149 xsltTransformError(ctxt, NULL, (xmlNodePtr) doc, 00150 "xsltNewDocument : malloc failed\n"); 00151 return(NULL); 00152 } 00153 memset(cur, 0, sizeof(xsltDocument)); 00154 cur->doc = doc; 00155 if (ctxt != NULL) { 00156 if (! XSLT_IS_RES_TREE_FRAG(doc)) { 00157 cur->next = ctxt->docList; 00158 ctxt->docList = cur; 00159 } 00160 /* 00161 * A key with a specific name for a specific document 00162 * will only be computed if there's a call to the key() 00163 * function using that specific name for that specific 00164 * document. I.e. computation of keys will be done in 00165 * xsltGetKey() (keys.c) on an on-demand basis. 00166 * 00167 * xsltInitCtxtKeys(ctxt, cur); not called here anymore 00168 */ 00169 } 00170 return(cur); 00171 } 00172 00182 xsltDocumentPtr 00183 xsltNewStyleDocument(xsltStylesheetPtr style, xmlDocPtr doc) { 00184 xsltDocumentPtr cur; 00185 00186 cur = (xsltDocumentPtr) xmlMalloc(sizeof(xsltDocument)); 00187 if (cur == NULL) { 00188 xsltTransformError(NULL, style, (xmlNodePtr) doc, 00189 "xsltNewStyleDocument : malloc failed\n"); 00190 return(NULL); 00191 } 00192 memset(cur, 0, sizeof(xsltDocument)); 00193 cur->doc = doc; 00194 if (style != NULL) { 00195 cur->next = style->docList; 00196 style->docList = cur; 00197 } 00198 return(cur); 00199 } 00200 00209 void 00210 xsltFreeStyleDocuments(xsltStylesheetPtr style) { 00211 xsltDocumentPtr doc, cur; 00212 #ifdef XSLT_REFACTORED_XSLT_NSCOMP 00213 xsltNsMapPtr nsMap; 00214 #endif 00215 00216 if (style == NULL) 00217 return; 00218 00219 #ifdef XSLT_REFACTORED_XSLT_NSCOMP 00220 if (XSLT_HAS_INTERNAL_NSMAP(style)) 00221 nsMap = XSLT_GET_INTERNAL_NSMAP(style); 00222 else 00223 nsMap = NULL; 00224 #endif 00225 00226 cur = style->docList; 00227 while (cur != NULL) { 00228 doc = cur; 00229 cur = cur->next; 00230 #ifdef XSLT_REFACTORED_XSLT_NSCOMP 00231 /* 00232 * Restore all changed namespace URIs of ns-decls. 00233 */ 00234 if (nsMap) 00235 xsltRestoreDocumentNamespaces(nsMap, doc->doc); 00236 #endif 00237 xsltFreeDocumentKeys(doc); 00238 if (!doc->main) 00239 xmlFreeDoc(doc->doc); 00240 xmlFree(doc); 00241 } 00242 } 00243 00250 void 00251 xsltFreeDocuments(xsltTransformContextPtr ctxt) { 00252 xsltDocumentPtr doc, cur; 00253 00254 cur = ctxt->docList; 00255 while (cur != NULL) { 00256 doc = cur; 00257 cur = cur->next; 00258 xsltFreeDocumentKeys(doc); 00259 if (!doc->main) 00260 xmlFreeDoc(doc->doc); 00261 xmlFree(doc); 00262 } 00263 cur = ctxt->styleList; 00264 while (cur != NULL) { 00265 doc = cur; 00266 cur = cur->next; 00267 xsltFreeDocumentKeys(doc); 00268 if (!doc->main) 00269 xmlFreeDoc(doc->doc); 00270 xmlFree(doc); 00271 } 00272 } 00273 00284 xsltDocumentPtr 00285 xsltLoadDocument(xsltTransformContextPtr ctxt, const xmlChar *URI) { 00286 xsltDocumentPtr ret; 00287 xmlDocPtr doc; 00288 00289 if ((ctxt == NULL) || (URI == NULL)) 00290 return(NULL); 00291 00292 /* 00293 * Security framework check 00294 */ 00295 if (ctxt->sec != NULL) { 00296 int res; 00297 00298 res = xsltCheckRead(ctxt->sec, ctxt, URI); 00299 if (res == 0) { 00300 xsltTransformError(ctxt, NULL, NULL, 00301 "xsltLoadDocument: read rights for %s denied\n", 00302 URI); 00303 return(NULL); 00304 } 00305 } 00306 00307 /* 00308 * Walk the context list to find the document if preparsed 00309 */ 00310 ret = ctxt->docList; 00311 while (ret != NULL) { 00312 if ((ret->doc != NULL) && (ret->doc->URL != NULL) && 00313 (xmlStrEqual(ret->doc->URL, URI))) 00314 return(ret); 00315 ret = ret->next; 00316 } 00317 00318 doc = xsltDocDefaultLoader(URI, ctxt->dict, ctxt->parserOptions, 00319 (void *) ctxt, XSLT_LOAD_DOCUMENT); 00320 00321 if (doc == NULL) 00322 return(NULL); 00323 00324 if (ctxt->xinclude != 0) { 00325 #ifdef LIBXML_XINCLUDE_ENABLED 00326 #if LIBXML_VERSION >= 20603 00327 xmlXIncludeProcessFlags(doc, ctxt->parserOptions); 00328 #else 00329 xmlXIncludeProcess(doc); 00330 #endif 00331 #else 00332 xsltTransformError(ctxt, NULL, NULL, 00333 "xsltLoadDocument(%s) : XInclude processing not compiled in\n", 00334 URI); 00335 #endif 00336 } 00337 /* 00338 * Apply white-space stripping if asked for 00339 */ 00340 if (xsltNeedElemSpaceHandling(ctxt)) 00341 xsltApplyStripSpaces(ctxt, xmlDocGetRootElement(doc)); 00342 if (ctxt->debugStatus == XSLT_DEBUG_NONE) 00343 xmlXPathOrderDocElems(doc); 00344 00345 ret = xsltNewDocument(ctxt, doc); 00346 return(ret); 00347 } 00348 00358 xsltDocumentPtr 00359 xsltLoadStyleDocument(xsltStylesheetPtr style, const xmlChar *URI) { 00360 xsltDocumentPtr ret; 00361 xmlDocPtr doc; 00362 xsltSecurityPrefsPtr sec; 00363 00364 if ((style == NULL) || (URI == NULL)) 00365 return(NULL); 00366 00367 /* 00368 * Security framework check 00369 */ 00370 sec = xsltGetDefaultSecurityPrefs(); 00371 if (sec != NULL) { 00372 int res; 00373 00374 res = xsltCheckRead(sec, NULL, URI); 00375 if (res == 0) { 00376 xsltTransformError(NULL, NULL, NULL, 00377 "xsltLoadStyleDocument: read rights for %s denied\n", 00378 URI); 00379 return(NULL); 00380 } 00381 } 00382 00383 /* 00384 * Walk the context list to find the document if preparsed 00385 */ 00386 ret = style->docList; 00387 while (ret != NULL) { 00388 if ((ret->doc != NULL) && (ret->doc->URL != NULL) && 00389 (xmlStrEqual(ret->doc->URL, URI))) 00390 return(ret); 00391 ret = ret->next; 00392 } 00393 00394 doc = xsltDocDefaultLoader(URI, style->dict, XSLT_PARSE_OPTIONS, 00395 (void *) style, XSLT_LOAD_STYLESHEET); 00396 if (doc == NULL) 00397 return(NULL); 00398 00399 ret = xsltNewStyleDocument(style, doc); 00400 return(ret); 00401 } 00402 00414 xsltDocumentPtr 00415 xsltFindDocument (xsltTransformContextPtr ctxt, xmlDocPtr doc) { 00416 xsltDocumentPtr ret; 00417 00418 if ((ctxt == NULL) || (doc == NULL)) 00419 return(NULL); 00420 00421 /* 00422 * Walk the context list to find the document 00423 */ 00424 ret = ctxt->docList; 00425 while (ret != NULL) { 00426 if (ret->doc == doc) 00427 return(ret); 00428 ret = ret->next; 00429 } 00430 if (doc == ctxt->style->doc) 00431 return(ctxt->document); 00432 return(NULL); 00433 } 00434 Generated on Mon May 28 2012 04:19:25 for ReactOS by
1.7.6.1
|