xmlIO.c revision df143a5041f03a22808b59c76698770b74692815
1ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/*
2ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlIO.c : implementation of the I/O interfaces used by the parser
3ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
4ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * See Copyright for the status of this software.
5ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
6ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * daniel@veillard.com
7ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
8ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 14 Nov 2000 ht - for VMS, truncated name of long functions to under 32 char
9ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
10ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
11ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define IN_LIBXML
12ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#include "libxml.h"
13ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
14ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#include <string.h>
15ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef HAVE_ERRNO_H
16ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#include <errno.h>
17ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
18ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
19ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
20ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef HAVE_SYS_TYPES_H
21ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#include <sys/types.h>
22ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
23ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef HAVE_SYS_STAT_H
24ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#include <sys/stat.h>
25ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
26ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef HAVE_FCNTL_H
27ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#include <fcntl.h>
28ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
29ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef HAVE_UNISTD_H
30ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#include <unistd.h>
31ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
32ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef HAVE_STDLIB_H
33ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#include <stdlib.h>
34ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
35ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef HAVE_ZLIB_H
36ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#include <zlib.h>
37ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
38df143a5041f03a22808b59c76698770b74692815Selim Gurun#ifdef HAVE_LZMA_H
39df143a5041f03a22808b59c76698770b74692815Selim Gurun#include <lzma.h>
40df143a5041f03a22808b59c76698770b74692815Selim Gurun#endif
41ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
42ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#if defined(WIN32) || defined(_WIN32)
43ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#include <windows.h>
44ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
45ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
46ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#if defined(_WIN32_WCE)
47ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#include <winnls.h> /* for CP_UTF8 */
48ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
49ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
50ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/* Figure a portable way to know if a file is a directory. */
51ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifndef HAVE_STAT
52ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#  ifdef HAVE__STAT
53ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     /* MS C library seems to define stat and _stat. The definition
54ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        is identical. Still, mapping them to each other causes a warning. */
55ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#    ifndef _MSC_VER
56ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#      define stat(x,y) _stat(x,y)
57ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#    endif
58ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#    define HAVE_STAT
59ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#  endif
60ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#else
61ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#  ifdef HAVE__STAT
62ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#    if defined(_WIN32) || defined (__DJGPP__) && !defined (__CYGWIN__)
63ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#      define stat _stat
64ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#    endif
65ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#  endif
66ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
67ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef HAVE_STAT
68ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#  ifndef S_ISDIR
69ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#    ifdef _S_ISDIR
70ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#      define S_ISDIR(x) _S_ISDIR(x)
71ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#    else
72ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#      ifdef S_IFDIR
73ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#        ifndef S_IFMT
74ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#          ifdef _S_IFMT
75ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#            define S_IFMT _S_IFMT
76ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#          endif
77ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#        endif
78ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#        ifdef S_IFMT
79ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#          define S_ISDIR(m) (((m) & S_IFMT) == S_IFDIR)
80ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#        endif
81ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#      endif
82ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#    endif
83ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#  endif
84ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
85ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
86ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#include <libxml/xmlmemory.h>
87ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#include <libxml/parser.h>
88ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#include <libxml/parserInternals.h>
89ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#include <libxml/xmlIO.h>
90ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#include <libxml/uri.h>
91ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#include <libxml/nanohttp.h>
92ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#include <libxml/nanoftp.h>
93ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#include <libxml/xmlerror.h>
94ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef LIBXML_CATALOG_ENABLED
95ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#include <libxml/catalog.h>
96ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
97ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#include <libxml/globals.h>
98ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
99ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/* #define VERBOSE_FAILURE */
100ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/* #define DEBUG_EXTERNAL_ENTITIES */
101ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/* #define DEBUG_INPUT */
102ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
103ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_INPUT
104ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define MINLEN 40
105ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#else
106ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define MINLEN 4000
107ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
108ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
109ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/*
110ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Input I/O callback sets
111ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
112ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projecttypedef struct _xmlInputCallback {
113ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlInputMatchCallback matchcallback;
114ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlInputOpenCallback opencallback;
115ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlInputReadCallback readcallback;
116ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlInputCloseCallback closecallback;
117ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} xmlInputCallback;
118ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
119ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define MAX_INPUT_CALLBACK 15
120ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
121ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlInputCallback xmlInputCallbackTable[MAX_INPUT_CALLBACK];
122ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int xmlInputCallbackNr = 0;
123ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int xmlInputCallbackInitialized = 0;
124ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
125ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef LIBXML_OUTPUT_ENABLED
126ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/*
127ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Output I/O callback sets
128ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
129ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projecttypedef struct _xmlOutputCallback {
130ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlOutputMatchCallback matchcallback;
131ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlOutputOpenCallback opencallback;
132ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlOutputWriteCallback writecallback;
133ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlOutputCloseCallback closecallback;
134ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} xmlOutputCallback;
135ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
136ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define MAX_OUTPUT_CALLBACK 15
137ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
138ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlOutputCallback xmlOutputCallbackTable[MAX_OUTPUT_CALLBACK];
139ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int xmlOutputCallbackNr = 0;
140ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int xmlOutputCallbackInitialized = 0;
14160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
14260a4c356ee9ce5e9ccb23347c0381f0436192691Patrick ScottxmlOutputBufferPtr
14360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick ScottxmlAllocOutputBufferInternal(xmlCharEncodingHandlerPtr encoder);
144ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif /* LIBXML_OUTPUT_ENABLED */
145ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
146ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/************************************************************************
147ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *									*
148df143a5041f03a22808b59c76698770b74692815Selim Gurun *		Tree memory error handler				*
149ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *									*
150ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ************************************************************************/
151ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
152ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic const char *IOerr[] = {
153ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    "Unknown IO error",         /* UNKNOWN */
154ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    "Permission denied",	/* EACCES */
155ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    "Resource temporarily unavailable",/* EAGAIN */
156ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    "Bad file descriptor",	/* EBADF */
157ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    "Bad message",		/* EBADMSG */
158ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    "Resource busy",		/* EBUSY */
159ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    "Operation canceled",	/* ECANCELED */
160ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    "No child processes",	/* ECHILD */
161ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    "Resource deadlock avoided",/* EDEADLK */
162ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    "Domain error",		/* EDOM */
163ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    "File exists",		/* EEXIST */
164ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    "Bad address",		/* EFAULT */
165ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    "File too large",		/* EFBIG */
166ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    "Operation in progress",	/* EINPROGRESS */
167ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    "Interrupted function call",/* EINTR */
168ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    "Invalid argument",		/* EINVAL */
169ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    "Input/output error",	/* EIO */
170ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    "Is a directory",		/* EISDIR */
171ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    "Too many open files",	/* EMFILE */
172ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    "Too many links",		/* EMLINK */
173ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    "Inappropriate message buffer length",/* EMSGSIZE */
174ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    "Filename too long",	/* ENAMETOOLONG */
175ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    "Too many open files in system",/* ENFILE */
176ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    "No such device",		/* ENODEV */
177ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    "No such file or directory",/* ENOENT */
178ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    "Exec format error",	/* ENOEXEC */
179ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    "No locks available",	/* ENOLCK */
180ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    "Not enough space",		/* ENOMEM */
181ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    "No space left on device",	/* ENOSPC */
182ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    "Function not implemented",	/* ENOSYS */
183ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    "Not a directory",		/* ENOTDIR */
184ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    "Directory not empty",	/* ENOTEMPTY */
185ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    "Not supported",		/* ENOTSUP */
186ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    "Inappropriate I/O control operation",/* ENOTTY */
187ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    "No such device or address",/* ENXIO */
188ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    "Operation not permitted",	/* EPERM */
189ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    "Broken pipe",		/* EPIPE */
190ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    "Result too large",		/* ERANGE */
191ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    "Read-only file system",	/* EROFS */
192ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    "Invalid seek",		/* ESPIPE */
193ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    "No such process",		/* ESRCH */
194ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    "Operation timed out",	/* ETIMEDOUT */
195ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    "Improper link",		/* EXDEV */
196ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    "Attempt to load network entity %s", /* XML_IO_NETWORK_ATTEMPT */
197ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    "encoder error",		/* XML_IO_ENCODER */
198ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    "flush error",
199ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    "write error",
200ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    "no input",
201ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    "buffer full",
202ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    "loading error",
203ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    "not a socket",		/* ENOTSOCK */
204ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    "already connected",	/* EISCONN */
205ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    "connection refused",	/* ECONNREFUSED */
206ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    "unreachable network",	/* ENETUNREACH */
207ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    "adddress in use",		/* EADDRINUSE */
208ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    "already in use",		/* EALREADY */
209ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    "unknown address familly",	/* EAFNOSUPPORT */
210ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project};
211ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
212ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#if defined(_WIN32) || defined (__DJGPP__) && !defined (__CYGWIN__)
213ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
214ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * __xmlIOWin32UTF8ToWChar:
215ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @u8String:  uft-8 string
216ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
217ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Convert a string from utf-8 to wchar (WINDOWS ONLY!)
218ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
219ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic wchar_t *
220ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project__xmlIOWin32UTF8ToWChar(const char *u8String)
221ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
222ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    wchar_t *wString = NULL;
223ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
224ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (u8String) {
225ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        int wLen =
226ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            MultiByteToWideChar(CP_UTF8, MB_ERR_INVALID_CHARS, u8String,
227ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                -1, NULL, 0);
228ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (wLen) {
229ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            wString = xmlMalloc(wLen * sizeof(wchar_t));
230ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (wString) {
231ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                if (MultiByteToWideChar
232ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    (CP_UTF8, 0, u8String, -1, wString, wLen) == 0) {
233ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    xmlFree(wString);
234ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    wString = NULL;
235ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                }
236ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
237ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
238ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
239ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
240ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return wString;
241ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
242ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
243ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
244ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
245ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlIOErrMemory:
246ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @extra:  extra informations
247ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
248ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Handle an out of memory condition
249ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
250ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
251ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlIOErrMemory(const char *extra)
252ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
253ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    __xmlSimpleError(XML_FROM_IO, XML_ERR_NO_MEMORY, NULL, NULL, extra);
254ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
255ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
256ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
257ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * __xmlIOErr:
258ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @code:  the error number
259ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @
260ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @extra:  extra informations
261ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
262ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Handle an I/O error
263ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
264ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid
265ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project__xmlIOErr(int domain, int code, const char *extra)
266ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
267ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    unsigned int idx;
268ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
269ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (code == 0) {
270ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef HAVE_ERRNO_H
271ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (errno == 0) code = 0;
272ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef EACCES
273ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        else if (errno == EACCES) code = XML_IO_EACCES;
274ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
275ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef EAGAIN
276ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        else if (errno == EAGAIN) code = XML_IO_EAGAIN;
277ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
278ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef EBADF
279ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        else if (errno == EBADF) code = XML_IO_EBADF;
280ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
281ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef EBADMSG
282ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        else if (errno == EBADMSG) code = XML_IO_EBADMSG;
283ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
284ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef EBUSY
285ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        else if (errno == EBUSY) code = XML_IO_EBUSY;
286ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
287ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef ECANCELED
288ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        else if (errno == ECANCELED) code = XML_IO_ECANCELED;
289ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
290ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef ECHILD
291ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        else if (errno == ECHILD) code = XML_IO_ECHILD;
292ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
293ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef EDEADLK
294ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        else if (errno == EDEADLK) code = XML_IO_EDEADLK;
295ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
296ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef EDOM
297ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        else if (errno == EDOM) code = XML_IO_EDOM;
298ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
299ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef EEXIST
300ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        else if (errno == EEXIST) code = XML_IO_EEXIST;
301ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
302ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef EFAULT
303ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        else if (errno == EFAULT) code = XML_IO_EFAULT;
304ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
305ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef EFBIG
306ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        else if (errno == EFBIG) code = XML_IO_EFBIG;
307ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
308ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef EINPROGRESS
309ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        else if (errno == EINPROGRESS) code = XML_IO_EINPROGRESS;
310ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
311ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef EINTR
312ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        else if (errno == EINTR) code = XML_IO_EINTR;
313ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
314ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef EINVAL
315ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        else if (errno == EINVAL) code = XML_IO_EINVAL;
316ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
317ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef EIO
318ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        else if (errno == EIO) code = XML_IO_EIO;
319ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
320ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef EISDIR
321ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        else if (errno == EISDIR) code = XML_IO_EISDIR;
322ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
323ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef EMFILE
324ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        else if (errno == EMFILE) code = XML_IO_EMFILE;
325ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
326ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef EMLINK
327ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        else if (errno == EMLINK) code = XML_IO_EMLINK;
328ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
329ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef EMSGSIZE
330ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        else if (errno == EMSGSIZE) code = XML_IO_EMSGSIZE;
331ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
332ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef ENAMETOOLONG
333ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        else if (errno == ENAMETOOLONG) code = XML_IO_ENAMETOOLONG;
334ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
335ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef ENFILE
336ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        else if (errno == ENFILE) code = XML_IO_ENFILE;
337ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
338ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef ENODEV
339ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        else if (errno == ENODEV) code = XML_IO_ENODEV;
340ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
341ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef ENOENT
342ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        else if (errno == ENOENT) code = XML_IO_ENOENT;
343ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
344ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef ENOEXEC
345ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        else if (errno == ENOEXEC) code = XML_IO_ENOEXEC;
346ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
347ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef ENOLCK
348ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        else if (errno == ENOLCK) code = XML_IO_ENOLCK;
349ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
350ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef ENOMEM
351ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        else if (errno == ENOMEM) code = XML_IO_ENOMEM;
352ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
353ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef ENOSPC
354ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        else if (errno == ENOSPC) code = XML_IO_ENOSPC;
355ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
356ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef ENOSYS
357ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        else if (errno == ENOSYS) code = XML_IO_ENOSYS;
358ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
359ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef ENOTDIR
360ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        else if (errno == ENOTDIR) code = XML_IO_ENOTDIR;
361ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
362ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef ENOTEMPTY
363ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        else if (errno == ENOTEMPTY) code = XML_IO_ENOTEMPTY;
364ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
365ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef ENOTSUP
366ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        else if (errno == ENOTSUP) code = XML_IO_ENOTSUP;
367ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
368ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef ENOTTY
369ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        else if (errno == ENOTTY) code = XML_IO_ENOTTY;
370ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
371ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef ENXIO
372ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        else if (errno == ENXIO) code = XML_IO_ENXIO;
373ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
374ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef EPERM
375ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        else if (errno == EPERM) code = XML_IO_EPERM;
376ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
377ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef EPIPE
378ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        else if (errno == EPIPE) code = XML_IO_EPIPE;
379ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
380ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef ERANGE
381ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        else if (errno == ERANGE) code = XML_IO_ERANGE;
382ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
383ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef EROFS
384ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        else if (errno == EROFS) code = XML_IO_EROFS;
385ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
386ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef ESPIPE
387ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        else if (errno == ESPIPE) code = XML_IO_ESPIPE;
388ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
389ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef ESRCH
390ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        else if (errno == ESRCH) code = XML_IO_ESRCH;
391ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
392ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef ETIMEDOUT
393ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        else if (errno == ETIMEDOUT) code = XML_IO_ETIMEDOUT;
394ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
395ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef EXDEV
396ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        else if (errno == EXDEV) code = XML_IO_EXDEV;
397ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
398ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef ENOTSOCK
399ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        else if (errno == ENOTSOCK) code = XML_IO_ENOTSOCK;
400ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
401ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef EISCONN
402ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        else if (errno == EISCONN) code = XML_IO_EISCONN;
403ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
404ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef ECONNREFUSED
405ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        else if (errno == ECONNREFUSED) code = XML_IO_ECONNREFUSED;
406ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
407ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef ETIMEDOUT
408ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        else if (errno == ETIMEDOUT) code = XML_IO_ETIMEDOUT;
409ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
410ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef ENETUNREACH
411ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        else if (errno == ENETUNREACH) code = XML_IO_ENETUNREACH;
412ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
413ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef EADDRINUSE
414ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        else if (errno == EADDRINUSE) code = XML_IO_EADDRINUSE;
415ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
416ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef EINPROGRESS
417ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        else if (errno == EINPROGRESS) code = XML_IO_EINPROGRESS;
418ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
419ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef EALREADY
420ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        else if (errno == EALREADY) code = XML_IO_EALREADY;
421ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
422ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef EAFNOSUPPORT
423ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        else if (errno == EAFNOSUPPORT) code = XML_IO_EAFNOSUPPORT;
424ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
425ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        else code = XML_IO_UNKNOWN;
426ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif /* HAVE_ERRNO_H */
427ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
428ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    idx = 0;
429ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (code >= XML_IO_UNKNOWN) idx = code - XML_IO_UNKNOWN;
430ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (idx >= (sizeof(IOerr) / sizeof(IOerr[0]))) idx = 0;
431df143a5041f03a22808b59c76698770b74692815Selim Gurun
432ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    __xmlSimpleError(domain, code, NULL, IOerr[idx], extra);
433ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
434ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
435ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
436ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlIOErr:
437ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @code:  the error number
438ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @extra:  extra informations
439ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
440ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Handle an I/O error
441ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
442ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
443ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlIOErr(int code, const char *extra)
444ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
445ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    __xmlIOErr(XML_FROM_IO, code, extra);
446ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
447ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
448ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
449ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * __xmlLoaderErr:
450ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctx: the parser context
451ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @extra:  extra informations
452ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
453ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Handle a resource access error
454ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
455ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid
456ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project__xmlLoaderErr(void *ctx, const char *msg, const char *filename)
457ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
458ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlParserCtxtPtr ctxt = (xmlParserCtxtPtr) ctx;
459ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlStructuredErrorFunc schannel = NULL;
460ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlGenericErrorFunc channel = NULL;
461ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    void *data = NULL;
462ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlErrorLevel level = XML_ERR_ERROR;
463ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
464ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((ctxt != NULL) && (ctxt->disableSAX != 0) &&
465ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        (ctxt->instate == XML_PARSER_EOF))
466ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return;
467ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((ctxt != NULL) && (ctxt->sax != NULL)) {
468ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (ctxt->validate) {
469ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    channel = ctxt->sax->error;
470ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    level = XML_ERR_ERROR;
471ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else {
472ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    channel = ctxt->sax->warning;
473ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    level = XML_ERR_WARNING;
474ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
475ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (ctxt->sax->initialized == XML_SAX2_MAGIC)
476ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    schannel = ctxt->sax->serror;
477ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	data = ctxt->userData;
478ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
479ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    __xmlRaiseError(schannel, channel, data, ctxt, NULL, XML_FROM_IO,
480ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    XML_IO_LOAD_ERROR, level, NULL, 0,
481ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    filename, NULL, NULL, 0, 0,
482ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    msg, filename);
483df143a5041f03a22808b59c76698770b74692815Selim Gurun
484ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
485ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
486ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/************************************************************************
487ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *									*
488df143a5041f03a22808b59c76698770b74692815Selim Gurun *		Tree memory error handler				*
489ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *									*
490ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ************************************************************************/
491ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
492ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlNormalizeWindowsPath:
493ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @path: the input file path
494ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
495ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * This function is obsolete. Please see xmlURIFromPath in uri.c for
496ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * a better solution.
497ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
498ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns a canonicalized version of the path
499ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
500ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlChar *
501ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlNormalizeWindowsPath(const xmlChar *path)
502ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
503ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return xmlCanonicPath(path);
504ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
505ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
506ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
507ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlCleanupInputCallbacks:
508ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
509ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * clears the entire input callback table. this includes the
510df143a5041f03a22808b59c76698770b74692815Selim Gurun * compiled-in I/O.
511ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
512ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid
513ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlCleanupInputCallbacks(void)
514ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
515ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int i;
516ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
517ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (!xmlInputCallbackInitialized)
518ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return;
519ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
520ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    for (i = xmlInputCallbackNr - 1; i >= 0; i--) {
521ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlInputCallbackTable[i].matchcallback = NULL;
522ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlInputCallbackTable[i].opencallback = NULL;
523ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlInputCallbackTable[i].readcallback = NULL;
524ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlInputCallbackTable[i].closecallback = NULL;
525ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
526ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
527ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlInputCallbackNr = 0;
528ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlInputCallbackInitialized = 0;
529ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
530ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
531ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
532ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlPopInputCallbacks:
533ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
534ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Clear the top input callback from the input stack. this includes the
535df143a5041f03a22808b59c76698770b74692815Selim Gurun * compiled-in I/O.
536ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
537ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the number of input callback registered or -1 in case of error.
538ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
539ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectint
540ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlPopInputCallbacks(void)
541ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
542ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (!xmlInputCallbackInitialized)
543ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return(-1);
544ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
545ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (xmlInputCallbackNr <= 0)
546ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return(-1);
547df143a5041f03a22808b59c76698770b74692815Selim Gurun
548ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlInputCallbackNr--;
549ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlInputCallbackTable[xmlInputCallbackNr].matchcallback = NULL;
550ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlInputCallbackTable[xmlInputCallbackNr].opencallback = NULL;
551ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlInputCallbackTable[xmlInputCallbackNr].readcallback = NULL;
552ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlInputCallbackTable[xmlInputCallbackNr].closecallback = NULL;
553ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
554ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(xmlInputCallbackNr);
555ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
556ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
557ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef LIBXML_OUTPUT_ENABLED
558ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
559ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlCleanupOutputCallbacks:
560ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
561ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * clears the entire output callback table. this includes the
562df143a5041f03a22808b59c76698770b74692815Selim Gurun * compiled-in I/O callbacks.
563ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
564ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid
565ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlCleanupOutputCallbacks(void)
566ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
567ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int i;
568ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
569ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (!xmlOutputCallbackInitialized)
570ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return;
571ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
572ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    for (i = xmlOutputCallbackNr - 1; i >= 0; i--) {
573ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlOutputCallbackTable[i].matchcallback = NULL;
574ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlOutputCallbackTable[i].opencallback = NULL;
575ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlOutputCallbackTable[i].writecallback = NULL;
576ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlOutputCallbackTable[i].closecallback = NULL;
577ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
578ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
579ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlOutputCallbackNr = 0;
580ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlOutputCallbackInitialized = 0;
581ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
582ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif /* LIBXML_OUTPUT_ENABLED */
583ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
584ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/************************************************************************
585ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *									*
586ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *		Standard I/O for file accesses				*
587ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *									*
588ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ************************************************************************/
589ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
590ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#if defined(_WIN32) || defined (__DJGPP__) && !defined (__CYGWIN__)
591ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
592ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
593ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *  xmlWrapOpenUtf8:
594ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @path:  the path in utf-8 encoding
595ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @mode:  type of access (0 - read, 1 - write)
596ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
597ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * function opens the file specified by @path
598ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
599ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
600ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic FILE*
601ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlWrapOpenUtf8(const char *path,int mode)
602ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
603ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    FILE *fd = NULL;
604ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    wchar_t *wPath;
605ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
606ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    wPath = __xmlIOWin32UTF8ToWChar(path);
607ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if(wPath)
608ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    {
609ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project       fd = _wfopen(wPath, mode ? L"wb" : L"rb");
610ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project       xmlFree(wPath);
611ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
612ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /* maybe path in native encoding */
613ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if(fd == NULL)
614ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project       fd = fopen(path, mode ? "wb" : "rb");
615ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
616ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return fd;
617ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
618ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
619df143a5041f03a22808b59c76698770b74692815Selim Gurun#ifdef HAVE_ZLIB_H
620df143a5041f03a22808b59c76698770b74692815Selim Gurunstatic gzFile
621df143a5041f03a22808b59c76698770b74692815Selim GurunxmlWrapGzOpenUtf8(const char *path, const char *mode)
622df143a5041f03a22808b59c76698770b74692815Selim Gurun{
623df143a5041f03a22808b59c76698770b74692815Selim Gurun    gzFile fd;
624df143a5041f03a22808b59c76698770b74692815Selim Gurun    wchar_t *wPath;
625df143a5041f03a22808b59c76698770b74692815Selim Gurun
626df143a5041f03a22808b59c76698770b74692815Selim Gurun    fd = gzopen (path, mode);
627df143a5041f03a22808b59c76698770b74692815Selim Gurun    if (fd)
628df143a5041f03a22808b59c76698770b74692815Selim Gurun        return fd;
629df143a5041f03a22808b59c76698770b74692815Selim Gurun
630df143a5041f03a22808b59c76698770b74692815Selim Gurun    wPath = __xmlIOWin32UTF8ToWChar(path);
631df143a5041f03a22808b59c76698770b74692815Selim Gurun    if(wPath)
632df143a5041f03a22808b59c76698770b74692815Selim Gurun    {
633df143a5041f03a22808b59c76698770b74692815Selim Gurun	int d, m = (strstr(mode, "r") ? O_RDONLY : O_RDWR);
634df143a5041f03a22808b59c76698770b74692815Selim Gurun#ifdef _O_BINARY
635df143a5041f03a22808b59c76698770b74692815Selim Gurun        m |= (strstr(mode, "b") ? _O_BINARY : 0);
636df143a5041f03a22808b59c76698770b74692815Selim Gurun#endif
637df143a5041f03a22808b59c76698770b74692815Selim Gurun	d = _wopen(wPath, m);
638df143a5041f03a22808b59c76698770b74692815Selim Gurun	if (d >= 0)
639df143a5041f03a22808b59c76698770b74692815Selim Gurun	    fd = gzdopen(d, mode);
640df143a5041f03a22808b59c76698770b74692815Selim Gurun        xmlFree(wPath);
641df143a5041f03a22808b59c76698770b74692815Selim Gurun    }
642df143a5041f03a22808b59c76698770b74692815Selim Gurun
643df143a5041f03a22808b59c76698770b74692815Selim Gurun    return fd;
644df143a5041f03a22808b59c76698770b74692815Selim Gurun}
645df143a5041f03a22808b59c76698770b74692815Selim Gurun#endif
646df143a5041f03a22808b59c76698770b74692815Selim Gurun
647ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
648ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *  xmlWrapStatUtf8:
649ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @path:  the path in utf-8 encoding
650ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @info:  structure that stores results
651ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
652ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * function obtains information about the file or directory
653ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
654ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
655ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
656ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlWrapStatUtf8(const char *path,struct stat *info)
657ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
658ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef HAVE_STAT
659ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int retval = -1;
660ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    wchar_t *wPath;
661ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
662ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    wPath = __xmlIOWin32UTF8ToWChar(path);
663ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (wPath)
664ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    {
665ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project       retval = _wstat(wPath,info);
666ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project       xmlFree(wPath);
667ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
668ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /* maybe path in native encoding */
669ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if(retval < 0)
670ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project       retval = stat(path,info);
671ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return retval;
672ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#else
673ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return -1;
674ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
675ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
676ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
677ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
678ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *  xmlWrapOpenNative:
679ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @path:  the path
680ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @mode:  type of access (0 - read, 1 - write)
681ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
682ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * function opens the file specified by @path
683ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
684ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
685ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic FILE*
686ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlWrapOpenNative(const char *path,int mode)
687ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
688ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return fopen(path,mode ? "wb" : "rb");
689ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
690ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
691ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
692ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *  xmlWrapStatNative:
693ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @path:  the path
694ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @info:  structure that stores results
695ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
696ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * function obtains information about the file or directory
697ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
698ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
699ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
700ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlWrapStatNative(const char *path,struct stat *info)
701ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
702ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef HAVE_STAT
703ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return stat(path,info);
704ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#else
705ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return -1;
706ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
707ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
708ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
709ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projecttypedef int (* xmlWrapStatFunc) (const char *f, struct stat *s);
710ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlWrapStatFunc xmlWrapStat = xmlWrapStatNative;
711ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projecttypedef FILE* (* xmlWrapOpenFunc)(const char *f,int mode);
712ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlWrapOpenFunc xmlWrapOpen = xmlWrapOpenNative;
713df143a5041f03a22808b59c76698770b74692815Selim Gurun#ifdef HAVE_ZLIB_H
714df143a5041f03a22808b59c76698770b74692815Selim Guruntypedef gzFile (* xmlWrapGzOpenFunc) (const char *f, const char *mode);
715df143a5041f03a22808b59c76698770b74692815Selim Gurunstatic xmlWrapGzOpenFunc xmlWrapGzOpen = gzopen;
716df143a5041f03a22808b59c76698770b74692815Selim Gurun#endif
717ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
718ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlInitPlatformSpecificIo:
719ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
720ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Initialize platform specific features.
721ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
722ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
723ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlInitPlatformSpecificIo(void)
724ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
725ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    static int xmlPlatformIoInitialized = 0;
726ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    OSVERSIONINFO osvi;
727ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
728ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if(xmlPlatformIoInitialized)
729ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project      return;
730ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
731ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    osvi.dwOSVersionInfoSize = sizeof(osvi);
732ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
733ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if(GetVersionEx(&osvi) && (osvi.dwPlatformId == VER_PLATFORM_WIN32_NT)) {
734ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project      xmlWrapStat = xmlWrapStatUtf8;
735ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project      xmlWrapOpen = xmlWrapOpenUtf8;
736df143a5041f03a22808b59c76698770b74692815Selim Gurun#ifdef HAVE_ZLIB_H
737df143a5041f03a22808b59c76698770b74692815Selim Gurun      xmlWrapGzOpen = xmlWrapGzOpenUtf8;
738df143a5041f03a22808b59c76698770b74692815Selim Gurun#endif
739ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else {
740ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project      xmlWrapStat = xmlWrapStatNative;
741ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project      xmlWrapOpen = xmlWrapOpenNative;
742df143a5041f03a22808b59c76698770b74692815Selim Gurun#ifdef HAVE_ZLIB_H
743df143a5041f03a22808b59c76698770b74692815Selim Gurun      xmlWrapGzOpen = gzopen;
744df143a5041f03a22808b59c76698770b74692815Selim Gurun#endif
745ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
746ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
747ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlPlatformIoInitialized = 1;
748ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return;
749ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
750ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
751ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
752ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
753ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
754ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlCheckFilename:
755ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @path:  the path to check
756ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
757ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * function checks to see if @path is a valid source
758ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * (file, socket...) for XML.
759ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
760ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * if stat is not available on the target machine,
761ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * returns 1.  if stat fails, returns 0 (if calling
762ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * stat on the filename fails, it can't be right).
763ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * if stat succeeds and the file is a directory,
764ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * returns 2.  otherwise returns 1.
765ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
766ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
767ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectint
768ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlCheckFilename (const char *path)
769ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
770ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef HAVE_STAT
771ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	struct stat stat_buffer;
772ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
773ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (path == NULL)
774ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		return(0);
775ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
776ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef HAVE_STAT
777ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#if defined(_WIN32) || defined (__DJGPP__) && !defined (__CYGWIN__)
778ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (xmlWrapStat(path, &stat_buffer) == -1)
779ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return 0;
780ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#else
781ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (stat(path, &stat_buffer) == -1)
782ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return 0;
783ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
784ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef S_ISDIR
785ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (S_ISDIR(stat_buffer.st_mode))
786ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return 2;
787ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
788ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif /* HAVE_STAT */
789ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return 1;
790ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
791ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
792ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
793ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlNop(void) {
794ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(0);
795ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
796ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
797ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
798ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlFdRead:
799ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @context:  the I/O context
800ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @buffer:  where to drop data
801ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @len:  number of bytes to read
802ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
803ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Read @len bytes to @buffer from the I/O channel.
804ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
805ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the number of bytes written
806ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
807ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
808ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlFdRead (void * context, char * buffer, int len) {
809ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int ret;
810ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
811ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret = read((int) (long) context, &buffer[0], len);
812ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ret < 0) xmlIOErr(0, "read()");
813ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(ret);
814ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
815ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
816ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef LIBXML_OUTPUT_ENABLED
817ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
818ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlFdWrite:
819ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @context:  the I/O context
820ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @buffer:  where to get data
821ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @len:  number of bytes to write
822ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
823ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Write @len bytes from @buffer to the I/O channel.
824ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
825ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the number of bytes written
826ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
827ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
828ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlFdWrite (void * context, const char * buffer, int len) {
829ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int ret = 0;
830ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
831ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (len > 0) {
832ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ret = write((int) (long) context, &buffer[0], len);
833ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (ret < 0) xmlIOErr(0, "write()");
834ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
835ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(ret);
836ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
837ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif /* LIBXML_OUTPUT_ENABLED */
838ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
839ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
840ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlFdClose:
841ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @context:  the I/O context
842ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
843ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Close an I/O channel
844ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
845ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 0 in case of success and error code otherwise
846ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
847ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
848ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlFdClose (void * context) {
849ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int ret;
850ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret = close((int) (long) context);
851ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ret < 0) xmlIOErr(0, "close()");
852ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(ret);
853ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
854ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
855ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
856ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlFileMatch:
857ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @filename:  the URI for matching
858ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
859ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * input from FILE *
860ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
861ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 1 if matches, 0 otherwise
862ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
863ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectint
864ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlFileMatch (const char *filename ATTRIBUTE_UNUSED) {
865ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(1);
866ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
867ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
868ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
869ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlFileOpen_real:
870ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @filename:  the URI for matching
871ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
872ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * input from FILE *, supports compressed input
873ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * if @filename is " " then the standard input is used
874ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
875ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns an I/O context or NULL in case of error
876ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
877ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void *
878ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlFileOpen_real (const char *filename) {
879ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    const char *path = NULL;
880ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    FILE *fd;
881ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
882ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (filename == NULL)
883ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return(NULL);
884ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
885ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (!strcmp(filename, "-")) {
886ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	fd = stdin;
887ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return((void *) fd);
888ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
889ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
890ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (!xmlStrncasecmp(BAD_CAST filename, BAD_CAST "file://localhost/", 17)) {
891ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#if defined (_WIN32) || defined (__DJGPP__) && !defined(__CYGWIN__)
892ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	path = &filename[17];
893ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#else
894ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	path = &filename[16];
895ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
896ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else if (!xmlStrncasecmp(BAD_CAST filename, BAD_CAST "file:///", 8)) {
897ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#if defined (_WIN32) || defined (__DJGPP__) && !defined(__CYGWIN__)
898ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	path = &filename[8];
899ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#else
900ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	path = &filename[7];
901ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
902ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else if (!xmlStrncasecmp(BAD_CAST filename, BAD_CAST "file:/", 6)) {
903ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        /* lots of generators seems to lazy to read RFC 1738 */
904ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#if defined (_WIN32) || defined (__DJGPP__) && !defined(__CYGWIN__)
905ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	path = &filename[6];
906ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#else
907ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	path = &filename[5];
908ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
909df143a5041f03a22808b59c76698770b74692815Selim Gurun    } else
910ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	path = filename;
911ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
912ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (path == NULL)
913ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(NULL);
914ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (!xmlCheckFilename(path))
915ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return(NULL);
916ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
917ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#if defined(_WIN32) || defined (__DJGPP__) && !defined (__CYGWIN__)
918ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    fd = xmlWrapOpen(path, 0);
919ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#else
920ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    fd = fopen(path, "r");
921ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif /* WIN32 */
922ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (fd == NULL) xmlIOErr(0, path);
923ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return((void *) fd);
924ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
925ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
926ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
927ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlFileOpen:
928ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @filename:  the URI for matching
929ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
930ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Wrapper around xmlFileOpen_real that try it with an unescaped
931ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * version of @filename, if this fails fallback to @filename
932ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
933ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns a handler or NULL in case or failure
934ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
935ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid *
936ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlFileOpen (const char *filename) {
937ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    char *unescaped;
938ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    void *retval;
939ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
940ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    retval = xmlFileOpen_real(filename);
941ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (retval == NULL) {
942ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	unescaped = xmlURIUnescapeString(filename, 0, NULL);
943ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (unescaped != NULL) {
944ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    retval = xmlFileOpen_real(unescaped);
945ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlFree(unescaped);
946ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
947ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
948ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
949ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return retval;
950ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
951ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
952ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef LIBXML_OUTPUT_ENABLED
953ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
954ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlFileOpenW:
955ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @filename:  the URI for matching
956ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
957ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * output to from FILE *,
958ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * if @filename is "-" then the standard output is used
959ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
960ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns an I/O context or NULL in case of error
961ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
962ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void *
963ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlFileOpenW (const char *filename) {
964ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    const char *path = NULL;
965ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    FILE *fd;
966ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
967ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (!strcmp(filename, "-")) {
968ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	fd = stdout;
969ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return((void *) fd);
970ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
971ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
972ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (!xmlStrncasecmp(BAD_CAST filename, BAD_CAST "file://localhost/", 17))
973ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#if defined (_WIN32) || defined (__DJGPP__) && !defined(__CYGWIN__)
974ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	path = &filename[17];
975ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#else
976ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	path = &filename[16];
977ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
978ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    else if (!xmlStrncasecmp(BAD_CAST filename, BAD_CAST "file:///", 8)) {
979ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#if defined (_WIN32) || defined (__DJGPP__) && !defined(__CYGWIN__)
980ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	path = &filename[8];
981ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#else
982ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	path = &filename[7];
983ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
984df143a5041f03a22808b59c76698770b74692815Selim Gurun    } else
985ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	path = filename;
986ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
987ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (path == NULL)
988ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(NULL);
989ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
990ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#if defined(_WIN32) || defined (__DJGPP__) && !defined (__CYGWIN__)
991ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    fd = xmlWrapOpen(path, 1);
992ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#else
993df143a5041f03a22808b59c76698770b74692815Selim Gurun 	   fd = fopen(path, "wb");
994ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif /* WIN32 */
995ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
996ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	 if (fd == NULL) xmlIOErr(0, path);
997ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return((void *) fd);
998ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
999ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif /* LIBXML_OUTPUT_ENABLED */
1000ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1001ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
1002ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlFileRead:
1003ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @context:  the I/O context
1004ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @buffer:  where to drop data
1005ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @len:  number of bytes to write
1006ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
1007ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Read @len bytes to @buffer from the I/O channel.
1008ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
1009ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the number of bytes written or < 0 in case of failure
1010ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
1011ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectint
1012ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlFileRead (void * context, char * buffer, int len) {
1013ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int ret;
1014df143a5041f03a22808b59c76698770b74692815Selim Gurun    if ((context == NULL) || (buffer == NULL))
1015ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return(-1);
1016ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret = fread(&buffer[0], 1,  len, (FILE *) context);
1017ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ret < 0) xmlIOErr(0, "fread()");
1018ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(ret);
1019ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
1020ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1021ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef LIBXML_OUTPUT_ENABLED
1022ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
1023ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlFileWrite:
1024ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @context:  the I/O context
1025ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @buffer:  where to drop data
1026ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @len:  number of bytes to write
1027ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
1028ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Write @len bytes from @buffer to the I/O channel.
1029ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
1030ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the number of bytes written
1031ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
1032ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
1033ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlFileWrite (void * context, const char * buffer, int len) {
1034ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int items;
1035ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1036df143a5041f03a22808b59c76698770b74692815Selim Gurun    if ((context == NULL) || (buffer == NULL))
1037ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return(-1);
1038ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    items = fwrite(&buffer[0], len, 1, (FILE *) context);
1039ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((items == 0) && (ferror((FILE *) context))) {
1040ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlIOErr(0, "fwrite()");
1041ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(-1);
1042ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
1043ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(items * len);
1044ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
1045ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif /* LIBXML_OUTPUT_ENABLED */
1046ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1047ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
1048ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlFileClose:
1049ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @context:  the I/O context
1050ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
1051ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Close an I/O channel
1052ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
1053ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 0 or -1 in case of error
1054ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
1055ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectint
1056ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlFileClose (void * context) {
1057ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    FILE *fil;
1058ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int ret;
1059ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1060ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (context == NULL)
1061ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return(-1);
1062ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    fil = (FILE *) context;
1063ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((fil == stdout) || (fil == stderr)) {
1064ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ret = fflush(fil);
1065ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (ret < 0)
1066ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlIOErr(0, "fflush()");
1067ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(0);
1068ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
1069ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (fil == stdin)
1070ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(0);
1071ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret = ( fclose((FILE *) context) == EOF ) ? -1 : 0;
1072ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ret < 0)
1073ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlIOErr(0, "fclose()");
1074ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(ret);
1075ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
1076ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1077ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
1078ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlFileFlush:
1079ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @context:  the I/O context
1080ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
1081ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Flush an I/O channel
1082ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
1083ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
1084ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlFileFlush (void * context) {
1085ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int ret;
1086ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1087ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (context == NULL)
1088ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return(-1);
1089ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret = ( fflush((FILE *) context) == EOF ) ? -1 : 0;
1090ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ret < 0)
1091ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlIOErr(0, "fflush()");
1092ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(ret);
1093ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
1094ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1095ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef LIBXML_OUTPUT_ENABLED
1096ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
1097ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlBufferWrite:
1098ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @context:  the xmlBuffer
1099ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @buffer:  the data to write
1100ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @len:  number of bytes to write
1101ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
1102ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Write @len bytes from @buffer to the xml buffer
1103ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
1104ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the number of bytes written
1105ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
1106ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
1107ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlBufferWrite (void * context, const char * buffer, int len) {
1108ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int ret;
1109ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1110ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret = xmlBufferAdd((xmlBufferPtr) context, (const xmlChar *) buffer, len);
1111ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ret != 0)
1112ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return(-1);
1113ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(len);
1114ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
1115ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
1116ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1117ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef HAVE_ZLIB_H
1118ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/************************************************************************
1119ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *									*
1120ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *		I/O for compressed file accesses			*
1121ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *									*
1122ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ************************************************************************/
1123ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
1124ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlGzfileMatch:
1125ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @filename:  the URI for matching
1126ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
1127ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * input from compressed file test
1128ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
1129ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 1 if matches, 0 otherwise
1130ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
1131ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
1132ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlGzfileMatch (const char *filename ATTRIBUTE_UNUSED) {
1133ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(1);
1134ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
1135ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1136ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
1137ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlGzfileOpen_real:
1138ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @filename:  the URI for matching
1139ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
1140ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * input from compressed file open
1141ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * if @filename is " " then the standard input is used
1142ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
1143ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns an I/O context or NULL in case of error
1144ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
1145ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void *
1146ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlGzfileOpen_real (const char *filename) {
1147ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    const char *path = NULL;
1148ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    gzFile fd;
1149ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1150ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (!strcmp(filename, "-")) {
1151ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        fd = gzdopen(dup(0), "rb");
1152ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return((void *) fd);
1153ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
1154ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1155ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (!xmlStrncasecmp(BAD_CAST filename, BAD_CAST "file://localhost/", 17))
1156ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#if defined (_WIN32) || defined (__DJGPP__) && !defined(__CYGWIN__)
1157ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	path = &filename[17];
1158ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#else
1159ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	path = &filename[16];
1160ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
1161ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    else if (!xmlStrncasecmp(BAD_CAST filename, BAD_CAST "file:///", 8)) {
1162ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#if defined (_WIN32) || defined (__DJGPP__) && !defined(__CYGWIN__)
1163ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	path = &filename[8];
1164ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#else
1165ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	path = &filename[7];
1166ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
1167df143a5041f03a22808b59c76698770b74692815Selim Gurun    } else
1168ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	path = filename;
1169ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1170ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (path == NULL)
1171ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(NULL);
1172ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (!xmlCheckFilename(path))
1173ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return(NULL);
1174ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1175df143a5041f03a22808b59c76698770b74692815Selim Gurun#if defined(_WIN32) || defined (__DJGPP__) && !defined (__CYGWIN__)
1176df143a5041f03a22808b59c76698770b74692815Selim Gurun    fd = xmlWrapGzOpen(path, "rb");
1177df143a5041f03a22808b59c76698770b74692815Selim Gurun#else
1178ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    fd = gzopen(path, "rb");
1179df143a5041f03a22808b59c76698770b74692815Selim Gurun#endif
1180ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return((void *) fd);
1181ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
1182ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1183ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
1184ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlGzfileOpen:
1185ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @filename:  the URI for matching
1186ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
1187ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Wrapper around xmlGzfileOpen if the open fais, it will
1188ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * try to unescape @filename
1189ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
1190ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void *
1191ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlGzfileOpen (const char *filename) {
1192ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    char *unescaped;
1193ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    void *retval;
1194ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1195ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    retval = xmlGzfileOpen_real(filename);
1196ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (retval == NULL) {
1197ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	unescaped = xmlURIUnescapeString(filename, 0, NULL);
1198ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (unescaped != NULL) {
1199ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    retval = xmlGzfileOpen_real(unescaped);
1200ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
1201ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlFree(unescaped);
1202ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
1203ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return retval;
1204ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
1205ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1206ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef LIBXML_OUTPUT_ENABLED
1207ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
1208ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlGzfileOpenW:
1209ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @filename:  the URI for matching
1210ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @compression:  the compression factor (0 - 9 included)
1211ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
1212ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * input from compressed file open
1213ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * if @filename is " " then the standard input is used
1214ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
1215ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns an I/O context or NULL in case of error
1216ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
1217ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void *
1218ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlGzfileOpenW (const char *filename, int compression) {
1219ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    const char *path = NULL;
1220ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    char mode[15];
1221ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    gzFile fd;
1222ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1223ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    snprintf(mode, sizeof(mode), "wb%d", compression);
1224ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (!strcmp(filename, "-")) {
1225ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        fd = gzdopen(dup(1), mode);
1226ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return((void *) fd);
1227ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
1228ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1229ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (!xmlStrncasecmp(BAD_CAST filename, BAD_CAST "file://localhost/", 17))
1230ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#if defined (_WIN32) || defined (__DJGPP__) && !defined(__CYGWIN__)
1231ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	path = &filename[17];
1232ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#else
1233ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	path = &filename[16];
1234ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
1235ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    else if (!xmlStrncasecmp(BAD_CAST filename, BAD_CAST "file:///", 8)) {
1236ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#if defined (_WIN32) || defined (__DJGPP__) && !defined(__CYGWIN__)
1237ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	path = &filename[8];
1238ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#else
1239ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	path = &filename[7];
1240ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
1241df143a5041f03a22808b59c76698770b74692815Selim Gurun    } else
1242ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	path = filename;
1243ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1244ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (path == NULL)
1245ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(NULL);
1246ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1247df143a5041f03a22808b59c76698770b74692815Selim Gurun#if defined(_WIN32) || defined (__DJGPP__) && !defined (__CYGWIN__)
1248df143a5041f03a22808b59c76698770b74692815Selim Gurun    fd = xmlWrapGzOpen(path, mode);
1249df143a5041f03a22808b59c76698770b74692815Selim Gurun#else
1250ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    fd = gzopen(path, mode);
1251df143a5041f03a22808b59c76698770b74692815Selim Gurun#endif
1252ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return((void *) fd);
1253ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
1254ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif /* LIBXML_OUTPUT_ENABLED */
1255ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1256ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
1257ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlGzfileRead:
1258ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @context:  the I/O context
1259ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @buffer:  where to drop data
1260ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @len:  number of bytes to write
1261ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
1262ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Read @len bytes to @buffer from the compressed I/O channel.
1263ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
1264ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the number of bytes written
1265ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
1266ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
1267ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlGzfileRead (void * context, char * buffer, int len) {
1268ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int ret;
1269ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1270ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret = gzread((gzFile) context, &buffer[0], len);
1271ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ret < 0) xmlIOErr(0, "gzread()");
1272ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(ret);
1273ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
1274ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1275ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef LIBXML_OUTPUT_ENABLED
1276ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
1277ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlGzfileWrite:
1278ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @context:  the I/O context
1279ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @buffer:  where to drop data
1280ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @len:  number of bytes to write
1281ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
1282ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Write @len bytes from @buffer to the compressed I/O channel.
1283ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
1284ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the number of bytes written
1285ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
1286ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
1287ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlGzfileWrite (void * context, const char * buffer, int len) {
1288ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int ret;
1289ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1290ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret = gzwrite((gzFile) context, (char *) &buffer[0], len);
1291ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ret < 0) xmlIOErr(0, "gzwrite()");
1292ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(ret);
1293ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
1294ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif /* LIBXML_OUTPUT_ENABLED */
1295ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1296ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
1297ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlGzfileClose:
1298ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @context:  the I/O context
1299ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
1300ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Close a compressed I/O channel
1301ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
1302ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
1303ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlGzfileClose (void * context) {
1304ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int ret;
1305ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1306ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret =  (gzclose((gzFile) context) == Z_OK ) ? 0 : -1;
1307ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ret < 0) xmlIOErr(0, "gzclose()");
1308ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(ret);
1309ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
1310ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif /* HAVE_ZLIB_H */
1311ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1312df143a5041f03a22808b59c76698770b74692815Selim Gurun#ifdef HAVE_LZMA_H
1313df143a5041f03a22808b59c76698770b74692815Selim Gurun/************************************************************************
1314df143a5041f03a22808b59c76698770b74692815Selim Gurun *									*
1315df143a5041f03a22808b59c76698770b74692815Selim Gurun *		I/O for compressed file accesses			*
1316df143a5041f03a22808b59c76698770b74692815Selim Gurun *									*
1317df143a5041f03a22808b59c76698770b74692815Selim Gurun ************************************************************************/
1318df143a5041f03a22808b59c76698770b74692815Selim Gurun#include "xzlib.h"
1319df143a5041f03a22808b59c76698770b74692815Selim Gurun/**
1320df143a5041f03a22808b59c76698770b74692815Selim Gurun * xmlXzfileMatch:
1321df143a5041f03a22808b59c76698770b74692815Selim Gurun * @filename:  the URI for matching
1322df143a5041f03a22808b59c76698770b74692815Selim Gurun *
1323df143a5041f03a22808b59c76698770b74692815Selim Gurun * input from compressed file test
1324df143a5041f03a22808b59c76698770b74692815Selim Gurun *
1325df143a5041f03a22808b59c76698770b74692815Selim Gurun * Returns 1 if matches, 0 otherwise
1326df143a5041f03a22808b59c76698770b74692815Selim Gurun */
1327df143a5041f03a22808b59c76698770b74692815Selim Gurunstatic int
1328df143a5041f03a22808b59c76698770b74692815Selim GurunxmlXzfileMatch (const char *filename ATTRIBUTE_UNUSED) {
1329df143a5041f03a22808b59c76698770b74692815Selim Gurun    return(1);
1330df143a5041f03a22808b59c76698770b74692815Selim Gurun}
1331df143a5041f03a22808b59c76698770b74692815Selim Gurun
1332df143a5041f03a22808b59c76698770b74692815Selim Gurun/**
1333df143a5041f03a22808b59c76698770b74692815Selim Gurun * xmlXzFileOpen_real:
1334df143a5041f03a22808b59c76698770b74692815Selim Gurun * @filename:  the URI for matching
1335df143a5041f03a22808b59c76698770b74692815Selim Gurun *
1336df143a5041f03a22808b59c76698770b74692815Selim Gurun * input from compressed file open
1337df143a5041f03a22808b59c76698770b74692815Selim Gurun * if @filename is " " then the standard input is used
1338df143a5041f03a22808b59c76698770b74692815Selim Gurun *
1339df143a5041f03a22808b59c76698770b74692815Selim Gurun * Returns an I/O context or NULL in case of error
1340df143a5041f03a22808b59c76698770b74692815Selim Gurun */
1341df143a5041f03a22808b59c76698770b74692815Selim Gurunstatic void *
1342df143a5041f03a22808b59c76698770b74692815Selim GurunxmlXzfileOpen_real (const char *filename) {
1343df143a5041f03a22808b59c76698770b74692815Selim Gurun    const char *path = NULL;
1344df143a5041f03a22808b59c76698770b74692815Selim Gurun    xzFile fd;
1345df143a5041f03a22808b59c76698770b74692815Selim Gurun
1346df143a5041f03a22808b59c76698770b74692815Selim Gurun    if (!strcmp(filename, "-")) {
1347df143a5041f03a22808b59c76698770b74692815Selim Gurun        fd = __libxml2_xzdopen(dup(0), "rb");
1348df143a5041f03a22808b59c76698770b74692815Selim Gurun	return((void *) fd);
1349df143a5041f03a22808b59c76698770b74692815Selim Gurun    }
1350df143a5041f03a22808b59c76698770b74692815Selim Gurun
1351df143a5041f03a22808b59c76698770b74692815Selim Gurun    if (!xmlStrncasecmp(BAD_CAST filename, BAD_CAST "file://localhost/", 17)) {
1352df143a5041f03a22808b59c76698770b74692815Selim Gurun	path = &filename[16];
1353df143a5041f03a22808b59c76698770b74692815Selim Gurun    } else if (!xmlStrncasecmp(BAD_CAST filename, BAD_CAST "file:///", 8)) {
1354df143a5041f03a22808b59c76698770b74692815Selim Gurun	path = &filename[7];
1355df143a5041f03a22808b59c76698770b74692815Selim Gurun    } else if (!xmlStrncasecmp(BAD_CAST filename, BAD_CAST "file:/", 6)) {
1356df143a5041f03a22808b59c76698770b74692815Selim Gurun        /* lots of generators seems to lazy to read RFC 1738 */
1357df143a5041f03a22808b59c76698770b74692815Selim Gurun	path = &filename[5];
1358df143a5041f03a22808b59c76698770b74692815Selim Gurun    } else
1359df143a5041f03a22808b59c76698770b74692815Selim Gurun	path = filename;
1360df143a5041f03a22808b59c76698770b74692815Selim Gurun
1361df143a5041f03a22808b59c76698770b74692815Selim Gurun    if (path == NULL)
1362df143a5041f03a22808b59c76698770b74692815Selim Gurun	return(NULL);
1363df143a5041f03a22808b59c76698770b74692815Selim Gurun    if (!xmlCheckFilename(path))
1364df143a5041f03a22808b59c76698770b74692815Selim Gurun        return(NULL);
1365df143a5041f03a22808b59c76698770b74692815Selim Gurun
1366df143a5041f03a22808b59c76698770b74692815Selim Gurun    fd = __libxml2_xzopen(path, "rb");
1367df143a5041f03a22808b59c76698770b74692815Selim Gurun    return((void *) fd);
1368df143a5041f03a22808b59c76698770b74692815Selim Gurun}
1369df143a5041f03a22808b59c76698770b74692815Selim Gurun
1370df143a5041f03a22808b59c76698770b74692815Selim Gurun/**
1371df143a5041f03a22808b59c76698770b74692815Selim Gurun * xmlXzfileOpen:
1372df143a5041f03a22808b59c76698770b74692815Selim Gurun * @filename:  the URI for matching
1373df143a5041f03a22808b59c76698770b74692815Selim Gurun *
1374df143a5041f03a22808b59c76698770b74692815Selim Gurun * Wrapper around xmlXzfileOpen_real that try it with an unescaped
1375df143a5041f03a22808b59c76698770b74692815Selim Gurun * version of @filename, if this fails fallback to @filename
1376df143a5041f03a22808b59c76698770b74692815Selim Gurun *
1377df143a5041f03a22808b59c76698770b74692815Selim Gurun * Returns a handler or NULL in case or failure
1378df143a5041f03a22808b59c76698770b74692815Selim Gurun */
1379df143a5041f03a22808b59c76698770b74692815Selim Gurunstatic void *
1380df143a5041f03a22808b59c76698770b74692815Selim GurunxmlXzfileOpen (const char *filename) {
1381df143a5041f03a22808b59c76698770b74692815Selim Gurun    char *unescaped;
1382df143a5041f03a22808b59c76698770b74692815Selim Gurun    void *retval;
1383df143a5041f03a22808b59c76698770b74692815Selim Gurun
1384df143a5041f03a22808b59c76698770b74692815Selim Gurun    retval = xmlXzfileOpen_real(filename);
1385df143a5041f03a22808b59c76698770b74692815Selim Gurun    if (retval == NULL) {
1386df143a5041f03a22808b59c76698770b74692815Selim Gurun	unescaped = xmlURIUnescapeString(filename, 0, NULL);
1387df143a5041f03a22808b59c76698770b74692815Selim Gurun	if (unescaped != NULL) {
1388df143a5041f03a22808b59c76698770b74692815Selim Gurun	    retval = xmlXzfileOpen_real(unescaped);
1389df143a5041f03a22808b59c76698770b74692815Selim Gurun	}
1390df143a5041f03a22808b59c76698770b74692815Selim Gurun	xmlFree(unescaped);
1391df143a5041f03a22808b59c76698770b74692815Selim Gurun    }
1392df143a5041f03a22808b59c76698770b74692815Selim Gurun
1393df143a5041f03a22808b59c76698770b74692815Selim Gurun    return retval;
1394df143a5041f03a22808b59c76698770b74692815Selim Gurun}
1395df143a5041f03a22808b59c76698770b74692815Selim Gurun
1396df143a5041f03a22808b59c76698770b74692815Selim Gurun/**
1397df143a5041f03a22808b59c76698770b74692815Selim Gurun * xmlXzfileRead:
1398df143a5041f03a22808b59c76698770b74692815Selim Gurun * @context:  the I/O context
1399df143a5041f03a22808b59c76698770b74692815Selim Gurun * @buffer:  where to drop data
1400df143a5041f03a22808b59c76698770b74692815Selim Gurun * @len:  number of bytes to write
1401df143a5041f03a22808b59c76698770b74692815Selim Gurun *
1402df143a5041f03a22808b59c76698770b74692815Selim Gurun * Read @len bytes to @buffer from the compressed I/O channel.
1403df143a5041f03a22808b59c76698770b74692815Selim Gurun *
1404df143a5041f03a22808b59c76698770b74692815Selim Gurun * Returns the number of bytes written
1405df143a5041f03a22808b59c76698770b74692815Selim Gurun */
1406df143a5041f03a22808b59c76698770b74692815Selim Gurunstatic int
1407df143a5041f03a22808b59c76698770b74692815Selim GurunxmlXzfileRead (void * context, char * buffer, int len) {
1408df143a5041f03a22808b59c76698770b74692815Selim Gurun    int ret;
1409df143a5041f03a22808b59c76698770b74692815Selim Gurun
1410df143a5041f03a22808b59c76698770b74692815Selim Gurun    ret = __libxml2_xzread((xzFile) context, &buffer[0], len);
1411df143a5041f03a22808b59c76698770b74692815Selim Gurun    if (ret < 0) xmlIOErr(0, "xzread()");
1412df143a5041f03a22808b59c76698770b74692815Selim Gurun    return(ret);
1413df143a5041f03a22808b59c76698770b74692815Selim Gurun}
1414df143a5041f03a22808b59c76698770b74692815Selim Gurun
1415df143a5041f03a22808b59c76698770b74692815Selim Gurun/**
1416df143a5041f03a22808b59c76698770b74692815Selim Gurun * xmlXzfileClose:
1417df143a5041f03a22808b59c76698770b74692815Selim Gurun * @context:  the I/O context
1418df143a5041f03a22808b59c76698770b74692815Selim Gurun *
1419df143a5041f03a22808b59c76698770b74692815Selim Gurun * Close a compressed I/O channel
1420df143a5041f03a22808b59c76698770b74692815Selim Gurun */
1421df143a5041f03a22808b59c76698770b74692815Selim Gurunstatic int
1422df143a5041f03a22808b59c76698770b74692815Selim GurunxmlXzfileClose (void * context) {
1423df143a5041f03a22808b59c76698770b74692815Selim Gurun    int ret;
1424df143a5041f03a22808b59c76698770b74692815Selim Gurun
1425df143a5041f03a22808b59c76698770b74692815Selim Gurun    ret =  (__libxml2_xzclose((xzFile) context) == LZMA_OK ) ? 0 : -1;
1426df143a5041f03a22808b59c76698770b74692815Selim Gurun    if (ret < 0) xmlIOErr(0, "xzclose()");
1427df143a5041f03a22808b59c76698770b74692815Selim Gurun    return(ret);
1428df143a5041f03a22808b59c76698770b74692815Selim Gurun}
1429df143a5041f03a22808b59c76698770b74692815Selim Gurun#endif /* HAVE_LZMA_H */
1430df143a5041f03a22808b59c76698770b74692815Selim Gurun
1431ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef LIBXML_HTTP_ENABLED
1432ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/************************************************************************
1433ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *									*
1434ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *			I/O for HTTP file accesses			*
1435ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *									*
1436ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ************************************************************************/
1437ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1438ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef LIBXML_OUTPUT_ENABLED
1439ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projecttypedef struct xmlIOHTTPWriteCtxt_
1440ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
1441ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int			compression;
1442ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1443ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    char *		uri;
1444ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1445ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    void *		doc_buff;
1446ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1447ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} xmlIOHTTPWriteCtxt, *xmlIOHTTPWriteCtxtPtr;
1448ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1449ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef HAVE_ZLIB_H
1450ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1451ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define DFLT_WBITS		( -15 )
1452ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define DFLT_MEM_LVL		( 8 )
1453ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define GZ_MAGIC1		( 0x1f )
1454ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define GZ_MAGIC2		( 0x8b )
1455ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define LXML_ZLIB_OS_CODE	( 0x03 )
1456ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define INIT_HTTP_BUFF_SIZE	( 32768 )
1457ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define DFLT_ZLIB_RATIO		( 5 )
1458ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1459ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/*
1460ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project**  Data structure and functions to work with sending compressed data
1461ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project**  via HTTP.
1462ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project*/
1463ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1464ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projecttypedef struct xmlZMemBuff_
1465ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
1466ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project   unsigned long	size;
1467ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project   unsigned long	crc;
1468ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1469ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project   unsigned char *	zbuff;
1470ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project   z_stream		zctrl;
1471ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1472ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} xmlZMemBuff, *xmlZMemBuffPtr;
1473ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1474ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
1475ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * append_reverse_ulong
1476ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @buff:  Compressed memory buffer
1477ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @data:  Unsigned long to append
1478ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
1479ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Append a unsigned long in reverse byte order to the end of the
1480ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * memory buffer.
1481ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
1482ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
1483ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectappend_reverse_ulong( xmlZMemBuff * buff, unsigned long data ) {
1484ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1485ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int		idx;
1486ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1487ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ( buff == NULL )
1488ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return;
1489ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1490ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
1491ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    **  This is plagiarized from putLong in gzio.c (zlib source) where
1492df143a5041f03a22808b59c76698770b74692815Selim Gurun    **  the number "4" is hardcoded.  If zlib is ever patched to
1493ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    **  support 64 bit file sizes, this code would need to be patched
1494ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    **  as well.
1495ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
1496ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1497ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    for ( idx = 0; idx < 4; idx++ ) {
1498ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*buff->zctrl.next_out = ( data & 0xff );
1499ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	data >>= 8;
1500ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	buff->zctrl.next_out++;
1501ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
1502ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1503ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return;
1504ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
1505ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1506ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
1507ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
1508ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlFreeZMemBuff
1509ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @buff:  The memory buffer context to clear
1510ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
1511ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Release all the resources associated with the compressed memory buffer.
1512ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
1513ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
1514ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlFreeZMemBuff( xmlZMemBuffPtr buff ) {
1515ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1516ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_HTTP
1517ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int z_err;
1518ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
1519ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1520ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ( buff == NULL )
1521ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return;
1522ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1523ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlFree( buff->zbuff );
1524ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_HTTP
1525ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    z_err = deflateEnd( &buff->zctrl );
1526ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ( z_err != Z_OK )
1527ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlGenericError( xmlGenericErrorContext,
1528ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			"xmlFreeZMemBuff:  Error releasing zlib context:  %d\n",
1529ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			z_err );
1530ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#else
1531ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    deflateEnd( &buff->zctrl );
1532ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
1533ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1534ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlFree( buff );
1535ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return;
1536ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
1537ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1538ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
1539ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlCreateZMemBuff
1540ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *@compression:	Compression value to use
1541ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
1542ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Create a memory buffer to hold the compressed XML document.  The
1543ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * compressed document in memory will end up being identical to what
1544df143a5041f03a22808b59c76698770b74692815Selim Gurun * would be created if gzopen/gzwrite/gzclose were being used to
1545ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * write the document to disk.  The code for the header/trailer data to
1546ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * the compression is plagiarized from the zlib source files.
1547ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
1548ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void *
1549ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlCreateZMemBuff( int compression ) {
1550ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1551ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int			z_err;
1552ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int			hdr_lgth;
1553ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlZMemBuffPtr	buff = NULL;
1554ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1555ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ( ( compression < 1 ) || ( compression > 9 ) )
1556ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return ( NULL );
1557ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1558ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*  Create the control and data areas  */
1559ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1560ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    buff = xmlMalloc( sizeof( xmlZMemBuff ) );
1561ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ( buff == NULL ) {
1562ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlIOErrMemory("creating buffer context");
1563ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return ( NULL );
1564ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
1565ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1566ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    (void)memset( buff, 0, sizeof( xmlZMemBuff ) );
1567ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    buff->size = INIT_HTTP_BUFF_SIZE;
1568ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    buff->zbuff = xmlMalloc( buff->size );
1569ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ( buff->zbuff == NULL ) {
1570ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlFreeZMemBuff( buff );
1571ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlIOErrMemory("creating buffer");
1572ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return ( NULL );
1573ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
1574ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1575ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    z_err = deflateInit2( &buff->zctrl, compression, Z_DEFLATED,
1576ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    DFLT_WBITS, DFLT_MEM_LVL, Z_DEFAULT_STRATEGY );
1577ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ( z_err != Z_OK ) {
1578ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlChar msg[500];
1579ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlFreeZMemBuff( buff );
1580ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	buff = NULL;
1581ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlStrPrintf(msg, 500,
1582ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    (const xmlChar *) "xmlCreateZMemBuff:  %s %d\n",
1583ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    "Error initializing compression context.  ZLIB error:",
1584ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    z_err );
1585ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlIOErr(XML_IO_WRITE, (const char *) msg);
1586ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return ( NULL );
1587ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
1588ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1589ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*  Set the header data.  The CRC will be needed for the trailer  */
1590ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    buff->crc = crc32( 0L, NULL, 0 );
1591ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    hdr_lgth = snprintf( (char *)buff->zbuff, buff->size,
1592ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			"%c%c%c%c%c%c%c%c%c%c",
1593df143a5041f03a22808b59c76698770b74692815Selim Gurun			GZ_MAGIC1, GZ_MAGIC2, Z_DEFLATED,
1594ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			0, 0, 0, 0, 0, 0, LXML_ZLIB_OS_CODE );
1595ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    buff->zctrl.next_out  = buff->zbuff + hdr_lgth;
1596ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    buff->zctrl.avail_out = buff->size - hdr_lgth;
1597ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1598ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return ( buff );
1599ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
1600ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1601ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
1602ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlZMemBuffExtend
1603ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @buff:  Buffer used to compress and consolidate data.
1604ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ext_amt:   Number of bytes to extend the buffer.
1605ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
1606ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Extend the internal buffer used to store the compressed data by the
1607ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * specified amount.
1608ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
1609ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 0 on success or -1 on failure to extend the buffer.  On failure
1610ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * the original buffer still exists at the original size.
1611ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
1612ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
1613ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlZMemBuffExtend( xmlZMemBuffPtr buff, size_t ext_amt ) {
1614ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1615ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int			rc = -1;
1616ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    size_t		new_size;
1617ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    size_t		cur_used;
1618ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1619ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    unsigned char *	tmp_ptr = NULL;
1620ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1621ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ( buff == NULL )
1622ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return ( -1 );
1623ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1624ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    else if ( ext_amt == 0 )
1625ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return ( 0 );
1626ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1627ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    cur_used = buff->zctrl.next_out - buff->zbuff;
1628ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    new_size = buff->size + ext_amt;
1629ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1630ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_HTTP
1631df143a5041f03a22808b59c76698770b74692815Selim Gurun    if ( cur_used > new_size )
1632ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlGenericError( xmlGenericErrorContext,
1633ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			"xmlZMemBuffExtend:  %s\n%s %d bytes.\n",
1634ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			"Buffer overwrite detected during compressed memory",
1635df143a5041f03a22808b59c76698770b74692815Selim Gurun			"buffer extension.  Overflowed by",
1636ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			(cur_used - new_size ) );
1637ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
1638ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1639ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    tmp_ptr = xmlRealloc( buff->zbuff, new_size );
1640ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ( tmp_ptr != NULL ) {
1641ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	rc = 0;
1642ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	buff->size  = new_size;
1643ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	buff->zbuff = tmp_ptr;
1644ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	buff->zctrl.next_out  = tmp_ptr + cur_used;
1645ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	buff->zctrl.avail_out = new_size - cur_used;
1646ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
1647ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    else {
1648ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlChar msg[500];
1649ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlStrPrintf(msg, 500,
1650ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    (const xmlChar *) "xmlZMemBuffExtend:  %s %lu bytes.\n",
1651ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    "Allocation failure extending output buffer to",
1652ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    new_size );
1653ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlIOErr(XML_IO_WRITE, (const char *) msg);
1654ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
1655ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1656ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return ( rc );
1657ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
1658ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1659ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
1660ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlZMemBuffAppend
1661ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @buff:  Buffer used to compress and consolidate data
1662ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @src:   Uncompressed source content to append to buffer
1663ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @len:   Length of source data to append to buffer
1664ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
1665ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Compress and append data to the internal buffer.  The data buffer
1666ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * will be expanded if needed to store the additional data.
1667ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
1668ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the number of bytes appended to the buffer or -1 on error.
1669ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
1670ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
1671ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlZMemBuffAppend( xmlZMemBuffPtr buff, const char * src, int len ) {
1672ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1673ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int		z_err;
1674ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    size_t	min_accept;
1675ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1676ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ( ( buff == NULL ) || ( src == NULL ) )
1677ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return ( -1 );
1678ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1679ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    buff->zctrl.avail_in = len;
1680ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    buff->zctrl.next_in  = (unsigned char *)src;
1681ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    while ( buff->zctrl.avail_in > 0 ) {
1682ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
1683ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	**  Extend the buffer prior to deflate call if a reasonable amount
1684ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	**  of output buffer space is not available.
1685ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
1686ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	min_accept = buff->zctrl.avail_in / DFLT_ZLIB_RATIO;
1687ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if ( buff->zctrl.avail_out <= min_accept ) {
1688ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if ( xmlZMemBuffExtend( buff, buff->size ) == -1 )
1689ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		return ( -1 );
1690ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
1691ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1692ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	z_err = deflate( &buff->zctrl, Z_NO_FLUSH );
1693ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if ( z_err != Z_OK ) {
1694ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlChar msg[500];
1695ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlStrPrintf(msg, 500,
1696ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			(const xmlChar *) "xmlZMemBuffAppend:  %s %d %s - %d",
1697ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			"Compression error while appending",
1698ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			len, "bytes to buffer.  ZLIB error", z_err );
1699ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlIOErr(XML_IO_WRITE, (const char *) msg);
1700ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return ( -1 );
1701ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
1702ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
1703ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1704ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    buff->crc = crc32( buff->crc, (unsigned char *)src, len );
1705ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1706ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return ( len );
1707ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
1708ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1709ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
1710ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlZMemBuffGetContent
1711ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @buff:  Compressed memory content buffer
1712ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @data_ref:  Pointer reference to point to compressed content
1713ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
1714ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Flushes the compression buffers, appends gzip file trailers and
1715ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * returns the compressed content and length of the compressed data.
1716ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * NOTE:  The gzip trailer code here is plagiarized from zlib source.
1717ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
1718ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the length of the compressed data or -1 on error.
1719ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
1720ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
1721ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlZMemBuffGetContent( xmlZMemBuffPtr buff, char ** data_ref ) {
1722ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1723ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int		zlgth = -1;
1724ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int		z_err;
1725ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1726ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ( ( buff == NULL ) || ( data_ref == NULL ) )
1727ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return ( -1 );
1728ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1729ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*  Need to loop until compression output buffers are flushed  */
1730ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1731ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    do
1732ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    {
1733ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	z_err = deflate( &buff->zctrl, Z_FINISH );
1734ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if ( z_err == Z_OK ) {
1735ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*  In this case Z_OK means more buffer space needed  */
1736ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1737ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if ( xmlZMemBuffExtend( buff, buff->size ) == -1 )
1738ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		return ( -1 );
1739ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
1740ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
1741ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    while ( z_err == Z_OK );
1742ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1743ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*  If the compression state is not Z_STREAM_END, some error occurred  */
1744ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1745ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ( z_err == Z_STREAM_END ) {
1746ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1747ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*  Need to append the gzip data trailer  */
1748ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1749ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if ( buff->zctrl.avail_out < ( 2 * sizeof( unsigned long ) ) ) {
1750ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if ( xmlZMemBuffExtend(buff, (2 * sizeof(unsigned long))) == -1 )
1751ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		return ( -1 );
1752ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
1753ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1754ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
1755ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	**  For whatever reason, the CRC and length data are pushed out
1756ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	**  in reverse byte order.  So a memcpy can't be used here.
1757ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
1758ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1759ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	append_reverse_ulong( buff, buff->crc );
1760ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	append_reverse_ulong( buff, buff->zctrl.total_in );
1761ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1762ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	zlgth = buff->zctrl.next_out - buff->zbuff;
1763ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*data_ref = (char *)buff->zbuff;
1764ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
1765ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1766ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    else {
1767ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlChar msg[500];
1768ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlStrPrintf(msg, 500,
1769ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    (const xmlChar *) "xmlZMemBuffGetContent:  %s - %d\n",
1770ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    "Error flushing zlib buffers.  Error code", z_err );
1771ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlIOErr(XML_IO_WRITE, (const char *) msg);
1772ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
1773df143a5041f03a22808b59c76698770b74692815Selim Gurun
1774ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return ( zlgth );
1775ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
1776ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif /* LIBXML_OUTPUT_ENABLED */
1777ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif  /*  HAVE_ZLIB_H  */
1778ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1779ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef LIBXML_OUTPUT_ENABLED
1780ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
1781ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlFreeHTTPWriteCtxt
1782ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  Context to cleanup
1783ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
1784ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Free allocated memory and reclaim system resources.
1785ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
1786ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * No return value.
1787ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
1788ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
1789ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlFreeHTTPWriteCtxt( xmlIOHTTPWriteCtxtPtr ctxt )
1790ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
1791ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ( ctxt->uri != NULL )
1792ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlFree( ctxt->uri );
1793ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1794ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ( ctxt->doc_buff != NULL ) {
1795ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1796ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef HAVE_ZLIB_H
1797ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if ( ctxt->compression > 0 ) {
1798ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlFreeZMemBuff( ctxt->doc_buff );
1799ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
1800ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	else
1801ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
1802ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	{
1803ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlOutputBufferClose( ctxt->doc_buff );
1804ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
1805ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
1806ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1807ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlFree( ctxt );
1808ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return;
1809ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
1810ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif /* LIBXML_OUTPUT_ENABLED */
1811ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1812ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1813ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
1814ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlIOHTTPMatch:
1815ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @filename:  the URI for matching
1816ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
1817ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * check if the URI matches an HTTP one
1818ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
1819ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 1 if matches, 0 otherwise
1820ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
1821ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectint
1822ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlIOHTTPMatch (const char *filename) {
1823ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (!xmlStrncasecmp(BAD_CAST filename, BAD_CAST "http://", 7))
1824ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(1);
1825ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(0);
1826ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
1827ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1828ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
1829ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlIOHTTPOpen:
1830ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @filename:  the URI for matching
1831ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
1832ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * open an HTTP I/O channel
1833ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
1834ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns an I/O context or NULL in case of error
1835ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
1836ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid *
1837ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlIOHTTPOpen (const char *filename) {
1838ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(xmlNanoHTTPOpen(filename, NULL));
1839ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
1840ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1841ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef LIBXML_OUTPUT_ENABLED
1842ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
1843ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlIOHTTPOpenW:
1844ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @post_uri:  The destination URI for the document
1845ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @compression:  The compression desired for the document.
1846ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
1847ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Open a temporary buffer to collect the document for a subsequent HTTP POST
1848ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * request.  Non-static as is called from the output buffer creation routine.
1849ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
1850ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns an I/O context or NULL in case of error.
1851ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
1852ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1853ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid *
1854ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlIOHTTPOpenW(const char *post_uri, int compression)
1855ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
1856ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1857ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlIOHTTPWriteCtxtPtr ctxt = NULL;
1858ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1859ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (post_uri == NULL)
1860ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (NULL);
1861ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1862ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ctxt = xmlMalloc(sizeof(xmlIOHTTPWriteCtxt));
1863ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt == NULL) {
1864ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlIOErrMemory("creating HTTP output context");
1865ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (NULL);
1866ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
1867ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1868ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    (void) memset(ctxt, 0, sizeof(xmlIOHTTPWriteCtxt));
1869ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1870ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ctxt->uri = (char *) xmlStrdup((const xmlChar *)post_uri);
1871ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt->uri == NULL) {
1872ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlIOErrMemory("copying URI");
1873ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlFreeHTTPWriteCtxt(ctxt);
1874ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (NULL);
1875ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
1876ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1877ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
1878ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     * **  Since the document length is required for an HTTP post,
1879ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     * **  need to put the document into a buffer.  A memory buffer
1880ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     * **  is being used to avoid pushing the data to disk and back.
1881ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     */
1882ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1883ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef HAVE_ZLIB_H
1884ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((compression > 0) && (compression <= 9)) {
1885ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1886ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ctxt->compression = compression;
1887ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ctxt->doc_buff = xmlCreateZMemBuff(compression);
1888ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else
1889ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
1890ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    {
1891ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        /*  Any character conversions should have been done before this  */
1892ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
189360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott        ctxt->doc_buff = xmlAllocOutputBufferInternal(NULL);
1894ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
1895ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1896ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt->doc_buff == NULL) {
1897ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlFreeHTTPWriteCtxt(ctxt);
1898ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ctxt = NULL;
1899ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
1900ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1901ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (ctxt);
1902ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
1903ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif /* LIBXML_OUTPUT_ENABLED */
190460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
1905ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef LIBXML_OUTPUT_ENABLED
1906ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
1907ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlIOHTTPDfltOpenW
1908ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @post_uri:  The destination URI for this document.
1909ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
1910ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Calls xmlIOHTTPOpenW with no compression to set up for a subsequent
1911ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * HTTP post command.  This function should generally not be used as
1912ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * the open callback is short circuited in xmlOutputBufferCreateFile.
1913ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
1914ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns a pointer to the new IO context.
1915ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
1916ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void *
1917ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlIOHTTPDfltOpenW( const char * post_uri ) {
1918ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return ( xmlIOHTTPOpenW( post_uri, 0 ) );
1919ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
1920ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif /* LIBXML_OUTPUT_ENABLED */
1921ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1922ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
1923ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlIOHTTPRead:
1924ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @context:  the I/O context
1925ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @buffer:  where to drop data
1926ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @len:  number of bytes to write
1927ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
1928ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Read @len bytes to @buffer from the I/O channel.
1929ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
1930ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the number of bytes written
1931ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
1932df143a5041f03a22808b59c76698770b74692815Selim Gurunint
1933ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlIOHTTPRead(void * context, char * buffer, int len) {
1934ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((buffer == NULL) || (len < 0)) return(-1);
1935ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(xmlNanoHTTPRead(context, &buffer[0], len));
1936ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
1937ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1938ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef LIBXML_OUTPUT_ENABLED
1939ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
1940ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlIOHTTPWrite
1941ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @context:  previously opened writing context
1942ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @buffer:   data to output to temporary buffer
1943ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @len:      bytes to output
1944ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
1945ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Collect data from memory buffer into a temporary file for later
1946ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * processing.
1947ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
1948ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns number of bytes written.
1949ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
1950ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1951ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
1952df143a5041f03a22808b59c76698770b74692815Selim GurunxmlIOHTTPWrite( void * context, const char * buffer, int len ) {
1953ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1954ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlIOHTTPWriteCtxtPtr	ctxt = context;
1955ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1956ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ( ( ctxt == NULL ) || ( ctxt->doc_buff == NULL ) || ( buffer == NULL ) )
1957ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return ( -1 );
1958ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1959ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ( len > 0 ) {
1960ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1961ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*  Use gzwrite or fwrite as previously setup in the open call  */
1962ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1963ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef HAVE_ZLIB_H
1964df143a5041f03a22808b59c76698770b74692815Selim Gurun	if ( ctxt->compression > 0 )
1965ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    len = xmlZMemBuffAppend( ctxt->doc_buff, buffer, len );
1966ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1967ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	else
1968ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
1969ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    len = xmlOutputBufferWrite( ctxt->doc_buff, len, buffer );
1970ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1971ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if ( len < 0 ) {
1972ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlChar msg[500];
1973ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlStrPrintf(msg, 500,
1974ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			(const xmlChar *) "xmlIOHTTPWrite:  %s\n%s '%s'.\n",
1975ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			"Error appending to internal buffer.",
1976ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			"Error sending document to URI",
1977ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			ctxt->uri );
1978ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlIOErr(XML_IO_WRITE, (const char *) msg);
1979ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
1980ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
1981ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1982ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return ( len );
1983ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
1984ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif /* LIBXML_OUTPUT_ENABLED */
1985ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1986ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1987ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
1988ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlIOHTTPClose:
1989ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @context:  the I/O context
1990ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
1991ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Close an HTTP I/O channel
1992ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
1993ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 0
1994ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
1995ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectint
1996ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlIOHTTPClose (void * context) {
1997ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlNanoHTTPClose(context);
1998ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return 0;
1999ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
2000ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2001ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef LIBXML_OUTPUT_ENABLED
2002ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
2003ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlIOHTTCloseWrite
2004ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @context:  The I/O context
2005ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @http_mthd: The HTTP method to be used when sending the data
2006ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
2007ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Close the transmit HTTP I/O channel and actually send the data.
2008ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
2009ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
2010ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlIOHTTPCloseWrite( void * context, const char * http_mthd ) {
2011ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2012ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int				close_rc = -1;
2013ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int				http_rtn = 0;
2014ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int				content_lgth = 0;
2015ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlIOHTTPWriteCtxtPtr	ctxt = context;
2016ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2017ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    char *			http_content = NULL;
2018ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    char *			content_encoding = NULL;
2019ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    char *			content_type = (char *) "text/xml";
2020ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    void *			http_ctxt = NULL;
2021ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2022ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ( ( ctxt == NULL ) || ( http_mthd == NULL ) )
2023ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return ( -1 );
2024ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2025ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*  Retrieve the content from the appropriate buffer  */
2026ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2027ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef HAVE_ZLIB_H
2028ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2029ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ( ctxt->compression > 0 ) {
2030ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	content_lgth = xmlZMemBuffGetContent( ctxt->doc_buff, &http_content );
2031ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	content_encoding = (char *) "Content-Encoding: gzip";
2032ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
2033ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    else
2034ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
2035ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    {
2036ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*  Pull the data out of the memory output buffer  */
2037ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2038ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlOutputBufferPtr	dctxt = ctxt->doc_buff;
2039ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	http_content = (char *)dctxt->buffer->content;
2040ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	content_lgth = dctxt->buffer->use;
2041ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
2042ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2043ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ( http_content == NULL ) {
2044ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlChar msg[500];
2045ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlStrPrintf(msg, 500,
2046ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		     (const xmlChar *) "xmlIOHTTPCloseWrite:  %s '%s' %s '%s'.\n",
2047ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		     "Error retrieving content.\nUnable to",
2048ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		     http_mthd, "data to URI", ctxt->uri );
2049ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlIOErr(XML_IO_WRITE, (const char *) msg);
2050ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
2051ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2052ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    else {
2053ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2054ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	http_ctxt = xmlNanoHTTPMethod( ctxt->uri, http_mthd, http_content,
2055df143a5041f03a22808b59c76698770b74692815Selim Gurun					&content_type, content_encoding,
2056ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project					content_lgth );
2057ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2058ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if ( http_ctxt != NULL ) {
2059ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_HTTP
2060ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*  If testing/debugging - dump reply with request content  */
2061ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2062ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    FILE *	tst_file = NULL;
2063ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    char	buffer[ 4096 ];
2064ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    char *	dump_name = NULL;
2065ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    int		avail;
2066ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2067ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlGenericError( xmlGenericErrorContext,
2068ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			"xmlNanoHTTPCloseWrite:  HTTP %s to\n%s returned %d.\n",
2069ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			http_mthd, ctxt->uri,
2070ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			xmlNanoHTTPReturnCode( http_ctxt ) );
2071ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2072ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
2073ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    **  Since either content or reply may be gzipped,
2074df143a5041f03a22808b59c76698770b74692815Selim Gurun	    **  dump them to separate files instead of the
2075ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    **  standard error context.
2076ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
2077ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2078ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    dump_name = tempnam( NULL, "lxml" );
2079ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if ( dump_name != NULL ) {
2080ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		(void)snprintf( buffer, sizeof(buffer), "%s.content", dump_name );
2081ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2082ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		tst_file = fopen( buffer, "wb" );
2083ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if ( tst_file != NULL ) {
2084ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlGenericError( xmlGenericErrorContext,
2085ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			"Transmitted content saved in file:  %s\n", buffer );
2086ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2087ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    fwrite( http_content, sizeof( char ),
2088ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project					content_lgth, tst_file );
2089ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    fclose( tst_file );
2090ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
2091ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2092ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		(void)snprintf( buffer, sizeof(buffer), "%s.reply", dump_name );
2093ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		tst_file = fopen( buffer, "wb" );
2094ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if ( tst_file != NULL ) {
2095ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlGenericError( xmlGenericErrorContext,
2096ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			"Reply content saved in file:  %s\n", buffer );
2097ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2098ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2099ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    while ( (avail = xmlNanoHTTPRead( http_ctxt,
2100ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project					buffer, sizeof( buffer ) )) > 0 ) {
2101ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2102ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			fwrite( buffer, sizeof( char ), avail, tst_file );
2103ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    }
2104ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2105ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    fclose( tst_file );
2106ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
2107ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2108ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		free( dump_name );
2109ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
2110ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif  /*  DEBUG_HTTP  */
2111ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2112ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    http_rtn = xmlNanoHTTPReturnCode( http_ctxt );
2113ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if ( ( http_rtn >= 200 ) && ( http_rtn < 300 ) )
2114ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		close_rc = 0;
2115ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    else {
2116ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                xmlChar msg[500];
2117ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                xmlStrPrintf(msg, 500,
2118ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    (const xmlChar *) "xmlIOHTTPCloseWrite: HTTP '%s' of %d %s\n'%s' %s %d\n",
2119ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    http_mthd, content_lgth,
2120ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    "bytes to URI", ctxt->uri,
2121ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    "failed.  HTTP return code:", http_rtn );
2122ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlIOErr(XML_IO_WRITE, (const char *) msg);
2123ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
2124ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2125ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlNanoHTTPClose( http_ctxt );
2126ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlFree( content_type );
2127ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
2128ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
2129ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2130ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*  Final cleanups  */
2131ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2132ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlFreeHTTPWriteCtxt( ctxt );
2133ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2134ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return ( close_rc );
2135ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
2136ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2137ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
2138ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlIOHTTPClosePut
2139ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
2140ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @context:  The I/O context
2141ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
2142ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Close the transmit HTTP I/O channel and actually send data using a PUT
2143ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * HTTP method.
2144ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
2145ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
2146ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlIOHTTPClosePut( void * ctxt ) {
2147ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return ( xmlIOHTTPCloseWrite( ctxt, "PUT" ) );
2148ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
2149ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2150ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2151ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
2152ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlIOHTTPClosePost
2153ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
2154ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @context:  The I/O context
2155ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
2156ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Close the transmit HTTP I/O channel and actually send data using a POST
2157ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * HTTP method.
2158ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
2159ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
2160ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlIOHTTPClosePost( void * ctxt ) {
2161ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return ( xmlIOHTTPCloseWrite( ctxt, "POST" ) );
2162ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
2163ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif /* LIBXML_OUTPUT_ENABLED */
2164ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2165ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif /* LIBXML_HTTP_ENABLED */
2166ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2167ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef LIBXML_FTP_ENABLED
2168ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/************************************************************************
2169ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *									*
2170ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *			I/O for FTP file accesses			*
2171ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *									*
2172ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ************************************************************************/
2173ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
2174ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlIOFTPMatch:
2175ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @filename:  the URI for matching
2176ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
2177ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * check if the URI matches an FTP one
2178ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
2179ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 1 if matches, 0 otherwise
2180ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
2181ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectint
2182ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlIOFTPMatch (const char *filename) {
2183ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (!xmlStrncasecmp(BAD_CAST filename, BAD_CAST "ftp://", 6))
2184ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(1);
2185ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(0);
2186ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
2187ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2188ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
2189ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlIOFTPOpen:
2190ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @filename:  the URI for matching
2191ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
2192ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * open an FTP I/O channel
2193ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
2194ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns an I/O context or NULL in case of error
2195ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
2196ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid *
2197ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlIOFTPOpen (const char *filename) {
2198ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(xmlNanoFTPOpen(filename));
2199ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
2200ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2201ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
2202ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlIOFTPRead:
2203ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @context:  the I/O context
2204ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @buffer:  where to drop data
2205ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @len:  number of bytes to write
2206ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
2207ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Read @len bytes to @buffer from the I/O channel.
2208ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
2209ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the number of bytes written
2210ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
2211df143a5041f03a22808b59c76698770b74692815Selim Gurunint
2212ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlIOFTPRead(void * context, char * buffer, int len) {
2213ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((buffer == NULL) || (len < 0)) return(-1);
2214ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(xmlNanoFTPRead(context, &buffer[0], len));
2215ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
2216ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2217ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
2218ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlIOFTPClose:
2219ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @context:  the I/O context
2220ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
2221ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Close an FTP I/O channel
2222ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
2223ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 0
2224ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
2225ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectint
2226ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlIOFTPClose (void * context) {
2227ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return ( xmlNanoFTPClose(context) );
2228ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
2229ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif /* LIBXML_FTP_ENABLED */
2230ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2231ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2232ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
2233ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRegisterInputCallbacks:
2234ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @matchFunc:  the xmlInputMatchCallback
2235ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @openFunc:  the xmlInputOpenCallback
2236ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @readFunc:  the xmlInputReadCallback
2237ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @closeFunc:  the xmlInputCloseCallback
2238ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
2239ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Register a new set of I/O callback for handling parser input.
2240ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
2241ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the registered handler number or -1 in case of error
2242ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
2243ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectint
2244ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRegisterInputCallbacks(xmlInputMatchCallback matchFunc,
2245ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlInputOpenCallback openFunc, xmlInputReadCallback readFunc,
2246ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlInputCloseCallback closeFunc) {
2247ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (xmlInputCallbackNr >= MAX_INPUT_CALLBACK) {
2248ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(-1);
2249ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
2250ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlInputCallbackTable[xmlInputCallbackNr].matchcallback = matchFunc;
2251ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlInputCallbackTable[xmlInputCallbackNr].opencallback = openFunc;
2252ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlInputCallbackTable[xmlInputCallbackNr].readcallback = readFunc;
2253ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlInputCallbackTable[xmlInputCallbackNr].closecallback = closeFunc;
2254ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlInputCallbackInitialized = 1;
2255ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(xmlInputCallbackNr++);
2256ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
2257ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2258ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef LIBXML_OUTPUT_ENABLED
2259ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
2260ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRegisterOutputCallbacks:
2261ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @matchFunc:  the xmlOutputMatchCallback
2262ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @openFunc:  the xmlOutputOpenCallback
2263ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @writeFunc:  the xmlOutputWriteCallback
2264ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @closeFunc:  the xmlOutputCloseCallback
2265ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
2266ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Register a new set of I/O callback for handling output.
2267ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
2268ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the registered handler number or -1 in case of error
2269ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
2270ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectint
2271ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRegisterOutputCallbacks(xmlOutputMatchCallback matchFunc,
2272ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlOutputOpenCallback openFunc, xmlOutputWriteCallback writeFunc,
2273ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlOutputCloseCallback closeFunc) {
2274df143a5041f03a22808b59c76698770b74692815Selim Gurun    if (xmlOutputCallbackNr >= MAX_OUTPUT_CALLBACK) {
2275ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(-1);
2276ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
2277ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlOutputCallbackTable[xmlOutputCallbackNr].matchcallback = matchFunc;
2278ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlOutputCallbackTable[xmlOutputCallbackNr].opencallback = openFunc;
2279ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlOutputCallbackTable[xmlOutputCallbackNr].writecallback = writeFunc;
2280ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlOutputCallbackTable[xmlOutputCallbackNr].closecallback = closeFunc;
2281ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlOutputCallbackInitialized = 1;
2282ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(xmlOutputCallbackNr++);
2283ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
2284ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif /* LIBXML_OUTPUT_ENABLED */
2285ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2286ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
2287ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRegisterDefaultInputCallbacks:
2288ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
2289ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Registers the default compiled-in I/O handlers.
2290ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
2291ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid
2292ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRegisterDefaultInputCallbacks(void) {
2293ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (xmlInputCallbackInitialized)
2294ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return;
2295ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2296ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#if defined(_WIN32) || defined (__DJGPP__) && !defined (__CYGWIN__)
2297ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlInitPlatformSpecificIo();
2298ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
2299ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2300ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRegisterInputCallbacks(xmlFileMatch, xmlFileOpen,
2301ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	                      xmlFileRead, xmlFileClose);
2302ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef HAVE_ZLIB_H
2303ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRegisterInputCallbacks(xmlGzfileMatch, xmlGzfileOpen,
2304ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	                      xmlGzfileRead, xmlGzfileClose);
2305ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif /* HAVE_ZLIB_H */
2306df143a5041f03a22808b59c76698770b74692815Selim Gurun#ifdef HAVE_LZMA_H
2307df143a5041f03a22808b59c76698770b74692815Selim Gurun    xmlRegisterInputCallbacks(xmlXzfileMatch, xmlXzfileOpen,
2308df143a5041f03a22808b59c76698770b74692815Selim Gurun	                      xmlXzfileRead, xmlXzfileClose);
2309df143a5041f03a22808b59c76698770b74692815Selim Gurun#endif /* HAVE_ZLIB_H */
2310ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2311ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef LIBXML_HTTP_ENABLED
2312ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRegisterInputCallbacks(xmlIOHTTPMatch, xmlIOHTTPOpen,
2313ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	                      xmlIOHTTPRead, xmlIOHTTPClose);
2314ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif /* LIBXML_HTTP_ENABLED */
2315ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2316ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef LIBXML_FTP_ENABLED
2317ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRegisterInputCallbacks(xmlIOFTPMatch, xmlIOFTPOpen,
2318ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	                      xmlIOFTPRead, xmlIOFTPClose);
2319ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif /* LIBXML_FTP_ENABLED */
2320ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlInputCallbackInitialized = 1;
2321ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
2322ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2323ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef LIBXML_OUTPUT_ENABLED
2324ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
2325ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRegisterDefaultOutputCallbacks:
2326ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
2327ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Registers the default compiled-in I/O handlers.
2328ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
2329ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid
2330ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRegisterDefaultOutputCallbacks (void) {
2331ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (xmlOutputCallbackInitialized)
2332ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return;
2333ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2334ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#if defined(_WIN32) || defined (__DJGPP__) && !defined (__CYGWIN__)
2335ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlInitPlatformSpecificIo();
2336ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
2337ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2338ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRegisterOutputCallbacks(xmlFileMatch, xmlFileOpenW,
2339ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	                      xmlFileWrite, xmlFileClose);
2340ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2341ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef LIBXML_HTTP_ENABLED
2342ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRegisterOutputCallbacks(xmlIOHTTPMatch, xmlIOHTTPDfltOpenW,
2343ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	                       xmlIOHTTPWrite, xmlIOHTTPClosePut);
2344ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
2345ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2346ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/*********************************
2347ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project No way a-priori to distinguish between gzipped files from
2348ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project uncompressed ones except opening if existing then closing
2349ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project and saving with same compression ratio ... a pain.
2350ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2351ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef HAVE_ZLIB_H
2352ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRegisterOutputCallbacks(xmlGzfileMatch, xmlGzfileOpen,
2353ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	                       xmlGzfileWrite, xmlGzfileClose);
2354ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
2355ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2356ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project Nor FTP PUT ....
2357ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef LIBXML_FTP_ENABLED
2358ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRegisterOutputCallbacks(xmlIOFTPMatch, xmlIOFTPOpen,
2359ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	                       xmlIOFTPWrite, xmlIOFTPClose);
2360ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
2361ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project **********************************/
2362ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlOutputCallbackInitialized = 1;
2363ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
2364ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2365ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef LIBXML_HTTP_ENABLED
2366ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
2367ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRegisterHTTPPostCallbacks:
2368ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
2369ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * By default, libxml submits HTTP output requests using the "PUT" method.
2370ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Calling this method changes the HTTP output method to use the "POST"
2371ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * method instead.
2372ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
2373ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
2374ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid
2375ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRegisterHTTPPostCallbacks( void ) {
2376ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2377ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*  Register defaults if not done previously  */
2378ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2379ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ( xmlOutputCallbackInitialized == 0 )
2380ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlRegisterDefaultOutputCallbacks( );
2381ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2382ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRegisterOutputCallbacks(xmlIOHTTPMatch, xmlIOHTTPDfltOpenW,
2383ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	                       xmlIOHTTPWrite, xmlIOHTTPClosePost);
2384ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return;
2385ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
2386ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
2387ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif /* LIBXML_OUTPUT_ENABLED */
2388ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2389ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
2390ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlAllocParserInputBuffer:
2391ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @enc:  the charset encoding if known
2392ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
2393ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Create a buffered parser input for progressive parsing
2394ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
2395ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the new parser input or NULL
2396ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
2397ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlParserInputBufferPtr
2398ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlAllocParserInputBuffer(xmlCharEncoding enc) {
2399ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlParserInputBufferPtr ret;
2400ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2401ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret = (xmlParserInputBufferPtr) xmlMalloc(sizeof(xmlParserInputBuffer));
2402ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ret == NULL) {
2403ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlIOErrMemory("creating input buffer");
2404ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(NULL);
2405ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
2406ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    memset(ret, 0, (size_t) sizeof(xmlParserInputBuffer));
2407ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->buffer = xmlBufferCreateSize(2 * xmlDefaultBufferSize);
2408ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ret->buffer == NULL) {
2409ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlFree(ret);
2410ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(NULL);
2411ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
2412ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->buffer->alloc = XML_BUFFER_ALLOC_DOUBLEIT;
2413ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->encoder = xmlGetCharEncodingHandler(enc);
2414ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ret->encoder != NULL)
2415ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ret->raw = xmlBufferCreateSize(2 * xmlDefaultBufferSize);
2416ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    else
2417ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ret->raw = NULL;
2418ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->readcallback = NULL;
2419ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->closecallback = NULL;
2420ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->context = NULL;
2421ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->compressed = -1;
2422ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->rawconsumed = 0;
2423ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2424ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(ret);
2425ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
2426ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2427ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef LIBXML_OUTPUT_ENABLED
2428ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
2429ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlAllocOutputBuffer:
2430ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @encoder:  the encoding converter or NULL
2431ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
2432ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Create a buffered parser output
2433ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
2434ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the new parser output or NULL
2435ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
2436ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlOutputBufferPtr
2437ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlAllocOutputBuffer(xmlCharEncodingHandlerPtr encoder) {
2438ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlOutputBufferPtr ret;
2439ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2440ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret = (xmlOutputBufferPtr) xmlMalloc(sizeof(xmlOutputBuffer));
2441ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ret == NULL) {
2442ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlIOErrMemory("creating output buffer");
2443ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(NULL);
2444ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
2445ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    memset(ret, 0, (size_t) sizeof(xmlOutputBuffer));
2446ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->buffer = xmlBufferCreate();
2447ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ret->buffer == NULL) {
2448ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlFree(ret);
2449ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(NULL);
2450ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
245160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
2452df143a5041f03a22808b59c76698770b74692815Selim Gurun    /* try to avoid a performance problem with Windows realloc() */
2453df143a5041f03a22808b59c76698770b74692815Selim Gurun    if (ret->buffer->alloc == XML_BUFFER_ALLOC_EXACT)
2454df143a5041f03a22808b59c76698770b74692815Selim Gurun        ret->buffer->alloc = XML_BUFFER_ALLOC_DOUBLEIT;
2455df143a5041f03a22808b59c76698770b74692815Selim Gurun
245660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    ret->encoder = encoder;
245760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    if (encoder != NULL) {
245860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott        ret->conv = xmlBufferCreateSize(4000);
245960a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	if (ret->conv == NULL) {
246060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	    xmlFree(ret);
246160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	    return(NULL);
246260a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	}
246360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
246460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	/*
246560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	 * This call is designed to initiate the encoder state
246660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	 */
2467df143a5041f03a22808b59c76698770b74692815Selim Gurun	xmlCharEncOutFunc(encoder, ret->conv, NULL);
246860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    } else
246960a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott        ret->conv = NULL;
247060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    ret->writecallback = NULL;
247160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    ret->closecallback = NULL;
247260a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    ret->context = NULL;
247360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    ret->written = 0;
247460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
247560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    return(ret);
247660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott}
247760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
247860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott/**
247960a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott * xmlAllocOutputBufferInternal:
248060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott * @encoder:  the encoding converter or NULL
248160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott *
248260a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott * Create a buffered parser output
248360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott *
248460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott * Returns the new parser output or NULL
248560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott */
248660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick ScottxmlOutputBufferPtr
248760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick ScottxmlAllocOutputBufferInternal(xmlCharEncodingHandlerPtr encoder) {
248860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    xmlOutputBufferPtr ret;
248960a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
249060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    ret = (xmlOutputBufferPtr) xmlMalloc(sizeof(xmlOutputBuffer));
249160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    if (ret == NULL) {
249260a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	xmlIOErrMemory("creating output buffer");
249360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	return(NULL);
249460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    }
249560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    memset(ret, 0, (size_t) sizeof(xmlOutputBuffer));
249660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    ret->buffer = xmlBufferCreate();
249760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    if (ret->buffer == NULL) {
249860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott        xmlFree(ret);
249960a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	return(NULL);
250060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    }
250160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
250260a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
250360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    /*
250460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott     * For conversion buffers we use the special IO handling
250560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott     * We don't do that from the exported API to avoid confusing
250660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott     * user's code.
250760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott     */
250860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    ret->buffer->alloc = XML_BUFFER_ALLOC_IO;
250960a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    ret->buffer->contentIO = ret->buffer->content;
251060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
2511ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->encoder = encoder;
2512ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (encoder != NULL) {
2513ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ret->conv = xmlBufferCreateSize(4000);
251460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	if (ret->conv == NULL) {
251560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	    xmlFree(ret);
251660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	    return(NULL);
251760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	}
251860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
2519ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
2520ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	 * This call is designed to initiate the encoder state
2521ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	 */
2522df143a5041f03a22808b59c76698770b74692815Selim Gurun	xmlCharEncOutFunc(encoder, ret->conv, NULL);
2523ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else
2524ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ret->conv = NULL;
2525ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->writecallback = NULL;
2526ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->closecallback = NULL;
2527ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->context = NULL;
2528ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->written = 0;
2529ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2530ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(ret);
2531ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
253260a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
2533ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif /* LIBXML_OUTPUT_ENABLED */
2534ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2535ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
2536ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlFreeParserInputBuffer:
2537ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @in:  a buffered parser input
2538ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
2539ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Free up the memory used by a buffered parser input
2540ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
2541ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid
2542ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlFreeParserInputBuffer(xmlParserInputBufferPtr in) {
2543ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (in == NULL) return;
2544ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2545ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (in->raw) {
2546ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlBufferFree(in->raw);
2547ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	in->raw = NULL;
2548ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
2549ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (in->encoder != NULL) {
2550ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlCharEncCloseFunc(in->encoder);
2551ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
2552ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (in->closecallback != NULL) {
2553ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	in->closecallback(in->context);
2554ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
2555ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (in->buffer != NULL) {
2556ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlBufferFree(in->buffer);
2557ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	in->buffer = NULL;
2558ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
2559ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2560ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlFree(in);
2561ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
2562ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2563ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef LIBXML_OUTPUT_ENABLED
2564ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
2565ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlOutputBufferClose:
2566ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @out:  a buffered output
2567ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
2568ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * flushes and close the output I/O channel
2569ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * and free up all the associated resources
2570ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
2571ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the number of byte written or -1 in case of error.
2572ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
2573ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectint
2574ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlOutputBufferClose(xmlOutputBufferPtr out)
2575ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
2576ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int written;
2577ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int err_rc = 0;
2578ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2579ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (out == NULL)
2580ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (-1);
2581ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (out->writecallback != NULL)
2582ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlOutputBufferFlush(out);
2583ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (out->closecallback != NULL) {
2584ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        err_rc = out->closecallback(out->context);
2585ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
2586ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    written = out->written;
2587ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (out->conv) {
2588ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlBufferFree(out->conv);
2589ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        out->conv = NULL;
2590ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
2591ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (out->encoder != NULL) {
2592ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlCharEncCloseFunc(out->encoder);
2593ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
2594ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (out->buffer != NULL) {
2595ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlBufferFree(out->buffer);
2596ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        out->buffer = NULL;
2597ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
2598ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2599ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (out->error)
2600ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        err_rc = -1;
2601ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlFree(out);
2602ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return ((err_rc == 0) ? written : err_rc);
2603ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
2604ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif /* LIBXML_OUTPUT_ENABLED */
2605ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2606ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlParserInputBufferPtr
2607ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project__xmlParserInputBufferCreateFilename(const char *URI, xmlCharEncoding enc) {
2608ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlParserInputBufferPtr ret;
2609ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int i = 0;
2610ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    void *context = NULL;
2611ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2612ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (xmlInputCallbackInitialized == 0)
2613ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlRegisterDefaultInputCallbacks();
2614ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2615ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (URI == NULL) return(NULL);
2616ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2617ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
2618ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     * Try to find one of the input accept method accepting that scheme
2619ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     * Go in reverse to give precedence to user defined handlers.
2620ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     */
2621ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (context == NULL) {
2622ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	for (i = xmlInputCallbackNr - 1;i >= 0;i--) {
2623ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if ((xmlInputCallbackTable[i].matchcallback != NULL) &&
2624ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		(xmlInputCallbackTable[i].matchcallback(URI) != 0)) {
2625ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		context = xmlInputCallbackTable[i].opencallback(URI);
2626ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (context != NULL) {
2627ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    break;
2628ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
2629ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
2630ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
2631ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
2632ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (context == NULL) {
2633ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(NULL);
2634ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
2635ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2636ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
2637ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     * Allocate the Input buffer front-end.
2638ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     */
2639ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret = xmlAllocParserInputBuffer(enc);
2640ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ret != NULL) {
2641ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ret->context = context;
2642ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ret->readcallback = xmlInputCallbackTable[i].readcallback;
2643ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ret->closecallback = xmlInputCallbackTable[i].closecallback;
2644ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef HAVE_ZLIB_H
2645ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if ((xmlInputCallbackTable[i].opencallback == xmlGzfileOpen) &&
2646ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		(strcmp(URI, "-") != 0)) {
2647df143a5041f03a22808b59c76698770b74692815Selim Gurun#if defined(ZLIB_VERNUM) && ZLIB_VERNUM >= 0x1230
2648df143a5041f03a22808b59c76698770b74692815Selim Gurun            ret->compressed = !gzdirect(context);
2649df143a5041f03a22808b59c76698770b74692815Selim Gurun#else
2650ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (((z_stream *)context)->avail_in > 4) {
2651ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	        char *cptr, buff4[4];
2652ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		cptr = (char *) ((z_stream *)context)->next_in;
2653ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (gzread(context, buff4, 4) == 4) {
2654ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    if (strncmp(buff4, cptr, 4) == 0)
2655ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		        ret->compressed = 0;
2656ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    else
2657ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		        ret->compressed = 1;
2658ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    gzrewind(context);
2659ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
2660ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
2661df143a5041f03a22808b59c76698770b74692815Selim Gurun#endif
2662ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
2663ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
2664ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
2665ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    else
2666ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project      xmlInputCallbackTable[i].closecallback (context);
2667ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2668ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(ret);
2669ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
2670ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2671ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
2672ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlParserInputBufferCreateFilename:
2673ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @URI:  a C string containing the URI or filename
2674ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @enc:  the charset encoding if known
2675ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
2676ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Create a buffered parser input for the progressive parsing of a file
2677ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * If filename is "-' then we use stdin as the input.
2678ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Automatic support for ZLIB/Compress compressed document is provided
2679ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * by default if found at compile-time.
2680ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Do an encoding check if enc == XML_CHAR_ENCODING_NONE
2681ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
2682ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the new parser input or NULL
2683ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
2684ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlParserInputBufferPtr
2685ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlParserInputBufferCreateFilename(const char *URI, xmlCharEncoding enc) {
2686ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((xmlParserInputBufferCreateFilenameValue)) {
2687ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		return xmlParserInputBufferCreateFilenameValue(URI, enc);
2688ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
2689ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return __xmlParserInputBufferCreateFilename(URI, enc);
2690ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
2691ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2692ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef LIBXML_OUTPUT_ENABLED
2693ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlOutputBufferPtr
2694ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project__xmlOutputBufferCreateFilename(const char *URI,
2695ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                              xmlCharEncodingHandlerPtr encoder,
2696ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                              int compression ATTRIBUTE_UNUSED) {
2697ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlOutputBufferPtr ret;
2698ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlURIPtr puri;
2699ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int i = 0;
2700ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    void *context = NULL;
2701ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    char *unescaped = NULL;
2702ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef HAVE_ZLIB_H
2703ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int is_file_uri = 1;
2704ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
2705ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2706ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (xmlOutputCallbackInitialized == 0)
2707ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlRegisterDefaultOutputCallbacks();
2708ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2709ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (URI == NULL) return(NULL);
2710ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2711ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    puri = xmlParseURI(URI);
2712ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (puri != NULL) {
2713ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef HAVE_ZLIB_H
2714ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if ((puri->scheme != NULL) &&
2715ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    (!xmlStrEqual(BAD_CAST puri->scheme, BAD_CAST "file")))
2716ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    is_file_uri = 0;
2717ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
2718ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
2719ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	 * try to limit the damages of the URI unescaping code.
2720ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	 */
2721ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if ((puri->scheme == NULL) ||
2722ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    (xmlStrEqual(BAD_CAST puri->scheme, BAD_CAST "file")))
2723ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    unescaped = xmlURIUnescapeString(URI, 0, NULL);
2724ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlFreeURI(puri);
2725ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
2726ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2727ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
2728ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     * Try to find one of the output accept method accepting that scheme
2729ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     * Go in reverse to give precedence to user defined handlers.
2730ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     * try with an unescaped version of the URI
2731ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     */
2732ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (unescaped != NULL) {
2733ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef HAVE_ZLIB_H
2734ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if ((compression > 0) && (compression <= 9) && (is_file_uri == 1)) {
2735ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    context = xmlGzfileOpenW(unescaped, compression);
2736ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (context != NULL) {
273760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott		ret = xmlAllocOutputBufferInternal(encoder);
2738ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (ret != NULL) {
2739ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    ret->context = context;
2740ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    ret->writecallback = xmlGzfileWrite;
2741ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    ret->closecallback = xmlGzfileClose;
2742ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
2743ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlFree(unescaped);
2744ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		return(ret);
2745ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
2746ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
2747ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
2748ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	for (i = xmlOutputCallbackNr - 1;i >= 0;i--) {
2749ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if ((xmlOutputCallbackTable[i].matchcallback != NULL) &&
2750ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		(xmlOutputCallbackTable[i].matchcallback(unescaped) != 0)) {
2751ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#if defined(LIBXML_HTTP_ENABLED) && defined(HAVE_ZLIB_H)
2752ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		/*  Need to pass compression parameter into HTTP open calls  */
2753ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (xmlOutputCallbackTable[i].matchcallback == xmlIOHTTPMatch)
2754ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    context = xmlIOHTTPOpenW(unescaped, compression);
2755ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		else
2756ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
2757ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    context = xmlOutputCallbackTable[i].opencallback(unescaped);
2758ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (context != NULL)
2759ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    break;
2760ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
2761ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
2762ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlFree(unescaped);
2763ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
2764ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2765ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
2766ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     * If this failed try with a non-escaped URI this may be a strange
2767ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     * filename
2768ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     */
2769ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (context == NULL) {
2770ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef HAVE_ZLIB_H
2771ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if ((compression > 0) && (compression <= 9) && (is_file_uri == 1)) {
2772ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    context = xmlGzfileOpenW(URI, compression);
2773ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (context != NULL) {
277460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott		ret = xmlAllocOutputBufferInternal(encoder);
2775ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (ret != NULL) {
2776ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    ret->context = context;
2777ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    ret->writecallback = xmlGzfileWrite;
2778ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    ret->closecallback = xmlGzfileClose;
2779ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
2780ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		return(ret);
2781ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
2782ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
2783ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
2784ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	for (i = xmlOutputCallbackNr - 1;i >= 0;i--) {
2785ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if ((xmlOutputCallbackTable[i].matchcallback != NULL) &&
2786ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		(xmlOutputCallbackTable[i].matchcallback(URI) != 0)) {
2787ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#if defined(LIBXML_HTTP_ENABLED) && defined(HAVE_ZLIB_H)
2788ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		/*  Need to pass compression parameter into HTTP open calls  */
2789ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (xmlOutputCallbackTable[i].matchcallback == xmlIOHTTPMatch)
2790ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    context = xmlIOHTTPOpenW(URI, compression);
2791ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		else
2792ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
2793ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    context = xmlOutputCallbackTable[i].opencallback(URI);
2794ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (context != NULL)
2795ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    break;
2796ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
2797ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
2798ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
2799ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2800ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (context == NULL) {
2801ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(NULL);
2802ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
2803ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2804ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
2805ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     * Allocate the Output buffer front-end.
2806ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     */
280760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    ret = xmlAllocOutputBufferInternal(encoder);
2808ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ret != NULL) {
2809ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ret->context = context;
2810ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ret->writecallback = xmlOutputCallbackTable[i].writecallback;
2811ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ret->closecallback = xmlOutputCallbackTable[i].closecallback;
2812ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
2813ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(ret);
2814ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
2815ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2816ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
2817ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlOutputBufferCreateFilename:
2818ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @URI:  a C string containing the URI or filename
2819ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @encoder:  the encoding converter or NULL
2820ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @compression:  the compression ration (0 none, 9 max).
2821ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
2822ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Create a buffered  output for the progressive saving of a file
2823ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * If filename is "-' then we use stdout as the output.
2824ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Automatic support for ZLIB/Compress compressed document is provided
2825ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * by default if found at compile-time.
2826ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * TODO: currently if compression is set, the library only support
2827ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *       writing to a local file.
2828ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
2829ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the new output or NULL
2830ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
2831ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlOutputBufferPtr
2832ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlOutputBufferCreateFilename(const char *URI,
2833ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                              xmlCharEncodingHandlerPtr encoder,
2834ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                              int compression ATTRIBUTE_UNUSED) {
2835ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((xmlOutputBufferCreateFilenameValue)) {
2836ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		return xmlOutputBufferCreateFilenameValue(URI, encoder, compression);
2837ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
2838ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return __xmlOutputBufferCreateFilename(URI, encoder, compression);
2839ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
2840ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif /* LIBXML_OUTPUT_ENABLED */
2841ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2842ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
2843ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlParserInputBufferCreateFile:
2844df143a5041f03a22808b59c76698770b74692815Selim Gurun * @file:  a FILE*
2845ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @enc:  the charset encoding if known
2846ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
2847ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Create a buffered parser input for the progressive parsing of a FILE *
2848ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * buffered C I/O
2849ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
2850ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the new parser input or NULL
2851ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
2852ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlParserInputBufferPtr
2853ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlParserInputBufferCreateFile(FILE *file, xmlCharEncoding enc) {
2854ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlParserInputBufferPtr ret;
2855ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2856ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (xmlInputCallbackInitialized == 0)
2857ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlRegisterDefaultInputCallbacks();
2858ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2859ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (file == NULL) return(NULL);
2860ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2861ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret = xmlAllocParserInputBuffer(enc);
2862ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ret != NULL) {
2863ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ret->context = file;
2864ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ret->readcallback = xmlFileRead;
2865ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ret->closecallback = xmlFileFlush;
2866ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
2867ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2868ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(ret);
2869ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
2870ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2871ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef LIBXML_OUTPUT_ENABLED
2872ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
2873ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlOutputBufferCreateFile:
2874df143a5041f03a22808b59c76698770b74692815Selim Gurun * @file:  a FILE*
2875ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @encoder:  the encoding converter or NULL
2876ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
2877ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Create a buffered output for the progressive saving to a FILE *
2878ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * buffered C I/O
2879ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
2880ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the new parser output or NULL
2881ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
2882ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlOutputBufferPtr
2883ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlOutputBufferCreateFile(FILE *file, xmlCharEncodingHandlerPtr encoder) {
2884ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlOutputBufferPtr ret;
2885ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2886ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (xmlOutputCallbackInitialized == 0)
2887ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlRegisterDefaultOutputCallbacks();
2888ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2889ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (file == NULL) return(NULL);
2890ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
289160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    ret = xmlAllocOutputBufferInternal(encoder);
2892ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ret != NULL) {
2893ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ret->context = file;
2894ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ret->writecallback = xmlFileWrite;
2895ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ret->closecallback = xmlFileFlush;
2896ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
2897ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2898ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(ret);
2899ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
2900ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2901ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
2902ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlOutputBufferCreateBuffer:
2903ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @buffer:  a xmlBufferPtr
2904ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @encoder:  the encoding converter or NULL
2905ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
2906ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Create a buffered output for the progressive saving to a xmlBuffer
2907ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
2908ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the new parser output or NULL
2909ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
2910ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlOutputBufferPtr
2911ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlOutputBufferCreateBuffer(xmlBufferPtr buffer,
2912ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            xmlCharEncodingHandlerPtr encoder) {
2913ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlOutputBufferPtr ret;
2914ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2915ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (buffer == NULL) return(NULL);
2916ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2917ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret = xmlOutputBufferCreateIO((xmlOutputWriteCallback)
2918ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                  xmlBufferWrite,
2919ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                  (xmlOutputCloseCallback)
2920ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                  NULL, (void *) buffer, encoder);
2921ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2922ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(ret);
2923ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
2924ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2925ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif /* LIBXML_OUTPUT_ENABLED */
2926ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2927ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
2928ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlParserInputBufferCreateFd:
2929ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @fd:  a file descriptor number
2930ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @enc:  the charset encoding if known
2931ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
2932ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Create a buffered parser input for the progressive parsing for the input
2933ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * from a file descriptor
2934ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
2935ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the new parser input or NULL
2936ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
2937ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlParserInputBufferPtr
2938ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlParserInputBufferCreateFd(int fd, xmlCharEncoding enc) {
2939ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlParserInputBufferPtr ret;
2940ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2941ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (fd < 0) return(NULL);
2942ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2943ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret = xmlAllocParserInputBuffer(enc);
2944ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ret != NULL) {
2945ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ret->context = (void *) (long) fd;
2946ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ret->readcallback = xmlFdRead;
2947ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ret->closecallback = xmlFdClose;
2948ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
2949ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2950ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(ret);
2951ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
2952ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2953ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
2954ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlParserInputBufferCreateMem:
2955ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @mem:  the memory input
2956ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @size:  the length of the memory block
2957ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @enc:  the charset encoding if known
2958ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
2959ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Create a buffered parser input for the progressive parsing for the input
2960ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * from a memory area.
2961ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
2962ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the new parser input or NULL
2963ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
2964ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlParserInputBufferPtr
2965ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlParserInputBufferCreateMem(const char *mem, int size, xmlCharEncoding enc) {
2966ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlParserInputBufferPtr ret;
2967ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int errcode;
2968ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2969ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (size <= 0) return(NULL);
2970ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (mem == NULL) return(NULL);
2971ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2972ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret = xmlAllocParserInputBuffer(enc);
2973ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ret != NULL) {
2974ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ret->context = (void *) mem;
2975ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ret->readcallback = (xmlInputReadCallback) xmlNop;
2976ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ret->closecallback = NULL;
2977ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	errcode = xmlBufferAdd(ret->buffer, (const xmlChar *) mem, size);
2978ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (errcode != 0) {
2979ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlFree(ret);
2980ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(NULL);
2981ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
2982ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
2983ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2984ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(ret);
2985ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
2986ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2987ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
2988ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlParserInputBufferCreateStatic:
2989ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @mem:  the memory input
2990ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @size:  the length of the memory block
2991ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @enc:  the charset encoding if known
2992ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
2993ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Create a buffered parser input for the progressive parsing for the input
2994ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * from an immutable memory area. This will not copy the memory area to
2995ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * the buffer, but the memory is expected to be available until the end of
2996ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * the parsing, this is useful for example when using mmap'ed file.
2997ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
2998ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the new parser input or NULL
2999ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
3000ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlParserInputBufferPtr
3001ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlParserInputBufferCreateStatic(const char *mem, int size,
3002ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                 xmlCharEncoding enc) {
3003ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlParserInputBufferPtr ret;
3004ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3005ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (size <= 0) return(NULL);
3006ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (mem == NULL) return(NULL);
3007ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3008ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret = (xmlParserInputBufferPtr) xmlMalloc(sizeof(xmlParserInputBuffer));
3009ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ret == NULL) {
3010ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlIOErrMemory("creating input buffer");
3011ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(NULL);
3012ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
3013ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    memset(ret, 0, (size_t) sizeof(xmlParserInputBuffer));
3014ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->buffer = xmlBufferCreateStatic((void *)mem, (size_t) size);
3015ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ret->buffer == NULL) {
3016ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlFree(ret);
3017ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(NULL);
3018ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
3019ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->encoder = xmlGetCharEncodingHandler(enc);
3020ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ret->encoder != NULL)
3021ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ret->raw = xmlBufferCreateSize(2 * xmlDefaultBufferSize);
3022ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    else
3023ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ret->raw = NULL;
3024ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->compressed = -1;
3025ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->context = (void *) mem;
3026ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->readcallback = NULL;
3027ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->closecallback = NULL;
3028ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3029ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(ret);
3030ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
3031ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3032ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef LIBXML_OUTPUT_ENABLED
3033ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
3034ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlOutputBufferCreateFd:
3035ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @fd:  a file descriptor number
3036ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @encoder:  the encoding converter or NULL
3037ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
3038df143a5041f03a22808b59c76698770b74692815Selim Gurun * Create a buffered output for the progressive saving
3039ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * to a file descriptor
3040ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
3041ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the new parser output or NULL
3042ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
3043ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlOutputBufferPtr
3044ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlOutputBufferCreateFd(int fd, xmlCharEncodingHandlerPtr encoder) {
3045ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlOutputBufferPtr ret;
3046ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3047ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (fd < 0) return(NULL);
3048ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
304960a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    ret = xmlAllocOutputBufferInternal(encoder);
3050ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ret != NULL) {
3051ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ret->context = (void *) (long) fd;
3052ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ret->writecallback = xmlFdWrite;
3053ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ret->closecallback = NULL;
3054ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
3055ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3056ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(ret);
3057ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
3058ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif /* LIBXML_OUTPUT_ENABLED */
3059ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3060ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
3061ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlParserInputBufferCreateIO:
3062ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ioread:  an I/O read function
3063ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ioclose:  an I/O close function
3064ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ioctx:  an I/O handler
3065ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @enc:  the charset encoding if known
3066ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
3067ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Create a buffered parser input for the progressive parsing for the input
3068ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * from an I/O handler
3069ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
3070ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the new parser input or NULL
3071ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
3072ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlParserInputBufferPtr
3073ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlParserInputBufferCreateIO(xmlInputReadCallback   ioread,
3074ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	 xmlInputCloseCallback  ioclose, void *ioctx, xmlCharEncoding enc) {
3075ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlParserInputBufferPtr ret;
3076ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3077ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ioread == NULL) return(NULL);
3078ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3079ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret = xmlAllocParserInputBuffer(enc);
3080ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ret != NULL) {
3081ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ret->context = (void *) ioctx;
3082ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ret->readcallback = ioread;
3083ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ret->closecallback = ioclose;
3084ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
3085ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3086ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(ret);
3087ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
3088ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3089ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef LIBXML_OUTPUT_ENABLED
3090ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
3091ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlOutputBufferCreateIO:
3092ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @iowrite:  an I/O write function
3093ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ioclose:  an I/O close function
3094ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ioctx:  an I/O handler
3095ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @encoder:  the charset encoding if known
3096ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
3097ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Create a buffered output for the progressive saving
3098ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * to an I/O handler
3099ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
3100ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the new parser output or NULL
3101ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
3102ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlOutputBufferPtr
3103ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlOutputBufferCreateIO(xmlOutputWriteCallback   iowrite,
3104ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	 xmlOutputCloseCallback  ioclose, void *ioctx,
3105ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	 xmlCharEncodingHandlerPtr encoder) {
3106ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlOutputBufferPtr ret;
3107ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3108ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (iowrite == NULL) return(NULL);
3109ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
311060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    ret = xmlAllocOutputBufferInternal(encoder);
3111ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ret != NULL) {
3112ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ret->context = (void *) ioctx;
3113ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ret->writecallback = iowrite;
3114ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ret->closecallback = ioclose;
3115ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
3116ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3117ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(ret);
3118ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
3119ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif /* LIBXML_OUTPUT_ENABLED */
3120ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3121ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
3122ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlParserInputBufferCreateFilenameDefault:
3123ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @func: function pointer to the new ParserInputBufferCreateFilenameFunc
3124ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
3125ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Registers a callback for URI input file handling
3126ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
3127ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the old value of the registration function
3128ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
3129ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlParserInputBufferCreateFilenameFunc
3130ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlParserInputBufferCreateFilenameDefault(xmlParserInputBufferCreateFilenameFunc func)
3131ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
3132ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlParserInputBufferCreateFilenameFunc old = xmlParserInputBufferCreateFilenameValue;
3133ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (old == NULL) {
3134ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		old = __xmlParserInputBufferCreateFilename;
3135ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
3136ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3137ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlParserInputBufferCreateFilenameValue = func;
3138ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(old);
3139ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
3140ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3141ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
3142ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlOutputBufferCreateFilenameDefault:
3143ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @func: function pointer to the new OutputBufferCreateFilenameFunc
3144ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
3145ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Registers a callback for URI output file handling
3146ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
3147ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the old value of the registration function
3148ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
3149ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlOutputBufferCreateFilenameFunc
3150ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlOutputBufferCreateFilenameDefault(xmlOutputBufferCreateFilenameFunc func)
3151ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
3152ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlOutputBufferCreateFilenameFunc old = xmlOutputBufferCreateFilenameValue;
3153ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef LIBXML_OUTPUT_ENABLED
3154ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (old == NULL) {
3155ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		old = __xmlOutputBufferCreateFilename;
3156ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
3157ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
3158ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlOutputBufferCreateFilenameValue = func;
3159ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(old);
3160ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
3161ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3162ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
3163ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlParserInputBufferPush:
3164ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @in:  a buffered parser input
3165ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @len:  the size in bytes of the array.
3166ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @buf:  an char array
3167ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
3168ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Push the content of the arry in the input buffer
3169ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * This routine handle the I18N transcoding to internal UTF-8
3170ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * This is used when operating the parser in progressive (push) mode.
3171ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
3172ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the number of chars read and stored in the buffer, or -1
3173ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *         in case of error.
3174ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
3175ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectint
3176ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlParserInputBufferPush(xmlParserInputBufferPtr in,
3177ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	                 int len, const char *buf) {
3178ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int nbchars = 0;
3179ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int ret;
3180ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3181ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (len < 0) return(0);
3182ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((in == NULL) || (in->error)) return(-1);
3183ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (in->encoder != NULL) {
3184ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        unsigned int use;
3185ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3186ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        /*
3187ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	 * Store the data in the incoming raw buffer
3188ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	 */
3189ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (in->raw == NULL) {
3190ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    in->raw = xmlBufferCreate();
3191ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
3192ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ret = xmlBufferAdd(in->raw, (const xmlChar *) buf, len);
3193ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (ret != 0)
3194ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(-1);
3195ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3196ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
3197ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	 * convert as much as possible to the parser reading buffer.
3198ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	 */
3199ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	use = in->raw->use;
3200ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	nbchars = xmlCharEncInFunc(in->encoder, in->buffer, in->raw);
3201ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (nbchars < 0) {
3202ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlIOErr(XML_IO_ENCODER, NULL);
3203ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    in->error = XML_IO_ENCODER;
3204ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(-1);
3205ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
3206ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	in->rawconsumed += (use - in->raw->use);
3207ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else {
3208ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	nbchars = len;
3209ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ret = xmlBufferAdd(in->buffer, (xmlChar *) buf, nbchars);
3210ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (ret != 0)
3211ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(-1);
3212ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
3213ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_INPUT
3214ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlGenericError(xmlGenericErrorContext,
3215ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    "I/O: pushed %d chars, buffer %d/%d\n",
3216ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            nbchars, in->buffer->use, in->buffer->size);
3217ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
3218ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(nbchars);
3219ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
3220ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3221ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
3222ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * endOfInput:
3223ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
3224ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * When reading from an Input channel indicated end of file or error
3225ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * don't reread from it again.
3226ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
3227ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
3228ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectendOfInput (void * context ATTRIBUTE_UNUSED,
3229ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    char * buffer ATTRIBUTE_UNUSED,
3230ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    int len ATTRIBUTE_UNUSED) {
3231ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(0);
3232ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
3233ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3234ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
3235ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlParserInputBufferGrow:
3236ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @in:  a buffered parser input
3237ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @len:  indicative value of the amount of chars to read
3238ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
3239ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Grow up the content of the input buffer, the old data are preserved
3240ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * This routine handle the I18N transcoding to internal UTF-8
3241ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * This routine is used when operating the parser in normal (pull) mode
3242ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
3243ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * TODO: one should be able to remove one extra copy by copying directly
3244ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *       onto in->buffer or in->raw
3245ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
3246ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the number of chars read and stored in the buffer, or -1
3247ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *         in case of error.
3248ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
3249ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectint
3250ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlParserInputBufferGrow(xmlParserInputBufferPtr in, int len) {
3251ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    char *buffer = NULL;
3252ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int res = 0;
3253ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int nbchars = 0;
3254ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int buffree;
3255ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    unsigned int needSize;
3256ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3257ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((in == NULL) || (in->error)) return(-1);
3258ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((len <= MINLEN) && (len != 4))
3259ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        len = MINLEN;
3260ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3261ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    buffree = in->buffer->size - in->buffer->use;
3262ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (buffree <= 0) {
3263ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlIOErr(XML_IO_BUFFER_FULL, NULL);
3264ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	in->error = XML_IO_BUFFER_FULL;
3265ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(-1);
3266ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
3267ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3268ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    needSize = in->buffer->use + len + 1;
3269ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (needSize > in->buffer->size){
3270ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (!xmlBufferResize(in->buffer, needSize)){
3271ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlIOErrMemory("growing input buffer");
3272ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    in->error = XML_ERR_NO_MEMORY;
3273ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            return(-1);
3274ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
3275ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
3276ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    buffer = (char *)&in->buffer->content[in->buffer->use];
3277ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3278ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
3279ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     * Call the read method for this I/O type.
3280ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     */
3281ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (in->readcallback != NULL) {
3282ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	res = in->readcallback(in->context, &buffer[0], len);
3283ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (res <= 0)
3284ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    in->readcallback = endOfInput;
3285ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else {
3286ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlIOErr(XML_IO_NO_INPUT, NULL);
3287ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	in->error = XML_IO_NO_INPUT;
3288ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(-1);
3289ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
3290ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (res < 0) {
3291ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(-1);
3292ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
3293ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    len = res;
3294ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (in->encoder != NULL) {
3295ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        unsigned int use;
3296ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3297ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        /*
3298ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	 * Store the data in the incoming raw buffer
3299ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	 */
3300ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (in->raw == NULL) {
3301ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    in->raw = xmlBufferCreate();
3302ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
3303ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	res = xmlBufferAdd(in->raw, (const xmlChar *) buffer, len);
3304ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (res != 0)
3305ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(-1);
3306ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3307ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
3308ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	 * convert as much as possible to the parser reading buffer.
3309ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	 */
3310ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	use = in->raw->use;
3311ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	nbchars = xmlCharEncInFunc(in->encoder, in->buffer, in->raw);
3312ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (nbchars < 0) {
3313ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlIOErr(XML_IO_ENCODER, NULL);
3314ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    in->error = XML_IO_ENCODER;
3315ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(-1);
3316ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
3317ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	in->rawconsumed += (use - in->raw->use);
3318ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else {
3319ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	nbchars = len;
3320df143a5041f03a22808b59c76698770b74692815Selim Gurun   	in->buffer->use += nbchars;
3321ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	buffer[nbchars] = 0;
3322ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
3323ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_INPUT
3324ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlGenericError(xmlGenericErrorContext,
3325ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    "I/O: read %d chars, buffer %d/%d\n",
3326ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            nbchars, in->buffer->use, in->buffer->size);
3327ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
3328ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(nbchars);
3329ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
3330ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3331ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
3332ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlParserInputBufferRead:
3333ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @in:  a buffered parser input
3334ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @len:  indicative value of the amount of chars to read
3335ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
3336ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Refresh the content of the input buffer, the old data are considered
3337ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * consumed
3338ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * This routine handle the I18N transcoding to internal UTF-8
3339ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
3340ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the number of chars read and stored in the buffer, or -1
3341ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *         in case of error.
3342ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
3343ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectint
3344ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlParserInputBufferRead(xmlParserInputBufferPtr in, int len) {
3345ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((in == NULL) || (in->error)) return(-1);
3346ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (in->readcallback != NULL)
3347ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(xmlParserInputBufferGrow(in, len));
3348ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    else if ((in->buffer != NULL) &&
3349ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project             (in->buffer->alloc == XML_BUFFER_ALLOC_IMMUTABLE))
3350ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(0);
3351ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    else
3352ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return(-1);
3353ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
3354ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3355ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef LIBXML_OUTPUT_ENABLED
3356ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
3357ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlOutputBufferWrite:
3358ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @out:  a buffered parser output
3359ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @len:  the size in bytes of the array.
3360ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @buf:  an char array
3361ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
3362ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Write the content of the array in the output I/O buffer
3363ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * This routine handle the I18N transcoding from internal UTF-8
3364ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * The buffer is lossless, i.e. will store in case of partial
3365ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * or delayed writes.
3366ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
3367ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the number of chars immediately written, or -1
3368ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *         in case of error.
3369ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
3370ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectint
3371ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlOutputBufferWrite(xmlOutputBufferPtr out, int len, const char *buf) {
3372ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int nbchars = 0; /* number of chars to output to I/O */
3373ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int ret;         /* return from function call */
3374ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int written = 0; /* number of char written to I/O so far */
3375ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int chunk;       /* number of byte curreent processed from buf */
3376ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3377ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((out == NULL) || (out->error)) return(-1);
3378ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (len < 0) return(0);
3379ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (out->error) return(-1);
3380ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3381ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    do {
3382ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	chunk = len;
3383ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (chunk > 4 * MINLEN)
3384ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    chunk = 4 * MINLEN;
3385ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3386ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
3387ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	 * first handle encoding stuff.
3388ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	 */
3389ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (out->encoder != NULL) {
3390ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
3391ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	     * Store the data in the incoming raw buffer
3392ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	     */
3393ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (out->conv == NULL) {
3394ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		out->conv = xmlBufferCreate();
3395ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
3396ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ret = xmlBufferAdd(out->buffer, (const xmlChar *) buf, chunk);
3397ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (ret != 0)
3398ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	        return(-1);
3399ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3400ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if ((out->buffer->use < MINLEN) && (chunk == len))
3401ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		goto done;
3402ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3403ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
3404ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	     * convert as much as possible to the parser reading buffer.
3405ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	     */
3406ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ret = xmlCharEncOutFunc(out->encoder, out->conv, out->buffer);
3407ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if ((ret < 0) && (ret != -3)) {
3408ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlIOErr(XML_IO_ENCODER, NULL);
3409ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		out->error = XML_IO_ENCODER;
3410ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		return(-1);
3411ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
3412ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    nbchars = out->conv->use;
3413ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else {
3414ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ret = xmlBufferAdd(out->buffer, (const xmlChar *) buf, chunk);
3415ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (ret != 0)
3416ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	        return(-1);
3417ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    nbchars = out->buffer->use;
3418ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
3419ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	buf += chunk;
3420ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	len -= chunk;
3421ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3422ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if ((nbchars < MINLEN) && (len <= 0))
3423ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    goto done;
3424ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3425ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (out->writecallback) {
3426ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
3427ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	     * second write the stuff to the I/O channel
3428ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	     */
3429ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (out->encoder != NULL) {
3430df143a5041f03a22808b59c76698770b74692815Selim Gurun		ret = out->writecallback(out->context,
3431ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				 (const char *)out->conv->content, nbchars);
3432ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (ret >= 0)
3433ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlBufferShrink(out->conv, ret);
3434ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    } else {
3435df143a5041f03a22808b59c76698770b74692815Selim Gurun		ret = out->writecallback(out->context,
3436ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				 (const char *)out->buffer->content, nbchars);
3437ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (ret >= 0)
3438ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlBufferShrink(out->buffer, ret);
3439ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
3440ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (ret < 0) {
3441ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlIOErr(XML_IO_WRITE, NULL);
3442ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		out->error = XML_IO_WRITE;
3443ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		return(ret);
3444ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
3445ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    out->written += ret;
3446ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
3447ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	written += nbchars;
3448ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } while (len > 0);
3449ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3450ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectdone:
3451ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_INPUT
3452ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlGenericError(xmlGenericErrorContext,
3453ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    "I/O: wrote %d chars\n", written);
3454ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
3455ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(written);
3456ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
3457ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3458ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
3459ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlEscapeContent:
3460ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @out:  a pointer to an array of bytes to store the result
3461ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @outlen:  the length of @out
3462ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @in:  a pointer to an array of unescaped UTF-8 bytes
3463ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @inlen:  the length of @in
3464ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
3465ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Take a block of UTF-8 chars in and escape them.
3466ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 0 if success, or -1 otherwise
3467ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * The value of @inlen after return is the number of octets consumed
3468ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *     if the return value is positive, else unpredictable.
3469ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * The value of @outlen after return is the number of octets consumed.
3470ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
3471ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
3472ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlEscapeContent(unsigned char* out, int *outlen,
3473ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                 const xmlChar* in, int *inlen) {
3474ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    unsigned char* outstart = out;
3475ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    const unsigned char* base = in;
3476ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    unsigned char* outend = out + *outlen;
3477ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    const unsigned char* inend;
3478ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3479ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    inend = in + (*inlen);
3480df143a5041f03a22808b59c76698770b74692815Selim Gurun
3481ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    while ((in < inend) && (out < outend)) {
3482df143a5041f03a22808b59c76698770b74692815Selim Gurun   	if (*in == '<') {
3483ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (outend - out < 4) break;
3484ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    *out++ = '&';
3485ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    *out++ = 'l';
3486ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    *out++ = 't';
3487ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    *out++ = ';';
3488ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else if (*in == '>') {
3489ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (outend - out < 4) break;
3490ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    *out++ = '&';
3491ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    *out++ = 'g';
3492ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    *out++ = 't';
3493ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    *out++ = ';';
3494ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else if (*in == '&') {
3495ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (outend - out < 5) break;
3496ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    *out++ = '&';
3497ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    *out++ = 'a';
3498ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    *out++ = 'm';
3499ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    *out++ = 'p';
3500ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    *out++ = ';';
3501ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else if (*in == '\r') {
3502ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (outend - out < 5) break;
3503ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    *out++ = '&';
3504ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    *out++ = '#';
3505ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    *out++ = '1';
3506ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    *out++ = '3';
3507ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    *out++ = ';';
3508ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else {
3509ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    *out++ = (unsigned char) *in;
3510ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
3511ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	++in;
3512df143a5041f03a22808b59c76698770b74692815Selim Gurun    }
3513ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    *outlen = out - outstart;
3514ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    *inlen = in - base;
3515ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(0);
3516ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
3517ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3518ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
3519ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlOutputBufferWriteEscape:
3520ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @out:  a buffered parser output
3521ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @str:  a zero terminated UTF-8 string
3522ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @escaping:  an optional escaping function (or NULL)
3523ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
3524ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Write the content of the string in the output I/O buffer
3525ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * This routine escapes the caracters and then handle the I18N
3526ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * transcoding from internal UTF-8
3527ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * The buffer is lossless, i.e. will store in case of partial
3528ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * or delayed writes.
3529ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
3530ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the number of chars immediately written, or -1
3531ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *         in case of error.
3532ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
3533ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectint
3534ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlOutputBufferWriteEscape(xmlOutputBufferPtr out, const xmlChar *str,
3535ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                           xmlCharEncodingOutputFunc escaping) {
3536ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int nbchars = 0; /* number of chars to output to I/O */
3537ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int ret;         /* return from function call */
3538ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int written = 0; /* number of char written to I/O so far */
3539ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int oldwritten=0;/* loop guard */
3540ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int chunk;       /* number of byte currently processed from str */
3541ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int len;         /* number of bytes in str */
3542ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int cons;        /* byte from str consumed */
3543ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3544ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((out == NULL) || (out->error) || (str == NULL) ||
3545ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        (out->buffer == NULL) ||
3546ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	(out->buffer->alloc == XML_BUFFER_ALLOC_IMMUTABLE)) return(-1);
3547ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    len = strlen((const char *)str);
3548ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (len < 0) return(0);
3549ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (out->error) return(-1);
3550ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (escaping == NULL) escaping = xmlEscapeContent;
3551ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3552ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    do {
3553ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        oldwritten = written;
3554ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3555ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        /*
3556ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	 * how many bytes to consume and how many bytes to store.
3557ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	 */
3558ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	cons = len;
3559ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	chunk = (out->buffer->size - out->buffer->use) - 1;
3560ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
356160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott        /*
356260a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	 * make sure we have enough room to save first, if this is
356360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	 * not the case force a flush, but make sure we stay in the loop
356460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	 */
356560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	if (chunk < 40) {
356660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	    if (xmlBufferGrow(out->buffer, out->buffer->size + 100) < 0)
356760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	        return(-1);
356860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott            oldwritten = -1;
356960a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	    continue;
357060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	}
357160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
3572ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
3573ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	 * first handle encoding stuff.
3574ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	 */
3575ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (out->encoder != NULL) {
3576ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
3577ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	     * Store the data in the incoming raw buffer
3578ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	     */
3579ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (out->conv == NULL) {
3580ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		out->conv = xmlBufferCreate();
3581ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
3582ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ret = escaping(out->buffer->content + out->buffer->use ,
3583ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	                   &chunk, str, &cons);
3584ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if ((ret < 0) || (chunk == 0)) /* chunk==0 => nothing done */
3585ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	        return(-1);
3586ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    out->buffer->use += chunk;
3587ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    out->buffer->content[out->buffer->use] = 0;
3588ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3589ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if ((out->buffer->use < MINLEN) && (cons == len))
3590ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		goto done;
3591ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3592ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
3593ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	     * convert as much as possible to the output buffer.
3594ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	     */
3595ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ret = xmlCharEncOutFunc(out->encoder, out->conv, out->buffer);
3596ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if ((ret < 0) && (ret != -3)) {
3597ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlIOErr(XML_IO_ENCODER, NULL);
3598ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		out->error = XML_IO_ENCODER;
3599ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		return(-1);
3600ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
3601ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    nbchars = out->conv->use;
3602ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else {
3603ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ret = escaping(out->buffer->content + out->buffer->use ,
3604ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	                   &chunk, str, &cons);
3605ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if ((ret < 0) || (chunk == 0)) /* chunk==0 => nothing done */
3606ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	        return(-1);
3607ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    out->buffer->use += chunk;
3608ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    out->buffer->content[out->buffer->use] = 0;
3609ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    nbchars = out->buffer->use;
3610ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
3611ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	str += cons;
3612ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	len -= cons;
3613ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3614ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if ((nbchars < MINLEN) && (len <= 0))
3615ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    goto done;
3616ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3617ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (out->writecallback) {
3618ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
3619ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	     * second write the stuff to the I/O channel
3620ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	     */
3621ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (out->encoder != NULL) {
3622df143a5041f03a22808b59c76698770b74692815Selim Gurun		ret = out->writecallback(out->context,
3623ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				 (const char *)out->conv->content, nbchars);
3624ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (ret >= 0)
3625ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlBufferShrink(out->conv, ret);
3626ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    } else {
3627df143a5041f03a22808b59c76698770b74692815Selim Gurun		ret = out->writecallback(out->context,
3628ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				 (const char *)out->buffer->content, nbchars);
3629ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (ret >= 0)
3630ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlBufferShrink(out->buffer, ret);
3631ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
3632ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (ret < 0) {
3633ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlIOErr(XML_IO_WRITE, NULL);
3634ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		out->error = XML_IO_WRITE;
3635ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		return(ret);
3636ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
3637ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    out->written += ret;
3638ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else if (out->buffer->size - out->buffer->use < MINLEN) {
3639ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlBufferResize(out->buffer, out->buffer->size + MINLEN);
3640ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
3641ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	written += nbchars;
3642ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } while ((len > 0) && (oldwritten != written));
3643ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3644ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectdone:
3645ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_INPUT
3646ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlGenericError(xmlGenericErrorContext,
3647ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    "I/O: wrote %d chars\n", written);
3648ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
3649ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(written);
3650ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
3651ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3652ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
3653ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlOutputBufferWriteString:
3654ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @out:  a buffered parser output
3655ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @str:  a zero terminated C string
3656ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
3657ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Write the content of the string in the output I/O buffer
3658ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * This routine handle the I18N transcoding from internal UTF-8
3659ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * The buffer is lossless, i.e. will store in case of partial
3660ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * or delayed writes.
3661ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
3662ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the number of chars immediately written, or -1
3663ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *         in case of error.
3664ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
3665ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectint
3666ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlOutputBufferWriteString(xmlOutputBufferPtr out, const char *str) {
3667ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int len;
3668df143a5041f03a22808b59c76698770b74692815Selim Gurun
3669ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((out == NULL) || (out->error)) return(-1);
3670ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (str == NULL)
3671ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return(-1);
3672ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    len = strlen(str);
3673ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3674ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (len > 0)
3675ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(xmlOutputBufferWrite(out, len, str));
3676ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(len);
3677ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
3678ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3679ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
3680ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlOutputBufferFlush:
3681ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @out:  a buffered output
3682ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
3683ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * flushes the output I/O channel
3684ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
3685ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the number of byte written or -1 in case of error.
3686ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
3687ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectint
3688ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlOutputBufferFlush(xmlOutputBufferPtr out) {
3689ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int nbchars = 0, ret = 0;
3690ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3691ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((out == NULL) || (out->error)) return(-1);
3692ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
3693ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     * first handle encoding stuff.
3694ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     */
3695ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((out->conv != NULL) && (out->encoder != NULL)) {
3696ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
3697ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	 * convert as much as possible to the parser reading buffer.
3698ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	 */
3699ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	nbchars = xmlCharEncOutFunc(out->encoder, out->conv, out->buffer);
3700ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (nbchars < 0) {
3701ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlIOErr(XML_IO_ENCODER, NULL);
3702ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    out->error = XML_IO_ENCODER;
3703ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(-1);
3704ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
3705ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
3706ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3707ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
3708ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     * second flush the stuff to the I/O channel
3709ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     */
3710ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((out->conv != NULL) && (out->encoder != NULL) &&
3711ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	(out->writecallback != NULL)) {
3712ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ret = out->writecallback(out->context,
3713ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	           (const char *)out->conv->content, out->conv->use);
3714ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (ret >= 0)
3715ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlBufferShrink(out->conv, ret);
3716ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else if (out->writecallback != NULL) {
3717ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ret = out->writecallback(out->context,
3718ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	           (const char *)out->buffer->content, out->buffer->use);
3719ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (ret >= 0)
3720ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlBufferShrink(out->buffer, ret);
3721ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
3722ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ret < 0) {
3723ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlIOErr(XML_IO_FLUSH, NULL);
3724ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	out->error = XML_IO_FLUSH;
3725ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(ret);
3726ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
3727ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    out->written += ret;
3728ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3729ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_INPUT
3730ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlGenericError(xmlGenericErrorContext,
3731ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    "I/O: flushed %d chars\n", ret);
3732ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
3733ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(ret);
3734ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
3735ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif /* LIBXML_OUTPUT_ENABLED */
3736ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3737ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
3738ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlParserGetDirectory:
3739ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @filename:  the path to a file
3740ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
3741ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * lookup the directory for that file
3742ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
3743ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns a new allocated string containing the directory, or NULL.
3744ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
3745ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectchar *
3746ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlParserGetDirectory(const char *filename) {
3747ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    char *ret = NULL;
3748ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    char dir[1024];
3749ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    char *cur;
3750ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3751ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef _WIN32_WCE  /* easy way by now ... wince does not have dirs! */
3752ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return NULL;
3753ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
3754ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3755ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (xmlInputCallbackInitialized == 0)
3756ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlRegisterDefaultInputCallbacks();
3757ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3758ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (filename == NULL) return(NULL);
3759ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3760ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#if defined(WIN32) && !defined(__CYGWIN__)
3761ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#   define IS_XMLPGD_SEP(ch) ((ch=='/')||(ch=='\\'))
3762ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#else
3763ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#   define IS_XMLPGD_SEP(ch) (ch=='/')
3764ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
3765ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3766ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    strncpy(dir, filename, 1023);
3767ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    dir[1023] = 0;
3768ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    cur = &dir[strlen(dir)];
3769ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    while (cur > dir) {
3770ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project         if (IS_XMLPGD_SEP(*cur)) break;
3771ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	 cur --;
3772ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
3773ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (IS_XMLPGD_SEP(*cur)) {
3774ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (cur == dir) dir[1] = 0;
3775ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	else *cur = 0;
3776ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ret = xmlMemStrdup(dir);
3777ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else {
3778ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (getcwd(dir, 1024) != NULL) {
3779ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    dir[1023] = 0;
3780ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ret = xmlMemStrdup(dir);
3781ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
3782ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
3783ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(ret);
3784ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#undef IS_XMLPGD_SEP
3785ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
3786ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3787ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/****************************************************************
3788ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *								*
3789ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *		External entities loading			*
3790ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *								*
3791ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ****************************************************************/
3792ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3793ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
3794ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlCheckHTTPInput:
3795ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: an XML parser context
3796ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ret: an XML parser input
3797ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
3798ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Check an input in case it was created from an HTTP stream, in that
3799ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * case it will handle encoding and update of the base URL in case of
3800ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * redirection. It also checks for HTTP errors in which case the input
3801ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * is cleanly freed up and an appropriate error is raised in context
3802ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
3803ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the input or NULL in case of HTTP error.
3804ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
3805ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlParserInputPtr
3806ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlCheckHTTPInput(xmlParserCtxtPtr ctxt, xmlParserInputPtr ret) {
3807ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef LIBXML_HTTP_ENABLED
3808ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((ret != NULL) && (ret->buf != NULL) &&
3809ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        (ret->buf->readcallback == xmlIOHTTPRead) &&
3810ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        (ret->buf->context != NULL)) {
3811ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        const char *encoding;
3812ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        const char *redir;
3813ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        const char *mime;
3814ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        int code;
3815ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3816ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        code = xmlNanoHTTPReturnCode(ret->buf->context);
3817ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (code >= 400) {
3818ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            /* fatal error */
3819ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (ret->filename != NULL)
3820ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		__xmlLoaderErr(ctxt, "failed to load HTTP resource \"%s\"\n",
3821ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                         (const char *) ret->filename);
3822ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    else
3823ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		__xmlLoaderErr(ctxt, "failed to load HTTP resource\n", NULL);
3824ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            xmlFreeInputStream(ret);
3825ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            ret = NULL;
3826ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        } else {
3827ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3828ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            mime = xmlNanoHTTPMimeType(ret->buf->context);
3829ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if ((xmlStrstr(BAD_CAST mime, BAD_CAST "/xml")) ||
3830ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                (xmlStrstr(BAD_CAST mime, BAD_CAST "+xml"))) {
3831ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                encoding = xmlNanoHTTPEncoding(ret->buf->context);
3832ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                if (encoding != NULL) {
3833ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    xmlCharEncodingHandlerPtr handler;
3834ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3835ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    handler = xmlFindCharEncodingHandler(encoding);
3836ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    if (handler != NULL) {
3837ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        xmlSwitchInputEncoding(ctxt, ret, handler);
3838ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    } else {
3839ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        __xmlErrEncoding(ctxt, XML_ERR_UNKNOWN_ENCODING,
3840ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                         "Unknown encoding %s",
3841ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                         BAD_CAST encoding, NULL);
3842ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    }
3843ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    if (ret->encoding == NULL)
3844ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        ret->encoding = xmlStrdup(BAD_CAST encoding);
3845ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                }
3846ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#if 0
3847ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            } else if (xmlStrstr(BAD_CAST mime, BAD_CAST "html")) {
3848ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
3849ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
3850ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            redir = xmlNanoHTTPRedir(ret->buf->context);
3851ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (redir != NULL) {
3852ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                if (ret->filename != NULL)
3853ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    xmlFree((xmlChar *) ret->filename);
3854ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                if (ret->directory != NULL) {
3855ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    xmlFree((xmlChar *) ret->directory);
3856ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    ret->directory = NULL;
3857ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                }
3858ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                ret->filename =
3859ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    (char *) xmlStrdup((const xmlChar *) redir);
3860ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
3861ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
3862ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
3863ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
3864ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(ret);
3865ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
3866ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3867ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int xmlNoNetExists(const char *URL) {
3868ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    const char *path;
3869ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3870ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (URL == NULL)
3871ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(0);
3872ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3873ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (!xmlStrncasecmp(BAD_CAST URL, BAD_CAST "file://localhost/", 17))
3874ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#if defined (_WIN32) || defined (__DJGPP__) && !defined(__CYGWIN__)
3875ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	path = &URL[17];
3876ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#else
3877ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	path = &URL[16];
3878ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
3879ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    else if (!xmlStrncasecmp(BAD_CAST URL, BAD_CAST "file:///", 8)) {
3880ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#if defined (_WIN32) || defined (__DJGPP__) && !defined(__CYGWIN__)
3881ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	path = &URL[8];
3882ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#else
3883ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	path = &URL[7];
3884ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
3885df143a5041f03a22808b59c76698770b74692815Selim Gurun    } else
3886ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	path = URL;
3887df143a5041f03a22808b59c76698770b74692815Selim Gurun
3888ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return xmlCheckFilename(path);
3889ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
3890ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3891ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef LIBXML_CATALOG_ENABLED
3892ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3893ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
3894ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlResolveResourceFromCatalog:
3895ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @URL:  the URL for the entity to load
3896ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ID:  the System ID for the entity to load
3897ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  the context in which the entity is called or NULL
3898ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
3899ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Resolves the URL and ID against the appropriate catalog.
3900ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * This function is used by xmlDefaultExternalEntityLoader and
3901ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlNoNetExternalEntityLoader.
3902ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
3903ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns a new allocated URL, or NULL.
3904ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
3905ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlChar *
3906ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlResolveResourceFromCatalog(const char *URL, const char *ID,
3907ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                              xmlParserCtxtPtr ctxt) {
3908ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlChar *resource = NULL;
3909ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlCatalogAllow pref;
3910ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3911ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
3912ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     * If the resource doesn't exists as a file,
3913ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     * try to load it from the resource pointed in the catalogs
3914ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     */
3915ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    pref = xmlCatalogGetDefaults();
3916ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3917ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((pref != XML_CATA_ALLOW_NONE) && (!xmlNoNetExists(URL))) {
3918ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
3919ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	 * Do a local lookup
3920ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	 */
3921ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if ((ctxt != NULL) && (ctxt->catalogs != NULL) &&
3922ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ((pref == XML_CATA_ALLOW_ALL) ||
3923ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	     (pref == XML_CATA_ALLOW_DOCUMENT))) {
3924ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    resource = xmlCatalogLocalResolve(ctxt->catalogs,
3925ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project					      (const xmlChar *)ID,
3926ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project					      (const xmlChar *)URL);
3927ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
3928ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
3929ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	 * Try a global lookup
3930ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	 */
3931ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if ((resource == NULL) &&
3932ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ((pref == XML_CATA_ALLOW_ALL) ||
3933ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	     (pref == XML_CATA_ALLOW_GLOBAL))) {
3934ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    resource = xmlCatalogResolve((const xmlChar *)ID,
3935ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project					 (const xmlChar *)URL);
3936ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
3937ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if ((resource == NULL) && (URL != NULL))
3938ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    resource = xmlStrdup((const xmlChar *) URL);
3939ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3940ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
3941ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	 * TODO: do an URI lookup on the reference
3942ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	 */
3943ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if ((resource != NULL) && (!xmlNoNetExists((const char *)resource))) {
3944ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlChar *tmp = NULL;
3945ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3946ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if ((ctxt != NULL) && (ctxt->catalogs != NULL) &&
3947ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		((pref == XML_CATA_ALLOW_ALL) ||
3948ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		 (pref == XML_CATA_ALLOW_DOCUMENT))) {
3949ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		tmp = xmlCatalogLocalResolveURI(ctxt->catalogs, resource);
3950ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
3951ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if ((tmp == NULL) &&
3952ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		((pref == XML_CATA_ALLOW_ALL) ||
3953ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	         (pref == XML_CATA_ALLOW_GLOBAL))) {
3954ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		tmp = xmlCatalogResolveURI(resource);
3955ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
3956ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3957ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (tmp != NULL) {
3958ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlFree(resource);
3959ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		resource = tmp;
3960ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
3961ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
3962ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
3963ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3964ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return resource;
3965ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
3966ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3967ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
3968ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3969ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
3970ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlDefaultExternalEntityLoader:
3971ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @URL:  the URL for the entity to load
3972ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ID:  the System ID for the entity to load
3973ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  the context in which the entity is called or NULL
3974ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
3975ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * By default we don't load external entitites, yet.
3976ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
3977ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns a new allocated xmlParserInputPtr, or NULL.
3978ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
3979ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlParserInputPtr
3980ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlDefaultExternalEntityLoader(const char *URL, const char *ID,
3981ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                               xmlParserCtxtPtr ctxt)
3982ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
3983ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlParserInputPtr ret = NULL;
3984ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlChar *resource = NULL;
3985ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3986ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_EXTERNAL_ENTITIES
3987ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlGenericError(xmlGenericErrorContext,
3988ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    "xmlDefaultExternalEntityLoader(%s, xxx)\n", URL);
3989ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
3990ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((ctxt != NULL) && (ctxt->options & XML_PARSE_NONET)) {
3991ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        int options = ctxt->options;
3992ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3993ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ctxt->options -= XML_PARSE_NONET;
3994ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ret = xmlNoNetExternalEntityLoader(URL, ID, ctxt);
3995ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ctxt->options = options;
3996ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(ret);
3997ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
3998ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef LIBXML_CATALOG_ENABLED
3999ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    resource = xmlResolveResourceFromCatalog(URL, ID, ctxt);
4000ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
4001ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4002ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (resource == NULL)
4003ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        resource = (xmlChar *) URL;
4004ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4005ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (resource == NULL) {
4006ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (ID == NULL)
4007ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            ID = "NULL";
4008ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        __xmlLoaderErr(ctxt, "failed to load external entity \"%s\"\n", ID);
4009ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (NULL);
4010ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
4011ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret = xmlNewInputFromFile(ctxt, (const char *) resource);
4012ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((resource != NULL) && (resource != (xmlChar *) URL))
4013ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlFree(resource);
4014ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (ret);
4015ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
4016ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4017ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlExternalEntityLoader xmlCurrentExternalEntityLoader =
4018ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project       xmlDefaultExternalEntityLoader;
4019ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4020ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
4021ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSetExternalEntityLoader:
4022ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @f:  the new entity resolver function
4023ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
4024ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Changes the defaultexternal entity resolver function for the application
4025ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
4026ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid
4027ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSetExternalEntityLoader(xmlExternalEntityLoader f) {
4028ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlCurrentExternalEntityLoader = f;
4029ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
4030ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4031ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
4032ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlGetExternalEntityLoader:
4033ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
4034ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Get the default external entity resolver function for the application
4035ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
4036ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the xmlExternalEntityLoader function pointer
4037ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
4038ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlExternalEntityLoader
4039ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlGetExternalEntityLoader(void) {
4040ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(xmlCurrentExternalEntityLoader);
4041ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
4042ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4043ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
4044ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlLoadExternalEntity:
4045ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @URL:  the URL for the entity to load
4046ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ID:  the Public ID for the entity to load
4047ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  the context in which the entity is called or NULL
4048ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
4049ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Load an external entity, note that the use of this function for
4050ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * unparsed entities may generate problems
4051ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
4052ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the xmlParserInputPtr or NULL
4053ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
4054ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlParserInputPtr
4055ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlLoadExternalEntity(const char *URL, const char *ID,
4056ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                      xmlParserCtxtPtr ctxt) {
4057ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((URL != NULL) && (xmlNoNetExists(URL) == 0)) {
4058ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	char *canonicFilename;
4059ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlParserInputPtr ret;
4060ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4061ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	canonicFilename = (char *) xmlCanonicPath((const xmlChar *) URL);
4062ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (canonicFilename == NULL) {
4063ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            xmlIOErrMemory("building canonical path\n");
4064ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(NULL);
4065ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
4066ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4067ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ret = xmlCurrentExternalEntityLoader(canonicFilename, ID, ctxt);
4068ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlFree(canonicFilename);
4069ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(ret);
4070ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
4071ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(xmlCurrentExternalEntityLoader(URL, ID, ctxt));
4072ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
4073ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4074ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/************************************************************************
4075df143a5041f03a22808b59c76698770b74692815Selim Gurun *									*
4076df143a5041f03a22808b59c76698770b74692815Selim Gurun *		Disabling Network access				*
4077df143a5041f03a22808b59c76698770b74692815Selim Gurun *									*
4078ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ************************************************************************/
4079ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4080ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
4081ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlNoNetExternalEntityLoader:
4082ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @URL:  the URL for the entity to load
4083ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ID:  the System ID for the entity to load
4084ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  the context in which the entity is called or NULL
4085ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
4086ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * A specific entity loader disabling network accesses, though still
4087ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * allowing local catalog accesses for resolution.
4088ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
4089ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns a new allocated xmlParserInputPtr, or NULL.
4090ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
4091ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlParserInputPtr
4092ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlNoNetExternalEntityLoader(const char *URL, const char *ID,
4093ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                             xmlParserCtxtPtr ctxt) {
4094ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlParserInputPtr input = NULL;
4095ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlChar *resource = NULL;
4096ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4097ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef LIBXML_CATALOG_ENABLED
4098ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    resource = xmlResolveResourceFromCatalog(URL, ID, ctxt);
4099ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
4100ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4101ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (resource == NULL)
4102ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	resource = (xmlChar *) URL;
4103ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4104ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (resource != NULL) {
4105ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if ((!xmlStrncasecmp(BAD_CAST resource, BAD_CAST "ftp://", 6)) ||
4106ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            (!xmlStrncasecmp(BAD_CAST resource, BAD_CAST "http://", 7))) {
4107ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            xmlIOErr(XML_IO_NETWORK_ATTEMPT, (const char *) resource);
4108ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (resource != (xmlChar *) URL)
4109ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlFree(resource);
4110ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(NULL);
4111ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
4112ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
4113ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    input = xmlDefaultExternalEntityLoader((const char *) resource, ID, ctxt);
4114ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (resource != (xmlChar *) URL)
4115ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlFree(resource);
4116ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(input);
4117ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
4118ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4119ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define bottom_xmlIO
4120ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#include "elfgcchack.h"
4121