diff options
Diffstat (limited to 'hwpfilter/source/hwpreader.hxx')
-rw-r--r-- | hwpfilter/source/hwpreader.hxx | 401 |
1 files changed, 401 insertions, 0 deletions
diff --git a/hwpfilter/source/hwpreader.hxx b/hwpfilter/source/hwpreader.hxx new file mode 100644 index 000000000000..c5fdb180f776 --- /dev/null +++ b/hwpfilter/source/hwpreader.hxx @@ -0,0 +1,401 @@ +/************************************************************************* + * + * 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. + * + ************************************************************************/ + +#ifndef _HWPREADER_HXX_ +#define _HWPREADER_HXX_ +#include <errno.h> +#include <stdio.h> +#include <string.h> +#include <sal/alloca.h> + +#include <com/sun/star/lang/XServiceInfo.hpp> +#include <com/sun/star/lang/XComponent.hpp> +#include <com/sun/star/io/XInputStream.hpp> +#include <com/sun/star/document/XFilter.hpp> +#include <com/sun/star/document/XImporter.hpp> +#include <com/sun/star/xml/sax/XDocumentHandler.hpp> + +#include <com/sun/star/ucb/XContentIdentifierFactory.hpp> +#include <com/sun/star/ucb/XContentProvider.hpp> +#include <com/sun/star/ucb/XContentIdentifier.hpp> +#include <com/sun/star/ucb/XContent.hpp> +#include <com/sun/star/ucb/OpenCommandArgument2.hpp> +#include <com/sun/star/ucb/OpenMode.hpp> +#include <com/sun/star/ucb/XCommandProcessor.hpp> +#include <com/sun/star/ucb/XCommandEnvironment.hpp> +#include <cppuhelper/implbase2.hxx> +#include <com/sun/star/io/XActiveDataSink.hpp> +#include <com/sun/star/io/XActiveDataControl.hpp> +#include <com/sun/star/io/XStreamListener.hpp> + +#include <cppuhelper/factory.hxx> +#include <cppuhelper/weak.hxx> +#include <cppuhelper/implbase1.hxx> +#include <cppuhelper/implbase3.hxx> +#include <cppuhelper/servicefactory.hxx> + +using namespace ::rtl; +using namespace ::cppu; +using namespace ::com::sun::star::ucb; +using namespace ::com::sun::star::lang; +using namespace ::com::sun::star::uno; +using namespace ::com::sun::star::io; +using namespace ::com::sun::star::registry; +using namespace ::com::sun::star::document; +using namespace ::com::sun::star::beans; +using namespace ::com::sun::star::xml::sax; + +#include <assert.h> + +#include "hwpfile.h" +#include "hcode.h" +#include "hbox.h" +#include "htags.h" +#include "hstream.h" +#include "drawdef.h" +#include "attributes.hxx" + + +#define IMPLEMENTATION_NAME "com.sun.comp.hwpimport.HwpImportFilter" +#define SERVICE_NAME "com.sun.star.document.ImportFilter" +#define WRITER_IMPORTER_NAME "com.sun.star.comp.Writer.XMLImporter" + +class MyDataSink : public ::cppu::WeakImplHelper2< XActiveDataControl, XActiveDataSink > +{ + Reference < XInputStream > m_xInputStream; +public: + + // XActiveDataControl. + virtual void SAL_CALL addListener ( const Reference<XStreamListener> &) + throw(RuntimeException) {} + virtual void SAL_CALL removeListener ( const Reference<XStreamListener> &) + throw(RuntimeException) {} + virtual void SAL_CALL start (void) throw(RuntimeException) {} + virtual void SAL_CALL terminate (void) throw(RuntimeException) {} + + // XActiveDataSink. + virtual void SAL_CALL setInputStream ( const Reference<XInputStream> &rxInputStream) + throw(RuntimeException); + virtual Reference<XInputStream> SAL_CALL getInputStream (void) + throw(RuntimeException); +}; + +void SAL_CALL MyDataSink::setInputStream ( const Reference<XInputStream> &rxInputStream) + throw(RuntimeException ) +{ + m_xInputStream = rxInputStream; +} + +Reference < XInputStream > SAL_CALL MyDataSink::getInputStream (void) + throw(RuntimeException) +{ + return m_xInputStream; +} + +struct HwpReaderPrivate; +/** + * This class implements the external Parser interface + */ +class HwpReader : public WeakImplHelper1<XFilter> +{ + +public: + HwpReader(); + ~HwpReader(); + +public: + /** + * parseStream does Parser-startup initializations + */ + virtual sal_Bool SAL_CALL filter(const Sequence< PropertyValue >& aDescriptor) throw (RuntimeException); + virtual void SAL_CALL cancel() throw(RuntimeException) {} + virtual void SAL_CALL setDocumentHandler(Reference< XDocumentHandler > xHandler) + { + rDocumentHandler = xHandler; + } + void setUCB( Reference< XInterface > xUCB ){ + rUCB = xUCB; + } +private: + Reference< XDocumentHandler > rDocumentHandler; + Reference< XInterface > rUCB; + Reference< XAttributeList > rList; + AttributeListImpl *pList; + HWPFile hwpfile; + HwpReaderPrivate *d; + +private: + /* -------- Document Parsing --------- */ + void makeMeta(); + void makeStyles(); + void makeDrawMiscStyle(HWPDrawingObject *); + void makeAutoStyles(); + void makeMasterStyles(); + void makeBody(); + + void makeTextDecls(); + + /* -------- Paragraph Parsing --------- */ + void parsePara(HWPPara *para, sal_Bool bParaStart = sal_False); + void make_text_p0(HWPPara *para, sal_Bool bParaStart = sal_False); + void make_text_p1(HWPPara *para, sal_Bool bParaStart = sal_False); + void make_text_p3(HWPPara *para, sal_Bool bParaStart = sal_False); + + /* -------- rDocument->characters(x) --------- */ + void makeChars(hchar *, int); + + /* -------- Special Char Parsing --------- */ + void makeFieldCode(FieldCode *hbox); //6 + void makeBookmark(Bookmark *hbox); //6 + void makeDateFormat(DateCode *hbox); //7 + void makeDateCode(DateCode *hbox); //8 + void makeTab(Tab *hbox); //9 + void makeTable(TxtBox *hbox); + void makeTextBox(TxtBox *hbox); + void makeFormula(TxtBox *hbox); + void makeHyperText(TxtBox *hbox); + void makePicture(Picture *hbox); + void makePictureDRAW(HWPDrawingObject *drawobj, Picture *hbox); + void makeLine(Line *hbox); + void makeHidden(Hidden *hbox); + void makeFootnote(Footnote *hbox); + void makeAutoNum(AutoNum *hbox); + void makeShowPageNum(); + void makeMailMerge(MailMerge *hbox); + void makeTocMark(TocMark *hbox); + void makeIndexMark(IndexMark *hbox); + void makeOutline(Outline *hbox); + + /* --------- Styles Parsing ------------ */ + void makePageStyle(); + void makeColumns(ColumnDef *); + void makeTStyle(CharShape *); + void makePStyle(ParaShape *); + void makeFStyle(FBoxStyle *); + void makeCaptionStyle(FBoxStyle *); + void makeDrawStyle(HWPDrawingObject *,FBoxStyle *); + void makeTableStyle(Table *); + void parseCharShape(CharShape *); + void parseParaShape(ParaShape *); + char* getTStyleName(int, char *); + char* getPStyleName(int, char *); +}; + +class HwpImportFilter : public WeakImplHelper3< XFilter, XImporter, XServiceInfo > +{ +public: + HwpImportFilter( const Reference< XMultiServiceFactory > xFact ); + ~HwpImportFilter(); + +public: + static Sequence< OUString > getSupportedServiceNames_Static( void ) throw(); + static OUString getImplementationName_Static() throw(); + +public: + // XFilter + virtual sal_Bool SAL_CALL filter( const Sequence< PropertyValue >& aDescriptor ) + throw( RuntimeException ); + virtual void SAL_CALL cancel() throw(RuntimeException); + // XImporter + virtual void SAL_CALL setTargetDocument( const Reference< XComponent >& xDoc) + throw( IllegalArgumentException, RuntimeException ); + // XServiceInfo + OUString SAL_CALL getImplementationName() throw (RuntimeException); + Sequence< OUString > SAL_CALL getSupportedServiceNames(void) throw (::com::sun::star::uno::RuntimeException); + sal_Bool SAL_CALL supportsService(const OUString& ServiceName) throw (::com::sun::star::uno::RuntimeException); + +public: + Reference< XFilter > rFilter; + Reference< XImporter > rImporter; +}; + +Reference< XInterface > HwpImportFilter_CreateInstance( + const Reference< XMultiServiceFactory >& rSMgr ) throw( Exception ) +{ + HwpImportFilter *p = new HwpImportFilter( rSMgr ); + + return Reference< XInterface > ( (OWeakObject* )p ); +} + +Sequence< OUString > HwpImportFilter::getSupportedServiceNames_Static( void ) throw () +{ + Sequence< OUString > aRet(1); + aRet.getArray()[0] = HwpImportFilter::getImplementationName_Static(); + return aRet; +} +HwpImportFilter::HwpImportFilter( const Reference< XMultiServiceFactory > xFact ) +{ + OUString sService = OUString::createFromAscii( WRITER_IMPORTER_NAME ); + try { + Reference< XDocumentHandler > + xHandler( xFact->createInstance( sService ), UNO_QUERY ); + + HwpReader *p = new HwpReader; + p->setDocumentHandler( xHandler ); + + Sequence< Any > aArgs( 2 ); + aArgs[0] <<= OUString::createFromAscii( "Local" ); + aArgs[1] <<= OUString::createFromAscii( "Office" ); + Reference< XInterface > xUCB + ( xFact->createInstanceWithArguments + (OUString::createFromAscii("com.sun.star.ucb.UniversalContentBroker"), + aArgs)); + p->setUCB( xUCB ); + + + Reference< XImporter > xImporter = Reference< XImporter >( xHandler, UNO_QUERY ); + rImporter = xImporter; + Reference< XFilter > xFilter = Reference< XFilter >( p ); + rFilter = xFilter; + } + catch( Exception & ) + { + printf(" fail to instanciate %s\n", WRITER_IMPORTER_NAME ); + exit( 1 ); + } +} + +HwpImportFilter::~HwpImportFilter() +{ +} + +sal_Bool HwpImportFilter::filter( const Sequence< PropertyValue >& aDescriptor ) + throw( RuntimeException ) +{ + // delegate to IchitaroImpoter + rFilter->filter( aDescriptor ); + + return sal_True; +} + +void HwpImportFilter::cancel() throw(::com::sun::star::uno::RuntimeException) +{ + rFilter->cancel(); +} + +void HwpImportFilter::setTargetDocument( const Reference< XComponent >& xDoc ) + throw( IllegalArgumentException, RuntimeException ) +{ + // delegate + rImporter->setTargetDocument( xDoc ); +} + +OUString HwpImportFilter::getImplementationName_Static() throw() +{ + return OUString::createFromAscii( IMPLEMENTATION_NAME ); +} + +OUString HwpImportFilter::getImplementationName() throw(::com::sun::star::uno::RuntimeException) +{ + return OUString::createFromAscii( IMPLEMENTATION_NAME ); +} +sal_Bool HwpImportFilter::supportsService( const OUString& ServiceName ) throw(::com::sun::star::uno::RuntimeException) +{ + Sequence< OUString > aSNL = getSupportedServiceNames(); + const OUString *pArray = aSNL.getConstArray(); + + for ( sal_Int32 i = 0; i < aSNL.getLength(); i++ ) + if ( pArray[i] == ServiceName ) + return sal_True; + + return sal_False; +} + +Sequence< OUString> HwpImportFilter::getSupportedServiceNames( void ) throw(::com::sun::star::uno::RuntimeException) +{ + Sequence< OUString > seq(1); + seq.getArray()[0] = OUString::createFromAscii( SERVICE_NAME ); + return seq; +} + +///////////////////////////////////////////////////////////////////////////////////// +// The below three C functions are nessesary for this shared library is treaded as +// UNO component library. +///////////////////////////////////////////////////////////////////////////////////// +extern "C" +{ + + void SAL_CALL component_getImplementationEnvironment( + const sal_Char ** ppEnvTypeName, uno_Environment ** ) + { + *ppEnvTypeName = CPPU_CURRENT_LANGUAGE_BINDING_NAME; + } + + + sal_Bool SAL_CALL component_writeInfo( + void * , void * pRegistryKey ) + { + if (pRegistryKey) + { + try + { + Reference< XRegistryKey > xKey( reinterpret_cast< XRegistryKey * >( pRegistryKey ) ); + + Reference< XRegistryKey > xNewKey = xKey->createKey( + OUString::createFromAscii( "/" IMPLEMENTATION_NAME "/UNO/SERVICES" ) ); + xNewKey->createKey( OUString::createFromAscii( SERVICE_NAME ) ); + + return sal_True; + } + catch (InvalidRegistryException &) + { + OSL_ENSURE( sal_False, "### InvalidRegistryException!" ); + } + } + return sal_False; + } + + void * SAL_CALL component_getFactory( const sal_Char * pImplName, void * pServiceManager, void * ) + { + void * pRet = 0; + + if (pServiceManager ) + { + Reference< XSingleServiceFactory > xRet; + Reference< XMultiServiceFactory > xSMgr = reinterpret_cast< XMultiServiceFactory * > ( pServiceManager ); + + OUString aImplementationName = OUString::createFromAscii( pImplName ); + + if (aImplementationName == OUString::createFromAscii( IMPLEMENTATION_NAME ) ) + { + xRet = createSingleFactory( xSMgr, aImplementationName, + HwpImportFilter_CreateInstance, + HwpImportFilter::getSupportedServiceNames_Static() ); + } + if (xRet.is()) + { + xRet->acquire(); + pRet = xRet.get(); + } + } + + return pRet; + } +} + +#endif + |