| /************************************************************** |
| * |
| * Licensed to the Apache Software Foundation (ASF) under one |
| * or more contributor license agreements. See the NOTICE file |
| * distributed with this work for additional information |
| * regarding copyright ownership. The ASF licenses this file |
| * to you under the Apache License, Version 2.0 (the |
| * "License"); you may not use this file except in compliance |
| * with the License. You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, |
| * software distributed under the License is distributed on an |
| * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
| * KIND, either express or implied. See the License for the |
| * specific language governing permissions and limitations |
| * under the License. |
| * |
| *************************************************************/ |
| |
| |
| |
| // MARKER(update_precomp.py): autogen include statement, do not remove |
| #include "precompiled_sc.hxx" |
| |
| |
| |
| // INCLUDE --------------------------------------------------------------- |
| |
| #include <rsc/rscsfx.hxx> |
| #include <sfx2/docfile.hxx> |
| #include <sfx2/objsh.hxx> |
| #include <tools/debug.hxx> |
| #include <vos/xception.hxx> |
| #include <comphelper/processfactory.hxx> |
| #include <unotools/streamwrap.hxx> |
| #include <svx/xmlgrhlp.hxx> |
| #include <svtools/sfxecode.hxx> |
| #include <sfx2/frame.hxx> |
| #include <svl/itemset.hxx> |
| #include <svl/stritem.hxx> |
| #include <sfx2/sfxsids.hrc> |
| #include <tools/urlobj.hxx> |
| #include <com/sun/star/container/XChild.hpp> |
| #include <com/sun/star/beans/XPropertySetInfo.hpp> |
| #include <com/sun/star/xml/sax/XErrorHandler.hpp> |
| #include <com/sun/star/xml/sax/XEntityResolver.hpp> |
| #include <com/sun/star/xml/sax/InputSource.hpp> |
| #include <com/sun/star/xml/sax/XDTDHandler.hpp> |
| #include <com/sun/star/xml/sax/XParser.hpp> |
| #include <com/sun/star/io/XActiveDataSource.hpp> |
| #include <com/sun/star/io/XActiveDataControl.hpp> |
| #include <com/sun/star/frame/XModel.hpp> |
| #include <com/sun/star/task/XStatusIndicatorFactory.hpp> |
| #include <com/sun/star/beans/PropertyAttribute.hpp> |
| #include <comphelper/extract.hxx> |
| #include <comphelper/propertysetinfo.hxx> |
| #include <comphelper/genericpropertyset.hxx> |
| #include <com/sun/star/container/XNameContainer.hpp> |
| #include <com/sun/star/lang/DisposedException.hpp> |
| #include <com/sun/star/packages/zip/ZipIOException.hpp> |
| #include <com/sun/star/embed/ElementModes.hpp> |
| #include <com/sun/star/script/vba/XVBACompatibility.hpp> |
| #include <com/sun/star/rdf/XDocumentMetadataAccess.hpp> |
| #include <com/sun/star/ucb/InteractiveAugmentedIOException.hpp> |
| |
| #include <sfx2/DocumentMetadataAccess.hxx> |
| #include <comphelper/componentcontext.hxx> |
| #include <comphelper/documentconstants.hxx> |
| #include <svx/xmleohlp.hxx> |
| #include <rtl/logfile.hxx> |
| #include <unotools/saveopt.hxx> |
| |
| #include "document.hxx" |
| #include "xmlwrap.hxx" |
| #include "xmlimprt.hxx" |
| #include "xmlexprt.hxx" |
| #include "global.hxx" |
| #include "globstr.hrc" |
| #include "scerrors.hxx" |
| #include "XMLExportSharedData.hxx" |
| #include "docuno.hxx" |
| #include "sheetdata.hxx" |
| #include "XMLCodeNameProvider.hxx" |
| |
| #define MAP_LEN(x) x, sizeof(x) - 1 |
| |
| using namespace com::sun::star; |
| using ::rtl::OUString; |
| |
| // ----------------------------------------------------------------------- |
| |
| ScXMLImportWrapper::ScXMLImportWrapper(ScDocument& rD, SfxMedium* pM, const uno::Reference < embed::XStorage >& xStor ) : |
| rDoc(rD), |
| pMedium(pM), |
| xStorage(xStor) |
| { |
| DBG_ASSERT( pMedium || xStorage.is(), "ScXMLImportWrapper: Medium or Storage must be set" ); |
| } |
| |
| //UNUSED2008-05 uno::Reference <task::XStatusIndicator> ScXMLImportWrapper::GetStatusIndicator( |
| //UNUSED2008-05 uno::Reference < frame::XModel> & rModel) |
| //UNUSED2008-05 { |
| //UNUSED2008-05 DBG_ERROR( "The status indicator from medium must be used!" ); |
| //UNUSED2008-05 |
| //UNUSED2008-05 uno::Reference<task::XStatusIndicator> xStatusIndicator; |
| //UNUSED2008-05 |
| //UNUSED2008-05 if (rModel.is()) |
| //UNUSED2008-05 { |
| //UNUSED2008-05 uno::Reference<frame::XController> xController( rModel->getCurrentController()); |
| //UNUSED2008-05 if ( xController.is()) |
| //UNUSED2008-05 { |
| //UNUSED2008-05 uno::Reference<task::XStatusIndicatorFactory> xFactory( xController->getFrame(), uno::UNO_QUERY ); |
| //UNUSED2008-05 if ( xFactory.is()) |
| //UNUSED2008-05 { |
| //UNUSED2008-05 try |
| //UNUSED2008-05 { |
| //UNUSED2008-05 xStatusIndicator.set(xFactory->createStatusIndicator()); |
| //UNUSED2008-05 } |
| //UNUSED2008-05 catch ( lang::DisposedException e ) |
| //UNUSED2008-05 { |
| //UNUSED2008-05 DBG_ERROR("Exception while trying to get a Status Indicator"); |
| //UNUSED2008-05 } |
| //UNUSED2008-05 } |
| //UNUSED2008-05 } |
| //UNUSED2008-05 } |
| //UNUSED2008-05 return xStatusIndicator; |
| //UNUSED2008-05 } |
| |
| uno::Reference <task::XStatusIndicator> ScXMLImportWrapper::GetStatusIndicator() |
| { |
| uno::Reference<task::XStatusIndicator> xStatusIndicator; |
| if (pMedium) |
| { |
| SfxItemSet* pSet = pMedium->GetItemSet(); |
| if (pSet) |
| { |
| const SfxUnoAnyItem* pItem = static_cast<const SfxUnoAnyItem*>(pSet->GetItem(SID_PROGRESS_STATUSBAR_CONTROL)); |
| if (pItem) |
| xStatusIndicator.set(pItem->GetValue(), uno::UNO_QUERY); |
| } |
| } |
| return xStatusIndicator; |
| } |
| |
| sal_uInt32 ScXMLImportWrapper::ImportFromComponent(uno::Reference<lang::XMultiServiceFactory>& xServiceFactory, |
| uno::Reference<frame::XModel>& xModel, uno::Reference<uno::XInterface>& xXMLParser, |
| xml::sax::InputSource& aParserInput, |
| const rtl::OUString& sComponentName, const rtl::OUString& sDocName, |
| const rtl::OUString& sOldDocName, uno::Sequence<uno::Any>& aArgs, |
| sal_Bool bMustBeSuccessfull) |
| { |
| uno::Reference < io::XStream > xDocStream; |
| if ( !xStorage.is() && pMedium ) |
| xStorage = pMedium->GetStorage(); |
| |
| // Get data source ... |
| |
| // uno::Reference< uno::XInterface > xPipe; |
| // uno::Reference< io::XActiveDataSource > xSource; |
| |
| sal_Bool bEncrypted = sal_False; |
| rtl::OUString sStream(sDocName); |
| if( xStorage.is() ) |
| { |
| try |
| { |
| uno::Reference < container::XNameAccess > xAccess( xStorage, uno::UNO_QUERY ); |
| if ( xAccess->hasByName(sDocName) && xStorage->isStreamElement( sDocName) ) |
| xDocStream = xStorage->openStreamElement( sDocName, embed::ElementModes::READ ); |
| else if (sOldDocName.getLength() && xAccess->hasByName(sOldDocName) && xStorage->isStreamElement( sOldDocName) ) |
| { |
| xDocStream = xStorage->openStreamElement( sOldDocName, embed::ElementModes::READ ); |
| sStream = sOldDocName; |
| } |
| else |
| return sal_False; |
| |
| aParserInput.aInputStream = xDocStream->getInputStream(); |
| uno::Reference < beans::XPropertySet > xSet( xDocStream, uno::UNO_QUERY ); |
| |
| uno::Any aAny = xSet->getPropertyValue( OUString( RTL_CONSTASCII_USTRINGPARAM("Encrypted") ) ); |
| aAny >>= bEncrypted; |
| } |
| catch( packages::WrongPasswordException& ) |
| { |
| return ERRCODE_SFX_WRONGPASSWORD; |
| } |
| catch( packages::zip::ZipIOException& ) |
| { |
| return ERRCODE_IO_BROKENPACKAGE; |
| } |
| catch( uno::Exception& ) |
| { |
| return SCERR_IMPORT_UNKNOWN; |
| } |
| } |
| // #99667#; no longer necessary |
| /* else if ( pMedium ) |
| { |
| // if there is a medium and if this medium has a load environment, |
| // we get an active data source from the medium. |
| pMedium->GetInStream()->Seek( 0 ); |
| xSource = pMedium->GetDataSource(); |
| DBG_ASSERT( xSource.is(), "got no data source from medium" ); |
| if( !xSource.is() ) |
| return sal_False; |
| |
| // get a pipe for connecting the data source to the parser |
| xPipe = xServiceFactory->createInstance( |
| OUString::createFromAscii("com.sun.star.io.Pipe") ); |
| DBG_ASSERT( xPipe.is(), |
| "XMLReader::Read: com.sun.star.io.Pipe service missing" ); |
| if( !xPipe.is() ) |
| return sal_False; |
| |
| // connect pipe's output stream to the data source |
| uno::Reference<io::XOutputStream> xPipeOutput( xPipe, uno::UNO_QUERY ); |
| xSource->setOutputStream( xPipeOutput ); |
| |
| aParserInput.aInputStream = |
| uno::Reference< io::XInputStream >( xPipe, uno::UNO_QUERY ); |
| }*/ |
| else |
| return SCERR_IMPORT_UNKNOWN; |
| |
| // set Base URL |
| uno::Reference< beans::XPropertySet > xInfoSet; |
| if( aArgs.getLength() > 0 ) |
| aArgs.getConstArray()[0] >>= xInfoSet; |
| DBG_ASSERT( xInfoSet.is(), "missing property set" ); |
| if( xInfoSet.is() ) |
| { |
| rtl::OUString sPropName( RTL_CONSTASCII_USTRINGPARAM("StreamName") ); |
| xInfoSet->setPropertyValue( sPropName, uno::makeAny( sStream ) ); |
| } |
| |
| sal_uInt32 nReturn(0); |
| rDoc.SetRangeOverflowType(0); // is modified by the importer if limits are exceeded |
| |
| uno::Reference<xml::sax::XDocumentHandler> xDocHandler( |
| xServiceFactory->createInstanceWithArguments( |
| sComponentName, aArgs ), |
| uno::UNO_QUERY ); |
| DBG_ASSERT( xDocHandler.is(), "can't get Calc importer" ); |
| uno::Reference<document::XImporter> xImporter( xDocHandler, uno::UNO_QUERY ); |
| uno::Reference<lang::XComponent> xComponent( xModel, uno::UNO_QUERY ); |
| if (xImporter.is()) |
| xImporter->setTargetDocument( xComponent ); |
| |
| // connect parser and filter |
| uno::Reference<xml::sax::XParser> xParser( xXMLParser, uno::UNO_QUERY ); |
| xParser->setDocumentHandler( xDocHandler ); |
| |
| // parse |
| /* if( xSource.is() ) |
| { |
| uno::Reference<io::XActiveDataControl> xSourceControl( xSource, uno::UNO_QUERY ); |
| if( xSourceControl.is() ) |
| xSourceControl->start(); |
| }*/ |
| |
| try |
| { |
| xParser->parseStream( aParserInput ); |
| } |
| catch( xml::sax::SAXParseException& r ) |
| { |
| // sax parser sends wrapped exceptions, |
| // try to find the original one |
| xml::sax::SAXException aSaxEx = *(xml::sax::SAXException*)(&r); |
| sal_Bool bTryChild = sal_True; |
| |
| while( bTryChild ) |
| { |
| xml::sax::SAXException aTmp; |
| if ( aSaxEx.WrappedException >>= aTmp ) |
| aSaxEx = aTmp; |
| else |
| bTryChild = sal_False; |
| } |
| |
| packages::zip::ZipIOException aBrokenPackage; |
| if ( aSaxEx.WrappedException >>= aBrokenPackage ) |
| return ERRCODE_IO_BROKENPACKAGE; |
| else if( bEncrypted ) |
| nReturn = ERRCODE_SFX_WRONGPASSWORD; |
| else |
| { |
| |
| #ifdef DBG_UTIL |
| ByteString aError( "SAX parse exception catched while importing:\n" ); |
| aError += ByteString( String( r.Message), RTL_TEXTENCODING_ASCII_US ); |
| DBG_ERROR( aError.GetBuffer() ); |
| #endif |
| |
| String sErr( String::CreateFromInt32( r.LineNumber )); |
| sErr += ','; |
| sErr += String::CreateFromInt32( r.ColumnNumber ); |
| |
| if( sDocName.getLength() ) |
| { |
| nReturn = *new TwoStringErrorInfo( |
| (bMustBeSuccessfull ? SCERR_IMPORT_FILE_ROWCOL |
| : SCWARN_IMPORT_FILE_ROWCOL), |
| sDocName, sErr, |
| ERRCODE_BUTTON_OK | ERRCODE_MSG_ERROR ); |
| } |
| else |
| { |
| DBG_ASSERT( bMustBeSuccessfull, "Warnings are not supported" ); |
| nReturn = *new StringErrorInfo( SCERR_IMPORT_FORMAT_ROWCOL, sErr, |
| ERRCODE_BUTTON_OK | ERRCODE_MSG_ERROR ); |
| } |
| } |
| } |
| catch( xml::sax::SAXException& r ) |
| { |
| packages::zip::ZipIOException aBrokenPackage; |
| if ( r.WrappedException >>= aBrokenPackage ) |
| return ERRCODE_IO_BROKENPACKAGE; |
| else if( bEncrypted ) |
| nReturn = ERRCODE_SFX_WRONGPASSWORD; |
| else |
| { |
| |
| #ifdef DBG_UTIL |
| ByteString aError( "SAX exception catched while importing:\n" ); |
| aError += ByteString( String( r.Message), RTL_TEXTENCODING_ASCII_US ); |
| DBG_ERROR( aError.GetBuffer() ); |
| #endif |
| (void)r; // avoid warning in product version |
| |
| nReturn = SCERR_IMPORT_FORMAT; |
| } |
| } |
| catch( packages::zip::ZipIOException& r ) |
| { |
| #ifdef DBG_UTIL |
| ByteString aError( "Zip exception catched while importing:\n" ); |
| aError += ByteString( String( r.Message), RTL_TEXTENCODING_ASCII_US ); |
| DBG_ERROR( aError.GetBuffer() ); |
| #endif |
| (void)r; // avoid warning in product version |
| |
| nReturn = ERRCODE_IO_BROKENPACKAGE; |
| } |
| catch( io::IOException& r ) |
| { |
| #ifdef DBG_UTIL |
| ByteString aError( "IO exception catched while importing:\n" ); |
| aError += ByteString( String( r.Message), RTL_TEXTENCODING_ASCII_US ); |
| DBG_ERROR( aError.GetBuffer() ); |
| #endif |
| (void)r; // avoid warning in product version |
| |
| nReturn = SCERR_IMPORT_OPEN; |
| } |
| catch( uno::Exception& r ) |
| { |
| #ifdef DBG_UTIL |
| ByteString aError( "uno exception catched while importing:\n" ); |
| aError += ByteString( String( r.Message), RTL_TEXTENCODING_ASCII_US ); |
| DBG_ERROR( aError.GetBuffer() ); |
| #endif |
| (void)r; // avoid warning in product version |
| |
| nReturn = SCERR_IMPORT_UNKNOWN; |
| } |
| |
| // #i31130# Can't use getImplementation here to get the ScXMLImport from xDocHandler, |
| // because when OOo 1.x files are loaded, xDocHandler is the OOo2OasisTransformer. |
| // So the overflow warning ErrorCode is now stored in the document. |
| // Export works differently, there getImplementation still works. |
| |
| if (rDoc.HasRangeOverflow() && !nReturn) |
| nReturn = rDoc.GetRangeOverflowType(); |
| |
| // free the component |
| xParser->setDocumentHandler( NULL ); |
| |
| // success! |
| return nReturn; |
| } |
| |
| sal_Bool ScXMLImportWrapper::Import(sal_Bool bStylesOnly, ErrCode& nError) |
| { |
| RTL_LOGFILE_CONTEXT_AUTHOR ( aLog, "sc", "sb99857", "ScXMLImportWrapper::Import" ); |
| |
| uno::Reference<lang::XMultiServiceFactory> xServiceFactory = |
| comphelper::getProcessServiceFactory(); |
| DBG_ASSERT( xServiceFactory.is(), "got no service manager" ); |
| if( !xServiceFactory.is() ) |
| return sal_False; |
| |
| xml::sax::InputSource aParserInput; |
| if (pMedium) |
| aParserInput.sSystemId = OUString(pMedium->GetName()); |
| |
| if ( !xStorage.is() && pMedium ) |
| xStorage = pMedium->GetStorage(); |
| |
| // get parser |
| uno::Reference<uno::XInterface> xXMLParser( |
| xServiceFactory->createInstance( |
| OUString(RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.xml.sax.Parser" )) )); |
| DBG_ASSERT( xXMLParser.is(), "com.sun.star.xml.sax.Parser service missing" ); |
| if( !xXMLParser.is() ) |
| return sal_False; |
| |
| // get filter |
| SfxObjectShell* pObjSh = rDoc.GetDocumentShell(); |
| if ( pObjSh ) |
| { |
| rtl::OUString sEmpty; |
| uno::Reference<frame::XModel> xModel(pObjSh->GetModel()); |
| |
| /** property map for export info set */ |
| comphelper::PropertyMapEntry aImportInfoMap[] = |
| { |
| { MAP_LEN( "ProgressRange" ), 0, &::getCppuType((sal_Int32*)0), ::com::sun::star::beans::PropertyAttribute::MAYBEVOID, 0}, |
| { MAP_LEN( "ProgressMax" ), 0, &::getCppuType((sal_Int32*)0), ::com::sun::star::beans::PropertyAttribute::MAYBEVOID, 0}, |
| { MAP_LEN( "ProgressCurrent" ), 0, &::getCppuType((sal_Int32*)0), ::com::sun::star::beans::PropertyAttribute::MAYBEVOID, 0}, |
| { MAP_LEN( "NumberStyles" ), 0, &::getCppuType((uno::Reference<container::XNameAccess> *)0), ::com::sun::star::beans::PropertyAttribute::MAYBEVOID, 0}, |
| { MAP_LEN( "PrivateData" ), 0, &::getCppuType( (uno::Reference<uno::XInterface> *)0 ), ::com::sun::star::beans::PropertyAttribute::MAYBEVOID, 0 }, |
| { MAP_LEN( "BaseURI" ), 0, &::getCppuType( (rtl::OUString *)0 ), ::com::sun::star::beans::PropertyAttribute::MAYBEVOID, 0 }, |
| { MAP_LEN( "StreamRelPath" ), 0, &::getCppuType( (rtl::OUString *)0 ), ::com::sun::star::beans::PropertyAttribute::MAYBEVOID, 0 }, |
| { MAP_LEN( "StreamName" ), 0, &::getCppuType( (rtl::OUString *)0 ), ::com::sun::star::beans::PropertyAttribute::MAYBEVOID, 0 }, |
| { MAP_LEN( "BuildId" ), 0, &::getCppuType( (OUString *)0 ), ::com::sun::star::beans::PropertyAttribute::MAYBEVOID, 0 }, |
| { MAP_LEN( "VBACompatibilityMode" ), 0, &::getBooleanCppuType(), ::com::sun::star::beans::PropertyAttribute::MAYBEVOID, 0 }, |
| { MAP_LEN( "ScriptConfiguration" ), 0, &::getCppuType((uno::Reference<container::XNameAccess> *)0), ::com::sun::star::beans::PropertyAttribute::MAYBEVOID, 0}, |
| { MAP_LEN( "OrganizerMode" ), 0, &::getBooleanCppuType(), |
| ::com::sun::star::beans::PropertyAttribute::MAYBEVOID, 0 }, |
| |
| { NULL, 0, 0, NULL, 0, 0 } |
| }; |
| uno::Reference< beans::XPropertySet > xInfoSet( comphelper::GenericPropertySet_CreateInstance( new comphelper::PropertySetInfo( aImportInfoMap ) ) ); |
| |
| // ---- get BuildId from parent container if available |
| |
| uno::Reference< container::XChild > xChild( xModel, uno::UNO_QUERY ); |
| if( xChild.is() ) |
| { |
| uno::Reference< beans::XPropertySet > xParentSet( xChild->getParent(), uno::UNO_QUERY ); |
| if( xParentSet.is() ) |
| { |
| uno::Reference< beans::XPropertySetInfo > xPropSetInfo( xParentSet->getPropertySetInfo() ); |
| OUString sPropName( RTL_CONSTASCII_USTRINGPARAM("BuildId" ) ); |
| if( xPropSetInfo.is() && xPropSetInfo->hasPropertyByName(sPropName) ) |
| { |
| xInfoSet->setPropertyValue( sPropName, xParentSet->getPropertyValue(sPropName) ); |
| } |
| } |
| } |
| |
| // ------------------------------------- |
| |
| uno::Reference<task::XStatusIndicator> xStatusIndicator(GetStatusIndicator()); |
| if (xStatusIndicator.is()) |
| { |
| sal_Int32 nProgressRange(1000000); |
| xStatusIndicator->start(rtl::OUString(ScGlobal::GetRscString(STR_LOAD_DOC)), nProgressRange); |
| xInfoSet->setPropertyValue(rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("ProgressRange")), uno::makeAny(nProgressRange)); |
| } |
| |
| // Set base URI |
| OSL_ENSURE( pMedium, "There is no medium to get MediaDescriptor from!\n" ); |
| ::rtl::OUString aBaseURL = pMedium ? pMedium->GetBaseURL() : ::rtl::OUString(); |
| rtl::OUString sPropName( RTL_CONSTASCII_USTRINGPARAM("BaseURI") ); |
| xInfoSet->setPropertyValue( sPropName, uno::makeAny( aBaseURL ) ); |
| |
| // TODO/LATER: do not do it for embedded links |
| OUString aName; |
| if( SFX_CREATE_MODE_EMBEDDED == pObjSh->GetCreateMode() ) |
| { |
| if ( pMedium && pMedium->GetItemSet() ) |
| { |
| const SfxStringItem* pDocHierarchItem = static_cast<const SfxStringItem*>( |
| pMedium->GetItemSet()->GetItem(SID_DOC_HIERARCHICALNAME) ); |
| if ( pDocHierarchItem ) |
| aName = pDocHierarchItem->GetValue(); |
| } |
| else |
| aName = ::rtl::OUString::createFromAscii( "dummyObjectName" ); |
| |
| if( aName.getLength() ) |
| { |
| sPropName = rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("StreamRelPath")); |
| xInfoSet->setPropertyValue( sPropName, uno::makeAny( aName ) ); |
| } |
| } |
| |
| if (bStylesOnly) |
| { |
| ::rtl::OUString const sOrganizerMode( |
| RTL_CONSTASCII_USTRINGPARAM("OrganizerMode")); |
| xInfoSet->setPropertyValue(sOrganizerMode, uno::makeAny(sal_True)); |
| } |
| |
| sal_Bool bOasis = ( SotStorage::GetVersion( xStorage ) > SOFFICE_FILEFORMAT_60 ); |
| |
| if (!bStylesOnly && bOasis) |
| { |
| // RDF metadata: ODF >= 1.2 |
| try |
| { |
| ::comphelper::ComponentContext aContext( xServiceFactory ); |
| const uno::Reference< rdf::XDocumentMetadataAccess > xDMA( |
| xModel, uno::UNO_QUERY_THROW ); |
| const uno::Reference< rdf::XURI > xBaseURI( |
| ::sfx2::createBaseURI( aContext.getUNOContext(), xStorage, aBaseURL, aName ) ); |
| const uno::Reference< task::XInteractionHandler > xHandler( |
| pObjSh->GetMedium()->GetInteractionHandler() ); |
| xDMA->loadMetadataFromStorage( xStorage, xBaseURI, xHandler ); |
| } |
| catch (lang::WrappedTargetException & e) |
| { |
| ucb::InteractiveAugmentedIOException iaioe; |
| if ( e.TargetException >>= iaioe ) |
| { |
| nError = SCERR_IMPORT_UNKNOWN; |
| } |
| else |
| { |
| nError = SCWARN_IMPORT_FEATURES_LOST; |
| } |
| } |
| catch (uno::Exception &) |
| { |
| nError = SCWARN_IMPORT_FEATURES_LOST; |
| } |
| } |
| |
| // #i103539#: always read meta.xml for generator |
| sal_uInt32 nMetaRetval(0); |
| uno::Sequence<uno::Any> aMetaArgs(1); |
| uno::Any* pMetaArgs = aMetaArgs.getArray(); |
| pMetaArgs[0] <<= xInfoSet; |
| |
| RTL_LOGFILE_CONTEXT_TRACE( aLog, "meta import start" ); |
| |
| nMetaRetval = ImportFromComponent( |
| xServiceFactory, xModel, xXMLParser, aParserInput, |
| bOasis ? rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("com.sun.star.comp.Calc.XMLOasisMetaImporter")) |
| : rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("com.sun.star.comp.Calc.XMLMetaImporter")), |
| rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("meta.xml")), |
| rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("Meta.xml")), aMetaArgs, |
| sal_False); |
| |
| RTL_LOGFILE_CONTEXT_TRACE( aLog, "meta import end" ); |
| |
| SvXMLGraphicHelper* pGraphicHelper = NULL; |
| uno::Reference< document::XGraphicObjectResolver > xGrfContainer; |
| |
| uno::Reference< document::XEmbeddedObjectResolver > xObjectResolver; |
| SvXMLEmbeddedObjectHelper *pObjectHelper = NULL; |
| |
| if( xStorage.is() ) |
| { |
| pGraphicHelper = SvXMLGraphicHelper::Create( xStorage, GRAPHICHELPER_MODE_READ ); |
| xGrfContainer = pGraphicHelper; |
| |
| if( pObjSh ) |
| { |
| pObjectHelper = SvXMLEmbeddedObjectHelper::Create(xStorage, *pObjSh, EMBEDDEDOBJECTHELPER_MODE_READ, sal_False ); |
| xObjectResolver = pObjectHelper; |
| } |
| } |
| uno::Sequence<uno::Any> aStylesArgs(4); |
| uno::Any* pStylesArgs = aStylesArgs.getArray(); |
| pStylesArgs[0] <<= xInfoSet; |
| pStylesArgs[1] <<= xGrfContainer; |
| pStylesArgs[2] <<= xStatusIndicator; |
| pStylesArgs[3] <<= xObjectResolver; |
| |
| sal_uInt32 nSettingsRetval(0); |
| if (!bStylesOnly) |
| { |
| // Settings must be loaded first because of the printer setting, |
| // which is needed in the page styles (paper tray). |
| |
| uno::Sequence<uno::Any> aSettingsArgs(1); |
| uno::Any* pSettingsArgs = aSettingsArgs.getArray(); |
| pSettingsArgs[0] <<= xInfoSet; |
| |
| RTL_LOGFILE_CONTEXT_TRACE( aLog, "settings import start" ); |
| |
| nSettingsRetval = ImportFromComponent(xServiceFactory, xModel, xXMLParser, aParserInput, |
| bOasis ? rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("com.sun.star.comp.Calc.XMLOasisSettingsImporter")) |
| : rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("com.sun.star.comp.Calc.XMLSettingsImporter")), |
| rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("settings.xml")), |
| sEmpty, aSettingsArgs, sal_False); |
| |
| RTL_LOGFILE_CONTEXT_TRACE( aLog, "settings import end" ); |
| } |
| |
| sal_uInt32 nStylesRetval(0); |
| { |
| RTL_LOGFILE_CONTEXT_TRACE( aLog, "styles import start" ); |
| |
| nStylesRetval = ImportFromComponent(xServiceFactory, xModel, xXMLParser, aParserInput, |
| bOasis ? rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("com.sun.star.comp.Calc.XMLOasisStylesImporter")) |
| : rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("com.sun.star.comp.Calc.XMLStylesImporter")), |
| rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("styles.xml")), |
| sEmpty, aStylesArgs, sal_True); |
| |
| RTL_LOGFILE_CONTEXT_TRACE( aLog, "styles import end" ); |
| } |
| |
| sal_uInt32 nDocRetval(0); |
| if (!bStylesOnly) |
| { |
| uno::Sequence<uno::Any> aDocArgs(4); |
| uno::Any* pDocArgs = aDocArgs.getArray(); |
| pDocArgs[0] <<= xInfoSet; |
| pDocArgs[1] <<= xGrfContainer; |
| pDocArgs[2] <<= xStatusIndicator; |
| pDocArgs[3] <<= xObjectResolver; |
| |
| RTL_LOGFILE_CONTEXT_TRACE( aLog, "content import start" ); |
| |
| nDocRetval = ImportFromComponent(xServiceFactory, xModel, xXMLParser, aParserInput, |
| bOasis ? rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("com.sun.star.comp.Calc.XMLOasisContentImporter")) |
| : rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("com.sun.star.comp.Calc.XMLContentImporter")), |
| rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("content.xml")), |
| rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("Content.xml")), aDocArgs, |
| sal_True); |
| |
| RTL_LOGFILE_CONTEXT_TRACE( aLog, "content import end" ); |
| } |
| if( pGraphicHelper ) |
| SvXMLGraphicHelper::Destroy( pGraphicHelper ); |
| |
| if( pObjectHelper ) |
| SvXMLEmbeddedObjectHelper::Destroy( pObjectHelper ); |
| |
| if (xStatusIndicator.is()) |
| xStatusIndicator->end(); |
| |
| sal_Bool bRet(sal_False); |
| if (bStylesOnly) |
| { |
| if (nStylesRetval) |
| nError = nStylesRetval; |
| else |
| bRet = sal_True; |
| } |
| else |
| { |
| if (nDocRetval) |
| { |
| nError = nDocRetval; |
| if (nDocRetval == SCWARN_IMPORT_RANGE_OVERFLOW || |
| nDocRetval == SCWARN_IMPORT_ROW_OVERFLOW || |
| nDocRetval == SCWARN_IMPORT_COLUMN_OVERFLOW || |
| nDocRetval == SCWARN_IMPORT_SHEET_OVERFLOW) |
| bRet = sal_True; |
| } |
| else if (nStylesRetval) |
| nError = nStylesRetval; |
| else if (nMetaRetval) |
| nError = nMetaRetval; |
| else if (nSettingsRetval) |
| nError = nSettingsRetval; |
| else |
| bRet = sal_True; |
| } |
| |
| // set BuildId on XModel for later OLE object loading |
| if( xInfoSet.is() ) |
| { |
| uno::Reference< beans::XPropertySet > xModelSet( xModel, uno::UNO_QUERY ); |
| if( xModelSet.is() ) |
| { |
| uno::Reference< beans::XPropertySetInfo > xModelSetInfo( xModelSet->getPropertySetInfo() ); |
| OUString sBuildPropName( RTL_CONSTASCII_USTRINGPARAM("BuildId" ) ); |
| if( xModelSetInfo.is() && xModelSetInfo->hasPropertyByName(sBuildPropName) ) |
| { |
| xModelSet->setPropertyValue( sBuildPropName, xInfoSet->getPropertyValue(sBuildPropName) ); |
| } |
| } |
| |
| // Set Code Names |
| uno::Any aAny = xInfoSet->getPropertyValue(OUString(RTL_CONSTASCII_USTRINGPARAM("ScriptConfiguration") )); |
| uno::Reference <container::XNameAccess> xCodeNameAccess; |
| if( aAny >>= xCodeNameAccess ) |
| XMLCodeNameProvider::set( xCodeNameAccess, &rDoc ); |
| |
| // VBA compatibility |
| bool bVBACompat = false; |
| if ( (xInfoSet->getPropertyValue(OUString(RTL_CONSTASCII_USTRINGPARAM("VBACompatibilityMode"))) >>= bVBACompat) && bVBACompat ) |
| { |
| /* Set library container to VBA compatibility mode, this |
| forces loading the Basic project, which in turn creates the |
| VBA Globals object and does all related initialization. */ |
| if ( xModelSet.is() ) try |
| { |
| uno::Reference< script::vba::XVBACompatibility > xVBACompat( xModelSet->getPropertyValue( |
| OUString( RTL_CONSTASCII_USTRINGPARAM( "BasicLibraries" ) ) ), uno::UNO_QUERY_THROW ); |
| xVBACompat->setVBACompatibilityMode( sal_True ); |
| } |
| catch( uno::Exception& ) |
| { |
| } |
| } |
| } |
| |
| // Don't test bStylesRetval and bMetaRetval, because it could be an older file which not contain such streams |
| return bRet;//!bStylesOnly ? bDocRetval : bStylesRetval; |
| } |
| return sal_False; |
| } |
| |
| bool lcl_HasValidStream(ScDocument& rDoc) |
| { |
| SfxObjectShell* pObjSh = rDoc.GetDocumentShell(); |
| if ( pObjSh->IsDocShared() ) |
| return false; // never copy stream from shared file |
| |
| // don't read remote file again |
| // (could instead re-use medium directly in that case) |
| SfxMedium* pSrcMed = rDoc.GetDocumentShell()->GetMedium(); |
| if ( !pSrcMed || pSrcMed->IsRemote() ) |
| return false; |
| |
| SCTAB nTabCount = rDoc.GetTableCount(); |
| for (SCTAB nTab=0; nTab<nTabCount; ++nTab) |
| if (rDoc.IsStreamValid(nTab)) |
| return true; |
| return false; |
| } |
| |
| sal_Bool ScXMLImportWrapper::ExportToComponent(uno::Reference<lang::XMultiServiceFactory>& xServiceFactory, |
| uno::Reference<frame::XModel>& xModel, uno::Reference<uno::XInterface>& xWriter, |
| uno::Sequence<beans::PropertyValue>& aDescriptor, const rtl::OUString& sName, |
| const rtl::OUString& sMediaType, const rtl::OUString& sComponentName, |
| const sal_Bool bPlainText, uno::Sequence<uno::Any>& aArgs, ScMySharedData*& pSharedData) |
| { |
| sal_Bool bRet(sal_False); |
| uno::Reference<io::XOutputStream> xOut; |
| uno::Reference<io::XStream> xStream; |
| |
| if ( !xStorage.is() && pMedium ) |
| xStorage = pMedium->GetOutputStorage(); |
| |
| if( xStorage.is() ) |
| { |
| // #96807#; trunc stream before use, because it could be an existing stream |
| // and the new content could be shorter than the old content. In this case |
| // would not all be over written by the new content and the xml file |
| // would not be valid. |
| xStream = xStorage->openStreamElement( sName, embed::ElementModes::READWRITE | embed::ElementModes::TRUNCATE ); |
| uno::Reference < beans::XPropertySet > xSet( xStream, uno::UNO_QUERY ); |
| if (xSet.is()) |
| { |
| xSet->setPropertyValue(rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("MediaType")), uno::makeAny(sMediaType)); |
| OUString aUseCommonPassPropName( RTL_CONSTASCII_USTRINGPARAM("UseCommonStoragePasswordEncryption") ); |
| if (bPlainText) |
| xSet->setPropertyValue(rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("Compressed")), uno::makeAny(sal_False)); |
| |
| // even plain stream should be encrypted in encrypted documents |
| xSet->setPropertyValue( aUseCommonPassPropName, uno::makeAny(sal_True) ); |
| } |
| |
| xOut = xStream->getOutputStream(); |
| } |
| // #99667#; no longer necessary |
| /* else if ( pMedium ) |
| { |
| xOut = pMedium->GetDataSink(); |
| }*/ |
| |
| // set Base URL |
| uno::Reference< beans::XPropertySet > xInfoSet; |
| if( aArgs.getLength() > 0 ) |
| aArgs.getConstArray()[0] >>= xInfoSet; |
| DBG_ASSERT( xInfoSet.is(), "missing property set" ); |
| if( xInfoSet.is() ) |
| { |
| rtl::OUString sPropName( RTL_CONSTASCII_USTRINGPARAM("StreamName") ); |
| xInfoSet->setPropertyValue( sPropName, uno::makeAny( sName ) ); |
| } |
| |
| uno::Reference<io::XActiveDataSource> xSrc( xWriter, uno::UNO_QUERY ); |
| xSrc->setOutputStream( xOut ); |
| |
| uno::Reference<document::XFilter> xFilter( |
| xServiceFactory->createInstanceWithArguments( sComponentName , aArgs ), |
| uno::UNO_QUERY ); |
| DBG_ASSERT( xFilter.is(), "can't get exporter" ); |
| uno::Reference<document::XExporter> xExporter( xFilter, uno::UNO_QUERY ); |
| uno::Reference<lang::XComponent> xComponent( xModel, uno::UNO_QUERY ); |
| if (xExporter.is()) |
| xExporter->setSourceDocument( xComponent ); |
| |
| if ( xFilter.is() ) |
| { |
| ScXMLExport* pExport = static_cast<ScXMLExport*>(SvXMLExport::getImplementation(xFilter)); |
| pExport->SetSharedData(pSharedData); |
| |
| // if there are sheets to copy, get the source stream |
| if ( sName.equalsAscii("content.xml") && lcl_HasValidStream(rDoc) && |
| ( pExport->getExportFlags() & EXPORT_OASIS ) ) |
| { |
| // old stream is still in this file's storage - open read-only |
| |
| // #i106854# use the document's storage directly, without a temporary SfxMedium |
| uno::Reference<embed::XStorage> xTmpStorage = rDoc.GetDocumentShell()->GetStorage(); |
| uno::Reference<io::XStream> xSrcStream; |
| uno::Reference<io::XInputStream> xSrcInput; |
| |
| // #i108978# If an embedded object is saved and no events are notified, don't use the stream |
| // because without the ...DONE events, stream positions aren't updated. |
| ScSheetSaveData* pSheetData = ScModelObj::getImplementation(xModel)->GetSheetSaveData(); |
| if (pSheetData && pSheetData->IsInSupportedSave()) |
| { |
| try |
| { |
| if (xTmpStorage.is()) |
| xSrcStream = xTmpStorage->openStreamElement( sName, embed::ElementModes::READ ); |
| if (xSrcStream.is()) |
| xSrcInput = xSrcStream->getInputStream(); |
| } |
| catch (uno::Exception&) |
| { |
| // stream not available (for example, password protected) - save normally (xSrcInput is null) |
| } |
| } |
| |
| pExport->SetSourceStream( xSrcInput ); |
| bRet = xFilter->filter( aDescriptor ); |
| pExport->SetSourceStream( uno::Reference<io::XInputStream>() ); |
| |
| // If there was an error, reset all stream flags, so the next save attempt will use normal saving. |
| // #i110692# For embedded objects, the stream may be unavailable for one save operation (m_pAntiImpl) |
| // and become available again later. But after saving normally once, the stream positions aren't |
| // valid anymore, so the flags also have to be reset if the stream wasn't available. |
| if ( !bRet || !xSrcInput.is() ) |
| { |
| SCTAB nTabCount = rDoc.GetTableCount(); |
| for (SCTAB nTab=0; nTab<nTabCount; nTab++) |
| if (rDoc.IsStreamValid(nTab)) |
| rDoc.SetStreamValid(nTab, sal_False); |
| } |
| } |
| else |
| bRet = xFilter->filter( aDescriptor ); |
| |
| pSharedData = pExport->GetSharedData(); |
| |
| //stream is closed by SAX parser |
| //if (xOut.is()) |
| // xOut->closeOutput(); |
| } |
| return bRet; |
| } |
| |
| sal_Bool ScXMLImportWrapper::Export(sal_Bool bStylesOnly) |
| { |
| RTL_LOGFILE_CONTEXT_AUTHOR ( aLog, "sc", "sb99857", "ScXMLImportWrapper::Export" ); |
| |
| uno::Reference<lang::XMultiServiceFactory> xServiceFactory(comphelper::getProcessServiceFactory()); |
| DBG_ASSERT( xServiceFactory.is(), "got no service manager" ); |
| if( !xServiceFactory.is() ) |
| return sal_False; |
| |
| uno::Reference<uno::XInterface> xWriter(xServiceFactory->createInstance( |
| OUString(RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.xml.sax.Writer" )) )); |
| DBG_ASSERT( xWriter.is(), "com.sun.star.xml.sax.Writer service missing" ); |
| if(!xWriter.is()) |
| return sal_False; |
| |
| if ( !xStorage.is() && pMedium ) |
| xStorage = pMedium->GetOutputStorage(); |
| |
| uno::Reference<xml::sax::XDocumentHandler> xHandler( xWriter, uno::UNO_QUERY ); |
| |
| OUString sFileName; |
| OUString sTextMediaType(RTL_CONSTASCII_USTRINGPARAM("text/xml")); |
| if (pMedium) |
| sFileName = pMedium->GetName(); |
| SfxObjectShell* pObjSh = rDoc.GetDocumentShell(); |
| uno::Sequence<beans::PropertyValue> aDescriptor(1); |
| beans::PropertyValue* pProps = aDescriptor.getArray(); |
| pProps[0].Name = OUString( RTL_CONSTASCII_USTRINGPARAM( "FileName" ) ); |
| pProps[0].Value <<= sFileName; |
| |
| /** property map for export info set */ |
| comphelper::PropertyMapEntry aExportInfoMap[] = |
| { |
| { MAP_LEN( "ProgressRange" ), 0, &::getCppuType((sal_Int32*)0), ::com::sun::star::beans::PropertyAttribute::MAYBEVOID, 0}, |
| { MAP_LEN( "ProgressMax" ), 0, &::getCppuType((sal_Int32*)0), ::com::sun::star::beans::PropertyAttribute::MAYBEVOID, 0}, |
| { MAP_LEN( "ProgressCurrent" ), 0, &::getCppuType((sal_Int32*)0), ::com::sun::star::beans::PropertyAttribute::MAYBEVOID, 0}, |
| { MAP_LEN( "WrittenNumberStyles" ), 0, &::getCppuType((uno::Sequence<sal_Int32>*)0), ::com::sun::star::beans::PropertyAttribute::MAYBEVOID, 0}, |
| { MAP_LEN( "UsePrettyPrinting" ), 0, &::getCppuType((sal_Bool*)0), ::com::sun::star::beans::PropertyAttribute::MAYBEVOID, 0}, |
| { MAP_LEN( "BaseURI" ), 0, &::getCppuType( (rtl::OUString *)0 ), ::com::sun::star::beans::PropertyAttribute::MAYBEVOID, 0 }, |
| { MAP_LEN( "StreamRelPath" ), 0, &::getCppuType( (rtl::OUString *)0 ), ::com::sun::star::beans::PropertyAttribute::MAYBEVOID, 0 }, |
| { MAP_LEN( "StreamName" ), 0, &::getCppuType( (rtl::OUString *)0 ), ::com::sun::star::beans::PropertyAttribute::MAYBEVOID, 0 }, |
| { MAP_LEN( "StyleNames" ), 0, &::getCppuType( (uno::Sequence<rtl::OUString>*)0 ), ::com::sun::star::beans::PropertyAttribute::MAYBEVOID, 0 }, |
| { MAP_LEN( "StyleFamilies" ), 0, &::getCppuType( (uno::Sequence<sal_Int32>*)0 ), ::com::sun::star::beans::PropertyAttribute::MAYBEVOID, 0 }, |
| { MAP_LEN( "TargetStorage" ), 0, &embed::XStorage::static_type(), ::com::sun::star::beans::PropertyAttribute::MAYBEVOID, 0 }, |
| { NULL, 0, 0, NULL, 0, 0 } |
| }; |
| uno::Reference< beans::XPropertySet > xInfoSet( comphelper::GenericPropertySet_CreateInstance( new comphelper::PropertySetInfo( aExportInfoMap ) ) ); |
| |
| if ( pObjSh && xStorage.is() ) |
| { |
| pObjSh->UpdateDocInfoForSave(); // update information |
| |
| uno::Reference<frame::XModel> xModel(pObjSh->GetModel()); |
| uno::Reference<task::XStatusIndicator> xStatusIndicator(GetStatusIndicator()); |
| sal_Int32 nProgressRange(1000000); |
| if(xStatusIndicator.is()) |
| xStatusIndicator->start(rtl::OUString(ScGlobal::GetRscString(STR_SAVE_DOC)), nProgressRange); |
| xInfoSet->setPropertyValue(rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("ProgressRange")), uno::makeAny(nProgressRange)); |
| |
| SvtSaveOptions aSaveOpt; |
| sal_Bool bUsePrettyPrinting(aSaveOpt.IsPrettyPrinting()); |
| xInfoSet->setPropertyValue(rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("UsePrettyPrinting")), uno::makeAny(bUsePrettyPrinting)); |
| |
| const OUString sTargetStorage( RTL_CONSTASCII_USTRINGPARAM("TargetStorage") ); |
| xInfoSet->setPropertyValue( sTargetStorage, uno::Any( xStorage ) ); |
| |
| OSL_ENSURE( pMedium, "There is no medium to get MediaDescriptor from!\n" ); |
| ::rtl::OUString aBaseURL = pMedium ? pMedium->GetBaseURL( true ) : ::rtl::OUString(); |
| rtl::OUString sPropName( RTL_CONSTASCII_USTRINGPARAM("BaseURI") ); |
| xInfoSet->setPropertyValue( sPropName, uno::makeAny( aBaseURL ) ); |
| |
| // TODO/LATER: do not do it for embedded links |
| if( SFX_CREATE_MODE_EMBEDDED == pObjSh->GetCreateMode() ) |
| { |
| OUString aName = ::rtl::OUString::createFromAscii( "dummyObjectName" ); |
| if ( pMedium && pMedium->GetItemSet() ) |
| { |
| const SfxStringItem* pDocHierarchItem = static_cast<const SfxStringItem*>( |
| pMedium->GetItemSet()->GetItem(SID_DOC_HIERARCHICALNAME) ); |
| if ( pDocHierarchItem ) |
| aName = pDocHierarchItem->GetValue(); |
| } |
| |
| if( aName.getLength() ) |
| { |
| sPropName = rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("StreamRelPath")); |
| xInfoSet->setPropertyValue( sPropName, uno::makeAny( aName ) ); |
| } |
| } |
| |
| sal_Bool bMetaRet(pObjSh->GetCreateMode() == SFX_CREATE_MODE_EMBEDDED); |
| sal_Bool bStylesRet (sal_False); |
| sal_Bool bDocRet(sal_False); |
| sal_Bool bSettingsRet(sal_False); |
| ScMySharedData* pSharedData = NULL; |
| |
| sal_Bool bOasis = ( SotStorage::GetVersion( xStorage ) > SOFFICE_FILEFORMAT_60 ); |
| |
| // RDF metadata: ODF >= 1.2 |
| if ( !bStylesOnly && bOasis ) |
| { |
| const uno::Reference< beans::XPropertySet > xPropSet( xStorage, uno::UNO_QUERY_THROW ); |
| try |
| { |
| ::rtl::OUString aVersion; |
| if (( xPropSet->getPropertyValue( |
| rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("Version"))) >>= aVersion ) |
| && !aVersion.equals(ODFVER_010_TEXT) |
| && !aVersion.equals(ODFVER_011_TEXT) ) |
| { |
| const uno::Reference< rdf::XDocumentMetadataAccess > xDMA( |
| xModel, uno::UNO_QUERY_THROW ); |
| xDMA->storeMetadataToStorage( xStorage ); |
| } |
| } |
| catch (beans::UnknownPropertyException &) |
| { |
| } |
| catch (uno::Exception &) |
| { |
| } |
| } |
| |
| // meta export |
| if (!bStylesOnly && !bMetaRet) |
| { |
| uno::Sequence<uno::Any> aMetaArgs(3); |
| uno::Any* pMetaArgs = aMetaArgs.getArray(); |
| pMetaArgs[0] <<= xInfoSet; |
| pMetaArgs[1] <<= xHandler; |
| pMetaArgs[2] <<= xStatusIndicator; |
| |
| RTL_LOGFILE_CONTEXT_TRACE( aLog, "meta export start" ); |
| |
| bMetaRet = ExportToComponent(xServiceFactory, xModel, xWriter, aDescriptor, |
| rtl::OUString (RTL_CONSTASCII_USTRINGPARAM("meta.xml")), |
| sTextMediaType, |
| bOasis ? rtl::OUString (RTL_CONSTASCII_USTRINGPARAM("com.sun.star.comp.Calc.XMLOasisMetaExporter")) |
| : rtl::OUString (RTL_CONSTASCII_USTRINGPARAM("com.sun.star.comp.Calc.XMLMetaExporter")), |
| sal_True, aMetaArgs, pSharedData); |
| |
| RTL_LOGFILE_CONTEXT_TRACE( aLog, "meta export end" ); |
| } |
| |
| uno::Reference< document::XEmbeddedObjectResolver > xObjectResolver; |
| SvXMLEmbeddedObjectHelper *pObjectHelper = 0; |
| |
| uno::Reference< document::XGraphicObjectResolver > xGrfContainer; |
| SvXMLGraphicHelper* pGraphicHelper = 0; |
| |
| if( xStorage.is() ) |
| { |
| pGraphicHelper = SvXMLGraphicHelper::Create( xStorage, GRAPHICHELPER_MODE_WRITE, sal_False ); |
| xGrfContainer = pGraphicHelper; |
| } |
| |
| if( pObjSh ) |
| { |
| pObjectHelper = SvXMLEmbeddedObjectHelper::Create( xStorage, *pObjSh, EMBEDDEDOBJECTHELPER_MODE_WRITE, sal_False ); |
| xObjectResolver = pObjectHelper; |
| } |
| |
| // styles export |
| |
| { |
| uno::Sequence<uno::Any> aStylesArgs(5); |
| uno::Any* pStylesArgs = aStylesArgs.getArray(); |
| pStylesArgs[0] <<= xInfoSet; |
| pStylesArgs[1] <<= xGrfContainer; |
| pStylesArgs[2] <<= xStatusIndicator; |
| pStylesArgs[3] <<= xHandler; |
| pStylesArgs[4] <<= xObjectResolver; |
| |
| RTL_LOGFILE_CONTEXT_TRACE( aLog, "styles export start" ); |
| |
| bStylesRet = ExportToComponent(xServiceFactory, xModel, xWriter, aDescriptor, |
| rtl::OUString (RTL_CONSTASCII_USTRINGPARAM("styles.xml")), |
| sTextMediaType, |
| bOasis ? rtl::OUString (RTL_CONSTASCII_USTRINGPARAM("com.sun.star.comp.Calc.XMLOasisStylesExporter")) |
| : rtl::OUString (RTL_CONSTASCII_USTRINGPARAM("com.sun.star.comp.Calc.XMLStylesExporter")), |
| sal_False, aStylesArgs, pSharedData); |
| |
| RTL_LOGFILE_CONTEXT_TRACE( aLog, "styles export end" ); |
| } |
| |
| // content export |
| |
| if (!bStylesOnly) |
| { |
| uno::Sequence<uno::Any> aDocArgs(5); |
| uno::Any* pDocArgs = aDocArgs.getArray(); |
| pDocArgs[0] <<= xInfoSet; |
| pDocArgs[1] <<= xGrfContainer; |
| pDocArgs[2] <<= xStatusIndicator; |
| pDocArgs[3] <<= xHandler; |
| pDocArgs[4] <<= xObjectResolver; |
| |
| RTL_LOGFILE_CONTEXT_TRACE( aLog, "content export start" ); |
| |
| bDocRet = ExportToComponent(xServiceFactory, xModel, xWriter, aDescriptor, |
| rtl::OUString (RTL_CONSTASCII_USTRINGPARAM("content.xml")), |
| sTextMediaType, |
| bOasis ? rtl::OUString (RTL_CONSTASCII_USTRINGPARAM("com.sun.star.comp.Calc.XMLOasisContentExporter")) |
| : rtl::OUString (RTL_CONSTASCII_USTRINGPARAM("com.sun.star.comp.Calc.XMLContentExporter")), |
| sal_False, aDocArgs, pSharedData); |
| |
| RTL_LOGFILE_CONTEXT_TRACE( aLog, "content export end" ); |
| } |
| |
| if( pGraphicHelper ) |
| SvXMLGraphicHelper::Destroy( pGraphicHelper ); |
| |
| if( pObjectHelper ) |
| SvXMLEmbeddedObjectHelper::Destroy( pObjectHelper ); |
| |
| // settings export |
| |
| if (!bStylesOnly) |
| { |
| uno::Sequence<uno::Any> aSettingsArgs(3); |
| uno::Any* pSettingsArgs = aSettingsArgs.getArray(); |
| pSettingsArgs[0] <<= xInfoSet; |
| pSettingsArgs[1] <<= xHandler; |
| pSettingsArgs[2] <<= xStatusIndicator; |
| |
| RTL_LOGFILE_CONTEXT_TRACE( aLog, "settings export start" ); |
| |
| bSettingsRet = ExportToComponent(xServiceFactory, xModel, xWriter, aDescriptor, |
| rtl::OUString (RTL_CONSTASCII_USTRINGPARAM("settings.xml")), |
| sTextMediaType, |
| bOasis ? rtl::OUString (RTL_CONSTASCII_USTRINGPARAM("com.sun.star.comp.Calc.XMLOasisSettingsExporter")) |
| : rtl::OUString (RTL_CONSTASCII_USTRINGPARAM("com.sun.star.comp.Calc.XMLSettingsExporter")), |
| sal_False, aSettingsArgs, pSharedData); |
| |
| RTL_LOGFILE_CONTEXT_TRACE( aLog, "settings export end" ); |
| } |
| |
| if (pSharedData) |
| delete pSharedData; |
| |
| if (xStatusIndicator.is()) |
| xStatusIndicator->end(); |
| return bStylesRet && ((!bStylesOnly && bDocRet && bMetaRet && bSettingsRet) || bStylesOnly); |
| } |
| |
| // later: give string descriptor as parameter for doc type |
| |
| return sal_False; |
| } |
| |
| |
| |