ReactOS  0.4.14-dev-98-gb0d4763
documents.c
Go to the documentation of this file.
1 /*
2  * documents.c: Implementation of the documents handling
3  *
4  * See Copyright for the status of this software.
5  *
6  * daniel@veillard.com
7  */
8 
9 #include "precomp.h"
10 
11 #ifdef LIBXML_XINCLUDE_ENABLED
12 #include <libxml/xinclude.h>
13 #endif
14 
15 #define WITH_XSLT_DEBUG_DOCUMENTS
16 
17 #ifdef WITH_XSLT_DEBUG
18 #define WITH_XSLT_DEBUG_DOCUMENTS
19 #endif
20 
21 /************************************************************************
22  * *
23  * Hooks for the document loader *
24  * *
25  ************************************************************************/
26 
43 static xmlDocPtr
45  void *ctxt ATTRIBUTE_UNUSED,
47 {
48  xmlParserCtxtPtr pctxt;
49  xmlParserInputPtr inputStream;
50  xmlDocPtr doc;
51 
52  pctxt = xmlNewParserCtxt();
53  if (pctxt == NULL)
54  return(NULL);
55  if ((dict != NULL) && (pctxt->dict != NULL)) {
56  xmlDictFree(pctxt->dict);
57  pctxt->dict = NULL;
58  }
59  if (dict != NULL) {
60  pctxt->dict = dict;
61  xmlDictReference(pctxt->dict);
62 #ifdef WITH_XSLT_DEBUG
64  "Reusing dictionary for document\n");
65 #endif
66  }
67  xmlCtxtUseOptions(pctxt, options);
68  inputStream = xmlLoadExternalEntity((const char *) URI, NULL, pctxt);
69  if (inputStream == NULL) {
70  xmlFreeParserCtxt(pctxt);
71  return(NULL);
72  }
73  inputPush(pctxt, inputStream);
74  if (pctxt->directory == NULL)
75  pctxt->directory = xmlParserGetDirectory((const char *) URI);
76 
77  xmlParseDocument(pctxt);
78 
79  if (pctxt->wellFormed) {
80  doc = pctxt->myDoc;
81  }
82  else {
83  doc = NULL;
84  xmlFreeDoc(pctxt->myDoc);
85  pctxt->myDoc = NULL;
86  }
87  xmlFreeParserCtxt(pctxt);
88 
89  return(doc);
90 }
91 
92 
94 
103 void
105  if (f == NULL)
107  else
109 }
110 
111 /************************************************************************
112  * *
113  * Module interfaces *
114  * *
115  ************************************************************************/
116 
128  xsltDocumentPtr cur;
129 
130  cur = (xsltDocumentPtr) xmlMalloc(sizeof(xsltDocument));
131  if (cur == NULL) {
132  xsltTransformError(ctxt, NULL, (xmlNodePtr) doc,
133  "xsltNewDocument : malloc failed\n");
134  return(NULL);
135  }
136  memset(cur, 0, sizeof(xsltDocument));
137  cur->doc = doc;
138  if (ctxt != NULL) {
139  if (! XSLT_IS_RES_TREE_FRAG(doc)) {
140  cur->next = ctxt->docList;
141  ctxt->docList = cur;
142  }
143  /*
144  * A key with a specific name for a specific document
145  * will only be computed if there's a call to the key()
146  * function using that specific name for that specific
147  * document. I.e. computation of keys will be done in
148  * xsltGetKey() (keys.c) on an on-demand basis.
149  *
150  * xsltInitCtxtKeys(ctxt, cur); not called here anymore
151  */
152  }
153  return(cur);
154 }
155 
167  xsltDocumentPtr cur;
168 
169  cur = (xsltDocumentPtr) xmlMalloc(sizeof(xsltDocument));
170  if (cur == NULL) {
172  "xsltNewStyleDocument : malloc failed\n");
173  return(NULL);
174  }
175  memset(cur, 0, sizeof(xsltDocument));
176  cur->doc = doc;
177  if (style != NULL) {
178  cur->next = style->docList;
179  style->docList = cur;
180  }
181  return(cur);
182 }
183 
192 void
194  xsltDocumentPtr doc, cur;
195 #ifdef XSLT_REFACTORED_XSLT_NSCOMP
196  xsltNsMapPtr nsMap;
197 #endif
198 
199  if (style == NULL)
200  return;
201 
202 #ifdef XSLT_REFACTORED_XSLT_NSCOMP
203  if (XSLT_HAS_INTERNAL_NSMAP(style))
204  nsMap = XSLT_GET_INTERNAL_NSMAP(style);
205  else
206  nsMap = NULL;
207 #endif
208 
209  cur = style->docList;
210  while (cur != NULL) {
211  doc = cur;
212  cur = cur->next;
213 #ifdef XSLT_REFACTORED_XSLT_NSCOMP
214  /*
215  * Restore all changed namespace URIs of ns-decls.
216  */
217  if (nsMap)
218  xsltRestoreDocumentNamespaces(nsMap, doc->doc);
219 #endif
221  if (!doc->main)
222  xmlFreeDoc(doc->doc);
223  xmlFree(doc);
224  }
225 }
226 
233 void
235  xsltDocumentPtr doc, cur;
236 
237  cur = ctxt->docList;
238  while (cur != NULL) {
239  doc = cur;
240  cur = cur->next;
242  if (!doc->main)
243  xmlFreeDoc(doc->doc);
244  xmlFree(doc);
245  }
246  cur = ctxt->styleList;
247  while (cur != NULL) {
248  doc = cur;
249  cur = cur->next;
251  if (!doc->main)
252  xmlFreeDoc(doc->doc);
253  xmlFree(doc);
254  }
255 }
256 
270  xmlDocPtr doc;
271 
272  if ((ctxt == NULL) || (URI == NULL))
273  return(NULL);
274 
275  /*
276  * Security framework check
277  */
278  if (ctxt->sec != NULL) {
279  int res;
280 
281  res = xsltCheckRead(ctxt->sec, ctxt, URI);
282  if (res == 0) {
284  "xsltLoadDocument: read rights for %s denied\n",
285  URI);
286  return(NULL);
287  }
288  }
289 
290  /*
291  * Walk the context list to find the document if preparsed
292  */
293  ret = ctxt->docList;
294  while (ret != NULL) {
295  if ((ret->doc != NULL) && (ret->doc->URL != NULL) &&
296  (xmlStrEqual(ret->doc->URL, URI)))
297  return(ret);
298  ret = ret->next;
299  }
300 
301  doc = xsltDocDefaultLoader(URI, ctxt->dict, ctxt->parserOptions,
302  (void *) ctxt, XSLT_LOAD_DOCUMENT);
303 
304  if (doc == NULL)
305  return(NULL);
306 
307  if (ctxt->xinclude != 0) {
308 #ifdef LIBXML_XINCLUDE_ENABLED
309 #if LIBXML_VERSION >= 20603
310  xmlXIncludeProcessFlags(doc, ctxt->parserOptions);
311 #else
312  xmlXIncludeProcess(doc);
313 #endif
314 #else
316  "xsltLoadDocument(%s) : XInclude processing not compiled in\n",
317  URI);
318 #endif
319  }
320  /*
321  * Apply white-space stripping if asked for
322  */
323  if (xsltNeedElemSpaceHandling(ctxt))
325  if (ctxt->debugStatus == XSLT_DEBUG_NONE)
326  xmlXPathOrderDocElems(doc);
327 
328  ret = xsltNewDocument(ctxt, doc);
329  return(ret);
330 }
331 
344  xmlDocPtr doc;
346 
347  if ((style == NULL) || (URI == NULL))
348  return(NULL);
349 
350  /*
351  * Security framework check
352  */
354  if (sec != NULL) {
355  int res;
356 
357  res = xsltCheckRead(sec, NULL, URI);
358  if (res == 0) {
360  "xsltLoadStyleDocument: read rights for %s denied\n",
361  URI);
362  return(NULL);
363  }
364  }
365 
366  /*
367  * Walk the context list to find the document if preparsed
368  */
369  ret = style->docList;
370  while (ret != NULL) {
371  if ((ret->doc != NULL) && (ret->doc->URL != NULL) &&
372  (xmlStrEqual(ret->doc->URL, URI)))
373  return(ret);
374  ret = ret->next;
375  }
376 
378  (void *) style, XSLT_LOAD_STYLESHEET);
379  if (doc == NULL)
380  return(NULL);
381 
383  return(ret);
384 }
385 
400 
401  if ((ctxt == NULL) || (doc == NULL))
402  return(NULL);
403 
404  /*
405  * Walk the context list to find the document
406  */
407  ret = ctxt->docList;
408  while (ret != NULL) {
409  if (ret->doc == doc)
410  return(ret);
411  ret = ret->next;
412  }
413  if (doc == ctxt->style->doc)
414  return(ctxt->document);
415  return(NULL);
416 }
417 
static xmlDocPtr xsltDocDefaultLoaderFunc(const xmlChar *URI, xmlDictPtr dict, int options, void *ctxt ATTRIBUTE_UNUSED, xsltLoadType type ATTRIBUTE_UNUSED)
Definition: documents.c:44
struct _xsltDocument * next
XMLPUBFUN int XMLCALL xmlDictReference(xmlDictPtr dict)
Definition: dict.c:638
XMLPUBFUN char *XMLCALL xmlParserGetDirectory(const char *filename)
XMLPUBFUN int XMLCALL inputPush(xmlParserCtxtPtr ctxt, xmlParserInputPtr value)
Definition: parser.c:1709
GLuint GLuint GLsizei GLenum type
Definition: gl.h:1545
XMLPUBFUN void XMLCALL xmlFreeParserCtxt(xmlParserCtxtPtr ctxt)
xsltDocumentPtr docList
xsltDocLoaderFunc xsltDocDefaultLoader
Definition: documents.c:93
int xsltCheckRead(xsltSecurityPrefsPtr sec, xsltTransformContextPtr ctxt, const xmlChar *URL)
Definition: security.c:400
xsltDocument * xsltDocumentPtr
#define XSLT_PARSE_OPTIONS
Definition: xslt.h:54
xmlDocPtr doc
xmlDocPtr(* xsltDocLoaderFunc)(const xmlChar *URI, xmlDictPtr dict, int options, void *ctxt, xsltLoadType type)
Definition: documents.h:76
smooth NULL
Definition: ftsmooth.c:416
xsltDocumentPtr xsltNewStyleDocument(xsltStylesheetPtr style, xmlDocPtr doc)
Definition: documents.c:166
xsltDocumentPtr document
xmlDictPtr dict
Definition: parser.h:263
GLfloat f
Definition: glext.h:7540
void * xsltGenericDebugContext
Definition: xsltutils.c:549
int wellFormed
Definition: parser.h:188
void xsltSetLoaderFunc(xsltDocLoaderFunc f)
Definition: documents.c:104
XMLPUBFUN int XMLCALL xmlCtxtUseOptions(xmlParserCtxtPtr ctxt, int options)
Definition: parser.c:15162
XMLPUBFUN void XMLCALL xmlFreeDoc(xmlDocPtr cur)
XMLPUBVAR xmlFreeFunc xmlFree
Definition: globals.h:250
void xsltFreeDocuments(xsltTransformContextPtr ctxt)
Definition: documents.c:234
xmlGenericErrorFunc xsltGenericDebug
Definition: xsltutils.c:548
XMLPUBFUN int XMLCALL xmlParseDocument(xmlParserCtxtPtr ctxt)
Definition: parser.c:10579
Definition: tree.h:489
int ret
xmlDocPtr myDoc
Definition: parser.h:187
#define ATTRIBUTE_UNUSED
Definition: win32config.h:132
xsltDocumentPtr styleList
unsigned char xmlChar
Definition: xmlstring.h:28
XMLPUBFUN void XMLCALL xmlDictFree(xmlDictPtr dict)
Definition: dict.c:793
XMLPUBFUN xmlParserInputPtr XMLCALL xmlLoadExternalEntity(const char *URL, const char *ID, xmlParserCtxtPtr ctxt)
int xsltNeedElemSpaceHandling(xsltTransformContextPtr ctxt)
Definition: imports.c:275
void xsltFreeDocumentKeys(xsltDocumentPtr idoc)
Definition: keys.c:920
xsltStylesheetPtr style
__XML_EXTERNC typedef xmlDict * xmlDictPtr
Definition: dict.h:24
#define XSLT_IS_RES_TREE_FRAG(n)
Definition: xsltInternals.h:56
xsltDocumentPtr xsltLoadDocument(xsltTransformContextPtr ctxt, const xmlChar *URI)
Definition: documents.c:268
#define f
Definition: ke_i.h:83
void xsltApplyStripSpaces(xsltTransformContextPtr ctxt, xmlNodePtr node)
Definition: transform.c:5681
xsltDocumentPtr xsltLoadStyleDocument(xsltStylesheetPtr style, const xmlChar *URI)
Definition: documents.c:342
XMLPUBVAR xmlMallocFunc xmlMalloc
Definition: globals.h:247
char * directory
Definition: parser.h:226
Definition: tree.h:551
GLuint res
Definition: glext.h:9613
XMLPUBFUN xmlNodePtr XMLCALL xmlDocGetRootElement(const xmlDoc *doc)
XMLPUBFUN xmlParserCtxtPtr XMLCALL xmlNewParserCtxt(void)
xsltDocumentPtr xsltFindDocument(xsltTransformContextPtr ctxt, xmlDocPtr doc)
Definition: documents.c:398
xsltSecurityPrefsPtr xsltGetDefaultSecurityPrefs(void)
Definition: security.c:163
XMLPUBFUN int XMLCALL xmlStrEqual(const xmlChar *str1, const xmlChar *str2)
Definition: xmlstring.c:157
void xsltTransformError(xsltTransformContextPtr ctxt, xsltStylesheetPtr style, xmlNodePtr node, const char *msg,...)
Definition: xsltutils.c:678
Arabic default style
Definition: afstyles.h:93
#define memset(x, y, z)
Definition: compat.h:39
void xsltFreeStyleDocuments(xsltStylesheetPtr style)
Definition: documents.c:193
xsltDocumentPtr xsltNewDocument(xsltTransformContextPtr ctxt, xmlDocPtr doc)
Definition: documents.c:127
xsltLoadType
Definition: documents.h:53