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