ReactOS Fundraising Campaign 2012
 
€ 4,410 / € 30,000

Information | Donate

Home | Info | Community | Development | myReactOS | Contact Us

  1. Home
  2. Community
  3. Development
  4. myReactOS
  5. Fundraiser 2012

  1. Main Page
  2. Alphabetical List
  3. Data Structures
  4. Directories
  5. File List
  6. Data Fields
  7. Globals
  8. Related Pages

ReactOS Development > Doxygen

documents.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 doxygen 1.7.6.1

ReactOS is a registered trademark or a trademark of ReactOS Foundation in the United States and other countries.