diff -r 000000000000 -r e686773b3f54 phonebookui/Phonebook2/ccapplication/ccacommlauncherplugin/src/ccappcommlaunchersetdefault.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/phonebookui/Phonebook2/ccapplication/ccacommlauncherplugin/src/ccappcommlaunchersetdefault.cpp Tue Feb 02 10:12:17 2010 +0200 @@ -0,0 +1,595 @@ +/* +* Copyright (c) 2007-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: Implementation of comm launcher view plugin +* +*/ +#include "ccappcommlauncherplugin.h" +#include "ccappcommlaunchersetdefault.h" + +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include + +#include +#include + +const TInt KGranularity = 4; +_LIT(KPbk2CommandsDllResFileName, "Pbk2Commands.rsc"); +_LIT(KPbk2UiControlsDllResFileName, "Pbk2UiControls.rsc"); +_LIT(KPbk2CommonUiDllResFileName, "Pbk2CommonUi.rsc" ); + +// --------------------------------------------------------------------------- +// CCCAppCommLauncherLSetDefault::CCCAppCommLauncherLSetDefault +// --------------------------------------------------------------------------- +// +CCCAppCommLauncherLSetDefault::CCCAppCommLauncherLSetDefault( + CCCAppCommLauncherPlugin& aPlugin ) + : + iPlugin(aPlugin), + iCommandsResourceFile( *CCoeEnv::Static() ), + iUiControlsResourceFile( *CCoeEnv::Static() ), + iCommonUiResourceFile( *CCoeEnv::Static() ) + { + + } + +// --------------------------------------------------------------------------- +// CCCAppCommLauncherLSetDefault::~CCCAppCommLauncherLSetDefault +// --------------------------------------------------------------------------- +// +CCCAppCommLauncherLSetDefault::~CCCAppCommLauncherLSetDefault() + { + delete iDefaultActions; + delete iWaitFinish; + + delete iRetrieveOperation; + delete iSetAttributeOperation; + delete iLinks; + delete iStoreContact; + + // Close contact store + if( iContactStore ) + { + iContactStore->Close( *this ); + } + + if(iCmsWrapper) + { + iCmsWrapper->Release(); + } + delete iContactLinkArrayDes; + + Release( iAppServices ); + iCommandsResourceFile.Close(); + iUiControlsResourceFile.Close(); + iCommonUiResourceFile.Close(); + } + +// --------------------------------------------------------------------------- +// CCCAppCommLauncherLSetDefault::NewL +// --------------------------------------------------------------------------- +// +CCCAppCommLauncherLSetDefault* CCCAppCommLauncherLSetDefault::NewL( + CCCAppCommLauncherPlugin& aPlugin ) + { + CCCAppCommLauncherLSetDefault* self = + new( ELeave ) CCCAppCommLauncherLSetDefault( aPlugin ); + CleanupStack::PushL( self ); + self->ConstructL(); + CleanupStack::Pop( self ); + + return self; + } + +// --------------------------------------------------------------------------- +// CCCAppCommLauncherLSetDefault::ConstructL +// --------------------------------------------------------------------------- +// +void CCCAppCommLauncherLSetDefault::ConstructL() + { + //iPbkCmd = CCCAppCommLauncherPbkCmd::NewL( iPlugin ); + iWaitFinish = new (ELeave) CActiveSchedulerWait(); + + iCommandsResourceFile.OpenL( + KPbk2RomFileDrive, KDC_RESOURCE_FILES_DIR, KPbk2CommandsDllResFileName ); + iUiControlsResourceFile.OpenL( + KPbk2RomFileDrive, KDC_RESOURCE_FILES_DIR, KPbk2UiControlsDllResFileName ); + iCommonUiResourceFile.OpenL( + KPbk2RomFileDrive, KDC_RESOURCE_FILES_DIR, KPbk2CommonUiDllResFileName ); + iAppServices = CPbk2ApplicationServices::InstanceL(); + + iCmsWrapper = CCCAppCmsContactFetcherWrapper::InstanceL(); + + iContactLinkArrayDes = iCmsWrapper->ContactIdentifierLC(); + CleanupStack::Pop(iContactLinkArrayDes); + + iDefaultActions = + new( ELeave ) CArrayFixFlat( KGranularity ); + + } + +// --------------------------------------------------------------------------- +// CCCAppCommLauncherLSetDefault::VPbkSingleContactOperationComplete +// --------------------------------------------------------------------------- +// +void CCCAppCommLauncherLSetDefault::VPbkSingleContactOperationComplete( + MVPbkContactOperationBase& /*aOperation*/, + MVPbkStoreContact* aContact) + { + delete iRetrieveOperation; + iRetrieveOperation = NULL; + + delete iStoreContact; + iStoreContact = aContact; + + TInt index; + VPbkFieldTypeSelectorFactory::TVPbkContactActionTypeSelector callSelector = VPbkFieldTypeSelectorFactory::EVoiceCallSelector; + VPbkFieldTypeSelectorFactory::TVPbkContactActionTypeSelector messageSelector = VPbkFieldTypeSelectorFactory::EUniEditorSelector; + + if ( !IsPhoneMemoryContact( *iStoreContact ) || + (!IsContactActionHasField( callSelector, index ) && + !IsContactActionHasField( messageSelector, index )) || + (FindContactFieldWithAttributeL( MapSelectorIdToDefaultType(callSelector ) ) && + FindContactFieldWithAttributeL( MapSelectorIdToDefaultType( messageSelector ) )) || + (!iStoreContact) ) + + { + ProcessFinished(KErrNone); + } + + + else // ( iStoreContact ) + { + TInt err = KErrNone; + TRAP( err, LockContactL() ); + if ( err != KErrNone ) + { + ProcessFinished( err ); + } + } + } + +// --------------------------------------------------------------------------- +// CCCAppCommLauncherLSetDefault::VPbkSingleContactOperationFailed +// --------------------------------------------------------------------------- +// +void CCCAppCommLauncherLSetDefault::VPbkSingleContactOperationFailed( + MVPbkContactOperationBase& /*aOperation*/, + TInt /*aError*/) + { + ProcessFinished(KErrNone); + } + +// -------------------------------------------------------------------------- +// CCCAppCommLauncherLSetDefault::AttributeProcessCompleted +// -------------------------------------------------------------------------- +// +void CCCAppCommLauncherLSetDefault::AttributeOperationComplete( MVPbkContactOperationBase& aOperation ) + { + TInt err = KErrNone; + + if ( &aOperation == iSetAttributeOperation ) + { + // Move to next attribute + TRAP( err, SetNextL() ); + } + + // Handle error + if ( err != KErrNone ) + { + ProcessFinished( err ); // Complete the setting + } + } + +// -------------------------------------------------------------------------- +// CCCAppCommLauncherLSetDefault::AttributeProcessFailed +// -------------------------------------------------------------------------- +// +void CCCAppCommLauncherLSetDefault::AttributeOperationFailed( + MVPbkContactOperationBase& aOperation, + TInt aError ) + { + ProcessFinished( aError ); + } + +// --------------------------------------------------------------------------- +// CCCAppCommLauncherLSetDefault::StoreReady +// --------------------------------------------------------------------------- +// +void CCCAppCommLauncherLSetDefault::StoreReady( + MVPbkContactStore& aContactStore ) + { + iContactStore = &aContactStore; + + // operation completes by VPbkSingleContactOperationComplete + // or VPbkSingleContactOperationFailed + if( iRetrieveOperation ) + { + delete iRetrieveOperation; + iRetrieveOperation = NULL; + } + + TRAPD( err,iRetrieveOperation = iAppServices->ContactManager().RetrieveContactL( iLinks->At( 0 ), *this ); ) + + if( err != KErrNone ) + { + HandleError( err ); + } + } + +// --------------------------------------------------------------------------- +// CCCAppCommLauncherLSetDefault::StoreUnavailable +// --------------------------------------------------------------------------- +// +void CCCAppCommLauncherLSetDefault::StoreUnavailable( + MVPbkContactStore& /*aContactStore*/, + TInt /*aReason*/) + { + ProcessFinished(KErrNone); + } + +// --------------------------------------------------------------------------- +// CCCAppCommLauncherLSetDefault::HandleStoreEventL +// --------------------------------------------------------------------------- +// +void CCCAppCommLauncherLSetDefault::HandleStoreEventL( + MVPbkContactStore& /*aContactStore*/, + TVPbkContactStoreEvent aStoreEvent) + { + switch ( aStoreEvent.iEventType ) + { + case TVPbkContactStoreEvent::EContactChanged: + { + // do nothing for now + } + break; + default: + break; + } + } + +// -------------------------------------------------------------------------- +// CCCAppCommLauncherLSetDefault::ContactOperationCompleted +// -------------------------------------------------------------------------- +// +void CCCAppCommLauncherLSetDefault::ContactOperationCompleted + (TContactOpResult aResult) + { + if (aResult.iOpCode == EContactLock) + { + TRAPD( err, SetNextL() ); + if ( err != KErrNone ) + { + ProcessFinished( err ); + } + } + else if (aResult.iOpCode == EContactCommit) + { + ProcessFinished( KErrNone ); + } + } + +// -------------------------------------------------------------------------- +// CCCAppCommLauncherLSetDefault::ContactOperationFailed +// -------------------------------------------------------------------------- +// +void CCCAppCommLauncherLSetDefault::ContactOperationFailed + ( TContactOp /*aOpCode*/, TInt aErrorCode, + TBool /*aErrorNotified*/ ) + { + ProcessFinished( aErrorCode ); + } + +// ---------------------------------------------------------- +// CCCAppCommLauncherLSetDefault::WaitFinish +// ---------------------------------------------------------- +// +void CCCAppCommLauncherLSetDefault::WaitFinish() + { + if ( iWaitFinish && !iWaitFinish->IsStarted() ) + { + iWaitFinish->Start(); + } + } + +// ---------------------------------------------------------- +// CCCAppCommLauncherLSetDefault::StopWait +// ---------------------------------------------------------- +// +void CCCAppCommLauncherLSetDefault::StopWait() + { + if ( iWaitFinish && iWaitFinish->IsStarted() ) + { + iWaitFinish->AsyncStop(); + } + } + +// ---------------------------------------------------------- +// CCCAppCommLauncherLSetDefault::ExecuteAssignDefaultL +// ---------------------------------------------------------- +// +void CCCAppCommLauncherLSetDefault::ExecuteAssignDefaultL() + { + iDefaultActions->Reset(); + iDefaultActions->AppendL( VPbkFieldTypeSelectorFactory::EVoiceCallSelector ); + iDefaultActions->AppendL( VPbkFieldTypeSelectorFactory::EUniEditorSelector ); + + if( iLinks ) + { + delete iLinks; + iLinks = NULL; + } + + iLinks = iAppServices->ContactManager().CreateLinksLC( *iContactLinkArrayDes ); + + if ( iLinks && iLinks->Count() > 0 ) + { + // operation completes by StoreReady, + // StoreUnavailable or HandleStoreEventL + (iLinks->At( 0 )).ContactStore().OpenL( *this ); + } + + CleanupStack::Pop( 1 ); // iLinks + } + +// ---------------------------------------------------------- +// CCCAppCommLauncherLSetDefault::LockContactL +// ---------------------------------------------------------- +// +void CCCAppCommLauncherLSetDefault::LockContactL() + { + // We must lock the contact for changes + iStoreContact->LockL(*this); + } + +// -------------------------------------------------------------------------- +// CCCAppCommLauncherLSetDefault::FindContactFieldWithAttributeL +// -------------------------------------------------------------------------- +// +TBool +CCCAppCommLauncherLSetDefault::FindContactFieldWithAttributeL + ( TVPbkDefaultType aDefaultType ) + { + TBool result = EFalse; + + // Loop through contact's fields and find the specified field + const TInt fieldCount = iStoreContact->Fields().FieldCount(); + CVPbkDefaultAttribute* attr = + CVPbkDefaultAttribute::NewL( aDefaultType ); + CleanupStack::PushL( attr ); + + for ( TInt i=0; i < fieldCount; ++i ) + { + MVPbkStoreContactField& candidate = + iStoreContact->Fields().FieldAt( i ); + + // Check if field has default attribute defaultType + if ( iAppServices->ContactManager().ContactAttributeManagerL().HasFieldAttributeL + ( *attr, candidate ) ) + { + result = ETrue; + break; + } + } + CleanupStack::PopAndDestroy( attr ); + return result; + } + +// -------------------------------------------------------------------------- +// CCCAppCommLauncherLSetDefault::DoSetDefaultL +// -------------------------------------------------------------------------- +// +void CCCAppCommLauncherLSetDefault::DoSetDefaultL( TVPbkDefaultType aDefaultType, TInt aIndex ) + { + // Set given attribute to given field + CVPbkDefaultAttribute* attr = + CVPbkDefaultAttribute::NewL( aDefaultType ); + CleanupStack::PushL( attr ); + + delete iSetAttributeOperation; + iSetAttributeOperation = NULL; + iSetAttributeOperation = + iAppServices->ContactManager().ContactAttributeManagerL().SetFieldAttributeL + ( iStoreContact->Fields().FieldAt( aIndex ), *attr, *this ); + + CleanupStack::PopAndDestroy( attr ); + } + +// -------------------------------------------------------------------------- +// CCCAppCommLauncherLSetDefault::SetNextL +// -------------------------------------------------------------------------- +// +void CCCAppCommLauncherLSetDefault::SetNextL() + { + VPbkFieldTypeSelectorFactory::TVPbkContactActionTypeSelector selector = NextAttribute(); + + if ( selector != VPbkFieldTypeSelectorFactory::EEmptySelector) + { + TInt index; + TVPbkDefaultType defaultType = MapSelectorIdToDefaultType(selector); + if ( IsContactActionHasField( selector, index ) && + !FindContactFieldWithAttributeL( defaultType ) ) + { + DoSetDefaultL( defaultType, index ); + } + else + { + SetNextL(); + } + } + else + { + // setting complete + DefaultSettingCompleteL(); + } + } + +// -------------------------------------------------------------------------- +// CCCAppCommLauncherLSetDefault::IsContactActionHasField +// -------------------------------------------------------------------------- +// +TBool CCCAppCommLauncherLSetDefault::IsContactActionHasField( + VPbkFieldTypeSelectorFactory::TVPbkContactActionTypeSelector aContactAction, TInt& aIndex) + { + CVPbkFieldTypeSelector* selector = VPbkFieldTypeSelectorFactory + ::BuildContactActionTypeSelectorL( + aContactAction, iAppServices->ContactManager().FieldTypes()); + + const MVPbkStoreContactFieldCollection& fields = iStoreContact->Fields(); + TBool result = EFalse; + TInt count = fields.FieldCount(); + + for (TInt i = 0; i < count; ++i) + { + const MVPbkStoreContactField& field = fields.FieldAt(i); + if (selector->IsFieldIncluded(field)) + { + result = ETrue; + aIndex = i; + break; + } + } + delete selector; + return result; + } + +// --------------------------------------------------------------------------- +// CCCAppCommLauncherLSetDefault::MapSelectorIdToDefaultType +// --------------------------------------------------------------------------- +// +TVPbkDefaultType CCCAppCommLauncherLSetDefault::MapSelectorIdToDefaultType( + const VPbkFieldTypeSelectorFactory::TVPbkContactActionTypeSelector aSelectorID ) + { + TVPbkDefaultType defaultType = EVPbkDefaultTypeUndefined; + switch ( aSelectorID ) + { + case VPbkFieldTypeSelectorFactory::EVoiceCallSelector: + { + defaultType = EVPbkDefaultTypePhoneNumber; + break; + } + case VPbkFieldTypeSelectorFactory::EUniEditorSelector: + { + if (FeatureManager::FeatureSupported(KFeatureIdMMS)) + { + defaultType = EVPbkDefaultTypeMms; + } + else if (FeatureManager::FeatureSupported(KFeatureIdEmailOverSms)) + { + defaultType = EVPbkDefaultTypeEmailOverSms; + } + else + { + defaultType = EVPbkDefaultTypeSms; + } + break; + } + default: + break; + } + return defaultType; + } + +// --------------------------------------------------------------------------- +// CCCAppCommLauncherLSetDefault::NextAttribute +// --------------------------------------------------------------------------- +// +VPbkFieldTypeSelectorFactory::TVPbkContactActionTypeSelector +CCCAppCommLauncherLSetDefault::NextAttribute() + { + VPbkFieldTypeSelectorFactory::TVPbkContactActionTypeSelector selector = VPbkFieldTypeSelectorFactory::EEmptySelector; + + TInt count = 0; + if ( iDefaultActions ) + { + count = iDefaultActions->Count(); + } + + if ( count > 0 ) + { + selector = iDefaultActions->At( count - 1 ); // zero-based + iDefaultActions->Delete( count -1 ); // zero-based + } + return selector; + } + +// --------------------------------------------------------------------------- +// CCCAppCommLauncherLSetDefault::DefaultSettingCompleteL +// --------------------------------------------------------------------------- +// +void CCCAppCommLauncherLSetDefault::DefaultSettingCompleteL() + { + // commit the contact + iStoreContact->CommitL( *this ); + } + +// -------------------------------------------------------------------------- +// CCCAppCommLauncherLSetDefault::ProcessFinished +// -------------------------------------------------------------------------- +// +void CCCAppCommLauncherLSetDefault::ProcessFinished( TInt aError ) + { + if ( aError == KErrNone) + { + + } + + /*if ( aError != KErrNone ) + { + CCoeEnv::Static()->HandleError( aError ); + }*/ + + iPlugin.DefaultSettingComplete(); + } + +// --------------------------------------------------------------------------- +// CCCAppCommLauncherLSetDefault::HandleError +// --------------------------------------------------------------------------- +// +void CCCAppCommLauncherLSetDefault::HandleError( TInt aError ) + { + CCoeEnv::Static()->HandleError( aError ); + } + +// -------------------------------------------------------------------------- +// CCCAppCommLauncherLSetDefault::IsPhoneMemoryContact +// -------------------------------------------------------------------------- +// +TBool CCCAppCommLauncherLSetDefault::IsPhoneMemoryContact( + const MVPbkStoreContact& aContact) const + { + TBool ret = EFalse; + + TVPbkContactStoreUriPtr uri = + aContact.ParentStore().StoreProperties().Uri(); + + TVPbkContactStoreUriPtr phoneMemoryUri + ( VPbkContactStoreUris::DefaultCntDbUri() ); + + if (uri.Compare( phoneMemoryUri, + TVPbkContactStoreUriPtr::EContactStoreUriStoreType ) == 0) + { + ret = ETrue; + } + + return ret; + }