phoneapp/phoneuivoipextension/src/cphonevoiperrormessageshandler.cpp
changeset 37 ba76fc04e6c2
child 51 f39ed5e045e0
child 53 22cc52eade9b
equal deleted inserted replaced
36:2eacb6118286 37:ba76fc04e6c2
       
     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 CPhoneVoIPErrorMessagesHandler class.
       
    15 *
       
    16 */
       
    17 
       
    18 // INCLUDES
       
    19 
       
    20 #include <ccpdefs.h>
       
    21 #include <mpeengineinfo.h>
       
    22 #include <StringLoader.h>
       
    23 #include <spsettings.h>
       
    24 #include <spentry.h>
       
    25 #include <telephonydomainpskeys.h>
       
    26 #include <UikonInternalPSKeys.h>
       
    27 #include <aknnotedialog.h>
       
    28 #include "cphonevoiperrormessageshandler.h"
       
    29 #include "cphonemainerrormessageshandler.h"
       
    30 #include "cphoneerrormessageshandler.h"
       
    31 #include "cphonestatehandle.h"
       
    32 #include "phonerssvoip.h"
       
    33 #include "phonelogger.h"
       
    34 #include "tphonecmdparamglobalnote.h"
       
    35 #include "tphonecmdparaminteger.h"
       
    36 #include "cphonemainresourceresolver.h"
       
    37 #include "phoneui.pan"
       
    38 #include "cphonepubsubproxy.h"
       
    39 #include "tphonecmdparamboolean.h"
       
    40 #include "cphonestatemachinevoip.h"
       
    41 #include "cphonecustomizationvoip.h"
       
    42 
       
    43 // ================= MEMBER FUNCTIONS =======================
       
    44 
       
    45 // C++ default constructor can NOT contain any code, that
       
    46 // might leave.
       
    47 //
       
    48 CPhoneVoIPErrorMessagesHandler::CPhoneVoIPErrorMessagesHandler(
       
    49     MPhoneViewCommandHandle* aViewCommandHandle,
       
    50     MPhoneStateMachine* aPhoneStateMachine ) :
       
    51     CPhoneErrorMessagesHandler( aViewCommandHandle, aPhoneStateMachine )
       
    52     {
       
    53     static_cast<CPhoneStateMachineVoIP*>( iStateMachine )->
       
    54         SetVoipErrorMessageHandler( *this );
       
    55     }
       
    56 
       
    57 // -----------------------------------------------------------
       
    58 // CPhoneErrorMessagesHandler::~CPhoneErrorMessagesHandler()
       
    59 // Destructor
       
    60 // (other items were commented in a header).
       
    61 // -----------------------------------------------------------
       
    62 //
       
    63 CPhoneVoIPErrorMessagesHandler::~CPhoneVoIPErrorMessagesHandler()
       
    64     {
       
    65      
       
    66     }
       
    67 
       
    68 // -----------------------------------------------------------------------------
       
    69 // CPhoneVoIPErrorMessagesHandler::ConstructL
       
    70 // Symbian 2nd phase constructor can leave.
       
    71 // -----------------------------------------------------------------------------
       
    72 //
       
    73 void CPhoneVoIPErrorMessagesHandler::ConstructL()
       
    74     {
       
    75     // Register error handler
       
    76     CPhoneMainErrorMessagesHandler::Instance()->
       
    77         RegisterErrorMessagesHandler( this );
       
    78     }
       
    79 
       
    80 // -----------------------------------------------------------
       
    81 // CPhoneVoIPErrorMessagesHandler::NewL()
       
    82 // Constructor
       
    83 // -----------------------------------------------------------
       
    84 //
       
    85 CPhoneVoIPErrorMessagesHandler* CPhoneVoIPErrorMessagesHandler::NewL(
       
    86     MPhoneViewCommandHandle* aViewCommandHandle,
       
    87     MPhoneStateMachine* aPhoneStateMachine )
       
    88     {
       
    89     CPhoneVoIPErrorMessagesHandler* self =
       
    90         new( ELeave ) CPhoneVoIPErrorMessagesHandler(
       
    91             aViewCommandHandle,
       
    92             aPhoneStateMachine );
       
    93     CleanupStack::PushL( self );
       
    94     self->ConstructL();
       
    95     CleanupStack::Pop( self );
       
    96     return self;
       
    97     }
       
    98 
       
    99 // -----------------------------------------------------------
       
   100 // CPhoneVoIPErrorMessagesHandler::ShowErrorSpecificNoteL
       
   101 // -----------------------------------------------------------
       
   102 //
       
   103 void CPhoneVoIPErrorMessagesHandler::ShowErrorSpecificNoteL( 
       
   104     const TPEErrorInfo& aErrorInfo )
       
   105     {
       
   106     __LOGMETHODSTARTEND(PhoneUIVoIPExtension, "CPhoneVoipErrorMessagesHandler::ShowErrorSpecificNoteL()");
       
   107 
       
   108     __PHONELOG1( EBasic, PhoneUIVoIPExtension,
       
   109             "CPhoneVoIPErrorMessagesHandler::ShowErrorSpecificNoteL - aErrorInfo.iErrorCode =%d ",
       
   110             aErrorInfo.iErrorCode);
       
   111 
       
   112     if ( aErrorInfo.iErrorType == EPECcp && IsVoIPCall( aErrorInfo.iCallId ) )
       
   113         {
       
   114         switch( aErrorInfo.iErrorCode )
       
   115             {
       
   116             case ECCPErrorNotAcceptable:
       
   117             case ECCPErrorCCServiceNotImplemented:
       
   118                 SendGlobalErrorNoteL( EPhoneVoIPNoAudioSupport );
       
   119                 break;
       
   120 
       
   121             case ECCPLocalResumeFail:
       
   122                 if ( HasSwapFailed() )
       
   123                     {
       
   124                     SendGlobalErrorNoteL( EPhoneVoIPSwapFail );
       
   125                     }
       
   126                 else
       
   127                     {
       
   128                     HandleHoldErrorNotesL( aErrorInfo.iCallId, EFalse );
       
   129                     }
       
   130                 break;
       
   131             case ECCPLocalHoldFail:
       
   132                 if ( HasSwapFailed() )
       
   133                     {
       
   134                     SendGlobalErrorNoteL( EPhoneVoIPSwapFail );
       
   135                     }
       
   136                 else
       
   137                     {
       
   138                     HandleHoldErrorNotesL( aErrorInfo.iCallId, ETrue );
       
   139                     }
       
   140                 break;
       
   141 
       
   142             case ECCPServerFailure:
       
   143             case ECCPErrorNetworkBusy:
       
   144                 SendGlobalErrorNoteL( EPhoneVoIPNoService );
       
   145                 break;
       
   146 
       
   147             case ECCPErrorNotReached:
       
   148                 SendGlobalErrorNoteL( EPhoneVoIPNotFound );
       
   149                 break;
       
   150             case ECCPErrorCCIncompatibleDestination:
       
   151                 SendGlobalErrorNoteL( EPhoneVoIPAddressNotInUse );
       
   152                 break;
       
   153 
       
   154             case ECCPErrorTimedOut:
       
   155             case ECCPErrorCCNoRouteToDestination:
       
   156                 SendGlobalErrorNoteL( EPhoneVoIPRequestTimeOut );
       
   157                 break;
       
   158 
       
   159             case KErrArgument:
       
   160             case ECCPErrorInvalidPhoneNumber:
       
   161             case ECCPErrorInvalidURI:
       
   162                 SendGlobalErrorNoteL( EPhoneVoIPInvalidRecipientAddress );
       
   163                 break;
       
   164 
       
   165             case ECCPErrorBusy:
       
   166             case ECCPErrorCCCallRejected:
       
   167                 SendGlobalErrorNoteL( EPhoneVoIPNumberBusy );
       
   168                 break;
       
   169 
       
   170             case ECCPErrorMovedPermanently:
       
   171                 SendGlobalErrorNoteL( EPhoneVoIPAddressNotInUse );
       
   172                 break;
       
   173 
       
   174             case ECCPErrorCCUserNotResponding:
       
   175             case ECCPErrorNotResponding:
       
   176 
       
   177                 SendGlobalErrorNoteL( EPhoneVoIPNoAnswer );
       
   178                 break;
       
   179   
       
   180             case ECCPGlobalFailure:
       
   181                 SendGlobalErrorNoteL( EPhoneVoIPErrorInConnection );
       
   182                 break;
       
   183 
       
   184             case ECCPSecureCallFailed:    
       
   185             case ECCPErrorUnacceptableChannel:
       
   186                 SendGlobalErrorNoteL( EPhoneSSNotificationTextVoipSipsFailed );
       
   187                 break;
       
   188 
       
   189             case ECCPErrorNetworkOutOfOrder:
       
   190             case ECCPErrorMedia:
       
   191                 SendGlobalErrorNoteL( EPhoneVoIPNetworkError );
       
   192                 break;
       
   193                  
       
   194             case ECCPTransferFailed:
       
   195                 iViewCommandHandle->ExecuteCommandL( EPhoneViewRemoveGlobalNote );
       
   196                 SendGlobalErrorNoteL( EPhoneVoIPTransferFail );
       
   197                 break;
       
   198 
       
   199             case ECCPErrorNoService:
       
   200                 {
       
   201                 TInt serviceID = iStateMachine->PhoneEngineInfo()->ServiceId(
       
   202                     aErrorInfo.iCallId );
       
   203                 ShowErrorNoteWithServiceNameL( EPhoneVoIPServiceUnavailable,
       
   204                     serviceID );
       
   205                 }
       
   206                 break;
       
   207             default:
       
   208                 CPhoneErrorMessagesHandler::ShowErrorSpecificNoteL( aErrorInfo );
       
   209                 break;
       
   210             }
       
   211         }
       
   212     else if ( aErrorInfo.iErrorType == EPECch )
       
   213         {
       
   214         ShowRegistrationErrorNotesL( aErrorInfo.iErrorCode );   
       
   215         }
       
   216     else
       
   217         {
       
   218         CPhoneErrorMessagesHandler::ShowErrorSpecificNoteL( aErrorInfo );
       
   219         }
       
   220     }
       
   221 
       
   222 // -----------------------------------------------------------
       
   223 // CPhoneVoipErrorMessagesHandler::IsVoIPCall
       
   224 // -----------------------------------------------------------
       
   225 //
       
   226 TBool CPhoneVoIPErrorMessagesHandler::IsVoIPCall( const TInt aCallId ) const
       
   227     {
       
   228     __LOGMETHODSTARTEND( PhoneUIVoIPExtension, "CPhoneVoIPErrorMessagesHandler::IsVoipCall() ");
       
   229 
       
   230     if( aCallId == KErrNotFound )
       
   231         {
       
   232         // Illegal call id, check call type command
       
   233         return ( iStateMachine->PhoneEngineInfo()->CallTypeCommand()
       
   234             == EPECallTypeVoIP );
       
   235         }
       
   236 
       
   237     return ( iStateMachine->PhoneEngineInfo()
       
   238         ->CallType( aCallId )== EPECallTypeVoIP );
       
   239     }
       
   240 
       
   241 // -----------------------------------------------------------
       
   242 // CPhoneVoipErrorMessagesHandler::HandleHoldErrorNotesL
       
   243 // -----------------------------------------------------------
       
   244 //
       
   245 void CPhoneVoIPErrorMessagesHandler::HandleHoldErrorNotesL( 
       
   246     const TInt aCallId, TBool aHold )
       
   247     {
       
   248     __LOGMETHODSTARTEND( PhoneUIVoIPExtension, "CPhoneVoIPErrorMessagesHandler::HandleHoldNoteL()");
       
   249     
       
   250     TPhoneCmdParamGlobalNote globalNoteParam;
       
   251     HBufC* text = HBufC::NewLC( KPhoneContactNameMaxLength );
       
   252     TPtr tmp = text->Des();
       
   253 
       
   254     // Should add name( or RemotePartyName or CompanyName) to Note, if someone found
       
   255     GetRemoteInfoDataL( aCallId, tmp );
       
   256     
       
   257     if ( text->Length() )
       
   258         {
       
   259         // RemotePartyName, CompanyName or RemoteName found
       
   260         // Resource text which will use found text will be loaded later
       
   261         TInt resource( EPhoneVoIPResumeFail );
       
   262         if ( aHold )
       
   263             {
       
   264             resource = EPhoneVoIPHoldFail;    
       
   265             }
       
   266         
       
   267         // qtn_voip_resume_failed / qtn_voip_hold_failed
       
   268         globalNoteParam.SetTextResourceId(
       
   269             CPhoneMainResourceResolver::Instance()->
       
   270                 ResolveResourceID( resource ) );
       
   271         }
       
   272     else
       
   273         {
       
   274         // Decides note with call id
       
   275         // Resource is loaded here
       
   276         TInt resource = EPhoneVoIPResumeNumberFail;
       
   277         if ( aHold )
       
   278             {
       
   279             resource = EPhoneVoIPHoldNumberFail;    
       
   280             }
       
   281         
       
   282         // qtn_voip_resume_number_failed / qtn_voip_hold_number_failed
       
   283         const TInt tmpResourceId = CPhoneMainResourceResolver::Instance()->
       
   284             ResolveResourceID( resource );
       
   285         
       
   286         TInt callId = aCallId;
       
   287         callId++; // Real call id index starts from 0, increase value by one
       
   288         CleanupStack::PopAndDestroy( text ); // Delete reserver buffer
       
   289         text = StringLoader::LoadLC( 
       
   290                 tmpResourceId, 
       
   291                 callId, 
       
   292                 CCoeEnv::Static() ); // Load new buffer
       
   293 
       
   294         }
       
   295      
       
   296     globalNoteParam.SetText( *text );
       
   297     globalNoteParam.SetType( EAknGlobalConfirmationNote );
       
   298     globalNoteParam.SetTone( EAvkonSIDInformationTone );
       
   299             
       
   300     iViewCommandHandle->ExecuteCommandL( 
       
   301             EPhoneViewShowGlobalNote, &globalNoteParam );
       
   302     
       
   303     CleanupStack::PopAndDestroy( text );
       
   304     }
       
   305 
       
   306 // -----------------------------------------------------------
       
   307 // CPhoneVoIPErrorMessagesHandler::GetRemoteInfoDataL
       
   308 // -----------------------------------------------------------
       
   309 //
       
   310 void CPhoneVoIPErrorMessagesHandler::GetRemoteInfoDataL( 
       
   311     TInt aCallId,
       
   312     TDes& aData ) const 
       
   313     {
       
   314     __LOGMETHODSTARTEND( PhoneUIVoIPExtension, 
       
   315             "CPhoneVoIPErrorMessagesHandler::GetRemoteInfoDataL()" );
       
   316     __ASSERT_DEBUG( iStateMachine->PhoneEngineInfo(),
       
   317             Panic( EPhoneCtrlInvariant ) );
       
   318 
       
   319     // Note next if-statements are in priority order so be careful if you change order
       
   320     // or add new if-statements.
       
   321     if ( iStateMachine->PhoneEngineInfo()->RemoteName( aCallId ).Length() )
       
   322         {
       
   323         __PHONELOG1( EBasic, PhoneUIVoIPExtension, 
       
   324             "CPhoneVoIPErrorMessagesHandler::GetRemoteInfoDataL - remote name = %S", 
       
   325             &iStateMachine->PhoneEngineInfo()->RemoteName( aCallId ) );
       
   326 
       
   327         if ( iStateMachine->PhoneEngineInfo()->RemoteName( aCallId ).Length()
       
   328              < KPhoneContactNameMaxLength )
       
   329             {
       
   330             // Display the contact name if it is available
       
   331             aData.Copy( iStateMachine->PhoneEngineInfo()->RemoteName( aCallId ) );
       
   332             }
       
   333         }
       
   334     else if ( iStateMachine->PhoneEngineInfo()->RemoteCompanyName( aCallId ).Length() )
       
   335          {
       
   336          __PHONELOG1( EBasic, PhoneUIVoIPExtension, 
       
   337              "CPhoneVoIPErrorMessagesHandler::GetRemoteInfoDataL - remote company name = %S", 
       
   338              &iStateMachine->PhoneEngineInfo()->RemoteCompanyName( aCallId ) );
       
   339          
       
   340          if ( iStateMachine->PhoneEngineInfo()->RemoteCompanyName( aCallId ).Length()
       
   341               < KPhoneContactNameMaxLength )
       
   342              {            
       
   343              // Display the company name if it is available
       
   344              aData.Copy( iStateMachine->PhoneEngineInfo()->RemoteCompanyName( aCallId ) );
       
   345              }
       
   346          }
       
   347     else if( iStateMachine->PhoneEngineInfo()->RemotePartyName( aCallId ).Length() )
       
   348         {
       
   349         __PHONELOG1( EBasic, PhoneUIVoIPExtension, 
       
   350             "CPhoneVoIPErrorMessagesHandler::GetRemoteInfoDataL - remote party name = %S", 
       
   351             &iStateMachine->PhoneEngineInfo()->RemotePartyName( aCallId ) );
       
   352         
       
   353         if ( iStateMachine->PhoneEngineInfo()->RemotePartyName( aCallId ).Length()
       
   354              < KPhoneContactNameMaxLength )
       
   355             {            
       
   356             // Display the remote party name if it is available
       
   357             aData.Copy( iStateMachine->PhoneEngineInfo()->RemotePartyName( aCallId ) );
       
   358             }
       
   359         }
       
   360     else
       
   361         {
       
   362         __PHONELOG( EBasic, PhoneUIVoIPExtension, 
       
   363             "CPhoneVoIPErrorMessagesHandler::GetRemoteInfoDataL - not found" );
       
   364         aData.Zero();
       
   365         }
       
   366     }
       
   367 
       
   368 // -----------------------------------------------------------
       
   369 // CPhoneVoIPErrorMessagesHandler::ShowRegistrationErrorNotesL
       
   370 // -----------------------------------------------------------
       
   371 //
       
   372 void CPhoneVoIPErrorMessagesHandler::ShowRegistrationErrorNotesL( 
       
   373     TInt /*aErrorCode*/ )
       
   374     {
       
   375     __LOGMETHODSTARTEND( PhoneUIVoIPExtension, 
       
   376               "CPhoneVoIPErrorMessagesHandler::ShowRegistrationErrorNotesL()" );
       
   377     // Dismiss service enabling wait note
       
   378     iViewCommandHandle->ExecuteCommandL( EPhoneViewRemoveGlobalWaitNote );    
       
   379     }
       
   380 
       
   381 // ---------------------------------------------------------
       
   382 //  CPhoneVoIPErrorMessagesHandler::SendGlobalErrorNoteWithTextL
       
   383 // ---------------------------------------------------------
       
   384 //
       
   385 void CPhoneVoIPErrorMessagesHandler::SendGlobalErrorNoteWithTextL( 
       
   386     TInt aResourceId,
       
   387     RBuf& aText )
       
   388     {
       
   389     __LOGMETHODSTARTEND( PhoneUIVoIPExtension, 
       
   390         "CPhoneVoIPErrorMessagesHandler::SendGlobalErrorNoteL()" );
       
   391     __ASSERT_DEBUG( aResourceId, Panic( EPhoneCtrlParameterNotInitialized ) );
       
   392 
       
   393     if ( CPhonePubSubProxy::Instance()->Value( 
       
   394             KPSUidUikon, KUikGlobalNotesAllowed ) == 1 )
       
   395         {
       
   396         // Re-enable global notes
       
   397         TPhoneCmdParamBoolean globalNotifierParam;
       
   398         globalNotifierParam.SetBoolean( EFalse );
       
   399         iViewCommandHandle->ExecuteCommandL( 
       
   400              EPhoneViewSetGlobalNotifiersDisabled,
       
   401             &globalNotifierParam );
       
   402             
       
   403         TPhoneCmdParamGlobalNote globalNoteParam;
       
   404         globalNoteParam.SetType( EAknGlobalErrorNote );
       
   405         globalNoteParam.SetTextResourceId( 
       
   406             CPhoneMainResourceResolver::Instance()->
       
   407             ResolveResourceID( aResourceId ) );
       
   408         globalNoteParam.SetText( aText );
       
   409         globalNoteParam.SetTone( CAknNoteDialog::EErrorTone );
       
   410 
       
   411         iViewCommandHandle->ExecuteCommandL(  
       
   412             EPhoneViewShowGlobalNote, &globalNoteParam );
       
   413         } 
       
   414     }
       
   415 
       
   416 // -----------------------------------------------------------
       
   417 // CPhoneVoIPErrorMessagesHandler::GetServiceProviderNameL
       
   418 // -----------------------------------------------------------
       
   419 //
       
   420 void CPhoneVoIPErrorMessagesHandler::GetServiceProviderNameL( 
       
   421     RBuf& aServiceName, 
       
   422     TUint32 aServiceId )
       
   423     { 
       
   424     __LOGMETHODSTARTEND( PhoneUIVoIPExtension, 
       
   425                  "CPhoneVoIPErrorMessagesHandler::GetServiceProviderNameL" )
       
   426     CSPEntry* serviceEntry = CSPEntry::NewLC();
       
   427     
       
   428     CSPSettings* serviceProviderSettings = CSPSettings::NewLC();
       
   429     
       
   430     User::LeaveIfError(
       
   431         serviceProviderSettings->FindEntryL( aServiceId, *serviceEntry ) );
       
   432     
       
   433     User::LeaveIfError(
       
   434         aServiceName.Create( serviceEntry->GetServiceName() ) );
       
   435       
       
   436     CleanupStack::PopAndDestroy( serviceProviderSettings );
       
   437     CleanupStack::PopAndDestroy( serviceEntry );
       
   438     }
       
   439 
       
   440 // -----------------------------------------------------------
       
   441 // CPhoneVoIPErrorMessagesHandler::ShowErrorNoteContainingServiceNameL
       
   442 // -----------------------------------------------------------
       
   443 //
       
   444 void CPhoneVoIPErrorMessagesHandler::ShowErrorNoteWithServiceNameL( 
       
   445     TInt aResourceId, 
       
   446     TUint32 aServiceId )
       
   447     {
       
   448     __LOGMETHODSTARTEND( PhoneUIVoIPExtension, 
       
   449         "CPhoneVoIPErrorMessagesHandler::ShowErrorNoteWithServiceNameL" )
       
   450     RBuf serviceName;
       
   451     CleanupClosePushL( serviceName );
       
   452     GetServiceProviderNameL( serviceName, aServiceId );
       
   453     SendGlobalErrorNoteWithTextL( aResourceId, serviceName );
       
   454     CleanupStack::PopAndDestroy( &serviceName );
       
   455     }
       
   456 
       
   457 // -----------------------------------------------------------
       
   458 // CPhoneVoIPErrorMessagesHandler::HasSwapFailed
       
   459 // -----------------------------------------------------------
       
   460 //
       
   461 TBool CPhoneVoIPErrorMessagesHandler::HasSwapFailed() const
       
   462     {
       
   463     TPEState callState( EPEStateUnknown );
       
   464     TPECallType callType( EPECallTypeUninitialized );
       
   465     TPEState confCallState( EPEStateUnknown );
       
   466     
       
   467     TInt connectedCalls( 0 );
       
   468     TInt heldCalls( 0 );
       
   469     TInt voipCalls( 0 );
       
   470     TBool ret( EFalse );
       
   471     
       
   472     for ( TInt i=0; i < KPEMaximumNumberOfVoiceCalls; i++ )
       
   473         {
       
   474         callState = iStateMachine->PhoneEngineInfo()->CallState( i );
       
   475         callType = iStateMachine->PhoneEngineInfo()->CallType( i );
       
   476         
       
   477         if ( EPEStateConnected == callState )
       
   478             {
       
   479             connectedCalls++;
       
   480             
       
   481             if ( EPECallTypeVoIP == callType )
       
   482                 {
       
   483                 voipCalls++;
       
   484                 }
       
   485             }
       
   486         else if ( EPEStateHeld == callState )
       
   487             {
       
   488             heldCalls++;
       
   489             
       
   490             if ( EPECallTypeVoIP == callType )
       
   491                 {
       
   492                 voipCalls++;
       
   493                 }
       
   494             }
       
   495         }
       
   496     
       
   497     confCallState = iStateMachine->PhoneEngineInfo()->CallState( KPEConferenceCallID );
       
   498 
       
   499     // At least one of the calls is VoIP call (conference or single)
       
   500     if ( voipCalls )
       
   501         {
       
   502         if ( EPEStateConferenceIdle == confCallState )
       
   503             {
       
   504             // Look for connected/hold and hold/hold combinations
       
   505             if ( ( 1 == connectedCalls && 1 == heldCalls ) ||
       
   506                    2 == heldCalls )
       
   507                 {
       
   508                 ret = ETrue;
       
   509                 }
       
   510             }
       
   511         /* Check scenario that the other call is conference
       
   512          * 1) Putting VoIP call on hold fails, as a result there is a single connected 
       
   513          *    call and conference is on hold
       
   514          * 2) Resuming VoIP call fails, all calls are on hold (because conference is 
       
   515          *    first put on hold successfully)
       
   516          */
       
   517         else if ( ( 1 == connectedCalls && EPEStateHeldConference == confCallState ) ||
       
   518                  ( 0 == connectedCalls && EPEStateHeldConference == confCallState ) )
       
   519             {
       
   520             ret = ETrue;
       
   521             }
       
   522         }
       
   523 
       
   524     __PHONELOG1( EBasic, PhoneUIVoIPExtension, "CPhoneVoIPErrorMessagesHandler::HasSwapFailed() returned %D", ret );
       
   525     
       
   526     return ret;
       
   527     }
       
   528 
       
   529 // End of File