1 /************************************************************************* 2 * 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 4 * 5 * Copyright 2000, 2010 Oracle and/or its affiliates. 6 * 7 * OpenOffice.org - a multi-platform office productivity suite 8 * 9 * This file is part of OpenOffice.org. 10 * 11 * OpenOffice.org is free software: you can redistribute it and/or modify 12 * it under the terms of the GNU Lesser General Public License version 3 13 * only, as published by the Free Software Foundation. 14 * 15 * OpenOffice.org is distributed in the hope that it will be useful, 16 * but WITHOUT ANY WARRANTY; without even the implied warranty of 17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 18 * GNU Lesser General Public License version 3 for more details 19 * (a copy is included in the LICENSE file that accompanied this code). 20 * 21 * You should have received a copy of the GNU Lesser General Public License 22 * version 3 along with OpenOffice.org. If not, see 23 * <http://www.openoffice.org/license.html> 24 * for a copy of the LGPLv3 License. 25 * 26 ************************************************************************/ 27 28 // MARKER(update_precomp.py): autogen include statement, do not remove 29 #include "precompiled_dbaccess.hxx" 30 31 #include "dsnItem.hxx" 32 #ifndef DBAUI_CONNECTIONHELPER_HXX 33 #include "ConnectionHelper.hxx" 34 #endif 35 #ifndef _DBAUI_AUTOCONTROLS_HRC_ 36 #include "AutoControls.hrc" 37 #endif 38 #ifndef _DBU_DLG_HRC_ 39 #include "dbu_dlg.hrc" 40 #endif 41 #ifndef _DBU_MISC_HRC_ 42 #include "dbu_misc.hrc" 43 #endif 44 #ifndef _SFXITEMSET_HXX 45 #include <svl/itemset.hxx> 46 #endif 47 #ifndef INCLUDED_SVTOOLS_MODULEOPTIONS_HXX 48 #include <unotools/moduleoptions.hxx> 49 #endif 50 #ifndef _SFX_FCONTNR_HXX 51 #include <sfx2/fcontnr.hxx> 52 #endif 53 #ifndef INCLUDED_SVTOOLS_PATHOPTIONS_HXX 54 #include <unotools/pathoptions.hxx> 55 #endif 56 #ifndef _SFXSTRITEM_HXX 57 #include <svl/stritem.hxx> 58 #endif 59 #ifndef _SFXENUMITEM_HXX 60 #include <svl/eitem.hxx> 61 #endif 62 #ifndef _SFXINTITEM_HXX 63 #include <svl/intitem.hxx> 64 #endif 65 #ifndef _DBAUI_DATASOURCEITEMS_HXX_ 66 #include "dsitems.hxx" 67 #endif 68 #ifndef _DBA_DBACCESS_HELPID_HRC_ 69 #include "dbaccess_helpid.hrc" 70 #endif 71 #ifndef _DBAUI_LOCALRESACCESS_HXX_ 72 #include "localresaccess.hxx" 73 #endif 74 #ifndef _OSL_PROCESS_H_ 75 #include <osl/process.h> 76 #endif 77 #ifndef _SV_MSGBOX_HXX 78 #include <vcl/msgbox.hxx> 79 #endif 80 #ifndef _FILEDLGHELPER_HXX 81 #include <sfx2/filedlghelper.hxx> 82 #endif 83 #ifndef _DBAUI_DBADMIN_HXX_ 84 #include "dbadmin.hxx" 85 #endif 86 #ifndef _COMPHELPER_TYPES_HXX_ 87 #include <comphelper/types.hxx> 88 #endif 89 #ifndef _VCL_STDTEXT_HXX 90 #include <vcl/stdtext.hxx> 91 #endif 92 #ifndef _DBAUI_SQLMESSAGE_HXX_ 93 #include "sqlmessage.hxx" 94 #endif 95 #ifndef _DBAUI_ODBC_CONFIG_HXX_ 96 #include "odbcconfig.hxx" 97 #endif 98 #ifndef _DBAUI_DSSELECT_HXX_ 99 #include "dsselect.hxx" 100 #endif 101 #ifndef SVTOOLS_FILENOTATION_HXX_ 102 #include <svl/filenotation.hxx> 103 #endif 104 #ifndef DBACCESS_SHARED_DBUSTRINGS_HRC 105 #include "dbustrings.hrc" 106 #endif 107 #ifndef _COM_SUN_STAR_UI_DIALOGS_XFOLDERPICKER_HPP_ 108 #include <com/sun/star/ui/dialogs/XFolderPicker.hpp> 109 #endif 110 #ifndef _COM_SUN_STAR_SDBC_XROW_HPP_ 111 #include <com/sun/star/sdbc/XRow.hpp> 112 #endif 113 #ifndef _COM_SUN_STAR_AWT_XWINDOW_HPP_ 114 #include <com/sun/star/awt/XWindow.hpp> 115 #endif 116 // #106016# ------------------------------------ 117 #ifndef _COM_SUN_STAR_TASK_XINTERACTIONHANDLER_HPP_ 118 #include <com/sun/star/task/XInteractionHandler.hpp> 119 #endif 120 #ifndef _COM_SUN_STAR_TASK_XPROGRESSHANDLER_HPP_ 121 #include <com/sun/star/ucb/XProgressHandler.hpp> 122 #endif 123 #ifndef DBAUI_TOOLS_HXX 124 #include "UITools.hxx" 125 #endif 126 #ifndef _UNOTOOLS_LOCALFILEHELPER_HXX 127 #include <unotools/localfilehelper.hxx> 128 #endif 129 #ifndef _UNOTOOLS_UCBHELPER_HXX 130 #include <unotools/ucbhelper.hxx> 131 #endif 132 #ifndef _UCBHELPER_COMMANDENVIRONMENT_HXX 133 #include <ucbhelper/commandenvironment.hxx> 134 #endif 135 #ifndef DBAUI_FILEPICKER_INTERACTION_HXX 136 #include "finteraction.hxx" 137 #endif 138 #ifndef _CONNECTIVITY_COMMONTOOLS_HXX_ 139 #include <connectivity/CommonTools.hxx> 140 #endif 141 #ifndef _URLOBJ_HXX 142 #include <tools/urlobj.hxx> 143 #endif 144 #ifndef TOOLS_DIAGNOSE_EX_H 145 #include <tools/diagnose_ex.h> 146 #endif 147 #ifndef _SFX_DOCFILT_HACK_HXX 148 #include <sfx2/docfilt.hxx> 149 #endif 150 #if !defined(WINDOWS_VISTA_PSDK) && defined(WNT) 151 #define _ADO_DATALINK_BROWSE_ 152 #endif 153 154 #ifdef _ADO_DATALINK_BROWSE_ 155 #if defined( WNT ) 156 #include <tools/prewin.h> 157 #include <windows.h> 158 #include <tools/postwin.h> 159 #endif 160 #ifndef _SV_SYSDATA_HXX 161 #include <vcl/sysdata.hxx> 162 #endif 163 #ifndef _DBAUI_ADO_DATALINK_HXX_ 164 #include "adodatalinks.hxx" 165 #endif 166 #endif //_ADO_DATALINK_BROWSE_ 167 168 #ifndef _COM_SUN_STAR_MOZILLA_XMOZILLABOOTSTRAP_HPP_ 169 #include <com/sun/star/mozilla/XMozillaBootstrap.hpp> 170 #endif 171 #include <unotools/processfactory.hxx> 172 173 174 175 //......................................................................... 176 namespace dbaui 177 { 178 //......................................................................... 179 using namespace ::com::sun::star::uno; 180 using namespace ::com::sun::star::ucb; 181 using namespace ::com::sun::star::ui::dialogs; 182 using namespace ::com::sun::star::sdbc; 183 using namespace ::com::sun::star::beans; 184 using namespace ::com::sun::star::lang; 185 using namespace ::com::sun::star::container; 186 using namespace ::com::sun::star::mozilla; 187 using namespace ::dbtools; 188 using namespace ::svt; 189 190 191 DBG_NAME(OConnectionHelper) 192 193 OConnectionHelper::OConnectionHelper( Window* pParent, const ResId& _rId, const SfxItemSet& _rCoreAttrs) 194 :OGenericAdministrationPage(pParent, _rId, _rCoreAttrs) 195 ,m_aFT_Connection ( this, ResId( FT_AUTOBROWSEURL, *_rId.GetResMgr() ) ) 196 ,m_aConnectionURL ( this, ResId( ET_AUTOBROWSEURL, *_rId.GetResMgr() ) ) 197 ,m_aPB_Connection ( this, ResId( PB_AUTOBROWSEURL, *_rId.GetResMgr() ) ) 198 { 199 DBG_CTOR(OConnectionHelper,NULL); 200 201 // extract the datasource type collection from the item set 202 DbuTypeCollectionItem* pCollectionItem = PTR_CAST(DbuTypeCollectionItem, _rCoreAttrs.GetItem(DSID_TYPECOLLECTION)); 203 if (pCollectionItem) 204 m_pCollection = pCollectionItem->getCollection(); 205 m_aPB_Connection.SetClickHdl(LINK(this, OConnectionHelper, OnBrowseConnections)); 206 DBG_ASSERT(m_pCollection, "OConnectionHelper::OConnectionHelper : really need a DSN type collection !"); 207 m_aConnectionURL.SetTypeCollection(m_pCollection); 208 } 209 210 211 OConnectionHelper::~OConnectionHelper() 212 { 213 214 DBG_DTOR(OConnectionHelper,NULL); 215 } 216 217 218 // ----------------------------------------------------------------------- 219 void OConnectionHelper::implInitControls(const SfxItemSet& _rSet, sal_Bool _bSaveValue) 220 { 221 // check whether or not the selection is invalid or readonly (invalid implies readonly, but not vice versa) 222 sal_Bool bValid, bReadonly; 223 getFlags(_rSet, bValid, bReadonly); 224 225 m_aFT_Connection.Show(); 226 m_aConnectionURL.Show(); 227 m_aConnectionURL.ShowPrefix( ::dbaccess::DST_JDBC == m_pCollection->determineType(m_eType) ); 228 229 sal_Bool bEnableBrowseButton = m_pCollection->supportsBrowsing( m_eType ); 230 m_aPB_Connection.Show( bEnableBrowseButton ); 231 232 SFX_ITEMSET_GET(_rSet, pUrlItem, SfxStringItem, DSID_CONNECTURL, sal_True); 233 234 // forward the values to the controls 235 if ( bValid ) 236 { 237 String sUrl = pUrlItem->GetValue(); 238 setURL( sUrl ); 239 240 checkTestConnection(); 241 m_aConnectionURL.ClearModifyFlag(); 242 } 243 244 OGenericAdministrationPage::implInitControls(_rSet, _bSaveValue); 245 } 246 247 // ----------------------------------------------------------------------- 248 void OConnectionHelper::implUpdateURLDependentStates() const 249 { 250 OSL_PRECOND( m_pAdminDialog, "OConnectionHelper::implUpdateURLDependentStates: no admin dialog!" ); 251 if ( !m_pAdminDialog ) 252 return; 253 254 if ( m_pCollection->isFileSystemBased(m_eType) ) 255 m_pAdminDialog->enableConfirmSettings( getURLNoPrefix().Len() > 0 ); 256 } 257 258 // ----------------------------------------------------------------------- 259 IMPL_LINK(OConnectionHelper, OnBrowseConnections, PushButton*, /*_pButton*/) 260 { 261 OSL_ENSURE(m_pAdminDialog,"No Admin dialog set! ->GPF"); 262 const ::dbaccess::DATASOURCE_TYPE eType = m_pCollection->determineType(m_eType); 263 switch ( eType ) 264 { 265 case ::dbaccess::DST_DBASE: 266 case ::dbaccess::DST_FLAT: 267 { 268 try 269 { 270 ::rtl::OUString sFolderPickerService = ::rtl::OUString::createFromAscii(SERVICE_UI_FOLDERPICKER); 271 Reference< XFolderPicker > xFolderPicker(m_xORB->createInstance(sFolderPickerService), UNO_QUERY); 272 if (!xFolderPicker.is()) 273 { 274 ShowServiceNotAvailableError(GetParent(), sFolderPickerService, sal_True); 275 break; 276 } 277 278 sal_Bool bDoBrowse = sal_False; 279 String sOldPath = getURLNoPrefix(); 280 do 281 { 282 if (sOldPath.Len()) 283 xFolderPicker->setDisplayDirectory(sOldPath); 284 if (0 == xFolderPicker->execute()) 285 // cancelled by the user 286 return 0L; 287 288 sOldPath = xFolderPicker->getDirectory(); 289 switch (checkPathExistence(sOldPath)) 290 { 291 case RET_RETRY: 292 bDoBrowse = sal_True; 293 break; 294 case RET_CANCEL: 295 return 0L; 296 default: 297 break; 298 } 299 } 300 while (bDoBrowse); 301 302 String sSelectedDirectory = xFolderPicker->getDirectory(); 303 INetURLObject aSelectedDirectory( sSelectedDirectory, INetURLObject::WAS_ENCODED, RTL_TEXTENCODING_UTF8 ); 304 305 // for UI purpose, we don't want to have the path encoded 306 sSelectedDirectory = aSelectedDirectory.GetMainURL( INetURLObject::DECODE_WITH_CHARSET, RTL_TEXTENCODING_UTF8 ); 307 308 setURLNoPrefix( sSelectedDirectory ); 309 SetRoadmapStateValue(sal_True); 310 callModifiedHdl(); 311 } 312 catch( const Exception& ) 313 { 314 DBG_UNHANDLED_EXCEPTION(); 315 } 316 } 317 break; 318 case ::dbaccess::DST_CALC: 319 { 320 SvtModuleOptions aModule; 321 ::sfx2::FileDialogHelper aFileDlg(WB_3DLOOK | WB_STDMODAL | WB_OPEN 322 ,aModule.GetFactoryEmptyDocumentURL(SvtModuleOptions::E_CALC) 323 ,SFX_FILTER_IMPORT); 324 askForFileName(aFileDlg); 325 } 326 break; 327 case ::dbaccess::DST_MSACCESS: 328 { 329 const ::rtl::OUString sExt(RTL_CONSTASCII_USTRINGPARAM("*.mdb")); 330 String sFilterName(ModuleRes (STR_MSACCESS_FILTERNAME)); 331 ::sfx2::FileDialogHelper aFileDlg(WB_3DLOOK | WB_STDMODAL | WB_OPEN); 332 aFileDlg.AddFilter(sFilterName,sExt); 333 aFileDlg.SetCurrentFilter(sFilterName); 334 askForFileName(aFileDlg); 335 } 336 break; 337 case ::dbaccess::DST_MSACCESS_2007: 338 { 339 const ::rtl::OUString sAccdb(RTL_CONSTASCII_USTRINGPARAM("*.accdb")); 340 String sFilterName2(ModuleRes (STR_MSACCESS_2007_FILTERNAME)); 341 ::sfx2::FileDialogHelper aFileDlg(WB_3DLOOK | WB_STDMODAL | WB_OPEN); 342 aFileDlg.AddFilter(sFilterName2,sAccdb); 343 aFileDlg.SetCurrentFilter(sFilterName2); 344 askForFileName(aFileDlg); 345 } 346 break; 347 case ::dbaccess::DST_ADABAS: 348 { 349 // collect all names from the config dir 350 // and all dir's of the DBWORK/wrk or DBROOT/wrk dir 351 // compare the names 352 353 // collect the names of the installed databases 354 StringBag aInstalledDBs; 355 ::rtl::OUString sAdabasConfigDir,sAdabasWorkDir,sRootDir; 356 ::rtl::OUString sEnvVarName(RTL_CONSTASCII_USTRINGPARAM("DBWORK")); 357 rtl_uString* pDbVar = NULL; 358 if(osl_getEnvironment(sEnvVarName.pData,&pDbVar) == osl_Process_E_None && pDbVar) 359 { 360 sAdabasWorkDir = pDbVar; 361 String sURL; 362 utl::LocalFileHelper::ConvertPhysicalNameToURL(sAdabasWorkDir,sURL); 363 sAdabasWorkDir = sURL; 364 rtl_uString_release(pDbVar); 365 pDbVar = NULL; 366 } 367 368 sEnvVarName = ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("DBCONFIG")); 369 if(osl_getEnvironment(sEnvVarName.pData,&pDbVar) == osl_Process_E_None && pDbVar) 370 { 371 sAdabasConfigDir = pDbVar; 372 String sURL; 373 utl::LocalFileHelper::ConvertPhysicalNameToURL(sAdabasConfigDir,sURL); 374 sAdabasConfigDir = sURL; 375 rtl_uString_release(pDbVar); 376 pDbVar = NULL; 377 } 378 379 sEnvVarName = ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("DBROOT")); 380 if(osl_getEnvironment(sEnvVarName.pData,&pDbVar) == osl_Process_E_None && pDbVar) 381 { 382 sRootDir = pDbVar; 383 String sURL; 384 utl::LocalFileHelper::ConvertPhysicalNameToURL(sRootDir,sURL); 385 sRootDir = sURL; 386 rtl_uString_release(pDbVar); 387 pDbVar = NULL; 388 } 389 390 sal_Bool bOldFashion = sAdabasConfigDir.getLength() && sAdabasWorkDir.getLength(); 391 392 if(!bOldFashion) // we have a normal adabas installation 393 { // so we check the local database names in $DBROOT/config 394 sAdabasConfigDir = sRootDir; 395 sAdabasWorkDir = sRootDir; 396 } 397 398 if(sAdabasConfigDir.getLength() && sAdabasWorkDir.getLength() && sRootDir.getLength()) 399 { 400 401 aInstalledDBs = getInstalledAdabasDBs(sAdabasConfigDir,sAdabasWorkDir); 402 403 if(!aInstalledDBs.size() && bOldFashion) 404 { 405 sAdabasConfigDir = sRootDir; 406 sAdabasWorkDir = sRootDir; 407 aInstalledDBs = getInstalledAdabasDBs(sAdabasConfigDir,sAdabasWorkDir); 408 } 409 410 ODatasourceSelectDialog aSelector(GetParent(), aInstalledDBs, true,m_pItemSetHelper->getWriteOutputSet()); 411 if (RET_OK == aSelector.Execute()) 412 { 413 setURLNoPrefix(aSelector.GetSelected()); 414 // checkCreateDatabase( ::dbaccess::DST_ADABAS); 415 SetRoadmapStateValue(sal_True); 416 callModifiedHdl(); 417 } 418 } 419 else 420 { 421 LocalResourceAccess aLocRes( PAGE_CONNECTION, RSC_TABPAGE ); 422 String sError = String(ModuleRes(STR_NO_ADABASE_DATASOURCES)); 423 ErrorBox aBox(this, WB_OK, sError); 424 aBox.Execute(); 425 } 426 } 427 break; 428 case ::dbaccess::DST_MYSQL_ODBC: 429 case ::dbaccess::DST_ODBC: 430 { 431 // collect all ODBC data source names 432 ::rtl::OUString sCurrDatasource = getURLNoPrefix(); 433 ::rtl::OUString sDataSource; 434 if ( getSelectedDataSource(sDataSource,sCurrDatasource) && sDataSource.getLength() ) 435 { 436 setURLNoPrefix(sDataSource); 437 SetRoadmapStateValue(sal_True); 438 callModifiedHdl(); 439 } 440 else 441 return 1L; 442 } 443 break; 444 #ifdef _ADO_DATALINK_BROWSE_ 445 case ::dbaccess::DST_ADO: 446 { 447 ::rtl::OUString sOldDataSource=getURLNoPrefix(); 448 ::rtl::OUString sNewDataSource; 449 HWND hWnd = GetParent()->GetSystemData()->hWnd; 450 sNewDataSource = getAdoDatalink((long)hWnd,sOldDataSource); 451 if ( sNewDataSource.getLength() ) 452 { 453 setURLNoPrefix(sNewDataSource); 454 SetRoadmapStateValue(sal_True); 455 callModifiedHdl(); 456 } 457 else 458 return 1L; 459 } 460 break; 461 #endif 462 case ::dbaccess::DST_MOZILLA: 463 case ::dbaccess::DST_THUNDERBIRD: 464 { 465 MozillaProductType profileType = MozillaProductType_Mozilla; 466 if (eType == ::dbaccess::DST_THUNDERBIRD) 467 profileType = MozillaProductType_Thunderbird; 468 469 Reference<XMultiServiceFactory> xFactory = ::comphelper::getProcessServiceFactory(); 470 OSL_ENSURE( xFactory.is(), "can't get service factory" ); 471 472 Reference<XInterface> xInstance = xFactory->createInstance(::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("com.sun.star.mozilla.MozillaBootstrap")) ); 473 OSL_ENSURE( xInstance.is(), "failed to create instance" ); 474 Reference<XMozillaBootstrap> xMozillaBootstrap = Reference<XMozillaBootstrap>(xInstance,UNO_QUERY); 475 OSL_ENSURE( xMozillaBootstrap.is(), "failed to create instance" ); 476 477 if (xMozillaBootstrap.is()) 478 { 479 // collect all Mozilla Profiles 480 ::com::sun::star::uno::Sequence< ::rtl::OUString > list; 481 482 xMozillaBootstrap->getProfileList( profileType, list ); 483 const ::rtl::OUString * pArray = list.getConstArray(); 484 485 sal_Int32 count = list.getLength(); 486 487 StringBag aProfiles; 488 for (sal_Int32 index=0; index < count; index++) 489 aProfiles.insert(pArray[index]); 490 491 492 // excute the select dialog 493 ODatasourceSelectDialog aSelector(GetParent(), aProfiles, eType); 494 ::rtl::OUString sOldProfile=getURLNoPrefix(); 495 496 if (sOldProfile.getLength()) 497 aSelector.Select(sOldProfile); 498 else 499 aSelector.Select(xMozillaBootstrap->getDefaultProfile(profileType)); 500 501 if ( RET_OK == aSelector.Execute() ) 502 setURLNoPrefix(aSelector.GetSelected()); 503 break; 504 } 505 } 506 default: 507 break; 508 } 509 510 checkTestConnection(); 511 512 return 0L; 513 } 514 515 //------------------------------------------------------------------------- 516 517 bool OConnectionHelper::checkTestConnection() 518 { 519 return true; 520 } 521 522 //------------------------------------------------------------------------- 523 void OConnectionHelper::impl_setURL( const String& _rURL, sal_Bool _bPrefix ) 524 { 525 String sURL( _rURL ); 526 DBG_ASSERT( m_pCollection, "OConnectionHelper::impl_setURL: have no interpreter for the URLs!" ); 527 528 if ( m_pCollection && sURL.Len() ) 529 { 530 if ( m_pCollection->isFileSystemBased( m_eType ) ) 531 { 532 // get the tow parts: prefix and file URL 533 String sTypePrefix, sFileURLEncoded; 534 if ( _bPrefix ) 535 { 536 sTypePrefix = m_pCollection->getPrefix( m_eType ); 537 sFileURLEncoded = m_pCollection->cutPrefix( sURL ); 538 } 539 else 540 { 541 sFileURLEncoded = sURL; 542 } 543 544 // substitute any variables 545 sFileURLEncoded = SvtPathOptions().SubstituteVariable( sFileURLEncoded ); 546 547 // decode the URL 548 sURL = sTypePrefix; 549 if ( sFileURLEncoded.Len() ) 550 { 551 OFileNotation aFileNotation(sFileURLEncoded); 552 // set this decoded URL as text 553 sURL += String(aFileNotation.get(OFileNotation::N_SYSTEM)); 554 } 555 } 556 } 557 558 if ( _bPrefix ) 559 m_aConnectionURL.SetText( sURL ); 560 else 561 m_aConnectionURL.SetTextNoPrefix( sURL ); 562 563 implUpdateURLDependentStates(); 564 } 565 566 //------------------------------------------------------------------------- 567 String OConnectionHelper::impl_getURL( sal_Bool _bPrefix ) const 568 { 569 // get the pure text 570 String sURL = _bPrefix ? m_aConnectionURL.GetText() : m_aConnectionURL.GetTextNoPrefix(); 571 572 DBG_ASSERT( m_pCollection, "OConnectionHelper::impl_getURL: have no interpreter for the URLs!" ); 573 574 if ( m_pCollection && sURL.Len() ) 575 { 576 if ( m_pCollection->isFileSystemBased( m_eType ) ) 577 { 578 // get the tow parts: prefix and file URL 579 String sTypePrefix, sFileURLDecoded; 580 if ( _bPrefix ) 581 { 582 sTypePrefix = m_pCollection->getPrefix( m_eType ); 583 sFileURLDecoded = m_pCollection->cutPrefix( sURL ); 584 } 585 else 586 { 587 sFileURLDecoded = sURL; 588 } 589 590 sURL = sTypePrefix; 591 if ( sFileURLDecoded.Len() ) 592 { 593 OFileNotation aFileNotation( sFileURLDecoded, OFileNotation::N_SYSTEM ); 594 sURL += String( aFileNotation.get( OFileNotation::N_URL ) ); 595 } 596 597 // encode the URL 598 INetURLObject aFileURL( sFileURLDecoded, INetURLObject::ENCODE_ALL, RTL_TEXTENCODING_UTF8 ); 599 sFileURLDecoded = aFileURL.GetMainURL( INetURLObject::NO_DECODE ); 600 } 601 } 602 return sURL; 603 } 604 605 //------------------------------------------------------------------------- 606 void OConnectionHelper::setURL( const String& _rURL ) 607 { 608 impl_setURL( _rURL, sal_True ); 609 } 610 611 //------------------------------------------------------------------------- 612 String OConnectionHelper::getURLNoPrefix( ) const 613 { 614 return impl_getURL( sal_False ); 615 } 616 617 //------------------------------------------------------------------------- 618 void OConnectionHelper::setURLNoPrefix( const String& _rURL ) 619 { 620 impl_setURL( _rURL, sal_False ); 621 } 622 623 //------------------------------------------------------------------------- 624 sal_Int32 OConnectionHelper::checkPathExistence(const String& _rURL) 625 { 626 IS_PATH_EXIST e_exists = pathExists(_rURL, sal_False); 627 if (( e_exists == PATH_NOT_EXIST) || ( e_exists == PATH_NOT_KNOWN)) 628 { 629 String sQuery(ModuleRes(STR_ASK_FOR_DIRECTORY_CREATION)); 630 OFileNotation aTransformer(_rURL); 631 sQuery.SearchAndReplaceAscii("$path$", aTransformer.get(OFileNotation::N_SYSTEM)); 632 633 m_bUserGrabFocus = sal_False; 634 QueryBox aQuery(GetParent(), WB_YES_NO | WB_DEF_YES, sQuery); 635 sal_Int32 nQueryResult = aQuery.Execute(); 636 m_bUserGrabFocus = sal_True; 637 638 switch (nQueryResult) 639 { 640 case RET_YES: 641 { 642 sal_Bool bTryCreate = sal_False; 643 do 644 { 645 if ( !createDirectoryDeep(_rURL) ) 646 { // could not create the directory 647 sQuery = String(ModuleRes(STR_COULD_NOT_CREATE_DIRECTORY)); 648 sQuery.SearchAndReplaceAscii("$name$", aTransformer.get(OFileNotation::N_SYSTEM)); 649 650 m_bUserGrabFocus = sal_False; 651 QueryBox aWhatToDo(GetParent(), WB_RETRY_CANCEL | WB_DEF_RETRY, sQuery); 652 nQueryResult = aWhatToDo.Execute(); 653 m_bUserGrabFocus = sal_True; 654 655 if (RET_RETRY == nQueryResult) 656 bTryCreate = sal_True; 657 else 658 { 659 SetRoadmapStateValue(sal_False); 660 callModifiedHdl(); 661 return RET_RETRY; 662 } 663 } 664 } 665 while (bTryCreate); 666 } 667 break; 668 669 case RET_NO: 670 // SetRoadmapStateValue(sal_False); 671 callModifiedHdl(); 672 return RET_OK; 673 674 default: 675 // cancelled 676 SetRoadmapStateValue(sal_False); 677 callModifiedHdl(); 678 return RET_CANCEL; 679 } 680 } 681 /* else 682 { 683 // TODO: error msg 684 return RET_CANCEL; 685 } */ 686 SetRoadmapStateValue(sal_True); 687 callModifiedHdl(); 688 return RET_OK; 689 } 690 691 692 //------------------------------------------------------------------------- 693 StringBag OConnectionHelper::getInstalledAdabasDBDirs(const String& _rPath,const ::ucbhelper::ResultSetInclude& _reResultSetInclude) 694 { 695 INetURLObject aNormalizer; 696 aNormalizer.SetSmartProtocol(INET_PROT_FILE); 697 aNormalizer.SetSmartURL(_rPath); 698 String sAdabasConfigDir = aNormalizer.GetMainURL(INetURLObject::NO_DECODE); 699 700 ::ucbhelper::Content aAdabasConfigDir; 701 try 702 { 703 aAdabasConfigDir = ::ucbhelper::Content(sAdabasConfigDir, Reference< ::com::sun::star::ucb::XCommandEnvironment >()); 704 } 705 catch(::com::sun::star::ucb::ContentCreationException&) 706 { 707 return StringBag(); 708 } 709 710 StringBag aInstalledDBs; 711 sal_Bool bIsFolder = sal_False; 712 try 713 { 714 bIsFolder = aAdabasConfigDir.isFolder(); 715 } 716 catch(Exception&) // the exception is thrown when the path doesn't exists 717 { 718 } 719 if (bIsFolder && aAdabasConfigDir.get().is()) 720 { // we have a content for the directory, loop through all entries 721 Sequence< ::rtl::OUString > aProperties(1); 722 aProperties[0] = ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("Title")); 723 724 try 725 { 726 Reference< XResultSet > xFiles = aAdabasConfigDir.createCursor(aProperties, _reResultSetInclude); 727 Reference< XRow > xRow(xFiles, UNO_QUERY); 728 xFiles->beforeFirst(); 729 while (xFiles->next()) 730 { 731 #ifdef DBG_UTIL 732 ::rtl::OUString sName = xRow->getString(1); 733 #endif 734 aInstalledDBs.insert(xRow->getString(1)); 735 } 736 } 737 catch(Exception&) 738 { 739 DBG_ERROR("OConnectionHelper::getInstalledAdabasDBDirs: could not enumerate the adabas config files!"); 740 } 741 } 742 743 744 return aInstalledDBs; 745 } 746 // ----------------------------------------------------------------------------- 747 StringBag OConnectionHelper::getInstalledAdabasDBs(const String &_rConfigDir,const String &_rWorkDir) 748 { 749 String sAdabasConfigDir(_rConfigDir),sAdabasWorkDir(_rWorkDir); 750 751 if (sAdabasConfigDir.Len() && ('/' == sAdabasConfigDir.GetBuffer()[sAdabasConfigDir.Len() - 1])) 752 sAdabasConfigDir.AppendAscii("config"); 753 else 754 sAdabasConfigDir.AppendAscii("/config"); 755 756 if (sAdabasWorkDir.Len() && ('/' == sAdabasWorkDir.GetBuffer()[sAdabasWorkDir.Len() - 1])) 757 sAdabasWorkDir.AppendAscii("wrk"); 758 else 759 sAdabasWorkDir.AppendAscii("/wrk"); 760 // collect the names of the installed databases 761 StringBag aInstalledDBs; 762 // collect the names of the installed databases 763 StringBag aConfigDBs,aWrkDBs; 764 aConfigDBs = getInstalledAdabasDBDirs(sAdabasConfigDir,::ucbhelper::INCLUDE_DOCUMENTS_ONLY); 765 aWrkDBs = getInstalledAdabasDBDirs(sAdabasWorkDir,::ucbhelper::INCLUDE_FOLDERS_ONLY); 766 ConstStringBagIterator aOuter = aConfigDBs.begin(); 767 ConstStringBagIterator aOuterEnd = aConfigDBs.end(); 768 for(;aOuter != aOuterEnd;++aOuter) 769 { 770 ConstStringBagIterator aInner = aWrkDBs.begin(); 771 ConstStringBagIterator aInnerEnd = aWrkDBs.end(); 772 for (;aInner != aInnerEnd; ++aInner) 773 { 774 if (aInner->equalsIgnoreAsciiCase(*aOuter)) 775 { 776 aInstalledDBs.insert(*aInner); 777 break; 778 } 779 } 780 } 781 return aInstalledDBs; 782 } 783 // #106016# ------------------------------------------------------------------- 784 IS_PATH_EXIST OConnectionHelper::pathExists(const ::rtl::OUString& _rURL, sal_Bool bIsFile) const 785 { 786 ::ucbhelper::Content aCheckExistence; 787 sal_Bool bExists = sal_False; 788 IS_PATH_EXIST eExists = PATH_NOT_EXIST; 789 Reference< ::com::sun::star::task::XInteractionHandler > xInteractionHandler = Reference< ::com::sun::star::task::XInteractionHandler >( 790 m_xORB->createInstance( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("com.sun.star.task.InteractionHandler") ) ), UNO_QUERY ); 791 OFilePickerInteractionHandler* pHandler = new OFilePickerInteractionHandler(xInteractionHandler); 792 xInteractionHandler = pHandler; 793 794 Reference< XCommandEnvironment > xCmdEnv = new ::ucbhelper::CommandEnvironment( xInteractionHandler, Reference< XProgressHandler >() ); 795 try 796 { 797 aCheckExistence = ::ucbhelper::Content(_rURL, xCmdEnv ); 798 bExists = bIsFile? aCheckExistence.isDocument(): aCheckExistence.isFolder(); 799 eExists = bExists? PATH_EXIST: PATH_NOT_EXIST; 800 } 801 catch(const Exception&) 802 { 803 eExists = ( pHandler && pHandler->isDoesNotExist() ) ? PATH_NOT_EXIST: (bIsFile ? PATH_NOT_EXIST : PATH_NOT_KNOWN); 804 } 805 return eExists; 806 } 807 //------------------------------------------------------------------------- 808 long OConnectionHelper::PreNotify( NotifyEvent& _rNEvt ) 809 { 810 if ( m_pCollection->isFileSystemBased(m_eType) ) 811 { 812 switch (_rNEvt.GetType()) 813 { 814 case EVENT_GETFOCUS: 815 if (m_aConnectionURL.IsWindowOrChild(_rNEvt.GetWindow()) && m_bUserGrabFocus) 816 { // a descendant of the URL edit field got the focus 817 m_aConnectionURL.SaveValueNoPrefix(); 818 } 819 break; 820 821 case EVENT_LOSEFOCUS: 822 if (m_aConnectionURL.IsWindowOrChild(_rNEvt.GetWindow()) && m_bUserGrabFocus) 823 { // a descendant of the URL edit field lost the focus 824 if (!commitURL()) 825 return 1L; // handled 826 } 827 break; 828 } // switch (_rNEvt.GetType()) 829 } 830 831 return OGenericAdministrationPage::PreNotify( _rNEvt ); 832 } 833 834 //------------------------------------------------------------------------- 835 836 sal_Bool OConnectionHelper::createDirectoryDeep(const String& _rPathURL) 837 { 838 ::rtl::OUString sPath(_rPathURL); 839 840 // get an URL object analyzing the URL for us ... 841 INetURLObject aParser; 842 aParser.SetURL(_rPathURL); 843 844 INetProtocol eProtocol = aParser.GetProtocol(); 845 846 ::std::vector< ::rtl::OUString > aToBeCreated; // the to-be-created levels 847 848 // search a level which exists 849 // #106016# --------------------- 850 IS_PATH_EXIST eParentExists = PATH_NOT_EXIST; 851 while ( eParentExists == PATH_NOT_EXIST && aParser.getSegmentCount()) 852 { 853 aToBeCreated.push_back(aParser.getName()); // remember the local name for creation 854 aParser.removeSegment(); // cut the local name 855 eParentExists = pathExists(aParser.GetMainURL(INetURLObject::NO_DECODE), sal_False); 856 } 857 858 if (!aParser.getSegmentCount()) 859 return sal_False; 860 861 // create all the missing levels 862 try 863 { 864 // the parent content 865 Reference< XCommandEnvironment > xEmptyEnv; 866 ::ucbhelper::Content aParent(aParser.GetMainURL(INetURLObject::NO_DECODE), xEmptyEnv); 867 868 ::rtl::OUString sContentType; 869 if ( INET_PROT_FILE == eProtocol ) 870 { 871 sContentType = ::rtl::OUString::createFromAscii( "application/vnd.sun.staroffice.fsys-folder" ); 872 // the file UCP currently does not support the ContentType property 873 } 874 else 875 { 876 Any aContentType = aParent.getPropertyValue( ::rtl::OUString::createFromAscii( "ContentType" ) ); 877 aContentType >>= sContentType; 878 } 879 880 // the properties which need to be set on the new content 881 Sequence< ::rtl::OUString > aNewDirectoryProperties(1); 882 aNewDirectoryProperties[0] = ::rtl::OUString::createFromAscii("Title"); 883 884 // the values to be set 885 Sequence< Any > aNewDirectoryAttributes(1); 886 887 // loop 888 for ( ::std::vector< ::rtl::OUString >::reverse_iterator aLocalName = aToBeCreated.rbegin(); 889 aLocalName != aToBeCreated.rend(); 890 ++aLocalName 891 ) 892 { 893 aNewDirectoryAttributes[0] <<= *aLocalName; 894 if (!aParent.insertNewContent(sContentType, aNewDirectoryProperties, aNewDirectoryAttributes, aParent)) 895 return sal_False; 896 } 897 } 898 catch ( const Exception& ) 899 { 900 DBG_UNHANDLED_EXCEPTION(); 901 return sal_False; 902 } 903 904 return sal_True; 905 } 906 907 908 // ----------------------------------------------------------------------- 909 void OConnectionHelper::fillWindows(::std::vector< ISaveValueWrapper* >& _rControlList) 910 { 911 _rControlList.push_back(new ODisableWrapper<FixedText>(&m_aFT_Connection)); 912 _rControlList.push_back(new ODisableWrapper<PushButton>(&m_aPB_Connection)); 913 } 914 915 916 // ----------------------------------------------------------------------- 917 void OConnectionHelper::fillControls(::std::vector< ISaveValueWrapper* >& _rControlList) 918 { 919 _rControlList.push_back( new OSaveValueWrapper<Edit>( &m_aConnectionURL ) ); 920 } 921 922 //------------------------------------------------------------------------- 923 sal_Bool OConnectionHelper::commitURL() 924 { 925 String sURL; 926 String sOldPath; 927 sOldPath = m_aConnectionURL.GetSavedValueNoPrefix(); 928 sURL = m_aConnectionURL.GetTextNoPrefix(); 929 930 if ( m_pCollection->isFileSystemBased(m_eType) ) 931 { 932 if ( ( sURL != sOldPath ) && ( 0 != sURL.Len() ) ) 933 { // the text changed since entering the control 934 935 // the path may be in system notation .... 936 OFileNotation aTransformer(sURL); 937 sURL = aTransformer.get(OFileNotation::N_URL); 938 939 const ::dbaccess::DATASOURCE_TYPE eType = m_pCollection->determineType(m_eType); 940 941 if ( ( ::dbaccess::DST_CALC == eType) || ( ::dbaccess::DST_MSACCESS == eType) || ( ::dbaccess::DST_MSACCESS_2007 == eType) ) 942 { // #106016# -------------------------- 943 if( pathExists(sURL, sal_True) == PATH_NOT_EXIST ) 944 { 945 String sFile = String( ModuleRes( STR_FILE_DOES_NOT_EXIST ) ); 946 sFile.SearchAndReplaceAscii("$file$", aTransformer.get(OFileNotation::N_SYSTEM)); 947 OSQLWarningBox( this, sFile ).Execute(); 948 setURLNoPrefix(sOldPath); 949 SetRoadmapStateValue(sal_False); 950 callModifiedHdl(); 951 return sal_False; 952 } 953 } 954 else 955 { 956 switch (checkPathExistence(sURL)) 957 { 958 case RET_RETRY: 959 m_bUserGrabFocus = sal_False; 960 m_aConnectionURL.GrabFocus(); 961 m_bUserGrabFocus = sal_True; 962 return sal_False; 963 964 case RET_CANCEL: 965 setURLNoPrefix(sOldPath); 966 return sal_False; 967 } 968 } 969 } 970 } 971 972 setURLNoPrefix(sURL); 973 m_aConnectionURL.SaveValueNoPrefix(); 974 return sal_True; 975 } 976 //------------------------------------------------------------------------- 977 void OConnectionHelper::askForFileName(::sfx2::FileDialogHelper& _aFileOpen) 978 { 979 String sOldPath = getURLNoPrefix(); 980 if ( sOldPath.Len() ) 981 _aFileOpen.SetDisplayDirectory(sOldPath); 982 else 983 _aFileOpen.SetDisplayDirectory( SvtPathOptions().GetWorkPath() ); 984 if (0 == _aFileOpen.Execute()) 985 { 986 setURLNoPrefix(_aFileOpen.GetPath()); 987 SetRoadmapStateValue(checkTestConnection()); 988 callModifiedHdl(); 989 } 990 } 991 992 //......................................................................... 993 } // namespace dbaui 994 //......................................................................... 995