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