diff options
author | Miklos Vajna <vmiklos@collabora.co.uk> | 2015-06-01 12:13:44 +0200 |
---|---|---|
committer | Miklos Vajna <vmiklos@collabora.co.uk> | 2015-06-01 12:30:26 +0200 |
commit | 54bf49a2be3a7bc370c7043011c6080918224ffa (patch) | |
tree | e79c8f97bf0335e273879529e1741c89df8e99fe /sw | |
parent | b499739c438d58c29125cb2777f019c84394786d (diff) |
SwDBManager: embed data source definition if possible
In the past SwDBManager (used by the MM wizard) created a smaller .odb
file in the home directory by default in case the data source was
something external (.ods file, etc).
If the document is saved already (and experimental mode is enabled, as
this is still a work in progress), then stop saving these small .odb
files to the home directory, instead embed the data source definition
into the currently active .odt file.
Previously created such separate .odb files are still fully supported,
of course.
Change-Id: I7c1776e5ed57cdde05c0adfc5f7d1dc485363f03
Diffstat (limited to 'sw')
-rw-r--r-- | sw/inc/dbmgr.hxx | 5 | ||||
-rw-r--r-- | sw/source/ui/dbui/addresslistdialog.cxx | 10 | ||||
-rw-r--r-- | sw/source/uibase/dbui/dbmgr.cxx | 47 |
3 files changed, 55 insertions, 7 deletions
diff --git a/sw/inc/dbmgr.hxx b/sw/inc/dbmgr.hxx index 5bf5432fdc0e..27c86a7268f0 100644 --- a/sw/inc/dbmgr.hxx +++ b/sw/inc/dbmgr.hxx @@ -350,7 +350,7 @@ public: the filename returned by a file picker and additional settings dialog. In case of success it returns the registered name, otherwise an empty string. */ - static OUString LoadAndRegisterDataSource(); + static OUString LoadAndRegisterDataSource(SwDocShell* pDocShell = 0); /** Loads a data source from file and registers it. @@ -360,7 +360,8 @@ public: */ static OUString LoadAndRegisterDataSource(const DBConnURITypes type, const ::com::sun::star::uno::Any &rUnoURI, const ::com::sun::star::uno::Reference < ::com::sun::star::beans::XPropertySet > *pSettings, - const OUString &rURI, const OUString *pPrefix = 0, const OUString *pDestDir = 0); + const OUString &rURI, const OUString *pPrefix = 0, const OUString *pDestDir = 0, + SwDocShell* pDocShell = 0); /** Loads a data source from file and registers it. diff --git a/sw/source/ui/dbui/addresslistdialog.cxx b/sw/source/ui/dbui/addresslistdialog.cxx index 9f989d054776..16a55a717ef7 100644 --- a/sw/source/ui/dbui/addresslistdialog.cxx +++ b/sw/source/ui/dbui/addresslistdialog.cxx @@ -56,6 +56,7 @@ #include <unotools/pathoptions.hxx> #include <svl/urihelper.hxx> #include <dbui.hrc> +#include <view.hxx> #include <helpid.h> #include <unomid.h> @@ -345,7 +346,14 @@ IMPL_LINK_NOARG(SwAddressListDialog, FilterHdl_Impl) IMPL_LINK_NOARG(SwAddressListDialog, LoadHdl_Impl) { - const OUString sNewSource = SwDBManager::LoadAndRegisterDataSource(); + SwMailMergeWizard* pWizard = 0; + if (GetParent() && GetParent()->GetParent()) + pWizard = dynamic_cast<SwMailMergeWizard*>(GetParent()->GetParent()); + SwView* pView = 0; + if (pWizard) + pView = pWizard->GetSwView(); + + const OUString sNewSource = SwDBManager::LoadAndRegisterDataSource(pView ? pView->GetDocShell() : 0); if(!sNewSource.isEmpty()) { SvTreeListEntry* pNewSource = m_pListLB->InsertEntry(sNewSource); diff --git a/sw/source/uibase/dbui/dbmgr.cxx b/sw/source/uibase/dbui/dbmgr.cxx index 942f58b43ade..5f5c703723dd 100644 --- a/sw/source/uibase/dbui/dbmgr.cxx +++ b/sw/source/uibase/dbui/dbmgr.cxx @@ -141,6 +141,8 @@ #if ENABLE_CUPS && !defined(MACOSX) #include <vcl/printerinfomanager.hxx> #endif +#include <comphelper/propertysequence.hxx> +#include <officecfg/Office/Common.hxx> using namespace ::osl; @@ -2397,7 +2399,7 @@ Sequence<OUString> SwDBManager::GetExistingDatabaseNames() return xDBContext->getElementNames(); } -OUString SwDBManager::LoadAndRegisterDataSource() +OUString SwDBManager::LoadAndRegisterDataSource(SwDocShell* pDocShell) { sfx2::FileDialogHelper aDlgHelper( TemplateDescription::FILEOPEN_SIMPLE, 0 ); Reference < XFilePicker > xFP = aDlgHelper.GetFilePicker(); @@ -2449,7 +2451,7 @@ OUString SwDBManager::LoadAndRegisterDataSource() if( xSettingsDlg->execute() ) aSettings.set( uno::Reference < beans::XPropertySet >( xSettingsDlg, uno::UNO_QUERY_THROW ) ); } - sFind = LoadAndRegisterDataSource( type, aURLAny, DBCONN_FLAT == type ? &aSettings : 0, aURI ); + sFind = LoadAndRegisterDataSource( type, aURLAny, DBCONN_FLAT == type ? &aSettings : 0, aURI, 0, 0, pDocShell ); } return sFind; } @@ -2511,8 +2513,26 @@ SwDBManager::DBConnURITypes SwDBManager::GetDBunoURI(const OUString &rURI, Any & return type; } +/// Returns the URL of this SwDoc. +OUString lcl_getOwnURL(SwDocShell* pDocShell) +{ + OUString aRet; + + // Experimental till load/store of embedded data source definition is not fully implemented. + static bool bEmbed = officecfg::Office::Common::Misc::ExperimentalMode::get(); + if (!bEmbed) + return aRet; + + if (!pDocShell) + return aRet; + + const INetURLObject& rURLObject = pDocShell->GetMedium()->GetURLObject(); + aRet = rURLObject.GetMainURL(INetURLObject::DECODE_WITH_CHARSET); + return aRet; +} + OUString SwDBManager::LoadAndRegisterDataSource(const DBConnURITypes type, const Any &aURLAny, const uno::Reference< beans::XPropertySet > *pSettings, - const OUString &rURI, const OUString *pPrefix, const OUString *pDestDir) + const OUString &rURI, const OUString *pPrefix, const OUString *pDestDir, SwDocShell* pDocShell) { INetURLObject aURL( rURI ); OUString sExt( aURL.GetExtension() ); @@ -2597,14 +2617,33 @@ OUString SwDBManager::LoadAndRegisterDataSource(const DBConnURITypes type, const Reference<XDocumentDataSource> xDS(xNewInstance, UNO_QUERY_THROW); Reference<XStorable> xStore(xDS->getDatabaseDocument(), 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(); } - xStore->storeAsURL(sTmpName, Sequence< PropertyValue >()); + else + { + // Embed: construct vnd.sun.star.pkg:// URL for later loading, and TargetStorage/StreamRelPath for storing. + 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)} + }); + } + xStore->storeAsURL(sTmpName, aSequence); } xDBContext->registerObject( sFind, xNewInstance ); } |