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