diff options
author | Kurt Zenker <kz@openoffice.org> | 2004-10-04 19:12:18 +0000 |
---|---|---|
committer | Kurt Zenker <kz@openoffice.org> | 2004-10-04 19:12:18 +0000 |
commit | 5936f53d3e18a7ee6a834ce442a69aa247c6461e (patch) | |
tree | cc9d9fd9b4df69d38cd609de0542bfa77bef3980 /sc/source/filter/xml/xmlwrap.cxx | |
parent | 8174aaf9b847ef92e90ec9564ca233e4eaf7ae00 (diff) |
INTEGRATION: CWS mav09 (1.49.310); FILE MERGED
2004/09/28 14:11:57 mav 1.49.310.12: #i27773# resync
2004/09/16 22:49:43 mav 1.49.310.11: RESYNC: (1.50-1.51); FILE MERGED
2004/09/06 07:48:54 mav 1.49.310.10: #i27773# error handling for the wrong password case
2004/08/17 15:42:32 mav 1.49.310.9: #i27773# BaseURL and Hierarchical object name
2004/08/16 14:43:15 mav 1.49.310.8: #i27773# get version of storage
2004/08/11 13:45:17 mav 1.49.310.7: #100000# resync problem
2004/08/09 20:38:55 mav 1.49.310.6: RESYNC: (1.49-1.50); FILE MERGED
2004/07/06 15:50:30 mba 1.49.310.5: #i27773#: error handling
2004/05/27 09:27:22 mav 1.49.310.4: #i27773# allow document encryption
2004/05/20 20:12:06 mba 1.49.310.3: #i27773#: some API changes
2004/05/04 15:21:59 mba 1.49.310.2: #i27773#: some storage problems
2004/05/04 14:01:38 mba 1.49.310.1: #i27773#: remove so3
Diffstat (limited to 'sc/source/filter/xml/xmlwrap.cxx')
-rw-r--r-- | sc/source/filter/xml/xmlwrap.cxx | 191 |
1 files changed, 119 insertions, 72 deletions
diff --git a/sc/source/filter/xml/xmlwrap.cxx b/sc/source/filter/xml/xmlwrap.cxx index 548f748c5dcf..36cbbb0b6e17 100644 --- a/sc/source/filter/xml/xmlwrap.cxx +++ b/sc/source/filter/xml/xmlwrap.cxx @@ -2,9 +2,9 @@ * * $RCSfile: xmlwrap.cxx,v $ * - * $Revision: 1.51 $ + * $Revision: 1.52 $ * - * last change: $Author: rt $ $Date: 2004-08-20 08:34:25 $ + * last change: $Author: kz $ $Date: 2004-10-04 20:12:18 $ * * The Contents of this file are made available subject to the terms of * either of the following licenses @@ -84,6 +84,9 @@ #ifndef _SFXITEMSET_HXX #include <svtools/itemset.hxx> #endif +#ifndef _SFXSTRITEM_HXX +#include <svtools/stritem.hxx> +#endif #ifndef _SFXSIDS_HRC #include <sfx2/sfxsids.hrc> #endif @@ -124,6 +127,10 @@ #ifndef _COM_SUN_STAR_PACKAGES_ZIP_ZIPIOEXCEPTION_HPP_ #include <com/sun/star/packages/zip/ZipIOException.hpp> #endif +#ifndef _COM_SUN_STAR_EMBED_ELEMENTMODES_HXX_ +#include <com/sun/star/embed/ElementModes.hpp> +#endif + #ifndef _XMLEOHLP_HXX #include <svx/xmleohlp.hxx> @@ -166,12 +173,12 @@ using namespace com::sun::star; // ----------------------------------------------------------------------- -ScXMLImportWrapper::ScXMLImportWrapper(ScDocument& rD, SfxMedium* pM, SvStorage* pS) : +ScXMLImportWrapper::ScXMLImportWrapper(ScDocument& rD, SfxMedium* pM, const uno::Reference < embed::XStorage >& xStor ) : rDoc(rD), pMedium(pM), - pStorage(pS) + xStorage(xStor) { - DBG_ASSERT( pMedium || pStorage, "ScXMLImportWrapper: Medium or Storage must be set" ); + DBG_ASSERT( pMedium || xStorage.is(), "ScXMLImportWrapper: Medium or Storage must be set" ); } uno::Reference <task::XStatusIndicator> ScXMLImportWrapper::GetStatusIndicator( @@ -230,9 +237,9 @@ sal_uInt32 ScXMLImportWrapper::ImportFromComponent(uno::Reference<lang::XMultiSe const rtl::OUString& sOldDocName, uno::Sequence<uno::Any>& aArgs, sal_Bool bMustBeSuccessfull) { - SvStorageStreamRef xDocStream; - if ( !pStorage && pMedium ) - pStorage = pMedium->GetStorage(); + uno::Reference < io::XStream > xDocStream; + if ( !xStorage.is() && pMedium ) + xStorage = pMedium->GetStorage(); // Get data source ... @@ -241,27 +248,35 @@ sal_uInt32 ScXMLImportWrapper::ImportFromComponent(uno::Reference<lang::XMultiSe sal_Bool bEncrypted = sal_False; rtl::OUString sStream(sDocName); - if( pStorage ) + if( xStorage.is() ) { - if (pStorage->IsStream(sDocName)) - xDocStream = pStorage->OpenStream( sDocName, - STREAM_READ | STREAM_NOCREATE ); - else if (sOldDocName.getLength() && pStorage->IsStream(sOldDocName)) + 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& ) { - xDocStream = pStorage->OpenStream( sOldDocName, - STREAM_READ | STREAM_NOCREATE ); - sStream = sOldDocName; + return ERRCODE_SFX_WRONGPASSWORD; + } + catch( uno::Exception& ) + { + return SCERR_IMPORT_UNKNOWN; } - else - return sal_False; - xDocStream->SetBufferSize( 16*1024 ); - aParserInput.aInputStream = xDocStream->GetXInputStream(); - - uno::Any aAny; - bEncrypted = xDocStream->GetProperty( - OUString( RTL_CONSTASCII_USTRINGPARAM("Encrypted") ), aAny ) && - aAny.getValueType() == ::getBooleanCppuType() && - *(sal_Bool *)aAny.getValue(); } // #99667#; no longer necessary /* else if ( pMedium ) @@ -422,7 +437,7 @@ sal_uInt32 ScXMLImportWrapper::ImportFromComponent(uno::Reference<lang::XMultiSe return nReturn; } -sal_Bool ScXMLImportWrapper::Import(sal_Bool bStylesOnly) +sal_Bool ScXMLImportWrapper::Import(sal_Bool bStylesOnly, ErrCode& nError) { RTL_LOGFILE_CONTEXT_AUTHOR ( aLog, "sc", "sb99857", "ScXMLImportWrapper::Import" ); @@ -478,13 +493,30 @@ sal_Bool ScXMLImportWrapper::Import(sal_Bool bStylesOnly) } // Set base URI + OSL_ENSURE( pMedium, "There is no medium to get MediaDescriptor from!\n" ); + ::rtl::OUString aBaseURL = OUString(INetURLObject::GetBaseURL()); + if ( pMedium && pMedium->GetItemSet() ) + { + const SfxStringItem* pBaseURLItem = static_cast<const SfxStringItem*>( + pMedium->GetItemSet()->GetItem(SID_DOC_BASEURL) ); + if ( pBaseURLItem ) + aBaseURL = pBaseURLItem->GetValue(); + } rtl::OUString sPropName( RTL_CONSTASCII_USTRINGPARAM("BaseURI") ); - xInfoSet->setPropertyValue( sPropName, - uno::makeAny( rtl::OUString(INetURLObject::GetBaseURL()) ) ); - if( SFX_CREATE_MODE_EMBEDDED == pObjSh->GetCreateMode() && - !pStorage->IsRoot() ) + xInfoSet->setPropertyValue( sPropName, uno::makeAny( aBaseURL ) ); + + // TODO/LATER: do not do it for embedded links + if( SFX_CREATE_MODE_EMBEDDED == pObjSh->GetCreateMode() ) { - rtl::OUString aName( pStorage->GetName() ); + 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")); @@ -492,7 +524,7 @@ sal_Bool ScXMLImportWrapper::Import(sal_Bool bStylesOnly) } } - sal_Bool bOasis = pStorage->GetVersion() > SOFFICE_FILEFORMAT_60; + sal_Bool bOasis = ( SotStorage::GetVersion( xStorage ) > SOFFICE_FILEFORMAT_60 ); sal_uInt32 nMetaRetval(0); if(!bStylesOnly) @@ -519,15 +551,14 @@ sal_Bool ScXMLImportWrapper::Import(sal_Bool bStylesOnly) uno::Reference< document::XEmbeddedObjectResolver > xObjectResolver; SvXMLEmbeddedObjectHelper *pObjectHelper = NULL; - if( pStorage ) + if( xStorage.is() ) { - pGraphicHelper = SvXMLGraphicHelper::Create( *pStorage, GRAPHICHELPER_MODE_READ ); + pGraphicHelper = SvXMLGraphicHelper::Create( xStorage, GRAPHICHELPER_MODE_READ ); xGrfContainer = pGraphicHelper; - SvPersist *pPersist = pObjSh; - if( pPersist ) + if( pObjSh ) { - pObjectHelper = SvXMLEmbeddedObjectHelper::Create(*pStorage, *pPersist, EMBEDDEDOBJECTHELPER_MODE_READ, sal_False ); + pObjectHelper = SvXMLEmbeddedObjectHelper::Create(xStorage, *pObjSh, EMBEDDEDOBJECTHELPER_MODE_READ, sal_False ); xObjectResolver = pObjectHelper; } } @@ -606,7 +637,7 @@ sal_Bool ScXMLImportWrapper::Import(sal_Bool bStylesOnly) if (bStylesOnly) { if (nStylesRetval) - pStorage->SetError(nStylesRetval); + nError = nStylesRetval; else bRet = sal_True; } @@ -614,7 +645,7 @@ sal_Bool ScXMLImportWrapper::Import(sal_Bool bStylesOnly) { if (nDocRetval) { - pStorage->SetError(nDocRetval); + nError = nDocRetval; if (nDocRetval == SCWARN_IMPORT_RANGE_OVERFLOW || nDocRetval == SCWARN_IMPORT_ROW_OVERFLOW || nDocRetval == SCWARN_IMPORT_COLUMN_OVERFLOW || @@ -622,11 +653,11 @@ sal_Bool ScXMLImportWrapper::Import(sal_Bool bStylesOnly) bRet = sal_True; } else if (nStylesRetval) - pStorage->SetError(nStylesRetval); + nError = nStylesRetval; else if (nMetaRetval) - pStorage->SetError(nMetaRetval); + nError = nMetaRetval; else if (nSettingsRetval) - pStorage->SetError(nSettingsRetval); + nError = nSettingsRetval; else bRet = sal_True; } @@ -645,30 +676,31 @@ sal_Bool ScXMLImportWrapper::ExportToComponent(uno::Reference<lang::XMultiServic { sal_Bool bRet(sal_False); uno::Reference<io::XOutputStream> xOut; - SvStorageStreamRef xStream; + uno::Reference<io::XStream> xStream; - if( pStorage ) + 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 = pStorage->OpenStream( sName, - STREAM_WRITE | STREAM_SHARE_DENYWRITE | STREAM_TRUNC ); + xStream = xStorage->openStreamElement( sName, embed::ElementModes::READWRITE | embed::ElementModes::TRUNCATE ); + uno::Reference < beans::XPropertySet > xSet( xStream, uno::UNO_QUERY ); uno::Any aAny; aAny <<= sMediaType; - xStream->SetProperty(rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("MediaType")), aAny); + xSet->setPropertyValue(rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("MediaType")), aAny); if (bPlainText) { aAny = ::cppu::bool2any(sal_False); - xStream->SetProperty(rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("Compressed")), aAny); + xSet->setPropertyValue(rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("Compressed")), aAny); } else { aAny = ::cppu::bool2any(sal_True); - xStream->SetProperty(rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("Encrypted")), aAny); +//REMOVE xSet->setPropertyValue(rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("Encrypted")), aAny); + xSet->setPropertyValue(rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("UseCommonStoragePasswordEncryption")), aAny); } - xStream->SetBufferSize( 16*1024 ); - xOut = new utl::OOutputStreamWrapper( *xStream ); + + xOut = xStream->getOutputStream(); } // #99667#; no longer necessary /* else if ( pMedium ) @@ -690,7 +722,6 @@ sal_Bool ScXMLImportWrapper::ExportToComponent(uno::Reference<lang::XMultiServic uno::Reference<io::XActiveDataSource> xSrc( xWriter, uno::UNO_QUERY ); xSrc->setOutputStream( xOut ); - uno::Reference<document::XFilter> xFilter( xServiceFactory->createInstanceWithArguments( sComponentName , aArgs ), uno::UNO_QUERY ); @@ -707,8 +738,9 @@ sal_Bool ScXMLImportWrapper::ExportToComponent(uno::Reference<lang::XMultiServic bRet = xFilter->filter( aDescriptor ); pSharedData = pExport->GetSharedData(); - if (xStream.Is()) - xStream->Commit(); + //stream is closed by SAX parser + //if (xOut.is()) + // xOut->closeOutput(); } return bRet; } @@ -730,8 +762,8 @@ sal_Bool ScXMLImportWrapper::Export(sal_Bool bStylesOnly) if(!xWriter.is()) return sal_False; - if ( !pStorage && pMedium ) - pStorage = pMedium->GetOutputStorage( sal_True ); + if ( !xStorage.is() && pMedium ) + xStorage = pMedium->GetOutputStorage(); uno::Reference<xml::sax::XDocumentHandler> xHandler( xWriter, uno::UNO_QUERY ); @@ -760,7 +792,7 @@ sal_Bool ScXMLImportWrapper::Export(sal_Bool bStylesOnly) }; uno::Reference< beans::XPropertySet > xInfoSet( comphelper::GenericPropertySet_CreateInstance( new comphelper::PropertySetInfo( aExportInfoMap ) ) ); - if ( pObjSh && pStorage) + if ( pObjSh && xStorage.is() ) { pObjSh->UpdateDocInfoForSave(); // update information @@ -779,17 +811,33 @@ sal_Bool ScXMLImportWrapper::Export(sal_Bool bStylesOnly) aUsePrettyPrinting <<= bUsePrettyPrinting; xInfoSet->setPropertyValue(rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("UsePrettyPrinting")), aUsePrettyPrinting); - // Set base URI - OUString sPropName( RTL_CONSTASCII_USTRINGPARAM("BaseURI") ); - xInfoSet->setPropertyValue( sPropName, - uno::makeAny( OUString(INetURLObject::GetBaseURL()) ) ); - if( SFX_CREATE_MODE_EMBEDDED == pObjSh->GetCreateMode() && - !pStorage->IsRoot() ) + OSL_ENSURE( pMedium, "There is no medium to get MediaDescriptor from!\n" ); + ::rtl::OUString aBaseURL = OUString(INetURLObject::GetBaseURL()); + if ( pMedium && pMedium->GetItemSet() ) { - OUString aName( pStorage->GetName() ); + const SfxStringItem* pBaseURLItem = static_cast<const SfxStringItem*>( + pMedium->GetItemSet()->GetItem(SID_DOC_BASEURL) ); + if ( pBaseURLItem ) + aBaseURL = pBaseURLItem->GetValue(); + } + 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 = OUString(RTL_CONSTASCII_USTRINGPARAM("StreamRelPath")); + sPropName = rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("StreamRelPath")); xInfoSet->setPropertyValue( sPropName, uno::makeAny( aName ) ); } } @@ -800,7 +848,7 @@ sal_Bool ScXMLImportWrapper::Export(sal_Bool bStylesOnly) sal_Bool bSettingsRet(sal_False); ScMySharedData* pSharedData = NULL; - sal_Bool bOasis = pStorage->GetVersion() > SOFFICE_FILEFORMAT_60; + sal_Bool bOasis = ( SotStorage::GetVersion( xStorage ) > SOFFICE_FILEFORMAT_60 ); // meta export if (!bStylesOnly && !bMetaRet) @@ -829,16 +877,15 @@ sal_Bool ScXMLImportWrapper::Export(sal_Bool bStylesOnly) uno::Reference< document::XGraphicObjectResolver > xGrfContainer; SvXMLGraphicHelper* pGraphicHelper = 0; - if( pStorage ) + if( xStorage.is() ) { - pGraphicHelper = SvXMLGraphicHelper::Create( *pStorage, GRAPHICHELPER_MODE_WRITE, FALSE ); + pGraphicHelper = SvXMLGraphicHelper::Create( xStorage, GRAPHICHELPER_MODE_WRITE, FALSE ); xGrfContainer = pGraphicHelper; } - SvPersist *pPersist = pObjSh; - if( pPersist ) + if( pObjSh ) { - pObjectHelper = SvXMLEmbeddedObjectHelper::Create( *pStorage, *pPersist, EMBEDDEDOBJECTHELPER_MODE_WRITE, sal_False ); + pObjectHelper = SvXMLEmbeddedObjectHelper::Create( xStorage, *pObjSh, EMBEDDEDOBJECTHELPER_MODE_WRITE, sal_False ); xObjectResolver = pObjectHelper; } |