diff -r 000000000000 -r e686773b3f54 phonebookui/Phonebook2/MapExtension/src/cpmapcmd.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/phonebookui/Phonebook2/MapExtension/src/cpmapcmd.cpp Tue Feb 02 10:12:17 2010 +0200 @@ -0,0 +1,1299 @@ +/* +* Copyright (c) 2005-2007 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: Execute Maps application. +* +*/ + +// INCLUDES +#include "cpmapcmd.h" + +// Phonebook 2 +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// Virtual Phonebook +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "MPbk2ContactEditorControlExtension.h" +#include +#include +#include +#include +#include + + + +// System includes +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// Debugging headers +#include + +_LIT( KGeoSeparator, ","); +const TInt KGeoSeparatorLength = 1; +const TReal32 KGeoHorizontalAccuracy = 0; +const TInt KGeoMaxSize = 50; +const TInt KGeoFormatWidth = 11; + +// -------------------------------------------------------------------------- +// CPmapCmd::CPmapCmd +// -------------------------------------------------------------------------- +// +CPmapCmd::CPmapCmd( MPbk2ContactEditorControl& aEditorControl, + MVPbkStoreContact& aContact, TInt aCommandId ) : + iEditorControl( &aEditorControl ), + iContact( &aContact ), + iCommandId( aCommandId ) + { + iAddressUpdatePrompt = ETrue; + } + +// -------------------------------------------------------------------------- +// CPmapCmd::CPmapCmd +// -------------------------------------------------------------------------- +// +CPmapCmd::CPmapCmd( MPbk2ContactUiControl& aUiControl, TInt aCommandId ) : + iUiControl( &aUiControl ), + iCommandId( aCommandId ) + { + iAddressUpdatePrompt = ETrue; + } + +// -------------------------------------------------------------------------- +// CPmapCmd::~CPmapCmd +// -------------------------------------------------------------------------- +// +CPmapCmd::~CPmapCmd() + { + if( iUiControl ) + { + iUiControl->RegisterCommand( NULL ); + } + delete iMapViewProvider; + } + +// -------------------------------------------------------------------------- +// CPmapCmd::NewL +// -------------------------------------------------------------------------- +// +CPmapCmd* CPmapCmd::NewL + ( MPbk2ContactEditorControl& aEditorControl, + MVPbkStoreContact& aContact, TInt aCommandId ) + { + CPmapCmd* self = new ( ELeave ) CPmapCmd + ( aEditorControl, aContact, aCommandId ); + CleanupStack::PushL( self ); + self->ConstructL(); + CleanupStack::Pop( self ); + return self; + } + +// -------------------------------------------------------------------------- +// CPmapCmd::NewL +// -------------------------------------------------------------------------- +// +CPmapCmd* CPmapCmd::NewL + ( MPbk2ContactUiControl& aUiControl, TInt aCommandId ) + { + CPmapCmd* self = new ( ELeave ) CPmapCmd + ( aUiControl, aCommandId ); + CleanupStack::PushL( self ); + self->ConstructL(); + CleanupStack::Pop( self ); + return self; + } + +// -------------------------------------------------------------------------- +// CPmapCmd::ConstructL +// -------------------------------------------------------------------------- +// +void CPmapCmd::ConstructL() + { + PBK2_DEBUG_PRINT(PBK2_DEBUG_STRING + ("CPmapCmd::ConstructL")); + + RPointerArray providers; + + MnProviderFinder::FindProvidersL( providers, CMnProvider::EServiceMapView ); + CleanupClosePushL( providers ); + if (providers.Count() > 0) + { + iMapViewProvider = providers[0]; + providers.Remove(0); + } + + providers.ResetAndDestroy(); + CleanupStack::PopAndDestroy( &providers ); + + if ( !iMapViewProvider ) + { + User::Leave( KErrGeneral ); + } + + if( iUiControl && ! iContact ) + { + iContact = const_cast(iUiControl->FocusedStoreContact()); + if( !iContact ) + { + iUiControl->RegisterCommand( this ); + const MVPbkViewContact* viewContact = iUiControl->FocusedViewContactL(); + if( viewContact ) + { + viewContact->ReadL(*this); + CActiveScheduler::Start(); + } + } + } + + User::LeaveIfNull(iContact); + + if( iCommandId == EPbk2ExtensionAssignFromMapSelect ) + { + iCommandId = EPbk2ExtensionAssignFromMap; + } + + PBK2_DEBUG_PRINT(PBK2_DEBUG_STRING + ("CPmapCmd::ConstructL end")); + } + +// -------------------------------------------------------------------------- +// CPmapCmd::CheckViewProviderL +// -------------------------------------------------------------------------- +// +TBool CPmapCmd::CheckViewProviderL() + { + TBool ret = EFalse; + RPointerArray providers; + + MnProviderFinder::FindProvidersL( providers, CMnProvider::EServiceMapView ); + + CleanupClosePushL(providers); + + if ( providers.Count() > 0 ) + { + ret = ETrue; + } + + providers.ResetAndDestroy(); + CleanupStack::PopAndDestroy( &providers ); + return ret; + } + +// -------------------------------------------------------------------------- +// CPmapCmd::ExecuteLD +// -------------------------------------------------------------------------- +// +void CPmapCmd::ExecuteLD() + { + CleanupStack::PushL( this ); + + PBK2_DEBUG_PRINT(PBK2_DEBUG_STRING + ("CPmapCmd::ExecuteLD")); + + iAddressUpdatePrompt = ETrue; + TPbk2FieldGroupId groupId = EPbk2FieldGroupIdNone; + if( !IsAddressInContact() ) + { + if( iCommandId == EPbk2ExtensionShowOnMap ) + { + HBufC* prompt = StringLoader::LoadLC( R_QTN_PHOB_NO_ADDRESS_DEFINE_NEW ); + CAknQueryDialog* dlg = CAknQueryDialog::NewL(); + if( dlg->ExecuteLD( R_PBK2_GENERAL_CONFIRMATION_QUERY, *prompt ) ) + { + CleanupStack::PopAndDestroy( prompt ); + groupId = EPbk2FieldGroupIdPostalAddress; + iCommandId = EPbk2ExtensionAssignFromMap; + } + else + { + CleanupStack::PopAndDestroy( prompt ); + FinishProcess(); + + if( !iUiControl ) + { + CleanupStack::PopAndDestroy( this ); + } + else + { + CleanupStack::Pop( this ); + } + + PBK2_DEBUG_PRINT(PBK2_DEBUG_STRING + ("CPmapCmd::ExecuteLD end")); + + return; + } + + } + else + { + groupId = EPbk2FieldGroupIdPostalAddress; + } + iAddressUpdatePrompt = EFalse; + } + + if( groupId == EPbk2FieldGroupIdNone ) + { + groupId = GetAddressFromEditorView(); + } + + if( groupId == EPbk2FieldGroupIdNone ) + { + groupId = GetAddressFromUiControl(); + } + + if( groupId == EPbk2FieldGroupIdNone ) + { + groupId = GetAddressIfIsAlone(); + } + + if( groupId == EPbk2FieldGroupIdNone ) + { + groupId = SelectAddressL(); + } + + if( groupId != EPbk2FieldGroupIdNone ) + { + TVPbkFieldTypeParameter addressType = Pbk2AddressTools::MapAddressToVersitParam( groupId ); + if( iCommandId == EPbk2ExtensionShowOnMap ) + { + EditorShowOnMapsL(addressType); + } + else if( iCommandId == EPbk2ExtensionAssignFromMap ) + { + EditorAssignFromMapsL(addressType); + } + } + + FinishProcess(); + + if( !iUiControl ) + { + CleanupStack::PopAndDestroy( this ); + } + else + { + CleanupStack::Pop( this ); + } + + PBK2_DEBUG_PRINT(PBK2_DEBUG_STRING + ("CPmapCmd::ExecuteLD end")); + } + +// -------------------------------------------------------------------------- +// CPmapCmd::GetAddressIfIsAlone +// -------------------------------------------------------------------------- +// +TPbk2FieldGroupId CPmapCmd::GetAddressIfIsAlone() + { + TPbk2FieldGroupId grupId = EPbk2FieldGroupIdNone; + MVPbkStoreContactFieldCollection& arrFields = iContact->Fields(); + TInt count = arrFields.FieldCount(); + for( TInt idx = 0; idx < count; idx++) + { + MVPbkStoreContactField& field = arrFields.FieldAt(idx); + TArray arrProp = field.BestMatchingFieldType()->VersitProperties(); + for( TInt idx2 = 0; idx2 < arrProp.Count(); idx2++) + { + if( arrProp[idx2].Name() == EVPbkVersitNameADR ) + { + if( arrProp[idx2].Parameters().Contains( EVPbkVersitParamHOME ) ) + { + if( grupId == EPbk2FieldGroupIdNone ) + { + grupId = EPbk2FieldGroupIdHomeAddress; + } + else if( grupId != EPbk2FieldGroupIdHomeAddress ) + { + return EPbk2FieldGroupIdNone; + } + } + else if( arrProp[idx2].Parameters().Contains( EVPbkVersitParamWORK ) ) + { + if( grupId == EPbk2FieldGroupIdNone ) + { + grupId = EPbk2FieldGroupIdCompanyAddress; + } + else if( grupId != EPbk2FieldGroupIdCompanyAddress ) + { + return EPbk2FieldGroupIdNone; + } + } + else + { + if( grupId == EPbk2FieldGroupIdNone ) + { + grupId = EPbk2FieldGroupIdPostalAddress; + } + else if( grupId != EPbk2FieldGroupIdPostalAddress ) + { + return EPbk2FieldGroupIdNone; + } + } + } + } + } + + return grupId; + } + +// -------------------------------------------------------------------------- +// CPmapCmd::GetAddressFromEditorView +// -------------------------------------------------------------------------- +// +TPbk2FieldGroupId CPmapCmd::GetAddressFromEditorView() + { + TPbk2FieldGroupId grupId = EPbk2FieldGroupIdNone; + if( ControlExtension() ) + { + grupId = Pbk2AddressTools::MapCtrlTypeToAddress( ControlExtension()->FocusedControlType() ); + } + + if( iEditorControl && grupId == EPbk2FieldGroupIdNone ) + { + TInt countControls = iEditorControl->NumberOfControls(); + for ( TInt idx = 0; idx < countControls; idx++ ) + { + MPbk2ContactEditorField& field = iEditorControl->EditorField( idx ); + + grupId = field.FieldProperty().GroupId(); + if( grupId == EPbk2FieldGroupIdPostalAddress || + grupId == EPbk2FieldGroupIdHomeAddress || + grupId == EPbk2FieldGroupIdCompanyAddress ) + { + iAddressView = ETrue; + break; + } + } + } + + return grupId; + } + +// -------------------------------------------------------------------------- +// CPmapCmd::GetAddressFromUiControl +// -------------------------------------------------------------------------- +// +TPbk2FieldGroupId CPmapCmd::GetAddressFromUiControl() + { + TPbk2FieldGroupId ret = EPbk2FieldGroupIdNone; + const MVPbkBaseContactField* field = NULL; + if( iUiControl ) + { + field = iUiControl->FocusedField(); + } + if( field ) + { + const MVPbkFieldType* type = field->BestMatchingFieldType(); + if( type ) + { + TArray arrProp = type->VersitProperties(); + for( TInt idx = 0; idx < arrProp.Count(); idx++) + { + if( arrProp[idx].Name() != EVPbkVersitNameADR ) + { + continue; + } + + if( arrProp[idx].Parameters().Contains( + Pbk2AddressTools::MapAddressToVersitParam( EPbk2FieldGroupIdHomeAddress ) ) ) + { + ret = EPbk2FieldGroupIdHomeAddress; + break; + } + else if( arrProp[idx].Parameters().Contains( + Pbk2AddressTools::MapAddressToVersitParam( EPbk2FieldGroupIdCompanyAddress ) ) ) + { + ret = EPbk2FieldGroupIdCompanyAddress; + break; + } + else + { + ret = EPbk2FieldGroupIdPostalAddress; + break; + } + } + } + } + + return ret; + } + +// -------------------------------------------------------------------------- +// CPmapCmd::SelectAddressL +// -------------------------------------------------------------------------- +// +TPbk2FieldGroupId CPmapCmd::SelectAddressL() + { + TPbk2FieldGroupId ret = EPbk2FieldGroupIdNone; + + TResourceReader resReader; + CCoeEnv::Static()->CreateResourceReaderLC + (resReader, R_PBK2_ADDRESS_SELECT); + + CPbk2ApplicationServices* appServices = + CPbk2ApplicationServices::InstanceLC(); + + TPbk2AddressSelectParams params( + *iContact, + appServices->ContactManager(), + appServices->NameFormatter(), + appServices->FieldProperties(), + resReader ); + if ( iCommandId == EPbk2ExtensionShowOnMap ) + { + params.iCommMethod = VPbkFieldTypeSelectorFactory::EFindOnMapSelector; + } + else + { + params.iCommMethod = VPbkFieldTypeSelectorFactory::EAssignFromMapSelector; + } + + CleanupStack::PopAndDestroy( appServices ); + CPbk2AddressSelect* addressSelect = CPbk2AddressSelect::NewL( params ); + MVPbkStoreContactField* selectedField = addressSelect->ExecuteLD(); + CleanupStack::PopAndDestroy(); // resReader + + if ( selectedField ) + { + CleanupDeletePushL( selectedField ); + ret = GetFieldGroupL( *selectedField ); + CleanupStack::PopAndDestroy( selectedField ); + } + + return ret; + } + +// -------------------------------------------------------------------------- +// CPmapCmd::ControlExtension +// -------------------------------------------------------------------------- +// +MPbk2ContactEditorControlExtension* CPmapCmd::ControlExtension() + { + if(iEditorControl && iEditorControl->ContactEditorControlExtension(TUid::Null())) + { + return static_cast + (iEditorControl->ContactEditorControlExtension(TUid::Null())); + } + return NULL; + } + +// -------------------------------------------------------------------------- +// CPmapCmd::AddObserver +// -------------------------------------------------------------------------- +// +void CPmapCmd::AddObserver( MPbk2CommandObserver& aObserver ) + { + iObserver = &aObserver; + } + +// -------------------------------------------------------------------------- +// CPmapCmd::ResetUiControl +// -------------------------------------------------------------------------- +// +void CPmapCmd::ResetUiControl( MPbk2ContactUiControl& aUiControl ) + { + if (iUiControl == &aUiControl) + { + iUiControl = NULL; + } + } + +// -------------------------------------------------------------------------- +// CPmapCmd::FinishProcess +// -------------------------------------------------------------------------- +// +void CPmapCmd::FinishProcess() + { + if (iObserver) + { + iObserver->CommandFinished( *this ); + } + } + +// -------------------------------------------------------------------------- +// CPmapCmd::EditorShowMapL +// -------------------------------------------------------------------------- +// +void CPmapCmd::EditorShowOnMapsL(TVPbkFieldTypeParameter aAddressType) + { + CMnMapView* mapview = CMnMapView::NewL( *iMapViewProvider ); + CleanupStack::PushL( mapview ); + + RPointerArray landmarks; + CleanupClosePushL( landmarks ); + + CPosLandmark* landmark = CPosLandmark::NewL(); + CleanupStack::PushL( landmark ); + + if ( !FillGeoLandmarkL( *landmark, aAddressType ) ) + { + FillLandmarkL( *landmark, aAddressType ); + } + TLocality locality; + if( landmark->NumOfAvailablePositionFields() > 0 || landmark->GetPosition( locality ) == KErrNone ) + { + landmarks.AppendL( landmark ); + mapview->AddLandmarksToShowL( landmarks ); + } + mapview->ShowMapL(); + + CleanupStack::PopAndDestroy( landmark ); + CleanupStack::PopAndDestroy( &landmarks ); + CleanupStack::PopAndDestroy( mapview ); + } + +// -------------------------------------------------------------------------- +// CPmapCmd::FillLandmarkL +// -------------------------------------------------------------------------- +// +void CPmapCmd::FillLandmarkL(CPosLandmark& aLandmark, TVPbkFieldTypeParameter aAddressType) + { + if( iAddressView && iEditorControl ) + { + TInt count = iEditorControl->NumberOfControls(); + for( TInt idx1 = 0; idx1 < count; idx1++) + { + MPbk2ContactEditorField& field = iEditorControl->EditorField(idx1); + HBufC* uiData = field.ControlTextL(); + if( !uiData || !uiData->Length() ) + continue; + + CleanupStack::PushL(uiData); + TArray arrProp = field.FieldProperty().FieldType().VersitProperties(); + for( TInt idx2 = 0; idx2 < arrProp.Count(); idx2++) + { + if( arrProp[idx2].Name() == EVPbkVersitNameADR ) + { + + if( arrProp[idx2].SubField() == EVPbkVersitSubFieldCountry ) + { + aLandmark.SetPositionFieldL( EPositionFieldCountry, uiData->Des() ); + continue; + } + else if( arrProp[idx2].SubField() == EVPbkVersitSubFieldLocality ) + { + aLandmark.SetPositionFieldL( EPositionFieldCity, uiData->Des() ); + continue; + } + else if( arrProp[idx2].SubField() == EVPbkVersitSubFieldStreet ) + { + aLandmark.SetPositionFieldL( EPositionFieldStreet, uiData->Des() ); + continue; + } + else if( arrProp[idx2].SubField() == EVPbkVersitSubFieldPostalCode ) + { + aLandmark.SetPositionFieldL( EPositionFieldPostalCode, uiData->Des() ); + continue; + } + } + } + CleanupStack::PopAndDestroy(uiData); + } + } + else + { + MVPbkStoreContactFieldCollection& arrFields = iContact->Fields(); + TInt count = arrFields.FieldCount(); + for( TInt idx = 0; idx < count; idx++) + { + MVPbkStoreContactField& field = arrFields.FieldAt(idx); + const MVPbkContactFieldData& fieldData = field.FieldData(); + if( fieldData.DataType() != EVPbkFieldStorageTypeText ) + { + continue; + } + const TDesC& dataText = MVPbkContactFieldTextData::Cast( fieldData ).Text(); + + if( !dataText.Length() ) + { + continue; + } + + TArray arrProp = field.BestMatchingFieldType()->VersitProperties(); + for( TInt idx2 = 0; idx2 < arrProp.Count(); idx2++) + { + if( arrProp[idx2].Name() == EVPbkVersitNameADR && + ( arrProp[idx2].Parameters().Contains(aAddressType) || + ( aAddressType == EVPbkVersitParamPREF && + !arrProp[idx2].Parameters().Contains(EVPbkVersitParamHOME) && + !arrProp[idx2].Parameters().Contains(EVPbkVersitParamWORK) ) ) ) + { + if( arrProp[idx2].SubField() == EVPbkVersitSubFieldCountry ) + { + aLandmark.SetPositionFieldL( EPositionFieldCountry, dataText ); + continue; + } + else if( arrProp[idx2].SubField() == EVPbkVersitSubFieldLocality ) + { + aLandmark.SetPositionFieldL( EPositionFieldCity, dataText ); + continue; + } + else if( arrProp[idx2].SubField() == EVPbkVersitSubFieldStreet ) + { + aLandmark.SetPositionFieldL( EPositionFieldStreet, dataText ); + continue; + } + else if( arrProp[idx2].SubField() == EVPbkVersitSubFieldPostalCode ) + { + aLandmark.SetPositionFieldL( EPositionFieldPostalCode, dataText ); + continue; + } + } + } + } + } + } + +// -------------------------------------------------------------------------- +// CPmapCmd::FillGeoLandmarkL +// -------------------------------------------------------------------------- +// +TBool CPmapCmd::FillGeoLandmarkL( + CPosLandmark& aLandmark, TVPbkFieldTypeParameter aAddressType ) + { + TBool result = EFalse; + MVPbkStoreContactFieldCollection& arrFields = iContact->Fields(); + TInt count = arrFields.FieldCount(); + for( TInt idx = 0; idx < count; idx++ ) + { + MVPbkStoreContactField& field = arrFields.FieldAt( idx ); + const MVPbkContactFieldData& fieldData = field.FieldData(); + if( fieldData.DataType() != EVPbkFieldStorageTypeText ) + { + continue; + } + const TDesC& dataText = + MVPbkContactFieldTextData::Cast( fieldData ).Text(); + TInt countProps = + field.BestMatchingFieldType()->VersitProperties().Count(); + TArray props = + field.BestMatchingFieldType()->VersitProperties(); + for ( TInt idx2 = 0; idx2 < countProps; idx2++ ) + { + if ( ( props[ idx2 ].Parameters().Contains( EVPbkVersitParamHOME ) && + aAddressType == EVPbkVersitParamHOME ) || + ( props[ idx2 ].Parameters().Contains( EVPbkVersitParamWORK ) && + aAddressType == EVPbkVersitParamWORK ) || + ( !props[ idx2 ].Parameters().Contains( EVPbkVersitParamHOME ) && + !props[ idx2 ].Parameters().Contains( EVPbkVersitParamWORK ) && + aAddressType == EVPbkVersitParamPREF ) ) + { + result = DoFillGeoLandmarkL( aLandmark, dataText ); + break; + } + } + } + return result; + } + +// -------------------------------------------------------------------------- +// CPmapCmd::DoFillGeoLandmarkL +// -------------------------------------------------------------------------- +// +TBool CPmapCmd::DoFillGeoLandmarkL( + CPosLandmark& aLandmark, const TDesC& aDataText ) + { + TBool result = EFalse; + TInt separator = aDataText.Find( KGeoSeparator ); + if ( separator != KErrNotFound ) + { + TReal64 latitude = 0; + TReal64 logitude = 0; + TLex lexLatitude( aDataText.Left( aDataText.Length() - separator ) ); + TLex lexLogitude( aDataText.Right( aDataText.Length() + - separator - KGeoSeparatorLength ) ); + if ( lexLatitude.Val( latitude ) == KErrNone + && lexLogitude.Val( logitude ) == KErrNone ) + { + TLocality loc( TCoordinate( latitude, logitude ), + KGeoHorizontalAccuracy ); + aLandmark.SetPositionL( loc ); + result = ETrue; + } + } + return result; + } + +// -------------------------------------------------------------------------- +// CPmapCmd::EditorAssignFromMapsL +// -------------------------------------------------------------------------- +// +void CPmapCmd::EditorAssignFromMapsL(TVPbkFieldTypeParameter aAddressType) + { + CMnMapView* mapview = CMnMapView::NewChainedL( *iMapViewProvider ); + CleanupStack::PushL( mapview ); + + RPointerArray landmarks; + CleanupClosePushL( landmarks ); + + CPosLandmark* landmark = CPosLandmark::NewL(); + CleanupStack::PushL( landmark ); + + if ( !FillGeoLandmarkL( *landmark, aAddressType ) ) + { + FillLandmarkL( *landmark, aAddressType ); + } + TLocality locality; + TBool noAddress = ETrue; + if( landmark->NumOfAvailablePositionFields() > 0 || landmark->GetPosition( locality ) == KErrNone ) + { + landmarks.AppendL( landmark ); + mapview->AddLandmarksToShowL( landmarks ); + noAddress = EFalse; + } + + TRequestStatus status; + mapview->SelectFromMapL( status ); + User::WaitForRequest( status ); + + TBool update = EFalse; + TBool geocoordsExist = EFalse; + + CPosLandmark* result = NULL; + if ( status.Int() == KErrNone ) + { + result = mapview->RetrieveSelectionResultL(); + if ( result->GetPosition( locality ) == KErrNone ) + { + geocoordsExist = ETrue; + } + + if( result->IsPositionFieldAvailable( EPositionFieldStreet ) || + result->IsPositionFieldAvailable( EPositionFieldCity ) || + result->IsPositionFieldAvailable( EPositionFieldCountry ) ) + { + update= ETrue; + } + + } + CleanupStack::PopAndDestroy( landmark ); + CleanupStack::PopAndDestroy( &landmarks ); + CleanupStack::PopAndDestroy( mapview ); + if( result ) + { + CleanupStack::PushL( result ); + } + + if( update ) + { + if( iAddressUpdatePrompt && !noAddress ) + { + const TInt KGranularity = 4; + CDesCArrayFlat* arrFields = new ( ELeave ) CDesCArrayFlat + ( KGranularity ); + CleanupStack::PushL(arrFields); + + HBufC* addrLebel = NULL; + + switch( aAddressType ) + { + case EVPbkVersitParamPREF: + addrLebel = StringLoader::LoadLC(R_QTN_PHOB_HEADER_ADDRESS ); + break; + case EVPbkVersitParamHOME: + addrLebel = StringLoader::LoadLC( R_QTN_PHOB_HEADER_ADDRESS_HOME ); + break; + case EVPbkVersitParamWORK: + addrLebel = StringLoader::LoadLC( R_QTN_PHOB_HEADER_ADDRESS_WORK ); + break; + default: + User::Leave(KErrArgument); + } + arrFields->AppendL( addrLebel->Des() ); + + _LIT(KComma, ","); + _LIT(KSpace, " "); + + TInt lenght = 0; + TPtrC street; + if( result->IsPositionFieldAvailable( EPositionFieldStreet ) ) + { + result->GetPositionField( EPositionFieldStreet, street ); + lenght += street.Length(); + } + + TPtrC city; + if( result->IsPositionFieldAvailable( EPositionFieldCity ) ) + { + result->GetPositionField( EPositionFieldCity, city ); + if( lenght ) + { + lenght += KComma().Length() + KSpace().Length(); + } + lenght += city.Length(); + } + + TPtrC country; + if( result->IsPositionFieldAvailable( EPositionFieldCountry ) ) + { + result->GetPositionField( EPositionFieldCountry, country ); + if( lenght ) + { + lenght += KComma().Length() + KSpace().Length(); + } + lenght += country.Length(); + } + + RBuf newAddr; + newAddr.CreateL( lenght ); + CleanupClosePushL( newAddr ); + + if( street.Length() ) + { + newAddr += street; + } + + if( city.Length() ) + { + if( newAddr.Length() > 0 ) + { + newAddr += KComma(); + newAddr += KSpace(); + } + newAddr += city; + } + + if( country.Length() ) + { + if( newAddr.Length() > 0 ) + { + newAddr += KComma(); + newAddr += KSpace(); + } + newAddr += country; + } + + arrFields->AppendL( newAddr ); + HBufC* prompt = StringLoader::LoadLC( R_QTN_PHOB_CONFIRM_CHANGE_ADDRESS, *arrFields ); + CAknQueryDialog* dlg = CAknQueryDialog::NewL(); + if( !dlg->ExecuteLD( R_PBK2_GENERAL_CONFIRMATION_QUERY, *prompt ) ) + { + update = EFalse; + } + CleanupStack::PopAndDestroy( prompt ); + CleanupStack::PopAndDestroy( &newAddr ); + CleanupStack::PopAndDestroy( addrLebel ); + CleanupStack::PopAndDestroy( arrFields ); + } + + if( update ) + { + if ( !iEditorControl ) + { + iContact->LockL( *this ); + CActiveScheduler::Start(); + } + UpdateFieldL( *result, EPositionFieldCountry, + EVPbkVersitSubFieldCountry, aAddressType ); + UpdateFieldL( *result, EPositionFieldCity, + EVPbkVersitSubFieldLocality, aAddressType ); + UpdateFieldL( *result, EPositionFieldStreet, + EVPbkVersitSubFieldStreet, aAddressType ); + UpdateFieldL( *result, EPositionFieldPostalCode, + EVPbkVersitSubFieldPostalCode, aAddressType ); + UpdateFieldL( *result, EPositionFieldLocality, + EVPbkVersitSubFieldRegion, aAddressType ); + UpdateFieldL( *result, EPositionFieldNone, + EVPbkVersitSubFieldPostOfficeAddress, aAddressType ); + UpdateFieldL( *result, EPositionFieldNone, + EVPbkVersitSubFieldExtendedAddress, aAddressType ); + + if( geocoordsExist ) + { + UpdateCoordsL( locality, aAddressType ); + } + if ( !iEditorControl ) + { + iContact->CommitL( *this ); + CActiveScheduler::Start(); + } + if( ControlExtension() ) + { + ControlExtension()->UpdateControlsL(); + } + + HBufC* text = StringLoader::LoadLC( R_QTN_PHOB_NOTE_ADDRESS_UPDATED ); + CAknInformationNote* note = new ( ELeave ) CAknInformationNote( ETrue ); + note->ExecuteLD( *text ); + CleanupStack::PopAndDestroy( text ); + } + } + + if( result ) + { + CleanupStack::PopAndDestroy( result ); + } + } + +// -------------------------------------------------------------------------- +// CPmapCmd::UpdateCoordsL +// -------------------------------------------------------------------------- +// +void CPmapCmd::UpdateCoordsL( + TLocality& aLocality, + TVPbkFieldTypeParameter aAddressType ) + { + TReal64 latitude = aLocality.Latitude(); + TReal64 longitude = aLocality.Longitude(); + RBuf geoData; + RBuf textNumber; + CleanupClosePushL( geoData ); + CleanupClosePushL( textNumber ); + geoData.CreateL( KGeoMaxSize ); + textNumber.CreateL( KGeoMaxSize ); + TRealFormat format( KGeoFormatWidth ); + textNumber.Num( latitude, format ); + geoData = textNumber; + geoData += KGeoSeparator(); + textNumber.Num( longitude, format ); + geoData += textNumber; + CleanupStack::PopAndDestroy( &textNumber ); + + TBool updated = EFalse; + MVPbkStoreContactFieldCollection& arrFields = iContact->Fields(); + TInt count = arrFields.FieldCount(); + for( TInt idx = 0; idx < count; idx++) + { + MVPbkStoreContactField& field = arrFields.FieldAt(idx); + TInt countProps = + field.BestMatchingFieldType()->VersitProperties().Count(); + TArray props = + field.BestMatchingFieldType()->VersitProperties(); + for ( TInt idx2 = 0; idx2 < countProps; idx2++ ) + { + if ( props[ idx2 ].Name() == EVPbkVersitNameGEO && + ( ( props[ idx2 ].Parameters().Contains( EVPbkVersitParamHOME ) && + aAddressType == EVPbkVersitParamHOME ) || + ( props[ idx2 ].Parameters().Contains( EVPbkVersitParamWORK ) && + aAddressType == EVPbkVersitParamWORK ) || + ( !props[ idx2 ].Parameters().Contains( EVPbkVersitParamHOME ) && + !props[ idx2 ].Parameters().Contains( EVPbkVersitParamWORK ) && + aAddressType == EVPbkVersitParamPREF ) ) ) + { + MVPbkContactFieldData& fieldData = field.FieldData(); + MVPbkContactFieldTextData& data = + MVPbkContactFieldTextData::Cast( fieldData ); + data.SetTextL( geoData ); + updated = ETrue; + break; + } + } + } + + if( !updated ) + { + MVPbkContactStore& storeContact = iContact->ContactStore(); + const MVPbkContactStoreProperties& storeProp = storeContact.StoreProperties(); + const MVPbkFieldTypeList& fieldList = storeProp.SupportedFields(); + TInt count = fieldList.FieldTypeCount(); + for( TInt idx = 0; idx < count; idx++) + { + const MVPbkFieldType& fieldType = fieldList.FieldTypeAt( idx ); + TInt countProps = fieldType.VersitProperties().Count(); + TArray props = + fieldType.VersitProperties(); + for ( TInt idx2 = 0; idx2 < countProps; idx2++ ) + { + if ( props[ idx2 ].Name() == EVPbkVersitNameGEO && + ( ( props[ idx2 ].Parameters().Contains( EVPbkVersitParamHOME ) && + aAddressType == EVPbkVersitParamHOME ) || + ( props[ idx2 ].Parameters().Contains( EVPbkVersitParamWORK ) && + aAddressType == EVPbkVersitParamWORK ) || + ( !props[ idx2 ].Parameters().Contains( EVPbkVersitParamHOME ) && + !props[ idx2 ].Parameters().Contains( EVPbkVersitParamWORK ) && + aAddressType == EVPbkVersitParamPREF ) ) ) + { + MVPbkStoreContactField* contactField = iContact->CreateFieldLC( fieldType ); + if( contactField ) + { + MVPbkContactFieldData& fieldData = contactField->FieldData(); + if( fieldData.DataType() == EVPbkFieldStorageTypeText ) + { + MVPbkContactFieldTextData& data = + MVPbkContactFieldTextData::Cast( fieldData ); + data.SetTextL( geoData ); + iContact->AddFieldL( contactField ); + } + CleanupStack::Pop( contactField ); + } + break; + } + } + } + } + CleanupStack::PopAndDestroy( &geoData ); + } + +// -------------------------------------------------------------------------- +// CPmapCmd::UpdateFieldL +// -------------------------------------------------------------------------- +// +void CPmapCmd::UpdateFieldL( + const CPosLandmark& aLandmark, + _TPositionFieldId aPositionField, + TVPbkSubFieldType aVersitSubField, + TVPbkFieldTypeParameter aAddressType ) + { + TBool updated = EFalse; + TPtrC textData; + if ( aPositionField != EPositionFieldNone && aLandmark.IsPositionFieldAvailable( aPositionField ) ) + { + aLandmark.GetPositionField( aPositionField, textData ); + } + + if( iAddressView && iEditorControl ) + { + TInt countControls = iEditorControl->NumberOfControls(); + for ( TInt i = 0; i < countControls; ++i ) + { + TArray props = iEditorControl->EditorField( i ).FieldProperty().FieldType().VersitProperties(); + TInt countProperties = props.Count(); + for ( TInt ii = 0; ii < countProperties; ++ii ) + { + if( props[ ii ].Name() == EVPbkVersitNameADR && props[ ii ].SubField() == aVersitSubField ) + { + if ( aLandmark.IsPositionFieldAvailable( aPositionField ) ) + { + iEditorControl->EditorField( i ).Control()->SetTextL( &textData ); + } + else + { + iEditorControl->EditorField( i ).Control()->SetTextL( &KNullDesC() ); + } + + iEditorControl->EditorField( i ).SaveFieldL(); + updated = ETrue; + continue; + } + } + } + } + else + { + MVPbkStoreContactFieldCollection& arrFields = iContact->Fields(); + TInt count = arrFields.FieldCount(); + for( TInt idx = 0; idx < count; idx++) + { + MVPbkStoreContactField& field = arrFields.FieldAt(idx); + TArray arrProp = field.BestMatchingFieldType()->VersitProperties(); + for( TInt idx2 = 0; idx2 < arrProp.Count(); idx2++) + { + if( arrProp[idx2].Name() == EVPbkVersitNameADR && + arrProp[idx2].SubField() == aVersitSubField && + ( arrProp[idx2].Parameters().Contains(aAddressType) || + ( aAddressType == EVPbkVersitParamPREF && + !arrProp[idx2].Parameters().Contains(EVPbkVersitParamHOME) && + !arrProp[idx2].Parameters().Contains(EVPbkVersitParamWORK) ) ) ) + { + MVPbkContactFieldData& fieldData = field.FieldData(); + if( fieldData.DataType() != EVPbkFieldStorageTypeText ) + { + continue; + } + MVPbkContactFieldTextData& data = + MVPbkContactFieldTextData::Cast( fieldData ); + if ( aLandmark.IsPositionFieldAvailable( aPositionField ) ) + { + data.SetTextL( textData ); + } + else + { + data.SetTextL( KNullDesC() ); + } + + updated = ETrue; + continue; + } + } + } + } + + if( !updated && aLandmark.IsPositionFieldAvailable( aPositionField ) ) + { + MVPbkContactStore& storeContact = iContact->ContactStore(); + const MVPbkContactStoreProperties& storeProp = storeContact.StoreProperties(); + const MVPbkFieldTypeList& fieldList = storeProp.SupportedFields(); + TInt count = fieldList.FieldTypeCount(); + for( TInt idx = 0; idx < count; idx++) + { + const MVPbkFieldType& fieldType = fieldList.FieldTypeAt( idx ); + TArray arrProp = fieldType.VersitProperties(); + for( TInt idx2 = 0; idx2 < arrProp.Count(); idx2++) + { + if( arrProp[idx2].Name() == EVPbkVersitNameADR && + arrProp[idx2].SubField() == aVersitSubField && + ( arrProp[idx2].Parameters().Contains(aAddressType) || + ( aAddressType == EVPbkVersitParamPREF && + !arrProp[idx2].Parameters().Contains(EVPbkVersitParamHOME) && + !arrProp[idx2].Parameters().Contains(EVPbkVersitParamWORK) ) ) ) + { + MVPbkStoreContactField* contactField = iContact->CreateFieldLC( fieldType ); + if( contactField ) + { + MVPbkContactFieldData& fieldData = contactField->FieldData(); + if( fieldData.DataType() == EVPbkFieldStorageTypeText ) + { + MVPbkContactFieldTextData& data = + MVPbkContactFieldTextData::Cast( fieldData ); + data.SetTextL(textData); + iContact->AddFieldL( contactField ); + } + CleanupStack::Pop(contactField); + } + break; + } + } + } + } + } + +// -------------------------------------------------------------------------- +// CPmapCmd::IsAddressInContact +// -------------------------------------------------------------------------- +// +TBool CPmapCmd::IsAddressInContact() + { + MVPbkStoreContactFieldCollection& arrFields = iContact->Fields(); + TInt count = arrFields.FieldCount(); + for( TInt idx = 0; idx < count; idx++) + { + MVPbkStoreContactField& field = arrFields.FieldAt(idx); + TArray arrProp = field.BestMatchingFieldType()->VersitProperties(); + for( TInt idx2 = 0; idx2 < arrProp.Count(); idx2++) + { + if( arrProp[idx2].Name() == EVPbkVersitNameADR ) + { + return ETrue; + } + } + } + return EFalse; + } + +// -------------------------------------------------------------------------- +// CPmapCmd::GetFieldGroupL +// -------------------------------------------------------------------------- +// +TPbk2FieldGroupId CPmapCmd::GetFieldGroupL( + MVPbkStoreContactField& aField ) + { + TPbk2FieldGroupId ret = EPbk2FieldGroupIdNone; + + const MVPbkFieldType* type = aField.BestMatchingFieldType(); + if( type ) + { + TArray arrProp = type->VersitProperties(); + for( TInt idx = 0; idx < arrProp.Count(); idx++) + { + if( arrProp[idx].Name() != EVPbkVersitNameADR ) + { + continue; + } + + if( arrProp[idx].Parameters().Contains( + Pbk2AddressTools::MapAddressToVersitParam( + EPbk2FieldGroupIdHomeAddress ) ) ) + { + ret = EPbk2FieldGroupIdHomeAddress; + break; + } + else if( arrProp[idx].Parameters().Contains( + Pbk2AddressTools::MapAddressToVersitParam( + EPbk2FieldGroupIdCompanyAddress ) ) ) + { + ret = EPbk2FieldGroupIdCompanyAddress; + break; + } + else + { + ret = EPbk2FieldGroupIdPostalAddress; + break; + } + } + } + + return ret; + } + +// -------------------------------------------------------------------------- +// CPmapCmd::ContactOperationCompleted +// -------------------------------------------------------------------------- +// +void CPmapCmd::ContactOperationCompleted + (TContactOpResult aResult) + { + if (aResult.iStoreContact) + { + iContact = aResult.iStoreContact; + } + + CActiveScheduler::Stop(); + } + +// -------------------------------------------------------------------------- +// CPmapCmd::ContactOperationFailed +// -------------------------------------------------------------------------- +// +void CPmapCmd::ContactOperationFailed + (TContactOp /*aOpCode*/, TInt /*aErrorCode*/, TBool /*aErrorNotified*/) + { + CActiveScheduler::Stop(); + } + +// End of File