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