ReactOS 0.4.15-dev-7953-g1f49173
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
43static 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 }
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
103void
105 if (f == NULL)
107 else
109}
110
111/************************************************************************
112 * *
113 * Module interfaces *
114 * *
115 ************************************************************************/
116
129
131 if (cur == NULL) {
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
168
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
192void
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
233void
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) {
283 if (res == 0)
285 "xsltLoadDocument: read rights for %s denied\n",
286 URI);
287 return(NULL);
288 }
289 }
290
291 /*
292 * Walk the context list to find the document if preparsed
293 */
294 ret = ctxt->docList;
295 while (ret != NULL) {
296 if ((ret->doc != NULL) && (ret->doc->URL != NULL) &&
297 (xmlStrEqual(ret->doc->URL, URI)))
298 return(ret);
299 ret = ret->next;
300 }
301
302 doc = xsltDocDefaultLoader(URI, ctxt->dict, ctxt->parserOptions,
303 (void *) ctxt, XSLT_LOAD_DOCUMENT);
304
305 if (doc == NULL)
306 return(NULL);
307
308 if (ctxt->xinclude != 0) {
309#ifdef LIBXML_XINCLUDE_ENABLED
310#if LIBXML_VERSION >= 20603
311 xmlXIncludeProcessFlags(doc, ctxt->parserOptions);
312#else
313 xmlXIncludeProcess(doc);
314#endif
315#else
317 "xsltLoadDocument(%s) : XInclude processing not compiled in\n",
318 URI);
319#endif
320 }
321 /*
322 * Apply white-space stripping if asked for
323 */
326 if (ctxt->debugStatus == XSLT_DEBUG_NONE)
327 xmlXPathOrderDocElems(doc);
328
329 ret = xsltNewDocument(ctxt, doc);
330 return(ret);
331}
332
345 xmlDocPtr doc;
347
348 if ((style == NULL) || (URI == NULL))
349 return(NULL);
350
351 /*
352 * Security framework check
353 */
355 if (sec != NULL) {
356 int res;
357
358 res = xsltCheckRead(sec, NULL, URI);
359 if (res <= 0) {
360 if (res == 0)
362 "xsltLoadStyleDocument: read rights for %s denied\n",
363 URI);
364 return(NULL);
365 }
366 }
367
368 /*
369 * Walk the context list to find the document if preparsed
370 */
371 ret = style->docList;
372 while (ret != NULL) {
373 if ((ret->doc != NULL) && (ret->doc->URL != NULL) &&
374 (xmlStrEqual(ret->doc->URL, URI)))
375 return(ret);
376 ret = ret->next;
377 }
378
380 (void *) style, XSLT_LOAD_STYLESHEET);
381 if (doc == NULL)
382 return(NULL);
383
385 return(ret);
386}
387
402
403 if ((ctxt == NULL) || (doc == NULL))
404 return(NULL);
405
406 /*
407 * Walk the context list to find the document
408 */
409 ret = ctxt->docList;
410 while (ret != NULL) {
411 if (ret->doc == doc)
412 return(ret);
413 ret = ret->next;
414 }
415 if (doc == ctxt->style->doc)
416 return(ctxt->document);
417 return(NULL);
418}
419
Arabic default style
Definition: afstyles.h:94
#define NULL
Definition: types.h:112
xsltSecurityPrefsPtr xsltGetDefaultSecurityPrefs(void)
Definition: security.c:163
int xsltCheckRead(xsltSecurityPrefsPtr sec, xsltTransformContextPtr ctxt, const xmlChar *URL)
Definition: security.c:402
void xsltApplyStripSpaces(xsltTransformContextPtr ctxt, xmlNodePtr node)
Definition: transform.c:5609
void xsltFreeStyleDocuments(xsltStylesheetPtr style)
Definition: documents.c:193
xsltDocumentPtr xsltNewDocument(xsltTransformContextPtr ctxt, xmlDocPtr doc)
Definition: documents.c:127
xsltDocumentPtr xsltFindDocument(xsltTransformContextPtr ctxt, xmlDocPtr doc)
Definition: documents.c:400
static xmlDocPtr xsltDocDefaultLoaderFunc(const xmlChar *URI, xmlDictPtr dict, int options, void *ctxt ATTRIBUTE_UNUSED, xsltLoadType type ATTRIBUTE_UNUSED)
Definition: documents.c:44
xsltDocLoaderFunc xsltDocDefaultLoader
Definition: documents.c:93
void xsltFreeDocuments(xsltTransformContextPtr ctxt)
Definition: documents.c:234
xsltDocumentPtr xsltNewStyleDocument(xsltStylesheetPtr style, xmlDocPtr doc)
Definition: documents.c:166
xsltDocumentPtr xsltLoadStyleDocument(xsltStylesheetPtr style, const xmlChar *URI)
Definition: documents.c:343
xsltDocumentPtr xsltLoadDocument(xsltTransformContextPtr ctxt, const xmlChar *URI)
Definition: documents.c:268
void xsltSetLoaderFunc(xsltDocLoaderFunc f)
Definition: documents.c:104
xmlDocPtr(* xsltDocLoaderFunc)(const xmlChar *URI, xmlDictPtr dict, int options, void *ctxt, xsltLoadType type)
Definition: documents.h:76
xsltLoadType
Definition: documents.h:53
@ XSLT_LOAD_STYLESHEET
Definition: documents.h:55
@ XSLT_LOAD_DOCUMENT
Definition: documents.h:56
FxCollectionEntry * cur
GLuint GLuint GLsizei GLenum type
Definition: gl.h:1545
GLuint res
Definition: glext.h:9613
GLfloat f
Definition: glext.h:7540
#define ATTRIBUTE_UNUSED
Definition: i386-dis.c:36
int xsltNeedElemSpaceHandling(xsltTransformContextPtr ctxt)
Definition: imports.c:276
#define f
Definition: ke_i.h:83
void xsltFreeDocumentKeys(xsltDocumentPtr idoc)
Definition: keys.c:925
XMLPUBFUN int XMLCALL inputPush(xmlParserCtxtPtr ctxt, xmlParserInputPtr value)
Definition: parser.c:1745
XMLPUBFUN void XMLCALL xmlDictFree(xmlDictPtr dict)
Definition: dict.c:802
XMLPUBFUN int XMLCALL xmlDictReference(xmlDictPtr dict)
Definition: dict.c:647
XMLPUBVAR xmlMallocFunc xmlMalloc
Definition: globals.h:248
XMLPUBVAR xmlFreeFunc xmlFree
Definition: globals.h:251
XMLPUBFUN int XMLCALL xmlCtxtUseOptions(xmlParserCtxtPtr ctxt, int options)
Definition: parser.c:15141
XMLPUBFUN void XMLCALL xmlFreeParserCtxt(xmlParserCtxtPtr ctxt)
XMLPUBFUN int XMLCALL xmlParseDocument(xmlParserCtxtPtr ctxt)
Definition: parser.c:10697
XMLPUBFUN xmlParserInputPtr XMLCALL xmlLoadExternalEntity(const char *URL, const char *ID, xmlParserCtxtPtr ctxt)
XMLPUBFUN xmlParserCtxtPtr XMLCALL xmlNewParserCtxt(void)
XMLPUBFUN xmlNodePtr XMLCALL xmlDocGetRootElement(const xmlDoc *doc)
XMLPUBFUN void XMLCALL xmlFreeDoc(xmlDocPtr cur)
#define memset(x, y, z)
Definition: compat.h:39
Definition: dict.c:111
Definition: tree.h:551
Definition: tree.h:489
char * directory
Definition: parser.h:226
int wellFormed
Definition: parser.h:188
xmlDocPtr myDoc
Definition: parser.h:187
xmlDictPtr dict
Definition: parser.h:263
xmlDocPtr doc
xsltDocumentPtr document
xsltStylesheetPtr style
xsltDocumentPtr docList
xsltDocumentPtr styleList
int ret
XMLPUBFUN char *XMLCALL xmlParserGetDirectory(const char *filename)
XMLPUBFUN int XMLCALL xmlStrEqual(const xmlChar *str1, const xmlChar *str2)
Definition: xmlstring.c:160
unsigned char xmlChar
Definition: xmlstring.h:28
#define XSLT_IS_RES_TREE_FRAG(n)
Definition: xsltInternals.h:56
xsltDocument * xsltDocumentPtr
#define XSLT_PARSE_OPTIONS
Definition: xslt.h:54
void xsltTransformError(xsltTransformContextPtr ctxt, xsltStylesheetPtr style, xmlNodePtr node, const char *msg,...)
Definition: xsltutils.c:678
xmlGenericErrorFunc xsltGenericDebug
Definition: xsltutils.c:548
void * xsltGenericDebugContext
Definition: xsltutils.c:549
@ XSLT_DEBUG_NONE
Definition: xsltutils.h:273