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