1 /*************************************************************************
2  *
3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4  *
5  * Copyright 2000, 2010 Oracle and/or its affiliates.
6  *
7  * OpenOffice.org - a multi-platform office productivity suite
8  *
9  * This file is part of OpenOffice.org.
10  *
11  * OpenOffice.org is free software: you can redistribute it and/or modify
12  * it under the terms of the GNU Lesser General Public License version 3
13  * only, as published by the Free Software Foundation.
14  *
15  * OpenOffice.org is distributed in the hope that it will be useful,
16  * but WITHOUT ANY WARRANTY; without even the implied warranty of
17  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18  * GNU Lesser General Public License version 3 for more details
19  * (a copy is included in the LICENSE file that accompanied this code).
20  *
21  * You should have received a copy of the GNU Lesser General Public License
22  * version 3 along with OpenOffice.org.  If not, see
23  * <http://www.openoffice.org/license.html>
24  * for a copy of the LGPLv3 License.
25  *
26  ************************************************************************/
27 
28 // MARKER(update_precomp.py): autogen include statement, do not remove
29 #include "precompiled_cui.hxx"
30 #include "connpooloptions.hxx"
31 #include "dbregisterednamesconfig.hxx"
32 #include "dbregistersettings.hxx"
33 #include "svx/svxids.hrc"
34 #include <com/sun/star/container/XNameAccess.hpp>
35 #include <com/sun/star/sdb/XDatabaseRegistrations.hpp>
36 #include <comphelper/componentcontext.hxx>
37 #include <comphelper/extract.hxx>
38 #include <comphelper/processfactory.hxx>
39 #include <svl/eitem.hxx>
40 #include <svl/itemset.hxx>
41 #include <unotools/pathoptions.hxx>
42 #include <unotools/confignode.hxx>
43 #include <tools/diagnose_ex.h>
44 
45 //........................................................................
46 namespace svx
47 {
48 //........................................................................
49 
50 	using namespace ::utl;
51 	using namespace ::com::sun::star::uno;
52 	using namespace ::com::sun::star::sdb;
53 	using namespace ::com::sun::star::container;
54 
55 	//====================================================================
56 	//= DbRegisteredNamesConfig
57 	//====================================================================
58 	//--------------------------------------------------------------------
59 	void DbRegisteredNamesConfig::GetOptions( SfxItemSet& _rFillItems )
60 	{
61 		DatabaseRegistrations aSettings;
62 
63         try
64         {
65             ::comphelper::ComponentContext aContext( ::comphelper::getProcessServiceFactory() );
66             Reference< XDatabaseRegistrations > xRegistrations(
67                 aContext.createComponent( "com.sun.star.sdb.DatabaseContext" ), UNO_QUERY_THROW );
68 
69             Sequence< ::rtl::OUString > aRegistrationNames( xRegistrations->getRegistrationNames() );
70             const ::rtl::OUString* pRegistrationName = aRegistrationNames.getConstArray();
71             const ::rtl::OUString* pRegistrationNamesEnd = pRegistrationName + aRegistrationNames.getLength();
72             for ( ; pRegistrationName != pRegistrationNamesEnd; ++pRegistrationName )
73             {
74                 ::rtl::OUString sLocation( xRegistrations->getDatabaseLocation( *pRegistrationName ) );
75                 aSettings[ *pRegistrationName ] =
76                     DatabaseRegistration( sLocation, xRegistrations->isDatabaseRegistrationReadOnly( *pRegistrationName ) );
77             }
78         }
79         catch( const Exception& )
80         {
81         	DBG_UNHANDLED_EXCEPTION();
82         }
83 
84 		_rFillItems.Put( DatabaseMapItem( SID_SB_DB_REGISTER, aSettings ) );
85 	}
86 
87 	//--------------------------------------------------------------------
88 	void DbRegisteredNamesConfig::SetOptions(const SfxItemSet& _rSourceItems)
89 	{
90 		// the settings for the single drivers
91 		SFX_ITEMSET_GET( _rSourceItems, pRegistrations, DatabaseMapItem, SID_SB_DB_REGISTER, sal_True );
92 		if ( !pRegistrations )
93             return;
94 
95         try
96         {
97             ::comphelper::ComponentContext aContext( ::comphelper::getProcessServiceFactory() );
98             Reference< XDatabaseRegistrations > xRegistrations(
99                 aContext.createComponent( "com.sun.star.sdb.DatabaseContext" ), UNO_QUERY_THROW );
100 
101 		    const DatabaseRegistrations& rNewRegistrations = pRegistrations->getRegistrations();
102 		    for (	DatabaseRegistrations::const_iterator reg = rNewRegistrations.begin();
103 				    reg != rNewRegistrations.end();
104 				    ++reg
105 			    )
106 		    {
107                 const ::rtl::OUString sName = reg->first;
108                 const ::rtl::OUString sLocation = reg->second.sLocation;
109 
110 			    if ( xRegistrations->hasRegisteredDatabase( sName ) )
111                 {
112                     if ( !xRegistrations->isDatabaseRegistrationReadOnly( sName ) )
113                         xRegistrations->changeDatabaseLocation( sName, sLocation );
114                     else
115                     {
116                         OSL_ENSURE( xRegistrations->getDatabaseLocation( sName ) == sLocation,
117                             "DbRegisteredNamesConfig::SetOptions: somebody changed a read-only registration. How unrespectful." );
118                     }
119                 }
120                 else
121                     xRegistrations->registerDatabaseLocation( sName, sLocation );
122             }
123 
124             // delete unused entries
125             Sequence< ::rtl::OUString > aRegistrationNames = xRegistrations->getRegistrationNames();
126             const ::rtl::OUString* pRegistrationName = aRegistrationNames.getConstArray();
127             const ::rtl::OUString* pRegistrationNamesEnd = pRegistrationName + aRegistrationNames.getLength();
128             for ( ; pRegistrationName != pRegistrationNamesEnd; ++pRegistrationName )
129             {
130                 if ( rNewRegistrations.find( *pRegistrationName ) == rNewRegistrations.end() )
131                     xRegistrations->revokeDatabaseLocation( *pRegistrationName );
132             }
133         }
134         catch( const Exception& )
135         {
136         	DBG_UNHANDLED_EXCEPTION();
137         }
138 	}
139 
140 //........................................................................
141 }	// namespace svx
142 //........................................................................
143