1*2a97ec55SAndrew Rist /**************************************************************
2cdf0e10cSrcweir  *
3*2a97ec55SAndrew Rist  * Licensed to the Apache Software Foundation (ASF) under one
4*2a97ec55SAndrew Rist  * or more contributor license agreements.  See the NOTICE file
5*2a97ec55SAndrew Rist  * distributed with this work for additional information
6*2a97ec55SAndrew Rist  * regarding copyright ownership.  The ASF licenses this file
7*2a97ec55SAndrew Rist  * to you under the Apache License, Version 2.0 (the
8*2a97ec55SAndrew Rist  * "License"); you may not use this file except in compliance
9*2a97ec55SAndrew Rist  * with the License.  You may obtain a copy of the License at
10*2a97ec55SAndrew Rist  *
11*2a97ec55SAndrew Rist  *   http://www.apache.org/licenses/LICENSE-2.0
12*2a97ec55SAndrew Rist  *
13*2a97ec55SAndrew Rist  * Unless required by applicable law or agreed to in writing,
14*2a97ec55SAndrew Rist  * software distributed under the License is distributed on an
15*2a97ec55SAndrew Rist  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*2a97ec55SAndrew Rist  * KIND, either express or implied.  See the License for the
17*2a97ec55SAndrew Rist  * specific language governing permissions and limitations
18*2a97ec55SAndrew Rist  * under the License.
19*2a97ec55SAndrew Rist  *
20*2a97ec55SAndrew Rist  *************************************************************/
21*2a97ec55SAndrew Rist 
22*2a97ec55SAndrew Rist 
23cdf0e10cSrcweir 
24cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove
25cdf0e10cSrcweir #include "precompiled_extensions.hxx"
26cdf0e10cSrcweir #include "fieldmappingimpl.hxx"
27cdf0e10cSrcweir #include <com/sun/star/lang/XMultiServiceFactory.hpp>
28cdf0e10cSrcweir #include <com/sun/star/beans/PropertyValue.hpp>
29cdf0e10cSrcweir #include <com/sun/star/beans/XPropertySet.hpp>
30cdf0e10cSrcweir #include <com/sun/star/ui/dialogs/XExecutableDialog.hpp>
31cdf0e10cSrcweir #include <com/sun/star/awt/XWindow.hpp>
32cdf0e10cSrcweir #include <com/sun/star/sdb/CommandType.hpp>
33cdf0e10cSrcweir #include <tools/debug.hxx>
34cdf0e10cSrcweir #ifndef _TOOLKIT_HELPER_VCLUNOHELPER_HXX_
35cdf0e10cSrcweir #include <toolkit/unohlp.hxx>
36cdf0e10cSrcweir #endif
37cdf0e10cSrcweir #include <vcl/stdtext.hxx>
38cdf0e10cSrcweir #include <com/sun/star/util/AliasProgrammaticPair.hpp>
39cdf0e10cSrcweir #ifndef EXTENSIONS_ABPRESID_HRC
40cdf0e10cSrcweir #include "abpresid.hrc"
41cdf0e10cSrcweir #endif
42cdf0e10cSrcweir #include "componentmodule.hxx"
43cdf0e10cSrcweir #include <unotools/confignode.hxx>
44cdf0e10cSrcweir 
45cdf0e10cSrcweir //.........................................................................
46cdf0e10cSrcweir namespace abp
47cdf0e10cSrcweir {
48cdf0e10cSrcweir //.........................................................................
49cdf0e10cSrcweir 
50cdf0e10cSrcweir 	using namespace ::utl;
51cdf0e10cSrcweir 	using namespace ::com::sun::star::uno;
52cdf0e10cSrcweir 	using namespace ::com::sun::star::awt;
53cdf0e10cSrcweir 	using namespace ::com::sun::star::util;
54cdf0e10cSrcweir 	using namespace ::com::sun::star::lang;
55cdf0e10cSrcweir 	using namespace ::com::sun::star::beans;
56cdf0e10cSrcweir 	using namespace ::com::sun::star::sdb;
57cdf0e10cSrcweir 	using namespace ::com::sun::star::ui::dialogs;
58cdf0e10cSrcweir 
59cdf0e10cSrcweir 	//---------------------------------------------------------------------
lcl_getDriverSettingsNodeName()60cdf0e10cSrcweir 	static const ::rtl::OUString& lcl_getDriverSettingsNodeName()
61cdf0e10cSrcweir 	{
62cdf0e10cSrcweir 		static const ::rtl::OUString s_sDriverSettingsNodeName =
63cdf0e10cSrcweir 			::rtl::OUString::createFromAscii( "/org.openoffice.Office.DataAccess/DriverSettings/com.sun.star.comp.sdbc.MozabDriver" );
64cdf0e10cSrcweir 		return s_sDriverSettingsNodeName;
65cdf0e10cSrcweir 	}
66cdf0e10cSrcweir 
67cdf0e10cSrcweir 	//---------------------------------------------------------------------
lcl_getAddressBookNodeName()68cdf0e10cSrcweir 	static const ::rtl::OUString& lcl_getAddressBookNodeName()
69cdf0e10cSrcweir 	{
70cdf0e10cSrcweir 		static const ::rtl::OUString s_sAddressBookNodeName =
71cdf0e10cSrcweir 			::rtl::OUString::createFromAscii( "/org.openoffice.Office.DataAccess/AddressBook" );
72cdf0e10cSrcweir 		return s_sAddressBookNodeName;
73cdf0e10cSrcweir 	}
74cdf0e10cSrcweir 
75cdf0e10cSrcweir 	//.....................................................................
76cdf0e10cSrcweir 	namespace fieldmapping
77cdf0e10cSrcweir 	{
78cdf0e10cSrcweir 	//.....................................................................
79cdf0e10cSrcweir 
80cdf0e10cSrcweir 		//-----------------------------------------------------------------
invokeDialog(const Reference<XMultiServiceFactory> & _rxORB,class Window * _pParent,const Reference<XPropertySet> & _rxDataSource,AddressSettings & _rSettings)81cdf0e10cSrcweir 		sal_Bool invokeDialog( const Reference< XMultiServiceFactory >& _rxORB, class Window* _pParent,
82cdf0e10cSrcweir 			const Reference< XPropertySet >& _rxDataSource, AddressSettings& _rSettings ) SAL_THROW ( ( ) )
83cdf0e10cSrcweir 		{
84cdf0e10cSrcweir             _rSettings.aFieldMapping.clear();
85cdf0e10cSrcweir 
86cdf0e10cSrcweir 			DBG_ASSERT( _rxORB.is(), "fieldmapping::invokeDialog: invalid service factory!" );
87cdf0e10cSrcweir 			DBG_ASSERT( _rxDataSource.is(), "fieldmapping::invokeDialog: invalid data source!" );
88cdf0e10cSrcweir             if ( !_rxORB.is() || !_rxDataSource.is() )
89cdf0e10cSrcweir                 return sal_False;
90cdf0e10cSrcweir 
91cdf0e10cSrcweir 			try
92cdf0e10cSrcweir 			{
93cdf0e10cSrcweir 				// ........................................................
94cdf0e10cSrcweir 				// the parameters for creating the dialog
95cdf0e10cSrcweir 				Sequence< Any > aArguments(5);
96cdf0e10cSrcweir 				Any* pArguments = aArguments.getArray();
97cdf0e10cSrcweir 
98cdf0e10cSrcweir 				// the parent window
99cdf0e10cSrcweir 				Reference< XWindow > xDialogParent = VCLUnoHelper::GetInterface( _pParent );
100cdf0e10cSrcweir 				*pArguments++ <<= PropertyValue(::rtl::OUString::createFromAscii( "ParentWindow" ), -1, makeAny( xDialogParent ), PropertyState_DIRECT_VALUE);
101cdf0e10cSrcweir 
102cdf0e10cSrcweir 				// the data source to use
103cdf0e10cSrcweir 				*pArguments++ <<= PropertyValue(::rtl::OUString::createFromAscii( "DataSource" ), -1, makeAny( _rxDataSource ), PropertyState_DIRECT_VALUE);
104cdf0e10cSrcweir                 *pArguments++ <<= PropertyValue(::rtl::OUString::createFromAscii( "DataSourceName" ), -1, makeAny( (sal_Bool)_rSettings.bRegisterDataSource ? _rSettings.sRegisteredDataSourceName : _rSettings.sDataSourceName ), PropertyState_DIRECT_VALUE);
105cdf0e10cSrcweir 
106cdf0e10cSrcweir 				// the table to use
107cdf0e10cSrcweir 				*pArguments++ <<= PropertyValue(::rtl::OUString::createFromAscii( "Command" ), -1, makeAny( _rSettings.sSelectedTable ), PropertyState_DIRECT_VALUE);
108cdf0e10cSrcweir 
109cdf0e10cSrcweir 				// the title
110cdf0e10cSrcweir 				::rtl::OUString sTitle = String( ModuleRes( RID_STR_FIELDDIALOGTITLE ) );
111cdf0e10cSrcweir 				*pArguments++ <<= PropertyValue(::rtl::OUString::createFromAscii( "Title" ), -1, makeAny( sTitle ), PropertyState_DIRECT_VALUE);
112cdf0e10cSrcweir 
113cdf0e10cSrcweir 				// ........................................................
114cdf0e10cSrcweir 				// create an instance of the dialog service
115cdf0e10cSrcweir 				static ::rtl::OUString s_sAdressBookFieldAssignmentServiceName = ::rtl::OUString::createFromAscii( "com.sun.star.ui.AddressBookSourceDialog" );
116cdf0e10cSrcweir 				Reference< XExecutableDialog > xDialog(
117cdf0e10cSrcweir 					_rxORB->createInstanceWithArguments( s_sAdressBookFieldAssignmentServiceName, aArguments ),
118cdf0e10cSrcweir 					UNO_QUERY
119cdf0e10cSrcweir 				);
120cdf0e10cSrcweir 				if ( !xDialog.is( ) )
121cdf0e10cSrcweir 				{
122cdf0e10cSrcweir 					ShowServiceNotAvailableError( _pParent, s_sAdressBookFieldAssignmentServiceName, sal_True );
123cdf0e10cSrcweir 					return sal_False;
124cdf0e10cSrcweir 				}
125cdf0e10cSrcweir 
126cdf0e10cSrcweir 				// execute the dialog
127cdf0e10cSrcweir 				if ( xDialog->execute() )
128cdf0e10cSrcweir 				{
129cdf0e10cSrcweir 					// retrieve the field mapping as set by he user
130cdf0e10cSrcweir 					Reference< XPropertySet > xDialogProps( xDialog, UNO_QUERY );
131cdf0e10cSrcweir 
132cdf0e10cSrcweir 					Sequence< AliasProgrammaticPair > aMapping;
133cdf0e10cSrcweir #ifdef DBG_UTIL
134cdf0e10cSrcweir 					sal_Bool bSuccess =
135cdf0e10cSrcweir #endif
136cdf0e10cSrcweir 					xDialogProps->getPropertyValue( ::rtl::OUString::createFromAscii( "FieldMapping" ) ) >>= aMapping;
137cdf0e10cSrcweir 					DBG_ASSERT( bSuccess, "fieldmapping::invokeDialog: invalid property type for FieldMapping!" );
138cdf0e10cSrcweir 
139cdf0e10cSrcweir 					// and copy it into the map
140cdf0e10cSrcweir 					const AliasProgrammaticPair* pMapping = aMapping.getConstArray();
141cdf0e10cSrcweir 					const AliasProgrammaticPair* pMappingEnd = pMapping + aMapping.getLength();
142cdf0e10cSrcweir 					for (;pMapping != pMappingEnd; ++pMapping)
143cdf0e10cSrcweir 						_rSettings.aFieldMapping[ pMapping->ProgrammaticName ] = pMapping->Alias;
144cdf0e10cSrcweir 
145cdf0e10cSrcweir 					return sal_True;
146cdf0e10cSrcweir 				}
147cdf0e10cSrcweir 
148cdf0e10cSrcweir 			}
149cdf0e10cSrcweir 			catch(const Exception&)
150cdf0e10cSrcweir 			{
151cdf0e10cSrcweir 				DBG_ERROR("fieldmapping::invokeDialog: caught an exception while executing the dialog!");
152cdf0e10cSrcweir 			}
153cdf0e10cSrcweir 			return sal_False;
154cdf0e10cSrcweir 		}
155cdf0e10cSrcweir 
156cdf0e10cSrcweir 		//-----------------------------------------------------------------
defaultMapping(const Reference<XMultiServiceFactory> & _rxORB,MapString2String & _rFieldAssignment)157cdf0e10cSrcweir 		void defaultMapping(  const Reference< XMultiServiceFactory >& _rxORB, MapString2String& _rFieldAssignment ) SAL_THROW ( ( ) )
158cdf0e10cSrcweir 		{
159cdf0e10cSrcweir 			_rFieldAssignment.clear();
160cdf0e10cSrcweir 
161cdf0e10cSrcweir 			try
162cdf0e10cSrcweir 			{
163cdf0e10cSrcweir 				// what we have:
164cdf0e10cSrcweir 				// a) For the address data source, we need a mapping from programmatic names (1) to real column names
165cdf0e10cSrcweir 				// b) The SDBC driver has a fixed set of columns, which, when returned, are named according to
166cdf0e10cSrcweir 				//    some configuration entries. E.g., the driver displays the field which it knows contains
167cdf0e10cSrcweir 				//    the first name as "First Name" - the latter string is stored in the config.
168cdf0e10cSrcweir 				//    For this, the driver uses programmatic names, too, but they differ from the programmatic names the
169cdf0e10cSrcweir 				//    template documents have.
170cdf0e10cSrcweir 				// So what we need first is a mapping from programmatic names (1) to programmatic names (2)
171cdf0e10cSrcweir 				const sal_Char* pMappingProgrammatics[] =
172cdf0e10cSrcweir 				{
173cdf0e10cSrcweir 					"FirstName",			"FirstName",
174cdf0e10cSrcweir 					"LastName",				"LastName",
175cdf0e10cSrcweir 					"Street",				"HomeAddress",
176cdf0e10cSrcweir 					"Zip",					"HomeZipCode",
177cdf0e10cSrcweir 					"City",					"HomeCity",
178cdf0e10cSrcweir 					"State",				"HomeState",
179cdf0e10cSrcweir 					"Country",				"HomeCountry",
180cdf0e10cSrcweir 					"PhonePriv",			"HomePhone",
181cdf0e10cSrcweir 					"PhoneComp",			"WorkPhone",
182cdf0e10cSrcweir 					"PhoneCell",			"CellularNumber",
183cdf0e10cSrcweir 					"Pager",				"PagerNumber",
184cdf0e10cSrcweir 					"Fax",					"FaxNumber",
185cdf0e10cSrcweir 					"EMail",				"PrimaryEmail",
186cdf0e10cSrcweir 					"URL",					"WebPage1",
187cdf0e10cSrcweir 					"Note",					"Notes",
188cdf0e10cSrcweir 					"Altfield1",			"Custom1",
189cdf0e10cSrcweir 					"Altfield2",			"Custom2",
190cdf0e10cSrcweir 					"Altfield3",			"Custom3",
191cdf0e10cSrcweir 					"Altfield4",			"Custom4",
192cdf0e10cSrcweir 					"Title",				"JobTitle",
193cdf0e10cSrcweir 					"Company",				"Company",
194cdf0e10cSrcweir 					"Department",			"Department"
195cdf0e10cSrcweir 				};
196cdf0e10cSrcweir 					// (this list is not complete: both lists of programmatic names are larger in real,
197cdf0e10cSrcweir 					// but this list above is the intersection)
198cdf0e10cSrcweir 
199cdf0e10cSrcweir 
200cdf0e10cSrcweir 				// access the configuration information which the driver uses for determining it's column names
201cdf0e10cSrcweir 				::rtl::OUString sDriverAliasesNodeName = lcl_getDriverSettingsNodeName();
202cdf0e10cSrcweir 				sDriverAliasesNodeName += ::rtl::OUString::createFromAscii( "/ColumnAliases" );
203cdf0e10cSrcweir 
204cdf0e10cSrcweir 				// create a config node for this
205cdf0e10cSrcweir 				OConfigurationTreeRoot aDriverFieldAliasing = OConfigurationTreeRoot::createWithServiceFactory(
206cdf0e10cSrcweir 					_rxORB, sDriverAliasesNodeName, -1, OConfigurationTreeRoot::CM_READONLY);
207cdf0e10cSrcweir 
208cdf0e10cSrcweir 				// loop through all programmatic pairs
209cdf0e10cSrcweir 				DBG_ASSERT( 0 == ( sizeof( pMappingProgrammatics ) / sizeof( pMappingProgrammatics[ 0 ] ) ) % 2,
210cdf0e10cSrcweir 					"fieldmapping::defaultMapping: invalid programmatic map!" );
211cdf0e10cSrcweir 				// number of pairs
212cdf0e10cSrcweir 				sal_Int32 nIntersectedProgrammatics = sizeof( pMappingProgrammatics ) / sizeof( pMappingProgrammatics[ 0 ] ) / 2;
213cdf0e10cSrcweir 
214cdf0e10cSrcweir 				const sal_Char** pProgrammatic = pMappingProgrammatics;
215cdf0e10cSrcweir 				::rtl::OUString sAddressProgrammatic;
216cdf0e10cSrcweir 				::rtl::OUString sDriverProgrammatic;
217cdf0e10cSrcweir 				::rtl::OUString sDriverUI;
218cdf0e10cSrcweir 				for	(	sal_Int32 i=0;
219cdf0e10cSrcweir 						i < nIntersectedProgrammatics;
220cdf0e10cSrcweir 						++i
221cdf0e10cSrcweir 					)
222cdf0e10cSrcweir 				{
223cdf0e10cSrcweir 					sAddressProgrammatic = ::rtl::OUString::createFromAscii( *pProgrammatic++ );
224cdf0e10cSrcweir 					sDriverProgrammatic = ::rtl::OUString::createFromAscii( *pProgrammatic++ );
225cdf0e10cSrcweir 
226cdf0e10cSrcweir 					if ( aDriverFieldAliasing.hasByName( sDriverProgrammatic ) )
227cdf0e10cSrcweir 					{
228cdf0e10cSrcweir 						aDriverFieldAliasing.getNodeValue( sDriverProgrammatic ) >>= sDriverUI;
229cdf0e10cSrcweir 						if ( 0 == sDriverUI.getLength() )
230cdf0e10cSrcweir 						{
231cdf0e10cSrcweir 							DBG_ERROR( "fieldmapping::defaultMapping: invalid driver UI column name!");
232cdf0e10cSrcweir 						}
233cdf0e10cSrcweir 						else
234cdf0e10cSrcweir 							_rFieldAssignment[ sAddressProgrammatic ] = sDriverUI;
235cdf0e10cSrcweir 					}
236cdf0e10cSrcweir 					else
237cdf0e10cSrcweir 					{
238cdf0e10cSrcweir 						DBG_ERROR( "fieldmapping::defaultMapping: invalid driver programmatic name!" );
239cdf0e10cSrcweir 					}
240cdf0e10cSrcweir 				}
241cdf0e10cSrcweir 			}
242cdf0e10cSrcweir 			catch( const Exception& )
243cdf0e10cSrcweir 			{
244cdf0e10cSrcweir 				DBG_ERROR("fieldmapping::defaultMapping: code is assumed to throw no exceptions!");
245cdf0e10cSrcweir 					// the config nodes we're using herein should not do this ....
246cdf0e10cSrcweir 			}
247cdf0e10cSrcweir 		}
248cdf0e10cSrcweir 
249cdf0e10cSrcweir 		//-----------------------------------------------------------------
writeTemplateAddressFieldMapping(const Reference<XMultiServiceFactory> & _rxORB,const MapString2String & _rFieldAssignment)250cdf0e10cSrcweir 		void writeTemplateAddressFieldMapping( const Reference< XMultiServiceFactory >& _rxORB, const MapString2String& _rFieldAssignment ) SAL_THROW ( ( ) )
251cdf0e10cSrcweir 		{
252cdf0e10cSrcweir 			// want to have a non-const map for easier handling
253cdf0e10cSrcweir 			MapString2String aFieldAssignment( _rFieldAssignment );
254cdf0e10cSrcweir 
255cdf0e10cSrcweir 			// access the configuration information which the driver uses for determining it's column names
256cdf0e10cSrcweir 			const ::rtl::OUString& sAddressBookNodeName = lcl_getAddressBookNodeName();
257cdf0e10cSrcweir 
258cdf0e10cSrcweir 			// create a config node for this
259cdf0e10cSrcweir 			OConfigurationTreeRoot aAddressBookSettings = OConfigurationTreeRoot::createWithServiceFactory(
260cdf0e10cSrcweir 				_rxORB, sAddressBookNodeName, -1, OConfigurationTreeRoot::CM_UPDATABLE);
261cdf0e10cSrcweir 
262cdf0e10cSrcweir 			OConfigurationNode aFields = aAddressBookSettings.openNode( ::rtl::OUString::createFromAscii( "Fields" ) );
263cdf0e10cSrcweir 
264cdf0e10cSrcweir 			// loop through all existent fields
265cdf0e10cSrcweir 			Sequence< ::rtl::OUString > aExistentFields = aFields.getNodeNames();
266cdf0e10cSrcweir 			const ::rtl::OUString* pExistentFields = aExistentFields.getConstArray();
267cdf0e10cSrcweir 			const ::rtl::OUString* pExistentFieldsEnd = pExistentFields + aExistentFields.getLength();
268cdf0e10cSrcweir 
269cdf0e10cSrcweir 			const ::rtl::OUString sProgrammaticNodeName = ::rtl::OUString::createFromAscii( "ProgrammaticFieldName" );
270cdf0e10cSrcweir 			const ::rtl::OUString sAssignedNodeName = ::rtl::OUString::createFromAscii( "AssignedFieldName" );
271cdf0e10cSrcweir 
272cdf0e10cSrcweir 			for ( ; pExistentFields != pExistentFieldsEnd; ++pExistentFields )
273cdf0e10cSrcweir 			{
274cdf0e10cSrcweir #ifdef DBG_UTIL
275cdf0e10cSrcweir 				::rtl::OUString sRedundantProgrammaticName;
276cdf0e10cSrcweir 				aFields.openNode( *pExistentFields ).getNodeValue( sProgrammaticNodeName ) >>= sRedundantProgrammaticName;
277cdf0e10cSrcweir #endif
278cdf0e10cSrcweir 				DBG_ASSERT( sRedundantProgrammaticName == *pExistentFields,
279cdf0e10cSrcweir 					"fieldmapping::writeTemplateAddressFieldMapping: inconsistent config data!" );
280cdf0e10cSrcweir 					// there should be a redundancy in the config data .... if this asserts, there isn't anymore!
281cdf0e10cSrcweir 
282cdf0e10cSrcweir 				// do we have a new alias for the programmatic?
283cdf0e10cSrcweir 				MapString2StringIterator aPos = aFieldAssignment.find( *pExistentFields );
284cdf0e10cSrcweir 				if ( aFieldAssignment.end() != aPos )
285cdf0e10cSrcweir 				{	// yes
286cdf0e10cSrcweir 					// -> set a new value
287cdf0e10cSrcweir 					OConfigurationNode aExistentField = aFields.openNode( *pExistentFields );
288cdf0e10cSrcweir 					aExistentField.setNodeValue( sAssignedNodeName, makeAny( aPos->second ) );
289cdf0e10cSrcweir 					// and remove the mapping entry
290cdf0e10cSrcweir 					aFieldAssignment.erase( *pExistentFields );
291cdf0e10cSrcweir 				}
292cdf0e10cSrcweir 				else
293cdf0e10cSrcweir 				{	// no
294cdf0e10cSrcweir 					// -> remove it
295cdf0e10cSrcweir 					aFields.removeNode( *pExistentFields );
296cdf0e10cSrcweir 				}
297cdf0e10cSrcweir 			}
298cdf0e10cSrcweir 
299cdf0e10cSrcweir 			// now everything remaining in aFieldAssignment marks a mapping entry which was not present
300cdf0e10cSrcweir 			// in the config before
301cdf0e10cSrcweir 			for (	ConstMapString2StringIterator aNewMapping = aFieldAssignment.begin();
302cdf0e10cSrcweir 					aNewMapping != aFieldAssignment.end();
303cdf0e10cSrcweir 					++aNewMapping
304cdf0e10cSrcweir 				)
305cdf0e10cSrcweir 			{
306cdf0e10cSrcweir 				DBG_ASSERT( !aFields.hasByName( aNewMapping->first ),
307cdf0e10cSrcweir 					"fieldmapping::writeTemplateAddressFieldMapping: inconsistence!" );
308cdf0e10cSrcweir 					// in case the config node for the fields already has the node named <aNewMapping->first>,
309cdf0e10cSrcweir 					// the entry should have been removed from aNewMapping (in the above loop)
310cdf0e10cSrcweir 				OConfigurationNode aNewField =  aFields.createNode( aNewMapping->first );
311cdf0e10cSrcweir 				aNewField.setNodeValue( sProgrammaticNodeName, makeAny( aNewMapping->first ) );
312cdf0e10cSrcweir 				aNewField.setNodeValue( sAssignedNodeName, makeAny( aNewMapping->second ) );
313cdf0e10cSrcweir 			}
314cdf0e10cSrcweir 
315cdf0e10cSrcweir 			// commit the changes done
316cdf0e10cSrcweir 			aAddressBookSettings.commit();
317cdf0e10cSrcweir 		}
318cdf0e10cSrcweir 
319cdf0e10cSrcweir 	//.....................................................................
320cdf0e10cSrcweir 	}	// namespace fieldmapping
321cdf0e10cSrcweir 	//.....................................................................
322cdf0e10cSrcweir 
323cdf0e10cSrcweir 	//.....................................................................
324cdf0e10cSrcweir 	namespace addressconfig
325cdf0e10cSrcweir 	{
326cdf0e10cSrcweir 	//.....................................................................
327cdf0e10cSrcweir 
328cdf0e10cSrcweir 		//-----------------------------------------------------------------
writeTemplateAddressSource(const Reference<XMultiServiceFactory> & _rxORB,const::rtl::OUString & _rDataSourceName,const::rtl::OUString & _rTableName)329cdf0e10cSrcweir 		void writeTemplateAddressSource( const Reference< XMultiServiceFactory >& _rxORB,
330cdf0e10cSrcweir 			const ::rtl::OUString& _rDataSourceName, const ::rtl::OUString& _rTableName ) SAL_THROW ( ( ) )
331cdf0e10cSrcweir 		{
332cdf0e10cSrcweir 			// access the configuration information which the driver uses for determining it's column names
333cdf0e10cSrcweir 			const ::rtl::OUString& sAddressBookNodeName = lcl_getAddressBookNodeName();
334cdf0e10cSrcweir 
335cdf0e10cSrcweir 			// create a config node for this
336cdf0e10cSrcweir 			OConfigurationTreeRoot aAddressBookSettings = OConfigurationTreeRoot::createWithServiceFactory(
337cdf0e10cSrcweir 				_rxORB, sAddressBookNodeName, -1, OConfigurationTreeRoot::CM_UPDATABLE);
338cdf0e10cSrcweir 
339cdf0e10cSrcweir 			aAddressBookSettings.setNodeValue( ::rtl::OUString::createFromAscii( "DataSourceName" ), makeAny( _rDataSourceName ) );
340cdf0e10cSrcweir 			aAddressBookSettings.setNodeValue( ::rtl::OUString::createFromAscii( "Command" ), makeAny( _rTableName ) );
341cdf0e10cSrcweir 			aAddressBookSettings.setNodeValue( ::rtl::OUString::createFromAscii( "CommandType" ), makeAny( (sal_Int32)CommandType::TABLE ) );
342cdf0e10cSrcweir 
343cdf0e10cSrcweir 			// commit the changes done
344cdf0e10cSrcweir 			aAddressBookSettings.commit();
345cdf0e10cSrcweir 		}
346cdf0e10cSrcweir 
347cdf0e10cSrcweir 		//-----------------------------------------------------------------
markPilotSuccess(const Reference<XMultiServiceFactory> & _rxORB)348cdf0e10cSrcweir 		void markPilotSuccess( const Reference< XMultiServiceFactory >& _rxORB ) SAL_THROW ( ( ) )
349cdf0e10cSrcweir 		{
350cdf0e10cSrcweir 			// access the configuration information which the driver uses for determining it's column names
351cdf0e10cSrcweir 			const ::rtl::OUString& sAddressBookNodeName = lcl_getAddressBookNodeName();
352cdf0e10cSrcweir 
353cdf0e10cSrcweir 			// create a config node for this
354cdf0e10cSrcweir 			OConfigurationTreeRoot aAddressBookSettings = OConfigurationTreeRoot::createWithServiceFactory(
355cdf0e10cSrcweir 				_rxORB, sAddressBookNodeName, -1, OConfigurationTreeRoot::CM_UPDATABLE);
356cdf0e10cSrcweir 
357cdf0e10cSrcweir 			// set the flag
358cdf0e10cSrcweir 			aAddressBookSettings.setNodeValue( ::rtl::OUString::createFromAscii( "AutoPilotCompleted" ), makeAny( (sal_Bool)sal_True ) );
359cdf0e10cSrcweir 
360cdf0e10cSrcweir 			// commit the changes done
361cdf0e10cSrcweir 			aAddressBookSettings.commit();
362cdf0e10cSrcweir 		}
363cdf0e10cSrcweir 
364cdf0e10cSrcweir 	//.....................................................................
365cdf0e10cSrcweir 	}	// namespace addressconfig
366cdf0e10cSrcweir 	//.....................................................................
367cdf0e10cSrcweir 
368cdf0e10cSrcweir //.........................................................................
369cdf0e10cSrcweir }	// namespace abp
370cdf0e10cSrcweir //.........................................................................
371cdf0e10cSrcweir 
372