diff options
Diffstat (limited to 'xmloff/source/core/xmlimp.cxx')
-rw-r--r-- | xmloff/source/core/xmlimp.cxx | 2012 |
1 files changed, 2012 insertions, 0 deletions
diff --git a/xmloff/source/core/xmlimp.cxx b/xmloff/source/core/xmlimp.cxx new file mode 100644 index 000000000000..e0b2ac0c09f4 --- /dev/null +++ b/xmloff/source/core/xmlimp.cxx @@ -0,0 +1,2012 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/************************************************************************* + * + * 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_xmloff.hxx" +#include <com/sun/star/beans/XPropertySetInfo.hpp> +#include <tools/debug.hxx> +#include <tools/urlobj.hxx> +#include <osl/mutex.hxx> +#include <rtl/uuid.h> +#include <rtl/memory.h> +#include <svl/svarray.hxx> +#include "unointerfacetouniqueidentifiermapper.hxx" +#include <xmloff/nmspmap.hxx> +#include <xmloff/xmluconv.hxx> +#include "xmlnmspe.hxx" +#include <xmloff/xmltoken.hxx> +#include <xmloff/XMLFontStylesContext.hxx> +#include <xmloff/xmlictxt.hxx> +#include <xmloff/xmlimp.hxx> +#include <xmloff/xmlnumfi.hxx> +#include "XMLEventImportHelper.hxx" +#include "XMLStarBasicContextFactory.hxx" +#include "XMLScriptContextFactory.hxx" +#include "StyleMap.hxx" +#include <xmloff/ProgressBarHelper.hxx> +#include <xmloff/xmltoken.hxx> +#include "xmlerror.hxx" +#include <com/sun/star/lang/XMultiServiceFactory.hpp> +#include <com/sun/star/lang/ServiceNotRegisteredException.hpp> +#include <com/sun/star/io/XOutputStream.hpp> +#include <com/sun/star/document/XBinaryStreamResolver.hpp> +#include <com/sun/star/document/XStorageBasedDocument.hpp> +#include <com/sun/star/xml/sax/XLocator.hpp> +#include <com/sun/star/packages/zip/ZipIOException.hpp> +#include <comphelper/namecontainer.hxx> +#include <rtl/logfile.hxx> +#include <tools/string.hxx> // used in StartElement for logging +#include <cppuhelper/implbase1.hxx> +#include <comphelper/extract.hxx> +#include <comphelper/processfactory.hxx> +#include <comphelper/documentconstants.hxx> +#include <comphelper/storagehelper.hxx> +#include <unotools/fontcvt.hxx> + +#include <com/sun/star/rdf/XMetadatable.hpp> +#include <com/sun/star/rdf/XRepositorySupplier.hpp> +#include "RDFaImportHelper.hxx" + +#define LOGFILE_AUTHOR "unknown" + +using ::com::sun::star::beans::XPropertySetInfo; + +using ::rtl::OUString; +using ::rtl::OUStringBuffer; + +using namespace ::osl; +using namespace ::com::sun::star; +using namespace ::com::sun::star::frame; +using namespace ::com::sun::star::uno; +using namespace ::com::sun::star::util; +using namespace ::com::sun::star::io; +using namespace ::com::sun::star::container; +using namespace ::com::sun::star::document; +using namespace ::xmloff::token; + +sal_Char __READONLY_DATA sXML_np__office[] = "_office"; +sal_Char __READONLY_DATA sXML_np__office_ext[] = "_office_ooo"; +sal_Char __READONLY_DATA sXML_np__ooo[] = "_ooo"; +sal_Char __READONLY_DATA sXML_np__ooow[] = "_ooow"; +sal_Char __READONLY_DATA sXML_np__oooc[] = "_oooc"; +sal_Char __READONLY_DATA sXML_np__of[] = "_of"; +sal_Char __READONLY_DATA sXML_np__style[] = "_style"; +sal_Char __READONLY_DATA sXML_np__text[] = "_text"; +sal_Char __READONLY_DATA sXML_np__table[] = "_table"; +sal_Char __READONLY_DATA sXML_np__table_ext[] = "_table_ooo"; +sal_Char __READONLY_DATA sXML_np__draw[] = "_draw"; +sal_Char __READONLY_DATA sXML_np__draw_ext[] = "_draw_ooo"; +sal_Char __READONLY_DATA sXML_np__dr3d[] = "_dr3d"; +sal_Char __READONLY_DATA sXML_np__fo[] = "_fo"; +sal_Char __READONLY_DATA sXML_np__xlink[] = "_xlink"; +sal_Char __READONLY_DATA sXML_np__dc[] = "_dc"; +sal_Char __READONLY_DATA sXML_np__dom[] = "_dom"; +sal_Char __READONLY_DATA sXML_np__meta[] = "_meta"; +sal_Char __READONLY_DATA sXML_np__number[] = "_number"; +sal_Char __READONLY_DATA sXML_np__svg[] = "_svg"; +sal_Char __READONLY_DATA sXML_np__chart[] = "_chart"; +sal_Char __READONLY_DATA sXML_np__math[] = "_math"; +sal_Char __READONLY_DATA sXML_np__form[] = "_form"; +sal_Char __READONLY_DATA sXML_np__script[] = "_script"; +sal_Char __READONLY_DATA sXML_np__config[] = "_config"; +sal_Char __READONLY_DATA sXML_np__db[] = "_db"; +sal_Char __READONLY_DATA sXML_np__xforms[] = "_xforms"; +sal_Char __READONLY_DATA sXML_np__formx[] = "_formx"; +sal_Char __READONLY_DATA sXML_np__xsd[] = "_xsd"; +sal_Char __READONLY_DATA sXML_np__xsi[] = "_xsi"; +sal_Char __READONLY_DATA sXML_np__field[] = "_field"; +sal_Char __READONLY_DATA sXML_np__xhtml[] = "_xhtml"; +sal_Char __READONLY_DATA sXML_np__css3text[] = "_css3text"; + +sal_Char __READONLY_DATA sXML_np__fo_old[] = "__fo"; +sal_Char __READONLY_DATA sXML_np__xlink_old[] = "__xlink"; +sal_Char __READONLY_DATA sXML_np__office_old[] = "__office"; +sal_Char __READONLY_DATA sXML_np__style_old[] = "__style"; +sal_Char __READONLY_DATA sXML_np__text_old[] = "__text"; +sal_Char __READONLY_DATA sXML_np__table_old[] = "__table"; +sal_Char __READONLY_DATA sXML_np__meta_old[] = "__meta"; + + + +class SvXMLImportEventListener : public cppu::WeakImplHelper1< + com::sun::star::lang::XEventListener > +{ +private: + SvXMLImport* pImport; + +public: + SvXMLImportEventListener(SvXMLImport* pImport); + virtual ~SvXMLImportEventListener(); + + // XEventListener + virtual void SAL_CALL disposing(const lang::EventObject& rEventObject) throw(::com::sun::star::uno::RuntimeException); +}; + +SvXMLImportEventListener::SvXMLImportEventListener(SvXMLImport* pTempImport) + : pImport(pTempImport) +{ +} + +SvXMLImportEventListener::~SvXMLImportEventListener() +{ +} + +// XEventListener +void SAL_CALL SvXMLImportEventListener::disposing( const lang::EventObject& ) + throw(uno::RuntimeException) +{ + if (pImport) + { + pImport->DisposingModel(); + pImport = NULL; + } +} + +//============================================================================== + +class SvXMLImport_Impl +{ +public: + FontToSubsFontConverter hBatsFontConv; + FontToSubsFontConverter hMathFontConv; + + bool mbOwnGraphicResolver; + bool mbOwnEmbeddedResolver; + INetURLObject aBaseURL; + INetURLObject aDocBase; + + /// name of stream in package, e.g., "content.xml" + ::rtl::OUString mStreamName; + + ::rtl::OUString aODFVersion; + + // Boolean, indicating that position attributes + // of shapes are given in horizontal left-to-right layout. This is the case + // for the OpenOffice.org file format. (#i28749#) + sal_Bool mbShapePositionInHoriL2R; + sal_Bool mbTextDocInOOoFileFormat; + + const uno::Reference< uno::XComponentContext > mxComponentContext; + + std::auto_ptr< xmloff::RDFaImportHelper > mpRDFaHelper; + + SvXMLImport_Impl() : + hBatsFontConv( 0 ), hMathFontConv( 0 ), + mbOwnGraphicResolver( false ), + mbOwnEmbeddedResolver( false ), + mStreamName(), + // Convert drawing object positions from OOo file format to OASIS (#i28749#) + mbShapePositionInHoriL2R( sal_False ), + mbTextDocInOOoFileFormat( sal_False ), + mxComponentContext( ::comphelper::getProcessComponentContext() ), + mpRDFaHelper() // lazy + { + OSL_ENSURE(mxComponentContext.is(), "SvXMLImport: no ComponentContext"); + if (!mxComponentContext.is()) throw uno::RuntimeException(); + } + + ~SvXMLImport_Impl() + { + if( hBatsFontConv ) + DestroyFontToSubsFontConverter( hBatsFontConv ); + if( hMathFontConv ) + DestroyFontToSubsFontConverter( hMathFontConv ); + } + + ::comphelper::UnoInterfaceToUniqueIdentifierMapper maInterfaceToIdentifierMapper; +}; + +typedef SvXMLImportContext *SvXMLImportContextPtr; +SV_DECL_PTRARR( SvXMLImportContexts_Impl, SvXMLImportContextPtr, 20, 5 ) +SV_IMPL_PTRARR( SvXMLImportContexts_Impl, SvXMLImportContextPtr ) + +SvXMLImportContext *SvXMLImport::CreateContext( USHORT nPrefix, + const OUString& rLocalName, + const uno::Reference< xml::sax::XAttributeList >& ) +{ + return new SvXMLImportContext( *this, nPrefix, rLocalName ); +} + +void SvXMLImport::_InitCtor() +{ + if( mnImportFlags != 0 ) + { + // implicit "xml" namespace prefix + mpNamespaceMap->Add( GetXMLToken(XML_XML), GetXMLToken(XML_N_XML), + XML_NAMESPACE_XML ); + mpNamespaceMap->Add( OUString( RTL_CONSTASCII_USTRINGPARAM ( sXML_np__office ) ), + GetXMLToken(XML_N_OFFICE), + XML_NAMESPACE_OFFICE ); + mpNamespaceMap->Add( OUString( RTL_CONSTASCII_USTRINGPARAM ( sXML_np__office_ext ) ), + GetXMLToken(XML_N_OFFICE_EXT), + XML_NAMESPACE_OFFICE_EXT ); + mpNamespaceMap->Add( OUString( RTL_CONSTASCII_USTRINGPARAM ( sXML_np__ooo ) ), GetXMLToken(XML_N_OOO), XML_NAMESPACE_OOO ); + mpNamespaceMap->Add( OUString( RTL_CONSTASCII_USTRINGPARAM ( sXML_np__style) ), + GetXMLToken(XML_N_STYLE), + XML_NAMESPACE_STYLE ); + mpNamespaceMap->Add( OUString( RTL_CONSTASCII_USTRINGPARAM ( sXML_np__text) ), + GetXMLToken(XML_N_TEXT), + XML_NAMESPACE_TEXT ); + mpNamespaceMap->Add( OUString( RTL_CONSTASCII_USTRINGPARAM ( sXML_np__table ) ), + GetXMLToken(XML_N_TABLE), + XML_NAMESPACE_TABLE ); + mpNamespaceMap->Add( OUString( RTL_CONSTASCII_USTRINGPARAM ( sXML_np__table_ext ) ), + GetXMLToken(XML_N_TABLE_EXT), + XML_NAMESPACE_TABLE_EXT ); + mpNamespaceMap->Add( OUString( RTL_CONSTASCII_USTRINGPARAM ( sXML_np__draw ) ), + GetXMLToken(XML_N_DRAW), + XML_NAMESPACE_DRAW ); + mpNamespaceMap->Add( OUString( RTL_CONSTASCII_USTRINGPARAM ( sXML_np__draw_ext ) ), + GetXMLToken(XML_N_DRAW_EXT), + XML_NAMESPACE_DRAW_EXT ); + mpNamespaceMap->Add( OUString( RTL_CONSTASCII_USTRINGPARAM (sXML_np__dr3d ) ), + GetXMLToken(XML_N_DR3D), + XML_NAMESPACE_DR3D ); + mpNamespaceMap->Add( OUString( RTL_CONSTASCII_USTRINGPARAM ( sXML_np__fo) ), + GetXMLToken(XML_N_FO_COMPAT), + XML_NAMESPACE_FO ); + mpNamespaceMap->Add( OUString( RTL_CONSTASCII_USTRINGPARAM ( sXML_np__xlink) ), + GetXMLToken(XML_N_XLINK), + XML_NAMESPACE_XLINK ); + mpNamespaceMap->Add( OUString( RTL_CONSTASCII_USTRINGPARAM ( sXML_np__dc) ), + GetXMLToken(XML_N_DC), + XML_NAMESPACE_DC ); + mpNamespaceMap->Add( OUString( RTL_CONSTASCII_USTRINGPARAM ( sXML_np__dom ) ), + GetXMLToken(XML_N_DOM), + XML_NAMESPACE_DOM ); + mpNamespaceMap->Add( OUString( RTL_CONSTASCII_USTRINGPARAM ( sXML_np__meta) ), + GetXMLToken(XML_N_META), + XML_NAMESPACE_META ); + mpNamespaceMap->Add( OUString( RTL_CONSTASCII_USTRINGPARAM ( sXML_np__number) ), + GetXMLToken(XML_N_NUMBER), + XML_NAMESPACE_NUMBER ); + mpNamespaceMap->Add( OUString( RTL_CONSTASCII_USTRINGPARAM ( sXML_np__svg) ), + GetXMLToken(XML_N_SVG_COMPAT), + XML_NAMESPACE_SVG ); + mpNamespaceMap->Add( OUString( RTL_CONSTASCII_USTRINGPARAM ( sXML_np__chart) ), + GetXMLToken(XML_N_CHART), + XML_NAMESPACE_CHART ); + mpNamespaceMap->Add( OUString( RTL_CONSTASCII_USTRINGPARAM ( sXML_np__math) ), + GetXMLToken(XML_N_MATH), + XML_NAMESPACE_MATH ); + mpNamespaceMap->Add(OUString(RTL_CONSTASCII_USTRINGPARAM( sXML_np__form )), + GetXMLToken(XML_N_FORM), + XML_NAMESPACE_FORM ); + mpNamespaceMap->Add( OUString( RTL_CONSTASCII_USTRINGPARAM ( sXML_np__script) ), + GetXMLToken(XML_N_SCRIPT), + XML_NAMESPACE_SCRIPT ); + mpNamespaceMap->Add( OUString( RTL_CONSTASCII_USTRINGPARAM ( sXML_np__config) ), + GetXMLToken(XML_N_CONFIG), + XML_NAMESPACE_CONFIG ); + mpNamespaceMap->Add( OUString( RTL_CONSTASCII_USTRINGPARAM ( sXML_np__xforms) ), + GetXMLToken(XML_N_XFORMS_1_0), + XML_NAMESPACE_XFORMS ); + mpNamespaceMap->Add( OUString( RTL_CONSTASCII_USTRINGPARAM ( sXML_np__formx) ), + GetXMLToken( XML_N_FORMX ), + XML_NAMESPACE_FORMX ); + mpNamespaceMap->Add( OUString( RTL_CONSTASCII_USTRINGPARAM ( sXML_np__xsd) ), + GetXMLToken(XML_N_XSD), + XML_NAMESPACE_XSD ); + mpNamespaceMap->Add( OUString( RTL_CONSTASCII_USTRINGPARAM ( sXML_np__xsi) ), + GetXMLToken(XML_N_XSI), + XML_NAMESPACE_XFORMS ); + mpNamespaceMap->Add( OUString( RTL_CONSTASCII_USTRINGPARAM ( sXML_np__ooow ) ), GetXMLToken(XML_N_OOOW), XML_NAMESPACE_OOOW ); + mpNamespaceMap->Add( OUString( RTL_CONSTASCII_USTRINGPARAM ( sXML_np__oooc ) ), GetXMLToken(XML_N_OOOC), XML_NAMESPACE_OOOC ); + mpNamespaceMap->Add( OUString( RTL_CONSTASCII_USTRINGPARAM ( sXML_np__field ) ), GetXMLToken(XML_N_FIELD), XML_NAMESPACE_FIELD ); + mpNamespaceMap->Add( OUString( RTL_CONSTASCII_USTRINGPARAM ( sXML_np__of ) ), + GetXMLToken(XML_N_OF), XML_NAMESPACE_OF ); + mpNamespaceMap->Add( + OUString( RTL_CONSTASCII_USTRINGPARAM ( sXML_np__xhtml ) ), + GetXMLToken(XML_N_XHTML), XML_NAMESPACE_XHTML ); + mpNamespaceMap->Add( + OUString( RTL_CONSTASCII_USTRINGPARAM( sXML_np__css3text ) ), + GetXMLToken(XML_N_CSS3TEXT), XML_NAMESPACE_CSS3TEXT ); + } + + msPackageProtocol = OUString( RTL_CONSTASCII_USTRINGPARAM( "vnd.sun.star.Package:" ) ); + + if (mxNumberFormatsSupplier.is()) + mpNumImport = new SvXMLNumFmtHelper(mxNumberFormatsSupplier, getServiceFactory()); + + if (mxModel.is() && !mxEventListener.is()) + { + mxEventListener.set(new SvXMLImportEventListener(this)); + mxModel->addEventListener(mxEventListener); + } + + ::comphelper::UnoInterfaceToUniqueIdentifierMapper maInterfaceToIdentifierMapper; + +} + +// #110680# +SvXMLImport::SvXMLImport( + const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory >& xServiceFactory, + sal_uInt16 nImportFlags ) throw () +: mpImpl( new SvXMLImport_Impl() ), + mpNamespaceMap( new SvXMLNamespaceMap ), + + // #110680# + // pUnitConv( new SvXMLUnitConverter( MAP_100TH_MM, MAP_100TH_MM ) ), + mpUnitConv( new SvXMLUnitConverter( MAP_100TH_MM, MAP_100TH_MM, xServiceFactory ) ), + + mpContexts( new SvXMLImportContexts_Impl ), + mpNumImport( NULL ), + mpProgressBarHelper( NULL ), + mpEventImportHelper( NULL ), + mpXMLErrors( NULL ), + mpStyleMap(0), + mnImportFlags( nImportFlags ), + mnErrorFlags(0), + // #110680# + mxServiceFactory(xServiceFactory), + mbIsFormsSupported( sal_True ), + mbIsTableShapeSupported( false ), + mbIsGraphicLoadOnDemandSupported( true ) +{ + DBG_ASSERT( mxServiceFactory.is(), "got no service manager" ); + _InitCtor(); +} + +// #110680# +SvXMLImport::SvXMLImport( + const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory >& xServiceFactory, + const Reference< XModel > & rModel ) throw () +: mxModel( rModel ), + mxNumberFormatsSupplier (rModel, uno::UNO_QUERY), + mpImpl( new SvXMLImport_Impl() ), + mpNamespaceMap( new SvXMLNamespaceMap ), + // #110680# + // pUnitConv( new SvXMLUnitConverter( MAP_100TH_MM, MAP_100TH_MM ) ), + mpUnitConv( new SvXMLUnitConverter( MAP_100TH_MM, MAP_100TH_MM, xServiceFactory ) ), + mpContexts( new SvXMLImportContexts_Impl ), + mpNumImport( NULL ), + mpProgressBarHelper( NULL ), + mpEventImportHelper( NULL ), + mpXMLErrors( NULL ), + mpStyleMap(0), + mnImportFlags( IMPORT_ALL ), + mnErrorFlags(0), + // #110680# + mxServiceFactory(xServiceFactory), + mbIsFormsSupported( sal_True ), + mbIsTableShapeSupported( false ), + mbIsGraphicLoadOnDemandSupported( true ) +{ + DBG_ASSERT( mxServiceFactory.is(), "got no service manager" ); + _InitCtor(); +} + +// #110680# +SvXMLImport::SvXMLImport( + const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory >& xServiceFactory, + const Reference< XModel > & rModel, + const ::com::sun::star::uno::Reference< ::com::sun::star::document::XGraphicObjectResolver > & rGraphicObjects ) throw () +: mxModel( rModel ), + mxNumberFormatsSupplier (rModel, uno::UNO_QUERY), + mxGraphicResolver( rGraphicObjects ), + mpImpl( new SvXMLImport_Impl() ), + mpNamespaceMap( new SvXMLNamespaceMap ), + // #110680# + // pUnitConv( new SvXMLUnitConverter( MAP_100TH_MM, MAP_100TH_MM ) ), + mpUnitConv( new SvXMLUnitConverter( MAP_100TH_MM, MAP_100TH_MM, xServiceFactory ) ), + mpContexts( new SvXMLImportContexts_Impl ), + mpNumImport( NULL ), + mpProgressBarHelper( NULL ), + mpEventImportHelper( NULL ), + mpXMLErrors( NULL ), + mpStyleMap(0), + mnImportFlags( IMPORT_ALL ), + mnErrorFlags(0), + // #110680# + mxServiceFactory(xServiceFactory), + mbIsFormsSupported( sal_True ), + mbIsGraphicLoadOnDemandSupported( true ) +{ + DBG_ASSERT( mxServiceFactory.is(), "got no service manager" ); + _InitCtor(); +} + +SvXMLImport::~SvXMLImport() throw () +{ + delete mpXMLErrors; + delete mpNamespaceMap; + delete mpUnitConv; + delete mpEventImportHelper; + if( mpContexts ) + { + while( mpContexts->Count() ) + { + sal_uInt16 n = mpContexts->Count() - 1; + SvXMLImportContext *pContext = (*mpContexts)[n]; + mpContexts->Remove( n, 1 ); + if( pContext ) + pContext->ReleaseRef(); + } + delete mpContexts; + } + + // delete pImageMapImportHelper; + + // #i9518# the import component might not be deleted until after the document has been closed, + // so the stuff that accesses the document has been moved to endDocument. + + // pNumImport is allocated in the ctor, so it must also be deleted here in case the component + // is created and deleted without actually importing. + delete mpNumImport; + delete mpProgressBarHelper; + + xmloff::token::ResetTokens(); + + if( mpImpl ) + delete mpImpl; + + if (mxEventListener.is() && mxModel.is()) + mxModel->removeEventListener(mxEventListener); +} + +// XUnoTunnel & co +const uno::Sequence< sal_Int8 > & SvXMLImport::getUnoTunnelId() throw() +{ + static uno::Sequence< sal_Int8 > * pSeq = 0; + if( !pSeq ) + { + Guard< Mutex > aGuard( Mutex::getGlobalMutex() ); + if( !pSeq ) + { + static uno::Sequence< sal_Int8 > aSeq( 16 ); + rtl_createUuid( (sal_uInt8*)aSeq.getArray(), 0, sal_True ); + pSeq = &aSeq; + } + } + return *pSeq; +} + +SvXMLImport* SvXMLImport::getImplementation( uno::Reference< uno::XInterface > xInt ) throw() +{ + uno::Reference< lang::XUnoTunnel > xUT( xInt, uno::UNO_QUERY ); + if( xUT.is() ) + { + return + reinterpret_cast<SvXMLImport*>( + sal::static_int_cast<sal_IntPtr>( + xUT->getSomething( SvXMLImport::getUnoTunnelId()))); + } + else + return NULL; +} + +// XUnoTunnel +sal_Int64 SAL_CALL SvXMLImport::getSomething( const uno::Sequence< sal_Int8 >& rId ) + throw( uno::RuntimeException ) +{ + if( rId.getLength() == 16 && 0 == rtl_compareMemory( getUnoTunnelId().getConstArray(), + rId.getConstArray(), 16 ) ) + { + return sal::static_int_cast<sal_Int64>(reinterpret_cast<sal_uIntPtr>(this)); + } + return 0; +} + +void SAL_CALL SvXMLImport::startDocument( void ) + throw( xml::sax::SAXException, uno::RuntimeException ) +{ + RTL_LOGFILE_TRACE_AUTHOR( "xmloff", LOGFILE_AUTHOR, "{ SvXMLImport::startDocument" ); + + if( !mxGraphicResolver.is() || !mxEmbeddedResolver.is() ) + { + Reference< lang::XMultiServiceFactory > xFactory( mxModel, UNO_QUERY ); + if( xFactory.is() ) + { + try + { + if( !mxGraphicResolver.is() ) + { + mxGraphicResolver = Reference< XGraphicObjectResolver >::query( + xFactory->createInstance( + OUString(RTL_CONSTASCII_USTRINGPARAM( + // #99870# Import... instead of Export... + "com.sun.star.document.ImportGraphicObjectResolver")))); + mpImpl->mbOwnGraphicResolver = mxGraphicResolver.is(); + } + + if( !mxEmbeddedResolver.is() ) + { + mxEmbeddedResolver = Reference< XEmbeddedObjectResolver >::query( + xFactory->createInstance( + OUString(RTL_CONSTASCII_USTRINGPARAM( + // #99870# Import... instead of Export... + "com.sun.star.document.ImportEmbeddedObjectResolver")))); + mpImpl->mbOwnEmbeddedResolver = mxEmbeddedResolver.is(); + } + } + catch( com::sun::star::uno::Exception& ) + { + } + } + } +} + +void SAL_CALL SvXMLImport::endDocument( void ) + throw( xml::sax::SAXException, uno::RuntimeException) +{ + RTL_LOGFILE_TRACE_AUTHOR( "xmloff", LOGFILE_AUTHOR, "} SvXMLImport::startDocument" ); + + // #i9518# All the stuff that accesses the document has to be done here, not in the dtor, + // because the SvXMLImport dtor might not be called until after the document has been closed. + + if (mpImpl->mpRDFaHelper.get()) + { + const uno::Reference<rdf::XRepositorySupplier> xRS(mxModel, + uno::UNO_QUERY); + if (xRS.is()) + { + mpImpl->mpRDFaHelper->InsertRDFa( xRS ); + } + } + + if (mpNumImport) + { + delete mpNumImport; + mpNumImport = NULL; + } + if (mxImportInfo.is()) + { + uno::Reference< beans::XPropertySetInfo > xPropertySetInfo = mxImportInfo->getPropertySetInfo(); + if (xPropertySetInfo.is()) + { + if (mpProgressBarHelper) + { + OUString sProgressMax(RTL_CONSTASCII_USTRINGPARAM(XML_PROGRESSMAX)); + OUString sProgressCurrent(RTL_CONSTASCII_USTRINGPARAM(XML_PROGRESSCURRENT)); + OUString sRepeat(RTL_CONSTASCII_USTRINGPARAM(XML_PROGRESSREPEAT)); + if (xPropertySetInfo->hasPropertyByName(sProgressMax) && + xPropertySetInfo->hasPropertyByName(sProgressCurrent)) + { + sal_Int32 nProgressMax(mpProgressBarHelper->GetReference()); + sal_Int32 nProgressCurrent(mpProgressBarHelper->GetValue()); + uno::Any aAny; + aAny <<= nProgressMax; + mxImportInfo->setPropertyValue(sProgressMax, aAny); + aAny <<= nProgressCurrent; + mxImportInfo->setPropertyValue(sProgressCurrent, aAny); + } + if (xPropertySetInfo->hasPropertyByName(sRepeat)) + mxImportInfo->setPropertyValue(sRepeat, cppu::bool2any(mpProgressBarHelper->GetRepeat())); + // pProgressBarHelper is deleted in dtor + } + OUString sNumberStyles(RTL_CONSTASCII_USTRINGPARAM(XML_NUMBERSTYLES)); + if (mxNumberStyles.is() && xPropertySetInfo->hasPropertyByName(sNumberStyles)) + { + uno::Any aAny; + aAny <<= mxNumberStyles; + mxImportInfo->setPropertyValue(sNumberStyles, aAny); + } + } + } + + if( mxFontDecls.Is() ) + ((SvXMLStylesContext *)&mxFontDecls)->Clear(); + if( mxStyles.Is() ) + ((SvXMLStylesContext *)&mxStyles)->Clear(); + if( mxAutoStyles.Is() ) + ((SvXMLStylesContext *)&mxAutoStyles)->Clear(); + if( mxMasterStyles.Is() ) + ((SvXMLStylesContext *)&mxMasterStyles)->Clear(); + + // possible form-layer related knittings which can only be done when + // the whole document exists + if ( mxFormImport.is() ) + mxFormImport->documentDone(); + + // The shape import helper does the z-order sorting in the dtor, + // so it must be deleted here, too. + mxShapeImport = NULL; + + if( mpImpl->mbOwnGraphicResolver ) + { + Reference< lang::XComponent > xComp( mxGraphicResolver, UNO_QUERY ); + xComp->dispose(); + } + + if( mpImpl->mbOwnEmbeddedResolver ) + { + Reference< lang::XComponent > xComp( mxEmbeddedResolver, UNO_QUERY ); + xComp->dispose(); + } + if( mpStyleMap ) + { + mpStyleMap->release(); + mpStyleMap = 0; + } + + if ( mpXMLErrors != NULL ) + { + mpXMLErrors->ThrowErrorAsSAXException( XMLERROR_FLAG_SEVERE ); + } +} + +void SAL_CALL SvXMLImport::startElement( const OUString& rName, + const uno::Reference< xml::sax::XAttributeList >& xAttrList ) + throw(xml::sax::SAXException, uno::RuntimeException) +{ + SvXMLNamespaceMap *pRewindMap = 0; + + // Process namespace attributes. This must happen before creating the + // context, because namespace decaration apply to the element name itself. + INT16 nAttrCount = xAttrList.is() ? xAttrList->getLength() : 0; + for( INT16 i=0; i < nAttrCount; i++ ) + { + const OUString& rAttrName = xAttrList->getNameByIndex( i ); + if ( rAttrName.equalsAscii("office:version") ) + { + mpImpl->aODFVersion = xAttrList->getValueByIndex( i ); + + // the ODF version in content.xml and manifest.xml must be the same starting from ODF1.2 + if ( mpImpl->mStreamName.equals( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "content.xml" ) ) ) + && !IsODFVersionConsistent( mpImpl->aODFVersion ) ) + { + throw xml::sax::SAXException( + ::rtl::OUString( + RTL_CONSTASCII_USTRINGPARAM( "Inconsistent ODF versions in content.xml and manifest.xml!" ) ), + uno::Reference< uno::XInterface >(), + uno::makeAny( + packages::zip::ZipIOException( + ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( + "Inconsistent ODF versions in content.xml and manifest.xml!" ) ), + Reference< XInterface >() ) ) ); + } + } + else if( ( rAttrName.getLength() >= 5 ) && + ( rAttrName.compareTo( GetXMLToken(XML_XMLNS), 5 ) == 0 ) && + ( rAttrName.getLength() == 5 || ':' == rAttrName[5] ) ) + { + if( !pRewindMap ) + { + pRewindMap = mpNamespaceMap; + mpNamespaceMap = new SvXMLNamespaceMap( *mpNamespaceMap ); + } + const OUString& rAttrValue = xAttrList->getValueByIndex( i ); + + OUString aPrefix( ( rAttrName.getLength() == 5 ) + ? OUString() + : rAttrName.copy( 6 ) ); + // Add namespace, but only if it is known. + sal_uInt16 nKey = mpNamespaceMap->AddIfKnown( aPrefix, rAttrValue ); + // If namespace is unknwon, try to match a name with similar + // TC Id an version + if( XML_NAMESPACE_UNKNOWN == nKey ) + { + OUString aTestName( rAttrValue ); + if( SvXMLNamespaceMap::NormalizeURI( aTestName ) ) + nKey = mpNamespaceMap->AddIfKnown( aPrefix, aTestName ); + } + // If that namespace is not known, too, add it as unknown + if( XML_NAMESPACE_UNKNOWN == nKey ) + mpNamespaceMap->Add( aPrefix, rAttrValue ); + + } + } + + // Get element's namespace and local name. + OUString aLocalName; + USHORT nPrefix = + mpNamespaceMap->GetKeyByAttrName( rName, &aLocalName ); + + // If there are contexts already, call a CreateChildContext at the topmost + // context. Otherwise, create a default context. + SvXMLImportContext *pContext; + USHORT nCount = mpContexts->Count(); + if( nCount > 0 ) + { + pContext = (*mpContexts)[nCount - 1]->CreateChildContext( nPrefix, + aLocalName, + xAttrList ); + DBG_ASSERT( pContext && pContext->GetPrefix() == nPrefix, + "SvXMLImport::startElement: created context has wrong prefix" ); + } + else + { +#ifdef TIMELOG + // If we do profiling, we want a trace message for the first element + // in order to identify the stream. + ByteString aString( (String)rName, RTL_TEXTENCODING_ASCII_US ); + RTL_LOGFILE_TRACE_AUTHOR1( "xmloff", LOGFILE_AUTHOR, + "SvXMLImport::StartElement( \"%s\", ... )", + aString.GetBuffer() ); +#endif + + pContext = CreateContext( nPrefix, aLocalName, xAttrList ); + if( (nPrefix & XML_NAMESPACE_UNKNOWN_FLAG) != 0 && + IS_TYPE( SvXMLImportContext, pContext ) ) + { + OUString aMsg( RTL_CONSTASCII_USTRINGPARAM( "Root element unknown" ) ); + Reference<xml::sax::XLocator> xDummyLocator; + Sequence < OUString > aParams(1); + aParams.getArray()[0] = rName; + + SetError( XMLERROR_FLAG_SEVERE|XMLERROR_UNKNWON_ROOT, + aParams, aMsg, xDummyLocator ); + } + } + + DBG_ASSERT( pContext, "SvXMLImport::startElement: missing context" ); + if( !pContext ) + pContext = new SvXMLImportContext( *this, nPrefix, aLocalName ); + + pContext->AddRef(); + + // Remeber old namespace map. + if( pRewindMap ) + pContext->SetRewindMap( pRewindMap ); + + // Call a startElement at the new context. + pContext->StartElement( xAttrList ); + + // Push context on stack. + mpContexts->Insert( pContext, nCount ); +} + +void SAL_CALL SvXMLImport::endElement( const OUString& +#ifdef DBG_UTIL +rName +#endif +) + throw(xml::sax::SAXException, uno::RuntimeException) +{ + USHORT nCount = mpContexts->Count(); + DBG_ASSERT( nCount, "SvXMLImport::endElement: no context left" ); + if( nCount > 0 ) + { + // Get topmost context and remove it from the stack. + SvXMLImportContext *pContext = (*mpContexts)[nCount-1]; + mpContexts->Remove( nCount-1, 1 ); + +#ifdef DBG_UTIL + // Non product only: check if endElement call matches startELement call. + OUString aLocalName; + USHORT nPrefix = + mpNamespaceMap->GetKeyByAttrName( rName, &aLocalName ); + DBG_ASSERT( pContext->GetPrefix() == nPrefix, + "SvXMLImport::endElement: popped context has wrong prefix" ); + DBG_ASSERT( pContext->GetLocalName() == aLocalName, + "SvXMLImport::endElement: popped context has wrong lname" ); +#endif + + // Call a EndElement at the current context. + pContext->EndElement(); + + // Get a namespace map to rewind. + SvXMLNamespaceMap *pRewindMap = pContext->GetRewindMap(); + + // Delete the current context. + pContext->ReleaseRef(); + pContext = 0; + + // Rewind a namespace map. + if( pRewindMap ) + { + delete mpNamespaceMap; + mpNamespaceMap = pRewindMap; + } + } +} + +void SAL_CALL SvXMLImport::characters( const OUString& rChars ) + throw(xml::sax::SAXException, uno::RuntimeException) +{ + USHORT nCount = mpContexts->Count(); + if( nCount > 0 ) + { + (*mpContexts)[nCount - 1]->Characters( rChars ); + } +} + +void SAL_CALL SvXMLImport::ignorableWhitespace( const OUString& ) + throw(xml::sax::SAXException, uno::RuntimeException) +{ +} + +void SAL_CALL SvXMLImport::processingInstruction( const OUString&, + const OUString& ) + throw(xml::sax::SAXException, uno::RuntimeException) +{ +} + +void SAL_CALL SvXMLImport::setDocumentLocator( const uno::Reference< xml::sax::XLocator >& rLocator ) + throw(xml::sax::SAXException, uno::RuntimeException) +{ + mxLocator = rLocator; +} + +// XExtendedDocumentHandler +void SAL_CALL SvXMLImport::startCDATA( void ) throw(xml::sax::SAXException, uno::RuntimeException) +{ +} + +void SAL_CALL SvXMLImport::endCDATA( void ) throw(uno::RuntimeException) +{ +} + +void SAL_CALL SvXMLImport::comment( const OUString& ) + throw(xml::sax::SAXException, uno::RuntimeException) +{ +} + +void SAL_CALL SvXMLImport::allowLineBreak( void ) + throw(xml::sax::SAXException, uno::RuntimeException) +{ +} + +void SAL_CALL SvXMLImport::unknown( const OUString& ) + throw(xml::sax::SAXException, uno::RuntimeException) +{ +} + +void SvXMLImport::SetStatistics(const uno::Sequence< beans::NamedValue> &) +{ + GetProgressBarHelper()->SetRepeat(sal_False); + GetProgressBarHelper()->SetReference(0); +} + +/////////////////////////////////////////////////////////////////////// + +// XImporter +void SAL_CALL SvXMLImport::setTargetDocument( const uno::Reference< lang::XComponent >& xDoc ) + throw(lang::IllegalArgumentException, uno::RuntimeException) +{ + mxModel = uno::Reference< frame::XModel >::query( xDoc ); + if( !mxModel.is() ) + throw lang::IllegalArgumentException(); + if (mxModel.is() && !mxEventListener.is()) + { + mxEventListener.set(new SvXMLImportEventListener(this)); + mxModel->addEventListener(mxEventListener); + } + + DBG_ASSERT( !mpNumImport, "number format import already exists." ); + if( mpNumImport ) + { + delete mpNumImport; + mpNumImport = 0; + } +} + +// XFilter +sal_Bool SAL_CALL SvXMLImport::filter( const uno::Sequence< beans::PropertyValue >& ) + throw (uno::RuntimeException) +{ + return sal_False; +} + +void SAL_CALL SvXMLImport::cancel( ) + throw (uno::RuntimeException) +{ +} + +// XInitialize +void SAL_CALL SvXMLImport::initialize( const uno::Sequence< uno::Any >& aArguments ) + throw(::com::sun::star::uno::Exception, ::com::sun::star::uno::RuntimeException) +{ + const sal_Int32 nAnyCount = aArguments.getLength(); + const uno::Any* pAny = aArguments.getConstArray(); + + for( sal_Int32 nIndex = 0; nIndex < nAnyCount; nIndex++, pAny++ ) + { + Reference<XInterface> xValue; + *pAny >>= xValue; + + uno::Reference<task::XStatusIndicator> xTmpStatusIndicator( + xValue, UNO_QUERY ); + if( xTmpStatusIndicator.is() ) + mxStatusIndicator = xTmpStatusIndicator; + + uno::Reference<document::XGraphicObjectResolver> xTmpGraphicResolver( + xValue, UNO_QUERY ); + if( xTmpGraphicResolver.is() ) + mxGraphicResolver = xTmpGraphicResolver; + + uno::Reference<document::XEmbeddedObjectResolver> xTmpObjectResolver( + xValue, UNO_QUERY ); + if( xTmpObjectResolver.is() ) + mxEmbeddedResolver = xTmpObjectResolver; + + uno::Reference<beans::XPropertySet> xTmpPropSet( xValue, UNO_QUERY ); + if( xTmpPropSet.is() ) + { + mxImportInfo = xTmpPropSet; + uno::Reference< beans::XPropertySetInfo > xPropertySetInfo = mxImportInfo->getPropertySetInfo(); + if (xPropertySetInfo.is()) + { + OUString sPropName(RTL_CONSTASCII_USTRINGPARAM(XML_NUMBERSTYLES)); + if (xPropertySetInfo->hasPropertyByName(sPropName)) + { + uno::Any aAny = mxImportInfo->getPropertyValue(sPropName); + aAny >>= mxNumberStyles; + } + + sPropName = OUString( RTL_CONSTASCII_USTRINGPARAM("PrivateData" ) ); + if (xPropertySetInfo->hasPropertyByName(sPropName)) + { + Reference < XInterface > xIfc; + uno::Any aAny = mxImportInfo->getPropertyValue(sPropName); + aAny >>= xIfc; + + StyleMap *pSMap = StyleMap::getImplementation( xIfc ); + if( pSMap ) + { + mpStyleMap = pSMap; + mpStyleMap->acquire(); + } + } + OUString sBaseURI; + sPropName = OUString( RTL_CONSTASCII_USTRINGPARAM("BaseURI" ) ); + if (xPropertySetInfo->hasPropertyByName(sPropName)) + { + uno::Any aAny = mxImportInfo->getPropertyValue(sPropName); + aAny >>= sBaseURI; + mpImpl->aBaseURL.SetURL( sBaseURI ); + mpImpl->aDocBase.SetURL( sBaseURI ); + } + OUString sRelPath; + sPropName = OUString( RTL_CONSTASCII_USTRINGPARAM("StreamRelPath" ) ); + if( xPropertySetInfo->hasPropertyByName(sPropName) ) + { + uno::Any aAny = mxImportInfo->getPropertyValue(sPropName); + aAny >>= sRelPath; + } + OUString sName; + sPropName = OUString( RTL_CONSTASCII_USTRINGPARAM("StreamName" ) ); + if( xPropertySetInfo->hasPropertyByName(sPropName) ) + { + uno::Any aAny = mxImportInfo->getPropertyValue(sPropName); + aAny >>= sName; + } + if( sBaseURI.getLength() && sName.getLength() ) + { + if( sRelPath.getLength() ) + mpImpl->aBaseURL.insertName( sRelPath ); + mpImpl->aBaseURL.insertName( sName ); + } + mpImpl->mStreamName = sName; // Note: may be empty (XSLT) + // Retrieve property <ShapePositionInHoriL2R> (#i28749#) + sPropName = OUString( RTL_CONSTASCII_USTRINGPARAM("ShapePositionInHoriL2R" ) ); + if( xPropertySetInfo->hasPropertyByName(sPropName) ) + { + uno::Any aAny = mxImportInfo->getPropertyValue(sPropName); + aAny >>= (mpImpl->mbShapePositionInHoriL2R); + } + sPropName = OUString( RTL_CONSTASCII_USTRINGPARAM("TextDocInOOoFileFormat" ) ); + if( xPropertySetInfo->hasPropertyByName(sPropName) ) + { + uno::Any aAny = mxImportInfo->getPropertyValue(sPropName); + aAny >>= (mpImpl->mbTextDocInOOoFileFormat); + } + } + } + } +} + +// XServiceInfo +OUString SAL_CALL SvXMLImport::getImplementationName() + throw(uno::RuntimeException) +{ + OUString aStr; + return aStr; +} + +sal_Bool SAL_CALL SvXMLImport::supportsService( const OUString& rServiceName ) + throw(::com::sun::star::uno::RuntimeException) +{ + return + rServiceName.equalsAsciiL( + "com.sun.star.document.ImportFilter", + sizeof("com.sun.star.document.ImportFilter")-1 ) || + rServiceName.equalsAsciiL( + "com.sun.star.xml.XMLImportFilter", + sizeof("com.sun.star.xml.XMLImportFilter")-1); +} + +uno::Sequence< OUString > SAL_CALL SvXMLImport::getSupportedServiceNames( ) + throw(uno::RuntimeException) +{ + uno::Sequence<OUString> aSeq(2); + aSeq[0] = OUString( + RTL_CONSTASCII_USTRINGPARAM("com.sun.star.document.ImportFilter")); + aSeq[1] = OUString( + RTL_CONSTASCII_USTRINGPARAM("com.sun.star.xml.XMLImportFilter")); + return aSeq; +} + +/////////////////////////////////////////////////////////////////////// + +XMLTextImportHelper* SvXMLImport::CreateTextImport() +{ + return new XMLTextImportHelper( mxModel, *this ); +} + +XMLShapeImportHelper* SvXMLImport::CreateShapeImport() +{ + return new XMLShapeImportHelper( *this, mxModel ); +} + +#ifndef SVX_LIGHT +SchXMLImportHelper* SvXMLImport::CreateChartImport() +{ + return new SchXMLImportHelper(); +} +#endif + +#ifndef SVX_LIGHT +::xmloff::OFormLayerXMLImport* SvXMLImport::CreateFormImport() +{ + return new ::xmloff::OFormLayerXMLImport(*this); +} +#endif // #ifndef SVX_LIGHT + + +/////////////////////////////////////////////////////////////////////////////// +// +// Get or create fill/line/lineend-style-helper +// + +const Reference< container::XNameContainer > & SvXMLImport::GetGradientHelper() +{ + if( !mxGradientHelper.is() ) + { + if( mxModel.is() ) + { + Reference< lang::XMultiServiceFactory > xServiceFact( mxModel, UNO_QUERY); + if( xServiceFact.is() ) + { + try + { + mxGradientHelper = Reference< container::XNameContainer >( xServiceFact->createInstance( + OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.drawing.GradientTable" ) ) ), UNO_QUERY); + } + catch( lang::ServiceNotRegisteredException& ) + {} + } + } + } + + return mxGradientHelper; +} + +const Reference< container::XNameContainer > & SvXMLImport::GetHatchHelper() +{ + if( !mxHatchHelper.is() ) + { + if( mxModel.is() ) + { + Reference< lang::XMultiServiceFactory > xServiceFact( mxModel, UNO_QUERY); + if( xServiceFact.is() ) + { + try + { + mxHatchHelper = Reference< container::XNameContainer >( xServiceFact->createInstance( + OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.drawing.HatchTable" ) ) ), UNO_QUERY); + } + catch( lang::ServiceNotRegisteredException& ) + {} + } + } + } + + return mxHatchHelper; +} + +const Reference< container::XNameContainer > & SvXMLImport::GetBitmapHelper() +{ + if( !mxBitmapHelper.is() ) + { + if( mxModel.is() ) + { + Reference< lang::XMultiServiceFactory > xServiceFact( mxModel, UNO_QUERY); + if( xServiceFact.is() ) + { + try + { + mxBitmapHelper = Reference< container::XNameContainer >( xServiceFact->createInstance( + OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.drawing.BitmapTable" ) ) ), UNO_QUERY); + } + catch( lang::ServiceNotRegisteredException& ) + {} + } + } + } + + return mxBitmapHelper; +} + +const Reference< container::XNameContainer > & SvXMLImport::GetTransGradientHelper() +{ + if( !mxTransGradientHelper.is() ) + { + if( mxModel.is() ) + { + Reference< lang::XMultiServiceFactory > xServiceFact( mxModel, UNO_QUERY); + if( xServiceFact.is() ) + { + try + { + mxTransGradientHelper = Reference< container::XNameContainer >( xServiceFact->createInstance( + OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.drawing.TransparencyGradientTable" ) ) ), UNO_QUERY); + } + catch( lang::ServiceNotRegisteredException& ) + {} + } + } + } + + return mxTransGradientHelper; +} + +const Reference< container::XNameContainer > & SvXMLImport::GetMarkerHelper() +{ + if( !mxMarkerHelper.is() ) + { + if( mxModel.is() ) + { + Reference< lang::XMultiServiceFactory > xServiceFact( mxModel, UNO_QUERY); + if( xServiceFact.is() ) + { + try + { + mxMarkerHelper = Reference< container::XNameContainer >( xServiceFact->createInstance( + OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.drawing.MarkerTable" ) ) ), UNO_QUERY); + } + catch( lang::ServiceNotRegisteredException& ) + {} + } + } + } + + return mxMarkerHelper; +} + +const Reference< container::XNameContainer > & SvXMLImport::GetDashHelper() +{ + if( !mxDashHelper.is() ) + { + if( mxModel.is() ) + { + Reference< lang::XMultiServiceFactory > xServiceFact( mxModel, UNO_QUERY); + if( xServiceFact.is() ) + { + try + { + mxDashHelper = Reference< container::XNameContainer >( xServiceFact->createInstance( + OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.drawing.DashTable" ) ) ), UNO_QUERY); + } + catch( lang::ServiceNotRegisteredException& ) + {} + } + } + } + + return mxDashHelper; +} + +sal_Bool SvXMLImport::IsPackageURL( const ::rtl::OUString& rURL ) const +{ + + // if, and only if, only parts are imported, then we're in a package + const sal_uInt32 nTest = IMPORT_META|IMPORT_STYLES|IMPORT_CONTENT|IMPORT_SETTINGS; + if( (mnImportFlags & nTest) == nTest ) + return sal_False; + + // Some quick tests: Some may rely on the package structure! + sal_Int32 nLen = rURL.getLength(); + if( (nLen > 0 && '/' == rURL[0]) ) + // RFC2396 net_path or abs_path + return sal_False; + else if( nLen > 1 && '.' == rURL[0] ) + { + if( '.' == rURL[1] ) + // ../: We are never going up one level, so we know + // it's not an external URI + return sal_False; + else if( '/' == rURL[1] ) + // we are remaining on a level, so it's an package URI + return sal_True; + } + + // Now check for a RFC2396 schema + sal_Int32 nPos = 1; + while( nPos < nLen ) + { + switch( rURL[nPos] ) + { + case '/': + // a relative path segement + return sal_True; + case ':': + // a schema + return sal_False; + default: + break; + // we don't care about any other characters + } + ++nPos; + } + + return sal_True; +} + +::rtl::OUString SvXMLImport::ResolveGraphicObjectURL( const ::rtl::OUString& rURL, + sal_Bool bLoadOnDemand ) +{ + ::rtl::OUString sRet; + + if( IsPackageURL( rURL ) ) + { + if( !bLoadOnDemand && mxGraphicResolver.is() ) + { + ::rtl::OUString aTmp( msPackageProtocol ); + aTmp += rURL; + sRet = mxGraphicResolver->resolveGraphicObjectURL( aTmp ); + } + + if( !sRet.getLength() ) + { + sRet = msPackageProtocol; + sRet += rURL; + } + } + + if( !sRet.getLength() ) + sRet = GetAbsoluteReference( rURL ); + + return sRet; +} + +Reference< XOutputStream > SvXMLImport::GetStreamForGraphicObjectURLFromBase64() +{ + Reference< XOutputStream > xOStm; + Reference< document::XBinaryStreamResolver > xStmResolver( mxGraphicResolver, UNO_QUERY ); + + if( xStmResolver.is() ) + xOStm = xStmResolver->createOutputStream(); + + return xOStm; +} + +::rtl::OUString SvXMLImport::ResolveGraphicObjectURLFromBase64( + const Reference < XOutputStream >& rOut ) +{ + OUString sURL; + Reference< document::XBinaryStreamResolver > xStmResolver( mxGraphicResolver, UNO_QUERY ); + if( xStmResolver.is() ) + sURL = xStmResolver->resolveOutputStream( rOut ); + + return sURL; +} + +::rtl::OUString SvXMLImport::ResolveEmbeddedObjectURL( + const ::rtl::OUString& rURL, + const ::rtl::OUString& rClassId ) +{ + ::rtl::OUString sRet; + + if( IsPackageURL( rURL ) ) + { + if ( mxEmbeddedResolver.is() ) + { + OUString sURL( rURL ); + if( rClassId.getLength() ) + { + sURL += OUString( sal_Unicode('!') ); + sURL += rClassId; + } + sRet = mxEmbeddedResolver->resolveEmbeddedObjectURL( sURL ); + } + } + else + sRet = GetAbsoluteReference( rURL ); + + return sRet; +} + +Reference < XOutputStream > + SvXMLImport::GetStreamForEmbeddedObjectURLFromBase64() +{ + Reference < XOutputStream > xOLEStream; + + if( mxEmbeddedResolver.is() ) + { + Reference< XNameAccess > xNA( mxEmbeddedResolver, UNO_QUERY ); + if( xNA.is() ) + { + OUString aURL( RTL_CONSTASCII_USTRINGPARAM( "Obj12345678" ) ); + Any aAny = xNA->getByName( aURL ); + aAny >>= xOLEStream; + } + } + + return xOLEStream; +} + +::rtl::OUString SvXMLImport::ResolveEmbeddedObjectURLFromBase64() +{ + ::rtl::OUString sRet; + + if( mxEmbeddedResolver.is() ) + { + OUString aURL( RTL_CONSTASCII_USTRINGPARAM( "Obj12345678" ) ); + sRet = mxEmbeddedResolver->resolveEmbeddedObjectURL( aURL ); + } + + return sRet; +} + +void SvXMLImport::AddStyleDisplayName( sal_uInt16 nFamily, + const OUString& rName, + const OUString& rDisplayName ) +{ + if( !mpStyleMap ) + { + mpStyleMap = new StyleMap; + mpStyleMap->acquire(); + if( mxImportInfo.is() ) + { + OUString sPrivateData( + RTL_CONSTASCII_USTRINGPARAM("PrivateData" ) ); + Reference< beans::XPropertySetInfo > xPropertySetInfo = + mxImportInfo->getPropertySetInfo(); + if( xPropertySetInfo.is() && + xPropertySetInfo->hasPropertyByName(sPrivateData) ) + { + Reference < XInterface > xIfc( + static_cast< XUnoTunnel *>( mpStyleMap ) ); + Any aAny; + aAny <<= xIfc; + mxImportInfo->setPropertyValue( sPrivateData, aAny ); + } + } + } + + StyleMap::key_type aKey( nFamily, rName ); + StyleMap::value_type aValue( aKey, rDisplayName ); + ::std::pair<StyleMap::iterator,bool> aRes( mpStyleMap->insert( aValue ) ); + OSL_ENSURE( aRes.second, "duplicate style name" ); + +} + +OUString SvXMLImport::GetStyleDisplayName( sal_uInt16 nFamily, + const OUString& rName ) const +{ + OUString sName( rName ); + if( mpStyleMap && rName.getLength() ) + { + StyleMap::key_type aKey( nFamily, rName ); + StyleMap::const_iterator aIter = mpStyleMap->find( aKey ); + if( aIter != mpStyleMap->end() ) + sName = (*aIter).second; + } + return sName; +} + +void SvXMLImport::SetViewSettings(const com::sun::star::uno::Sequence<com::sun::star::beans::PropertyValue>&) +{ +} + +void SvXMLImport::SetConfigurationSettings(const com::sun::star::uno::Sequence<com::sun::star::beans::PropertyValue>&) +{ +} + +void SvXMLImport::SetDocumentSpecificSettings(const ::rtl::OUString& _rSettingsGroupName, const uno::Sequence<beans::PropertyValue>& _rSettings) +{ + (void)_rSettingsGroupName; + (void)_rSettings; +} + +ProgressBarHelper* SvXMLImport::GetProgressBarHelper() +{ + if (!mpProgressBarHelper) + { + mpProgressBarHelper = new ProgressBarHelper(mxStatusIndicator, sal_False); + + if (mxImportInfo.is()) + { + uno::Reference< beans::XPropertySetInfo > xPropertySetInfo = mxImportInfo->getPropertySetInfo(); + if (xPropertySetInfo.is()) + { + OUString sProgressRange(RTL_CONSTASCII_USTRINGPARAM(XML_PROGRESSRANGE)); + OUString sProgressMax(RTL_CONSTASCII_USTRINGPARAM(XML_PROGRESSMAX)); + OUString sProgressCurrent(RTL_CONSTASCII_USTRINGPARAM(XML_PROGRESSCURRENT)); + OUString sRepeat(RTL_CONSTASCII_USTRINGPARAM(XML_PROGRESSREPEAT)); + if (xPropertySetInfo->hasPropertyByName(sProgressMax) && + xPropertySetInfo->hasPropertyByName(sProgressCurrent) && + xPropertySetInfo->hasPropertyByName(sProgressRange)) + { + uno::Any aAny; + sal_Int32 nProgressMax(0); + sal_Int32 nProgressCurrent(0); + sal_Int32 nProgressRange(0); + aAny = mxImportInfo->getPropertyValue(sProgressRange); + if (aAny >>= nProgressRange) + mpProgressBarHelper->SetRange(nProgressRange); + aAny = mxImportInfo->getPropertyValue(sProgressMax); + if (aAny >>= nProgressMax) + mpProgressBarHelper->SetReference(nProgressMax); + aAny = mxImportInfo->getPropertyValue(sProgressCurrent); + if (aAny >>= nProgressCurrent) + mpProgressBarHelper->SetValue(nProgressCurrent); + } + if (xPropertySetInfo->hasPropertyByName(sRepeat)) + { + uno::Any aAny = mxImportInfo->getPropertyValue(sRepeat); + if (aAny.getValueType() == getBooleanCppuType()) + mpProgressBarHelper->SetRepeat(::cppu::any2bool(aAny)); + else { + DBG_ERRORFILE("why is it no boolean?"); + } + } + } + } + } + return mpProgressBarHelper; +} + +void SvXMLImport::AddNumberStyle(sal_Int32 nKey, const OUString& rName) +{ + if (!mxNumberStyles.is()) + mxNumberStyles = uno::Reference< container::XNameContainer >( comphelper::NameContainer_createInstance( ::getCppuType((const sal_Int32*)0)) ); + if (mxNumberStyles.is()) + { + uno::Any aAny; + aAny <<= nKey; + try + { + mxNumberStyles->insertByName(rName, aAny); + } + catch ( uno::Exception& ) + { + DBG_ERROR("Numberformat could not be inserted"); + } + } + else { + DBG_ERROR("not possible to create NameContainer"); + } +} + +XMLEventImportHelper& SvXMLImport::GetEventImport() +{ +#ifndef SVX_LIGHT + if (!mpEventImportHelper) + { + // construct event helper and register StarBasic handler and standard + // event tables + mpEventImportHelper = new XMLEventImportHelper(); + OUString sStarBasic(GetXMLToken(XML_STARBASIC)); + mpEventImportHelper->RegisterFactory(sStarBasic, + new XMLStarBasicContextFactory()); + OUString sScript(GetXMLToken(XML_SCRIPT)); + mpEventImportHelper->RegisterFactory(sScript, + new XMLScriptContextFactory()); + mpEventImportHelper->AddTranslationTable(aStandardEventTable); + + // register StarBasic event handler with capitalized spelling + OUString sStarBasicCap(RTL_CONSTASCII_USTRINGPARAM("StarBasic")); + mpEventImportHelper->RegisterFactory(sStarBasicCap, + new XMLStarBasicContextFactory()); + } +#endif + + return *mpEventImportHelper; +} + +void SvXMLImport::SetFontDecls( XMLFontStylesContext *pFontDecls ) +{ + mxFontDecls = pFontDecls; + GetTextImport()->SetFontDecls( pFontDecls ); +} + +void SvXMLImport::SetStyles( SvXMLStylesContext *pStyles ) +{ + mxStyles = pStyles; +} + +void SvXMLImport::SetAutoStyles( SvXMLStylesContext *pAutoStyles ) +{ + if (pAutoStyles && mxNumberStyles.is() && (mnImportFlags & IMPORT_CONTENT) ) + { + uno::Reference<xml::sax::XAttributeList> xAttrList; + uno::Sequence< ::rtl::OUString > aNames = mxNumberStyles->getElementNames(); + sal_uInt32 nCount(aNames.getLength()); + if (nCount) + { + const OUString* pNames = aNames.getConstArray(); + if ( pNames ) + { + SvXMLStyleContext* pContext; + uno::Any aAny; + sal_Int32 nKey(0); + for (sal_uInt32 i = 0; i < nCount; i++, pNames++) + { + aAny = mxNumberStyles->getByName(*pNames); + if (aAny >>= nKey) + { + pContext = new SvXMLNumFormatContext( *this, XML_NAMESPACE_NUMBER, + *pNames, xAttrList, nKey, *pAutoStyles ); + pAutoStyles->AddStyle(*pContext); + } + } + } + } + } + mxAutoStyles = pAutoStyles; + GetTextImport()->SetAutoStyles( pAutoStyles ); + GetShapeImport()->SetAutoStylesContext( pAutoStyles ); +#ifndef SVX_LIGHT + GetChartImport()->SetAutoStylesContext( pAutoStyles ); + GetFormImport()->setAutoStyleContext( pAutoStyles ); +#endif +} + +void SvXMLImport::SetMasterStyles( SvXMLStylesContext *pMasterStyles ) +{ + mxMasterStyles = pMasterStyles; +} + +XMLFontStylesContext *SvXMLImport::GetFontDecls() +{ + return (XMLFontStylesContext *)&mxFontDecls; +} + +SvXMLStylesContext *SvXMLImport::GetStyles() +{ + return (SvXMLStylesContext *)&mxStyles; +} + +SvXMLStylesContext *SvXMLImport::GetAutoStyles() +{ + return (SvXMLStylesContext *)&mxAutoStyles; +} + +SvXMLStylesContext *SvXMLImport::GetMasterStyles() +{ + return (SvXMLStylesContext *)&mxMasterStyles; +} + +const XMLFontStylesContext *SvXMLImport::GetFontDecls() const +{ + return (const XMLFontStylesContext *)&mxFontDecls; +} + +const SvXMLStylesContext *SvXMLImport::GetStyles() const +{ + return (const SvXMLStylesContext *)&mxStyles; +} + +const SvXMLStylesContext *SvXMLImport::GetAutoStyles() const +{ + return (const SvXMLStylesContext *)&mxAutoStyles; +} + +const SvXMLStylesContext *SvXMLImport::GetMasterStyles() const +{ + return (const SvXMLStylesContext *)&mxMasterStyles; +} + +OUString SvXMLImport::GetAbsoluteReference(const OUString& rValue) const +{ + if( rValue.getLength() == 0 || rValue[0] == '#' ) + return rValue; + + INetURLObject aAbsURL; + if( mpImpl->aBaseURL.GetNewAbsURL( rValue, &aAbsURL ) ) + return aAbsURL.GetMainURL( INetURLObject::DECODE_TO_IURI ); + else + return rValue; +} + +sal_Bool SvXMLImport::IsODFVersionConsistent( const ::rtl::OUString& aODFVersion ) +{ + // the check returns sal_False only if the storage version could be retrieved + sal_Bool bResult = sal_True; + + if ( aODFVersion.getLength() && aODFVersion.compareTo( ODFVER_012_TEXT ) >= 0 ) + { + // check the consistency only for the ODF1.2 and later ( according to content.xml ) + // manifest.xml might have no version, it should be checked here and the correct version should be set + try + { + uno::Reference< document::XStorageBasedDocument > xDoc( mxModel, uno::UNO_QUERY_THROW ); + uno::Reference< embed::XStorage > xStor = xDoc->getDocumentStorage(); + uno::Reference< beans::XPropertySet > xStorProps( xStor, uno::UNO_QUERY_THROW ); + + // the check should be done only for OASIS format + ::rtl::OUString aMediaType; + xStorProps->getPropertyValue( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "MediaType" ) ) ) >>= aMediaType; + if ( ::comphelper::OStorageHelper::GetXStorageFormat( xStor ) >= SOFFICE_FILEFORMAT_8 ) + { + sal_Bool bRepairPackage = sal_False; + try + { + xStorProps->getPropertyValue( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "RepairPackage" ) ) ) + >>= bRepairPackage; + } catch ( uno::Exception& ) + {} + + // check only if not in Repair mode + if ( !bRepairPackage ) + { + ::rtl::OUString aStorVersion; + xStorProps->getPropertyValue( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "Version" ) ) ) + >>= aStorVersion; + + // if the storage version is set in manifest.xml, it must be the same as in content.xml + // if not, set it explicitly to be used further ( it will work even for readonly storage ) + // This workaround is not nice, but I see no other way to handle it, since there are + // ODF1.2 documents without version in manifest.xml + if ( aStorVersion.getLength() ) + bResult = aODFVersion.equals( aStorVersion ); + else + xStorProps->setPropertyValue( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "Version" ) ), + uno::makeAny( aODFVersion ) ); + + if ( bResult ) + { + sal_Bool bInconsistent = sal_False; + xStorProps->getPropertyValue( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "IsInconsistent" ) ) ) + >>= bInconsistent; + bResult = !bInconsistent; + } + } + } + } + catch( uno::Exception& ) + {} + } + + return bResult; +} + +void SvXMLImport::_CreateNumberFormatsSupplier() +{ + DBG_ASSERT( !mxNumberFormatsSupplier.is(), + "number formats supplier already exists!" ); + if(mxModel.is()) + mxNumberFormatsSupplier = + uno::Reference< util::XNumberFormatsSupplier> (mxModel, uno::UNO_QUERY); +} + + +void SvXMLImport::_CreateDataStylesImport() +{ + DBG_ASSERT( mpNumImport == NULL, "data styles import already exists!" ); + uno::Reference<util::XNumberFormatsSupplier> xNum = + GetNumberFormatsSupplier(); + if ( xNum.is() ) + mpNumImport = new SvXMLNumFmtHelper(xNum, getServiceFactory()); +} + + +sal_Unicode SvXMLImport::ConvStarBatsCharToStarSymbol( sal_Unicode c ) +{ + sal_Unicode cNew = c; + if( !mpImpl->hBatsFontConv ) + { + OUString sStarBats( RTL_CONSTASCII_USTRINGPARAM( "StarBats" ) ); + mpImpl->hBatsFontConv = CreateFontToSubsFontConverter( sStarBats, + FONTTOSUBSFONT_IMPORT|FONTTOSUBSFONT_ONLYOLDSOSYMBOLFONTS ); + OSL_ENSURE( mpImpl->hBatsFontConv, "Got no symbol font converter" ); + } + if( mpImpl->hBatsFontConv ) + { + cNew = ConvertFontToSubsFontChar( mpImpl->hBatsFontConv, c ); + } + + return cNew; +} + +sal_Unicode SvXMLImport::ConvStarMathCharToStarSymbol( sal_Unicode c ) +{ + sal_Unicode cNew = c; + if( !mpImpl->hMathFontConv ) + { + OUString sStarMath( RTL_CONSTASCII_USTRINGPARAM( "StarMath" ) ); + mpImpl->hMathFontConv = CreateFontToSubsFontConverter( sStarMath, + FONTTOSUBSFONT_IMPORT|FONTTOSUBSFONT_ONLYOLDSOSYMBOLFONTS ); + OSL_ENSURE( mpImpl->hMathFontConv, "Got no symbol font converter" ); + } + if( mpImpl->hMathFontConv ) + { + cNew = ConvertFontToSubsFontChar( mpImpl->hMathFontConv, c ); + } + + return cNew; +} + + + +void SvXMLImport::SetError( + sal_Int32 nId, + const Sequence<OUString>& rMsgParams, + const OUString& rExceptionMessage, + const Reference<xml::sax::XLocator>& rLocator ) +{ + // maintain error flags + if ( ( nId & XMLERROR_FLAG_ERROR ) != 0 ) + mnErrorFlags |= ERROR_ERROR_OCCURED; + if ( ( nId & XMLERROR_FLAG_WARNING ) != 0 ) + mnErrorFlags |= ERROR_WARNING_OCCURED; + if ( ( nId & XMLERROR_FLAG_SEVERE ) != 0 ) + mnErrorFlags |= ERROR_DO_NOTHING; + + // create error list on demand + if ( mpXMLErrors == NULL ) + mpXMLErrors = new XMLErrors(); + + // save error information + // use document locator (if none supplied) + mpXMLErrors->AddRecord( nId, rMsgParams, rExceptionMessage, + rLocator.is() ? rLocator : mxLocator ); +} + +void SvXMLImport::SetError( + sal_Int32 nId, + const Sequence<OUString>& rMsgParams) +{ + OUString sEmpty; + SetError( nId, rMsgParams, sEmpty, NULL ); +} + +void SvXMLImport::SetError( + sal_Int32 nId) +{ + Sequence<OUString> aSeq(0); + SetError( nId, aSeq ); +} + +void SvXMLImport::SetError( + sal_Int32 nId, + const OUString& rMsg1) +{ + Sequence<OUString> aSeq(1); + OUString* pSeq = aSeq.getArray(); + pSeq[0] = rMsg1; + SetError( nId, aSeq ); +} + +void SvXMLImport::SetError( + sal_Int32 nId, + const OUString& rMsg1, + const OUString& rMsg2) +{ + Sequence<OUString> aSeq(2); + OUString* pSeq = aSeq.getArray(); + pSeq[0] = rMsg1; + pSeq[1] = rMsg2; + SetError( nId, aSeq ); +} + +void SvXMLImport::SetError( + sal_Int32 nId, + const OUString& rMsg1, + const OUString& rMsg2, + const OUString& rMsg3) +{ + Sequence<OUString> aSeq(3); + OUString* pSeq = aSeq.getArray(); + pSeq[0] = rMsg1; + pSeq[1] = rMsg2; + pSeq[2] = rMsg3; + SetError( nId, aSeq ); +} + +void SvXMLImport::SetError( + sal_Int32 nId, + const OUString& rMsg1, + const OUString& rMsg2, + const OUString& rMsg3, + const OUString& rMsg4) +{ + Sequence<OUString> aSeq(4); + OUString* pSeq = aSeq.getArray(); + pSeq[0] = rMsg1; + pSeq[1] = rMsg2; + pSeq[2] = rMsg3; + pSeq[3] = rMsg4; + SetError( nId, aSeq ); +} + +XMLErrors* SvXMLImport::GetErrors() +{ + return mpXMLErrors; +} + +void SvXMLImport::DisposingModel() +{ + if( mxFontDecls.Is() ) + ((SvXMLStylesContext *)&mxFontDecls)->Clear(); + if( mxStyles.Is() ) + ((SvXMLStylesContext *)&mxStyles)->Clear(); + if( mxAutoStyles.Is() ) + ((SvXMLStylesContext *)&mxAutoStyles)->Clear(); + if( mxMasterStyles.Is() ) + ((SvXMLStylesContext *)&mxMasterStyles)->Clear(); + + mxModel.set(0); + mxEventListener.set(NULL); +} + +::comphelper::UnoInterfaceToUniqueIdentifierMapper& SvXMLImport::getInterfaceToIdentifierMapper() +{ + return mpImpl->maInterfaceToIdentifierMapper; +} + +::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory > SvXMLImport::getServiceFactory() +{ + // #110680# + return mxServiceFactory; +} + +uno::Reference< uno::XComponentContext > +SvXMLImport::GetComponentContext() const +{ + return mpImpl->mxComponentContext; +} + +String SvXMLImport::GetBaseURL() const +{ + return mpImpl->aBaseURL.GetMainURL( INetURLObject::NO_DECODE ); +} + +String SvXMLImport::GetDocumentBase() const +{ + return mpImpl->aDocBase.GetMainURL( INetURLObject::NO_DECODE ); +} + +::rtl::OUString SvXMLImport::GetStreamName() const +{ + return mpImpl->mStreamName; +} + +// Convert drawing object positions from OOo file format to OASIS (#i28749#) +sal_Bool SvXMLImport::IsShapePositionInHoriL2R() const +{ + return mpImpl->mbShapePositionInHoriL2R; +} + +sal_Bool SvXMLImport::IsTextDocInOOoFileFormat() const +{ + return mpImpl->mbTextDocInOOoFileFormat; +} + +void SvXMLImport::initXForms() +{ + // dummy method; to be implemented by derived classes supporting XForms +} + +bool SvXMLImport::getBuildIds( sal_Int32& rUPD, sal_Int32& rBuild ) const +{ + bool bRet = false; + if( mxImportInfo.is() ) try + { + const OUString aPropName(RTL_CONSTASCII_USTRINGPARAM("BuildId")); + Reference< XPropertySetInfo > xSetInfo( mxImportInfo->getPropertySetInfo() ); + if( xSetInfo.is() && xSetInfo->hasPropertyByName( aPropName ) ) + { + OUString aBuildId; + mxImportInfo->getPropertyValue( aPropName ) >>= aBuildId; + if( aBuildId.getLength() ) + { + sal_Int32 nIndex = aBuildId.indexOf('$'); + if( nIndex != -1 ) + { + rUPD = aBuildId.copy( 0, nIndex ).toInt32(); + rBuild = aBuildId.copy( nIndex+1 ).toInt32(); + bRet = true; + } + } + } + } + catch( Exception& ) + { + } + return bRet; +} + +sal_uInt16 SvXMLImport::getGeneratorVersion() const +{ + sal_Int32 nUPD, nBuild; + + if( getBuildIds( nUPD, nBuild ) ) + { + if( nUPD == 680 ) + return OOo_2x; + + if( nUPD >= 640 && nUPD <= 645 ) + return OOo_1x; + } + + return OOo_Current; +} + +bool SvXMLImport::isGraphicLoadOnDemandSupported() const +{ + return mbIsGraphicLoadOnDemandSupported; +} + +::rtl::OUString SvXMLImport::GetODFVersion() const +{ + return mpImpl->aODFVersion; +} + +// xml:id for RDF metadata +void SvXMLImport::SetXmlId(uno::Reference<uno::XInterface> const & i_xIfc, + ::rtl::OUString const & i_rXmlId) +{ + if (i_rXmlId.getLength() > 0) { + try { + const uno::Reference<rdf::XMetadatable> xMeta(i_xIfc, + uno::UNO_QUERY); +//FIXME: not yet +// OSL_ENSURE(xMeta.is(), "xml:id: not XMetadatable"); + if (xMeta.is()) { + const beans::StringPair mdref( GetStreamName(), i_rXmlId ); + try { + xMeta->setMetadataReference(mdref); + } catch (lang::IllegalArgumentException &) { + // probably duplicate; ignore + OSL_TRACE("SvXMLImport::SetXmlId: cannot set xml:id"); + } + } + } catch (uno::Exception &) { + OSL_ENSURE(false, "SvXMLImport::SetXmlId: exception?"); + } + } +} + +SAL_DLLPRIVATE ::xmloff::RDFaImportHelper & +SvXMLImport::GetRDFaImportHelper() +{ + if (!mpImpl->mpRDFaHelper.get()) + { + mpImpl->mpRDFaHelper.reset( new ::xmloff::RDFaImportHelper(*this) ); + } + return *mpImpl->mpRDFaHelper; +} + +void +SvXMLImport::AddRDFa(uno::Reference<rdf::XMetadatable> i_xObject, + ::rtl::OUString const & i_rAbout, + ::rtl::OUString const & i_rProperty, + ::rtl::OUString const & i_rContent, + ::rtl::OUString const & i_rDatatype) +{ + // N.B.: we only get called if i_xObject had xhtml:about attribute + // (an empty attribute value is valid) + ::xmloff::RDFaImportHelper & rRDFaHelper( GetRDFaImportHelper() ); + rRDFaHelper.ParseAndAddRDFa(i_xObject, + i_rAbout, i_rProperty, i_rContent, i_rDatatype); +} + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ |