xmlreaderimpl/XMLv2__XercesCXMLReader.st
author Jan Vrany <jan.vrany@fit.cvut.cz>
Mon, 25 Jan 2016 16:35:43 +0000
changeset 298 9696f76605bd
parent 296 ea3dbc023c80
permissions -rw-r--r--
Added C:\MINGW\MSYS\1.0\bin to PATH when building expat. Some systems have it installed there (such as SWING Jenkins servers)

'From Smalltalk/X, Version:5.4.4 on 06-04-2009 at 03:59:51 PM'                  !

"{ Package: 'stx:goodies/xmlsuite/xmlreaderimpl' }"

"{ NameSpace: XMLv2 }"

XMLReader subclass:#XercesCXMLReader
	instanceVariableNames:''
	classVariableNames:''
	poolDictionaries:''
	category:'XML Suite-SAX2-XMLReaders'
!

!XercesCXMLReader primitiveDefinitions!
%{

/*
 * includes, defines, structure definitions
 * and typedefs come here.
 */

#include <stdio.h>
#include "support/StxXercesUtils.hpp"
#include "support/StxXercesHandlerCallbacks.h"


void StxXercesStartDocument(OBJ* handler_ref) {
	__SSEND0(*handler_ref, @symbol(xercesStartDocument), 0);
}

void StxXercesEndDocument(OBJ* handler_ref) {
	__SSEND0(*handler_ref, @symbol(xercesEndDocument), 0);
}


StxXercesFillAttributes(StxXercesAttributes attrs, OBJ attrs_obj) {
	unsigned int i;
	OBJ uri_obj, localname_obj, qname_obj, value_obj;
	for ( i = 0; i < StxXercesAttributesGetLength(attrs); i++) {
		uri_obj = __MKSTRING(StxXercesAttributesGetUri(attrs, i)); __PROTECT__(uri_obj);
		localname_obj = __MKSTRING(StxXercesAttributesGetLocalName(attrs, i)); __PROTECT__(localname_obj);
		qname_obj = __MKSTRING(StxXercesAttributesGetQName(attrs, i)); __PROTECT__(qname_obj);
		value_obj = __MKSTRING(StxXercesAttributesGetValue(attrs, i)); __PROTECT__(value_obj);
		__SSEND4(attrs_obj, @symbol(addAttribute:namespace:qname:value:), 0,
			localname_obj, uri_obj, qname_obj, value_obj);			
		__UNPROTECT__(uri_obj); __UNPROTECT__(localname_obj); __UNPROTECT__(qname_obj); __UNPROTECT__(value_obj);
	}		
}


void StxXercesStartElement(OBJ* handler_ref, char* uri, char* localname, char* qname, StxXercesAttributes attrs) {	
	OBJ uri_obj, localname_obj, qname_obj, attrs_obj;
	uri_obj = __MKSTRING(uri); __PROTECT__(uri_obj);
	localname_obj = __MKSTRING(localname); __PROTECT__(localname_obj);
	qname_obj = __MKSTRING(qname); __PROTECT__(qname_obj);
	attrs_obj = __NEW(@global(XMLv2::Attributes)); __PROTECT__(attrs_obj);
	StxXercesFillAttributes(attrs, attrs_obj);
	__SSEND4(*handler_ref, @symbol(xercesStartElement:namespace:qname:attributes:),
		0, localname_obj, uri_obj, qname_obj, attrs_obj);
	__UNPROTECT__(uri_obj); __UNPROTECT__(localname_obj); __UNPROTECT__(qname_obj); __UNPROTECT__(attrs_obj);
}
void StxXercesEndElement(OBJ* handler_ref, char* uri, char* localname, char* qname) {
	OBJ uri_obj, localname_obj, qname_obj;
	uri_obj = __MKSTRING(uri); __PROTECT__(uri_obj);
	localname_obj = __MKSTRING(localname); __PROTECT__(localname_obj);
	qname_obj = __MKSTRING(qname); __PROTECT__(qname_obj);
	__SSEND3(*handler_ref, @symbol(xercesEndElement:namespace:qname:),
		0, localname_obj, uri_obj, qname_obj);
	__UNPROTECT__(uri_obj); __UNPROTECT__(localname_obj); __UNPROTECT__(qname_obj);
}



void StxXercesCharacters(OBJ* handler_ref, char* characters) {
	OBJ characters_obj;
	characters_obj = __MKSTRING(characters);
	__SSEND1(*handler_ref, @symbol(xercesCharacters:), 0, characters_obj);
}

void StxXercesIgnorableWhitespace(OBJ* handler_ref, char* characters) {
	OBJ characters_obj;
	characters_obj = __MKSTRING(characters);
	__SSEND1(*handler_ref, @symbol(xercesIgnorableWhitespace:), 0, characters_obj);
}

void StxXercesComment(OBJ* handler_ref, char* characters) {
	OBJ characters_obj;
	characters_obj = __MKSTRING(characters);
	__SSEND1(*handler_ref, @symbol(xercesComment:), 0, characters_obj);
}

void StxXercesStartPrefixMapping(OBJ* handler_ref, char* prefix, char* uri) {
	OBJ prefix_obj, uri_obj;
	prefix_obj = __MKSTRING(prefix); __PROTECT__(prefix_obj);
	uri_obj = __MKSTRING(uri);
	__SSEND2(*handler_ref, @symbol(xercesStartPrefix:mappingTo:), 0, prefix_obj, uri_obj);
	__UNPROTECT__(prefix_obj);
}
void StxXercesEndPrefixMapping(OBJ* handler_ref, char* prefix) {
	OBJ prefix_obj;
	prefix_obj = __MKSTRING(prefix);
	__SSEND1(*handler_ref, @symbol(xercesEndPrefixMapping:), 0, prefix_obj);
}

void StxXercesStartHandleElementPSVI(OBJ* handler_ref,char* localname, char* uri, StxXercesPSVIElement elementPSVI) {
	OBJ localname_obj, uri_obj;
	localname_obj = __MKSTRING(localname); __PROTECT__(localname_obj);
	uri_obj = __MKSTRING(uri); __PROTECT__(uri_obj);
	__SSEND3(*handler_ref, @symbol(xercesHandleElement:namespace:psvi:), 0, localname_obj, uri_obj, nil );
	__UNPROTECT__(localname_obj);  __UNPROTECT__(uri_obj);

}

%}

