diff options
author | Pascal Junck <pjunck@openoffice.org> | 2004-10-27 11:57:25 +0000 |
---|---|---|
committer | Pascal Junck <pjunck@openoffice.org> | 2004-10-27 11:57:25 +0000 |
commit | 86418819e06c5f7bac4bc0407ecb12a068c3078c (patch) | |
tree | 95b0ea36895348540e7d731e0ae887a78763f87b | |
parent | 6033975b929c2dd2a46a5edb871a2a196191a863 (diff) |
INTEGRATION: CWS dbwizard1 (1.1.2); FILE ADDED
2004/08/16 10:49:00 bc 1.1.2.1: #i20313#Classes for Datasource wizard checked in
-rw-r--r-- | dbaccess/source/ui/dlg/ConnectionHelper.cxx | 970 |
1 files changed, 970 insertions, 0 deletions
diff --git a/dbaccess/source/ui/dlg/ConnectionHelper.cxx b/dbaccess/source/ui/dlg/ConnectionHelper.cxx new file mode 100644 index 000000000000..e81974c21ea8 --- /dev/null +++ b/dbaccess/source/ui/dlg/ConnectionHelper.cxx @@ -0,0 +1,970 @@ +/************************************************************************* + * + * $RCSfile: ConnectionHelper.cxx,v $ + * + * $Revision: 1.2 $ + * + * last change: $Author: pjunck $ $Date: 2004-10-27 12:57:25 $ + * + * The Contents of this file are made available subject to the terms of + * either of the following licenses + * + * - GNU Lesser General Public License Version 2.1 + * - Sun Industry Standards Source License Version 1.1 + * + * Sun Microsystems Inc., October, 2000 + * + * GNU Lesser General Public License Version 2.1 + * ============================================= + * Copyright 2000 by Sun Microsystems, Inc. + * 901 San Antonio Road, Palo Alto, CA 94303, USA + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License version 2.1, as published by the Free Software Foundation. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + * + * + * Sun Industry Standards Source License Version 1.1 + * ================================================= + * The contents of this file are subject to the Sun Industry Standards + * Source License Version 1.1 (the "License"); You may not use this file + * except in compliance with the License. You may obtain a copy of the + * License at http://www.openoffice.org/license.html. + * + * Software provided under this License is provided on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING, + * WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS, + * MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING. + * See the License for the specific provisions governing your rights and + * obligations concerning the Software. + * + * The Initial Developer of the Original Code is: Sun Microsystems, Inc.. + * + * Copyright: 2000 by Sun Microsystems, Inc. + * + * All Rights Reserved. + * + * Contributor(s): Ocke Janssen + * + * + ************************************************************************/ + +#ifndef DBAUI_CONNECTIONHELPER_HXX +#include "ConnectionHelper.hxx" +#endif +#ifndef _DBAUI_MODULE_DBU_HXX_ +#include "moduledbu.hxx" +#endif +#ifndef _DBAUI_AUTOCONTROLS_HRC_ +#include "AutoControls.hrc" +#endif +#ifndef _DBU_DLG_HRC_ +#include "dbu_dlg.hrc" +#endif +#ifndef _SFXITEMSET_HXX +#include <svtools/itemset.hxx> +#endif +#ifndef INCLUDED_SVTOOLS_PATHOPTIONS_HXX +#include <svtools/pathoptions.hxx> +#endif +#ifndef _SFXSTRITEM_HXX +#include <svtools/stritem.hxx> +#endif +#ifndef _SFXENUMITEM_HXX +#include <svtools/eitem.hxx> +#endif +#ifndef _SFXINTITEM_HXX +#include <svtools/intitem.hxx> +#endif +#ifndef _DBAUI_DATASOURCEITEMS_HXX_ +#include "dsitems.hxx" +#endif +#ifndef _DBA_DBACCESS_HELPID_HRC_ +#include "dbaccess_helpid.hrc" +#endif +#ifndef _DBAUI_LOCALRESACCESS_HXX_ +#include "localresaccess.hxx" +#endif +#ifndef _OSL_PROCESS_H_ +#include <osl/process.h> +#endif +#ifndef _SV_MSGBOX_HXX +#include <vcl/msgbox.hxx> +#endif +#ifndef _FILEDLGHELPER_HXX +#include <sfx2/filedlghelper.hxx> +#endif +#ifndef _DBAUI_DBADMIN_HXX_ +#include "dbadmin.hxx" +#endif +#ifndef _COMPHELPER_TYPES_HXX_ +#include <comphelper/types.hxx> +#endif +#ifndef _VCL_STDTEXT_HXX +#include <vcl/stdtext.hxx> +#endif +#ifndef _DBAUI_SQLMESSAGE_HXX_ +#include "sqlmessage.hxx" +#endif +#ifndef _DBAUI_ODBC_CONFIG_HXX_ +#include "odbcconfig.hxx" +#endif +#ifndef _DBAUI_DSSELECT_HXX_ +#include "dsselect.hxx" +#endif +#ifndef SVTOOLS_FILENOTATION_HXX_ +#include <svtools/filenotation.hxx> +#endif +#ifndef DBACCESS_SHARED_DBUSTRINGS_HRC +#include "dbustrings.hrc" +#endif +#ifndef _COM_SUN_STAR_UI_DIALOGS_XFOLDERPICKER_HPP_ +#include <com/sun/star/ui/dialogs/XFolderPicker.hpp> +#endif +#ifndef _COM_SUN_STAR_SDBC_XROW_HPP_ +#include <com/sun/star/sdbc/XRow.hpp> +#endif +#ifndef _COM_SUN_STAR_AWT_XWINDOW_HPP_ +#include <com/sun/star/awt/XWindow.hpp> +#endif +// #106016# ------------------------------------ +#ifndef _COM_SUN_STAR_TASK_XINTERACTIONHANDLER_HPP_ +#include <com/sun/star/task/XInteractionHandler.hpp> +#endif +#ifndef _COM_SUN_STAR_TASK_XPROGRESSHANDLER_HPP_ +#include <com/sun/star/ucb/XProgressHandler.hpp> +#endif +#ifndef DBAUI_TOOLS_HXX +#include "UITools.hxx" +#endif +#ifndef _UNOTOOLS_LOCALFILEHELPER_HXX +#include <unotools/localfilehelper.hxx> +#endif +#ifndef _UNOTOOLS_UCBHELPER_HXX +#include <unotools/ucbhelper.hxx> +#endif +#ifndef _UCBHELPER_COMMANDENVIRONMENT_HXX +#include <ucbhelper/commandenvironment.hxx> +#endif +#ifndef DBAUI_FILEPICKER_INTERACTION_HXX +#include "finteraction.hxx" +#endif +#ifndef _CONNECTIVITY_COMMONTOOLS_HXX_ +#include <connectivity/CommonTools.hxx> +#endif +#ifndef _URLOBJ_HXX +#include <tools/urlobj.hxx> +#endif +#ifndef _SFX_DOCFILT_HACK_HXX +#include <sfx2/docfilt.hxx> +#endif +#if defined(WIN) || defined(WNT) +#define _ADO_DATALINK_BROWSE_ +#endif + +#ifdef _ADO_DATALINK_BROWSE_ +typedef void* HWND; +typedef void* HMENU; +#ifndef _SV_SYSDATA_HXX +#include <vcl/sysdata.hxx> +#endif +#ifndef _DBAUI_ADO_DATALINK_HXX_ +#include "adodatalinks.hxx" +#endif +#endif //_ADO_DATALINK_BROWSE_ + + + +//......................................................................... +namespace dbaui +{ +//......................................................................... + using namespace ::com::sun::star::uno; + using namespace ::com::sun::star::ucb; + using namespace ::com::sun::star::ui::dialogs; + using namespace ::com::sun::star::sdbc; + using namespace ::com::sun::star::beans; + using namespace ::com::sun::star::lang; + using namespace ::com::sun::star::container; + using namespace ::dbtools; + using namespace ::svt; + + + + OConnectionHelper::OConnectionHelper( Window* pParent, const ResId& _rId, const SfxItemSet& _rCoreAttrs) + :OGenericAdministrationPage(pParent, _rId, _rCoreAttrs) + ,m_aFT_Connection(this, ResId(FT_AUTOBROWSEURL)) + ,m_aET_Connection(this, ResId(ET_AUTOBROWSEURL)) + ,m_aPB_Connection(this, ResId(PB_AUTOBROWSEURL)) + { + // extract the datasource type collection from the item set + DbuTypeCollectionItem* pCollectionItem = PTR_CAST(DbuTypeCollectionItem, _rCoreAttrs.GetItem(DSID_TYPECOLLECTION)); + if (pCollectionItem) + m_pCollection = pCollectionItem->getCollection(); + m_aPB_Connection.SetClickHdl(LINK(this, OConnectionHelper, OnBrowseConnections)); + DBG_ASSERT(m_pCollection, "OConnectionHelper::OConnectionHelper : really need a DSN type collection !"); + } + + + OConnectionHelper::~OConnectionHelper() + { + } + + + // ----------------------------------------------------------------------- + void OConnectionHelper::implInitControls(const SfxItemSet& _rSet, sal_Bool _bSaveValue) + { + // check whether or not the selection is invalid or readonly (invalid implies readonly, but not vice versa) + sal_Bool bValid, bReadonly; + getFlags(_rSet, bValid, bReadonly); + + m_eType = m_pAdminDialog->getDatasourceType(_rSet); + + BOOL bEnableBrowseButton = m_pCollection->supportsBrowsing(m_eType); + m_aFT_Connection.Show(); + m_aET_Connection.Show(); + m_aET_Connection.ShowPrefix(FALSE); + m_aPB_Connection.Show(sal_True); + m_aET_Connection.ShowPrefix(FALSE); + + OLocalResourceAccess aLocRes( PAGE_CONNECTION, RSC_TABPAGE ); + + m_aPB_Connection.Show(bEnableBrowseButton); + + SFX_ITEMSET_GET(_rSet, pUrlItem, SfxStringItem, DSID_CONNECTURL, sal_True); + + // forward the values to the controls + if ( bValid ) + { + String sUrl = pUrlItem->GetValue(); + setURL( sUrl ); + + checkTestConnection(); + m_aET_Connection.ClearModifyFlag(); + } + OGenericAdministrationPage::implInitControls(_rSet, _bSaveValue); + } + + + + + // ----------------------------------------------------------------------- + IMPL_LINK(OConnectionHelper, OnBrowseConnections, PushButton*, _pButton) + { + OSL_ENSURE(m_pAdminDialog,"No Admin dialog set! ->GPF"); + switch ( m_eType ) + { + case DST_DBASE: + case DST_FLAT: + { + try + { + ::rtl::OUString sFolderPickerService = ::rtl::OUString::createFromAscii(SERVICE_UI_FOLDERPICKER); + Reference< XFolderPicker > xFolderPicker(m_xORB->createInstance(sFolderPickerService), UNO_QUERY); + if (!xFolderPicker.is()) + { + ShowServiceNotAvailableError(GetParent(), sFolderPickerService, sal_True); + break; + } + + sal_Bool bDoBrowse = sal_False; + String sOldPath = getURLNoPrefix(); + do + { + if (sOldPath.Len()) + xFolderPicker->setDisplayDirectory(sOldPath); + if (0 == xFolderPicker->execute()) + // cancelled by the user + return 0L; + + sOldPath = xFolderPicker->getDirectory(); + switch (checkPathExistence(sOldPath)) + { + case RET_RETRY: + bDoBrowse = sal_True; + break; + case RET_CANCEL: + return 0L; + default: + break; + } + } + while (bDoBrowse); + + String sSelectedDirectory = xFolderPicker->getDirectory(); + INetURLObject aSelectedDirectory( sSelectedDirectory, INetURLObject::WAS_ENCODED, RTL_TEXTENCODING_UTF8 ); + + // for UI purpose, we don't want to have the path encoded + sSelectedDirectory = aSelectedDirectory.GetMainURL( INetURLObject::DECODE_WITH_CHARSET, RTL_TEXTENCODING_UTF8 ); + + setURLNoPrefix( sSelectedDirectory ); + SetRoadmapStateValue(sal_True); + callModifiedHdl(); + } + catch(const Exception&) + { + DBG_ERROR("OConnectionHelper::OnBrowseConnections: caught an exception while browsing for the path!"); + } + } + break; + case DST_CALC: + { + static const String s_sCalcType = String::CreateFromAscii("StarOffice XML (Calc)"); + const SfxFilter* pFilter = SfxFilter::GetFilterByName( s_sCalcType); + OSL_ENSURE(pFilter,"Filter: StarOffice XML (Calc) could not be found!"); + askForFileName(pFilter->GetUIName(),pFilter->GetDefaultExtension()); + } + break; + case DST_MSACCESS: + { + ::rtl::OUString sExt(RTL_CONSTASCII_USTRINGPARAM("*.mdb")); + String sFilterName(ModuleRes (STR_MSACCESS_FILTERNAME)); + askForFileName(sFilterName,sExt); + } + break; + case DST_ADABAS: + { + // collect all names from the config dir + // and all dir's of the DBWORK/wrk or DBROOT/wrk dir + // compare the names + + // collect the names of the installed databases + StringBag aInstalledDBs; + ::rtl::OUString sAdabasConfigDir,sAdabasWorkDir,sRootDir; + ::rtl::OUString sTemp(RTL_CONSTASCII_USTRINGPARAM("DBWORK")); + rtl_uString* pDbVar = NULL; + if(osl_getEnvironment(sTemp.pData,&pDbVar) == osl_Process_E_None && pDbVar) + { + sAdabasWorkDir = pDbVar; + String sTemp; + sal_Bool bOk = utl::LocalFileHelper::ConvertPhysicalNameToURL(sAdabasWorkDir,sTemp); + sAdabasWorkDir = sTemp; + rtl_uString_release(pDbVar); + pDbVar = NULL; + } + + sTemp = ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("DBCONFIG")); + if(osl_getEnvironment(sTemp.pData,&pDbVar) == osl_Process_E_None && pDbVar) + { + sAdabasConfigDir = pDbVar; + String sTemp; + sal_Bool bOk = utl::LocalFileHelper::ConvertPhysicalNameToURL(sAdabasConfigDir,sTemp); + sAdabasConfigDir = sTemp; + rtl_uString_release(pDbVar); + pDbVar = NULL; + } + + sTemp = ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("DBROOT")); + if(osl_getEnvironment(sTemp.pData,&pDbVar) == osl_Process_E_None && pDbVar) + { + sRootDir = pDbVar; + String sTemp; + sal_Bool bOk = utl::LocalFileHelper::ConvertPhysicalNameToURL(sRootDir,sTemp); + sRootDir = sTemp; + rtl_uString_release(pDbVar); + pDbVar = NULL; + } + + sal_Bool bOldFashion = sAdabasConfigDir.getLength() && sAdabasWorkDir.getLength(); + + if(!bOldFashion) // we have a normal adabas installation + { // so we check the local database names in $DBROOT/config + sAdabasConfigDir = sRootDir; + sAdabasWorkDir = sRootDir; + } + + if(sAdabasConfigDir.getLength() && sAdabasWorkDir.getLength() && sRootDir.getLength()) + { + + aInstalledDBs = getInstalledAdabasDBs(sAdabasConfigDir,sAdabasWorkDir); + + if(!aInstalledDBs.size() && bOldFashion) + { + sAdabasConfigDir = sRootDir; + sAdabasWorkDir = sRootDir; + aInstalledDBs = getInstalledAdabasDBs(sAdabasConfigDir,sAdabasWorkDir); + } + + ODatasourceSelectDialog aSelector(GetParent(), aInstalledDBs, m_eType,m_pItemSetHelper->getWriteOutputSet()); + if (RET_OK == aSelector.Execute()) + { + setURLNoPrefix(aSelector.GetSelected()); + // checkCreateDatabase(DST_ADABAS); + SetRoadmapStateValue(sal_True); + callModifiedHdl(); + } + } + else + { + OLocalResourceAccess aLocRes( PAGE_CONNECTION, RSC_TABPAGE ); + String sError = String(ResId(STR_NO_ADABASE_DATASOURCES)); + ErrorBox aBox(this, WB_OK, sError); + aBox.Execute(); + } + } + break; + case DST_MYSQL_ODBC: + case DST_ODBC: + { + // collect all ODBC data source names + ::rtl::OUString sDataSource; + if ( getSelectedDataSource(m_eType,sDataSource) && sDataSource.getLength() ) + { + setURLNoPrefix(sDataSource); + SetRoadmapStateValue(sal_True); + callModifiedHdl(); + } + else + return 1L; + } + break; +#ifdef _ADO_DATALINK_BROWSE_ + case DST_ADO: + { + ::rtl::OUString sOldDataSource=getURLNoPrefix(); + ::rtl::OUString sNewDataSource; + HWND hWnd = GetParent()->GetSystemData()->hWnd; + sNewDataSource = getAdoDatalink((long)hWnd,sOldDataSource); + if ( sNewDataSource.getLength() ) + { + setURLNoPrefix(sNewDataSource); + SetRoadmapStateValue(sal_True); + callModifiedHdl(); + } + else + return 1L; + } + break; +#endif + + } + + checkTestConnection(); + + return 0L; + } + + //------------------------------------------------------------------------- + + bool OConnectionHelper::checkTestConnection() + { + return true; + } + + //------------------------------------------------------------------------- + void OConnectionHelper::implSetURL( const String& _rURL, sal_Bool _bPrefix ) + { + String sURL( _rURL ); + DBG_ASSERT( m_pCollection, "OConnectionHelper::setURL: have no interpreter for the URLs!" ); + + if ( m_pCollection && sURL.Len() ) + { + if ( m_pCollection->isFileSystemBased( m_eType ) ) + { + // get the tow parts: prefix and file URL + String sTypePrefix, sFileURLEncoded; + if ( _bPrefix ) + { + sTypePrefix = m_pCollection->getDatasourcePrefix( m_eType ); + sFileURLEncoded = m_pCollection->cutPrefix( sURL ); + } + else + { + sFileURLEncoded = sURL; + } + + // substitute any variables + sFileURLEncoded = SvtPathOptions().SubstituteVariable( sFileURLEncoded ); + + // decode the URL + sURL = sTypePrefix; + if ( sFileURLEncoded.Len() ) + { + OFileNotation aFileNotation(sFileURLEncoded); + // set this decoded URL as text + sURL += String(aFileNotation.get(OFileNotation::N_SYSTEM)); + } + } + } + + if ( _bPrefix ) + m_aET_Connection.SetText( sURL ); + else + m_aET_Connection.SetTextNoPrefix( sURL ); + } + + //------------------------------------------------------------------------- + String OConnectionHelper::implGetURL( sal_Bool _bPrefix ) const + { + // get the pure text + String sURL = _bPrefix ? m_aET_Connection.GetText() : m_aET_Connection.GetTextNoPrefix(); + + DBG_ASSERT( m_pCollection, "OConnectionHelper::implGetURL: have no interpreter for the URLs!" ); + + if ( m_pCollection && sURL.Len() ) + { + if ( m_pCollection->isFileSystemBased( m_eType ) ) + { + // get the tow parts: prefix and file URL + String sTypePrefix, sFileURLDecoded; + if ( _bPrefix ) + { + sTypePrefix = m_pCollection->getDatasourcePrefix( m_eType ); + sFileURLDecoded = m_pCollection->cutPrefix( sURL ); + } + else + { + sFileURLDecoded = sURL; + } + + // encode the URL + INetURLObject aFileURL( sFileURLDecoded, INetURLObject::ENCODE_ALL, RTL_TEXTENCODING_UTF8 ); + sFileURLDecoded = aFileURL.GetMainURL( INetURLObject::NO_DECODE ); + sURL = sTypePrefix; + if ( sFileURLDecoded.Len() ) + { + OFileNotation aFileNotation(sFileURLDecoded,OFileNotation::N_SYSTEM); + + // set this decoded URL as text + sURL += String(aFileNotation.get(OFileNotation::N_URL)); + } + } + } + return sURL; + } + //------------------------------------------------------------------------- + String OConnectionHelper::getURL( ) const + { + return implGetURL( sal_True ); + } + + //------------------------------------------------------------------------- + void OConnectionHelper::setURL( const String& _rURL ) + { + implSetURL( _rURL, sal_True ); + } + + //------------------------------------------------------------------------- + String OConnectionHelper::getURLNoPrefix( ) const + { + return implGetURL( sal_False ); + } + + //------------------------------------------------------------------------- + void OConnectionHelper::setURLNoPrefix( const String& _rURL ) + { + implSetURL( _rURL, sal_False ); + } + + //------------------------------------------------------------------------- + String OConnectionHelper::getConnectionURL( ) const + { + return getURL( ); + } + + //------------------------------------------------------------------------- + void OConnectionHelper::changeConnectionURL( const String& _rNewDSN ) + { + setURL( _rNewDSN ); + } + + //------------------------------------------------------------------------- + sal_Int32 OConnectionHelper::checkPathExistence(const String& _rURL) + { + IS_PATH_EXIST e_exists = pathExists(_rURL, sal_False); + if (( e_exists == PATH_NOT_EXIST) || ( e_exists == PATH_NOT_KNOWN)) + { + String sQuery(ModuleRes(STR_ASK_FOR_DIRECTORY_CREATION)); + OFileNotation aTransformer(_rURL); + sQuery.SearchAndReplaceAscii("$path$", aTransformer.get(OFileNotation::N_SYSTEM)); + + m_bUserGrabFocus = sal_False; + QueryBox aQuery(GetParent(), WB_YES_NO | WB_DEF_YES, sQuery); + sal_Int32 nQueryResult = aQuery.Execute(); + m_bUserGrabFocus = sal_True; + + switch (nQueryResult) + { + case RET_YES: + { + sal_Bool bTryCreate = sal_False; + do + { + if ( !createDirectoryDeep(_rURL) ) + { // could not create the directory + sQuery = String(ModuleRes(STR_COULD_NOT_CREATE_DIRECTORY)); + sQuery.SearchAndReplaceAscii("$name$", aTransformer.get(OFileNotation::N_SYSTEM)); + + m_bUserGrabFocus = sal_False; + QueryBox aWhatToDo(GetParent(), WB_RETRY_CANCEL | WB_DEF_RETRY, sQuery); + nQueryResult = aWhatToDo.Execute(); + m_bUserGrabFocus = sal_True; + + if (RET_RETRY == nQueryResult) + bTryCreate = sal_True; + else + { + SetRoadmapStateValue(sal_False); + callModifiedHdl(); + return RET_RETRY; + } + } + } + while (bTryCreate); + } + break; + + case RET_NO: + SetRoadmapStateValue(sal_False); + callModifiedHdl(); + return RET_OK; + + default: + // cancelled + SetRoadmapStateValue(sal_False); + callModifiedHdl(); + return RET_CANCEL; + } + } +/* else + { + // TODO: error msg + return RET_CANCEL; + } */ + SetRoadmapStateValue(sal_True); + callModifiedHdl(); + return RET_OK; + } + + + //------------------------------------------------------------------------- + StringBag OConnectionHelper::getInstalledAdabasDBDirs(const String& _rPath,const ::ucb::ResultSetInclude& _reResultSetInclude) + { + INetURLObject aNormalizer; + aNormalizer.SetSmartProtocol(INET_PROT_FILE); + aNormalizer.SetSmartURL(_rPath); + String sAdabasConfigDir = aNormalizer.GetMainURL(INetURLObject::NO_DECODE); + + ::ucb::Content aAdabasConfigDir; + try + { + aAdabasConfigDir = ::ucb::Content(sAdabasConfigDir, Reference< ::com::sun::star::ucb::XCommandEnvironment >()); + } + catch(::com::sun::star::ucb::ContentCreationException&) + { + return StringBag(); + } + + StringBag aInstalledDBs; + sal_Bool bIsFolder = sal_False; + try + { + bIsFolder = aAdabasConfigDir.isFolder(); + } + catch(Exception&) // the exception is thrown when the path doesn't exists + { + } + if (bIsFolder && aAdabasConfigDir.get().is()) + { // we have a content for the directory, loop through all entries + Sequence< ::rtl::OUString > aProperties(1); + aProperties[0] = ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("Title")); + + try + { + Reference< XResultSet > xFiles = aAdabasConfigDir.createCursor(aProperties, _reResultSetInclude); + Reference< XRow > xRow(xFiles, UNO_QUERY); + xFiles->beforeFirst(); + while (xFiles->next()) + { +#ifdef DBG_UTIL + ::rtl::OUString sName = xRow->getString(1); +#endif + aInstalledDBs.insert(xRow->getString(1)); + } + } + catch(Exception&) + { + DBG_ERROR("OConnectionHelper::getInstalledAdabasDBDirs: could not enumerate the adabas config files!"); + } + } + + + return aInstalledDBs; + } + // ----------------------------------------------------------------------------- + StringBag OConnectionHelper::getInstalledAdabasDBs(const String &_rConfigDir,const String &_rWorkDir) + { + String sAdabasConfigDir(_rConfigDir),sAdabasWorkDir(_rWorkDir); + + if (sAdabasConfigDir.Len() && ('/' == sAdabasConfigDir.GetBuffer()[sAdabasConfigDir.Len() - 1])) + sAdabasConfigDir.AppendAscii("config"); + else + sAdabasConfigDir.AppendAscii("/config"); + + if (sAdabasWorkDir.Len() && ('/' == sAdabasWorkDir.GetBuffer()[sAdabasWorkDir.Len() - 1])) + sAdabasWorkDir.AppendAscii("wrk"); + else + sAdabasWorkDir.AppendAscii("/wrk"); + // collect the names of the installed databases + StringBag aInstalledDBs; + // collect the names of the installed databases + StringBag aConfigDBs,aWrkDBs; + aConfigDBs = getInstalledAdabasDBDirs(sAdabasConfigDir,::ucb::INCLUDE_DOCUMENTS_ONLY); + aWrkDBs = getInstalledAdabasDBDirs(sAdabasWorkDir,::ucb::INCLUDE_FOLDERS_ONLY); + ConstStringBagIterator aOuter = aConfigDBs.begin(); + for(;aOuter != aConfigDBs.end();++aOuter) + { + ConstStringBagIterator aInner = aWrkDBs.begin(); + for (;aInner != aWrkDBs.end(); ++aInner) + { + if (aInner->equalsIgnoreAsciiCase(*aOuter)) + { + aInstalledDBs.insert(*aInner); + break; + } + } + } + return aInstalledDBs; + } + // #106016# ------------------------------------------------------------------- + IS_PATH_EXIST OConnectionHelper::pathExists(const ::rtl::OUString& _rURL, sal_Bool bIsFile) const + { + ::ucb::Content aCheckExistence; + sal_Bool bExists = sal_False; + IS_PATH_EXIST eExists = PATH_NOT_EXIST; + Reference< ::com::sun::star::task::XInteractionHandler > xInteractionHandler = Reference< ::com::sun::star::task::XInteractionHandler >( + m_xORB->createInstance( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("com.sun.star.task.InteractionHandler") ) ), UNO_QUERY ); + OFilePickerInteractionHandler* pHandler = new OFilePickerInteractionHandler(xInteractionHandler); + xInteractionHandler = pHandler; + + Reference< XCommandEnvironment > xCmdEnv = new ::ucb::CommandEnvironment( xInteractionHandler, Reference< XProgressHandler >() ); + try + { + aCheckExistence = ::ucb::Content(_rURL, xCmdEnv ); + bExists = bIsFile? aCheckExistence.isDocument(): aCheckExistence.isFolder(); + eExists = bExists? PATH_EXIST: PATH_NOT_EXIST; + } + catch(const Exception&) + { + eExists = ( pHandler && pHandler->isDoesNotExist() ) ? PATH_NOT_EXIST: (bIsFile ? PATH_NOT_EXIST : PATH_NOT_KNOWN); + } + return eExists; + } + //------------------------------------------------------------------------- + long OConnectionHelper::PreNotify( NotifyEvent& _rNEvt ) + { + if ( (DST_DBASE == m_eType) + || (DST_FLAT == m_eType) + || (DST_MSACCESS == m_eType) + || (DST_CALC == m_eType) ) + switch (_rNEvt.GetType()) + { + case EVENT_GETFOCUS: + if (m_aET_Connection.IsWindowOrChild(_rNEvt.GetWindow()) && m_bUserGrabFocus) + { // a descendant of the URL edit field got the focus + m_aET_Connection.SaveValueNoPrefix(); + } + break; + + case EVENT_LOSEFOCUS: + //if (m_aET_Connection.IsWindowOrChild(_rNEvt.GetWindow()) && m_bUserGrabFocus) + //{ // a descendant of the URL edit field lost the focus + // if (!commitURL()) + // return 1L; // handled + //} + break; + } + + return OGenericAdministrationPage::PreNotify( _rNEvt ); + } + + //------------------------------------------------------------------------- + + sal_Bool OConnectionHelper::createDirectoryDeep(const String& _rPathURL) + { + ::rtl::OUString sPath(_rPathURL); + + // get an URL object analyzing the URL for us ... + INetURLObject aParser; + aParser.SetURL(_rPathURL); + + INetProtocol eProtocol = aParser.GetProtocol(); + + ::std::vector< ::rtl::OUString > aToBeCreated; // the to-be-created levels + + // search a level which exists + // #106016# --------------------- + IS_PATH_EXIST eParentExists = PATH_NOT_EXIST; + while ( eParentExists == PATH_NOT_EXIST && aParser.getSegmentCount()) + { + aToBeCreated.push_back(aParser.getName()); // remember the local name for creation + aParser.removeSegment(); // cut the local name + eParentExists = pathExists(aParser.GetMainURL(INetURLObject::NO_DECODE), sal_False); + } + + if (!aParser.getSegmentCount()) + return sal_False; + + // create all the missing levels + try + { + // the parent content + Reference< XCommandEnvironment > xEmptyEnv; + ::ucb::Content aParent(aParser.GetMainURL(INetURLObject::NO_DECODE), xEmptyEnv); + + ::rtl::OUString sContentType; + if ( INET_PROT_FILE == eProtocol ) + { + sContentType = ::rtl::OUString::createFromAscii( "application/vnd.sun.staroffice.fsys-folder" ); + // the file UCP currently does not support the ContentType property + } + else + { + Any aContentType = aParent.getPropertyValue( ::rtl::OUString::createFromAscii( "ContentType" ) ); + aContentType >>= sContentType; + } + + // the properties which need to be set on the new content + Sequence< ::rtl::OUString > aNewDirectoryProperties(1); + aNewDirectoryProperties[0] = ::rtl::OUString::createFromAscii("Title"); + + // the values to be set + Sequence< Any > aNewDirectoryAttributes(1); + + // loop + for ( ::std::vector< ::rtl::OUString >::reverse_iterator aLocalName = aToBeCreated.rbegin(); + aLocalName != aToBeCreated.rend(); + ++aLocalName + ) + { + aNewDirectoryAttributes[0] <<= *aLocalName; + if (!aParent.insertNewContent(sContentType, aNewDirectoryProperties, aNewDirectoryAttributes, aParent)) + return sal_False; + } + } + catch (const Exception& e) + { + OSL_ENSURE( sal_False, "" ); + e; // make compiler happy + return sal_False; + } + + return sal_True; + } + + + // ----------------------------------------------------------------------- + void OConnectionHelper::fillWindows(::std::vector< ISaveValueWrapper* >& _rControlList) + { + _rControlList.push_back(new ODisableWrapper<FixedText>(&m_aFT_Connection)); + _rControlList.push_back(new ODisableWrapper<PushButton>(&m_aPB_Connection)); + } + + + // ----------------------------------------------------------------------- + void OConnectionHelper::fillControls(::std::vector< ISaveValueWrapper* >& _rControlList) + { + _rControlList.push_back(new OSaveValueWrapper<Edit>(&m_aET_Connection)); + } + + //------------------------------------------------------------------------- + sal_Bool OConnectionHelper::commitURL() + { + String sURL; + String sOldPath; + sOldPath = m_aET_Connection.GetSavedValueNoPrefix(); + sURL = m_aET_Connection.GetTextNoPrefix(); + if ( (DST_DBASE == m_eType) + || (DST_FLAT == m_eType) + || (DST_MSACCESS == m_eType) + || (DST_CALC == m_eType) ) + { + if ((sURL != sOldPath) && (0 != sURL.Len())) + { // the text changed since entering the control + + // the path may be in system notation .... + OFileNotation aTransformer(sURL); + sURL = aTransformer.get(OFileNotation::N_URL); + + if ( (DST_CALC == m_eType) || (DST_MSACCESS == m_eType) ) + { // #106016# -------------------------- + if( pathExists(sURL, sal_True) == PATH_NOT_EXIST ) + { + String sFile = String(ModuleRes(STR_CALCDOC_DOESNOTEXIST)); + sFile.SearchAndReplaceAscii("$file$", aTransformer.get(OFileNotation::N_SYSTEM)); + OSQLMessageBox(this,String(ModuleRes(STR_STAT_WARNING)),sFile).Execute(); + setURLNoPrefix(sOldPath); + SetRoadmapStateValue(sal_False); + callModifiedHdl(); + return sal_False; + } + else + { +// setURLNoPrefix(sURL); +// m_aET_Connection.SaveValueNoPrefix(); + } + } + else + { + switch (checkPathExistence(sURL)) + { + case RET_RETRY: + m_bUserGrabFocus = sal_False; + m_aET_Connection.GrabFocus(); + m_bUserGrabFocus = sal_True; + return sal_False; + + case RET_CANCEL: + setURLNoPrefix(sOldPath); + return sal_False; + + default: + // accept the input +// setURLNoPrefix(sURL); +// m_aET_Connection.SaveValueNoPrefix(); + break; + } + } + } + } + setURLNoPrefix(sURL); + m_aET_Connection.SaveValueNoPrefix(); + return sal_True; + } + + + + //------------------------------------------------------------------------- + void OConnectionHelper::askForFileName(const ::rtl::OUString& _sFilterName, const ::rtl::OUString& _sExtension) + { + ::sfx2::FileDialogHelper aFileDlg(WB_3DLOOK | WB_STDMODAL | WB_OPEN); + + aFileDlg.AddFilter(_sFilterName,_sExtension); + aFileDlg.SetCurrentFilter(_sFilterName); + + String sOldPath = getURLNoPrefix(); + if ( sOldPath.Len() ) + aFileDlg.SetDisplayDirectory(sOldPath); + else + aFileDlg.SetDisplayDirectory( SvtPathOptions().GetWorkPath() ); + if (0 == aFileDlg.Execute()) + { + setURLNoPrefix(aFileDlg.GetPath()); + SetRoadmapStateValue(checkTestConnection()); + callModifiedHdl(); + } + } + +//......................................................................... +} // namespace dbaui +//......................................................................... |