diff -r 000000000000 -r 8466d47a6819 emailcontacts/contactactionservice/callplugin/src/cfsccallpluginimpl.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/emailcontacts/contactactionservice/callplugin/src/cfsccallpluginimpl.cpp Thu Dec 17 08:39:21 2009 +0200 @@ -0,0 +1,1150 @@ +/* +* Copyright (c) 2008 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 the class CFscCallPluginImpl. +* +*/ + + +#include "emailtrace.h" +#include +#include +#include +#include +#include +#include +#include +#include +#include +// +#include "cfsccontactaction.h" +#include "mfsccontactset.h" +#include "mfscactionutils.h" +#include "mfscreasoncallback.h" +#include "mfsccontactactionpluginobserver.h" +// +#include +#include +#include +#include +#include +#include + +#include "fscactionpluginactionuids.h" +#include "fscactionplugincrkeys.h" +#include "cfsccallpluginimpl.h" + +// CONSTANTS DECLARATIONS +const TInt KActionCount = 4; +const TInt KInvalidReasonId = 0; +const TInt KMaxLengthOfNumberString = 310; +const TInt KMaxConfIdLen = 32; +const TInt KMaxConfPinLen = 32; +const TInt KRCSECSCallPreferred = 0; +const TInt KRCSEInternetCallPreferred = 1; + +_LIT( KCallPluginIconPath, "\\resource\\apps\\fsccallplugin.mif" ); +_LIT( KResourceFilePath, "\\resource\\apps\\fsccallplugin.rsc"); +_LIT( KDtmfPause, "p"); + +const TImplementationProxy ImplementationTable[] = + { + IMPLEMENTATION_PROXY_ENTRY( + KFscCallPluginImplImpUid, + CFscCallPluginImpl::NewL ) + }; + +// ======== MEMBER FUNCTIONS ======== + +// --------------------------------------------------------------------------- +// CFscCallPluginImpl::NewL +// --------------------------------------------------------------------------- +// +CFscCallPluginImpl* CFscCallPluginImpl::NewL( TAny* aParams ) + { + FUNC_LOG; + + TFscContactActionPluginParams* params = + reinterpret_cast< TFscContactActionPluginParams* >( aParams ); + + CFscCallPluginImpl* self = new( ELeave ) CFscCallPluginImpl( *params ); + CleanupStack::PushL( self ); + self->ConstructL(); + CleanupStack::Pop( self ); + return self; + } + +// --------------------------------------------------------------------------- +// CFscCallPluginImpl::~CFscCallPluginImpl +// --------------------------------------------------------------------------- +// +CFscCallPluginImpl::~CFscCallPluginImpl() + { + FUNC_LOG; + delete iContactCallGsmAction; + delete iContactCallVideoAction; + delete iContactCallConfNumAction; + delete iContactCallVoipAction; + delete iActionList; + delete iAiwServiceHandler; + CCoeEnv::Static()->DeleteResourceFile( iResourceHandle ); + } + +// --------------------------------------------------------------------------- +// CFscCallPluginImpl::Uid +// --------------------------------------------------------------------------- +// +TUid CFscCallPluginImpl::Uid() const + { + FUNC_LOG; + TUid uid = { KFscCallPluginImplImpUid }; + return uid; + } + +// --------------------------------------------------------------------------- +// CFscCallPluginImpl::ActionList +// --------------------------------------------------------------------------- +// +const CArrayFix* CFscCallPluginImpl::ActionList() const + { + return iActionList; + } + +// --------------------------------------------------------------------------- +// CFscCallPluginImpl::GetActionL +// --------------------------------------------------------------------------- +// +const MFscContactAction& CFscCallPluginImpl::GetActionL( + TUid aActionUid ) const + { + FUNC_LOG; + + const MFscContactAction* action = NULL; + + if ( aActionUid == KFscActionUidCallGsm ) + { + action = iContactCallGsmAction; + } + else if ( aActionUid == KFscActionUidCallVideo ) + { + action = iContactCallVideoAction; + } + else if ( aActionUid == KFscActionUidCallConfNum ) + { + action = iContactCallConfNumAction; + } + else if ( aActionUid == KFscActionUidCallVoip ) + { + action = iContactCallVoipAction; + } + else + { + User::Leave( KErrNotFound ); + } + + return *action; + } + +// --------------------------------------------------------------------------- +// CFscCallPluginImpl::PriorityForContactSetL +// --------------------------------------------------------------------------- +// +void CFscCallPluginImpl::PriorityForContactSetL( + TUid aActionUid, + MFscContactSet& aContactSet, + TFscContactActionVisibility& aActionMenuVisibility, + TFscContactActionVisibility& aOptionsMenuVisibility, + MFscContactActionPluginObserver* aObserver ) + { + FUNC_LOG; + + switch( iLastEvent ) + { + case EActionEventIdle: + { + iActionUid = aActionUid; + iContactSet = &aContactSet; + iActionMenuVisibility = &aActionMenuVisibility; + iOptionsMenuVisibility = &aOptionsMenuVisibility; + iPluginObserver = aObserver; + + iIsExecute = EFalse; + + iContactSet->SetToFirstContact(); + iContactSet->SetToFirstGroup(); + + iActionPriority = KFscActionPriorityNotAvailable; + + iCanDisplay = KErrNone; + if ( aActionUid == KFscActionUidCallGsm ) + { + iCanDisplay = ( aContactSet.GroupCount() == 0 && aContactSet.ContactCount() == 1 ) ? + KErrNone : KErrArgument; + iLastEvent = EActionEventCanExecuteFinished; + + PriorityForContactSetL( + aActionUid, + aContactSet, + aActionMenuVisibility, + aOptionsMenuVisibility, + aObserver ); + //No need to check for number + } + else // show other actions only if it can be executed + { + iLastEvent = EActionEventCanExecuteLaunched; + CanExecuteL( aActionUid, aContactSet ); + } + break; + } + case EActionEventCanExecuteFinished: + { + + if ( iCanDisplay == KErrNone ) + { + aActionMenuVisibility.iVisibility = + TFscContactActionVisibility::EFscActionVisible; + aOptionsMenuVisibility.iVisibility = + TFscContactActionVisibility::EFscActionVisible; + + if ( aActionUid == KFscActionUidCallGsm ) + { + iActionPriority = + iParams.iUtils->ActionPriority( + KFscCrUidCallGsm, + KFscActionPriorityCallGsm ); + } + else if ( aActionUid == KFscActionUidCallVideo ) + { + // Video call is visible in Options menu + // even if 3G n/w is not available + if ( iParams.iUtils->IsOfflineModeL() || + !iParams.iUtils->Is3GNetworkAvailable() ) + { + aOptionsMenuVisibility.iVisibility = + TFscContactActionVisibility::EFscActionVisible; + aActionMenuVisibility.iVisibility = + TFscContactActionVisibility::EFscActionHidden; + aActionMenuVisibility.iReasonId = KInvalidReasonId; + } + iActionPriority = + iParams.iUtils->ActionPriority( + KFscCrUidCallVideo, + KFscActionPriorityCallVideo ); + } + else if ( aActionUid == KFscActionUidCallConfNum ) + { + iActionPriority = + iParams.iUtils->ActionPriority( + KFscCrUidCallConfNum, + KFscActionPriorityCallConfNum ); + } + else if ( aActionUid == KFscActionUidCallVoip ) + { + iActionPriority = + iParams.iUtils->ActionPriority( + KFscCrUidCallVoip, + KFscActionPriorityCallVoip ); + if ( !iParams.iUtils->IsVoipConfiguredL() ) + { + // If voip is not configured, set voip hidden + aActionMenuVisibility.iVisibility = + TFscContactActionVisibility::EFscActionHidden; + aActionMenuVisibility.iReasonId = KInvalidReasonId; + aOptionsMenuVisibility.iVisibility = + TFscContactActionVisibility::EFscActionHidden; + aOptionsMenuVisibility.iReasonId = KInvalidReasonId; + } + } + } + else + { + iActionPriority = KFscActionPriorityNotAvailable; + aActionMenuVisibility.iVisibility = + TFscContactActionVisibility::EFscActionHidden; + aActionMenuVisibility.iReasonId = KInvalidReasonId; + aOptionsMenuVisibility.iVisibility = + TFscContactActionVisibility::EFscActionHidden; + aOptionsMenuVisibility.iReasonId = KInvalidReasonId; + } + + if ( iActionPriority > 0 ) + { + // ignore any leave while updating action icons + TRAP_IGNORE( UpdateActionIconL( aActionUid ) ); + } + ResetData(); + aObserver->PriorityForContactSetComplete(iActionPriority); + break; + } + case EActionEventCanceled: + { + iLastEvent = EActionEventIdle; + break; + } + default: + { + ResetData(); + break; // + } + } + + } + +// --------------------------------------------------------------------------- +// CFscCallPluginImpl::ExecuteL +// --------------------------------------------------------------------------- +// +void CFscCallPluginImpl::ExecuteL( + TUid aActionUid, + MFscContactSet& aContactSet, + MFscContactActionPluginObserver* aObserver ) + { + FUNC_LOG; + + TBuf vPbkPhNo; + + CAiwDialData::TCallType callType = CAiwDialData::EAIWVoice; + + switch ( iLastEvent ) + { + case EActionEventIdle: + { + + iLastEvent = EActionEventCanExecuteLaunched; + + iActionUid = aActionUid; + iContactSet = &aContactSet; + iPluginObserver = aObserver; + + iIsExecute = ETrue; + + iContactSet->SetToFirstContact(); + iContactSet->SetToFirstGroup(); + + CanExecuteL( aActionUid, aContactSet ); + + break; + } + + case EActionEventCanExecuteFinished: + { + if ( aActionUid == KFscActionUidCallGsm ) + { + if( iCanDisplay == KErrNone ) + { + callType = CAiwDialData::EAIWVoice; + iParams.iUtils->GetVoiceCallNumberL( *iRetrievedStoreContact, vPbkPhNo ); + } + else //Phone number is missing + { + + HBufC* contactName = + iParams.iUtils->GetContactNameL( *iRetrievedStoreContact ); + CleanupStack::PushL( contactName ); + iParams.iUtils->ShowInfoNoteL( + R_QTN_FS_NOTE_NO_NUMBER_TO_NAME, + contactName ); + CleanupStack::PopAndDestroy( contactName ); + + ResetData(); + aObserver->ExecuteComplete(); + return; + } + } + else if ( aActionUid == KFscActionUidCallVideo ) + { + callType = CAiwDialData::EAIWForcedVideo; + TInt err = iParams.iUtils->GetVideoCallNumberL( + *iRetrievedStoreContact, vPbkPhNo ); + + if ( err == KErrNotFound ) + { + err = iParams.iUtils->GetVoiceCallNumberL( + *iRetrievedStoreContact, vPbkPhNo ); + } + //Phone number is missing + if (err == KErrNotFound ) + { + + HBufC* contactName = + iParams.iUtils->GetContactNameL( *iRetrievedStoreContact ); + CleanupStack::PushL( contactName ); + iParams.iUtils->ShowInfoNoteL( + R_QTN_FS_NOTE_NO_NUMBER_TO_NAME, + contactName ); + CleanupStack::PopAndDestroy( contactName ); + + ResetData(); + aObserver->ExecuteComplete(); + return; + } + } + else if ( aActionUid == KFscActionUidCallConfNum ) + { + //Fix for: TJUA-7RRG58 + TInt value( KErrNotFound ); + + CRepository* rep = CRepository::NewL( KCRUidRichCallSettings ); + rep->Get( KRCSEPreferredTelephony, value ); + if ( KRCSEInternetCallPreferred == value ) + { + callType = CAiwDialData::EAIWVoiP; + } + else + { + callType = CAiwDialData::EAIWVoice; + } + delete rep; + //end for fix + + TBuf numberWithDtmf; + TBuf confNum; + TBuf confId; + TBuf confPin; + iParams.iUtils->GetConfInfoL( *iRetrievedStoreContact, + confNum, confId, confPin ); + + numberWithDtmf.Append( confNum ); + if ( confId.Length() > 0 ) + { + numberWithDtmf.Append( KDtmfPause ); + numberWithDtmf.Append( confId ); + if ( confPin.Length() > 0 ) + { + numberWithDtmf.Append( KDtmfPause ); + numberWithDtmf.Append( confPin ); + } + } + vPbkPhNo.Copy( numberWithDtmf.Left( KMaxLengthOfNumber ) ); + } + else if ( aActionUid == KFscActionUidCallVoip ) + { + callType = CAiwDialData::EAIWVoiP; + TInt err = iParams.iUtils->GetVoipAddressL( + *iRetrievedStoreContact, vPbkPhNo ); + + if ( err == KErrNotFound ) + { + err = iParams.iUtils->GetVoiceCallNumberL( + *iRetrievedStoreContact, vPbkPhNo ); + } + + if ( err == KErrNotFound ) //Phone number is missing + { + HBufC* contactName = + iParams.iUtils->GetContactNameL( *iRetrievedStoreContact ); + CleanupStack::PushL( contactName ); + iParams.iUtils->ShowInfoNoteL( + R_QTN_FS_NOTE_NO_VOIP_TO_NAME, + contactName ); + CleanupStack::PopAndDestroy( contactName ); + + ResetData(); + aObserver->ExecuteComplete(); + return; + } + } + + if ( vPbkPhNo.Length() > 0 ) + { + MakeAiwCallL( vPbkPhNo, callType ); + } + ResetData(); + aObserver->ExecuteComplete(); + break; + } + case EActionEventCanceled: + { + iLastEvent = EActionEventIdle; + break; + } + default: + { + ResetData(); + break; // + } + } + + } + +// --------------------------------------------------------------------------- +// CFscCallPluginImpl::GetReasonL +// --------------------------------------------------------------------------- +// +void CFscCallPluginImpl::GetReasonL( + TUid /* aActionUid */, + TInt /* aReasonId */, + HBufC*& /* aReason */ ) const + { + } + +// --------------------------------------------------------------------------- +// CFscCallPluginImpl::MakeAiwCallL +// --------------------------------------------------------------------------- +// +void CFscCallPluginImpl::MakeAiwCallL( + const TDesC& aNumber, + CAiwDialData::TCallType aCallType ) + { + FUNC_LOG; + + CAiwDialData* dialdata = CAiwDialData::NewLC(); + CRepository* rep = CRepository::NewL( KCRUidRichCallSettings ); + TInt ret(KErrNone); + TInt err(KErrNone); + TInt options(0); + options |= KAiwOptASyncronous; + + dialdata->SetCallType( aCallType ); + dialdata->SetPhoneNumberL( aNumber ); + dialdata->SetWindowGroup( CCoeEnv::Static()->RootWin().Identifier() ); + + CAiwGenericParamList& paramList = iAiwServiceHandler->InParamListL(); + dialdata->FillInParamListL( paramList ); + + if ( aCallType == CAiwDialData::EAIWVoice ) + { + TInt value( KErrNotFound ); + // force call type to voice (call AIW interface doens't have this option, + // so we must change the preferred call value in cenrep for the duration + // of the function call) + if ( rep ) + { + rep->Get( KRCSEPreferredTelephony, value ); + } + if ( KRCSEInternetCallPreferred == value ) + { + iPreferredCallValueChanged = ETrue; + ret = rep->Set( KRCSEPreferredTelephony, KRCSECSCallPreferred ); // must not leave before this is returned to KRCSEInternetCallPreferred + } + } + delete rep; + if( ( iPreferredCallValueChanged && ret == KErrNone ) || !iPreferredCallValueChanged ) + { + TRAP(err, iAiwServiceHandler->ExecuteServiceCmdL + ( KAiwCmdCall, + paramList, + iAiwServiceHandler->OutParamListL(), + options, + this )); + } + + User::LeaveIfError(err); + CleanupStack::PopAndDestroy(); // this + } + +// --------------------------------------------------------------------------- +// CFscCallPluginImpl::CanExecuteL +// --------------------------------------------------------------------------- +// +void CFscCallPluginImpl::CanExecuteL( + TUid aActionUid, + MFscContactSet& aContactSet ) + { + FUNC_LOG; + + switch(iLastEvent) + { + case EActionEventCanExecuteLaunched: + { + if ( aActionUid == KFscActionUidCallGsm ) + { + iCanDisplay = ( aContactSet.GroupCount() == 0 + && aContactSet.ContactCount() == 1 ) ? + KErrNone : KErrArgument; + if ( iCanDisplay == KErrNone ) + { + iLastEvent = EActionEventContactRetrieve; + aContactSet.NextContactL(this); + } + else + { + iLastEvent = EActionEventCanExecuteFinished; + ResumeAsync(aActionUid, aContactSet, iIsExecute); + } + } + else if ( aActionUid == KFscActionUidCallVideo ) + { + iCanDisplay = ( aContactSet.GroupCount() == 0 + && aContactSet.ContactCount() == 1 ) ? + KErrNone : KErrArgument; + if ( iCanDisplay == KErrNone ) + { + iLastEvent = EActionEventContactRetrieve; + aContactSet.NextContactL(this); + } + else + { + iLastEvent = EActionEventCanExecuteFinished; + ResumeAsync(aActionUid, aContactSet, iIsExecute); + } + // 3G Network availability is checked inside + // PriorityForContactSetL() + } + else if ( aActionUid == KFscActionUidCallConfNum ) + { + // One Group and Zero Contacts + iCanDisplay = ( aContactSet.GroupCount() == 1 + && aContactSet.ContactCount() == 0 ) ? + KErrNone : KErrArgument; + if ( iCanDisplay == KErrNone ) + { + iLastEvent = EActionEventGroupRetrieve; + aContactSet.NextGroupL(this); + } + else + { + iLastEvent = EActionEventCanExecuteFinished; + ResumeAsync(aActionUid, aContactSet, iIsExecute); + } + } + else if ( aActionUid == KFscActionUidCallVoip ) + { + iCanDisplay = ( aContactSet.GroupCount() == 0 + && aContactSet.ContactCount() == 1 ) ? + KErrNone : KErrArgument; + if ( iCanDisplay == KErrNone ) + { + iLastEvent = EActionEventContactRetrieve; + aContactSet.NextContactL(this); + } + else + { + iLastEvent = EActionEventCanExecuteFinished; + ResumeAsync(aActionUid, aContactSet, iIsExecute); + } + } + else + { + iLastEvent = EActionEventIdle; + ResetData(); + iPluginObserver->PriorityForContactSetFailed(KErrArgument); + } + + break; + } + case EActionEventCanExecuteFinished: + { + if ( aActionUid == KFscActionUidCallGsm ) + { + iCanDisplay = + (iParams.iUtils->IsContactNumberAvailableL( + *iRetrievedStoreContact, + ETypeVoiceCallNumber ) ) ? KErrNone : + KErrArgument; + + ResumeAsync(aActionUid, aContactSet, iIsExecute); + } + else if ( aActionUid == KFscActionUidCallVideo ) + { + iCanDisplay = ( iParams.iUtils->IsContactNumberAvailableL( + *iRetrievedStoreContact, ETypeVideoCallNumber ) ) + ? KErrNone : KErrArgument; + + // or phone number if internet call number is missing + if ( iCanDisplay == KErrArgument ) + { + iCanDisplay = ( + iParams.iUtils->IsContactNumberAvailableL( + *iRetrievedStoreContact, + ETypeVoiceCallNumber ) ) ? KErrNone : + KErrArgument; + } + + ResumeAsync(aActionUid, aContactSet, iIsExecute); + // 3G Network availability is checked inside + // PriorityForContactSetL() + } + else if ( aActionUid == KFscActionUidCallConfNum ) + { + iCanDisplay = ( iParams.iUtils->IsContactNumberAvailableL( + *iRetrievedStoreContact, + ETypeConfNumber ) ) ? KErrNone : KErrArgument; + + ResumeAsync(aActionUid, aContactSet, iIsExecute); + } + else if ( aActionUid == KFscActionUidCallVoip ) + { + // Intenet call number + iCanDisplay = ( iParams.iUtils->IsContactNumberAvailableL( + *iRetrievedStoreContact, ETypeInternetTel ) ) ? + KErrNone : KErrArgument; + + // or phone number if internet call number is missing + if ( iCanDisplay == KErrArgument ) + { + iCanDisplay = ( + iParams.iUtils->IsContactNumberAvailableL( + *iRetrievedStoreContact, + ETypeVoiceCallNumber ) ) ? KErrNone : + KErrArgument; + } + + ResumeAsync( aActionUid, aContactSet, iIsExecute ); + } + else + { + ResetData(); + if (iIsExecute) + { + iPluginObserver->ExecuteFailed(KErrArgument); + } + else + { + iPluginObserver->PriorityForContactSetFailed( + KErrArgument); + } + } + break; + } + case EActionEventCanceled: + { + iLastEvent = EActionEventIdle; + break; + } + default: + { + ResetData(); + break; // + } + } + + } + +// --------------------------------------------------------------------------- +// CFscCallPluginImpl::UpdateActionIconL +// --------------------------------------------------------------------------- +// +void CFscCallPluginImpl::UpdateActionIconL( TUid aActionUid ) + { + FUNC_LOG; + + TFileName dllFileName; + Dll::FileName( dllFileName ); + TParse parse; + User::LeaveIfError( + parse.Set( KCallPluginIconPath, &dllFileName, NULL ) ); + +// icons changed + if ( aActionUid == KFscActionUidCallGsm ) + { + iContactCallGsmAction->SetIcon( iParams.iUtils->SkinIconL( + KAknsIIDQgnFsActionCall, + parse.FullName(), + EMbmFsccallpluginQgn_prop_cmail_action_call, + EMbmFsccallpluginQgn_prop_cmail_action_call_mask ) ); + } + else if ( aActionUid == KFscActionUidCallVideo ) + { + iContactCallVideoAction->SetIcon( iParams.iUtils->SkinIconL( + KAknsIIDQgnFsActionVidcall, + parse.FullName(), + EMbmFsccallpluginQgn_prop_cmail_action_call_video, + EMbmFsccallpluginQgn_prop_cmail_action_call_video_mask ) ); + } + else if ( aActionUid == KFscActionUidCallConfNum ) + { + iContactCallConfNumAction->SetIcon( iParams.iUtils->SkinIconL( + KAknsIIDQgnFsActionConfService, + parse.FullName(), + EMbmFsccallpluginQgn_prop_cmail_action_conf_service, + EMbmFsccallpluginQgn_prop_cmail_action_conf_service_mask ) ); + } + else if ( aActionUid == KFscActionUidCallVoip ) + { + iContactCallVoipAction->SetIcon( iParams.iUtils->SkinIconL( + KAknsIIDQgnFsActionVoip, + parse.FullName(), + EMbmFsccallpluginQgn_prop_cmail_action_voip, + EMbmFsccallpluginQgn_prop_cmail_action_voip_mask ) ); + } +// + } + +// --------------------------------------------------------------------------- +// CFscCallPluginImpl::CFscCallPluginImpl +// --------------------------------------------------------------------------- +// +CFscCallPluginImpl::CFscCallPluginImpl( + const TFscContactActionPluginParams& aParams ) + : CFscContactActionPlugin(), + iParams( aParams ), + iResourceHandle( 0 ), + iLastEvent( EActionEventIdle ), + iCanDisplay( KErrNone ), + iIsExecute( EFalse ) + { + } + +// --------------------------------------------------------------------------- +// CFscCallPluginImpl::ConstructL +// --------------------------------------------------------------------------- +// +void CFscCallPluginImpl::ConstructL() + { + FUNC_LOG; + TFileName dllFileName; + Dll::FileName( dllFileName ); + TParse parse; + User::LeaveIfError( parse.Set( KResourceFilePath, &dllFileName, NULL ) ); + TFileName resourceFileName( parse.FullName() ); + BaflUtils::NearestLanguageFile( CCoeEnv::Static()->FsSession(), + resourceFileName ); + + iResourceHandle = + ( CCoeEnv::Static() )->AddResourceFileL( resourceFileName ); + + iActionList = new( ELeave ) CArrayFixFlat( KActionCount ); + + User::LeaveIfError( + parse.Set( KCallPluginIconPath, &dllFileName, NULL ) ); + +// icons changed + iActionList->AppendL( KFscActionUidCallGsm ); + iContactCallGsmAction = iParams.iUtils->CreateActionL( + *this, + KFscActionUidCallGsm, + KFscAtComCallGSM, + R_FS_ACTION_CALL, + iParams.iUtils->SkinIconL( + KAknsIIDQgnFsActionCall, + parse.FullName(), + EMbmFsccallpluginQgn_prop_cmail_action_call, + EMbmFsccallpluginQgn_prop_cmail_action_call_mask ) ); + + iActionList->AppendL( KFscActionUidCallVideo ); + iContactCallVideoAction = iParams.iUtils->CreateActionL( + *this, + KFscActionUidCallVideo, + KFscAtComCallVideo, + R_FS_ACTION_VIDCALL, + iParams.iUtils->SkinIconL( + KAknsIIDQgnFsActionVidcall, + parse.FullName(), + EMbmFsccallpluginQgn_prop_cmail_action_call_video, + EMbmFsccallpluginQgn_prop_cmail_action_call_video_mask ) ); + + iActionList->AppendL( KFscActionUidCallConfNum ); + iContactCallConfNumAction = iParams.iUtils->CreateActionL( + *this, + KFscActionUidCallConfNum, + KFscAtComCallConfNum, + R_FS_ACTION_CONF_SERVICE, + iParams.iUtils->SkinIconL( + KAknsIIDQgnFsActionConfService, + parse.FullName(), + EMbmFsccallpluginQgn_prop_cmail_action_conf_service, + EMbmFsccallpluginQgn_prop_cmail_action_conf_service_mask ) ); + + iActionList->AppendL( KFscActionUidCallVoip ); + iContactCallVoipAction = iParams.iUtils->CreateActionL( + *this, + KFscActionUidCallVoip, + KFscAtComCallVoip, + R_FS_ACTION_VOIP, + iParams.iUtils->SkinIconL( + KAknsIIDQgnFsActionVoip, + parse.FullName(), + EMbmFsccallpluginQgn_prop_cmail_action_voip, + EMbmFsccallpluginQgn_prop_cmail_action_voip_mask ) ); +// + + iAiwServiceHandler = CAiwServiceHandler::NewL(); + iAiwServiceHandler->AttachL( R_CALLPLUGIN_INTEREST ); + + iPreferredCallValueChanged = EFalse; + } + +// --------------------------------------------------------------------------- +// CFscCallPluginImpl::ResetData +// --------------------------------------------------------------------------- +// +void CFscCallPluginImpl::ResetData() + { + FUNC_LOG; + if (iContactSet) + { + // + TRAP_IGNORE( iContactSet->CancelNextContactL() ); + TRAP_IGNORE( iContactSet->CancelNextGroupL() ); + // + iContactSet->SetToFirstContact(); + iContactSet->SetToFirstGroup(); + iContactSet = NULL; + } + + iLastEvent = EActionEventIdle; + iActionMenuVisibility = NULL; + iOptionsMenuVisibility = NULL; + iCanDisplay = KErrNone; + iRetrievedStoreContact = NULL; + } + +// --------------------------------------------------------------------------- +// CFscCallPluginImpl::ResumeAsync +// --------------------------------------------------------------------------- +// +void CFscCallPluginImpl::ResumeAsync( + TUid aActionUid, + MFscContactSet& aContactSet, + TBool aIsExecute ) + { + FUNC_LOG; + TInt err( KErrNone ); + if (aIsExecute) + { + TRAP( err, ExecuteL( aActionUid, aContactSet, iPluginObserver ) ); + } + else + { + TRAP( err, PriorityForContactSetL( + aActionUid, + aContactSet, + *iActionMenuVisibility, + *iOptionsMenuVisibility, + iPluginObserver ) ); + } + + if ( err != KErrNone ) + { + ResetData(); + if ( aIsExecute ) + { + iPluginObserver->ExecuteFailed( err ); + } + else + { + iPluginObserver->PriorityForContactSetFailed( err ); + } + } + } + +// --------------------------------------------------------------------------- +// CFscCallPluginImpl::NextContactComplete +// --------------------------------------------------------------------------- +// +void CFscCallPluginImpl::NextContactComplete( MVPbkStoreContact* aContact ) + { + FUNC_LOG; + TInt err( KErrNone ); + switch(iLastEvent) + { + case EActionEventContactRetrieve: + { + iRetrievedStoreContact = aContact; + iLastEvent = EActionEventCanExecuteFinished; + TRAP( err, CanExecuteL( iActionUid, *iContactSet ) ); + break; + } + case EActionEventCanceled: + { + iLastEvent = EActionEventIdle; + break; + } + default: + { + ResetData(); + break; // + } + } + + if ( err != KErrNone ) + { + ResetData(); + if ( iIsExecute ) + { + iPluginObserver->ExecuteFailed( err ); + } + else + { + iPluginObserver->PriorityForContactSetFailed( err ); + } + } + } + +// --------------------------------------------------------------------------- +// CFscCallPluginImpl::NextContactFailed +// --------------------------------------------------------------------------- +// +void CFscCallPluginImpl::NextContactFailed( TInt aError ) + { + FUNC_LOG; + ResetData(); + if (iIsExecute) + { + iPluginObserver->ExecuteFailed(aError); + } + else + { + iPluginObserver->PriorityForContactSetFailed(aError); + } + } + +// --------------------------------------------------------------------------- +// CFscCallPluginImpl::NextGroupComplete +// --------------------------------------------------------------------------- +// +void CFscCallPluginImpl::NextGroupComplete( MVPbkStoreContact* aContact ) + { + FUNC_LOG; + TInt err( KErrNone ); + switch(iLastEvent) + { + case EActionEventGroupRetrieve: + { + iLastEvent = EActionEventCanExecuteFinished; + iRetrievedStoreContact = aContact; + TRAP( err, CanExecuteL( iActionUid, *iContactSet ) ); + break; + } + case EActionEventCanceled: + { + iLastEvent = EActionEventIdle; + break; + } + default: + { + ResetData(); + break; // + } + } + if ( err != KErrNone ) + { + ResetData(); + if ( iIsExecute ) + { + iPluginObserver->ExecuteFailed( err ); + } + else + { + iPluginObserver->PriorityForContactSetFailed( err ); + } + } + } + +// --------------------------------------------------------------------------- +// CFscCallPluginImpl::NextGroupFailed +// --------------------------------------------------------------------------- +// +void CFscCallPluginImpl::NextGroupFailed( TInt aError ) + { + FUNC_LOG; + ResetData(); + if (iIsExecute) + { + iPluginObserver->ExecuteFailed(aError); + } + else + { + iPluginObserver->PriorityForContactSetFailed(aError); + } + } + +// --------------------------------------------------------------------------- +// CFscCallPluginImpl::GetGroupContactComplete +// --------------------------------------------------------------------------- +// +void CFscCallPluginImpl::GetGroupContactComplete( MVPbkStoreContact* /*aContact*/ ) + { + } + +// --------------------------------------------------------------------------- +// CFscCallPluginImpl::GetGroupContactComplete +// --------------------------------------------------------------------------- +// +void CFscCallPluginImpl::GetGroupContactFailed( TInt aError ) + { + FUNC_LOG; + ResetData(); + if (iIsExecute) + { + iPluginObserver->ExecuteFailed(aError); + } + else + { + iPluginObserver->PriorityForContactSetFailed(aError); + } + } + +// --------------------------------------------------------------------------- +// CFscCallPluginImpl::CancelPriorityForContactSet +// --------------------------------------------------------------------------- +// +void CFscCallPluginImpl::CancelPriorityForContactSet() + { + FUNC_LOG; + iLastEvent = EActionEventCanceled; + ResetData(); + } + +// --------------------------------------------------------------------------- +// CFscCallPluginImpl::CancelExecute +// --------------------------------------------------------------------------- +// +void CFscCallPluginImpl::CancelExecute() + { + FUNC_LOG; + // set action + iLastEvent = EActionEventCanceled; + ResetData(); + + // close popup window for selecting number if opened + TRAPD( err, iParams.iUtils->CloseSelectDialogL() ); + + if ( err != KErrNone ) + { + CCoeEnv::Static()->HandleError( err ); + } + } + +// --------------------------------------------------------------------------- +// CFscCallPluginImpl::HandleNotifyL +// --------------------------------------------------------------------------- +// +TInt CFscCallPluginImpl::HandleNotifyL( + TInt /*aCmdId*/, + TInt /*aEventId*/, + CAiwGenericParamList& /*aEventParamList*/, + const CAiwGenericParamList& /*aInParamList*/) + { + FUNC_LOG; + if( iPreferredCallValueChanged ) + { + CRepository* rep = CRepository::NewL( KCRUidRichCallSettings ); + + if ( rep ) + { + rep->Set( KRCSEPreferredTelephony, KRCSEInternetCallPreferred ); + } + delete rep; + iPreferredCallValueChanged = EFalse; + } + return KErrNone; + } + +// ======== GLOBAL FUNCTIONS ======== + +// --------------------------------------------------------------------------- +// ImplementationGroupProxy +// --------------------------------------------------------------------------- +// +EXPORT_C const TImplementationProxy* ImplementationGroupProxy( + TInt& aTableCount ) + { + FUNC_LOG; + aTableCount = + sizeof( ImplementationTable ) / sizeof( TImplementationProxy ); + return ImplementationTable; + } +