--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/phoneengine/phonemodel/src/cpemanualcallcontrolhandler.cpp Mon Jan 18 20:18:27 2010 +0200
@@ -0,0 +1,452 @@
+/*
+* Copyright (c) 2008 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description: Manual call control handler
+*
+*/
+
+
+// INCLUDE FILES
+#include "cpemanualcallcontrolhandler.h"
+#include "cpemessagehandler.h"
+#include <ccpdefs.h>
+#include <mpecallhandling.h>
+#include <mpedatastore.h>
+#include <pepanic.pan>
+#include <pevirtualengine.h>
+#include <talogger.h>
+
+
+// EXTERNAL DATA STRUCTURES
+// None.
+
+// EXTERNAL FUNCTION PROTOTYPES
+// None.
+
+// CONSTANTS
+// None.
+
+
+// ============================ MEMBER FUNCTIONS ===============================
+
+// -----------------------------------------------------------------------------
+// cpemanualcallcontrolhandler::CPEManualCallControlHandler
+// C++ default constructor can NOT contain any code, that
+// might leave.
+// -----------------------------------------------------------------------------
+//
+CPEManualCallControlHandler::CPEManualCallControlHandler(
+ MPECallHandling& aCallHandling,
+ CPEMessageHandler& aMessageHandler,
+ MPEDataStore& aDataStore )
+ : iCallHandling( aCallHandling ),
+ iMessageHandler( aMessageHandler ),
+ iDataStore( aDataStore )
+ {
+ }
+
+// Destructor
+CPEManualCallControlHandler::~CPEManualCallControlHandler()
+ {
+ }
+
+// -----------------------------------------------------------------------------
+// CPEManualCallControlHandler::NewL
+// Two-phased constructor.
+// -----------------------------------------------------------------------------
+//
+CPEManualCallControlHandler* CPEManualCallControlHandler::NewL
+ (
+ MPECallHandling& aCallHandling,
+ CPEMessageHandler& aMessageHandler,
+ MPEDataStore& aDataStore )
+ {
+ CPEManualCallControlHandler* handler = new ( ELeave ) CPEManualCallControlHandler(
+ aCallHandling,
+ aMessageHandler,
+ aDataStore);
+
+ return handler;
+ }
+// -----------------------------------------------------------------------------
+// CPEManualCallControlHandler::HandleChldL
+// Handles common Chld (swap, answer waiting call, ... )
+// -----------------------------------------------------------------------------
+//
+void CPEManualCallControlHandler::HandleChldL(
+ const TPhCltChldCommand aChldCommand,
+ const TUint aCallNo )
+ {
+ TEFLOGSTRING3( KTAMESINT,
+ "PE CPEManualCallControlHandler::HandleChldL, aChldCommand: %d, aCallNo: %d"
+ , aChldCommand
+ , aCallNo );
+ TInt error( KErrNotFound );
+
+ switch ( aChldCommand )
+ {
+ case EPhCltChldZero:
+ // Release held calls or set UDUB for a waiting call.
+ error = HandleChldZero();
+ break;
+
+ case EPhCltChldOne:
+ // Release all active calls and accept other (held or waiting) call.
+ {
+ if( aCallNo )
+ {
+ HandleChldOneXL( aCallNo );
+ error = ECCPErrorNone;
+ }
+ else
+ {
+ error = HandleChldOne();
+ }
+ }
+ break;
+
+ case EPhCltChldTwo:
+ // Place all active calls on hold and accept the other (held or waiting) call.
+ {
+ if( aCallNo )
+ {
+ HandleChldTwoXL( aCallNo );
+ error = ECCPErrorNone;
+ }
+ else
+ {
+ error = HandleChldTwo();
+ }
+ }
+ break;
+
+ case EPhCltChldThree:
+ // Add a held call to the conversation.
+ error = HandleChldThree();
+ break;
+
+ case EPhCltChldFour:
+ // Connect the two calls and disconnect the subscriber from
+ // both calls (Explicit call transfer).
+ error = HandleChldFour();
+ break;
+
+ default:
+ {
+ TEFLOGSTRING2( KTAERROR,
+ "PE CPEManualCallControlHandler::HandleChldL, aChldCommand; %d"
+ ,aChldCommand );
+ __ASSERT_DEBUG( EFalse, Panic( EPEPanicIllegalCommand ) );
+ break;
+ }
+ }
+ User::LeaveIfError( error );
+ }
+
+// -----------------------------------------------------------------------------
+// CPEManualCallControlHandler::HandleChldZero
+// -----------------------------------------------------------------------------
+//
+TInt CPEManualCallControlHandler::HandleChldZero()
+ {
+ TEFLOGSTRING( KTAINT, "PE CPEManualCallControlHandler::HandleChldZero" );
+ TInt error( ECCPErrorNotAllowed );
+
+ if ( iCallHandling.IsCallInState( EPEStateRinging ) )
+ {
+ error = iCallHandling.RejectCall();
+ }
+ else if( iDataStore.ConferenceCallState( ) == EPEStateHeldConference )
+ {
+ iDataStore.SetCallId( KPEConferenceCallID );
+ error = iMessageHandler.HandleReleaseCall();
+ }
+ else if ( iCallHandling.IsCallInState( EPEStateHeld ) )
+ {
+ TInt callId = iCallHandling.GetCallIdByState( EPEStateHeld );
+ if ( callId != KPECallIdNotUsed )
+ {
+ iDataStore.SetCallId( callId );
+ error = iMessageHandler.HandleReleaseCall();
+ }
+ }
+
+ TEFLOGSTRING2( KTAINT,
+ "PE CPEManualCallControlHandler::HandleChldZero, error: %d", error );
+ return error;
+ }
+
+// -----------------------------------------------------------------------------
+// CPEManualCallControlHandler::HandleChldOne
+// -----------------------------------------------------------------------------
+//
+TInt CPEManualCallControlHandler::HandleChldOne()
+ {
+ TEFLOGSTRING( KTAINT,
+ "PE CPEManualCallControlHandler::HandleChldOne" );
+
+ TInt error( ECCPErrorNotAllowed );
+ // Find active call
+ TInt callId( KPECallIdNotUsed );
+
+ if ( ( iDataStore.ConferenceCallState( ) == EPEStateConnectedConference ) )
+ {
+ callId = KPEConferenceCallID;
+ }
+ else if ( iCallHandling.IsCallInState( EPEStateConnected ) )
+ {
+ callId = iCallHandling.GetCallIdByState( EPEStateConnected );
+ }
+ else if ( iCallHandling.IsCallInState( EPEStateConnecting ) )
+ {
+ callId = iCallHandling.GetCallIdByState( EPEStateConnecting );
+ }
+ else if ( iCallHandling.IsCallInState( EPEStateDialing ) )
+ {
+ callId = iCallHandling.GetCallIdByState( EPEStateDialing );
+ }
+ else if ( iCallHandling.IsCallInState( EPEStateAnswering ) )
+ {
+ callId = iCallHandling.GetCallIdByState( EPEStateAnswering );
+ }
+
+ // Replace
+ if ( iCallHandling.IsCallInState( EPEStateConnected ) &&
+ iCallHandling.IsCallInState( EPEStateRinging ) )
+ {
+ TInt callIdConn = iCallHandling.GetCallIdByState( EPEStateConnected );
+ TInt callIdRing = iCallHandling.GetCallIdByState( EPEStateRinging );
+ if ( iDataStore.CallType( callIdConn ) == iDataStore.CallType( callIdRing ) )
+ {
+ // Replace allowed for same call types
+ error = iCallHandling.ReplaceActive();
+ }
+ }
+ else
+ {
+ // Relese active call
+ if ( callId != KPECallIdNotUsed )
+ {
+ iDataStore.SetCallId( callId );
+ error = iMessageHandler.HandleReleaseCall( ETPEHangUpResumeHeldCall );
+ }
+ // accept held or waiting call
+ if ( iCallHandling.IsCallInState( EPEStateRinging ) )
+ {
+ error = iCallHandling.AnswerCall();
+ }
+ else if ( iCallHandling.IsCallInState( EPEStateHeld ) )
+ {
+ error = iCallHandling.ResumeCall();
+ }
+ }
+
+
+ TEFLOGSTRING2( KTAINT,
+ "PE CPEManualCallControlHandler::HandleChldOne, error: %d", error );
+ return error;
+ }
+
+// -----------------------------------------------------------------------------
+// CPEManualCallControlHandler::HandleChldOneXL
+// -----------------------------------------------------------------------------
+//
+void CPEManualCallControlHandler::HandleChldOneXL( TInt aCallNo )
+ {
+ TEFLOGSTRING2( KTAINT,
+ "PE CPEManualCallControlHandler::HandleChldOneXL, aCallNo %d",
+ aCallNo );
+
+ TInt error( ECCPErrorNotAllowed );
+ TPEState callState;
+
+ if ( ( KPEMaximumNumberOfVoiceCalls > aCallNo ) && ( aCallNo > 0 ) )
+ {
+ callState = iDataStore.CallState( CallIdByIndexL( aCallNo ) );
+ TEFLOGSTRING2( KTAINT,
+ "PE CPEManualCallControlHandler::HandleChldOneXL, callState %d",
+ callState );
+ if ( callState == EPEStateRinging &&
+ !( iCallHandling.IsCallInState( EPEStateDialing ) || iCallHandling.IsCallInState( EPEStateConnecting ) ) )
+ {
+ error = iMessageHandler.HandleAnswerCall( EFalse );
+ TEFLOGSTRING2( KTAINT,
+ "PE CPEManualCallControlHandler::HandleChldOneXL > HandleAnswerCall, Error code %d",
+ error );
+ }
+ else if ( callState == EPEStateConnected )
+ {
+ iDataStore.SetCallId( CallIdByIndexL( aCallNo ) );
+ error = iMessageHandler.HandleReleaseCall( ETPEHangUpNotResumeHeldCall );
+ TEFLOGSTRING2( KTAINT,
+ "PE CPEManualCallControlHandler::HandleChldOneXL > HandleReleaseCall, Error code %d",
+ error );
+ }
+ }
+
+ TEFLOGSTRING2( KTAINT,
+ "PE CPEManualCallControlHandler::HandleChldOneXL, error: %d", error );
+ User::LeaveIfError( error );
+ }
+
+// -----------------------------------------------------------------------------
+// CPEManualCallControlHandler::HandleChldTwo
+// -----------------------------------------------------------------------------
+//
+TInt CPEManualCallControlHandler::HandleChldTwo()
+ {
+ TEFLOGSTRING( KTAINT, "PE CPEManualCallControlHandler::HandleChldTwo");
+
+ TInt error( ECCPErrorNotAllowed );
+
+ if ( iCallHandling.IsCallInState( EPEStateDialing ) ||
+ iCallHandling.IsCallInState( EPEStateConnecting ) )
+ {
+ TEFLOGSTRING(
+ KTAERROR,
+ "PE CPEManualCallControlHandler::HandleChldTwo: Call found in EPEStateDialing or EPEStateConnecting,state > swap NOT ALLOWED" );
+ }
+ else
+ {
+ if ( iCallHandling.IsCallInState( EPEStateConnected ) &&
+ iCallHandling.IsCallInState( EPEStateHeld ) )
+ {
+ error = iCallHandling.SwapCalls();
+ }
+ else if ( iCallHandling.IsCallInState( EPEStateConnected ) &&
+ !iCallHandling.IsCallInState( EPEStateRinging ) )
+ {
+ error = iCallHandling.HoldCall();
+ }
+ else if ( iCallHandling.IsCallInState( EPEStateHeld ) &&
+ !( iCallHandling.IsCallInState( EPEStateRinging ) ) )
+ {
+ error = iCallHandling.ResumeCall();
+ }
+ else if ( iCallHandling.IsCallInState( EPEStateRinging ) )
+ {
+ error = iCallHandling.AnswerCall();
+ }
+ }
+
+ TEFLOGSTRING2( KTAINT,
+ "PE CPEManualCallControlHandler::HandleChldtwo, error: %d", error );
+ return error;
+ }
+
+// -----------------------------------------------------------------------------
+// CPEManualCallControlHandler::HandleChldTwoXL
+// -----------------------------------------------------------------------------
+//
+void CPEManualCallControlHandler::HandleChldTwoXL( TInt aCallNo )
+ {
+ TEFLOGSTRING( KTAINT,
+ "PE CPEManualCallControlHandler::HandleChldTwoXL" );
+
+ TInt error( ECCPErrorNotAllowed );
+
+ if ( ( KPEMaximumNumberOfVoiceCalls > aCallNo ) && ( aCallNo > 0 ) )
+ {
+ if ( ( iDataStore.CallState( CallIdByIndexL( aCallNo ) ) == EPEStateConnected )
+ && ( iDataStore.ConferenceCallState( ) == EPEStateConnectedConference ) )
+ {
+ iDataStore.SetCallId( CallIdByIndexL( aCallNo ) );
+ error = iMessageHandler.HandleGoOneToOne();
+ }
+ }
+
+ TEFLOGSTRING2( KTAINT,
+ "PE CPEManualCallControlHandler::HandleChldTwoXL, error: %d", error );
+ User::LeaveIfError( error );
+ }
+// -----------------------------------------------------------------------------
+// CPEManualCallControlHandler::HandleChldThree
+// -----------------------------------------------------------------------------
+//
+TInt CPEManualCallControlHandler::HandleChldThree()
+ {
+ TEFLOGSTRING( KTAINT, "PE CPEManualCallControlHandler::HandleChldThree");
+
+ TInt error( ECCPErrorNotAllowed );
+
+ if( iDataStore.ConferenceCallState( ) == EPEStateConferenceIdle )
+ {
+ TEFLOGSTRING( KTAINT, "PE CPEManualCallControlHandler::HandleChldThree: HandleBuildConferenceCall" );
+ error = iMessageHandler.HandleBuildConferenceCall();
+ }
+ else if ( iDataStore.ConferenceCallState( ) == EPEStateConnectedConference )
+ {
+ TEFLOGSTRING( KTAINT, "PE CPEManualCallControlHandler::HandleChldThree: EPEStateConnectedConference" );
+ if ( iCallHandling.IsCallInState( EPEStateHeld ) )
+ {
+ TEFLOGSTRING( KTAINT, "PE CPEManualCallControlHandler::HandleChldThree: AddConferenceMember" );
+ error = iCallHandling.AddConferenceMember();
+ }
+ }
+ else if( iDataStore.ConferenceCallState( ) == EPEStateHeldConference )
+ {
+ TEFLOGSTRING( KTAINT, "PE CPEManualCallControlHandler::HandleChldThree: EPEStateHeldConference" );
+ if ( iCallHandling.IsCallInState( EPEStateConnected ) )
+ {
+ TEFLOGSTRING( KTAINT, "PE CPEManualCallControlHandler::HandleChldThree: AddConferenceMember" );
+ error = iCallHandling.AddConferenceMember();
+ }
+ }
+
+ TEFLOGSTRING2( KTAINT,
+ "PE CPEManualCallControlHandler::HandleChldTree, error: %d", error );
+ return error;
+ }
+
+// -----------------------------------------------------------------------------
+// CPEManualCallControlHandler::HandleChldFour
+// -----------------------------------------------------------------------------
+//
+TInt CPEManualCallControlHandler::HandleChldFour()
+ {
+ TEFLOGSTRING( KTAINT, "PE CPEManualCallControlHandler::HandleChldFour" );
+
+ TInt error( ECCPErrorNotAllowed );
+
+ if ( ( iCallHandling.IsCallInState( EPEStateConnected ) || iCallHandling.IsCallInState( EPEStateConnecting ) ) &&
+ iCallHandling.IsCallInState( EPEStateHeld ) )
+ {
+ TEFLOGSTRING( KTAINT, "PE CPEManualCallControlHandler::HandleChldFour > TransferCalls" );
+ error = iCallHandling.TransferCalls();
+ }
+
+ TEFLOGSTRING2( KTAINT,
+ "PE CPEManualCallControlHandler::HandleChldFour, error: %d", error );
+ return error;
+ }
+
+// -----------------------------------------------------------------------------
+// CPEManualCallControlHandler::CallIdByIndexL
+// -----------------------------------------------------------------------------
+//
+TInt CPEManualCallControlHandler::CallIdByIndexL( const TInt& aCallIndex )
+ {
+ TInt i, errorCode( ECCPErrorNotAllowed );
+ for( i = 0; i < KPEMaximumNumberOfCalls; i++ )
+ {
+ if( iDataStore.CallIndex( i ) == aCallIndex )
+ {
+ errorCode = ECCPErrorNone;
+ break;
+ }
+ }
+ User::LeaveIfError( errorCode );
+ return i;
+ }
+
+// End of File