! !

!XercesCXMLReader class methodsFor:'private - xerces'!

primInitialize

%{
	RETURN(__MKINT(StxXercesInitialize()));
%}.

!

primTerminate

%{
	RETURN(__MKINT(StxXercesTerminate()));
%}.

! !

!XercesCXMLReader methodsFor:'SAX2 interface - Locator'!

getColumnNumber
    "Superclass XMLv2::XMLReader says that I am responsible to implement this method"

    self shouldImplement

    "Created: / 15-12-2008 / 07:22:15 / Jan Vrany <vranyj1@fel.cvut.cz>"
!

getLineNumber
    "Superclass XMLv2::XMLReader says that I am responsible to implement this method"

    self shouldImplement

    "Created: / 15-12-2008 / 07:22:15 / Jan Vrany <vranyj1@fel.cvut.cz>"
! !

!XercesCXMLReader methodsFor:'private'!

parseFragmentStream:aStream
    "Superclass XMLv2::XMLReader says that I am responsible to implement this method"

    self shouldImplement

    "Created: / 15-12-2008 / 07:22:15 / Jan Vrany <vranyj1@fel.cvut.cz>"
!

parseStream:aStream

    ^self xercesParseStream: aStream binary

    "Created: / 15-12-2008 / 07:22:15 / Jan Vrany <vranyj1@fel.cvut.cz>"
    "Modified: / 06-04-2009 / 13:35:03 / Jan Vrany <vranyj1@fel.cvut.cz>"
! !

!XercesCXMLReader methodsFor:'private - xerces'!

xercesCharacters: aString

    self getContentHandler characters: aString

    "Created: / 06-04-2009 / 13:29:40 / Jan Vrany <vranyj1@fel.cvut.cz>"
!

xercesEndDocument

    self getContentHandler endDocument

    "Created: / 06-04-2009 / 13:29:40 / Jan Vrany <vranyj1@fel.cvut.cz>"
!

xercesEndElement:localName namespace: ns qname: qname

    self getContentHandler 
            endElement: localName
            namespace: ns
            prefix: (qname copyTo: (qname size - localName size - 1))

    "Created: / 06-04-2009 / 13:33:52 / Jan Vrany <vranyj1@fel.cvut.cz>"
!

xercesEndPrefixMapping: prefix 

    self getContentHandler endPrefixMapping: prefix

    "Created: / 06-04-2009 / 15:48:18 / Jan Vrany <vranyj1@fel.cvut.cz>"
!

xercesParseStream: stream

%{
	StxXercesParse(self, stream);
%}.

!

xercesStartDocument

    self getContentHandler startDocument

    "Created: / 06-04-2009 / 13:26:48 / Jan Vrany <vranyj1@fel.cvut.cz>"
!

xercesStartElement:localName namespace: ns qname: qname attributes: attrs

    self getContentHandler 
            startElement: localName
            namespace: ns
            prefix: (qname copyTo: (qname size - localName size - 1))
            attributes: attrs

    "Created: / 06-04-2009 / 13:33:37 / Jan Vrany <vranyj1@fel.cvut.cz>"
!

xercesStartPrefix:prefix mappingTo:ns

    self getContentHandler startPrefix:prefix mappingTo:ns

    "Created: / 06-04-2009 / 15:45:03 / Jan Vrany <vranyj1@fel.cvut.cz>"
! !