diff options
Diffstat (limited to 'i18npool/source/localedata/saxparser.cxx')
-rw-r--r-- | i18npool/source/localedata/saxparser.cxx | 395 |
1 files changed, 395 insertions, 0 deletions
diff --git a/i18npool/source/localedata/saxparser.cxx b/i18npool/source/localedata/saxparser.cxx new file mode 100644 index 000000000000..5118a827b260 --- /dev/null +++ b/i18npool/source/localedata/saxparser.cxx @@ -0,0 +1,395 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2000, 2010 Oracle and/or its affiliates. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +// MARKER(update_precomp.py): autogen include statement, do not remove +#include "precompiled_i18npool.hxx" + +#include <stdio.h> +#include <string.h> +#include <stack> + +#include "sal/main.h" + +#include <com/sun/star/lang/XComponent.hpp> + +#include <com/sun/star/xml/sax/SAXParseException.hpp> +#include <com/sun/star/xml/sax/XParser.hpp> +#include <com/sun/star/xml/sax/XExtendedDocumentHandler.hpp> + +#include <com/sun/star/io/XOutputStream.hpp> +#include <com/sun/star/io/XActiveDataSource.hpp> + +#include <cppuhelper/servicefactory.hxx> +#include <cppuhelper/implbase1.hxx> +#include <cppuhelper/implbase3.hxx> + +#include <vos/diagnose.hxx> + +#include "LocaleNode.hxx" + +using namespace ::rtl; +using namespace ::std; +using namespace ::cppu; +using namespace ::com::sun::star::uno; +using namespace ::com::sun::star::lang; +using namespace ::com::sun::star::registry; +using namespace ::com::sun::star::xml::sax; +using namespace ::com::sun::star::io; + + + + + + +/************ + * Sequence of bytes -> InputStream + ************/ +class OInputStream : public WeakImplHelper1 < XInputStream > +{ +public: + OInputStream( const Sequence< sal_Int8 >&seq ) : + nPos( 0 ), + m_seq( seq ) + {} + +public: + virtual sal_Int32 SAL_CALL readBytes( Sequence< sal_Int8 >& aData, sal_Int32 nBytesToRead ) + throw(NotConnectedException, BufferSizeExceededException, IOException, RuntimeException) + { + nBytesToRead = (nBytesToRead > m_seq.getLength() - nPos ) ? + m_seq.getLength() - nPos : + nBytesToRead; + aData = Sequence< sal_Int8 > ( &(m_seq.getConstArray()[nPos]) , nBytesToRead ); + nPos += nBytesToRead; + return nBytesToRead; + } + virtual sal_Int32 SAL_CALL readSomeBytes( + ::com::sun::star::uno::Sequence< sal_Int8 >& aData, + sal_Int32 nMaxBytesToRead ) + throw(NotConnectedException, BufferSizeExceededException, IOException, RuntimeException) + { + return readBytes( aData, nMaxBytesToRead ); + } + virtual void SAL_CALL skipBytes( sal_Int32 /*nBytesToSkip*/ ) + throw(NotConnectedException, BufferSizeExceededException, IOException, RuntimeException) + { + // not implemented + } + virtual sal_Int32 SAL_CALL available( ) + throw(NotConnectedException, IOException, RuntimeException) + { + return m_seq.getLength() - nPos; + } + virtual void SAL_CALL closeInput( ) + throw(NotConnectedException, IOException, RuntimeException) + { + // not needed + } + sal_Int32 nPos; + Sequence< sal_Int8> m_seq; +}; + +//------------------------------- +// Helper : create an input stream from a file +//------------------------------ +Reference< XInputStream > createStreamFromFile( + const char *pcFile ) +{ + FILE *f = fopen( pcFile , "rb" ); + Reference< XInputStream > r; + + if( f ) { + fseek( f , 0 , SEEK_END ); + size_t nLength = ftell( f ); + fseek( f , 0 , SEEK_SET ); + + Sequence<sal_Int8> seqIn(nLength); + if (fread( seqIn.getArray() , nLength , 1 , f ) == 1) + r = Reference< XInputStream > ( new OInputStream( seqIn ) ); + else + fprintf(stderr, "failure reading %s\n", pcFile); + fclose( f ); + } + return r; +} + + +class TestDocumentHandler : + public WeakImplHelper3< XExtendedDocumentHandler , XEntityResolver , XErrorHandler > +{ +public: + TestDocumentHandler(const char* locale, const char* outFile ) : + rootNode(0), nError(0), nbOfCurrencies(0), nbOfCalendars(0), nbOfFormatElements(0), + nbOfTransliterations(0), nbOfCollations(0), nbOfDays(50), nbOfMonths(50), nbOfEras(10), + flag(-1), of(outFile, locale), isStartDayOfWeek(false), foundDefaultName(false), + foundVariant(false), openElement(false) + { + strncpy( theLocale, locale, sizeof(theLocale) ); + theLocale[sizeof(theLocale)-1] = 0; + } + + ~TestDocumentHandler( ) + { + of.closeOutput(); + } + + +public: // Error handler + virtual void SAL_CALL error(const Any& aSAXParseException) throw (SAXException, RuntimeException) + { + ++nError; + printf( "Error !\n" ); + throw SAXException( + OUString( RTL_CONSTASCII_USTRINGPARAM("error from error handler")) , + Reference < XInterface >() , + aSAXParseException ); + } + virtual void SAL_CALL fatalError(const Any& /*aSAXParseException*/) throw (SAXException, RuntimeException) + { + ++nError; + printf( "Fatal Error !\n" ); + } + virtual void SAL_CALL warning(const Any& /*aSAXParseException*/) throw (SAXException, RuntimeException) + { + printf( "Warning !\n" ); + } + + +public: // ExtendedDocumentHandler + + + + stack<LocaleNode *> currentNode ; + sal_Bool fElement ; + LocaleNode * rootNode; + + virtual void SAL_CALL startDocument(void) throw (SAXException, RuntimeException) + { + printf( "parsing document %s started\n", theLocale); + of.writeAsciiString("#include <sal/types.h>\n\n\n"); + of.writeAsciiString("#include <stdio.h> // debug printfs\n\n"); + of.writeAsciiString("extern \"C\" {\n\n"); + } + + virtual void SAL_CALL endDocument(void) throw (SAXException, RuntimeException) + { + if (rootNode) + { + rootNode->generateCode(of); + int err = rootNode->getError(); + if (err) + { + printf( "Error: in data for %s: %d\n", theLocale, err); + nError += err; + } + } + else + { + ++nError; + printf( "Error: no data for %s\n", theLocale); + } + printf( "parsing document %s finished\n", theLocale); + + of.writeAsciiString("} // extern \"C\"\n\n"); + of.closeOutput(); + } + + virtual void SAL_CALL startElement(const OUString& aName, + const Reference< XAttributeList > & xAttribs) + throw (SAXException,RuntimeException) + { + + LocaleNode * l = LocaleNode::createNode (aName, xAttribs); + if (!currentNode.empty() ) { + LocaleNode * ln = (LocaleNode *) currentNode . top(); + ln->addChild(l); + } else { + rootNode = l; + } + currentNode . push (l); + } + + + virtual void SAL_CALL endElement(const OUString& /*aName*/) throw (SAXException,RuntimeException) + { + currentNode . pop(); + } + + virtual void SAL_CALL characters(const OUString& aChars) throw (SAXException,RuntimeException) + { + + LocaleNode * l = currentNode . top(); + l->setValue (aChars); + ::rtl::OUString str(aChars); + sal_Unicode nonBreakSPace[2]= {0xa, 0x0}; + if(!openElement || str.equals(nonBreakSPace)) + return; + } + + virtual void SAL_CALL ignorableWhitespace(const OUString& /*aWhitespaces*/) throw (SAXException,RuntimeException) + { + } + + virtual void SAL_CALL processingInstruction(const OUString& /*aTarget*/, const OUString& /*aData*/) throw (SAXException,RuntimeException) + { + // ignored + } + + virtual void SAL_CALL setDocumentLocator(const Reference< XLocator> & /*xLocator*/) + throw (SAXException,RuntimeException) + { + // ignored + } + + virtual InputSource SAL_CALL resolveEntity( + const OUString& sPublicId, + const OUString& sSystemId) + throw (RuntimeException) + { + InputSource source; + source.sSystemId = sSystemId; + source.sPublicId = sPublicId; + + source.aInputStream = createStreamFromFile( + OUStringToOString( sSystemId , RTL_TEXTENCODING_ASCII_US) ); + + return source; + } + + virtual void SAL_CALL startCDATA(void) throw (SAXException,RuntimeException) + { + } + virtual void SAL_CALL endCDATA(void) throw (RuntimeException) + { + } + virtual void SAL_CALL comment(const OUString& /*sComment*/) throw (SAXException,RuntimeException) + { + } + virtual void SAL_CALL unknown(const OUString& /*sString*/) throw (SAXException,RuntimeException) + { + } + + virtual void SAL_CALL allowLineBreak( void) throw (SAXException, RuntimeException ) + { + + } + +public: + int nError; + ::rtl::OUString currentElement; + sal_Int16 nbOfCurrencies; + sal_Int16 nbOfCalendars; + sal_Int16 nbOfFormatElements; + sal_Int16 nbOfTransliterations; + sal_Int16 nbOfCollations; + Sequence<sal_Int16> nbOfDays; + Sequence<sal_Int16> nbOfMonths; + Sequence<sal_Int16> nbOfEras; + sal_Char *elementTag; + sal_Char theLocale[50]; + sal_Int16 flag; + OFileWriter of; + sal_Bool isStartDayOfWeek; + sal_Bool foundDefaultName; + sal_Bool foundVariant; + sal_Bool openElement; +}; + + + + + +SAL_IMPLEMENT_MAIN_WITH_ARGS(argc, argv) +{ + + + if( argc < 6) { + printf( "usage : %s <locaLe> <XML inputfile> <destination file> <services.rdb location> <types.rdb location>\n", argv[0] ); + exit( 1 ); + } + + // create service manager + Reference< XMultiServiceFactory > xSMgr; + try + { + xSMgr = createRegistryServiceFactory( + ::rtl::OUString::createFromAscii(argv[4]), + ::rtl::OUString::createFromAscii(argv[5]), true ); + } + catch ( Exception& ) + { + printf( "Exception on createRegistryServiceFactory\n" ); + exit(1); + } + + //-------------------------------- + // parser demo + // read xml from a file and count elements + //-------------------------------- + Reference< XInterface > x = xSMgr->createInstance( + OUString::createFromAscii( "com.sun.star.xml.sax.Parser" ) ); + int nError = 0; + if( x.is() ) + { + Reference< XParser > rParser( x , UNO_QUERY ); + + // create and connect the document handler to the parser + TestDocumentHandler *pDocHandler = new TestDocumentHandler( argv[1], argv[3]); + + Reference < XDocumentHandler > rDocHandler( (XDocumentHandler *) pDocHandler ); + Reference< XEntityResolver > rEntityResolver( (XEntityResolver *) pDocHandler ); + + rParser->setDocumentHandler( rDocHandler ); + rParser->setEntityResolver( rEntityResolver ); + + // create the input stream + InputSource source; + source.aInputStream = createStreamFromFile( argv[2] ); + source.sSystemId = OUString::createFromAscii( argv[2] ); + + try + { + // start parsing + rParser->parseStream( source ); + } + + catch( Exception & e ) + { + OString o1 = OUStringToOString(e.Message, RTL_TEXTENCODING_UTF8 ); + printf( "Exception during parsing : %s\n" , o1.getStr() ); + exit(1); + } + nError = pDocHandler->nError; + } + else + { + printf( "couln't create sax-parser component\n" ); + exit(1); + } + + return nError; +} |