sfx2/source/doc/objstor.cxx | 1 sw/inc/dbmgr.hxx | 7 ++++++ sw/qa/extras/uiwriter/uiwriter.cxx | 8 ++++++ sw/source/uibase/app/docsh.cxx | 21 ++++++++++++++++++ sw/source/uibase/dbui/dbmgr.cxx | 43 +++++++++++++++++++------------------ 5 files changed, 60 insertions(+), 20 deletions(-)
New commits: commit 9805ae85eb776fa8f718c1415942c31f2cfc6d9e Author: Miklos Vajna <[email protected]> Date: Tue Jun 9 12:07:37 2015 +0200 sfx2: silence warning in SfxObjectShell::CopyStoragesOfUnknownMediaType() I guess the intention is to catch all "own" formats, and Base is just missing from that list. Change-Id: I064068c2ab17db9109a9a4681775ba8d18292292 diff --git a/sfx2/source/doc/objstor.cxx b/sfx2/source/doc/objstor.cxx index d431a1e..826d024 100644 --- a/sfx2/source/doc/objstor.cxx +++ b/sfx2/source/doc/objstor.cxx @@ -3484,6 +3484,7 @@ bool SfxObjectShell::CopyStoragesOfUnknownMediaType( const uno::Reference< embed case SotClipboardFormatId::STARCALC_8: case SotClipboardFormatId::STARCHART_8: case SotClipboardFormatId::STARMATH_8: + case SotClipboardFormatId::STARBASE_8: break; default: commit 2d7ff7aabc1aa8cf5bb4900ae4b00feb8bc0f7f7 Author: Miklos Vajna <[email protected]> Date: Tue Jun 9 11:40:02 2015 +0200 SwDocShell: custom copy for embedded data source definition on save-as If "EmbeddedDatabase" in test.odt refers test.ods in the same directory, that will be "../../test.ods". Now if we save test.odt in a different directory, we need to re-save the embedded data source definition, otherwise the relative reference will resolve to a non-existing path. Relative references are normally not supported for embedded objects, so this is not a problem, but for data sources they are, that's why they are a special case here. Change-Id: Id138b9cdc38f2de589d9b80c66f1a61174699770 diff --git a/sw/qa/extras/uiwriter/uiwriter.cxx b/sw/qa/extras/uiwriter/uiwriter.cxx index 666f0ac..d3f08e4 100644 --- a/sw/qa/extras/uiwriter/uiwriter.cxx +++ b/sw/qa/extras/uiwriter/uiwriter.cxx @@ -1009,6 +1009,14 @@ void SwUiWriterTest::testEmbeddedDataSource() CPPUNIT_ASSERT(mxComponent.is()); CPPUNIT_ASSERT(xDatabaseContext->hasByName("calc-data-source")); + // Data source has a table named Sheet1 after saving to a different directory. + xDataSource.set(xDatabaseContext->getByName("calc-data-source"), uno::UNO_QUERY); + CPPUNIT_ASSERT(xDataSource.is()); + xConnection.set(xDataSource->getConnection("", ""), uno::UNO_QUERY); + xTables.set(xConnection->getTables(), uno::UNO_QUERY); + CPPUNIT_ASSERT(xTables.is()); + CPPUNIT_ASSERT(xTables->hasByName("Sheet1")); + // Close: should not have a data source anymore. mxComponent->dispose(); mxComponent.clear(); diff --git a/sw/source/uibase/app/docsh.cxx b/sw/source/uibase/app/docsh.cxx index b4c22ac..1901355 100644 --- a/sw/source/uibase/app/docsh.cxx +++ b/sw/source/uibase/app/docsh.cxx @@ -115,12 +115,15 @@ #include <com/sun/star/document/XDocumentProperties.hpp> #include <com/sun/star/document/XDocumentPropertiesSupplier.hpp> +#include <com/sun/star/sdb/DatabaseContext.hpp> +#include <com/sun/star/sdb/XDocumentDataSource.hpp> #include <unomid.h> #include <unotextrange.hxx> #include <sfx2/Metadatable.hxx> #include <calbck.hxx> +#include <dbmgr.hxx> #include <sal/log.hxx> #include <LibreOfficeKit/LibreOfficeKitEnums.h> @@ -416,6 +419,24 @@ bool SwDocShell::SaveAs( SfxMedium& rMedium ) } CalcLayoutForOLEObjects(); // format for OLE objets + + if (!m_pDoc->GetDBManager()->getEmbeddedName().isEmpty()) + { + // We have an embedded data source definition, need to re-store it, + // otherwise relative references will break when the new file is in a + // different directory. + uno::Reference<sdb::XDatabaseContext> xDatabaseContext = sdb::DatabaseContext::create(comphelper::getProcessComponentContext()); + + const INetURLObject& rOldURLObject = GetMedium()->GetURLObject(); + OUString aURL = "vnd.sun.star.pkg://"; + aURL += INetURLObject::encode(rOldURLObject.GetMainURL(INetURLObject::DECODE_WITH_CHARSET), INetURLObject::PART_AUTHORITY, INetURLObject::ENCODE_ALL); + aURL += "/" + INetURLObject::encode(m_pDoc->GetDBManager()->getEmbeddedName(), INetURLObject::PART_FPATH, INetURLObject::ENCODE_ALL); + + uno::Reference<sdb::XDocumentDataSource> xDataSource(xDatabaseContext->getByName(aURL), uno::UNO_QUERY); + uno::Reference<frame::XStorable> xStorable(xDataSource->getDatabaseDocument(), uno::UNO_QUERY); + SwDBManager::StoreEmbeddedDataSource(xStorable, rMedium.GetOutputStorage(), m_pDoc->GetDBManager()->getEmbeddedName(), rMedium.GetName()); + } + // #i62875# // reset compatibility flag <DoNotCaptureDrawObjsOnPage>, if possible if (m_pWrtShell && commit f01f31201f9b26b3071ab25f9a5a3a0311ff7423 Author: Miklos Vajna <[email protected]> Date: Tue Jun 9 09:42:40 2015 +0200 SwDBManager: extract StoreEmbeddedDataSource() from registration code Change-Id: Ifc6471f58793cde057f354c4c6a549c073b7d34b diff --git a/sw/inc/dbmgr.hxx b/sw/inc/dbmgr.hxx index 007755d..5bf1542 100644 --- a/sw/inc/dbmgr.hxx +++ b/sw/inc/dbmgr.hxx @@ -28,6 +28,8 @@ #include <com/sun/star/uno/Sequence.hxx> #include <com/sun/star/lang/Locale.hpp> #include <com/sun/star/beans/PropertyValue.hpp> +#include <com/sun/star/frame/XStorable.hpp> +#include <com/sun/star/embed/XStorage.hpp> #include <boost/ptr_container/ptr_vector.hpp> namespace com{namespace sun{namespace star{ @@ -414,6 +416,11 @@ public: void setEmbeddedName(const OUString& rEmbeddedName, SwDocShell& rDocShell); OUString getEmbeddedName() const; + + static void StoreEmbeddedDataSource(const css::uno::Reference<css::frame::XStorable>& xStorable, + const css::uno::Reference<css::embed::XStorage>& xStorage, + const OUString& rStreamRelPath, + const OUString& rOwnURL); }; #endif diff --git a/sw/source/uibase/dbui/dbmgr.cxx b/sw/source/uibase/dbui/dbmgr.cxx index db52e41..ccd1372 100644 --- a/sw/source/uibase/dbui/dbmgr.cxx +++ b/sw/source/uibase/dbui/dbmgr.cxx @@ -2595,39 +2595,23 @@ OUString SwDBManager::LoadAndRegisterDataSource(const DBConnURITypes type, const uno::Reference<frame::XStorable> xStore(xDS->getDatabaseDocument(), uno::UNO_QUERY_THROW); OUString sOutputExt = ".odb"; OUString aOwnURL = lcl_getOwnURL(pDocShell); - OUString sTmpName; - uno::Sequence<beans::PropertyValue> aSequence; if (aOwnURL.isEmpty()) { // Cannot embed, as embedded data source would need the URL of the parent document. OUString sHomePath(SvtPathOptions().GetWorkPath()); utl::TempFile aTempFile(sNewName, true, &sOutputExt, pDestDir ? pDestDir : &sHomePath); aTempFile.EnableKillingFile(true); - sTmpName = aTempFile.GetURL(); + OUString sTmpName = aTempFile.GetURL(); + xStore->storeAsURL(sTmpName, uno::Sequence<beans::PropertyValue>()); } else { - // Embed: construct vnd.sun.star.pkg:// URL for later loading, and TargetStorage/StreamRelPath for storing. + // Embed. OUString aStreamRelPath = "EmbeddedDatabase"; - sTmpName = "vnd.sun.star.pkg://"; - sTmpName += INetURLObject::encode(aOwnURL, INetURLObject::PART_AUTHORITY, INetURLObject::ENCODE_ALL); - sTmpName += "/" + aStreamRelPath; uno::Reference<embed::XStorage> xStorage = pDocShell->GetStorage(); - aSequence = comphelper::InitPropertySequence( - { - {"TargetStorage", uno::makeAny(xStorage)}, - {"StreamRelPath", uno::makeAny(aStreamRelPath)}, - {"BaseURI", uno::makeAny(aOwnURL)} - }); - - // Refer to the sub-storage name in the document settings, so - // we can load it again next time the file is imported. - uno::Reference<lang::XMultiServiceFactory> xFactory(pDocShell->GetModel(), uno::UNO_QUERY); - uno::Reference<beans::XPropertySet> xPropertySet(xFactory->createInstance("com.sun.star.document.Settings"), uno::UNO_QUERY); - xPropertySet->setPropertyValue("EmbeddedDatabaseName", uno::makeAny(aStreamRelPath)); + SwDBManager::StoreEmbeddedDataSource(xStore, xStorage, aStreamRelPath, aOwnURL); } - xStore->storeAsURL(sTmpName, aSequence); } xDBContext->registerObject( sFind, xNewInstance ); } @@ -2638,6 +2622,25 @@ OUString SwDBManager::LoadAndRegisterDataSource(const DBConnURITypes type, const return sFind; } +void SwDBManager::StoreEmbeddedDataSource(const uno::Reference<frame::XStorable>& xStorable, + const uno::Reference<embed::XStorage>& xStorage, + const OUString& rStreamRelPath, + const OUString& rOwnURL) +{ + // Construct vnd.sun.star.pkg:// URL for later loading, and TargetStorage/StreamRelPath for storing. + OUString sTmpName = "vnd.sun.star.pkg://"; + sTmpName += INetURLObject::encode(rOwnURL, INetURLObject::PART_AUTHORITY, INetURLObject::ENCODE_ALL); + sTmpName += "/" + rStreamRelPath; + + uno::Sequence<beans::PropertyValue> aSequence = comphelper::InitPropertySequence( + { + {"TargetStorage", uno::makeAny(xStorage)}, + {"StreamRelPath", uno::makeAny(rStreamRelPath)}, + {"BaseURI", uno::makeAny(rOwnURL)} + }); + xStorable->storeAsURL(sTmpName, aSequence); +} + OUString SwDBManager::LoadAndRegisterDataSource(const OUString &rURI, const OUString *pPrefix, const OUString *pDestDir, const uno::Reference< beans::XPropertySet > *pSettings) { _______________________________________________ Libreoffice-commits mailing list [email protected] http://lists.freedesktop.org/mailman/listinfo/libreoffice-commits
