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