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