emailcontacts/contactactionservice/callplugin/src/cfsccallpluginimpl.cpp
changeset 0 8466d47a6819
equal deleted inserted replaced
-1:000000000000 0:8466d47a6819
       
     1 /*
       
     2 * Copyright (c) 2008 Nokia Corporation and/or its subsidiary(-ies). 
       
     3 * All rights reserved.
       
     4 * This component and the accompanying materials are made available
       
     5 * under the terms of "Eclipse Public License v1.0"
       
     6 * which accompanies this distribution, and is available
       
     7 * at the URL "http://www.eclipse.org/legal/epl-v10.html".
       
     8 *
       
     9 * Initial Contributors:
       
    10 * Nokia Corporation - initial contribution.
       
    11 *
       
    12 * Contributors:
       
    13 *
       
    14 * Description:  Implementation of the class CFscCallPluginImpl.
       
    15 *
       
    16 */
       
    17 
       
    18 
       
    19 #include "emailtrace.h"
       
    20 #include <ecom/implementationproxy.h>
       
    21 #include <AiwServiceHandler.h>
       
    22 #include <bautils.h>
       
    23 #include <coemain.h>
       
    24 #include <AknsConstants.h>
       
    25 #include <RPbkViewResourceFile.h>
       
    26 #include <FscActionUtils.rsg>
       
    27 #include <fsccallplugin.rsg>
       
    28 #include <fsccallplugin.mbg>
       
    29 //<cmail>
       
    30 #include "cfsccontactaction.h"
       
    31 #include "mfsccontactset.h"
       
    32 #include "mfscactionutils.h"
       
    33 #include "mfscreasoncallback.h"
       
    34 #include "mfsccontactactionpluginobserver.h"
       
    35 //</cmail>
       
    36 #include <AiwCommon.hrh>
       
    37 #include <MVPbkStoreContact.h>
       
    38 #include <aiwdialdata.h>
       
    39 #include <settingsinternalcrkeys.h>
       
    40 #include <centralrepository.h>
       
    41 #include <e32debug.h>
       
    42 
       
    43 #include "fscactionpluginactionuids.h"
       
    44 #include "fscactionplugincrkeys.h"
       
    45 #include "cfsccallpluginimpl.h"
       
    46 
       
    47 // CONSTANTS DECLARATIONS
       
    48 const TInt KActionCount = 4;
       
    49 const TInt KInvalidReasonId = 0;
       
    50 const TInt KMaxLengthOfNumberString = 310;
       
    51 const TInt KMaxConfIdLen = 32;
       
    52 const TInt KMaxConfPinLen = 32;
       
    53 const TInt KRCSECSCallPreferred = 0;
       
    54 const TInt KRCSEInternetCallPreferred = 1;
       
    55 
       
    56 _LIT( KCallPluginIconPath, "\\resource\\apps\\fsccallplugin.mif" );
       
    57 _LIT( KResourceFilePath, "\\resource\\apps\\fsccallplugin.rsc");
       
    58 _LIT( KDtmfPause, "p");
       
    59 
       
    60 const TImplementationProxy ImplementationTable[] =
       
    61     {
       
    62     IMPLEMENTATION_PROXY_ENTRY(
       
    63         KFscCallPluginImplImpUid,
       
    64         CFscCallPluginImpl::NewL )
       
    65     };
       
    66     
       
    67 // ======== MEMBER FUNCTIONS ========
       
    68 
       
    69 // ---------------------------------------------------------------------------
       
    70 // CFscCallPluginImpl::NewL
       
    71 // ---------------------------------------------------------------------------
       
    72 //
       
    73 CFscCallPluginImpl* CFscCallPluginImpl::NewL( TAny* aParams )
       
    74     {
       
    75     FUNC_LOG;
       
    76 
       
    77     TFscContactActionPluginParams* params = 
       
    78         reinterpret_cast< TFscContactActionPluginParams* >( aParams );
       
    79             
       
    80     CFscCallPluginImpl* self = new( ELeave ) CFscCallPluginImpl( *params );
       
    81     CleanupStack::PushL( self );
       
    82     self->ConstructL();
       
    83     CleanupStack::Pop( self );
       
    84     return self;
       
    85     }
       
    86 
       
    87 // ---------------------------------------------------------------------------
       
    88 // CFscCallPluginImpl::~CFscCallPluginImpl
       
    89 // ---------------------------------------------------------------------------
       
    90 //
       
    91 CFscCallPluginImpl::~CFscCallPluginImpl()
       
    92     {
       
    93     FUNC_LOG;
       
    94     delete iContactCallGsmAction;
       
    95     delete iContactCallVideoAction;
       
    96     delete iContactCallConfNumAction;
       
    97     delete iContactCallVoipAction;     
       
    98     delete iActionList;
       
    99     delete iAiwServiceHandler;
       
   100     CCoeEnv::Static()->DeleteResourceFile( iResourceHandle );
       
   101     }
       
   102     
       
   103 // ---------------------------------------------------------------------------
       
   104 // CFscCallPluginImpl::Uid
       
   105 // ---------------------------------------------------------------------------
       
   106 //
       
   107 TUid CFscCallPluginImpl::Uid() const 
       
   108     {
       
   109     FUNC_LOG;
       
   110     TUid uid = { KFscCallPluginImplImpUid };
       
   111     return uid;
       
   112     }
       
   113 
       
   114 // ---------------------------------------------------------------------------
       
   115 // CFscCallPluginImpl::ActionList
       
   116 // ---------------------------------------------------------------------------
       
   117 //
       
   118 const CArrayFix<TUid>* CFscCallPluginImpl::ActionList() const
       
   119     {
       
   120     return iActionList;
       
   121     }
       
   122     
       
   123 // ---------------------------------------------------------------------------
       
   124 // CFscCallPluginImpl::GetActionL
       
   125 // ---------------------------------------------------------------------------
       
   126 //
       
   127 const MFscContactAction& CFscCallPluginImpl::GetActionL(
       
   128     TUid aActionUid ) const
       
   129     {
       
   130 	FUNC_LOG;
       
   131     
       
   132     const MFscContactAction* action = NULL;
       
   133 
       
   134     if ( aActionUid == KFscActionUidCallGsm )
       
   135         {
       
   136         action = iContactCallGsmAction;
       
   137         }
       
   138     else if ( aActionUid == KFscActionUidCallVideo )
       
   139         {
       
   140         action = iContactCallVideoAction;
       
   141         }
       
   142     else if ( aActionUid == KFscActionUidCallConfNum )
       
   143         {
       
   144         action = iContactCallConfNumAction;
       
   145         }
       
   146     else if ( aActionUid == KFscActionUidCallVoip )
       
   147         {
       
   148         action = iContactCallVoipAction;
       
   149         }     
       
   150     else
       
   151         {
       
   152         User::Leave( KErrNotFound );
       
   153         }
       
   154         
       
   155     return *action;
       
   156     }
       
   157 
       
   158 // ---------------------------------------------------------------------------
       
   159 // CFscCallPluginImpl::PriorityForContactSetL
       
   160 // ---------------------------------------------------------------------------
       
   161 //
       
   162 void CFscCallPluginImpl::PriorityForContactSetL( 
       
   163     TUid aActionUid,
       
   164     MFscContactSet& aContactSet,
       
   165     TFscContactActionVisibility& aActionMenuVisibility,
       
   166     TFscContactActionVisibility& aOptionsMenuVisibility,
       
   167     MFscContactActionPluginObserver* aObserver )
       
   168     {
       
   169     FUNC_LOG;    
       
   170     
       
   171     switch( iLastEvent )
       
   172         {
       
   173         case EActionEventIdle:
       
   174             {
       
   175             iActionUid = aActionUid;
       
   176             iContactSet = &aContactSet;
       
   177             iActionMenuVisibility = &aActionMenuVisibility;
       
   178             iOptionsMenuVisibility = &aOptionsMenuVisibility;
       
   179             iPluginObserver = aObserver;
       
   180 
       
   181             iIsExecute = EFalse;
       
   182             
       
   183             iContactSet->SetToFirstContact();
       
   184             iContactSet->SetToFirstGroup();
       
   185                 
       
   186             iActionPriority = KFscActionPriorityNotAvailable;
       
   187             
       
   188             iCanDisplay = KErrNone;
       
   189             if ( aActionUid == KFscActionUidCallGsm )
       
   190                 {
       
   191                 iCanDisplay = ( aContactSet.GroupCount() == 0 && aContactSet.ContactCount() == 1 ) ?
       
   192                     KErrNone : KErrArgument;
       
   193                 iLastEvent = EActionEventCanExecuteFinished;
       
   194                 
       
   195                 PriorityForContactSetL( 
       
   196                             aActionUid,
       
   197                             aContactSet,
       
   198                             aActionMenuVisibility,
       
   199                             aOptionsMenuVisibility,
       
   200                             aObserver );
       
   201                 //No need to check for number            
       
   202                 }
       
   203             else // show other actions only if it can be executed
       
   204                 {
       
   205                 iLastEvent = EActionEventCanExecuteLaunched;
       
   206                 CanExecuteL( aActionUid, aContactSet );
       
   207                 }
       
   208             break;
       
   209             }
       
   210         case EActionEventCanExecuteFinished:
       
   211             {
       
   212             
       
   213             if ( iCanDisplay == KErrNone )
       
   214                  {
       
   215                  aActionMenuVisibility.iVisibility = 
       
   216                      TFscContactActionVisibility::EFscActionVisible;
       
   217                  aOptionsMenuVisibility.iVisibility = 
       
   218                      TFscContactActionVisibility::EFscActionVisible;
       
   219                  
       
   220                  if ( aActionUid == KFscActionUidCallGsm )
       
   221                      {
       
   222                      iActionPriority = 
       
   223                          iParams.iUtils->ActionPriority( 
       
   224                              KFscCrUidCallGsm,
       
   225                              KFscActionPriorityCallGsm );
       
   226                      }
       
   227                  else if ( aActionUid == KFscActionUidCallVideo )
       
   228                      {
       
   229                      // Video call is visible in Options menu 
       
   230                      // even if 3G n/w is not available
       
   231                      if ( iParams.iUtils->IsOfflineModeL() ||
       
   232                          !iParams.iUtils->Is3GNetworkAvailable() )
       
   233                          {
       
   234                          aOptionsMenuVisibility.iVisibility = 
       
   235                              TFscContactActionVisibility::EFscActionVisible;
       
   236                          aActionMenuVisibility.iVisibility = 
       
   237                              TFscContactActionVisibility::EFscActionHidden;
       
   238                          aActionMenuVisibility.iReasonId = KInvalidReasonId;
       
   239                          }
       
   240                      iActionPriority = 
       
   241                          iParams.iUtils->ActionPriority( 
       
   242                              KFscCrUidCallVideo,
       
   243                              KFscActionPriorityCallVideo );
       
   244                      }
       
   245                  else if ( aActionUid == KFscActionUidCallConfNum )
       
   246                      {
       
   247                      iActionPriority = 
       
   248                          iParams.iUtils->ActionPriority( 
       
   249                              KFscCrUidCallConfNum,
       
   250                              KFscActionPriorityCallConfNum );
       
   251                      }           
       
   252                  else if ( aActionUid == KFscActionUidCallVoip )
       
   253                      {
       
   254                      iActionPriority = 
       
   255                          iParams.iUtils->ActionPriority( 
       
   256                              KFscCrUidCallVoip,
       
   257                              KFscActionPriorityCallVoip );
       
   258                      if ( !iParams.iUtils->IsVoipConfiguredL() )
       
   259                          {
       
   260                          // If voip is not configured, set voip hidden
       
   261                          aActionMenuVisibility.iVisibility = 
       
   262                              TFscContactActionVisibility::EFscActionHidden;
       
   263                          aActionMenuVisibility.iReasonId = KInvalidReasonId;
       
   264                          aOptionsMenuVisibility.iVisibility = 
       
   265                              TFscContactActionVisibility::EFscActionHidden;
       
   266                          aOptionsMenuVisibility.iReasonId = KInvalidReasonId;
       
   267                          }
       
   268                      }        
       
   269                  }
       
   270              else
       
   271                  {
       
   272                  iActionPriority = KFscActionPriorityNotAvailable;
       
   273                  aActionMenuVisibility.iVisibility = 
       
   274                      TFscContactActionVisibility::EFscActionHidden;
       
   275                  aActionMenuVisibility.iReasonId = KInvalidReasonId;
       
   276                  aOptionsMenuVisibility.iVisibility = 
       
   277                      TFscContactActionVisibility::EFscActionHidden;
       
   278                  aOptionsMenuVisibility.iReasonId = KInvalidReasonId;
       
   279                  }
       
   280 
       
   281              if ( iActionPriority > 0 )
       
   282                  {
       
   283                  // ignore any leave while updating action icons
       
   284                  TRAP_IGNORE( UpdateActionIconL( aActionUid ) );
       
   285                  }
       
   286             ResetData();
       
   287             aObserver->PriorityForContactSetComplete(iActionPriority);
       
   288             break;
       
   289             }
       
   290         case EActionEventCanceled:
       
   291             {
       
   292             iLastEvent = EActionEventIdle;
       
   293             break;
       
   294             }
       
   295         default:
       
   296             {
       
   297             ResetData();
       
   298             break; // <cmail>
       
   299             }
       
   300         }
       
   301     
       
   302     }
       
   303 
       
   304 // ---------------------------------------------------------------------------
       
   305 // CFscCallPluginImpl::ExecuteL 
       
   306 // ---------------------------------------------------------------------------
       
   307 //
       
   308 void CFscCallPluginImpl::ExecuteL( 
       
   309      TUid aActionUid,
       
   310      MFscContactSet& aContactSet,
       
   311      MFscContactActionPluginObserver* aObserver )
       
   312         {
       
   313 		FUNC_LOG;
       
   314 
       
   315         TBuf<KMaxLengthOfNumber> vPbkPhNo;
       
   316         
       
   317         CAiwDialData::TCallType callType = CAiwDialData::EAIWVoice;
       
   318         
       
   319         switch ( iLastEvent )
       
   320             {
       
   321             case EActionEventIdle:
       
   322                 {
       
   323                 
       
   324                 iLastEvent = EActionEventCanExecuteLaunched;
       
   325                 
       
   326                 iActionUid = aActionUid;
       
   327                 iContactSet = &aContactSet;
       
   328                 iPluginObserver = aObserver;                      
       
   329                 
       
   330                 iIsExecute = ETrue;
       
   331                                 
       
   332                 iContactSet->SetToFirstContact();
       
   333                 iContactSet->SetToFirstGroup();
       
   334                 
       
   335                 CanExecuteL( aActionUid, aContactSet );
       
   336                 
       
   337                 break;
       
   338                 }
       
   339                 
       
   340             case EActionEventCanExecuteFinished:
       
   341                 {
       
   342                 if ( aActionUid == KFscActionUidCallGsm )
       
   343                     {                              
       
   344                     if( iCanDisplay == KErrNone )
       
   345                         {
       
   346                         callType = CAiwDialData::EAIWVoice;
       
   347                         iParams.iUtils->GetVoiceCallNumberL( *iRetrievedStoreContact, vPbkPhNo );
       
   348                         }
       
   349                     else //Phone number is missing
       
   350                         {
       
   351                         
       
   352                         HBufC* contactName =
       
   353                             iParams.iUtils->GetContactNameL( *iRetrievedStoreContact );
       
   354                         CleanupStack::PushL( contactName );
       
   355                         iParams.iUtils->ShowInfoNoteL(
       
   356                             R_QTN_FS_NOTE_NO_NUMBER_TO_NAME,
       
   357                             contactName );
       
   358                         CleanupStack::PopAndDestroy( contactName );
       
   359                         
       
   360                         ResetData();
       
   361                         aObserver->ExecuteComplete();
       
   362                         return;
       
   363                         }
       
   364                     }
       
   365                 else if ( aActionUid == KFscActionUidCallVideo )
       
   366                     {                                
       
   367                     callType = CAiwDialData::EAIWForcedVideo;
       
   368                     TInt err = iParams.iUtils->GetVideoCallNumberL( 
       
   369                             *iRetrievedStoreContact, vPbkPhNo );
       
   370                     
       
   371                     if ( err == KErrNotFound )
       
   372                         {
       
   373                         err = iParams.iUtils->GetVoiceCallNumberL( 
       
   374                                 *iRetrievedStoreContact, vPbkPhNo );
       
   375                         }
       
   376                     //Phone number is missing
       
   377                     if (err == KErrNotFound )    
       
   378                     	{
       
   379                         
       
   380                         HBufC* contactName =
       
   381                             iParams.iUtils->GetContactNameL( *iRetrievedStoreContact );
       
   382                         CleanupStack::PushL( contactName );
       
   383                         iParams.iUtils->ShowInfoNoteL(
       
   384                             R_QTN_FS_NOTE_NO_NUMBER_TO_NAME,
       
   385                             contactName );
       
   386                         CleanupStack::PopAndDestroy( contactName );
       
   387                         
       
   388                         ResetData();
       
   389                         aObserver->ExecuteComplete();
       
   390                         return;
       
   391                         }
       
   392                     }
       
   393                 else if ( aActionUid == KFscActionUidCallConfNum )
       
   394                     {
       
   395                     //Fix for: TJUA-7RRG58
       
   396                     TInt value( KErrNotFound );
       
   397 
       
   398                     CRepository* rep = CRepository::NewL( KCRUidRichCallSettings );
       
   399                     rep->Get( KRCSEPreferredTelephony, value );
       
   400                     if ( KRCSEInternetCallPreferred == value )
       
   401                         {
       
   402                         callType = CAiwDialData::EAIWVoiP;
       
   403                         }
       
   404                     else
       
   405                         {
       
   406                         callType = CAiwDialData::EAIWVoice;
       
   407                         }
       
   408                     delete rep;
       
   409                     //end for fix
       
   410                     
       
   411                     TBuf<KMaxLengthOfNumberString> numberWithDtmf;
       
   412                     TBuf<KMaxConfIdLen> confNum;
       
   413                     TBuf<KMaxConfIdLen> confId;
       
   414                     TBuf<KMaxConfPinLen> confPin;
       
   415                     iParams.iUtils->GetConfInfoL( *iRetrievedStoreContact,
       
   416                             confNum, confId, confPin );
       
   417                 
       
   418                     numberWithDtmf.Append( confNum );
       
   419                     if ( confId.Length() > 0 )
       
   420                         {
       
   421                         numberWithDtmf.Append( KDtmfPause );
       
   422                         numberWithDtmf.Append( confId );
       
   423                         if ( confPin.Length() > 0 )
       
   424                             {
       
   425                             numberWithDtmf.Append( KDtmfPause );
       
   426                             numberWithDtmf.Append( confPin );
       
   427                             }
       
   428                         }
       
   429                     vPbkPhNo.Copy( numberWithDtmf.Left( KMaxLengthOfNumber ) );
       
   430                     }
       
   431                  else if ( aActionUid == KFscActionUidCallVoip )
       
   432                        {
       
   433                        callType = CAiwDialData::EAIWVoiP;
       
   434                        TInt err = iParams.iUtils->GetVoipAddressL( 
       
   435                                *iRetrievedStoreContact, vPbkPhNo );
       
   436                        
       
   437                        if ( err == KErrNotFound )
       
   438                            {
       
   439                            err = iParams.iUtils->GetVoiceCallNumberL( 
       
   440                                    *iRetrievedStoreContact, vPbkPhNo );
       
   441                            }
       
   442                        
       
   443                        if ( err == KErrNotFound ) //Phone number is missing 
       
   444 						   {
       
   445 						   HBufC* contactName =
       
   446 							   iParams.iUtils->GetContactNameL( *iRetrievedStoreContact );
       
   447 						   CleanupStack::PushL( contactName );
       
   448 						   iParams.iUtils->ShowInfoNoteL(
       
   449 							   R_QTN_FS_NOTE_NO_VOIP_TO_NAME,
       
   450 							   contactName );
       
   451 						   CleanupStack::PopAndDestroy( contactName );
       
   452 						   
       
   453 						   ResetData();
       
   454 						   aObserver->ExecuteComplete();
       
   455 						   return;
       
   456 						   }
       
   457                        }
       
   458 
       
   459                 if ( vPbkPhNo.Length() > 0 )
       
   460                      {
       
   461                      MakeAiwCallL( vPbkPhNo, callType );
       
   462                      }      
       
   463                 ResetData();
       
   464                 aObserver->ExecuteComplete();
       
   465                 break;
       
   466                 }
       
   467             case EActionEventCanceled:
       
   468                 {
       
   469                 iLastEvent = EActionEventIdle;
       
   470                 break;
       
   471                 }
       
   472             default:
       
   473                 {
       
   474                 ResetData();
       
   475                 break; // <cmail>
       
   476                 }
       
   477             }
       
   478  
       
   479         }
       
   480 
       
   481 // ---------------------------------------------------------------------------
       
   482 // CFscCallPluginImpl::GetReasonL
       
   483 // ---------------------------------------------------------------------------
       
   484 //
       
   485 void CFscCallPluginImpl::GetReasonL(
       
   486     TUid /* aActionUid */,
       
   487     TInt /* aReasonId */,
       
   488     HBufC*& /* aReason */ ) const
       
   489     {
       
   490     }
       
   491 
       
   492 // ---------------------------------------------------------------------------
       
   493 // CFscCallPluginImpl::MakeAiwCallL
       
   494 // ---------------------------------------------------------------------------
       
   495 //
       
   496 void CFscCallPluginImpl::MakeAiwCallL(
       
   497     const TDesC& aNumber,
       
   498     CAiwDialData::TCallType aCallType )
       
   499     {
       
   500 	FUNC_LOG;
       
   501     
       
   502     CAiwDialData* dialdata = CAiwDialData::NewLC();
       
   503     CRepository* rep = CRepository::NewL( KCRUidRichCallSettings );
       
   504     TInt ret(KErrNone);
       
   505     TInt err(KErrNone);
       
   506     TInt options(0);
       
   507     options |= KAiwOptASyncronous;
       
   508     
       
   509     dialdata->SetCallType( aCallType );
       
   510     dialdata->SetPhoneNumberL( aNumber );
       
   511     dialdata->SetWindowGroup( CCoeEnv::Static()->RootWin().Identifier() );
       
   512 
       
   513     CAiwGenericParamList& paramList = iAiwServiceHandler->InParamListL();
       
   514     dialdata->FillInParamListL( paramList );
       
   515 
       
   516     if ( aCallType == CAiwDialData::EAIWVoice )
       
   517     	{
       
   518         TInt value( KErrNotFound );
       
   519 	    // force call type to voice (call AIW interface doens't have this option,
       
   520 	    // so we must change the preferred call value in cenrep for the duration
       
   521 	    // of the function call)
       
   522         if ( rep )
       
   523             {
       
   524             rep->Get( KRCSEPreferredTelephony, value );
       
   525             }
       
   526 	    if ( KRCSEInternetCallPreferred == value )
       
   527 		    {
       
   528 		    iPreferredCallValueChanged = ETrue;
       
   529 		    ret = rep->Set( KRCSEPreferredTelephony, KRCSECSCallPreferred ); // must not leave before this is returned to KRCSEInternetCallPreferred
       
   530 		    }
       
   531     	}
       
   532 	delete rep;
       
   533     if( ( iPreferredCallValueChanged && ret == KErrNone ) || !iPreferredCallValueChanged )
       
   534     	{
       
   535 	    TRAP(err, iAiwServiceHandler->ExecuteServiceCmdL
       
   536 	            ( KAiwCmdCall, 
       
   537 	              paramList, 
       
   538 	              iAiwServiceHandler->OutParamListL(),
       
   539 	              options, 
       
   540 	              this ));
       
   541     	}
       
   542 
       
   543     User::LeaveIfError(err);
       
   544     CleanupStack::PopAndDestroy(); // this
       
   545     } 
       
   546         
       
   547 // ---------------------------------------------------------------------------
       
   548 // CFscCallPluginImpl::CanExecuteL
       
   549 // ---------------------------------------------------------------------------
       
   550 //
       
   551 void CFscCallPluginImpl::CanExecuteL(
       
   552     TUid aActionUid,
       
   553     MFscContactSet& aContactSet )
       
   554     {
       
   555 	FUNC_LOG;
       
   556     
       
   557     switch(iLastEvent)
       
   558         {
       
   559         case EActionEventCanExecuteLaunched:
       
   560             {
       
   561             if ( aActionUid == KFscActionUidCallGsm )
       
   562                 {
       
   563                 iCanDisplay = ( aContactSet.GroupCount() == 0 
       
   564                         && aContactSet.ContactCount() == 1 ) ?
       
   565                     KErrNone : KErrArgument;
       
   566                 if ( iCanDisplay == KErrNone )
       
   567                     {
       
   568                     iLastEvent = EActionEventContactRetrieve;
       
   569                     aContactSet.NextContactL(this);
       
   570                     }
       
   571                 else 
       
   572                     {
       
   573                     iLastEvent = EActionEventCanExecuteFinished;
       
   574                     ResumeAsync(aActionUid, aContactSet, iIsExecute);
       
   575                     }
       
   576                 }
       
   577             else if ( aActionUid == KFscActionUidCallVideo )
       
   578                 {
       
   579                 iCanDisplay = ( aContactSet.GroupCount() == 0 
       
   580                         && aContactSet.ContactCount() == 1 ) ?
       
   581                     KErrNone : KErrArgument;
       
   582                 if ( iCanDisplay == KErrNone )
       
   583                     {
       
   584                     iLastEvent = EActionEventContactRetrieve;
       
   585                     aContactSet.NextContactL(this);
       
   586                     }
       
   587                 else 
       
   588                     {
       
   589                     iLastEvent = EActionEventCanExecuteFinished;
       
   590                     ResumeAsync(aActionUid, aContactSet, iIsExecute);
       
   591                     }
       
   592                 // 3G Network availability is checked inside 
       
   593                 // PriorityForContactSetL()
       
   594                 }        
       
   595             else if ( aActionUid == KFscActionUidCallConfNum )
       
   596                 {
       
   597                 // One Group and Zero Contacts
       
   598                 iCanDisplay = ( aContactSet.GroupCount() == 1 
       
   599                         && aContactSet.ContactCount() == 0 ) ?
       
   600                         KErrNone : KErrArgument;
       
   601                 if ( iCanDisplay == KErrNone )
       
   602                     {
       
   603                     iLastEvent = EActionEventGroupRetrieve;
       
   604                     aContactSet.NextGroupL(this);
       
   605                     }
       
   606                 else 
       
   607                     {
       
   608                     iLastEvent = EActionEventCanExecuteFinished;
       
   609                     ResumeAsync(aActionUid, aContactSet, iIsExecute);
       
   610                     }
       
   611                 }             
       
   612                 else if ( aActionUid == KFscActionUidCallVoip )
       
   613                     {
       
   614                     iCanDisplay = ( aContactSet.GroupCount() == 0 
       
   615                             && aContactSet.ContactCount() == 1 ) ?
       
   616                         KErrNone : KErrArgument;
       
   617                     if ( iCanDisplay == KErrNone )
       
   618                         {
       
   619                         iLastEvent = EActionEventContactRetrieve;
       
   620                         aContactSet.NextContactL(this);
       
   621                         }
       
   622                     else 
       
   623                         {
       
   624                         iLastEvent = EActionEventCanExecuteFinished;
       
   625                         ResumeAsync(aActionUid, aContactSet, iIsExecute);
       
   626                         }
       
   627                     }        
       
   628                 else
       
   629                     {
       
   630                     iLastEvent = EActionEventIdle;
       
   631                     ResetData();
       
   632                     iPluginObserver->PriorityForContactSetFailed(KErrArgument);
       
   633                     }
       
   634 
       
   635                 break;
       
   636                 }
       
   637             case EActionEventCanExecuteFinished:
       
   638                 {
       
   639                 if ( aActionUid == KFscActionUidCallGsm )
       
   640                     {
       
   641                     iCanDisplay = 
       
   642                         (iParams.iUtils->IsContactNumberAvailableL( 
       
   643                                 *iRetrievedStoreContact, 
       
   644                                 ETypeVoiceCallNumber ) ) ? KErrNone : 
       
   645                                     KErrArgument;
       
   646                     
       
   647                     ResumeAsync(aActionUid, aContactSet, iIsExecute);
       
   648                     }
       
   649                 else if ( aActionUid == KFscActionUidCallVideo )
       
   650                     {
       
   651                     iCanDisplay = ( iParams.iUtils->IsContactNumberAvailableL( 
       
   652                             *iRetrievedStoreContact, ETypeVideoCallNumber ) ) 
       
   653                             ? KErrNone : KErrArgument;
       
   654                     
       
   655                     // or phone number if internet call number is missing
       
   656                     if ( iCanDisplay == KErrArgument )
       
   657                         {
       
   658                         iCanDisplay = ( 
       
   659                                 iParams.iUtils->IsContactNumberAvailableL( 
       
   660                                         *iRetrievedStoreContact, 
       
   661                                         ETypeVoiceCallNumber ) ) ? KErrNone : 
       
   662                                             KErrArgument;
       
   663                         }
       
   664                     
       
   665                     ResumeAsync(aActionUid, aContactSet, iIsExecute);
       
   666                     // 3G Network availability is checked inside 
       
   667                     // PriorityForContactSetL()
       
   668                     }
       
   669                 else if ( aActionUid == KFscActionUidCallConfNum )
       
   670                     {
       
   671                     iCanDisplay = ( iParams.iUtils->IsContactNumberAvailableL( 
       
   672                             *iRetrievedStoreContact, 
       
   673                         ETypeConfNumber ) ) ? KErrNone : KErrArgument;
       
   674                     
       
   675                     ResumeAsync(aActionUid, aContactSet, iIsExecute);
       
   676                     }   
       
   677                 else if ( aActionUid == KFscActionUidCallVoip )
       
   678                     {
       
   679                     // Intenet call number
       
   680                     iCanDisplay = ( iParams.iUtils->IsContactNumberAvailableL( 
       
   681                             *iRetrievedStoreContact, ETypeInternetTel ) ) ? 
       
   682                                     KErrNone : KErrArgument;
       
   683                     
       
   684                     // or phone number if internet call number is missing
       
   685                     if ( iCanDisplay == KErrArgument )
       
   686                     	{
       
   687                     	iCanDisplay = ( 
       
   688                     	        iParams.iUtils->IsContactNumberAvailableL( 
       
   689                     	                *iRetrievedStoreContact, 
       
   690                     	                ETypeVoiceCallNumber ) ) ? KErrNone : 
       
   691                     	                    KErrArgument;
       
   692                     	}
       
   693                         
       
   694                     ResumeAsync( aActionUid, aContactSet, iIsExecute );
       
   695                     }     
       
   696                 else
       
   697                     {
       
   698                     ResetData();
       
   699                     if (iIsExecute)
       
   700                         {
       
   701                         iPluginObserver->ExecuteFailed(KErrArgument);
       
   702                         }
       
   703                     else
       
   704                         {
       
   705                         iPluginObserver->PriorityForContactSetFailed(
       
   706                                 KErrArgument);
       
   707                         }
       
   708                     }
       
   709                 break;
       
   710                 }
       
   711             case EActionEventCanceled:
       
   712                 {
       
   713                 iLastEvent = EActionEventIdle;
       
   714                 break;
       
   715                 }
       
   716             default:
       
   717                 {
       
   718                 ResetData();
       
   719                 break; // <cmail>
       
   720                 }
       
   721             }
       
   722 
       
   723     }
       
   724 
       
   725 // ---------------------------------------------------------------------------
       
   726 // CFscCallPluginImpl::UpdateActionIconL
       
   727 // ---------------------------------------------------------------------------
       
   728 //
       
   729 void CFscCallPluginImpl::UpdateActionIconL( TUid aActionUid )
       
   730     {
       
   731 	FUNC_LOG;
       
   732 
       
   733     TFileName dllFileName;
       
   734     Dll::FileName( dllFileName );
       
   735     TParse parse;
       
   736     User::LeaveIfError(
       
   737         parse.Set( KCallPluginIconPath, &dllFileName, NULL ) );
       
   738 
       
   739 // <cmail> icons changed
       
   740     if ( aActionUid == KFscActionUidCallGsm )
       
   741         {
       
   742         iContactCallGsmAction->SetIcon( iParams.iUtils->SkinIconL(
       
   743                 KAknsIIDQgnFsActionCall,
       
   744                 parse.FullName(),
       
   745                 EMbmFsccallpluginQgn_prop_cmail_action_call,
       
   746                 EMbmFsccallpluginQgn_prop_cmail_action_call_mask ) );
       
   747         }
       
   748     else if ( aActionUid == KFscActionUidCallVideo )
       
   749         {
       
   750         iContactCallVideoAction->SetIcon( iParams.iUtils->SkinIconL(
       
   751                 KAknsIIDQgnFsActionVidcall,
       
   752                 parse.FullName(),
       
   753                 EMbmFsccallpluginQgn_prop_cmail_action_call_video,
       
   754                 EMbmFsccallpluginQgn_prop_cmail_action_call_video_mask ) );        
       
   755         }
       
   756     else if ( aActionUid == KFscActionUidCallConfNum )
       
   757         {
       
   758         iContactCallConfNumAction->SetIcon( iParams.iUtils->SkinIconL(
       
   759                 KAknsIIDQgnFsActionConfService,
       
   760                 parse.FullName(),
       
   761                 EMbmFsccallpluginQgn_prop_cmail_action_conf_service,
       
   762                 EMbmFsccallpluginQgn_prop_cmail_action_conf_service_mask ) );
       
   763         }
       
   764     else if ( aActionUid == KFscActionUidCallVoip )
       
   765         {
       
   766         iContactCallVoipAction->SetIcon( iParams.iUtils->SkinIconL(
       
   767                 KAknsIIDQgnFsActionVoip,
       
   768                 parse.FullName(),
       
   769                 EMbmFsccallpluginQgn_prop_cmail_action_voip,
       
   770                 EMbmFsccallpluginQgn_prop_cmail_action_voip_mask ) );        
       
   771         }
       
   772 // </cmail>    
       
   773     }
       
   774 
       
   775 // ---------------------------------------------------------------------------
       
   776 // CFscCallPluginImpl::CFscCallPluginImpl
       
   777 // ---------------------------------------------------------------------------
       
   778 //
       
   779 CFscCallPluginImpl::CFscCallPluginImpl(
       
   780     const TFscContactActionPluginParams& aParams )
       
   781     : CFscContactActionPlugin(),
       
   782     iParams( aParams ),
       
   783     iResourceHandle( 0 ),
       
   784     iLastEvent( EActionEventIdle ),
       
   785     iCanDisplay( KErrNone ),
       
   786     iIsExecute( EFalse )
       
   787     {
       
   788     }
       
   789 
       
   790 // ---------------------------------------------------------------------------
       
   791 // CFscCallPluginImpl::ConstructL
       
   792 // ---------------------------------------------------------------------------
       
   793 //
       
   794 void CFscCallPluginImpl::ConstructL()
       
   795     {
       
   796 	FUNC_LOG;
       
   797     TFileName dllFileName;
       
   798     Dll::FileName( dllFileName );
       
   799     TParse parse;
       
   800     User::LeaveIfError( parse.Set( KResourceFilePath, &dllFileName, NULL ) );
       
   801     TFileName resourceFileName( parse.FullName() );
       
   802     BaflUtils::NearestLanguageFile( CCoeEnv::Static()->FsSession(), 
       
   803         resourceFileName );
       
   804     
       
   805     iResourceHandle = 
       
   806         ( CCoeEnv::Static() )->AddResourceFileL( resourceFileName );
       
   807 
       
   808     iActionList = new( ELeave ) CArrayFixFlat<TUid>( KActionCount );
       
   809     
       
   810     User::LeaveIfError(
       
   811         parse.Set( KCallPluginIconPath, &dllFileName, NULL ) );
       
   812 
       
   813 // <cmail> icons changed    
       
   814     iActionList->AppendL( KFscActionUidCallGsm );
       
   815     iContactCallGsmAction = iParams.iUtils->CreateActionL(
       
   816         *this,
       
   817         KFscActionUidCallGsm,
       
   818         KFscAtComCallGSM,
       
   819         R_FS_ACTION_CALL,
       
   820         iParams.iUtils->SkinIconL(
       
   821             KAknsIIDQgnFsActionCall,
       
   822             parse.FullName(),
       
   823             EMbmFsccallpluginQgn_prop_cmail_action_call,
       
   824             EMbmFsccallpluginQgn_prop_cmail_action_call_mask ) );
       
   825 
       
   826     iActionList->AppendL( KFscActionUidCallVideo );
       
   827     iContactCallVideoAction = iParams.iUtils->CreateActionL(
       
   828         *this,
       
   829         KFscActionUidCallVideo,
       
   830         KFscAtComCallVideo,
       
   831         R_FS_ACTION_VIDCALL,
       
   832         iParams.iUtils->SkinIconL(
       
   833             KAknsIIDQgnFsActionVidcall,
       
   834             parse.FullName(),
       
   835             EMbmFsccallpluginQgn_prop_cmail_action_call_video,
       
   836             EMbmFsccallpluginQgn_prop_cmail_action_call_video_mask ) );
       
   837 
       
   838     iActionList->AppendL( KFscActionUidCallConfNum );
       
   839     iContactCallConfNumAction = iParams.iUtils->CreateActionL(
       
   840         *this,
       
   841         KFscActionUidCallConfNum,
       
   842         KFscAtComCallConfNum,
       
   843         R_FS_ACTION_CONF_SERVICE,
       
   844         iParams.iUtils->SkinIconL(
       
   845             KAknsIIDQgnFsActionConfService,
       
   846             parse.FullName(),
       
   847             EMbmFsccallpluginQgn_prop_cmail_action_conf_service,
       
   848             EMbmFsccallpluginQgn_prop_cmail_action_conf_service_mask ) );
       
   849 
       
   850     iActionList->AppendL( KFscActionUidCallVoip );
       
   851     iContactCallVoipAction = iParams.iUtils->CreateActionL(
       
   852         *this,
       
   853         KFscActionUidCallVoip,
       
   854         KFscAtComCallVoip,
       
   855         R_FS_ACTION_VOIP,
       
   856         iParams.iUtils->SkinIconL(
       
   857             KAknsIIDQgnFsActionVoip,
       
   858             parse.FullName(),
       
   859             EMbmFsccallpluginQgn_prop_cmail_action_voip,
       
   860             EMbmFsccallpluginQgn_prop_cmail_action_voip_mask ) );
       
   861 // </cmail>
       
   862 
       
   863     iAiwServiceHandler = CAiwServiceHandler::NewL();
       
   864     iAiwServiceHandler->AttachL( R_CALLPLUGIN_INTEREST );
       
   865     
       
   866     iPreferredCallValueChanged = EFalse;
       
   867     }
       
   868 
       
   869 // ---------------------------------------------------------------------------
       
   870 // CFscCallPluginImpl::ResetData
       
   871 // ---------------------------------------------------------------------------
       
   872 //
       
   873 void CFscCallPluginImpl::ResetData()
       
   874     {
       
   875 	FUNC_LOG;
       
   876     if (iContactSet)
       
   877         {
       
   878         // <cmail>
       
   879         TRAP_IGNORE( iContactSet->CancelNextContactL() );
       
   880         TRAP_IGNORE( iContactSet->CancelNextGroupL() );
       
   881         // </cmail>
       
   882         iContactSet->SetToFirstContact();
       
   883         iContactSet->SetToFirstGroup();
       
   884         iContactSet = NULL;
       
   885         }
       
   886     
       
   887     iLastEvent = EActionEventIdle;
       
   888     iActionMenuVisibility = NULL;
       
   889     iOptionsMenuVisibility = NULL;
       
   890     iCanDisplay = KErrNone;
       
   891     iRetrievedStoreContact = NULL;
       
   892     }
       
   893 
       
   894 // ---------------------------------------------------------------------------
       
   895 // CFscCallPluginImpl::ResumeAsync
       
   896 // ---------------------------------------------------------------------------
       
   897 //
       
   898 void CFscCallPluginImpl::ResumeAsync(
       
   899             TUid aActionUid,
       
   900             MFscContactSet& aContactSet,
       
   901             TBool aIsExecute )
       
   902     {
       
   903 	FUNC_LOG;
       
   904     TInt err( KErrNone );
       
   905     if (aIsExecute)
       
   906         {
       
   907         TRAP( err, ExecuteL( aActionUid, aContactSet, iPluginObserver ) );
       
   908         }
       
   909     else 
       
   910         {
       
   911         TRAP( err, PriorityForContactSetL( 
       
   912             aActionUid,
       
   913             aContactSet,
       
   914             *iActionMenuVisibility,
       
   915             *iOptionsMenuVisibility,
       
   916             iPluginObserver ) );
       
   917         }
       
   918     
       
   919     if ( err != KErrNone )
       
   920         {
       
   921         ResetData();
       
   922         if ( aIsExecute )
       
   923             {
       
   924             iPluginObserver->ExecuteFailed( err );
       
   925             }
       
   926         else
       
   927             {
       
   928             iPluginObserver->PriorityForContactSetFailed( err );
       
   929             }
       
   930         }
       
   931     }
       
   932 
       
   933 // ---------------------------------------------------------------------------
       
   934 // CFscCallPluginImpl::NextContactComplete
       
   935 // ---------------------------------------------------------------------------
       
   936 //
       
   937 void CFscCallPluginImpl::NextContactComplete( MVPbkStoreContact* aContact )
       
   938     {
       
   939 	FUNC_LOG;
       
   940     TInt err( KErrNone );
       
   941     switch(iLastEvent)
       
   942         {
       
   943         case EActionEventContactRetrieve:
       
   944             {
       
   945             iRetrievedStoreContact = aContact;
       
   946             iLastEvent = EActionEventCanExecuteFinished;
       
   947             TRAP( err, CanExecuteL( iActionUid, *iContactSet ) );
       
   948             break;
       
   949             }
       
   950         case EActionEventCanceled:
       
   951             {
       
   952             iLastEvent = EActionEventIdle;
       
   953             break;
       
   954             }
       
   955         default:
       
   956             {
       
   957             ResetData();
       
   958             break; // <cmail>
       
   959             }
       
   960         }
       
   961     
       
   962     if ( err != KErrNone )
       
   963         {
       
   964         ResetData();
       
   965         if ( iIsExecute )
       
   966             {
       
   967             iPluginObserver->ExecuteFailed( err );
       
   968             }
       
   969         else
       
   970             {
       
   971             iPluginObserver->PriorityForContactSetFailed( err );
       
   972             }
       
   973         }
       
   974     }
       
   975 
       
   976 // ---------------------------------------------------------------------------
       
   977 // CFscCallPluginImpl::NextContactFailed
       
   978 // ---------------------------------------------------------------------------
       
   979 //
       
   980 void CFscCallPluginImpl::NextContactFailed( TInt aError )
       
   981     {
       
   982 	FUNC_LOG;
       
   983     ResetData();
       
   984     if (iIsExecute)
       
   985         {
       
   986         iPluginObserver->ExecuteFailed(aError);
       
   987         }
       
   988     else
       
   989         {
       
   990         iPluginObserver->PriorityForContactSetFailed(aError);
       
   991         }
       
   992     }
       
   993 
       
   994 // ---------------------------------------------------------------------------
       
   995 // CFscCallPluginImpl::NextGroupComplete
       
   996 // ---------------------------------------------------------------------------
       
   997 //
       
   998 void CFscCallPluginImpl::NextGroupComplete( MVPbkStoreContact* aContact )
       
   999     {
       
  1000 	FUNC_LOG;
       
  1001     TInt err( KErrNone );
       
  1002     switch(iLastEvent)
       
  1003         {
       
  1004         case EActionEventGroupRetrieve:
       
  1005             {
       
  1006             iLastEvent = EActionEventCanExecuteFinished;
       
  1007             iRetrievedStoreContact = aContact;
       
  1008             TRAP( err, CanExecuteL( iActionUid, *iContactSet ) );
       
  1009             break;
       
  1010             }
       
  1011         case EActionEventCanceled:
       
  1012             {
       
  1013             iLastEvent = EActionEventIdle;
       
  1014             break;
       
  1015             }
       
  1016         default:
       
  1017             {
       
  1018             ResetData();
       
  1019             break; // <cmail>
       
  1020             }
       
  1021         }
       
  1022     if ( err != KErrNone )
       
  1023         {
       
  1024         ResetData();
       
  1025         if ( iIsExecute )
       
  1026             {
       
  1027             iPluginObserver->ExecuteFailed( err );
       
  1028             }
       
  1029         else
       
  1030             {
       
  1031             iPluginObserver->PriorityForContactSetFailed( err );
       
  1032             }
       
  1033         }
       
  1034     }
       
  1035 
       
  1036 // ---------------------------------------------------------------------------
       
  1037 // CFscCallPluginImpl::NextGroupFailed
       
  1038 // ---------------------------------------------------------------------------
       
  1039 //
       
  1040 void CFscCallPluginImpl::NextGroupFailed( TInt aError )
       
  1041     {
       
  1042 	FUNC_LOG;
       
  1043     ResetData();
       
  1044     if (iIsExecute)
       
  1045         {
       
  1046         iPluginObserver->ExecuteFailed(aError);
       
  1047         }
       
  1048     else
       
  1049         {
       
  1050         iPluginObserver->PriorityForContactSetFailed(aError);
       
  1051         }
       
  1052     }
       
  1053 
       
  1054 // ---------------------------------------------------------------------------
       
  1055 // CFscCallPluginImpl::GetGroupContactComplete
       
  1056 // ---------------------------------------------------------------------------
       
  1057 //
       
  1058 void CFscCallPluginImpl::GetGroupContactComplete( MVPbkStoreContact* /*aContact*/ )
       
  1059     {    
       
  1060     }
       
  1061 
       
  1062 // ---------------------------------------------------------------------------
       
  1063 // CFscCallPluginImpl::GetGroupContactComplete
       
  1064 // ---------------------------------------------------------------------------
       
  1065 //
       
  1066 void CFscCallPluginImpl::GetGroupContactFailed( TInt aError )
       
  1067     {
       
  1068 	FUNC_LOG;
       
  1069     ResetData();
       
  1070     if (iIsExecute)
       
  1071         {
       
  1072         iPluginObserver->ExecuteFailed(aError);
       
  1073         }
       
  1074     else
       
  1075         {
       
  1076         iPluginObserver->PriorityForContactSetFailed(aError);
       
  1077         }
       
  1078     }
       
  1079 
       
  1080 // ---------------------------------------------------------------------------
       
  1081 // CFscCallPluginImpl::CancelPriorityForContactSet
       
  1082 // ---------------------------------------------------------------------------
       
  1083 //
       
  1084 void CFscCallPluginImpl::CancelPriorityForContactSet()
       
  1085     {
       
  1086 	FUNC_LOG;
       
  1087     iLastEvent = EActionEventCanceled;
       
  1088     ResetData();
       
  1089     }
       
  1090 
       
  1091 // ---------------------------------------------------------------------------
       
  1092 // CFscCallPluginImpl::CancelExecute
       
  1093 // ---------------------------------------------------------------------------
       
  1094 //
       
  1095 void CFscCallPluginImpl::CancelExecute()
       
  1096     {
       
  1097 	FUNC_LOG;
       
  1098     // set action
       
  1099     iLastEvent = EActionEventCanceled;
       
  1100     ResetData();
       
  1101     
       
  1102     // close popup window for selecting number if opened
       
  1103     TRAPD( err, iParams.iUtils->CloseSelectDialogL() );
       
  1104     
       
  1105     if ( err != KErrNone )
       
  1106         {
       
  1107         CCoeEnv::Static()->HandleError( err );
       
  1108         }    
       
  1109     }
       
  1110 
       
  1111 // ---------------------------------------------------------------------------
       
  1112 // CFscCallPluginImpl::HandleNotifyL
       
  1113 // ---------------------------------------------------------------------------
       
  1114 //
       
  1115 TInt CFscCallPluginImpl::HandleNotifyL(
       
  1116         TInt /*aCmdId*/,
       
  1117         TInt /*aEventId*/,
       
  1118         CAiwGenericParamList& /*aEventParamList*/,
       
  1119         const CAiwGenericParamList& /*aInParamList*/)
       
  1120 	{
       
  1121 	FUNC_LOG;
       
  1122 	if( iPreferredCallValueChanged )
       
  1123 		{
       
  1124 		CRepository* rep = CRepository::NewL( KCRUidRichCallSettings );
       
  1125 		
       
  1126 		if ( rep )
       
  1127 		    {
       
  1128 		    rep->Set( KRCSEPreferredTelephony, KRCSEInternetCallPreferred );
       
  1129 		    }
       
  1130 		delete rep;
       
  1131 		iPreferredCallValueChanged = EFalse;
       
  1132 		}
       
  1133 	return KErrNone;
       
  1134 	}
       
  1135 
       
  1136 // ======== GLOBAL FUNCTIONS ========
       
  1137 
       
  1138 // ---------------------------------------------------------------------------
       
  1139 // ImplementationGroupProxy
       
  1140 // ---------------------------------------------------------------------------
       
  1141 //
       
  1142 EXPORT_C const TImplementationProxy* ImplementationGroupProxy(
       
  1143     TInt& aTableCount )
       
  1144     {
       
  1145 	FUNC_LOG;
       
  1146     aTableCount = 
       
  1147         sizeof( ImplementationTable ) / sizeof( TImplementationProxy );
       
  1148     return ImplementationTable;
       
  1149     }
       
  1150