38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * xmlIO.c : implementation of the I/O interfaces used by the parser
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * See Copyright for the status of this software.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * daniel@veillard.com
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * 14 Nov 2000 ht - for VMS, truncated name of long functions to under 32 char
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync/* Figure a portable way to know if a file is a directory. */
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# if defined(_WIN32) || defined (__DJGPP__) && !defined (__CYGWIN__)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync/* #define VERBOSE_FAILURE */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync/* #define DEBUG_EXTERNAL_ENTITIES */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync/* #define DEBUG_INPUT */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Input I/O callback sets
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncstatic xmlInputCallback xmlInputCallbackTable[MAX_INPUT_CALLBACK];
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Output I/O callback sets
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncstatic xmlOutputCallback xmlOutputCallbackTable[MAX_OUTPUT_CALLBACK];
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#endif /* LIBXML_OUTPUT_ENABLED */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync/************************************************************************
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Tree memory error handler *
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync ************************************************************************/
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync "Inappropriate message buffer length",/* EMSGSIZE */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync "Attempt to load network entity %s", /* XML_IO_NETWORK_ATTEMPT */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync "flush error",
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync "write error",
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync "no input",
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync "buffer full",
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync "loading error",
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#if defined(_WIN32) || defined (__DJGPP__) && !defined (__CYGWIN__)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * __xmlIOWin32UTF8ToWChar:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @u8String: uft-8 string
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Convert a string from utf-8 to wchar (WINDOWS ONLY!)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync MultiByteToWideChar(CP_UTF8, MB_ERR_INVALID_CHARS, u8String,
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * xmlIOErrMemory:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @extra: extra informations
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Handle an out of memory condition
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync __xmlSimpleError(XML_FROM_IO, XML_ERR_NO_MEMORY, NULL, NULL, extra);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * __xmlIOErr:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @code: the error number
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @extra: extra informations
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Handle an I/O error
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (code == 0) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync else if (errno == ECANCELED) code = XML_IO_ECANCELED;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync else if (errno == EINPROGRESS) code = XML_IO_EINPROGRESS;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync else if (errno == EMSGSIZE) code = XML_IO_EMSGSIZE;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync else if (errno == ENAMETOOLONG) code = XML_IO_ENAMETOOLONG;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync else if (errno == ENOTEMPTY) code = XML_IO_ENOTEMPTY;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync else if (errno == ETIMEDOUT) code = XML_IO_ETIMEDOUT;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync else if (errno == ENOTSOCK) code = XML_IO_ENOTSOCK;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync else if (errno == ECONNREFUSED) code = XML_IO_ECONNREFUSED;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync else if (errno == ETIMEDOUT) code = XML_IO_ETIMEDOUT;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync else if (errno == ENETUNREACH) code = XML_IO_ENETUNREACH;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync else if (errno == EADDRINUSE) code = XML_IO_EADDRINUSE;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync else if (errno == EINPROGRESS) code = XML_IO_EINPROGRESS;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync else if (errno == EALREADY) code = XML_IO_EALREADY;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync else if (errno == EAFNOSUPPORT) code = XML_IO_EAFNOSUPPORT;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#endif /* HAVE_ERRNO_H */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (code >= XML_IO_UNKNOWN) idx = code - XML_IO_UNKNOWN;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (idx >= (sizeof(IOerr) / sizeof(IOerr[0]))) idx = 0;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync __xmlSimpleError(domain, code, NULL, IOerr[idx], extra);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * xmlIOErr:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @code: the error number
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @extra: extra informations
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Handle an I/O error
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * __xmlLoaderErr:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @ctx: the parser context
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @extra: extra informations
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Handle a resource access error
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync__xmlLoaderErr(void *ctx, const char *msg, const char *filename)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync __xmlRaiseError(schannel, channel, data, ctxt, NULL, XML_FROM_IO,
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync/************************************************************************
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Tree memory error handler *
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync ************************************************************************/
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * xmlNormalizeWindowsPath:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @path: the input file path
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * This function is obsolete. Please see xmlURIFromPath in uri.c for
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * a better solution.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Returns a canonicalized version of the path
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * xmlCleanupInputCallbacks:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * clears the entire input callback table. this includes the
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * compiled-in I/O.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * xmlPopInputCallbacks:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Clear the top input callback from the input stack. this includes the
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * compiled-in I/O.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Returns the number of input callback registered or -1 in case of error.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return(-1);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return(-1);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlInputCallbackTable[xmlInputCallbackNr].matchcallback = NULL;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlInputCallbackTable[xmlInputCallbackNr].opencallback = NULL;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlInputCallbackTable[xmlInputCallbackNr].readcallback = NULL;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlInputCallbackTable[xmlInputCallbackNr].closecallback = NULL;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * xmlCleanupOutputCallbacks:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * clears the entire output callback table. this includes the
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * compiled-in I/O callbacks.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#endif /* LIBXML_OUTPUT_ENABLED */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync/************************************************************************
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Standard I/O for file accesses *
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync ************************************************************************/
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#if defined(_WIN32) || defined (__DJGPP__) && !defined (__CYGWIN__)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * xmlWrapOpenUtf8:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @path: the path in utf-8 encoding
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @mode: type of access (0 - read, 1 - write)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * function opens the file specified by @path
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync /* maybe path in native encoding */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * xmlWrapStatUtf8:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @path: the path in utf-8 encoding
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @info: structure that stores results
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * function obtains information about the file or directory
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync /* maybe path in native encoding */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * xmlWrapOpenNative:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @path: the path
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @mode: type of access (0 - read, 1 - write)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * function opens the file specified by @path
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * xmlWrapStatNative:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @path: the path
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @info: structure that stores results
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * function obtains information about the file or directory
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncxmlWrapStatNative(const char *path,struct stat *info)
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 * xmlInitPlatformSpecificIo:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Initialize platform specific features.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if(GetVersionEx(&osvi) && (osvi.dwPlatformId == VER_PLATFORM_WIN32_NT)) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * xmlCheckFilename:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @path: the path to check
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * function checks to see if @path is a valid source
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * (file, socket...) for XML.
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#if defined(_WIN32) || defined (__DJGPP__) && !defined (__CYGWIN__)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#endif /* HAVE_STAT */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * xmlFdRead:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @context: the I/O context
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @buffer: where to drop data
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @len: number of bytes to read
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Read @len bytes to @buffer from the I/O channel.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Returns the number of bytes written
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncxmlFdRead (void * context, char * buffer, int len) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * xmlFdWrite:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @context: the I/O context
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @buffer: where to get data
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @len: number of bytes to write
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Write @len bytes from @buffer to the I/O channel.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Returns the number of bytes written
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncxmlFdWrite (void * context, const char * buffer, int len) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync ret = write((int) (long) context, &buffer[0], len);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#endif /* LIBXML_OUTPUT_ENABLED */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * xmlFdClose:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @context: the I/O context
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Close an I/O channel
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Returns 0 in case of success and error code otherwise
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * xmlFileMatch:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @filename: the URI for matching
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * input from FILE *
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Returns 1 if matches, 0 otherwise
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncxmlFileMatch (const char *filename ATTRIBUTE_UNUSED) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * xmlFileOpen_real:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @filename: the URI for matching
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * input from FILE *, supports compressed input
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * if @filename is " " then the standard input is used
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Returns an I/O context or NULL in case of error
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncstatic void *
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return((void *) fd);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (!xmlStrncasecmp(BAD_CAST filename, BAD_CAST "file://localhost/", 17)) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#if defined (_WIN32) || defined (__DJGPP__) && !defined(__CYGWIN__)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync } else if (!xmlStrncasecmp(BAD_CAST filename, BAD_CAST "file:///", 8)) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#if defined (_WIN32) || defined (__DJGPP__) && !defined(__CYGWIN__)
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#if defined(_WIN32) || defined (__DJGPP__) && !defined (__CYGWIN__)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#endif /* WIN32 */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return((void *) fd);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * xmlFileOpen:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @filename: the URI for matching
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Wrapper around xmlFileOpen_real that try it with an unescaped
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * version of @filename, if this fails fallback to @filename
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Returns a handler or NULL in case or failure
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync unescaped = xmlURIUnescapeString(filename, 0, NULL);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * xmlFileOpenW:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @filename: the URI for matching
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * output to from FILE *,
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * if @filename is "-" then the standard output is used
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Returns an I/O context or NULL in case of error
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncstatic void *
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return((void *) fd);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (!xmlStrncasecmp(BAD_CAST filename, BAD_CAST "file://localhost/", 17))
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#if defined (_WIN32) || defined (__DJGPP__) && !defined(__CYGWIN__)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync else if (!xmlStrncasecmp(BAD_CAST filename, BAD_CAST "file:///", 8)) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#if defined (_WIN32) || defined (__DJGPP__) && !defined(__CYGWIN__)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#if defined(_WIN32) || defined (__DJGPP__) && !defined (__CYGWIN__)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#endif /* WIN32 */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return((void *) fd);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#endif /* LIBXML_OUTPUT_ENABLED */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * xmlFileRead:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @context: the I/O context
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @buffer: where to drop data
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @len: number of bytes to write
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Read @len bytes to @buffer from the I/O channel.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Returns the number of bytes written or < 0 in case of failure
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncxmlFileRead (void * context, char * buffer, int len) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return(-1);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * xmlFileWrite:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @context: the I/O context
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @buffer: where to drop data
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @len: number of bytes to write
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Write @len bytes from @buffer to the I/O channel.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Returns the number of bytes written
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncxmlFileWrite (void * context, const char * buffer, int len) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return(-1);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync items = fwrite(&buffer[0], len, 1, (FILE *) context);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return(-1);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#endif /* LIBXML_OUTPUT_ENABLED */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * xmlFileClose:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @context: the I/O context
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Close an I/O channel
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Returns 0 or -1 in case of error
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return(-1);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync ret = ( fclose((FILE *) context) == EOF ) ? -1 : 0;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * xmlFileFlush:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @context: the I/O context
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Flush an I/O channel
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return(-1);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync ret = ( fflush((FILE *) context) == EOF ) ? -1 : 0;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * xmlBufferWrite:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @context: the xmlBuffer
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @buffer: the data to write
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @len: number of bytes to write
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Write @len bytes from @buffer to the xml buffer
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Returns the number of bytes written
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncxmlBufferWrite (void * context, const char * buffer, int len) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync ret = xmlBufferAdd((xmlBufferPtr) context, (const xmlChar *) buffer, len);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return(-1);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync/************************************************************************
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * I/O for compressed file accesses *
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync ************************************************************************/
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * xmlGzfileMatch:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @filename: the URI for matching
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * input from compressed file test
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Returns 1 if matches, 0 otherwise
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncxmlGzfileMatch (const char *filename ATTRIBUTE_UNUSED) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * xmlGzfileOpen_real:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @filename: the URI for matching
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * input from compressed file open
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * if @filename is " " then the standard input is used
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Returns an I/O context or NULL in case of error
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncstatic void *
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return((void *) fd);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (!xmlStrncasecmp(BAD_CAST filename, BAD_CAST "file://localhost/", 17))
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#if defined (_WIN32) || defined (__DJGPP__) && !defined(__CYGWIN__)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync else if (!xmlStrncasecmp(BAD_CAST filename, BAD_CAST "file:///", 8)) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#if defined (_WIN32) || defined (__DJGPP__) && !defined(__CYGWIN__)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return((void *) fd);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * xmlGzfileOpen:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @filename: the URI for matching
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Wrapper around xmlGzfileOpen if the open fais, it will
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * try to unescape @filename
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncstatic void *
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync unescaped = xmlURIUnescapeString(filename, 0, NULL);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * xmlGzfileOpenW:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @filename: the URI for matching
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @compression: the compression factor (0 - 9 included)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * input from compressed file open
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * if @filename is " " then the standard input is used
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Returns an I/O context or NULL in case of error
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncstatic void *
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncxmlGzfileOpenW (const char *filename, int compression) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return((void *) fd);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (!xmlStrncasecmp(BAD_CAST filename, BAD_CAST "file://localhost/", 17))
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#if defined (_WIN32) || defined (__DJGPP__) && !defined(__CYGWIN__)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync else if (!xmlStrncasecmp(BAD_CAST filename, BAD_CAST "file:///", 8)) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#if defined (_WIN32) || defined (__DJGPP__) && !defined(__CYGWIN__)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return((void *) fd);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#endif /* LIBXML_OUTPUT_ENABLED */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * xmlGzfileRead:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @context: the I/O context
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @buffer: where to drop data
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @len: number of bytes to write
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Read @len bytes to @buffer from the compressed I/O channel.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Returns the number of bytes written
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncxmlGzfileRead (void * context, char * buffer, int len) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * xmlGzfileWrite:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @context: the I/O context
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @buffer: where to drop data
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @len: number of bytes to write
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Write @len bytes from @buffer to the compressed I/O channel.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Returns the number of bytes written
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncxmlGzfileWrite (void * context, const char * buffer, int len) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync ret = gzwrite((gzFile) context, (char *) &buffer[0], len);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#endif /* LIBXML_OUTPUT_ENABLED */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * xmlGzfileClose:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @context: the I/O context
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Close a compressed I/O channel
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync ret = (gzclose((gzFile) context) == Z_OK ) ? 0 : -1;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#endif /* HAVE_ZLIB_H */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync/************************************************************************
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * I/O for HTTP file accesses *
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync ************************************************************************/
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync** Data structure and functions to work with sending compressed data
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync** via HTTP.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * append_reverse_ulong
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @buff: Compressed memory buffer
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @data: Unsigned long to append
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Append a unsigned long in reverse byte order to the end of the
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * memory buffer.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncappend_reverse_ulong( xmlZMemBuff * buff, unsigned long data ) {
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 * xmlFreeZMemBuff
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @buff: The memory buffer context to clear
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Release all the resources associated with the compressed memory buffer.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync "xmlFreeZMemBuff: Error releasing zlib context: %d\n",
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * xmlCreateZMemBuff
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync *@compression: Compression value to use
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.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncstatic void *
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return ( NULL );
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync /* Create the control and data areas */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return ( NULL );
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return ( NULL );
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync z_err = deflateInit2( &buff->zctrl, compression, Z_DEFLATED,
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync "Error initializing compression context. ZLIB error:",
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return ( NULL );
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync /* Set the header data. The CRC will be needed for the trailer */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync hdr_lgth = snprintf( (char *)buff->zbuff, buff->size,
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync "%c%c%c%c%c%c%c%c%c%c",
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync 0, 0, 0, 0, 0, 0, LXML_ZLIB_OS_CODE );
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return ( buff );
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * xmlZMemBuffExtend
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @buff: Buffer used to compress and consolidate data.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @ext_amt: Number of bytes to extend the buffer.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Extend the internal buffer used to store the compressed data by the
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * specified amount.
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.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncxmlZMemBuffExtend( xmlZMemBuffPtr buff, size_t ext_amt ) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return ( -1 );
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync else if ( ext_amt == 0 )
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return ( 0 );
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync "xmlZMemBuffExtend: %s\n%s %d bytes.\n",
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync "Buffer overwrite detected during compressed memory",
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync "buffer extension. Overflowed by",
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync (const xmlChar *) "xmlZMemBuffExtend: %s %lu bytes.\n",
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync "Allocation failure extending output buffer to",
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return ( rc );
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 * Compress and append data to the internal buffer. The data buffer
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * will be expanded if needed to store the additional data.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Returns the number of bytes appended to the buffer or -1 on error.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncxmlZMemBuffAppend( xmlZMemBuffPtr buff, const char * src, int len ) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return ( -1 );
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync ** Extend the buffer prior to deflate call if a reasonable amount
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync ** of output buffer space is not available.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync min_accept = buff->zctrl.avail_in / DFLT_ZLIB_RATIO;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return ( -1 );
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync (const xmlChar *) "xmlZMemBuffAppend: %s %d %s - %d",
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync "Compression error while appending",
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return ( -1 );
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync buff->crc = crc32( buff->crc, (unsigned char *)src, len );
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return ( len );
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * xmlZMemBuffGetContent
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @buff: Compressed memory content buffer
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @data_ref: Pointer reference to point to compressed content
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 * Returns the length of the compressed data or -1 on error.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncxmlZMemBuffGetContent( xmlZMemBuffPtr buff, char ** data_ref ) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return ( -1 );
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync /* Need to loop until compression output buffers are flushed */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync /* In this case Z_OK means more buffer space needed */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return ( -1 );
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync /* If the compression state is not Z_STREAM_END, some error occurred */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync /* Need to append the gzip data trailer */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if ( buff->zctrl.avail_out < ( 2 * sizeof( unsigned long ) ) ) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if ( xmlZMemBuffExtend(buff, (2 * sizeof(unsigned long))) == -1 )
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return ( -1 );
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 append_reverse_ulong( buff, buff->zctrl.total_in );
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync (const xmlChar *) "xmlZMemBuffGetContent: %s - %d\n",
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync "Error flushing zlib buffers. Error code", z_err );
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#endif /* LIBXML_OUTPUT_ENABLED */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#endif /* HAVE_ZLIB_H */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * xmlFreeHTTPWriteCtxt
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @ctxt: Context to cleanup
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Free allocated memory and reclaim system resources.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * No return value.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#endif /* LIBXML_OUTPUT_ENABLED */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * xmlIOHTTPMatch:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @filename: the URI for matching
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * check if the URI matches an HTTP one
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Returns 1 if matches, 0 otherwise
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (!xmlStrncasecmp(BAD_CAST filename, BAD_CAST "http://", 7))
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * xmlIOHTTPOpen:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @filename: the URI for matching
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * open an HTTP I/O channel
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Returns an I/O context or NULL in case of error
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * xmlIOHTTPOpenW:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @post_uri: The destination URI for the document
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @compression: The compression desired for the document.
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 * Returns an I/O context or NULL in case of error.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncxmlIOHTTPOpenW(const char *post_uri, int compression)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync (void) memset(ctxt, 0, sizeof(xmlIOHTTPWriteCtxt));
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync ctxt->uri = (char *) xmlStrdup((const xmlChar *)post_uri);
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 /* Any character conversions should have been done before this */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#endif /* LIBXML_OUTPUT_ENABLED */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * xmlIOHTTPDfltOpenW
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @post_uri: The destination URI for this document.
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 * Returns a pointer to the new IO context.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncstatic void *
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#endif /* LIBXML_OUTPUT_ENABLED */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * xmlIOHTTPRead:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @context: the I/O context
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @buffer: where to drop data
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @len: number of bytes to write
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Read @len bytes to @buffer from the I/O channel.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Returns the number of bytes written
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncxmlIOHTTPRead(void * context, char * buffer, int len) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * xmlIOHTTPWrite
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @context: previously opened writing context
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @buffer: data to output to temporary buffer
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @len: bytes to output
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Collect data from memory buffer into a temporary file for later
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * processing.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Returns number of bytes written.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncxmlIOHTTPWrite( void * context, const char * buffer, int len ) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if ( ( ctxt == NULL ) || ( ctxt->doc_buff == NULL ) || ( buffer == NULL ) )
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return ( -1 );
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if ( len > 0 ) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync /* Use gzwrite or fwrite as previously setup in the open call */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync len = xmlZMemBuffAppend( ctxt->doc_buff, buffer, len );
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync len = xmlOutputBufferWrite( ctxt->doc_buff, len, buffer );
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if ( len < 0 ) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync (const xmlChar *) "xmlIOHTTPWrite: %s\n%s '%s'.\n",
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync "Error appending to internal buffer.",
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync "Error sending document to URI",
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return ( len );
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#endif /* LIBXML_OUTPUT_ENABLED */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * xmlIOHTTPClose:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @context: the I/O context
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Close an HTTP I/O channel
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Returns 0
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * xmlIOHTTCloseWrite
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @context: The I/O context
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @http_mthd: The HTTP method to be used when sending the data
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Close the transmit HTTP I/O channel and actually send the data.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncxmlIOHTTPCloseWrite( void * context, const char * http_mthd ) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return ( -1 );
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync /* Retrieve the content from the appropriate buffer */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync content_lgth = xmlZMemBuffGetContent( ctxt->doc_buff, &http_content );
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync content_encoding = (char *) "Content-Encoding: gzip";
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync /* Pull the data out of the memory output buffer */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync (const xmlChar *) "xmlIOHTTPCloseWrite: %s '%s' %s '%s'.\n",
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync "Error retrieving content.\nUnable to",
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync http_ctxt = xmlNanoHTTPMethod( ctxt->uri, http_mthd, http_content,
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync /* If testing/debugging - dump reply with request content */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync "xmlNanoHTTPCloseWrite: HTTP %s to\n%s returned %d.\n",
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync ** Since either content or reply may be gzipped,
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync ** dump them to separate files instead of the
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync ** standard error context.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync (void)snprintf( buffer, sizeof(buffer), "%s.content", dump_name );
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync "Transmitted content saved in file: %s\n", buffer );
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync (void)snprintf( buffer, sizeof(buffer), "%s.reply", dump_name );
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#endif /* DEBUG_HTTP */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync (const xmlChar *) "xmlIOHTTPCloseWrite: HTTP '%s' of %d %s\n'%s' %s %d\n",
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync /* Final cleanups */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * xmlIOHTTPClosePut
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @context: The I/O context
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Close the transmit HTTP I/O channel and actually send data using a PUT
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * HTTP method.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * xmlIOHTTPClosePost
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @context: The I/O context
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Close the transmit HTTP I/O channel and actually send data using a POST
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * HTTP method.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#endif /* LIBXML_OUTPUT_ENABLED */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#endif /* LIBXML_HTTP_ENABLED */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync/************************************************************************
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * I/O for FTP file accesses *
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync ************************************************************************/
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * xmlIOFTPMatch:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @filename: the URI for matching
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * check if the URI matches an FTP one
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Returns 1 if matches, 0 otherwise
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (!xmlStrncasecmp(BAD_CAST filename, BAD_CAST "ftp://", 6))
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * xmlIOFTPOpen:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @filename: the URI for matching
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * open an FTP I/O channel
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Returns an I/O context or NULL in case of error
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * xmlIOFTPRead:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @context: the I/O context
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @buffer: where to drop data
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @len: number of bytes to write
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Read @len bytes to @buffer from the I/O channel.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Returns the number of bytes written
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncxmlIOFTPRead(void * context, char * buffer, int len) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * xmlIOFTPClose:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @context: the I/O context
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Close an FTP I/O channel
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Returns 0
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#endif /* LIBXML_FTP_ENABLED */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * xmlRegisterInputCallbacks:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @matchFunc: the xmlInputMatchCallback
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @openFunc: the xmlInputOpenCallback
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @readFunc: the xmlInputReadCallback
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @closeFunc: the xmlInputCloseCallback
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Register a new set of I/O callback for handling parser input.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Returns the registered handler number or -1 in case of error
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncxmlRegisterInputCallbacks(xmlInputMatchCallback matchFunc,
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlInputOpenCallback openFunc, xmlInputReadCallback readFunc,
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return(-1);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlInputCallbackTable[xmlInputCallbackNr].matchcallback = matchFunc;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlInputCallbackTable[xmlInputCallbackNr].opencallback = openFunc;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlInputCallbackTable[xmlInputCallbackNr].readcallback = readFunc;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlInputCallbackTable[xmlInputCallbackNr].closecallback = closeFunc;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * xmlRegisterOutputCallbacks:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @matchFunc: the xmlOutputMatchCallback
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @openFunc: the xmlOutputOpenCallback
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @writeFunc: the xmlOutputWriteCallback
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @closeFunc: the xmlOutputCloseCallback
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Register a new set of I/O callback for handling output.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Returns the registered handler number or -1 in case of error
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncxmlRegisterOutputCallbacks(xmlOutputMatchCallback matchFunc,
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlOutputOpenCallback openFunc, xmlOutputWriteCallback writeFunc,
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return(-1);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlOutputCallbackTable[xmlOutputCallbackNr].matchcallback = matchFunc;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlOutputCallbackTable[xmlOutputCallbackNr].opencallback = openFunc;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlOutputCallbackTable[xmlOutputCallbackNr].writecallback = writeFunc;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlOutputCallbackTable[xmlOutputCallbackNr].closecallback = closeFunc;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#endif /* LIBXML_OUTPUT_ENABLED */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * xmlRegisterDefaultInputCallbacks:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Registers the default compiled-in I/O handlers.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#if defined(_WIN32) || defined (__DJGPP__) && !defined (__CYGWIN__)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlRegisterInputCallbacks(xmlFileMatch, xmlFileOpen,
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlRegisterInputCallbacks(xmlGzfileMatch, xmlGzfileOpen,
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#endif /* HAVE_ZLIB_H */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlRegisterInputCallbacks(xmlIOHTTPMatch, xmlIOHTTPOpen,
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#endif /* LIBXML_HTTP_ENABLED */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlRegisterInputCallbacks(xmlIOFTPMatch, xmlIOFTPOpen,
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#endif /* LIBXML_FTP_ENABLED */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * xmlRegisterDefaultOutputCallbacks:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Registers the default compiled-in I/O handlers.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#if defined(_WIN32) || defined (__DJGPP__) && !defined (__CYGWIN__)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlRegisterOutputCallbacks(xmlFileMatch, xmlFileOpenW,
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlRegisterOutputCallbacks(xmlIOHTTPMatch, xmlIOHTTPDfltOpenW,
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#ifdef HAVE_ZLIB_H
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlRegisterOutputCallbacks(xmlGzfileMatch, xmlGzfileOpen,
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlGzfileWrite, xmlGzfileClose);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync Nor FTP PUT ....
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#ifdef LIBXML_FTP_ENABLED
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlRegisterOutputCallbacks(xmlIOFTPMatch, xmlIOFTPOpen,
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlIOFTPWrite, xmlIOFTPClose);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync **********************************/
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * xmlRegisterHTTPPostCallbacks:
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 /* Register defaults if not done previously */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlRegisterOutputCallbacks(xmlIOHTTPMatch, xmlIOHTTPDfltOpenW,
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#endif /* LIBXML_OUTPUT_ENABLED */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * xmlAllocParserInputBuffer:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @enc: the charset encoding if known
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Create a buffered parser input for progressive parsing
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Returns the new parser input or NULL
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync ret = (xmlParserInputBufferPtr) xmlMalloc(sizeof(xmlParserInputBuffer));
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync memset(ret, 0, (size_t) sizeof(xmlParserInputBuffer));
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync ret->buffer = xmlBufferCreateSize(2 * xmlDefaultBufferSize);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync ret->raw = xmlBufferCreateSize(2 * xmlDefaultBufferSize);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * xmlAllocOutputBuffer:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @encoder: the encoding converter or NULL
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Create a buffered parser output
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Returns the new parser output or NULL
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncxmlAllocOutputBuffer(xmlCharEncodingHandlerPtr encoder) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync ret = (xmlOutputBufferPtr) xmlMalloc(sizeof(xmlOutputBuffer));
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * This call is designed to initiate the encoder state
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#endif /* LIBXML_OUTPUT_ENABLED */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * xmlFreeParserInputBuffer:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @in: a buffered parser input
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Free up the memory used by a buffered parser input
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncxmlFreeParserInputBuffer(xmlParserInputBufferPtr in) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * xmlOutputBufferClose:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @out: a buffered output
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * flushes and close the output I/O channel
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * and free up all the associated resources
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Returns the number of byte written or -1 in case of error.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return (-1);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#endif /* LIBXML_OUTPUT_ENABLED */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync__xmlParserInputBufferCreateFilename(const char *URI, xmlCharEncoding enc) {
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 if ((xmlInputCallbackTable[i].matchcallback != NULL) &&
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync (xmlInputCallbackTable[i].matchcallback(URI) != 0)) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync context = xmlInputCallbackTable[i].opencallback(URI);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Allocate the Input buffer front-end.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync ret->readcallback = xmlInputCallbackTable[i].readcallback;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync ret->closecallback = xmlInputCallbackTable[i].closecallback;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if ((xmlInputCallbackTable[i].opencallback == xmlGzfileOpen) &&
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * xmlParserInputBufferCreateFilename:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @URI: a C string containing the URI or filename
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @enc: the charset encoding if known
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 * Returns the new parser input or NULL
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncxmlParserInputBufferCreateFilename(const char *URI, xmlCharEncoding enc) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return xmlParserInputBufferCreateFilenameValue(URI, enc);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return __xmlParserInputBufferCreateFilename(URI, enc);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync (!xmlStrEqual(BAD_CAST puri->scheme, BAD_CAST "file")))
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * try to limit the damages of the URI unescaping code.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync (xmlStrEqual(BAD_CAST puri->scheme, BAD_CAST "file")))
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 if ((compression > 0) && (compression <= 9) && (is_file_uri == 1)) {
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 = xmlOutputCallbackTable[i].opencallback(unescaped);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * If this failed try with a non-escaped URI this may be a strange
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if ((compression > 0) && (compression <= 9) && (is_file_uri == 1)) {
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 = xmlOutputCallbackTable[i].opencallback(URI);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Allocate the Output buffer front-end.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync ret->writecallback = xmlOutputCallbackTable[i].writecallback;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync ret->closecallback = xmlOutputCallbackTable[i].closecallback;
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 * 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 * Returns the new output or NULL
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return xmlOutputBufferCreateFilenameValue(URI, encoder, compression);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return __xmlOutputBufferCreateFilename(URI, encoder, compression);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#endif /* LIBXML_OUTPUT_ENABLED */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * xmlParserInputBufferCreateFile:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @file: a FILE*
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @enc: the charset encoding if known
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Create a buffered parser input for the progressive parsing of a FILE *
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * buffered C I/O
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Returns the new parser input or NULL
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncxmlParserInputBufferCreateFile(FILE *file, xmlCharEncoding enc) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * xmlOutputBufferCreateFile:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @file: a FILE*
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @encoder: the encoding converter or NULL
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Create a buffered output for the progressive saving to a FILE *
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * buffered C I/O
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Returns the new parser output or NULL
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncxmlOutputBufferCreateFile(FILE *file, xmlCharEncodingHandlerPtr encoder) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * xmlOutputBufferCreateBuffer:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @buffer: a xmlBufferPtr
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @encoder: the encoding converter or NULL
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Create a buffered output for the progressive saving to a xmlBuffer
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Returns the new parser output or NULL
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync ret = xmlOutputBufferCreateIO((xmlOutputWriteCallback)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#endif /* LIBXML_OUTPUT_ENABLED */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * xmlParserInputBufferCreateFd:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @fd: a file descriptor number
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @enc: the charset encoding if known
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Create a buffered parser input for the progressive parsing for the input
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * from a file descriptor
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Returns the new parser input or NULL
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncxmlParserInputBufferCreateFd(int fd, xmlCharEncoding enc) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * xmlParserInputBufferCreateMem:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @mem: the memory input
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @size: the length of the memory block
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @enc: the charset encoding if known
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Create a buffered parser input for the progressive parsing for the input
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * from a memory area.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Returns the new parser input or NULL
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncxmlParserInputBufferCreateMem(const char *mem, int size, xmlCharEncoding enc) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync errcode = xmlBufferAdd(ret->buffer, (const xmlChar *) mem, size);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * xmlParserInputBufferCreateStatic:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @mem: the memory input
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @size: the length of the memory block
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @enc: the charset encoding if known
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 * Returns the new parser input or NULL
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncxmlParserInputBufferCreateStatic(const char *mem, int size,
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync ret = (xmlParserInputBufferPtr) xmlMalloc(sizeof(xmlParserInputBuffer));
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync memset(ret, 0, (size_t) sizeof(xmlParserInputBuffer));
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync ret->buffer = xmlBufferCreateStatic((void *)mem, (size_t) size);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync ret->raw = xmlBufferCreateSize(2 * xmlDefaultBufferSize);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * xmlOutputBufferCreateFd:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @fd: a file descriptor number
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @encoder: the encoding converter or NULL
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Create a buffered output for the progressive saving
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * to a file descriptor
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Returns the new parser output or NULL
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncxmlOutputBufferCreateFd(int fd, xmlCharEncodingHandlerPtr encoder) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#endif /* LIBXML_OUTPUT_ENABLED */
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 * Create a buffered parser input for the progressive parsing for the input
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * from an I/O handler
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Returns the new parser input or NULL
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncxmlParserInputBufferCreateIO(xmlInputReadCallback ioread,
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlInputCloseCallback ioclose, void *ioctx, xmlCharEncoding enc) {
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 * Create a buffered output for the progressive saving
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * to an I/O handler
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Returns the new parser output or NULL
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncxmlOutputBufferCreateIO(xmlOutputWriteCallback iowrite,
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#endif /* LIBXML_OUTPUT_ENABLED */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * xmlParserInputBufferCreateFilenameDefault:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @func: function pointer to the new ParserInputBufferCreateFilenameFunc
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Registers a callback for URI input file handling
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Returns the old value of the registration function
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncxmlParserInputBufferCreateFilenameDefault(xmlParserInputBufferCreateFilenameFunc func)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlParserInputBufferCreateFilenameFunc old = xmlParserInputBufferCreateFilenameValue;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * xmlOutputBufferCreateFilenameDefault:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @func: function pointer to the new OutputBufferCreateFilenameFunc
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Registers a callback for URI output file handling
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Returns the old value of the registration function
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncxmlOutputBufferCreateFilenameDefault(xmlOutputBufferCreateFilenameFunc func)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlOutputBufferCreateFilenameFunc old = xmlOutputBufferCreateFilenameValue;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * xmlParserInputBufferPush:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @in: a buffered parser input
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @len: the size in bytes of the array.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @buf: an char array
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 * Returns the number of chars read and stored in the buffer, or -1
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * in case of error.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncxmlParserInputBufferPush(xmlParserInputBufferPtr in,
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (len < 0) return(0);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Store the data in the incoming raw buffer
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync ret = xmlBufferAdd(in->raw, (const xmlChar *) buf, len);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return(-1);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * convert as much as possible to the parser reading buffer.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync nbchars = xmlCharEncInFunc(in->encoder, in->buffer, in->raw);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return(-1);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync ret = xmlBufferAdd(in->buffer, (xmlChar *) buf, nbchars);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return(-1);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync "I/O: pushed %d chars, buffer %d/%d\n",
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * endOfInput:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * When reading from an Input channel indicated end of file or error
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * don't reread from it again.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * xmlParserInputBufferGrow:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @in: a buffered parser input
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @len: indicative value of the amount of chars to read
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 * TODO: one should be able to remove one extra copy by copying directly
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * onto in->buffer or in->raw
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Returns the number of chars read and stored in the buffer, or -1
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * in case of error.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncxmlParserInputBufferGrow(xmlParserInputBufferPtr in, int len) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return(-1);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return(-1);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync buffer = (char *)&in->buffer->content[in->buffer->use];
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Call the read method for this I/O type.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync res = in->readcallback(in->context, &buffer[0], len);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return(-1);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return(-1);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Store the data in the incoming raw buffer
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync res = xmlBufferAdd(in->raw, (const xmlChar *) buffer, len);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return(-1);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * convert as much as possible to the parser reading buffer.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync nbchars = xmlCharEncInFunc(in->encoder, in->buffer, in->raw);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return(-1);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync "I/O: read %d chars, buffer %d/%d\n",
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * xmlParserInputBufferRead:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @in: a buffered parser input
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @len: indicative value of the amount of chars to read
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Refresh the content of the input buffer, the old data are considered
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * This routine handle the I18N transcoding to internal UTF-8
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Returns the number of chars read and stored in the buffer, or -1
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * in case of error.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncxmlParserInputBufferRead(xmlParserInputBufferPtr in, int len) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return(-1);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * xmlOutputBufferWrite:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @out: a buffered parser output
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @len: the size in bytes of the array.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @buf: an char array
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 * Returns the number of chars immediately written, or -1
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * in case of error.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncxmlOutputBufferWrite(xmlOutputBufferPtr out, int len, const char *buf) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync int nbchars = 0; /* number of chars to output to I/O */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync int written = 0; /* number of char written to I/O so far */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync int chunk; /* number of byte curreent processed from buf */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (len < 0) return(0);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * first handle encoding stuff.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Store the data in the incoming raw buffer
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync ret = xmlBufferAdd(out->buffer, (const xmlChar *) buf, chunk);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return(-1);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * convert as much as possible to the parser reading buffer.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync ret = xmlCharEncOutFunc(out->encoder, out->conv, out->buffer);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return(-1);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync ret = xmlBufferAdd(out->buffer, (const xmlChar *) buf, chunk);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return(-1);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * second write the stuff to the I/O channel
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync } while (len > 0);
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 * 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 * xmlOutputBufferWriteEscape:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @out: a buffered parser output
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @str: a zero terminated UTF-8 string
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @escaping: an optional escaping function (or NULL)
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 * Returns the number of chars immediately written, or -1
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * in case of error.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncxmlOutputBufferWriteEscape(xmlOutputBufferPtr out, const xmlChar *str,
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync int nbchars = 0; /* number of chars to output to I/O */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync int written = 0; /* number of char written to I/O so far */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync int chunk; /* number of byte currently processed from str */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if ((out == NULL) || (out->error) || (str == NULL) ||
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync (out->buffer->alloc == XML_BUFFER_ALLOC_IMMUTABLE)) return(-1);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (len < 0) return(0);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * how many bytes to consume and how many bytes to store.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync chunk = (out->buffer->size - out->buffer->use) - 1;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * first handle encoding stuff.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Store the data in the incoming raw buffer
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync ret = escaping(out->buffer->content + out->buffer->use ,
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if ((ret < 0) || (chunk == 0)) /* chunk==0 => nothing done */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return(-1);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * convert as much as possible to the output buffer.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync ret = xmlCharEncOutFunc(out->encoder, out->conv, out->buffer);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return(-1);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync ret = escaping(out->buffer->content + out->buffer->use ,
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if ((ret < 0) || (chunk == 0)) /* chunk==0 => nothing done */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return(-1);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * second write the stuff to the I/O channel
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync } else if (out->buffer->size - out->buffer->use < MINLEN) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlBufferResize(out->buffer, out->buffer->size + MINLEN);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * xmlOutputBufferWriteString:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @out: a buffered parser output
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @str: a zero terminated C string
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 * Returns the number of chars immediately written, or -1
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * in case of error.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncxmlOutputBufferWriteString(xmlOutputBufferPtr out, const char *str) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return(-1);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * xmlOutputBufferFlush:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @out: a buffered output
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * flushes the output I/O channel
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Returns the number of byte written or -1 in case of error.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * first handle encoding stuff.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if ((out->conv != NULL) && (out->encoder != NULL)) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * convert as much as possible to the parser reading buffer.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync nbchars = xmlCharEncOutFunc(out->encoder, out->conv, out->buffer);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return(-1);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * second flush the stuff to the I/O channel
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if ((out->conv != NULL) && (out->encoder != NULL) &&
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync (const char *)out->buffer->content, out->buffer->use);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#endif /* LIBXML_OUTPUT_ENABLED */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * xmlParserGetDirectory:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @filename: the path to a file
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * lookup the directory for that file
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Returns a new allocated string containing the directory, or NULL.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#ifdef _WIN32_WCE /* easy way by now ... wince does not have dirs! */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync/****************************************************************
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * External entities loading *
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync ****************************************************************/
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * xmlCheckHTTPInput:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @ctxt: an XML parser context
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @ret: an XML parser input
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 * Returns the input or NULL in case of HTTP error.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncxmlCheckHTTPInput(xmlParserCtxtPtr ctxt, xmlParserInputPtr ret) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync /* fatal error */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync __xmlLoaderErr(ctxt, "failed to load HTTP resource \"%s\"\n",
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync __xmlLoaderErr(ctxt, "failed to load HTTP resource\n", NULL);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync "Unknown encoding %s",
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync } else if (xmlStrstr(BAD_CAST mime, BAD_CAST "html")) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (!xmlStrncasecmp(BAD_CAST URL, BAD_CAST "file://localhost/", 17))
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#if defined (_WIN32) || defined (__DJGPP__) && !defined(__CYGWIN__)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync else if (!xmlStrncasecmp(BAD_CAST URL, BAD_CAST "file:///", 8)) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#if defined (_WIN32) || defined (__DJGPP__) && !defined(__CYGWIN__)
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 * Resolves the URL and ID against the appropriate catalog.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * This function is used by xmlDefaultExternalEntityLoader and
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * xmlNoNetExternalEntityLoader.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Returns a new allocated URL, or NULL.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncxmlResolveResourceFromCatalog(const char *URL, const char *ID,
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * If the resource doesn't exists as a file,
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * try to load it from the resource pointed in the catalogs
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if ((pref != XML_CATA_ALLOW_NONE) && (!xmlNoNetExists(URL))) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Do a local lookup
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Try a global lookup
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * TODO: do an URI lookup on the reference
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if ((resource != NULL) && (!xmlNoNetExists((const char *)resource))) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync tmp = xmlCatalogLocalResolveURI(ctxt->catalogs, resource);
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 * By default we don't load external entitites, yet.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Returns a new allocated xmlParserInputPtr, or NULL.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncxmlDefaultExternalEntityLoader(const char *URL, const char *ID,
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if ((ctxt != NULL) && (ctxt->options & XML_PARSE_NONET)) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync resource = xmlResolveResourceFromCatalog(URL, ID, ctxt);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync __xmlLoaderErr(ctxt, "failed to load external entity \"%s\"\n", ID);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync ret = xmlNewInputFromFile(ctxt, (const char *) resource);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if ((resource != NULL) && (resource != (xmlChar *) URL))
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncstatic xmlExternalEntityLoader xmlCurrentExternalEntityLoader =
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * xmlSetExternalEntityLoader:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @f: the new entity resolver function
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Changes the defaultexternal entity resolver function for the application
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncxmlSetExternalEntityLoader(xmlExternalEntityLoader f) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * xmlGetExternalEntityLoader:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Get the default external entity resolver function for the application
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Returns the xmlExternalEntityLoader function pointer
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 * Load an external entity, note that the use of this function for
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * unparsed entities may generate problems
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Returns the xmlParserInputPtr or NULL
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncxmlLoadExternalEntity(const char *URL, const char *ID,
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync canonicFilename = (char *) xmlCanonicPath((const xmlChar *) URL);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync ret = xmlCurrentExternalEntityLoader(canonicFilename, ID, ctxt);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return(xmlCurrentExternalEntityLoader(URL, ID, ctxt));
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync/************************************************************************
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Disabling Network access *
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 * A specific entity loader disabling network accesses, though still
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * allowing local catalog accesses for resolution.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Returns a new allocated xmlParserInputPtr, or NULL.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncxmlNoNetExternalEntityLoader(const char *URL, const char *ID,
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync resource = xmlResolveResourceFromCatalog(URL, ID, ctxt);
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 input = xmlDefaultExternalEntityLoader((const char *) resource, ID, ctxt);