Annotation of libwww/Library/src/HTXML.c, revision 2.1
2.1 ! frystyk 1: /*
! 2: ** LIBWWW STREAM WRAPPER FOR EXPAT XML PARSER
! 3: **
! 4: ** (c) COPYRIGHT MIT 1995.
! 5: ** Please first read the full copyright statement in the file COPYRIGH.
! 6: ** @(#) $Id: HTZip.c,v 2.7 1998/05/04 19:37:44 frystyk Exp $
! 7: **
! 8: ** This module requires expat in order to compile/link
! 9: */
! 10:
! 11: /* Library include files */
! 12: #include "wwwsys.h"
! 13: #include "WWWUtil.h"
! 14: #include "WWWCore.h"
! 15: #include "HTXML.h" /* Implemented here */
! 16:
! 17: #include <xmlparse.h>
! 18:
! 19: struct _HTStream {
! 20: const HTStreamClass * isa;
! 21: int state;
! 22: HTRequest * request;
! 23: HTStream * target;
! 24: XML_Parser xmlstream;
! 25: };
! 26:
! 27: /* ------------------------------------------------------------------------- */
! 28:
! 29: PRIVATE int HTXML_flush (HTStream * me)
! 30: {
! 31: return me->target ? (*me->target->isa->flush)(me->target) : HT_OK;
! 32: }
! 33:
! 34: PRIVATE int HTXML_free (HTStream * me)
! 35: {
! 36: int status = HT_OK;
! 37: XML_ParserFree(me->xmlstream);
! 38: if ((status = (*me->target->isa->_free)(me->target)) == HT_WOULD_BLOCK)
! 39: return HT_WOULD_BLOCK;
! 40: if (STREAM_TRACE) HTTrace("XML Parser.. FREEING...\n");
! 41: HT_FREE(me);
! 42: return status;
! 43: }
! 44:
! 45: PRIVATE int HTXML_abort (HTStream * me, HTList * e)
! 46: {
! 47: if (STREAM_TRACE) HTTrace("XML Parser.. ABORTING...\n");
! 48: XML_ParserFree(me->xmlstream);
! 49: (*me->target->isa->abort)(me->target, NULL);
! 50: HT_FREE(me);
! 51: return HT_ERROR;
! 52: }
! 53:
! 54: PRIVATE int HTXML_write (HTStream * me, const char * buf, int len)
! 55: {
! 56: if (me->state == HT_OK) {
! 57: int status = XML_Parse(me->xmlstream, buf, len, 0);
! 58: if (!status) {
! 59: HTTrace("XML Parser.. `%s\'\n", XML_ErrorString(status));
! 60: me->state = HT_ERROR;
! 61: }
! 62: }
! 63: return me->state;
! 64: }
! 65:
! 66: PRIVATE int HTXML_putCharacter (HTStream * me, char c)
! 67: {
! 68: return HTXML_write(me, &c, 1);
! 69: }
! 70:
! 71: PRIVATE int HTXML_putString (HTStream * me, const char * s)
! 72: {
! 73: return HTXML_write(me, s, (int) strlen(s));
! 74: }
! 75:
! 76: PRIVATE const HTStreamClass HTXMLClass =
! 77: {
! 78: "xml",
! 79: HTXML_flush,
! 80: HTXML_free,
! 81: HTXML_abort,
! 82: HTXML_putCharacter,
! 83: HTXML_putString,
! 84: HTXML_write
! 85: };
! 86:
! 87: PUBLIC HTStream * HTXML_new (HTRequest * request,
! 88: void * param,
! 89: HTFormat input_format,
! 90: HTFormat output_format,
! 91: HTStream * output_stream)
! 92: {
! 93: HTStream * me = NULL;
! 94: HTCharset charset = HTResponse_charset (HTRequest_response(request));
! 95: if ((me = (HTStream *) HT_CALLOC(1, sizeof(HTStream))) == NULL)
! 96: HT_OUTOFMEM("HTXML_new");
! 97: me->isa = &HTXMLClass;
! 98: me->state = HT_OK;
! 99: me->request = request;
! 100: me->target = output_stream ? output_stream : HTErrorStream();
! 101:
! 102: /* Now create the XML parser instance */
! 103: if ((me->xmlstream = XML_ParserCreate(HTAtom_name(charset))) == NULL) {
! 104: HT_FREE(me);
! 105: return HTErrorStream();
! 106: }
! 107:
! 108: if (STREAM_TRACE) HTTrace("XML Parser.. Stream created\n");
! 109: return me;
! 110: }
Webmaster