38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync/*
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * xmlIO.c : implementation of the I/O interfaces used by the parser
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync *
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * See Copyright for the status of this software.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync *
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * daniel@veillard.com
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync *
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * 14 Nov 2000 ht - for VMS, truncated name of long functions to under 32 char
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#define IN_LIBXML
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#include "libxml.h"
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#include <string.h>
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#ifdef HAVE_ERRNO_H
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#include <errno.h>
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#endif
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#ifdef HAVE_SYS_TYPES_H
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#include <sys/types.h>
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#endif
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#ifdef HAVE_SYS_STAT_H
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#include <sys/stat.h>
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#endif
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#ifdef HAVE_FCNTL_H
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#include <fcntl.h>
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#endif
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#ifdef HAVE_UNISTD_H
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#include <unistd.h>
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#endif
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#ifdef HAVE_STDLIB_H
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#include <stdlib.h>
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#endif
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#ifdef HAVE_ZLIB_H
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#include <zlib.h>
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#endif
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#if defined(WIN32) || defined(_WIN32)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#include <windows.h>
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#endif
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#if defined(_WIN32_WCE)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#include <winnls.h> /* for CP_UTF8 */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#endif
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync/* Figure a portable way to know if a file is a directory. */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#ifndef HAVE_STAT
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync# ifdef HAVE__STAT
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync /* MS C library seems to define stat and _stat. The definition
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync is identical. Still, mapping them to each other causes a warning. */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync# ifndef _MSC_VER
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync# define stat(x,y) _stat(x,y)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync# endif
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync# define HAVE_STAT
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync# endif
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#else
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync# ifdef HAVE__STAT
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync# if defined(_WIN32) || defined (__DJGPP__) && !defined (__CYGWIN__)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync# define stat _stat
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync# endif
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync# endif
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#endif
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#ifdef HAVE_STAT
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync# ifndef S_ISDIR
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync# ifdef _S_ISDIR
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync# define S_ISDIR(x) _S_ISDIR(x)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync# else
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync# ifdef S_IFDIR
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync# ifndef S_IFMT
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync# ifdef _S_IFMT
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync# define S_IFMT _S_IFMT
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync# endif
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync# endif
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync# ifdef S_IFMT
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync# define S_ISDIR(m) (((m) & S_IFMT) == S_IFDIR)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync# endif
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync# endif
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync# endif
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync# endif
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#endif
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#include <libxml/xmlmemory.h>
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#include <libxml/parser.h>
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#include <libxml/parserInternals.h>
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#include <libxml/xmlIO.h>
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#include <libxml/uri.h>
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#include <libxml/nanohttp.h>
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#include <libxml/nanoftp.h>
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#include <libxml/xmlerror.h>
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#ifdef LIBXML_CATALOG_ENABLED
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#include <libxml/catalog.h>
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#endif
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#include <libxml/globals.h>
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync/* #define VERBOSE_FAILURE */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync/* #define DEBUG_EXTERNAL_ENTITIES */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync/* #define DEBUG_INPUT */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#ifdef DEBUG_INPUT
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#define MINLEN 40
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#else
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#define MINLEN 4000
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#endif
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync/*
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Input I/O callback sets
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsynctypedef struct _xmlInputCallback {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlInputMatchCallback matchcallback;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlInputOpenCallback opencallback;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlInputReadCallback readcallback;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlInputCloseCallback closecallback;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync} xmlInputCallback;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#define MAX_INPUT_CALLBACK 15
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncstatic xmlInputCallback xmlInputCallbackTable[MAX_INPUT_CALLBACK];
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncstatic int xmlInputCallbackNr = 0;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncstatic int xmlInputCallbackInitialized = 0;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#ifdef LIBXML_OUTPUT_ENABLED
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync/*
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Output I/O callback sets
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsynctypedef struct _xmlOutputCallback {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlOutputMatchCallback matchcallback;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlOutputOpenCallback opencallback;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlOutputWriteCallback writecallback;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlOutputCloseCallback closecallback;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync} xmlOutputCallback;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#define MAX_OUTPUT_CALLBACK 15
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncstatic xmlOutputCallback xmlOutputCallbackTable[MAX_OUTPUT_CALLBACK];
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncstatic int xmlOutputCallbackNr = 0;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncstatic int xmlOutputCallbackInitialized = 0;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#endif /* LIBXML_OUTPUT_ENABLED */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync/************************************************************************
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * *
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Tree memory error handler *
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * *
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync ************************************************************************/
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncstatic const char *IOerr[] = {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync "Unknown IO error", /* UNKNOWN */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync "Permission denied", /* EACCES */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync "Resource temporarily unavailable",/* EAGAIN */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync "Bad file descriptor", /* EBADF */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync "Bad message", /* EBADMSG */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync "Resource busy", /* EBUSY */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync "Operation canceled", /* ECANCELED */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync "No child processes", /* ECHILD */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync "Resource deadlock avoided",/* EDEADLK */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync "Domain error", /* EDOM */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync "File exists", /* EEXIST */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync "Bad address", /* EFAULT */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync "File too large", /* EFBIG */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync "Operation in progress", /* EINPROGRESS */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync "Interrupted function call",/* EINTR */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync "Invalid argument", /* EINVAL */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync "Input/output error", /* EIO */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync "Is a directory", /* EISDIR */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync "Too many open files", /* EMFILE */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync "Too many links", /* EMLINK */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync "Inappropriate message buffer length",/* EMSGSIZE */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync "Filename too long", /* ENAMETOOLONG */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync "Too many open files in system",/* ENFILE */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync "No such device", /* ENODEV */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync "No such file or directory",/* ENOENT */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync "Exec format error", /* ENOEXEC */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync "No locks available", /* ENOLCK */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync "Not enough space", /* ENOMEM */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync "No space left on device", /* ENOSPC */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync "Function not implemented", /* ENOSYS */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync "Not a directory", /* ENOTDIR */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync "Directory not empty", /* ENOTEMPTY */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync "Not supported", /* ENOTSUP */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync "Inappropriate I/O control operation",/* ENOTTY */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync "No such device or address",/* ENXIO */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync "Operation not permitted", /* EPERM */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync "Broken pipe", /* EPIPE */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync "Result too large", /* ERANGE */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync "Read-only file system", /* EROFS */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync "Invalid seek", /* ESPIPE */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync "No such process", /* ESRCH */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync "Operation timed out", /* ETIMEDOUT */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync "Improper link", /* EXDEV */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync "Attempt to load network entity %s", /* XML_IO_NETWORK_ATTEMPT */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync "encoder error", /* XML_IO_ENCODER */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync "flush error",
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync "write error",
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync "no input",
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync "buffer full",
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync "loading error",
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync "not a socket", /* ENOTSOCK */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync "already connected", /* EISCONN */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync "connection refused", /* ECONNREFUSED */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync "unreachable network", /* ENETUNREACH */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync "adddress in use", /* EADDRINUSE */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync "already in use", /* EALREADY */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync "unknown address familly", /* EAFNOSUPPORT */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync};
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#if defined(_WIN32) || defined (__DJGPP__) && !defined (__CYGWIN__)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync/**
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * __xmlIOWin32UTF8ToWChar:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @u8String: uft-8 string
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync *
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Convert a string from utf-8 to wchar (WINDOWS ONLY!)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncstatic wchar_t *
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync__xmlIOWin32UTF8ToWChar(const char *u8String)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync{
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync wchar_t *wString = NULL;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (u8String) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync int wLen =
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync MultiByteToWideChar(CP_UTF8, MB_ERR_INVALID_CHARS, u8String,
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync -1, NULL, 0);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (wLen) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync wString = xmlMalloc(wLen * sizeof(wchar_t));
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (wString) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (MultiByteToWideChar
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync (CP_UTF8, 0, u8String, -1, wString, wLen) == 0) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlFree(wString);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync wString = NULL;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return wString;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync}
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#endif
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync/**
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * xmlIOErrMemory:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @extra: extra informations
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync *
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Handle an out of memory condition
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncstatic void
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncxmlIOErrMemory(const char *extra)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync{
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync __xmlSimpleError(XML_FROM_IO, XML_ERR_NO_MEMORY, NULL, NULL, extra);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync}
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync/**
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * __xmlIOErr:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @code: the error number
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @extra: extra informations
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync *
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Handle an I/O error
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncvoid
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync__xmlIOErr(int domain, int code, const char *extra)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync{
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync unsigned int idx;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (code == 0) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#ifdef HAVE_ERRNO_H
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (errno == 0) code = 0;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#ifdef EACCES
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync else if (errno == EACCES) code = XML_IO_EACCES;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#endif
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#ifdef EAGAIN
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync else if (errno == EAGAIN) code = XML_IO_EAGAIN;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#endif
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#ifdef EBADF
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync else if (errno == EBADF) code = XML_IO_EBADF;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#endif
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#ifdef EBADMSG
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync else if (errno == EBADMSG) code = XML_IO_EBADMSG;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#endif
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#ifdef EBUSY
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync else if (errno == EBUSY) code = XML_IO_EBUSY;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#endif
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#ifdef ECANCELED
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync else if (errno == ECANCELED) code = XML_IO_ECANCELED;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#endif
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#ifdef ECHILD
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync else if (errno == ECHILD) code = XML_IO_ECHILD;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#endif
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#ifdef EDEADLK
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync else if (errno == EDEADLK) code = XML_IO_EDEADLK;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#endif
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#ifdef EDOM
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync else if (errno == EDOM) code = XML_IO_EDOM;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#endif
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#ifdef EEXIST
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync else if (errno == EEXIST) code = XML_IO_EEXIST;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#endif
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#ifdef EFAULT
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync else if (errno == EFAULT) code = XML_IO_EFAULT;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#endif
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#ifdef EFBIG
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync else if (errno == EFBIG) code = XML_IO_EFBIG;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#endif
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#ifdef EINPROGRESS
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync else if (errno == EINPROGRESS) code = XML_IO_EINPROGRESS;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#endif
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#ifdef EINTR
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync else if (errno == EINTR) code = XML_IO_EINTR;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#endif
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#ifdef EINVAL
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync else if (errno == EINVAL) code = XML_IO_EINVAL;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#endif
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#ifdef EIO
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync else if (errno == EIO) code = XML_IO_EIO;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#endif
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#ifdef EISDIR
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync else if (errno == EISDIR) code = XML_IO_EISDIR;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#endif
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#ifdef EMFILE
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync else if (errno == EMFILE) code = XML_IO_EMFILE;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#endif
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#ifdef EMLINK
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync else if (errno == EMLINK) code = XML_IO_EMLINK;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#endif
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#ifdef EMSGSIZE
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync else if (errno == EMSGSIZE) code = XML_IO_EMSGSIZE;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#endif
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#ifdef ENAMETOOLONG
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync else if (errno == ENAMETOOLONG) code = XML_IO_ENAMETOOLONG;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#endif
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#ifdef ENFILE
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync else if (errno == ENFILE) code = XML_IO_ENFILE;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#endif
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#ifdef ENODEV
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync else if (errno == ENODEV) code = XML_IO_ENODEV;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#endif
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#ifdef ENOENT
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync else if (errno == ENOENT) code = XML_IO_ENOENT;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#endif
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#ifdef ENOEXEC
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync else if (errno == ENOEXEC) code = XML_IO_ENOEXEC;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#endif
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#ifdef ENOLCK
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync else if (errno == ENOLCK) code = XML_IO_ENOLCK;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#endif
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#ifdef ENOMEM
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync else if (errno == ENOMEM) code = XML_IO_ENOMEM;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#endif
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#ifdef ENOSPC
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync else if (errno == ENOSPC) code = XML_IO_ENOSPC;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#endif
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#ifdef ENOSYS
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync else if (errno == ENOSYS) code = XML_IO_ENOSYS;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#endif
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#ifdef ENOTDIR
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync else if (errno == ENOTDIR) code = XML_IO_ENOTDIR;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#endif
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#ifdef ENOTEMPTY
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync else if (errno == ENOTEMPTY) code = XML_IO_ENOTEMPTY;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#endif
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#ifdef ENOTSUP
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync else if (errno == ENOTSUP) code = XML_IO_ENOTSUP;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#endif
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#ifdef ENOTTY
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync else if (errno == ENOTTY) code = XML_IO_ENOTTY;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#endif
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#ifdef ENXIO
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync else if (errno == ENXIO) code = XML_IO_ENXIO;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#endif
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#ifdef EPERM
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync else if (errno == EPERM) code = XML_IO_EPERM;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#endif
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#ifdef EPIPE
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync else if (errno == EPIPE) code = XML_IO_EPIPE;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#endif
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#ifdef ERANGE
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync else if (errno == ERANGE) code = XML_IO_ERANGE;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#endif
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#ifdef EROFS
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync else if (errno == EROFS) code = XML_IO_EROFS;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#endif
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#ifdef ESPIPE
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync else if (errno == ESPIPE) code = XML_IO_ESPIPE;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#endif
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#ifdef ESRCH
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync else if (errno == ESRCH) code = XML_IO_ESRCH;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#endif
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#ifdef ETIMEDOUT
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync else if (errno == ETIMEDOUT) code = XML_IO_ETIMEDOUT;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#endif
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#ifdef EXDEV
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync else if (errno == EXDEV) code = XML_IO_EXDEV;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#endif
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#ifdef ENOTSOCK
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync else if (errno == ENOTSOCK) code = XML_IO_ENOTSOCK;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#endif
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#ifdef EISCONN
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync else if (errno == EISCONN) code = XML_IO_EISCONN;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#endif
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#ifdef ECONNREFUSED
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync else if (errno == ECONNREFUSED) code = XML_IO_ECONNREFUSED;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#endif
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#ifdef ETIMEDOUT
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync else if (errno == ETIMEDOUT) code = XML_IO_ETIMEDOUT;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#endif
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#ifdef ENETUNREACH
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync else if (errno == ENETUNREACH) code = XML_IO_ENETUNREACH;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#endif
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#ifdef EADDRINUSE
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync else if (errno == EADDRINUSE) code = XML_IO_EADDRINUSE;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#endif
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#ifdef EINPROGRESS
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync else if (errno == EINPROGRESS) code = XML_IO_EINPROGRESS;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#endif
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#ifdef EALREADY
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync else if (errno == EALREADY) code = XML_IO_EALREADY;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#endif
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#ifdef EAFNOSUPPORT
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync else if (errno == EAFNOSUPPORT) code = XML_IO_EAFNOSUPPORT;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#endif
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync else code = XML_IO_UNKNOWN;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#endif /* HAVE_ERRNO_H */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync idx = 0;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (code >= XML_IO_UNKNOWN) idx = code - XML_IO_UNKNOWN;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (idx >= (sizeof(IOerr) / sizeof(IOerr[0]))) idx = 0;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync __xmlSimpleError(domain, code, NULL, IOerr[idx], extra);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync}
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync/**
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * xmlIOErr:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @code: the error number
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @extra: extra informations
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync *
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Handle an I/O error
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncstatic void
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncxmlIOErr(int code, const char *extra)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync{
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync __xmlIOErr(XML_FROM_IO, code, extra);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync}
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync/**
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * __xmlLoaderErr:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @ctx: the parser context
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @extra: extra informations
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync *
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Handle a resource access error
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncvoid
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync__xmlLoaderErr(void *ctx, const char *msg, const char *filename)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync{
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlParserCtxtPtr ctxt = (xmlParserCtxtPtr) ctx;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlStructuredErrorFunc schannel = NULL;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlGenericErrorFunc channel = NULL;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync void *data = NULL;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlErrorLevel level = XML_ERR_ERROR;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if ((ctxt != NULL) && (ctxt->disableSAX != 0) &&
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync (ctxt->instate == XML_PARSER_EOF))
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if ((ctxt != NULL) && (ctxt->sax != NULL)) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (ctxt->validate) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync channel = ctxt->sax->error;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync level = XML_ERR_ERROR;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync } else {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync channel = ctxt->sax->warning;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync level = XML_ERR_WARNING;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (ctxt->sax->initialized == XML_SAX2_MAGIC)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync schannel = ctxt->sax->serror;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync data = ctxt->userData;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync __xmlRaiseError(schannel, channel, data, ctxt, NULL, XML_FROM_IO,
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync XML_IO_LOAD_ERROR, level, NULL, 0,
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync filename, NULL, NULL, 0, 0,
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync msg, filename);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync}
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync/************************************************************************
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * *
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Tree memory error handler *
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * *
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync ************************************************************************/
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync/**
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * xmlNormalizeWindowsPath:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @path: the input file path
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync *
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * This function is obsolete. Please see xmlURIFromPath in uri.c for
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * a better solution.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync *
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Returns a canonicalized version of the path
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncxmlChar *
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncxmlNormalizeWindowsPath(const xmlChar *path)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync{
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return xmlCanonicPath(path);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync}
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync/**
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * xmlCleanupInputCallbacks:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync *
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * clears the entire input callback table. this includes the
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * compiled-in I/O.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncvoid
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncxmlCleanupInputCallbacks(void)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync{
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync int i;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (!xmlInputCallbackInitialized)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync for (i = xmlInputCallbackNr - 1; i >= 0; i--) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlInputCallbackTable[i].matchcallback = NULL;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlInputCallbackTable[i].opencallback = NULL;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlInputCallbackTable[i].readcallback = NULL;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlInputCallbackTable[i].closecallback = NULL;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlInputCallbackNr = 0;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlInputCallbackInitialized = 0;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync}
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync/**
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * xmlPopInputCallbacks:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync *
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Clear the top input callback from the input stack. this includes the
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * compiled-in I/O.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync *
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Returns the number of input callback registered or -1 in case of error.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncint
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncxmlPopInputCallbacks(void)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync{
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (!xmlInputCallbackInitialized)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return(-1);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (xmlInputCallbackNr <= 0)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return(-1);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlInputCallbackNr--;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlInputCallbackTable[xmlInputCallbackNr].matchcallback = NULL;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlInputCallbackTable[xmlInputCallbackNr].opencallback = NULL;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlInputCallbackTable[xmlInputCallbackNr].readcallback = NULL;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlInputCallbackTable[xmlInputCallbackNr].closecallback = NULL;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return(xmlInputCallbackNr);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync}
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#ifdef LIBXML_OUTPUT_ENABLED
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync/**
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * xmlCleanupOutputCallbacks:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync *
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * clears the entire output callback table. this includes the
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * compiled-in I/O callbacks.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncvoid
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncxmlCleanupOutputCallbacks(void)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync{
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync int i;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (!xmlOutputCallbackInitialized)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync for (i = xmlOutputCallbackNr - 1; i >= 0; i--) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlOutputCallbackTable[i].matchcallback = NULL;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlOutputCallbackTable[i].opencallback = NULL;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlOutputCallbackTable[i].writecallback = NULL;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlOutputCallbackTable[i].closecallback = NULL;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlOutputCallbackNr = 0;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlOutputCallbackInitialized = 0;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync}
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#endif /* LIBXML_OUTPUT_ENABLED */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync/************************************************************************
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * *
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Standard I/O for file accesses *
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * *
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync ************************************************************************/
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#if defined(_WIN32) || defined (__DJGPP__) && !defined (__CYGWIN__)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync/**
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * xmlWrapOpenUtf8:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @path: the path in utf-8 encoding
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @mode: type of access (0 - read, 1 - write)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync *
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * function opens the file specified by @path
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync *
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncstatic FILE*
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncxmlWrapOpenUtf8(const char *path,int mode)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync{
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync FILE *fd = NULL;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync wchar_t *wPath;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync wPath = __xmlIOWin32UTF8ToWChar(path);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if(wPath)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync fd = _wfopen(wPath, mode ? L"wb" : L"rb");
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlFree(wPath);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync /* maybe path in native encoding */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if(fd == NULL)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync fd = fopen(path, mode ? "wb" : "rb");
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return fd;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync}
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync/**
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * xmlWrapStatUtf8:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @path: the path in utf-8 encoding
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @info: structure that stores results
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync *
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * function obtains information about the file or directory
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync *
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncstatic int
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncxmlWrapStatUtf8(const char *path,struct stat *info)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync{
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#ifdef HAVE_STAT
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync int retval = -1;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync wchar_t *wPath;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync wPath = __xmlIOWin32UTF8ToWChar(path);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (wPath)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync retval = _wstat(wPath,info);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlFree(wPath);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync /* maybe path in native encoding */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if(retval < 0)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync retval = stat(path,info);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return retval;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#else
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return -1;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#endif
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync}
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync/**
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * xmlWrapOpenNative:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @path: the path
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @mode: type of access (0 - read, 1 - write)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync *
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * function opens the file specified by @path
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync *
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncstatic FILE*
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncxmlWrapOpenNative(const char *path,int mode)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync{
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return fopen(path,mode ? "wb" : "rb");
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync}
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync/**
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * xmlWrapStatNative:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @path: the path
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @info: structure that stores results
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync *
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * function obtains information about the file or directory
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync *
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncstatic int
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncxmlWrapStatNative(const char *path,struct stat *info)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync{
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#ifdef HAVE_STAT
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return stat(path,info);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#else
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return -1;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#endif
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync}
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsynctypedef int (* xmlWrapStatFunc) (const char *f, struct stat *s);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncstatic xmlWrapStatFunc xmlWrapStat = xmlWrapStatNative;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsynctypedef FILE* (* xmlWrapOpenFunc)(const char *f,int mode);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncstatic xmlWrapOpenFunc xmlWrapOpen = xmlWrapOpenNative;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync/**
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * xmlInitPlatformSpecificIo:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync *
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Initialize platform specific features.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncstatic void
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncxmlInitPlatformSpecificIo(void)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync{
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync static int xmlPlatformIoInitialized = 0;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync OSVERSIONINFO osvi;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if(xmlPlatformIoInitialized)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync osvi.dwOSVersionInfoSize = sizeof(osvi);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if(GetVersionEx(&osvi) && (osvi.dwPlatformId == VER_PLATFORM_WIN32_NT)) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlWrapStat = xmlWrapStatUtf8;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlWrapOpen = xmlWrapOpenUtf8;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync } else {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlWrapStat = xmlWrapStatNative;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlWrapOpen = xmlWrapOpenNative;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlPlatformIoInitialized = 1;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync}
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#endif
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync/**
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * xmlCheckFilename:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @path: the path to check
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync *
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * function checks to see if @path is a valid source
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * (file, socket...) for XML.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync *
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * if stat is not available on the target machine,
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * returns 1. if stat fails, returns 0 (if calling
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * stat on the filename fails, it can't be right).
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * if stat succeeds and the file is a directory,
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * returns 2. otherwise returns 1.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncint
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncxmlCheckFilename (const char *path)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync{
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#ifdef HAVE_STAT
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync struct stat stat_buffer;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#endif
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (path == NULL)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return(0);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#ifdef HAVE_STAT
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#if defined(_WIN32) || defined (__DJGPP__) && !defined (__CYGWIN__)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (xmlWrapStat(path, &stat_buffer) == -1)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return 0;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#else
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (stat(path, &stat_buffer) == -1)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return 0;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#endif
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#ifdef S_ISDIR
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (S_ISDIR(stat_buffer.st_mode))
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return 2;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#endif
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#endif /* HAVE_STAT */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return 1;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync}
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncstatic int
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncxmlNop(void) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return(0);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync}
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync/**
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * xmlFdRead:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @context: the I/O context
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @buffer: where to drop data
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @len: number of bytes to read
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync *
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Read @len bytes to @buffer from the I/O channel.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync *
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Returns the number of bytes written
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncstatic int
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncxmlFdRead (void * context, char * buffer, int len) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync int ret;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync ret = read((int) (long) context, &buffer[0], len);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (ret < 0) xmlIOErr(0, "read()");
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return(ret);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync}
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#ifdef LIBXML_OUTPUT_ENABLED
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync/**
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * xmlFdWrite:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @context: the I/O context
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @buffer: where to get data
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @len: number of bytes to write
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync *
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Write @len bytes from @buffer to the I/O channel.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync *
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Returns the number of bytes written
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncstatic int
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncxmlFdWrite (void * context, const char * buffer, int len) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync int ret = 0;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (len > 0) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync ret = write((int) (long) context, &buffer[0], len);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (ret < 0) xmlIOErr(0, "write()");
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return(ret);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync}
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#endif /* LIBXML_OUTPUT_ENABLED */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync/**
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * xmlFdClose:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @context: the I/O context
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync *
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Close an I/O channel
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync *
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Returns 0 in case of success and error code otherwise
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncstatic int
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncxmlFdClose (void * context) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync int ret;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync ret = close((int) (long) context);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (ret < 0) xmlIOErr(0, "close()");
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return(ret);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync}
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync/**
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * xmlFileMatch:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @filename: the URI for matching
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync *
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * input from FILE *
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync *
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Returns 1 if matches, 0 otherwise
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncint
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncxmlFileMatch (const char *filename ATTRIBUTE_UNUSED) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return(1);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync}
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync/**
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * xmlFileOpen_real:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @filename: the URI for matching
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync *
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * input from FILE *, supports compressed input
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * if @filename is " " then the standard input is used
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync *
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Returns an I/O context or NULL in case of error
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncstatic void *
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncxmlFileOpen_real (const char *filename) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync const char *path = NULL;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync FILE *fd;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (filename == NULL)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return(NULL);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (!strcmp(filename, "-")) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync fd = stdin;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return((void *) fd);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (!xmlStrncasecmp(BAD_CAST filename, BAD_CAST "file://localhost/", 17)) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#if defined (_WIN32) || defined (__DJGPP__) && !defined(__CYGWIN__)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync path = &filename[17];
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#else
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync path = &filename[16];
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#endif
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync } else if (!xmlStrncasecmp(BAD_CAST filename, BAD_CAST "file:///", 8)) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#if defined (_WIN32) || defined (__DJGPP__) && !defined(__CYGWIN__)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync path = &filename[8];
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#else
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync path = &filename[7];
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#endif
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync } else if (!xmlStrncasecmp(BAD_CAST filename, BAD_CAST "file:/", 6)) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync /* lots of generators seems to lazy to read RFC 1738 */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#if defined (_WIN32) || defined (__DJGPP__) && !defined(__CYGWIN__)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync path = &filename[6];
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#else
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync path = &filename[5];
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#endif
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync } else
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync path = filename;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (path == NULL)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return(NULL);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (!xmlCheckFilename(path))
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return(NULL);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#if defined(_WIN32) || defined (__DJGPP__) && !defined (__CYGWIN__)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync fd = xmlWrapOpen(path, 0);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#else
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync fd = fopen(path, "r");
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#endif /* WIN32 */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (fd == NULL) xmlIOErr(0, path);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return((void *) fd);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync}
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync/**
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * xmlFileOpen:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @filename: the URI for matching
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync *
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Wrapper around xmlFileOpen_real that try it with an unescaped
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * version of @filename, if this fails fallback to @filename
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync *
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Returns a handler or NULL in case or failure
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncvoid *
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncxmlFileOpen (const char *filename) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync char *unescaped;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync void *retval;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync retval = xmlFileOpen_real(filename);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (retval == NULL) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync unescaped = xmlURIUnescapeString(filename, 0, NULL);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (unescaped != NULL) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync retval = xmlFileOpen_real(unescaped);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlFree(unescaped);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return retval;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync}
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#ifdef LIBXML_OUTPUT_ENABLED
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync/**
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * xmlFileOpenW:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @filename: the URI for matching
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync *
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * output to from FILE *,
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * if @filename is "-" then the standard output is used
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync *
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Returns an I/O context or NULL in case of error
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncstatic void *
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncxmlFileOpenW (const char *filename) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync const char *path = NULL;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync FILE *fd;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (!strcmp(filename, "-")) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync fd = stdout;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return((void *) fd);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (!xmlStrncasecmp(BAD_CAST filename, BAD_CAST "file://localhost/", 17))
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#if defined (_WIN32) || defined (__DJGPP__) && !defined(__CYGWIN__)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync path = &filename[17];
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#else
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync path = &filename[16];
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#endif
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync else if (!xmlStrncasecmp(BAD_CAST filename, BAD_CAST "file:///", 8)) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#if defined (_WIN32) || defined (__DJGPP__) && !defined(__CYGWIN__)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync path = &filename[8];
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#else
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync path = &filename[7];
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#endif
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync } else
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync path = filename;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (path == NULL)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return(NULL);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#if defined(_WIN32) || defined (__DJGPP__) && !defined (__CYGWIN__)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync fd = xmlWrapOpen(path, 1);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#else
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync fd = fopen(path, "wb");
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#endif /* WIN32 */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (fd == NULL) xmlIOErr(0, path);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return((void *) fd);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync}
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#endif /* LIBXML_OUTPUT_ENABLED */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync/**
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * xmlFileRead:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @context: the I/O context
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @buffer: where to drop data
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @len: number of bytes to write
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync *
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Read @len bytes to @buffer from the I/O channel.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync *
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Returns the number of bytes written or < 0 in case of failure
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncint
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncxmlFileRead (void * context, char * buffer, int len) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync int ret;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if ((context == NULL) || (buffer == NULL))
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return(-1);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync ret = fread(&buffer[0], 1, len, (FILE *) context);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (ret < 0) xmlIOErr(0, "fread()");
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return(ret);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync}
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#ifdef LIBXML_OUTPUT_ENABLED
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync/**
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * xmlFileWrite:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @context: the I/O context
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @buffer: where to drop data
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @len: number of bytes to write
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync *
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Write @len bytes from @buffer to the I/O channel.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync *
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Returns the number of bytes written
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncstatic int
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncxmlFileWrite (void * context, const char * buffer, int len) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync int items;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if ((context == NULL) || (buffer == NULL))
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return(-1);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync items = fwrite(&buffer[0], len, 1, (FILE *) context);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if ((items == 0) && (ferror((FILE *) context))) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlIOErr(0, "fwrite()");
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return(-1);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return(items * len);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync}
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#endif /* LIBXML_OUTPUT_ENABLED */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync/**
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * xmlFileClose:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @context: the I/O context
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync *
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Close an I/O channel
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync *
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Returns 0 or -1 in case of error
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncint
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncxmlFileClose (void * context) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync FILE *fil;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync int ret;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (context == NULL)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return(-1);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync fil = (FILE *) context;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if ((fil == stdout) || (fil == stderr)) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync ret = fflush(fil);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (ret < 0)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlIOErr(0, "fflush()");
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return(0);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (fil == stdin)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return(0);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync ret = ( fclose((FILE *) context) == EOF ) ? -1 : 0;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (ret < 0)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlIOErr(0, "fclose()");
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return(ret);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync}
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync/**
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * xmlFileFlush:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @context: the I/O context
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync *
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Flush an I/O channel
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncstatic int
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncxmlFileFlush (void * context) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync int ret;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (context == NULL)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return(-1);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync ret = ( fflush((FILE *) context) == EOF ) ? -1 : 0;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (ret < 0)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlIOErr(0, "fflush()");
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return(ret);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync}
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#ifdef LIBXML_OUTPUT_ENABLED
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync/**
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * xmlBufferWrite:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @context: the xmlBuffer
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @buffer: the data to write
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @len: number of bytes to write
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync *
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Write @len bytes from @buffer to the xml buffer
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync *
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Returns the number of bytes written
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncstatic int
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncxmlBufferWrite (void * context, const char * buffer, int len) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync int ret;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync ret = xmlBufferAdd((xmlBufferPtr) context, (const xmlChar *) buffer, len);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (ret != 0)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return(-1);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return(len);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync}
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#endif
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#ifdef HAVE_ZLIB_H
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync/************************************************************************
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * *
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * I/O for compressed file accesses *
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * *
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync ************************************************************************/
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync/**
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * xmlGzfileMatch:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @filename: the URI for matching
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync *
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * input from compressed file test
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync *
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Returns 1 if matches, 0 otherwise
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncstatic int
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncxmlGzfileMatch (const char *filename ATTRIBUTE_UNUSED) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return(1);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync}
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync/**
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * xmlGzfileOpen_real:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @filename: the URI for matching
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync *
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * input from compressed file open
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * if @filename is " " then the standard input is used
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync *
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Returns an I/O context or NULL in case of error
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncstatic void *
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncxmlGzfileOpen_real (const char *filename) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync const char *path = NULL;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync gzFile fd;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (!strcmp(filename, "-")) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync fd = gzdopen(dup(0), "rb");
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return((void *) fd);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (!xmlStrncasecmp(BAD_CAST filename, BAD_CAST "file://localhost/", 17))
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#if defined (_WIN32) || defined (__DJGPP__) && !defined(__CYGWIN__)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync path = &filename[17];
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#else
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync path = &filename[16];
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#endif
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync else if (!xmlStrncasecmp(BAD_CAST filename, BAD_CAST "file:///", 8)) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#if defined (_WIN32) || defined (__DJGPP__) && !defined(__CYGWIN__)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync path = &filename[8];
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#else
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync path = &filename[7];
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#endif
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync } else
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync path = filename;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (path == NULL)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return(NULL);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (!xmlCheckFilename(path))
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return(NULL);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync fd = gzopen(path, "rb");
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return((void *) fd);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync}
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync/**
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * xmlGzfileOpen:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @filename: the URI for matching
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync *
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Wrapper around xmlGzfileOpen if the open fais, it will
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * try to unescape @filename
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncstatic void *
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncxmlGzfileOpen (const char *filename) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync char *unescaped;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync void *retval;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync retval = xmlGzfileOpen_real(filename);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (retval == NULL) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync unescaped = xmlURIUnescapeString(filename, 0, NULL);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (unescaped != NULL) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync retval = xmlGzfileOpen_real(unescaped);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlFree(unescaped);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return retval;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync}
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#ifdef LIBXML_OUTPUT_ENABLED
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync/**
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * xmlGzfileOpenW:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @filename: the URI for matching
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @compression: the compression factor (0 - 9 included)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync *
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * input from compressed file open
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * if @filename is " " then the standard input is used
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync *
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Returns an I/O context or NULL in case of error
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncstatic void *
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncxmlGzfileOpenW (const char *filename, int compression) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync const char *path = NULL;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync char mode[15];
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync gzFile fd;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync snprintf(mode, sizeof(mode), "wb%d", compression);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (!strcmp(filename, "-")) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync fd = gzdopen(dup(1), mode);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return((void *) fd);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (!xmlStrncasecmp(BAD_CAST filename, BAD_CAST "file://localhost/", 17))
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#if defined (_WIN32) || defined (__DJGPP__) && !defined(__CYGWIN__)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync path = &filename[17];
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#else
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync path = &filename[16];
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#endif
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync else if (!xmlStrncasecmp(BAD_CAST filename, BAD_CAST "file:///", 8)) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#if defined (_WIN32) || defined (__DJGPP__) && !defined(__CYGWIN__)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync path = &filename[8];
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#else
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync path = &filename[7];
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#endif
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync } else
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync path = filename;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (path == NULL)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return(NULL);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync fd = gzopen(path, mode);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return((void *) fd);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync}
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#endif /* LIBXML_OUTPUT_ENABLED */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync/**
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * xmlGzfileRead:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @context: the I/O context
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @buffer: where to drop data
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @len: number of bytes to write
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync *
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Read @len bytes to @buffer from the compressed I/O channel.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync *
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Returns the number of bytes written
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncstatic int
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncxmlGzfileRead (void * context, char * buffer, int len) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync int ret;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync ret = gzread((gzFile) context, &buffer[0], len);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (ret < 0) xmlIOErr(0, "gzread()");
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return(ret);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync}
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#ifdef LIBXML_OUTPUT_ENABLED
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync/**
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * xmlGzfileWrite:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @context: the I/O context
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @buffer: where to drop data
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @len: number of bytes to write
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync *
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Write @len bytes from @buffer to the compressed I/O channel.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync *
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Returns the number of bytes written
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncstatic int
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncxmlGzfileWrite (void * context, const char * buffer, int len) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync int ret;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync ret = gzwrite((gzFile) context, (char *) &buffer[0], len);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (ret < 0) xmlIOErr(0, "gzwrite()");
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return(ret);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync}
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#endif /* LIBXML_OUTPUT_ENABLED */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync/**
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * xmlGzfileClose:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @context: the I/O context
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync *
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Close a compressed I/O channel
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncstatic int
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncxmlGzfileClose (void * context) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync int ret;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync ret = (gzclose((gzFile) context) == Z_OK ) ? 0 : -1;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (ret < 0) xmlIOErr(0, "gzclose()");
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return(ret);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync}
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#endif /* HAVE_ZLIB_H */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#ifdef LIBXML_HTTP_ENABLED
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync/************************************************************************
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * *
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * I/O for HTTP file accesses *
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * *
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync ************************************************************************/
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#ifdef LIBXML_OUTPUT_ENABLED
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsynctypedef struct xmlIOHTTPWriteCtxt_
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync{
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync int compression;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync char * uri;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync void * doc_buff;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync} xmlIOHTTPWriteCtxt, *xmlIOHTTPWriteCtxtPtr;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#ifdef HAVE_ZLIB_H
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#define DFLT_WBITS ( -15 )
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#define DFLT_MEM_LVL ( 8 )
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#define GZ_MAGIC1 ( 0x1f )
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#define GZ_MAGIC2 ( 0x8b )
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#define LXML_ZLIB_OS_CODE ( 0x03 )
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#define INIT_HTTP_BUFF_SIZE ( 32768 )
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#define DFLT_ZLIB_RATIO ( 5 )
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync/*
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync** Data structure and functions to work with sending compressed data
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync** via HTTP.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync*/
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsynctypedef struct xmlZMemBuff_
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync{
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync unsigned long size;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync unsigned long crc;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync unsigned char * zbuff;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync z_stream zctrl;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync} xmlZMemBuff, *xmlZMemBuffPtr;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync/**
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * append_reverse_ulong
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @buff: Compressed memory buffer
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @data: Unsigned long to append
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync *
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Append a unsigned long in reverse byte order to the end of the
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * memory buffer.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncstatic void
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncappend_reverse_ulong( xmlZMemBuff * buff, unsigned long data ) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync int idx;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if ( buff == NULL )
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync /*
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync ** This is plagiarized from putLong in gzio.c (zlib source) where
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync ** the number "4" is hardcoded. If zlib is ever patched to
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync ** support 64 bit file sizes, this code would need to be patched
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync ** as well.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync for ( idx = 0; idx < 4; idx++ ) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync *buff->zctrl.next_out = ( data & 0xff );
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync data >>= 8;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync buff->zctrl.next_out++;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync}
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync/**
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync *
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * xmlFreeZMemBuff
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @buff: The memory buffer context to clear
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync *
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Release all the resources associated with the compressed memory buffer.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncstatic void
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncxmlFreeZMemBuff( xmlZMemBuffPtr buff ) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#ifdef DEBUG_HTTP
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync int z_err;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#endif
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if ( buff == NULL )
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlFree( buff->zbuff );
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#ifdef DEBUG_HTTP
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync z_err = deflateEnd( &buff->zctrl );
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if ( z_err != Z_OK )
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlGenericError( xmlGenericErrorContext,
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync "xmlFreeZMemBuff: Error releasing zlib context: %d\n",
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync z_err );
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#else
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync deflateEnd( &buff->zctrl );
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#endif
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlFree( buff );
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync}
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync/**
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * xmlCreateZMemBuff
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync *@compression: Compression value to use
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync *
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Create a memory buffer to hold the compressed XML document. The
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * compressed document in memory will end up being identical to what
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * would be created if gzopen/gzwrite/gzclose were being used to
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * write the document to disk. The code for the header/trailer data to
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * the compression is plagiarized from the zlib source files.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncstatic void *
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncxmlCreateZMemBuff( int compression ) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync int z_err;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync int hdr_lgth;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlZMemBuffPtr buff = NULL;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if ( ( compression < 1 ) || ( compression > 9 ) )
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return ( NULL );
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync /* Create the control and data areas */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync buff = xmlMalloc( sizeof( xmlZMemBuff ) );
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if ( buff == NULL ) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlIOErrMemory("creating buffer context");
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return ( NULL );
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync (void)memset( buff, 0, sizeof( xmlZMemBuff ) );
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync buff->size = INIT_HTTP_BUFF_SIZE;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync buff->zbuff = xmlMalloc( buff->size );
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if ( buff->zbuff == NULL ) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlFreeZMemBuff( buff );
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlIOErrMemory("creating buffer");
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return ( NULL );
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync z_err = deflateInit2( &buff->zctrl, compression, Z_DEFLATED,
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync DFLT_WBITS, DFLT_MEM_LVL, Z_DEFAULT_STRATEGY );
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if ( z_err != Z_OK ) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlChar msg[500];
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlFreeZMemBuff( buff );
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync buff = NULL;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlStrPrintf(msg, 500,
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync (const xmlChar *) "xmlCreateZMemBuff: %s %d\n",
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync "Error initializing compression context. ZLIB error:",
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync z_err );
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlIOErr(XML_IO_WRITE, (const char *) msg);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return ( NULL );
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync /* Set the header data. The CRC will be needed for the trailer */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync buff->crc = crc32( 0L, NULL, 0 );
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync hdr_lgth = snprintf( (char *)buff->zbuff, buff->size,
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync "%c%c%c%c%c%c%c%c%c%c",
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync GZ_MAGIC1, GZ_MAGIC2, Z_DEFLATED,
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync 0, 0, 0, 0, 0, 0, LXML_ZLIB_OS_CODE );
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync buff->zctrl.next_out = buff->zbuff + hdr_lgth;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync buff->zctrl.avail_out = buff->size - hdr_lgth;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return ( buff );
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync}
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync/**
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * xmlZMemBuffExtend
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @buff: Buffer used to compress and consolidate data.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @ext_amt: Number of bytes to extend the buffer.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync *
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Extend the internal buffer used to store the compressed data by the
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * specified amount.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync *
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Returns 0 on success or -1 on failure to extend the buffer. On failure
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * the original buffer still exists at the original size.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncstatic int
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncxmlZMemBuffExtend( xmlZMemBuffPtr buff, size_t ext_amt ) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync int rc = -1;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync size_t new_size;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync size_t cur_used;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync unsigned char * tmp_ptr = NULL;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if ( buff == NULL )
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return ( -1 );
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync else if ( ext_amt == 0 )
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return ( 0 );
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync cur_used = buff->zctrl.next_out - buff->zbuff;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync new_size = buff->size + ext_amt;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#ifdef DEBUG_HTTP
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if ( cur_used > new_size )
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlGenericError( xmlGenericErrorContext,
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync "xmlZMemBuffExtend: %s\n%s %d bytes.\n",
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync "Buffer overwrite detected during compressed memory",
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync "buffer extension. Overflowed by",
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync (cur_used - new_size ) );
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#endif
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync tmp_ptr = xmlRealloc( buff->zbuff, new_size );
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if ( tmp_ptr != NULL ) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync rc = 0;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync buff->size = new_size;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync buff->zbuff = tmp_ptr;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync buff->zctrl.next_out = tmp_ptr + cur_used;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync buff->zctrl.avail_out = new_size - cur_used;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync else {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlChar msg[500];
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlStrPrintf(msg, 500,
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync (const xmlChar *) "xmlZMemBuffExtend: %s %lu bytes.\n",
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync "Allocation failure extending output buffer to",
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync new_size );
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlIOErr(XML_IO_WRITE, (const char *) msg);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return ( rc );
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync}
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync/**
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * xmlZMemBuffAppend
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @buff: Buffer used to compress and consolidate data
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @src: Uncompressed source content to append to buffer
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @len: Length of source data to append to buffer
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync *
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Compress and append data to the internal buffer. The data buffer
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * will be expanded if needed to store the additional data.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync *
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Returns the number of bytes appended to the buffer or -1 on error.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncstatic int
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncxmlZMemBuffAppend( xmlZMemBuffPtr buff, const char * src, int len ) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync int z_err;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync size_t min_accept;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if ( ( buff == NULL ) || ( src == NULL ) )
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return ( -1 );
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync buff->zctrl.avail_in = len;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync buff->zctrl.next_in = (unsigned char *)src;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync while ( buff->zctrl.avail_in > 0 ) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync /*
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync ** Extend the buffer prior to deflate call if a reasonable amount
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync ** of output buffer space is not available.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync min_accept = buff->zctrl.avail_in / DFLT_ZLIB_RATIO;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if ( buff->zctrl.avail_out <= min_accept ) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if ( xmlZMemBuffExtend( buff, buff->size ) == -1 )
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return ( -1 );
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync z_err = deflate( &buff->zctrl, Z_NO_FLUSH );
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if ( z_err != Z_OK ) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlChar msg[500];
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlStrPrintf(msg, 500,
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync (const xmlChar *) "xmlZMemBuffAppend: %s %d %s - %d",
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync "Compression error while appending",
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync len, "bytes to buffer. ZLIB error", z_err );
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlIOErr(XML_IO_WRITE, (const char *) msg);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return ( -1 );
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync buff->crc = crc32( buff->crc, (unsigned char *)src, len );
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return ( len );
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync}
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync/**
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * xmlZMemBuffGetContent
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @buff: Compressed memory content buffer
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @data_ref: Pointer reference to point to compressed content
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync *
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Flushes the compression buffers, appends gzip file trailers and
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * returns the compressed content and length of the compressed data.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * NOTE: The gzip trailer code here is plagiarized from zlib source.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync *
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Returns the length of the compressed data or -1 on error.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncstatic int
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncxmlZMemBuffGetContent( xmlZMemBuffPtr buff, char ** data_ref ) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync int zlgth = -1;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync int z_err;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if ( ( buff == NULL ) || ( data_ref == NULL ) )
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return ( -1 );
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync /* Need to loop until compression output buffers are flushed */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync do
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync z_err = deflate( &buff->zctrl, Z_FINISH );
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if ( z_err == Z_OK ) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync /* In this case Z_OK means more buffer space needed */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if ( xmlZMemBuffExtend( buff, buff->size ) == -1 )
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return ( -1 );
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync while ( z_err == Z_OK );
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync /* If the compression state is not Z_STREAM_END, some error occurred */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if ( z_err == Z_STREAM_END ) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync /* Need to append the gzip data trailer */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if ( buff->zctrl.avail_out < ( 2 * sizeof( unsigned long ) ) ) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if ( xmlZMemBuffExtend(buff, (2 * sizeof(unsigned long))) == -1 )
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return ( -1 );
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync /*
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync ** For whatever reason, the CRC and length data are pushed out
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync ** in reverse byte order. So a memcpy can't be used here.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync append_reverse_ulong( buff, buff->crc );
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync append_reverse_ulong( buff, buff->zctrl.total_in );
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync zlgth = buff->zctrl.next_out - buff->zbuff;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync *data_ref = (char *)buff->zbuff;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync else {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlChar msg[500];
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlStrPrintf(msg, 500,
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync (const xmlChar *) "xmlZMemBuffGetContent: %s - %d\n",
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync "Error flushing zlib buffers. Error code", z_err );
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlIOErr(XML_IO_WRITE, (const char *) msg);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return ( zlgth );
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync}
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#endif /* LIBXML_OUTPUT_ENABLED */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#endif /* HAVE_ZLIB_H */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#ifdef LIBXML_OUTPUT_ENABLED
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync/**
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * xmlFreeHTTPWriteCtxt
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @ctxt: Context to cleanup
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync *
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Free allocated memory and reclaim system resources.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync *
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * No return value.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncstatic void
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncxmlFreeHTTPWriteCtxt( xmlIOHTTPWriteCtxtPtr ctxt )
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync{
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if ( ctxt->uri != NULL )
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlFree( ctxt->uri );
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if ( ctxt->doc_buff != NULL ) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#ifdef HAVE_ZLIB_H
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if ( ctxt->compression > 0 ) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlFreeZMemBuff( ctxt->doc_buff );
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync else
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#endif
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlOutputBufferClose( ctxt->doc_buff );
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlFree( ctxt );
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync}
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#endif /* LIBXML_OUTPUT_ENABLED */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync/**
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * xmlIOHTTPMatch:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @filename: the URI for matching
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync *
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * check if the URI matches an HTTP one
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync *
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Returns 1 if matches, 0 otherwise
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncint
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncxmlIOHTTPMatch (const char *filename) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (!xmlStrncasecmp(BAD_CAST filename, BAD_CAST "http://", 7))
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return(1);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return(0);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync}
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync/**
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * xmlIOHTTPOpen:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @filename: the URI for matching
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync *
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * open an HTTP I/O channel
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync *
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Returns an I/O context or NULL in case of error
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncvoid *
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncxmlIOHTTPOpen (const char *filename) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return(xmlNanoHTTPOpen(filename, NULL));
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync}
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#ifdef LIBXML_OUTPUT_ENABLED
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync/**
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * xmlIOHTTPOpenW:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @post_uri: The destination URI for the document
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @compression: The compression desired for the document.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync *
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Open a temporary buffer to collect the document for a subsequent HTTP POST
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * request. Non-static as is called from the output buffer creation routine.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync *
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Returns an I/O context or NULL in case of error.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncvoid *
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncxmlIOHTTPOpenW(const char *post_uri, int compression)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync{
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlIOHTTPWriteCtxtPtr ctxt = NULL;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (post_uri == NULL)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return (NULL);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync ctxt = xmlMalloc(sizeof(xmlIOHTTPWriteCtxt));
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (ctxt == NULL) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlIOErrMemory("creating HTTP output context");
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return (NULL);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync (void) memset(ctxt, 0, sizeof(xmlIOHTTPWriteCtxt));
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync ctxt->uri = (char *) xmlStrdup((const xmlChar *)post_uri);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (ctxt->uri == NULL) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlIOErrMemory("copying URI");
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlFreeHTTPWriteCtxt(ctxt);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return (NULL);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync /*
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * ** Since the document length is required for an HTTP post,
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * ** need to put the document into a buffer. A memory buffer
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * ** is being used to avoid pushing the data to disk and back.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#ifdef HAVE_ZLIB_H
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if ((compression > 0) && (compression <= 9)) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync ctxt->compression = compression;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync ctxt->doc_buff = xmlCreateZMemBuff(compression);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync } else
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#endif
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync /* Any character conversions should have been done before this */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync ctxt->doc_buff = xmlAllocOutputBuffer(NULL);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (ctxt->doc_buff == NULL) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlFreeHTTPWriteCtxt(ctxt);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync ctxt = NULL;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return (ctxt);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync}
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#endif /* LIBXML_OUTPUT_ENABLED */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#ifdef LIBXML_OUTPUT_ENABLED
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync/**
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * xmlIOHTTPDfltOpenW
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @post_uri: The destination URI for this document.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync *
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Calls xmlIOHTTPOpenW with no compression to set up for a subsequent
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * HTTP post command. This function should generally not be used as
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * the open callback is short circuited in xmlOutputBufferCreateFile.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync *
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Returns a pointer to the new IO context.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncstatic void *
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncxmlIOHTTPDfltOpenW( const char * post_uri ) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return ( xmlIOHTTPOpenW( post_uri, 0 ) );
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync}
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#endif /* LIBXML_OUTPUT_ENABLED */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync/**
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * xmlIOHTTPRead:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @context: the I/O context
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @buffer: where to drop data
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @len: number of bytes to write
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync *
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Read @len bytes to @buffer from the I/O channel.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync *
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Returns the number of bytes written
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncint
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncxmlIOHTTPRead(void * context, char * buffer, int len) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if ((buffer == NULL) || (len < 0)) return(-1);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return(xmlNanoHTTPRead(context, &buffer[0], len));
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync}
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#ifdef LIBXML_OUTPUT_ENABLED
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync/**
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * xmlIOHTTPWrite
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @context: previously opened writing context
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @buffer: data to output to temporary buffer
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @len: bytes to output
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync *
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Collect data from memory buffer into a temporary file for later
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * processing.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync *
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Returns number of bytes written.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncstatic int
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncxmlIOHTTPWrite( void * context, const char * buffer, int len ) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlIOHTTPWriteCtxtPtr ctxt = context;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if ( ( ctxt == NULL ) || ( ctxt->doc_buff == NULL ) || ( buffer == NULL ) )
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return ( -1 );
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if ( len > 0 ) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync /* Use gzwrite or fwrite as previously setup in the open call */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#ifdef HAVE_ZLIB_H
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if ( ctxt->compression > 0 )
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync len = xmlZMemBuffAppend( ctxt->doc_buff, buffer, len );
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync else
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#endif
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync len = xmlOutputBufferWrite( ctxt->doc_buff, len, buffer );
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if ( len < 0 ) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlChar msg[500];
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlStrPrintf(msg, 500,
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync (const xmlChar *) "xmlIOHTTPWrite: %s\n%s '%s'.\n",
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync "Error appending to internal buffer.",
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync "Error sending document to URI",
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync ctxt->uri );
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlIOErr(XML_IO_WRITE, (const char *) msg);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return ( len );
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync}
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#endif /* LIBXML_OUTPUT_ENABLED */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync/**
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * xmlIOHTTPClose:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @context: the I/O context
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync *
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Close an HTTP I/O channel
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync *
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Returns 0
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncint
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncxmlIOHTTPClose (void * context) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlNanoHTTPClose(context);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return 0;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync}
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#ifdef LIBXML_OUTPUT_ENABLED
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync/**
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * xmlIOHTTCloseWrite
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @context: The I/O context
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @http_mthd: The HTTP method to be used when sending the data
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync *
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Close the transmit HTTP I/O channel and actually send the data.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncstatic int
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncxmlIOHTTPCloseWrite( void * context, const char * http_mthd ) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync int close_rc = -1;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync int http_rtn = 0;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync int content_lgth = 0;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlIOHTTPWriteCtxtPtr ctxt = context;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync char * http_content = NULL;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync char * content_encoding = NULL;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync char * content_type = (char *) "text/xml";
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync void * http_ctxt = NULL;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if ( ( ctxt == NULL ) || ( http_mthd == NULL ) )
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return ( -1 );
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync /* Retrieve the content from the appropriate buffer */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#ifdef HAVE_ZLIB_H
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if ( ctxt->compression > 0 ) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync content_lgth = xmlZMemBuffGetContent( ctxt->doc_buff, &http_content );
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync content_encoding = (char *) "Content-Encoding: gzip";
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync else
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#endif
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync /* Pull the data out of the memory output buffer */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlOutputBufferPtr dctxt = ctxt->doc_buff;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync http_content = (char *)dctxt->buffer->content;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync content_lgth = dctxt->buffer->use;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if ( http_content == NULL ) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlChar msg[500];
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlStrPrintf(msg, 500,
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync (const xmlChar *) "xmlIOHTTPCloseWrite: %s '%s' %s '%s'.\n",
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync "Error retrieving content.\nUnable to",
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync http_mthd, "data to URI", ctxt->uri );
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlIOErr(XML_IO_WRITE, (const char *) msg);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync else {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync http_ctxt = xmlNanoHTTPMethod( ctxt->uri, http_mthd, http_content,
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync &content_type, content_encoding,
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync content_lgth );
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if ( http_ctxt != NULL ) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#ifdef DEBUG_HTTP
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync /* If testing/debugging - dump reply with request content */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync FILE * tst_file = NULL;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync char buffer[ 4096 ];
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync char * dump_name = NULL;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync int avail;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlGenericError( xmlGenericErrorContext,
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync "xmlNanoHTTPCloseWrite: HTTP %s to\n%s returned %d.\n",
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync http_mthd, ctxt->uri,
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlNanoHTTPReturnCode( http_ctxt ) );
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync /*
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync ** Since either content or reply may be gzipped,
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync ** dump them to separate files instead of the
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync ** standard error context.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync dump_name = tempnam( NULL, "lxml" );
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if ( dump_name != NULL ) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync (void)snprintf( buffer, sizeof(buffer), "%s.content", dump_name );
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync tst_file = fopen( buffer, "wb" );
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if ( tst_file != NULL ) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlGenericError( xmlGenericErrorContext,
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync "Transmitted content saved in file: %s\n", buffer );
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync fwrite( http_content, sizeof( char ),
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync content_lgth, tst_file );
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync fclose( tst_file );
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync (void)snprintf( buffer, sizeof(buffer), "%s.reply", dump_name );
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync tst_file = fopen( buffer, "wb" );
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if ( tst_file != NULL ) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlGenericError( xmlGenericErrorContext,
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync "Reply content saved in file: %s\n", buffer );
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync while ( (avail = xmlNanoHTTPRead( http_ctxt,
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync buffer, sizeof( buffer ) )) > 0 ) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync fwrite( buffer, sizeof( char ), avail, tst_file );
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync fclose( tst_file );
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync free( dump_name );
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#endif /* DEBUG_HTTP */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync http_rtn = xmlNanoHTTPReturnCode( http_ctxt );
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if ( ( http_rtn >= 200 ) && ( http_rtn < 300 ) )
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync close_rc = 0;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync else {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlChar msg[500];
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlStrPrintf(msg, 500,
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync (const xmlChar *) "xmlIOHTTPCloseWrite: HTTP '%s' of %d %s\n'%s' %s %d\n",
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync http_mthd, content_lgth,
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync "bytes to URI", ctxt->uri,
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync "failed. HTTP return code:", http_rtn );
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlIOErr(XML_IO_WRITE, (const char *) msg);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlNanoHTTPClose( http_ctxt );
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlFree( content_type );
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync /* Final cleanups */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlFreeHTTPWriteCtxt( ctxt );
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return ( close_rc );
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync}
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync/**
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * xmlIOHTTPClosePut
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync *
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @context: The I/O context
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync *
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Close the transmit HTTP I/O channel and actually send data using a PUT
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * HTTP method.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncstatic int
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncxmlIOHTTPClosePut( void * ctxt ) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return ( xmlIOHTTPCloseWrite( ctxt, "PUT" ) );
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync}
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync/**
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * xmlIOHTTPClosePost
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync *
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @context: The I/O context
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync *
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Close the transmit HTTP I/O channel and actually send data using a POST
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * HTTP method.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncstatic int
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncxmlIOHTTPClosePost( void * ctxt ) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return ( xmlIOHTTPCloseWrite( ctxt, "POST" ) );
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync}
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#endif /* LIBXML_OUTPUT_ENABLED */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#endif /* LIBXML_HTTP_ENABLED */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#ifdef LIBXML_FTP_ENABLED
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync/************************************************************************
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * *
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * I/O for FTP file accesses *
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * *
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync ************************************************************************/
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync/**
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * xmlIOFTPMatch:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @filename: the URI for matching
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync *
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * check if the URI matches an FTP one
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync *
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Returns 1 if matches, 0 otherwise
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncint
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncxmlIOFTPMatch (const char *filename) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (!xmlStrncasecmp(BAD_CAST filename, BAD_CAST "ftp://", 6))
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return(1);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return(0);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync}
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync/**
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * xmlIOFTPOpen:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @filename: the URI for matching
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync *
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * open an FTP I/O channel
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync *
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Returns an I/O context or NULL in case of error
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncvoid *
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncxmlIOFTPOpen (const char *filename) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return(xmlNanoFTPOpen(filename));
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync}
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync/**
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * xmlIOFTPRead:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @context: the I/O context
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @buffer: where to drop data
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @len: number of bytes to write
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync *
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Read @len bytes to @buffer from the I/O channel.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync *
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Returns the number of bytes written
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncint
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncxmlIOFTPRead(void * context, char * buffer, int len) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if ((buffer == NULL) || (len < 0)) return(-1);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return(xmlNanoFTPRead(context, &buffer[0], len));
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync}
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync/**
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * xmlIOFTPClose:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @context: the I/O context
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync *
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Close an FTP I/O channel
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync *
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Returns 0
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncint
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncxmlIOFTPClose (void * context) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return ( xmlNanoFTPClose(context) );
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync}
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#endif /* LIBXML_FTP_ENABLED */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync/**
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * xmlRegisterInputCallbacks:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @matchFunc: the xmlInputMatchCallback
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @openFunc: the xmlInputOpenCallback
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @readFunc: the xmlInputReadCallback
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @closeFunc: the xmlInputCloseCallback
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync *
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Register a new set of I/O callback for handling parser input.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync *
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Returns the registered handler number or -1 in case of error
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncint
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncxmlRegisterInputCallbacks(xmlInputMatchCallback matchFunc,
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlInputOpenCallback openFunc, xmlInputReadCallback readFunc,
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlInputCloseCallback closeFunc) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (xmlInputCallbackNr >= MAX_INPUT_CALLBACK) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return(-1);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlInputCallbackTable[xmlInputCallbackNr].matchcallback = matchFunc;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlInputCallbackTable[xmlInputCallbackNr].opencallback = openFunc;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlInputCallbackTable[xmlInputCallbackNr].readcallback = readFunc;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlInputCallbackTable[xmlInputCallbackNr].closecallback = closeFunc;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlInputCallbackInitialized = 1;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return(xmlInputCallbackNr++);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync}
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#ifdef LIBXML_OUTPUT_ENABLED
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync/**
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * xmlRegisterOutputCallbacks:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @matchFunc: the xmlOutputMatchCallback
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @openFunc: the xmlOutputOpenCallback
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @writeFunc: the xmlOutputWriteCallback
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @closeFunc: the xmlOutputCloseCallback
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync *
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Register a new set of I/O callback for handling output.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync *
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Returns the registered handler number or -1 in case of error
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncint
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncxmlRegisterOutputCallbacks(xmlOutputMatchCallback matchFunc,
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlOutputOpenCallback openFunc, xmlOutputWriteCallback writeFunc,
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlOutputCloseCallback closeFunc) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (xmlOutputCallbackNr >= MAX_INPUT_CALLBACK) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return(-1);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlOutputCallbackTable[xmlOutputCallbackNr].matchcallback = matchFunc;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlOutputCallbackTable[xmlOutputCallbackNr].opencallback = openFunc;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlOutputCallbackTable[xmlOutputCallbackNr].writecallback = writeFunc;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlOutputCallbackTable[xmlOutputCallbackNr].closecallback = closeFunc;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlOutputCallbackInitialized = 1;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return(xmlOutputCallbackNr++);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync}
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#endif /* LIBXML_OUTPUT_ENABLED */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync/**
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * xmlRegisterDefaultInputCallbacks:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync *
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Registers the default compiled-in I/O handlers.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncvoid
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncxmlRegisterDefaultInputCallbacks(void) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (xmlInputCallbackInitialized)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#if defined(_WIN32) || defined (__DJGPP__) && !defined (__CYGWIN__)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlInitPlatformSpecificIo();
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#endif
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlRegisterInputCallbacks(xmlFileMatch, xmlFileOpen,
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlFileRead, xmlFileClose);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#ifdef HAVE_ZLIB_H
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlRegisterInputCallbacks(xmlGzfileMatch, xmlGzfileOpen,
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlGzfileRead, xmlGzfileClose);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#endif /* HAVE_ZLIB_H */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#ifdef LIBXML_HTTP_ENABLED
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlRegisterInputCallbacks(xmlIOHTTPMatch, xmlIOHTTPOpen,
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlIOHTTPRead, xmlIOHTTPClose);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#endif /* LIBXML_HTTP_ENABLED */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#ifdef LIBXML_FTP_ENABLED
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlRegisterInputCallbacks(xmlIOFTPMatch, xmlIOFTPOpen,
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlIOFTPRead, xmlIOFTPClose);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#endif /* LIBXML_FTP_ENABLED */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlInputCallbackInitialized = 1;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync}
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#ifdef LIBXML_OUTPUT_ENABLED
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync/**
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * xmlRegisterDefaultOutputCallbacks:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync *
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Registers the default compiled-in I/O handlers.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncvoid
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncxmlRegisterDefaultOutputCallbacks (void) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (xmlOutputCallbackInitialized)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#if defined(_WIN32) || defined (__DJGPP__) && !defined (__CYGWIN__)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlInitPlatformSpecificIo();
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#endif
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlRegisterOutputCallbacks(xmlFileMatch, xmlFileOpenW,
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlFileWrite, xmlFileClose);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#ifdef LIBXML_HTTP_ENABLED
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlRegisterOutputCallbacks(xmlIOHTTPMatch, xmlIOHTTPDfltOpenW,
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlIOHTTPWrite, xmlIOHTTPClosePut);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#endif
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync/*********************************
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync No way a-priori to distinguish between gzipped files from
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync uncompressed ones except opening if existing then closing
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync and saving with same compression ratio ... a pain.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#ifdef HAVE_ZLIB_H
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlRegisterOutputCallbacks(xmlGzfileMatch, xmlGzfileOpen,
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlGzfileWrite, xmlGzfileClose);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#endif
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync Nor FTP PUT ....
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#ifdef LIBXML_FTP_ENABLED
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlRegisterOutputCallbacks(xmlIOFTPMatch, xmlIOFTPOpen,
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlIOFTPWrite, xmlIOFTPClose);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#endif
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync **********************************/
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlOutputCallbackInitialized = 1;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync}
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#ifdef LIBXML_HTTP_ENABLED
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync/**
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * xmlRegisterHTTPPostCallbacks:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync *
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * By default, libxml submits HTTP output requests using the "PUT" method.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Calling this method changes the HTTP output method to use the "POST"
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * method instead.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync *
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncvoid
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncxmlRegisterHTTPPostCallbacks( void ) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync /* Register defaults if not done previously */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if ( xmlOutputCallbackInitialized == 0 )
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlRegisterDefaultOutputCallbacks( );
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlRegisterOutputCallbacks(xmlIOHTTPMatch, xmlIOHTTPDfltOpenW,
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlIOHTTPWrite, xmlIOHTTPClosePost);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync}
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#endif
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#endif /* LIBXML_OUTPUT_ENABLED */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync/**
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * xmlAllocParserInputBuffer:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @enc: the charset encoding if known
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync *
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Create a buffered parser input for progressive parsing
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync *
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Returns the new parser input or NULL
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncxmlParserInputBufferPtr
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncxmlAllocParserInputBuffer(xmlCharEncoding enc) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlParserInputBufferPtr ret;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync ret = (xmlParserInputBufferPtr) xmlMalloc(sizeof(xmlParserInputBuffer));
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (ret == NULL) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlIOErrMemory("creating input buffer");
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return(NULL);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync memset(ret, 0, (size_t) sizeof(xmlParserInputBuffer));
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync ret->buffer = xmlBufferCreateSize(2 * xmlDefaultBufferSize);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (ret->buffer == NULL) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlFree(ret);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return(NULL);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync ret->buffer->alloc = XML_BUFFER_ALLOC_DOUBLEIT;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync ret->encoder = xmlGetCharEncodingHandler(enc);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (ret->encoder != NULL)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync ret->raw = xmlBufferCreateSize(2 * xmlDefaultBufferSize);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync else
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync ret->raw = NULL;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync ret->readcallback = NULL;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync ret->closecallback = NULL;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync ret->context = NULL;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync ret->compressed = -1;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync ret->rawconsumed = 0;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return(ret);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync}
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#ifdef LIBXML_OUTPUT_ENABLED
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync/**
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * xmlAllocOutputBuffer:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @encoder: the encoding converter or NULL
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync *
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Create a buffered parser output
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync *
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Returns the new parser output or NULL
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncxmlOutputBufferPtr
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncxmlAllocOutputBuffer(xmlCharEncodingHandlerPtr encoder) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlOutputBufferPtr ret;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync ret = (xmlOutputBufferPtr) xmlMalloc(sizeof(xmlOutputBuffer));
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (ret == NULL) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlIOErrMemory("creating output buffer");
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return(NULL);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync memset(ret, 0, (size_t) sizeof(xmlOutputBuffer));
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync ret->buffer = xmlBufferCreate();
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (ret->buffer == NULL) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlFree(ret);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return(NULL);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync ret->buffer->alloc = XML_BUFFER_ALLOC_DOUBLEIT;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync ret->encoder = encoder;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (encoder != NULL) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync ret->conv = xmlBufferCreateSize(4000);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync /*
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * This call is designed to initiate the encoder state
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlCharEncOutFunc(encoder, ret->conv, NULL);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync } else
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync ret->conv = NULL;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync ret->writecallback = NULL;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync ret->closecallback = NULL;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync ret->context = NULL;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync ret->written = 0;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return(ret);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync}
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#endif /* LIBXML_OUTPUT_ENABLED */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync/**
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * xmlFreeParserInputBuffer:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @in: a buffered parser input
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync *
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Free up the memory used by a buffered parser input
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncvoid
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncxmlFreeParserInputBuffer(xmlParserInputBufferPtr in) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (in == NULL) return;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (in->raw) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlBufferFree(in->raw);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync in->raw = NULL;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (in->encoder != NULL) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlCharEncCloseFunc(in->encoder);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (in->closecallback != NULL) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync in->closecallback(in->context);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (in->buffer != NULL) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlBufferFree(in->buffer);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync in->buffer = NULL;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlFree(in);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync}
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#ifdef LIBXML_OUTPUT_ENABLED
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync/**
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * xmlOutputBufferClose:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @out: a buffered output
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync *
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * flushes and close the output I/O channel
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * and free up all the associated resources
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync *
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Returns the number of byte written or -1 in case of error.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncint
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncxmlOutputBufferClose(xmlOutputBufferPtr out)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync{
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync int written;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync int err_rc = 0;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (out == NULL)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return (-1);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (out->writecallback != NULL)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlOutputBufferFlush(out);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (out->closecallback != NULL) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync err_rc = out->closecallback(out->context);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync written = out->written;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (out->conv) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlBufferFree(out->conv);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync out->conv = NULL;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (out->encoder != NULL) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlCharEncCloseFunc(out->encoder);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (out->buffer != NULL) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlBufferFree(out->buffer);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync out->buffer = NULL;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (out->error)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync err_rc = -1;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlFree(out);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return ((err_rc == 0) ? written : err_rc);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync}
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#endif /* LIBXML_OUTPUT_ENABLED */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncxmlParserInputBufferPtr
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync__xmlParserInputBufferCreateFilename(const char *URI, xmlCharEncoding enc) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlParserInputBufferPtr ret;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync int i = 0;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync void *context = NULL;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (xmlInputCallbackInitialized == 0)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlRegisterDefaultInputCallbacks();
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (URI == NULL) return(NULL);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync /*
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Try to find one of the input accept method accepting that scheme
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Go in reverse to give precedence to user defined handlers.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (context == NULL) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync for (i = xmlInputCallbackNr - 1;i >= 0;i--) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if ((xmlInputCallbackTable[i].matchcallback != NULL) &&
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync (xmlInputCallbackTable[i].matchcallback(URI) != 0)) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync context = xmlInputCallbackTable[i].opencallback(URI);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (context != NULL) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync break;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (context == NULL) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return(NULL);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync /*
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Allocate the Input buffer front-end.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync ret = xmlAllocParserInputBuffer(enc);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (ret != NULL) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync ret->context = context;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync ret->readcallback = xmlInputCallbackTable[i].readcallback;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync ret->closecallback = xmlInputCallbackTable[i].closecallback;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#ifdef HAVE_ZLIB_H
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if ((xmlInputCallbackTable[i].opencallback == xmlGzfileOpen) &&
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync (strcmp(URI, "-") != 0)) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (((z_stream *)context)->avail_in > 4) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync char *cptr, buff4[4];
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync cptr = (char *) ((z_stream *)context)->next_in;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (gzread(context, buff4, 4) == 4) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (strncmp(buff4, cptr, 4) == 0)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync ret->compressed = 0;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync else
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync ret->compressed = 1;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync gzrewind(context);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#endif
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync else
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlInputCallbackTable[i].closecallback (context);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return(ret);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync}
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync/**
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * xmlParserInputBufferCreateFilename:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @URI: a C string containing the URI or filename
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @enc: the charset encoding if known
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync *
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Create a buffered parser input for the progressive parsing of a file
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * If filename is "-' then we use stdin as the input.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Automatic support for ZLIB/Compress compressed document is provided
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * by default if found at compile-time.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Do an encoding check if enc == XML_CHAR_ENCODING_NONE
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync *
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Returns the new parser input or NULL
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncxmlParserInputBufferPtr
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncxmlParserInputBufferCreateFilename(const char *URI, xmlCharEncoding enc) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if ((xmlParserInputBufferCreateFilenameValue)) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return xmlParserInputBufferCreateFilenameValue(URI, enc);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return __xmlParserInputBufferCreateFilename(URI, enc);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync}
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#ifdef LIBXML_OUTPUT_ENABLED
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncxmlOutputBufferPtr
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync__xmlOutputBufferCreateFilename(const char *URI,
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlCharEncodingHandlerPtr encoder,
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync int compression ATTRIBUTE_UNUSED) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlOutputBufferPtr ret;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlURIPtr puri;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync int i = 0;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync void *context = NULL;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync char *unescaped = NULL;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#ifdef HAVE_ZLIB_H
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync int is_file_uri = 1;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#endif
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (xmlOutputCallbackInitialized == 0)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlRegisterDefaultOutputCallbacks();
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (URI == NULL) return(NULL);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync puri = xmlParseURI(URI);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (puri != NULL) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#ifdef HAVE_ZLIB_H
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if ((puri->scheme != NULL) &&
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync (!xmlStrEqual(BAD_CAST puri->scheme, BAD_CAST "file")))
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync is_file_uri = 0;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#endif
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync /*
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * try to limit the damages of the URI unescaping code.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if ((puri->scheme == NULL) ||
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync (xmlStrEqual(BAD_CAST puri->scheme, BAD_CAST "file")))
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync unescaped = xmlURIUnescapeString(URI, 0, NULL);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlFreeURI(puri);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync /*
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Try to find one of the output accept method accepting that scheme
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Go in reverse to give precedence to user defined handlers.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * try with an unescaped version of the URI
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (unescaped != NULL) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#ifdef HAVE_ZLIB_H
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if ((compression > 0) && (compression <= 9) && (is_file_uri == 1)) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync context = xmlGzfileOpenW(unescaped, compression);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (context != NULL) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync ret = xmlAllocOutputBuffer(encoder);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (ret != NULL) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync ret->context = context;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync ret->writecallback = xmlGzfileWrite;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync ret->closecallback = xmlGzfileClose;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlFree(unescaped);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return(ret);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#endif
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync for (i = xmlOutputCallbackNr - 1;i >= 0;i--) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if ((xmlOutputCallbackTable[i].matchcallback != NULL) &&
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync (xmlOutputCallbackTable[i].matchcallback(unescaped) != 0)) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#if defined(LIBXML_HTTP_ENABLED) && defined(HAVE_ZLIB_H)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync /* Need to pass compression parameter into HTTP open calls */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (xmlOutputCallbackTable[i].matchcallback == xmlIOHTTPMatch)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync context = xmlIOHTTPOpenW(unescaped, compression);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync else
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#endif
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync context = xmlOutputCallbackTable[i].opencallback(unescaped);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (context != NULL)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync break;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlFree(unescaped);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync /*
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * If this failed try with a non-escaped URI this may be a strange
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * filename
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (context == NULL) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#ifdef HAVE_ZLIB_H
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if ((compression > 0) && (compression <= 9) && (is_file_uri == 1)) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync context = xmlGzfileOpenW(URI, compression);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (context != NULL) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync ret = xmlAllocOutputBuffer(encoder);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (ret != NULL) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync ret->context = context;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync ret->writecallback = xmlGzfileWrite;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync ret->closecallback = xmlGzfileClose;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return(ret);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#endif
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync for (i = xmlOutputCallbackNr - 1;i >= 0;i--) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if ((xmlOutputCallbackTable[i].matchcallback != NULL) &&
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync (xmlOutputCallbackTable[i].matchcallback(URI) != 0)) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#if defined(LIBXML_HTTP_ENABLED) && defined(HAVE_ZLIB_H)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync /* Need to pass compression parameter into HTTP open calls */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (xmlOutputCallbackTable[i].matchcallback == xmlIOHTTPMatch)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync context = xmlIOHTTPOpenW(URI, compression);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync else
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#endif
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync context = xmlOutputCallbackTable[i].opencallback(URI);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (context != NULL)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync break;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (context == NULL) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return(NULL);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync /*
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Allocate the Output buffer front-end.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync ret = xmlAllocOutputBuffer(encoder);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (ret != NULL) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync ret->context = context;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync ret->writecallback = xmlOutputCallbackTable[i].writecallback;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync ret->closecallback = xmlOutputCallbackTable[i].closecallback;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return(ret);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync}
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync/**
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * xmlOutputBufferCreateFilename:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @URI: a C string containing the URI or filename
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @encoder: the encoding converter or NULL
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @compression: the compression ration (0 none, 9 max).
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync *
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Create a buffered output for the progressive saving of a file
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * If filename is "-' then we use stdout as the output.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Automatic support for ZLIB/Compress compressed document is provided
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * by default if found at compile-time.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * TODO: currently if compression is set, the library only support
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * writing to a local file.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync *
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Returns the new output or NULL
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncxmlOutputBufferPtr
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncxmlOutputBufferCreateFilename(const char *URI,
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlCharEncodingHandlerPtr encoder,
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync int compression ATTRIBUTE_UNUSED) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if ((xmlOutputBufferCreateFilenameValue)) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return xmlOutputBufferCreateFilenameValue(URI, encoder, compression);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return __xmlOutputBufferCreateFilename(URI, encoder, compression);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync}
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#endif /* LIBXML_OUTPUT_ENABLED */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync/**
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * xmlParserInputBufferCreateFile:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @file: a FILE*
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @enc: the charset encoding if known
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync *
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Create a buffered parser input for the progressive parsing of a FILE *
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * buffered C I/O
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync *
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Returns the new parser input or NULL
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncxmlParserInputBufferPtr
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncxmlParserInputBufferCreateFile(FILE *file, xmlCharEncoding enc) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlParserInputBufferPtr ret;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (xmlInputCallbackInitialized == 0)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlRegisterDefaultInputCallbacks();
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (file == NULL) return(NULL);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync ret = xmlAllocParserInputBuffer(enc);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (ret != NULL) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync ret->context = file;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync ret->readcallback = xmlFileRead;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync ret->closecallback = xmlFileFlush;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return(ret);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync}
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#ifdef LIBXML_OUTPUT_ENABLED
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync/**
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * xmlOutputBufferCreateFile:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @file: a FILE*
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @encoder: the encoding converter or NULL
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync *
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Create a buffered output for the progressive saving to a FILE *
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * buffered C I/O
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync *
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Returns the new parser output or NULL
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncxmlOutputBufferPtr
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncxmlOutputBufferCreateFile(FILE *file, xmlCharEncodingHandlerPtr encoder) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlOutputBufferPtr ret;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (xmlOutputCallbackInitialized == 0)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlRegisterDefaultOutputCallbacks();
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (file == NULL) return(NULL);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync ret = xmlAllocOutputBuffer(encoder);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (ret != NULL) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync ret->context = file;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync ret->writecallback = xmlFileWrite;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync ret->closecallback = xmlFileFlush;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return(ret);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync}
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync/**
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * xmlOutputBufferCreateBuffer:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @buffer: a xmlBufferPtr
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @encoder: the encoding converter or NULL
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync *
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Create a buffered output for the progressive saving to a xmlBuffer
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync *
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Returns the new parser output or NULL
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncxmlOutputBufferPtr
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncxmlOutputBufferCreateBuffer(xmlBufferPtr buffer,
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlCharEncodingHandlerPtr encoder) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlOutputBufferPtr ret;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (buffer == NULL) return(NULL);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync ret = xmlOutputBufferCreateIO((xmlOutputWriteCallback)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlBufferWrite,
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync (xmlOutputCloseCallback)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync NULL, (void *) buffer, encoder);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return(ret);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync}
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#endif /* LIBXML_OUTPUT_ENABLED */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync/**
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * xmlParserInputBufferCreateFd:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @fd: a file descriptor number
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @enc: the charset encoding if known
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync *
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Create a buffered parser input for the progressive parsing for the input
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * from a file descriptor
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync *
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Returns the new parser input or NULL
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncxmlParserInputBufferPtr
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncxmlParserInputBufferCreateFd(int fd, xmlCharEncoding enc) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlParserInputBufferPtr ret;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (fd < 0) return(NULL);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync ret = xmlAllocParserInputBuffer(enc);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (ret != NULL) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync ret->context = (void *) (long) fd;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync ret->readcallback = xmlFdRead;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync ret->closecallback = xmlFdClose;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return(ret);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync}
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync/**
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * xmlParserInputBufferCreateMem:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @mem: the memory input
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @size: the length of the memory block
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @enc: the charset encoding if known
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync *
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Create a buffered parser input for the progressive parsing for the input
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * from a memory area.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync *
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Returns the new parser input or NULL
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncxmlParserInputBufferPtr
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncxmlParserInputBufferCreateMem(const char *mem, int size, xmlCharEncoding enc) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlParserInputBufferPtr ret;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync int errcode;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (size <= 0) return(NULL);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (mem == NULL) return(NULL);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync ret = xmlAllocParserInputBuffer(enc);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (ret != NULL) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync ret->context = (void *) mem;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync ret->readcallback = (xmlInputReadCallback) xmlNop;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync ret->closecallback = NULL;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync errcode = xmlBufferAdd(ret->buffer, (const xmlChar *) mem, size);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (errcode != 0) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlFree(ret);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return(NULL);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return(ret);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync}
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync/**
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * xmlParserInputBufferCreateStatic:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @mem: the memory input
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @size: the length of the memory block
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @enc: the charset encoding if known
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync *
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Create a buffered parser input for the progressive parsing for the input
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * from an immutable memory area. This will not copy the memory area to
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * the buffer, but the memory is expected to be available until the end of
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * the parsing, this is useful for example when using mmap'ed file.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync *
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Returns the new parser input or NULL
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncxmlParserInputBufferPtr
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncxmlParserInputBufferCreateStatic(const char *mem, int size,
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlCharEncoding enc) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlParserInputBufferPtr ret;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (size <= 0) return(NULL);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (mem == NULL) return(NULL);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync ret = (xmlParserInputBufferPtr) xmlMalloc(sizeof(xmlParserInputBuffer));
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (ret == NULL) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlIOErrMemory("creating input buffer");
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return(NULL);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync memset(ret, 0, (size_t) sizeof(xmlParserInputBuffer));
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync ret->buffer = xmlBufferCreateStatic((void *)mem, (size_t) size);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (ret->buffer == NULL) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlFree(ret);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return(NULL);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync ret->encoder = xmlGetCharEncodingHandler(enc);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (ret->encoder != NULL)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync ret->raw = xmlBufferCreateSize(2 * xmlDefaultBufferSize);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync else
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync ret->raw = NULL;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync ret->compressed = -1;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync ret->context = (void *) mem;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync ret->readcallback = NULL;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync ret->closecallback = NULL;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return(ret);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync}
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#ifdef LIBXML_OUTPUT_ENABLED
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync/**
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * xmlOutputBufferCreateFd:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @fd: a file descriptor number
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @encoder: the encoding converter or NULL
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync *
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Create a buffered output for the progressive saving
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * to a file descriptor
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync *
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Returns the new parser output or NULL
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncxmlOutputBufferPtr
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncxmlOutputBufferCreateFd(int fd, xmlCharEncodingHandlerPtr encoder) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlOutputBufferPtr ret;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (fd < 0) return(NULL);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync ret = xmlAllocOutputBuffer(encoder);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (ret != NULL) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync ret->context = (void *) (long) fd;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync ret->writecallback = xmlFdWrite;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync ret->closecallback = NULL;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return(ret);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync}
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#endif /* LIBXML_OUTPUT_ENABLED */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync/**
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * xmlParserInputBufferCreateIO:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @ioread: an I/O read function
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @ioclose: an I/O close function
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @ioctx: an I/O handler
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @enc: the charset encoding if known
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync *
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Create a buffered parser input for the progressive parsing for the input
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * from an I/O handler
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync *
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Returns the new parser input or NULL
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncxmlParserInputBufferPtr
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncxmlParserInputBufferCreateIO(xmlInputReadCallback ioread,
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlInputCloseCallback ioclose, void *ioctx, xmlCharEncoding enc) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlParserInputBufferPtr ret;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (ioread == NULL) return(NULL);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync ret = xmlAllocParserInputBuffer(enc);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (ret != NULL) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync ret->context = (void *) ioctx;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync ret->readcallback = ioread;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync ret->closecallback = ioclose;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return(ret);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync}
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#ifdef LIBXML_OUTPUT_ENABLED
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync/**
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * xmlOutputBufferCreateIO:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @iowrite: an I/O write function
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @ioclose: an I/O close function
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @ioctx: an I/O handler
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @encoder: the charset encoding if known
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync *
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Create a buffered output for the progressive saving
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * to an I/O handler
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync *
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Returns the new parser output or NULL
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncxmlOutputBufferPtr
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncxmlOutputBufferCreateIO(xmlOutputWriteCallback iowrite,
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlOutputCloseCallback ioclose, void *ioctx,
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlCharEncodingHandlerPtr encoder) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlOutputBufferPtr ret;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (iowrite == NULL) return(NULL);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync ret = xmlAllocOutputBuffer(encoder);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (ret != NULL) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync ret->context = (void *) ioctx;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync ret->writecallback = iowrite;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync ret->closecallback = ioclose;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return(ret);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync}
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#endif /* LIBXML_OUTPUT_ENABLED */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync/**
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * xmlParserInputBufferCreateFilenameDefault:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @func: function pointer to the new ParserInputBufferCreateFilenameFunc
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync *
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Registers a callback for URI input file handling
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync *
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Returns the old value of the registration function
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncxmlParserInputBufferCreateFilenameFunc
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncxmlParserInputBufferCreateFilenameDefault(xmlParserInputBufferCreateFilenameFunc func)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync{
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlParserInputBufferCreateFilenameFunc old = xmlParserInputBufferCreateFilenameValue;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (old == NULL) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync old = __xmlParserInputBufferCreateFilename;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlParserInputBufferCreateFilenameValue = func;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return(old);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync}
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync/**
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * xmlOutputBufferCreateFilenameDefault:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @func: function pointer to the new OutputBufferCreateFilenameFunc
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync *
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Registers a callback for URI output file handling
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync *
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Returns the old value of the registration function
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncxmlOutputBufferCreateFilenameFunc
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncxmlOutputBufferCreateFilenameDefault(xmlOutputBufferCreateFilenameFunc func)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync{
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlOutputBufferCreateFilenameFunc old = xmlOutputBufferCreateFilenameValue;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#ifdef LIBXML_OUTPUT_ENABLED
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (old == NULL) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync old = __xmlOutputBufferCreateFilename;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#endif
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlOutputBufferCreateFilenameValue = func;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return(old);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync}
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync/**
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * xmlParserInputBufferPush:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @in: a buffered parser input
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @len: the size in bytes of the array.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @buf: an char array
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync *
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Push the content of the arry in the input buffer
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * This routine handle the I18N transcoding to internal UTF-8
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * This is used when operating the parser in progressive (push) mode.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync *
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Returns the number of chars read and stored in the buffer, or -1
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * in case of error.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncint
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncxmlParserInputBufferPush(xmlParserInputBufferPtr in,
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync int len, const char *buf) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync int nbchars = 0;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync int ret;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (len < 0) return(0);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if ((in == NULL) || (in->error)) return(-1);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (in->encoder != NULL) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync unsigned int use;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync /*
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Store the data in the incoming raw buffer
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (in->raw == NULL) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync in->raw = xmlBufferCreate();
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync ret = xmlBufferAdd(in->raw, (const xmlChar *) buf, len);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (ret != 0)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return(-1);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync /*
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * convert as much as possible to the parser reading buffer.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync use = in->raw->use;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync nbchars = xmlCharEncInFunc(in->encoder, in->buffer, in->raw);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (nbchars < 0) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlIOErr(XML_IO_ENCODER, NULL);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync in->error = XML_IO_ENCODER;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return(-1);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync in->rawconsumed += (use - in->raw->use);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync } else {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync nbchars = len;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync ret = xmlBufferAdd(in->buffer, (xmlChar *) buf, nbchars);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (ret != 0)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return(-1);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#ifdef DEBUG_INPUT
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlGenericError(xmlGenericErrorContext,
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync "I/O: pushed %d chars, buffer %d/%d\n",
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync nbchars, in->buffer->use, in->buffer->size);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#endif
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return(nbchars);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync}
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync/**
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * endOfInput:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync *
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * When reading from an Input channel indicated end of file or error
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * don't reread from it again.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncstatic int
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncendOfInput (void * context ATTRIBUTE_UNUSED,
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync char * buffer ATTRIBUTE_UNUSED,
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync int len ATTRIBUTE_UNUSED) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return(0);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync}
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync/**
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * xmlParserInputBufferGrow:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @in: a buffered parser input
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @len: indicative value of the amount of chars to read
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync *
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Grow up the content of the input buffer, the old data are preserved
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * This routine handle the I18N transcoding to internal UTF-8
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * This routine is used when operating the parser in normal (pull) mode
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync *
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * TODO: one should be able to remove one extra copy by copying directly
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * onto in->buffer or in->raw
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync *
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Returns the number of chars read and stored in the buffer, or -1
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * in case of error.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncint
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncxmlParserInputBufferGrow(xmlParserInputBufferPtr in, int len) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync char *buffer = NULL;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync int res = 0;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync int nbchars = 0;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync int buffree;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync unsigned int needSize;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if ((in == NULL) || (in->error)) return(-1);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if ((len <= MINLEN) && (len != 4))
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync len = MINLEN;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync buffree = in->buffer->size - in->buffer->use;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (buffree <= 0) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlIOErr(XML_IO_BUFFER_FULL, NULL);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync in->error = XML_IO_BUFFER_FULL;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return(-1);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync needSize = in->buffer->use + len + 1;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (needSize > in->buffer->size){
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (!xmlBufferResize(in->buffer, needSize)){
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlIOErrMemory("growing input buffer");
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync in->error = XML_ERR_NO_MEMORY;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return(-1);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync buffer = (char *)&in->buffer->content[in->buffer->use];
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync /*
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Call the read method for this I/O type.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (in->readcallback != NULL) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync res = in->readcallback(in->context, &buffer[0], len);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (res <= 0)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync in->readcallback = endOfInput;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync } else {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlIOErr(XML_IO_NO_INPUT, NULL);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync in->error = XML_IO_NO_INPUT;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return(-1);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (res < 0) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return(-1);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync len = res;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (in->encoder != NULL) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync unsigned int use;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync /*
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Store the data in the incoming raw buffer
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (in->raw == NULL) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync in->raw = xmlBufferCreate();
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync res = xmlBufferAdd(in->raw, (const xmlChar *) buffer, len);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (res != 0)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return(-1);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync /*
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * convert as much as possible to the parser reading buffer.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync use = in->raw->use;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync nbchars = xmlCharEncInFunc(in->encoder, in->buffer, in->raw);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (nbchars < 0) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlIOErr(XML_IO_ENCODER, NULL);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync in->error = XML_IO_ENCODER;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return(-1);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync in->rawconsumed += (use - in->raw->use);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync } else {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync nbchars = len;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync in->buffer->use += nbchars;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync buffer[nbchars] = 0;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#ifdef DEBUG_INPUT
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlGenericError(xmlGenericErrorContext,
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync "I/O: read %d chars, buffer %d/%d\n",
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync nbchars, in->buffer->use, in->buffer->size);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#endif
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return(nbchars);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync}
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync/**
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * xmlParserInputBufferRead:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @in: a buffered parser input
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @len: indicative value of the amount of chars to read
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync *
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Refresh the content of the input buffer, the old data are considered
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * consumed
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * This routine handle the I18N transcoding to internal UTF-8
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync *
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Returns the number of chars read and stored in the buffer, or -1
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * in case of error.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncint
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncxmlParserInputBufferRead(xmlParserInputBufferPtr in, int len) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if ((in == NULL) || (in->error)) return(-1);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (in->readcallback != NULL)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return(xmlParserInputBufferGrow(in, len));
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync else if ((in->buffer != NULL) &&
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync (in->buffer->alloc == XML_BUFFER_ALLOC_IMMUTABLE))
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return(0);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync else
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return(-1);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync}
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#ifdef LIBXML_OUTPUT_ENABLED
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync/**
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * xmlOutputBufferWrite:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @out: a buffered parser output
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @len: the size in bytes of the array.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @buf: an char array
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync *
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Write the content of the array in the output I/O buffer
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * This routine handle the I18N transcoding from internal UTF-8
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * The buffer is lossless, i.e. will store in case of partial
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * or delayed writes.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync *
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Returns the number of chars immediately written, or -1
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * in case of error.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncint
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncxmlOutputBufferWrite(xmlOutputBufferPtr out, int len, const char *buf) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync int nbchars = 0; /* number of chars to output to I/O */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync int ret; /* return from function call */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync int written = 0; /* number of char written to I/O so far */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync int chunk; /* number of byte curreent processed from buf */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if ((out == NULL) || (out->error)) return(-1);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (len < 0) return(0);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (out->error) return(-1);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync do {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync chunk = len;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (chunk > 4 * MINLEN)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync chunk = 4 * MINLEN;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync /*
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * first handle encoding stuff.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (out->encoder != NULL) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync /*
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Store the data in the incoming raw buffer
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (out->conv == NULL) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync out->conv = xmlBufferCreate();
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync ret = xmlBufferAdd(out->buffer, (const xmlChar *) buf, chunk);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (ret != 0)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return(-1);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if ((out->buffer->use < MINLEN) && (chunk == len))
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync goto done;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync /*
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * convert as much as possible to the parser reading buffer.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync ret = xmlCharEncOutFunc(out->encoder, out->conv, out->buffer);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if ((ret < 0) && (ret != -3)) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlIOErr(XML_IO_ENCODER, NULL);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync out->error = XML_IO_ENCODER;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return(-1);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync nbchars = out->conv->use;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync } else {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync ret = xmlBufferAdd(out->buffer, (const xmlChar *) buf, chunk);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (ret != 0)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return(-1);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync nbchars = out->buffer->use;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync buf += chunk;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync len -= chunk;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if ((nbchars < MINLEN) && (len <= 0))
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync goto done;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (out->writecallback) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync /*
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * second write the stuff to the I/O channel
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (out->encoder != NULL) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync ret = out->writecallback(out->context,
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync (const char *)out->conv->content, nbchars);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (ret >= 0)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlBufferShrink(out->conv, ret);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync } else {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync ret = out->writecallback(out->context,
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync (const char *)out->buffer->content, nbchars);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (ret >= 0)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlBufferShrink(out->buffer, ret);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (ret < 0) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlIOErr(XML_IO_WRITE, NULL);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync out->error = XML_IO_WRITE;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return(ret);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync out->written += ret;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync written += nbchars;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync } while (len > 0);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncdone:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#ifdef DEBUG_INPUT
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlGenericError(xmlGenericErrorContext,
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync "I/O: wrote %d chars\n", written);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#endif
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return(written);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync}
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync/**
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * xmlEscapeContent:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @out: a pointer to an array of bytes to store the result
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @outlen: the length of @out
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @in: a pointer to an array of unescaped UTF-8 bytes
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @inlen: the length of @in
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync *
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Take a block of UTF-8 chars in and escape them.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Returns 0 if success, or -1 otherwise
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * The value of @inlen after return is the number of octets consumed
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * if the return value is positive, else unpredictable.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * The value of @outlen after return is the number of octets consumed.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncstatic int
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncxmlEscapeContent(unsigned char* out, int *outlen,
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync const xmlChar* in, int *inlen) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync unsigned char* outstart = out;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync const unsigned char* base = in;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync unsigned char* outend = out + *outlen;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync const unsigned char* inend;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync inend = in + (*inlen);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync while ((in < inend) && (out < outend)) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (*in == '<') {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (outend - out < 4) break;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync *out++ = '&';
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync *out++ = 'l';
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync *out++ = 't';
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync *out++ = ';';
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync } else if (*in == '>') {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (outend - out < 4) break;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync *out++ = '&';
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync *out++ = 'g';
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync *out++ = 't';
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync *out++ = ';';
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync } else if (*in == '&') {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (outend - out < 5) break;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync *out++ = '&';
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync *out++ = 'a';
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync *out++ = 'm';
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync *out++ = 'p';
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync *out++ = ';';
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync } else if (*in == '\r') {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (outend - out < 5) break;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync *out++ = '&';
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync *out++ = '#';
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync *out++ = '1';
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync *out++ = '3';
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync *out++ = ';';
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync } else {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync *out++ = (unsigned char) *in;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync ++in;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync *outlen = out - outstart;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync *inlen = in - base;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return(0);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync}
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync/**
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * xmlOutputBufferWriteEscape:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @out: a buffered parser output
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @str: a zero terminated UTF-8 string
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @escaping: an optional escaping function (or NULL)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync *
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Write the content of the string in the output I/O buffer
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * This routine escapes the caracters and then handle the I18N
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * transcoding from internal UTF-8
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * The buffer is lossless, i.e. will store in case of partial
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * or delayed writes.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync *
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Returns the number of chars immediately written, or -1
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * in case of error.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncint
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncxmlOutputBufferWriteEscape(xmlOutputBufferPtr out, const xmlChar *str,
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlCharEncodingOutputFunc escaping) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync int nbchars = 0; /* number of chars to output to I/O */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync int ret; /* return from function call */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync int written = 0; /* number of char written to I/O so far */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync int oldwritten=0;/* loop guard */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync int chunk; /* number of byte currently processed from str */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync int len; /* number of bytes in str */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync int cons; /* byte from str consumed */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if ((out == NULL) || (out->error) || (str == NULL) ||
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync (out->buffer == NULL) ||
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync (out->buffer->alloc == XML_BUFFER_ALLOC_IMMUTABLE)) return(-1);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync len = strlen((const char *)str);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (len < 0) return(0);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (out->error) return(-1);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (escaping == NULL) escaping = xmlEscapeContent;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync do {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync oldwritten = written;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync /*
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * how many bytes to consume and how many bytes to store.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync cons = len;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync chunk = (out->buffer->size - out->buffer->use) - 1;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync /*
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * first handle encoding stuff.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (out->encoder != NULL) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync /*
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Store the data in the incoming raw buffer
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (out->conv == NULL) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync out->conv = xmlBufferCreate();
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync ret = escaping(out->buffer->content + out->buffer->use ,
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync &chunk, str, &cons);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if ((ret < 0) || (chunk == 0)) /* chunk==0 => nothing done */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return(-1);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync out->buffer->use += chunk;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync out->buffer->content[out->buffer->use] = 0;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if ((out->buffer->use < MINLEN) && (cons == len))
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync goto done;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync /*
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * convert as much as possible to the output buffer.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync ret = xmlCharEncOutFunc(out->encoder, out->conv, out->buffer);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if ((ret < 0) && (ret != -3)) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlIOErr(XML_IO_ENCODER, NULL);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync out->error = XML_IO_ENCODER;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return(-1);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync nbchars = out->conv->use;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync } else {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync ret = escaping(out->buffer->content + out->buffer->use ,
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync &chunk, str, &cons);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if ((ret < 0) || (chunk == 0)) /* chunk==0 => nothing done */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return(-1);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync out->buffer->use += chunk;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync out->buffer->content[out->buffer->use] = 0;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync nbchars = out->buffer->use;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync str += cons;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync len -= cons;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if ((nbchars < MINLEN) && (len <= 0))
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync goto done;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (out->writecallback) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync /*
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * second write the stuff to the I/O channel
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (out->encoder != NULL) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync ret = out->writecallback(out->context,
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync (const char *)out->conv->content, nbchars);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (ret >= 0)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlBufferShrink(out->conv, ret);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync } else {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync ret = out->writecallback(out->context,
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync (const char *)out->buffer->content, nbchars);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (ret >= 0)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlBufferShrink(out->buffer, ret);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (ret < 0) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlIOErr(XML_IO_WRITE, NULL);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync out->error = XML_IO_WRITE;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return(ret);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync out->written += ret;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync } else if (out->buffer->size - out->buffer->use < MINLEN) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlBufferResize(out->buffer, out->buffer->size + MINLEN);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync written += nbchars;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync } while ((len > 0) && (oldwritten != written));
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncdone:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#ifdef DEBUG_INPUT
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlGenericError(xmlGenericErrorContext,
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync "I/O: wrote %d chars\n", written);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#endif
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return(written);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync}
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync/**
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * xmlOutputBufferWriteString:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @out: a buffered parser output
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @str: a zero terminated C string
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync *
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Write the content of the string in the output I/O buffer
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * This routine handle the I18N transcoding from internal UTF-8
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * The buffer is lossless, i.e. will store in case of partial
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * or delayed writes.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync *
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Returns the number of chars immediately written, or -1
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * in case of error.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncint
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncxmlOutputBufferWriteString(xmlOutputBufferPtr out, const char *str) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync int len;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if ((out == NULL) || (out->error)) return(-1);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (str == NULL)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return(-1);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync len = strlen(str);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (len > 0)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return(xmlOutputBufferWrite(out, len, str));
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return(len);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync}
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync/**
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * xmlOutputBufferFlush:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @out: a buffered output
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync *
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * flushes the output I/O channel
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync *
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Returns the number of byte written or -1 in case of error.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncint
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncxmlOutputBufferFlush(xmlOutputBufferPtr out) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync int nbchars = 0, ret = 0;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if ((out == NULL) || (out->error)) return(-1);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync /*
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * first handle encoding stuff.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if ((out->conv != NULL) && (out->encoder != NULL)) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync /*
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * convert as much as possible to the parser reading buffer.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync nbchars = xmlCharEncOutFunc(out->encoder, out->conv, out->buffer);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (nbchars < 0) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlIOErr(XML_IO_ENCODER, NULL);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync out->error = XML_IO_ENCODER;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return(-1);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync /*
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * second flush the stuff to the I/O channel
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if ((out->conv != NULL) && (out->encoder != NULL) &&
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync (out->writecallback != NULL)) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync ret = out->writecallback(out->context,
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync (const char *)out->conv->content, out->conv->use);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (ret >= 0)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlBufferShrink(out->conv, ret);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync } else if (out->writecallback != NULL) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync ret = out->writecallback(out->context,
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync (const char *)out->buffer->content, out->buffer->use);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (ret >= 0)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlBufferShrink(out->buffer, ret);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (ret < 0) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlIOErr(XML_IO_FLUSH, NULL);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync out->error = XML_IO_FLUSH;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return(ret);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync out->written += ret;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#ifdef DEBUG_INPUT
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlGenericError(xmlGenericErrorContext,
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync "I/O: flushed %d chars\n", ret);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#endif
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return(ret);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync}
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#endif /* LIBXML_OUTPUT_ENABLED */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync/**
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * xmlParserGetDirectory:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @filename: the path to a file
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync *
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * lookup the directory for that file
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync *
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Returns a new allocated string containing the directory, or NULL.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncchar *
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncxmlParserGetDirectory(const char *filename) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync char *ret = NULL;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync char dir[1024];
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync char *cur;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#ifdef _WIN32_WCE /* easy way by now ... wince does not have dirs! */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return NULL;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#endif
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (xmlInputCallbackInitialized == 0)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlRegisterDefaultInputCallbacks();
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (filename == NULL) return(NULL);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#if defined(WIN32) && !defined(__CYGWIN__)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync# define IS_XMLPGD_SEP(ch) ((ch=='/')||(ch=='\\'))
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#else
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync# define IS_XMLPGD_SEP(ch) (ch=='/')
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#endif
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync strncpy(dir, filename, 1023);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync dir[1023] = 0;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync cur = &dir[strlen(dir)];
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync while (cur > dir) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (IS_XMLPGD_SEP(*cur)) break;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync cur --;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (IS_XMLPGD_SEP(*cur)) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (cur == dir) dir[1] = 0;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync else *cur = 0;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync ret = xmlMemStrdup(dir);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync } else {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (getcwd(dir, 1024) != NULL) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync dir[1023] = 0;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync ret = xmlMemStrdup(dir);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return(ret);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#undef IS_XMLPGD_SEP
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync}
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync/****************************************************************
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * *
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * External entities loading *
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * *
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync ****************************************************************/
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync/**
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * xmlCheckHTTPInput:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @ctxt: an XML parser context
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @ret: an XML parser input
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync *
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Check an input in case it was created from an HTTP stream, in that
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * case it will handle encoding and update of the base URL in case of
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * redirection. It also checks for HTTP errors in which case the input
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * is cleanly freed up and an appropriate error is raised in context
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync *
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Returns the input or NULL in case of HTTP error.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncxmlParserInputPtr
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncxmlCheckHTTPInput(xmlParserCtxtPtr ctxt, xmlParserInputPtr ret) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#ifdef LIBXML_HTTP_ENABLED
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if ((ret != NULL) && (ret->buf != NULL) &&
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync (ret->buf->readcallback == xmlIOHTTPRead) &&
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync (ret->buf->context != NULL)) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync const char *encoding;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync const char *redir;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync const char *mime;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync int code;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync code = xmlNanoHTTPReturnCode(ret->buf->context);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (code >= 400) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync /* fatal error */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (ret->filename != NULL)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync __xmlLoaderErr(ctxt, "failed to load HTTP resource \"%s\"\n",
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync (const char *) ret->filename);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync else
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync __xmlLoaderErr(ctxt, "failed to load HTTP resource\n", NULL);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlFreeInputStream(ret);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync ret = NULL;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync } else {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync mime = xmlNanoHTTPMimeType(ret->buf->context);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if ((xmlStrstr(BAD_CAST mime, BAD_CAST "/xml")) ||
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync (xmlStrstr(BAD_CAST mime, BAD_CAST "+xml"))) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync encoding = xmlNanoHTTPEncoding(ret->buf->context);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (encoding != NULL) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlCharEncodingHandlerPtr handler;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync handler = xmlFindCharEncodingHandler(encoding);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (handler != NULL) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlSwitchInputEncoding(ctxt, ret, handler);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync } else {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync __xmlErrEncoding(ctxt, XML_ERR_UNKNOWN_ENCODING,
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync "Unknown encoding %s",
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync BAD_CAST encoding, NULL);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (ret->encoding == NULL)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync ret->encoding = xmlStrdup(BAD_CAST encoding);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#if 0
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync } else if (xmlStrstr(BAD_CAST mime, BAD_CAST "html")) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#endif
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync redir = xmlNanoHTTPRedir(ret->buf->context);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (redir != NULL) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (ret->filename != NULL)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlFree((xmlChar *) ret->filename);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (ret->directory != NULL) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlFree((xmlChar *) ret->directory);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync ret->directory = NULL;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync ret->filename =
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync (char *) xmlStrdup((const xmlChar *) redir);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#endif
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return(ret);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync}
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncstatic int xmlNoNetExists(const char *URL) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync const char *path;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (URL == NULL)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return(0);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (!xmlStrncasecmp(BAD_CAST URL, BAD_CAST "file://localhost/", 17))
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#if defined (_WIN32) || defined (__DJGPP__) && !defined(__CYGWIN__)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync path = &URL[17];
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#else
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync path = &URL[16];
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#endif
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync else if (!xmlStrncasecmp(BAD_CAST URL, BAD_CAST "file:///", 8)) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#if defined (_WIN32) || defined (__DJGPP__) && !defined(__CYGWIN__)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync path = &URL[8];
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#else
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync path = &URL[7];
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#endif
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync } else
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync path = URL;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return xmlCheckFilename(path);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync}
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#ifdef LIBXML_CATALOG_ENABLED
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync/**
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * xmlResolveResourceFromCatalog:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @URL: the URL for the entity to load
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @ID: the System ID for the entity to load
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @ctxt: the context in which the entity is called or NULL
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync *
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Resolves the URL and ID against the appropriate catalog.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * This function is used by xmlDefaultExternalEntityLoader and
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * xmlNoNetExternalEntityLoader.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync *
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Returns a new allocated URL, or NULL.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncstatic xmlChar *
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncxmlResolveResourceFromCatalog(const char *URL, const char *ID,
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlParserCtxtPtr ctxt) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlChar *resource = NULL;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlCatalogAllow pref;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync /*
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * If the resource doesn't exists as a file,
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * try to load it from the resource pointed in the catalogs
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync pref = xmlCatalogGetDefaults();
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if ((pref != XML_CATA_ALLOW_NONE) && (!xmlNoNetExists(URL))) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync /*
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Do a local lookup
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if ((ctxt != NULL) && (ctxt->catalogs != NULL) &&
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync ((pref == XML_CATA_ALLOW_ALL) ||
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync (pref == XML_CATA_ALLOW_DOCUMENT))) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync resource = xmlCatalogLocalResolve(ctxt->catalogs,
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync (const xmlChar *)ID,
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync (const xmlChar *)URL);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync /*
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Try a global lookup
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if ((resource == NULL) &&
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync ((pref == XML_CATA_ALLOW_ALL) ||
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync (pref == XML_CATA_ALLOW_GLOBAL))) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync resource = xmlCatalogResolve((const xmlChar *)ID,
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync (const xmlChar *)URL);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if ((resource == NULL) && (URL != NULL))
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync resource = xmlStrdup((const xmlChar *) URL);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync /*
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * TODO: do an URI lookup on the reference
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if ((resource != NULL) && (!xmlNoNetExists((const char *)resource))) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlChar *tmp = NULL;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if ((ctxt != NULL) && (ctxt->catalogs != NULL) &&
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync ((pref == XML_CATA_ALLOW_ALL) ||
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync (pref == XML_CATA_ALLOW_DOCUMENT))) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync tmp = xmlCatalogLocalResolveURI(ctxt->catalogs, resource);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if ((tmp == NULL) &&
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync ((pref == XML_CATA_ALLOW_ALL) ||
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync (pref == XML_CATA_ALLOW_GLOBAL))) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync tmp = xmlCatalogResolveURI(resource);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (tmp != NULL) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlFree(resource);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync resource = tmp;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return resource;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync}
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#endif
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync/**
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * xmlDefaultExternalEntityLoader:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @URL: the URL for the entity to load
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @ID: the System ID for the entity to load
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @ctxt: the context in which the entity is called or NULL
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync *
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * By default we don't load external entitites, yet.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync *
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Returns a new allocated xmlParserInputPtr, or NULL.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncstatic xmlParserInputPtr
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncxmlDefaultExternalEntityLoader(const char *URL, const char *ID,
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlParserCtxtPtr ctxt)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync{
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlParserInputPtr ret = NULL;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlChar *resource = NULL;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#ifdef DEBUG_EXTERNAL_ENTITIES
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlGenericError(xmlGenericErrorContext,
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync "xmlDefaultExternalEntityLoader(%s, xxx)\n", URL);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#endif
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if ((ctxt != NULL) && (ctxt->options & XML_PARSE_NONET)) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync int options = ctxt->options;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync ctxt->options -= XML_PARSE_NONET;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync ret = xmlNoNetExternalEntityLoader(URL, ID, ctxt);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync ctxt->options = options;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return(ret);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#ifdef LIBXML_CATALOG_ENABLED
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync resource = xmlResolveResourceFromCatalog(URL, ID, ctxt);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#endif
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (resource == NULL)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync resource = (xmlChar *) URL;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (resource == NULL) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (ID == NULL)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync ID = "NULL";
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync __xmlLoaderErr(ctxt, "failed to load external entity \"%s\"\n", ID);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return (NULL);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync ret = xmlNewInputFromFile(ctxt, (const char *) resource);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if ((resource != NULL) && (resource != (xmlChar *) URL))
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlFree(resource);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return (ret);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync}
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncstatic xmlExternalEntityLoader xmlCurrentExternalEntityLoader =
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlDefaultExternalEntityLoader;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync/**
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * xmlSetExternalEntityLoader:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @f: the new entity resolver function
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync *
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Changes the defaultexternal entity resolver function for the application
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncvoid
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncxmlSetExternalEntityLoader(xmlExternalEntityLoader f) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlCurrentExternalEntityLoader = f;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync}
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync/**
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * xmlGetExternalEntityLoader:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync *
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Get the default external entity resolver function for the application
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync *
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Returns the xmlExternalEntityLoader function pointer
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncxmlExternalEntityLoader
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncxmlGetExternalEntityLoader(void) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return(xmlCurrentExternalEntityLoader);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync}
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync/**
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * xmlLoadExternalEntity:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @URL: the URL for the entity to load
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @ID: the Public ID for the entity to load
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @ctxt: the context in which the entity is called or NULL
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync *
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Load an external entity, note that the use of this function for
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * unparsed entities may generate problems
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync *
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Returns the xmlParserInputPtr or NULL
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncxmlParserInputPtr
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncxmlLoadExternalEntity(const char *URL, const char *ID,
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlParserCtxtPtr ctxt) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if ((URL != NULL) && (xmlNoNetExists(URL) == 0)) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync char *canonicFilename;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlParserInputPtr ret;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync canonicFilename = (char *) xmlCanonicPath((const xmlChar *) URL);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (canonicFilename == NULL) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlIOErrMemory("building canonical path\n");
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return(NULL);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync ret = xmlCurrentExternalEntityLoader(canonicFilename, ID, ctxt);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlFree(canonicFilename);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return(ret);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return(xmlCurrentExternalEntityLoader(URL, ID, ctxt));
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync}
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync/************************************************************************
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * *
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Disabling Network access *
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * *
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync ************************************************************************/
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync/**
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * xmlNoNetExternalEntityLoader:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @URL: the URL for the entity to load
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @ID: the System ID for the entity to load
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @ctxt: the context in which the entity is called or NULL
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync *
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * A specific entity loader disabling network accesses, though still
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * allowing local catalog accesses for resolution.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync *
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Returns a new allocated xmlParserInputPtr, or NULL.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncxmlParserInputPtr
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncxmlNoNetExternalEntityLoader(const char *URL, const char *ID,
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlParserCtxtPtr ctxt) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlParserInputPtr input = NULL;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlChar *resource = NULL;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#ifdef LIBXML_CATALOG_ENABLED
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync resource = xmlResolveResourceFromCatalog(URL, ID, ctxt);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#endif
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (resource == NULL)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync resource = (xmlChar *) URL;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (resource != NULL) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if ((!xmlStrncasecmp(BAD_CAST resource, BAD_CAST "ftp://", 6)) ||
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync (!xmlStrncasecmp(BAD_CAST resource, BAD_CAST "http://", 7))) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlIOErr(XML_IO_NETWORK_ATTEMPT, (const char *) resource);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (resource != (xmlChar *) URL)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlFree(resource);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return(NULL);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync input = xmlDefaultExternalEntityLoader((const char *) resource, ID, ctxt);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (resource != (xmlChar *) URL)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlFree(resource);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return(input);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync}
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#define bottom_xmlIO
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#include "elfgcchack.h"