diff options
author | Mike Kaganski <mike.kaganski@collabora.com> | 2017-11-20 11:47:37 +0200 |
---|---|---|
committer | Mike Kaganski <mike.kaganski@collabora.com> | 2017-11-20 15:40:53 +0100 |
commit | 1560a335f7d548fb9eed564e8d2da03c2ef84b7a (patch) | |
tree | ac023f5eee75791f3c881712b1e5b6f51a0c2988 /sw/source | |
parent | 21f8b386e07702e375abd8000e7583f25a0804cf (diff) |
SwDBManager: move implementation details from interface
Change-Id: I738e8306f2f9af7f284cc236d55f5e184e632323
Reviewed-on: https://gerrit.libreoffice.org/44951
Tested-by: Jenkins <ci@libreoffice.org>
Reviewed-by: Mike Kaganski <mike.kaganski@collabora.com>
Diffstat (limited to 'sw/source')
-rw-r--r-- | sw/source/uibase/dbui/dbmgr.cxx | 314 |
1 files changed, 186 insertions, 128 deletions
diff --git a/sw/source/uibase/dbui/dbmgr.cxx b/sw/source/uibase/dbui/dbmgr.cxx index 93aee382e4ad..5132a0b75e3b 100644 --- a/sw/source/uibase/dbui/dbmgr.cxx +++ b/sw/source/uibase/dbui/dbmgr.cxx @@ -2555,136 +2555,129 @@ uno::Sequence<OUString> SwDBManager::GetExistingDatabaseNames() return xDBContext->getElementNames(); } -OUString SwDBManager::LoadAndRegisterDataSource(const vcl::Window* pParent, SwDocShell* pDocShell) -{ - sfx2::FileDialogHelper aDlgHelper(ui::dialogs::TemplateDescription::FILEOPEN_SIMPLE, FileDialogFlags::NONE, pParent); - uno::Reference < ui::dialogs::XFilePicker3 > xFP = aDlgHelper.GetFilePicker(); - - OUString sHomePath(SvtPathOptions().GetWorkPath()); - aDlgHelper.SetDisplayDirectory( sHomePath ); - - uno::Reference<ui::dialogs::XFilterManager> xFltMgr(xFP, uno::UNO_QUERY); +namespace { +enum class DBConnURIType { + UNKNOWN = 0, + ODB, + CALC, + DBASE, + FLAT, + MSJET, + MSACE, + WRITER +}; - OUString sFilterAll(SwResId(STR_FILTER_ALL)); - OUString sFilterAllData(SwResId(STR_FILTER_ALL_DATA)); - OUString sFilterSXB(SwResId(STR_FILTER_SXB)); - OUString sFilterSXC(SwResId(STR_FILTER_SXC)); - OUString sFilterSXW(SwResId(STR_FILTER_SXW)); - OUString sFilterDBF(SwResId(STR_FILTER_DBF)); - OUString sFilterXLS(SwResId(STR_FILTER_XLS)); - OUString sFilterDOC(SwResId(STR_FILTER_DOC)); - OUString sFilterTXT(SwResId(STR_FILTER_TXT)); - OUString sFilterCSV(SwResId(STR_FILTER_CSV)); -#ifdef _WIN32 - OUString sFilterMDB(SwResId(STR_FILTER_MDB)); - OUString sFilterACCDB(SwResId(STR_FILTER_ACCDB)); -#endif - xFltMgr->appendFilter( sFilterAll, "*" ); - xFltMgr->appendFilter( sFilterAllData, "*.ods;*.sxc;*.odt;*.sxw;*.dbf;*.xls;*.xlsx;*.doc;*.docx;*.txt;*.csv"); +DBConnURIType GetDBunoType(const INetURLObject &rURL) +{ + OUString sExt(rURL.GetExtension()); + DBConnURIType type = DBConnURIType::UNKNOWN; - xFltMgr->appendFilter( sFilterSXB, "*.odb" ); - xFltMgr->appendFilter( sFilterSXC, "*.ods;*.sxc" ); - xFltMgr->appendFilter( sFilterSXW, "*.odt;*.sxw" ); - xFltMgr->appendFilter( sFilterDBF, "*.dbf" ); - xFltMgr->appendFilter( sFilterXLS, "*.xls;*.xlsx" ); - xFltMgr->appendFilter( sFilterDOC, "*.doc;*.docx" ); - xFltMgr->appendFilter( sFilterTXT, "*.txt" ); - xFltMgr->appendFilter( sFilterCSV, "*.csv" ); + if (sExt == "odb") + { + type = DBConnURIType::ODB; + } + else if (sExt.equalsIgnoreAsciiCase("sxc") + || sExt.equalsIgnoreAsciiCase("ods") + || sExt.equalsIgnoreAsciiCase("xls") + || sExt.equalsIgnoreAsciiCase("xlsx")) + { + type = DBConnURIType::CALC; + } + else if (sExt.equalsIgnoreAsciiCase("sxw") || sExt.equalsIgnoreAsciiCase("odt") || sExt.equalsIgnoreAsciiCase("doc") || sExt.equalsIgnoreAsciiCase("docx")) + { + type = DBConnURIType::WRITER; + } + else if (sExt.equalsIgnoreAsciiCase("dbf")) + { + type = DBConnURIType::DBASE; + } + else if (sExt.equalsIgnoreAsciiCase("csv") || sExt.equalsIgnoreAsciiCase("txt")) + { + type = DBConnURIType::FLAT; + } #ifdef _WIN32 - xFltMgr->appendFilter(sFilterMDB, "*.mdb;*.mde"); - xFltMgr->appendFilter(sFilterACCDB, "*.accdb;*.accde"); -#endif - - xFltMgr->setCurrentFilter( sFilterAll ) ; - OUString sFind; - if( ERRCODE_NONE == aDlgHelper.Execute() ) + else if (sExt.equalsIgnoreAsciiCase("mdb") || sExt.equalsIgnoreAsciiCase("mde")) { - uno::Any aURLAny; - uno::Reference< beans::XPropertySet > aSettings; - const OUString aURI( xFP->getSelectedFiles().getConstArray()[0] ); - const DBConnURITypes type = GetDBunoURI( aURI, aURLAny ); - - if( DBCONN_FLAT == type ) - { - uno::Reference<uno::XComponentContext> xContext( ::comphelper::getProcessComponentContext() ); - uno::Reference < sdb::XTextConnectionSettings > xSettingsDlg = sdb::TextConnectionSettings::create(xContext); - if( xSettingsDlg->execute() ) - aSettings.set( uno::Reference < beans::XPropertySet >( xSettingsDlg, uno::UNO_QUERY_THROW ) ); - } - sFind = LoadAndRegisterDataSource( type, aURLAny, DBCONN_FLAT == type ? &aSettings : nullptr, aURI, nullptr, nullptr, pDocShell ); - - m_aUncommitedRegistrations.push_back(std::pair<SwDocShell*, OUString>(pDocShell, sFind)); + type = DBConnURIType::MSJET; } - return sFind; + else if (sExt.equalsIgnoreAsciiCase("accdb") || sExt.equalsIgnoreAsciiCase("accde")) + { + type = DBConnURIType::MSACE; + } +#endif + return type; } -SwDBManager::DBConnURITypes SwDBManager::GetDBunoURI(const OUString &rURI, uno::Any &aURLAny) +uno::Any GetDBunoURI(const INetURLObject &rURL, DBConnURIType& rType) { - INetURLObject aURL( rURI ); - OUString sExt( aURL.GetExtension() ); - DBConnURITypes type = DBCONN_UNKNOWN; + uno::Any aURLAny; - if(sExt == "odb") - { - type = DBCONN_ODB; - } - else if(sExt.equalsIgnoreAsciiCase("sxc") - || sExt.equalsIgnoreAsciiCase("ods") - || sExt.equalsIgnoreAsciiCase("xls") - || sExt.equalsIgnoreAsciiCase("xlsx")) + if (rType == DBConnURIType::UNKNOWN) + rType = GetDBunoType(rURL); + + switch (rType) { + case DBConnURIType::UNKNOWN: + case DBConnURIType::ODB: + break; + case DBConnURIType::CALC: { OUString sDBURL("sdbc:calc:"); - sDBURL += aURL.GetMainURL(INetURLObject::DecodeMechanism::NONE); + sDBURL += rURL.GetMainURL(INetURLObject::DecodeMechanism::NONE); aURLAny <<= sDBURL; - type = DBCONN_CALC; } - else if (sExt.equalsIgnoreAsciiCase("sxw") || sExt.equalsIgnoreAsciiCase("odt") || sExt.equalsIgnoreAsciiCase("doc") || sExt.equalsIgnoreAsciiCase("docx")) + break; + case DBConnURIType::WRITER: { OUString sDBURL("sdbc:writer:"); - sDBURL += aURL.GetMainURL(INetURLObject::DecodeMechanism::NONE); + sDBURL += rURL.GetMainURL(INetURLObject::DecodeMechanism::NONE); aURLAny <<= sDBURL; - type = DBCONN_WRITER; } - else if(sExt.equalsIgnoreAsciiCase("dbf")) + break; + case DBConnURIType::DBASE: { - aURL.removeSegment(); - aURL.removeFinalSlash(); + INetURLObject aUrlTmp(rURL); + aUrlTmp.removeSegment(); + aUrlTmp.removeFinalSlash(); OUString sDBURL("sdbc:dbase:"); - sDBURL += aURL.GetMainURL(INetURLObject::DecodeMechanism::NONE); + sDBURL += aUrlTmp.GetMainURL(INetURLObject::DecodeMechanism::NONE); aURLAny <<= sDBURL; - type = DBCONN_DBASE; } - else if(sExt.equalsIgnoreAsciiCase("csv") || sExt.equalsIgnoreAsciiCase("txt")) + break; + case DBConnURIType::FLAT: { - aURL.removeSegment(); - aURL.removeFinalSlash(); + INetURLObject aUrlTmp(rURL); + aUrlTmp.removeSegment(); + aUrlTmp.removeFinalSlash(); OUString sDBURL("sdbc:flat:"); //only the 'path' has to be added - sDBURL += aURL.GetMainURL(INetURLObject::DecodeMechanism::NONE); + sDBURL += aUrlTmp.GetMainURL(INetURLObject::DecodeMechanism::NONE); aURLAny <<= sDBURL; - type = DBCONN_FLAT; } + break; + case DBConnURIType::MSJET: #ifdef _WIN32 - else if (sExt.equalsIgnoreAsciiCase("mdb") || sExt.equalsIgnoreAsciiCase("mde")) { OUString sDBURL("sdbc:ado:access:PROVIDER=Microsoft.Jet.OLEDB.4.0;DATA SOURCE="); - sDBURL += aURL.PathToFileName(); + sDBURL += rURL.PathToFileName(); aURLAny <<= sDBURL; - type = DBCONN_MSJET; } - else if (sExt.equalsIgnoreAsciiCase("accdb") || sExt.equalsIgnoreAsciiCase("accde")) +#endif + break; + case DBConnURIType::MSACE: +#ifdef _WIN32 { OUString sDBURL("sdbc:ado:PROVIDER=Microsoft.ACE.OLEDB.12.0;DATA SOURCE="); - sDBURL += aURL.PathToFileName(); + sDBURL += rURL.PathToFileName(); aURLAny <<= sDBURL; - type = DBCONN_MSACE; } #endif - return type; + break; + } + return aURLAny; } /// Returns the URL of this SwDoc. -OUString lcl_getOwnURL(SwDocShell const * pDocShell) +OUString getOwnURL(SfxObjectShell const * pDocShell) { OUString aRet; @@ -2696,11 +2689,16 @@ OUString lcl_getOwnURL(SwDocShell const * pDocShell) return aRet; } -OUString SwDBManager::LoadAndRegisterDataSource(const DBConnURITypes type, const uno::Any &aURLAny, const uno::Reference< beans::XPropertySet > *pSettings, - const OUString &rURI, const OUString *pPrefix, const OUString *pDestDir, SwDocShell* pDocShell) +/** +Loads a data source from file and registers it. + +In case of success it returns the registered name, otherwise an empty string. +Optionally add a prefix to the registered DB name. +*/ +OUString LoadAndRegisterDataSource_Impl(DBConnURIType type, const uno::Reference< beans::XPropertySet > *pSettings, + const INetURLObject &rURL, const OUString *pPrefix, const OUString *pDestDir, SfxObjectShell* pDocShell) { - INetURLObject aURL( rURI ); - OUString sExt( aURL.GetExtension() ); + OUString sExt(rURL.GetExtension()); uno::Any aTableFilterAny; uno::Any aSuppressVersionsAny; uno::Any aInfoAny; @@ -2708,52 +2706,53 @@ OUString SwDBManager::LoadAndRegisterDataSource(const DBConnURITypes type, const OUString sFind; uno::Sequence<OUString> aFilters(1); + uno::Any aURLAny = GetDBunoURI(rURL, type); switch (type) { - case DBCONN_UNKNOWN: - case DBCONN_CALC: - case DBCONN_WRITER: + case DBConnURIType::UNKNOWN: + case DBConnURIType::CALC: + case DBConnURIType::WRITER: break; - case DBCONN_ODB: + case DBConnURIType::ODB: bStore = false; break; - case DBCONN_FLAT: - case DBCONN_DBASE: + case DBConnURIType::FLAT: + case DBConnURIType::DBASE: //set the filter to the file name without extension - aFilters[0] = aURL.getBase(); + aFilters[0] = rURL.getBase(); aTableFilterAny <<= aFilters; break; - case DBCONN_MSJET: - case DBCONN_MSACE: + case DBConnURIType::MSJET: + case DBConnURIType::MSACE: aSuppressVersionsAny <<= true; break; } try { - uno::Reference<uno::XComponentContext> xContext( ::comphelper::getProcessComponentContext() ); + uno::Reference<uno::XComponentContext> xContext(::comphelper::getProcessComponentContext()); uno::Reference<sdb::XDatabaseContext> xDBContext = sdb::DatabaseContext::create(xContext); - OUString sNewName = INetURLObject::decode( aURL.getName(), - INetURLObject::DecodeMechanism::Unambiguous ); + OUString sNewName = INetURLObject::decode(rURL.getName(), + INetURLObject::DecodeMechanism::Unambiguous); sal_Int32 nExtLen = sExt.getLength(); - sNewName = sNewName.replaceAt( sNewName.getLength() - nExtLen - 1, nExtLen + 1, "" ); + sNewName = sNewName.replaceAt(sNewName.getLength() - nExtLen - 1, nExtLen + 1, ""); if (pPrefix) sNewName = *pPrefix + sNewName; //find a unique name if sNewName already exists sFind = sNewName; sal_Int32 nIndex = 0; - while(xDBContext->hasByName(sFind)) + while (xDBContext->hasByName(sFind)) { sFind = sNewName; sFind += OUString::number(++nIndex); } uno::Reference<uno::XInterface> xNewInstance; - if(!bStore) + if (!bStore) { //odb-file - uno::Any aDataSource = xDBContext->getByName(aURL.GetMainURL(INetURLObject::DecodeMechanism::NONE)); + uno::Any aDataSource = xDBContext->getByName(rURL.GetMainURL(INetURLObject::DecodeMechanism::NONE)); aDataSource >>= xNewInstance; } else @@ -2761,27 +2760,27 @@ OUString SwDBManager::LoadAndRegisterDataSource(const DBConnURITypes type, const xNewInstance = xDBContext->createInstance(); uno::Reference<beans::XPropertySet> xDataProperties(xNewInstance, uno::UNO_QUERY); - if(aURLAny.hasValue()) + if (aURLAny.hasValue()) xDataProperties->setPropertyValue("URL", aURLAny); - if(aTableFilterAny.hasValue()) + if (aTableFilterAny.hasValue()) xDataProperties->setPropertyValue("TableFilter", aTableFilterAny); - if(aSuppressVersionsAny.hasValue()) + if (aSuppressVersionsAny.hasValue()) xDataProperties->setPropertyValue("SuppressVersionColumns", aSuppressVersionsAny); - if(aInfoAny.hasValue()) + if (aInfoAny.hasValue()) xDataProperties->setPropertyValue("Info", aInfoAny); - if( DBCONN_FLAT == type && pSettings ) + if (DBConnURIType::FLAT == type && pSettings) { - uno::Any aSettings = xDataProperties->getPropertyValue( "Settings" ); - uno::Reference < beans::XPropertySet > xDSSettings; - aSettings >>= xDSSettings; - ::comphelper::copyProperties( *pSettings, xDSSettings ); - xDSSettings->setPropertyValue( "Extension", uno::makeAny( sExt )); + uno::Any aSettings = xDataProperties->getPropertyValue("Settings"); + uno::Reference < beans::XPropertySet > xDSSettings; + aSettings >>= xDSSettings; + ::comphelper::copyProperties(*pSettings, xDSSettings); + xDSSettings->setPropertyValue("Extension", uno::makeAny(sExt)); } uno::Reference<sdb::XDocumentDataSource> xDS(xNewInstance, uno::UNO_QUERY_THROW); uno::Reference<frame::XStorable> xStore(xDS->getDatabaseDocument(), uno::UNO_QUERY_THROW); - OUString aOwnURL = lcl_getOwnURL(pDocShell); + OUString aOwnURL = getOwnURL(pDocShell); if (aOwnURL.isEmpty()) { // Cannot embed, as embedded data source would need the URL of the parent document. @@ -2807,16 +2806,15 @@ OUString SwDBManager::LoadAndRegisterDataSource(const DBConnURITypes type, const SwDBManager::StoreEmbeddedDataSource(xStore, xStorage, aStreamRelPath, aOwnURL); } } - xDBContext->registerObject( sFind, xNewInstance ); + xDBContext->registerObject(sFind, xNewInstance); } - catch(const uno::Exception&) + catch (const uno::Exception&) { sFind.clear(); } return sFind; } -namespace { // Construct vnd.sun.star.pkg:// URL OUString ConstructVndSunStarPkgUrl(const OUString& rMainURL, const OUString& rStreamRelPath) { @@ -2833,6 +2831,68 @@ OUString ConstructVndSunStarPkgUrl(const OUString& rMainURL, const OUString& rSt } } +OUString SwDBManager::LoadAndRegisterDataSource(const vcl::Window* pParent, SwDocShell* pDocShell) +{ + sfx2::FileDialogHelper aDlgHelper(ui::dialogs::TemplateDescription::FILEOPEN_SIMPLE, FileDialogFlags::NONE, pParent); + uno::Reference < ui::dialogs::XFilePicker3 > xFP = aDlgHelper.GetFilePicker(); + + OUString sHomePath(SvtPathOptions().GetWorkPath()); + aDlgHelper.SetDisplayDirectory( sHomePath ); + + uno::Reference<ui::dialogs::XFilterManager> xFltMgr(xFP, uno::UNO_QUERY); + + OUString sFilterAll(SwResId(STR_FILTER_ALL)); + OUString sFilterAllData(SwResId(STR_FILTER_ALL_DATA)); + OUString sFilterSXB(SwResId(STR_FILTER_SXB)); + OUString sFilterSXC(SwResId(STR_FILTER_SXC)); + OUString sFilterSXW(SwResId(STR_FILTER_SXW)); + OUString sFilterDBF(SwResId(STR_FILTER_DBF)); + OUString sFilterXLS(SwResId(STR_FILTER_XLS)); + OUString sFilterDOC(SwResId(STR_FILTER_DOC)); + OUString sFilterTXT(SwResId(STR_FILTER_TXT)); + OUString sFilterCSV(SwResId(STR_FILTER_CSV)); +#ifdef _WIN32 + OUString sFilterMDB(SwResId(STR_FILTER_MDB)); + OUString sFilterACCDB(SwResId(STR_FILTER_ACCDB)); +#endif + xFltMgr->appendFilter( sFilterAll, "*" ); + xFltMgr->appendFilter( sFilterAllData, "*.ods;*.sxc;*.odt;*.sxw;*.dbf;*.xls;*.xlsx;*.doc;*.docx;*.txt;*.csv"); + + xFltMgr->appendFilter( sFilterSXB, "*.odb" ); + xFltMgr->appendFilter( sFilterSXC, "*.ods;*.sxc" ); + xFltMgr->appendFilter( sFilterSXW, "*.odt;*.sxw" ); + xFltMgr->appendFilter( sFilterDBF, "*.dbf" ); + xFltMgr->appendFilter( sFilterXLS, "*.xls;*.xlsx" ); + xFltMgr->appendFilter( sFilterDOC, "*.doc;*.docx" ); + xFltMgr->appendFilter( sFilterTXT, "*.txt" ); + xFltMgr->appendFilter( sFilterCSV, "*.csv" ); +#ifdef _WIN32 + xFltMgr->appendFilter(sFilterMDB, "*.mdb;*.mde"); + xFltMgr->appendFilter(sFilterACCDB, "*.accdb;*.accde"); +#endif + + xFltMgr->setCurrentFilter( sFilterAll ) ; + OUString sFind; + if( ERRCODE_NONE == aDlgHelper.Execute() ) + { + uno::Reference< beans::XPropertySet > aSettings; + const INetURLObject aURL( xFP->getSelectedFiles().getConstArray()[0] ); + const DBConnURIType type = GetDBunoType( aURL ); + + if( DBConnURIType::FLAT == type ) + { + uno::Reference<uno::XComponentContext> xContext( ::comphelper::getProcessComponentContext() ); + uno::Reference < sdb::XTextConnectionSettings > xSettingsDlg = sdb::TextConnectionSettings::create(xContext); + if( xSettingsDlg->execute() ) + aSettings.set( uno::Reference < beans::XPropertySet >( xSettingsDlg, uno::UNO_QUERY_THROW ) ); + } + sFind = LoadAndRegisterDataSource_Impl( type, DBConnURIType::FLAT == type ? &aSettings : nullptr, aURL, nullptr, nullptr, pDocShell ); + + m_aUncommitedRegistrations.push_back(std::pair<SwDocShell*, OUString>(pDocShell, sFind)); + } + return sFind; +} + void SwDBManager::StoreEmbeddedDataSource(const uno::Reference<frame::XStorable>& xStorable, const uno::Reference<embed::XStorage>& xStorage, const OUString& rStreamRelPath, @@ -2852,9 +2912,7 @@ void SwDBManager::StoreEmbeddedDataSource(const uno::Reference<frame::XStorable> OUString SwDBManager::LoadAndRegisterDataSource(const OUString &rURI, const OUString *pDestDir) { - uno::Any aURLAny; - DBConnURITypes type = GetDBunoURI( rURI, aURLAny ); - return LoadAndRegisterDataSource( type, aURLAny, nullptr, rURI, nullptr, pDestDir ); + return LoadAndRegisterDataSource_Impl( DBConnURIType::UNKNOWN, nullptr, INetURLObject(rURI), nullptr, pDestDir, nullptr ); } void SwDBManager::RevokeDataSource(const OUString& rName) |