sw/inc/dbmgr.hxx | 23 -- sw/source/uibase/dbui/dbmgr.cxx | 314 +++++++++++++++++++++++----------------- 2 files changed, 186 insertions(+), 151 deletions(-)
New commits: commit 1560a335f7d548fb9eed564e8d2da03c2ef84b7a Author: Mike Kaganski <mike.kagan...@collabora.com> Date: Mon Nov 20 11:47:37 2017 +0200 SwDBManager: move implementation details from interface Change-Id: I738e8306f2f9af7f284cc236d55f5e184e632323 Reviewed-on: https://gerrit.libreoffice.org/44951 Tested-by: Jenkins <c...@libreoffice.org> Reviewed-by: Mike Kaganski <mike.kagan...@collabora.com> diff --git a/sw/inc/dbmgr.hxx b/sw/inc/dbmgr.hxx index eeac93d8f793..098e1a26f7f7 100644 --- a/sw/inc/dbmgr.hxx +++ b/sw/inc/dbmgr.hxx @@ -293,17 +293,6 @@ public: SwDBManager(SwDoc* pDoc); ~SwDBManager() COVERITY_NOEXCEPT_FALSE; - enum DBConnURITypes { - DBCONN_UNKNOWN = 0, - DBCONN_ODB, - DBCONN_CALC, - DBCONN_DBASE, - DBCONN_FLAT, - DBCONN_MSJET, - DBCONN_MSACE, - DBCONN_WRITER - }; - /// MailMergeEvent source const SwXMailMerge * GetMailMergeEvtSrc() const { return pMergeEvtSrc; } void SetMailMergeEvtSrc( const SwXMailMerge *pSrc ) { pMergeEvtSrc = pSrc; } @@ -406,8 +395,6 @@ public: static css::uno::Sequence<OUString> GetExistingDatabaseNames(); - static DBConnURITypes GetDBunoURI(const OUString &rURI, css::uno::Any &aURLAny); - /** Loads a data source from file and registers it. @@ -420,16 +407,6 @@ public: /** 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. - */ - static OUString LoadAndRegisterDataSource(const DBConnURITypes type, const css::uno::Any &rUnoURI, - const css::uno::Reference < css::beans::XPropertySet > *pSettings, - const OUString &rURI, const OUString *pPrefix, const OUString *pDestDir, - SwDocShell* pDocShell = nullptr); - /** - Loads a data source from file and registers it. - Convenience function, which calls GetDBunoURI and has just one mandatory parameter. In case of success it returns the registered name, otherwise an empty string. */ 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) _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits