telephonyserverplugins/common_tsy/commontsy/src/mmtsy/cmmcalltsy.cpp
branchopencode
changeset 24 6638e7f4bd8f
parent 20 244d7c5f118e
--- a/telephonyserverplugins/common_tsy/commontsy/src/mmtsy/cmmcalltsy.cpp	Mon May 03 13:37:20 2010 +0300
+++ b/telephonyserverplugins/common_tsy/commontsy/src/mmtsy/cmmcalltsy.cpp	Thu May 06 15:10:38 2010 +0100
@@ -1,2699 +1,2699 @@
-// Copyright (c) 2006-2009 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:
-//
-
-
-
-// INCLUDE FILES
-#include "cmmcalltsy.h"
-#include <featmgr/featurecontrol.h>
-#include <featureuids.h>
-#include "cmmphonetsy.h"
-#include "cmmlinetsy.h"
-#include "cmmtsyreqhandlestore.h"
-#include "cmmcalllist.h"
-#include "CMmCommonStaticUtility.h"
-#include "cmmlinelist.h"
-#include "cmmmessagemanagerbase.h"
-#include <ctsy/pluginapi/cmmdatapackage.h>
-#include <ctsy/serviceapi/gsmerror.h>
-#include "cmmcallgsmwcdmaext.h"
-#include <ctsy/pluginapi/mtelephonyaudiocontrol.h>
-
-// ======== MEMBER FUNCTIONS ========
-
-CMmCallTsy::CMmCallTsy() :
-    iCallParamsPckg(iCallParams),
-    iReqHandleType(EMultimodeCallReqHandleUnknown)
-    {
-    }
-
-void CMmCallTsy::ConstructL( 
-	RMobilePhone::TMobileService aMode )
-    {    
-#ifdef REQHANDLE_TIMER   
-    //Create req handle store
-    iTsyReqHandleStore = CMmTsyReqHandleStore::NewL( this, iMmPhone, 
-        EMultimodeCallMaxNumOfRequests, iCallReqHandles);
-#else
-    //Create req handle store
-    iTsyReqHandleStore = CMmTsyReqHandleStore::NewL( 
-        EMultimodeCallMaxNumOfRequests, iCallReqHandles);
-#endif
-
-    iCallMode = aMode;
-
-    //Call ownership change request list
-    iList = CAcquireOwnerList::NewL();
-
-    //initialise call duration notifier
-    iCallTimer = CHeartbeatRunner::NewL( this );
-
-    //Initialise extension modules
-    InitExtensionModulesL( aMode );
-
-    //Initialise miscellaneous internal attributes
-    InitInternalAttributes();
-    }
-
-CMmCallTsy::~CMmCallTsy()
-    {
-TFLOGSTRING3("TSY: CMmCallTsy::~CMmCallTsy. Call deleted iCallId:%d iCallName:%S",iCallId, &iCallName);
-
-    TInt trapError( KErrNone );
-
-    //Hang up call if call is still connecting or active and hang up is not
-    //called
-    if( iTsyReqHandleStore )
-        {
-        if ( !( RMobileCall::EStatusIdle == iMobileCallStatus ||
-            RMobileCall::EStatusDisconnecting == iMobileCallStatus ||
-            RMobileCall::EStatusDisconnectingWithInband == iMobileCallStatus ) 
-            && ( 0 == iTsyReqHandleStore->GetTsyReqHandle( 
-                                                    EMultimodeCallHangUp ) ) )
-            {
-                TBool timerStarted = EFalse;
-                if( iCallTimer )
-                    {
-                    timerStarted = iCallTimer->Stop();
-                    }
-            //Check air time timer only if call was in active state(call timer 
-            //was started)
-            if ( timerStarted )
-                {
-                if( iMmPhone )
-                	{
-                	iMmPhone->AirTimeTimerCheckStop();
-                	//TODO: attention reviewers - please check if UpdateLifeTimer should/shouldn't be called here
-                    UpdateLifeTimer();
-                    }
-                }
-    
-            //Send call release request before deleting this object
-            TInt symbianHangUpCause( KErrGsmReleaseByUser );
-    
-    		//Create package
-    		CCallDataPackage package;
-    		//Set call id and call mode
-    		package.SetCallIdAndMode( iCallId, iCallMode );
-    		
-    		TBool autoStChangeDisable = EFalse;
-    		//Pack call parameters and mobile call info
-    		package.PackData( &symbianHangUpCause, &autoStChangeDisable );
-    		//Send request to the Domestic OS layer.
-            if( iMessageManager )
-            	{
-            	TRAP( trapError,
-                iMessageManager->HandleRequestL( EEtelCallHangUp, &package );
-                );
-                // inform telephony audio control that we're hanging up the call	
-                if ( iTelephonyAudioControlSetup && iTelephonyAudioControl )
-                    {
-                    iTelephonyAudioControl->TeardownTelephonyAudio( iCallName, 
-                                                                    KErrNone );
-TFLOGSTRING2("TSY: CMmCallTsy::~CMmCallTsy Call routing tear down: Call name:%S", &iCallName );
-                    }
-                
-            	}
-    
-            // We can't do nothing if hanguprequest fails here,
-            // because call object is closed.
-            }
-        }
-
-    //delete req handle store
-    if ( iTsyReqHandleStore )
-        {
-        delete iTsyReqHandleStore;
-        }
-    iTsyReqHandleStore = NULL;
-    
-    //delete req handle store
-    if ( iList )
-        {
-        delete iList;
-        }
-    iList = NULL;
-
-    //delete call ownership change request list
-    if ( iCallTimer )
-        {
-        delete iCallTimer;
-        }
-    iCallTimer = NULL;
-
-    //Decrement number of opened calls from line.
-    if( iMmLine )
-    	{
-    	iMmLine->DecrementNumberOfCalls();
-    	}
-    
-    // Remove the call from the list of calls
-    if( iMmPhone )
-    	{
-    	iMmPhone->CallList()->RemoveObject( this );
-    	}
-
-    //delete call extension
-    if ( iMmCallExtInterface )
-        {
-    	delete iMmCallExtInterface;
-        }
-    iMmCallExtInterface = NULL;
-
-    iMmPhone = NULL;
-    iMmLine = NULL;
-    iCallTimer = NULL;
-    iRetNotifyMobileCallCaps = NULL;
-    iRetCaps = NULL;
-    iRetStatus = NULL;
-    iRetMobileCallStatus = NULL;
-    iRetRemotePartyInfo = NULL;
-    iRetTimeIntervalSeconds = NULL;
-    iRetCallEvent = NULL;
-    iList = NULL;
-    iTsyReqHandleStore = NULL;
-    iRetPrivacyStatus = NULL;
-    iMessageManager = NULL;
-    iRetUUI = NULL; 
-    }
-
-// ---------------------------------------------------------------------------
-// CMmCallTsy::InitExtensionModulesL
-// Initialises extension modules for CMmCallTsy
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-void CMmCallTsy::InitExtensionModulesL(
-    RMobilePhone::TMobileService aMode )
-    {
-    RMobilePhone::TMobilePhoneNetworkMode currentMode;
-    iMmPhone->GetStaticExtensionMode( &currentMode );
-
-    iMmCallExtInterface  = reinterpret_cast<CMmCallExtInterface*> 
-        (CMmCallGsmWcdmaExt::NewL( this, aMode, iMessageManager ) );
-
-    }
-
-// ---------------------------------------------------------------------------
-// CMmCallTsy::InitInternalAttributes
-// Initialises miscellaneous internal attributes.
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-void CMmCallTsy::InitInternalAttributes()
-    {
-    //Set status parameters
-    iCallStatus = RCall::EStatusIdle;
-    iMobileCallStatus = RMobileCall::EStatusIdle;
-
-    //Initialise call params
-    iCallParams.iSpeakerControl = RCall::EMonitorSpeakerControlOnUntilCarrier;
-    iCallParams.iSpeakerVolume = RCall::EMonitorSpeakerVolumeLow;
-    iCallParams.iInterval = 4;
-    iCallParams.iWaitForDialTone = RCall::EDialToneWait;
-    iCallParams.iIdRestrict = RMobileCall::EIdRestrictDefault;
-    iCallParams.iCug.iExplicitInvoke = EFalse;
-    iCallParams.iCug.iCugIndex = 0;
-    iCallParams.iCug.iSuppressPrefCug = EFalse;
-    iCallParams.iCug.iSuppressOA = EFalse;
-    iCallParams.iAutoRedial = EFalse;
-    // CallParamsV2
-    iCallParams.iBearerMode = RMobileCall::EMulticallNotSupported;
-
-    // CallParamsV7
-    iCallParams.iCallParamOrigin = RMobileCall::EOriginatorUnknown;
-    iCallParams.iBCRepeatIndicator = RMobileCall::EBCAlternateMode;
-    iCallParams.iIconId.iQualifier = RMobileCall::EIconQualifierNotSet;
-    iCallParams.iIconId.iIdentifier = 0;
-    iCallParams.iAlphaId.Zero();
-    iCallParams.iSubAddress.Zero();
-    iCallParams.iBearerCap1.Zero();
-    iCallParams.iBearerCap2.Zero();
-    iCallParams.iBCRepeatIndicator = RMobileCall::EBCAlternateMode;
-    
-    iDialCancelFlag = CMmCallTsy::EDialCancelNotCalled;
-    iAnswerCancelFlag = EFalse;
-    iHangUpFlag = EFalse; 
-
-    //this is required for the Conference call.
-    iPreviousCallId = -1;
-
-    //Initialize last exit code
-    iLastExitCode = KErrNotFound;
-    //this is required for custom tsy
-    iDiagnosticOctet = NULL;
-
-    //by default a call object has been created through ETel
-    iGhostCall = EFalse;
-    iEtelOriginated = ETrue;
-
-    iPreviousCallControlCaps = 0;
-	iIsRemoteReleasedCall = EFalse;
-    }
-
-// ---------------------------------------------------------------------------
-// CMmCallTsy::OpenNewObjectByNameL
-// Creates new  object and returns a pointer to it. Not supported.
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-CTelObject* CMmCallTsy::OpenNewObjectByNameL(    
-    const TDesC& )
-    {
-    //Not supported
-    User::Leave( KErrNotSupported );
-	//lint -e{527} "unreachable code"
-    return NULL;
-    }
-
-// ---------------------------------------------------------------------------
-// CMmCallTsy::OpenNewObjectL
-// Creates new object and returns a pointer to it. Not supported.
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-CTelObject* CMmCallTsy::OpenNewObjectL(
-    TDes& )
-    {
-    // Not supported
-    User::Leave( KErrNotSupported );
-	//lint -e{527} "unreachable code"
-    return NULL;
-    }
-
-// ---------------------------------------------------------------------------
-// CMmCallTsy::ExtFunc
-// TRAP's all CMmCallTsy related MM API requests in case that they fail. This 
-// method functions only as a centralized TRAP for the DoExtFuncL method that 
-// does the actual mapping of IPC number to TSY method call.
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-TInt CMmCallTsy::ExtFunc( 
-    const TTsyReqHandle aTsyReqHandle,
-    const TInt aIpc,
-    const TDataPackage& aPackage )
-    {    
-    TInt ret( KErrNone );
-    TInt trapError( KErrNone );
-
-    // Ensure the ReqHandleType is unset.
-    // This will detect cases where this method indirectly calls itself
-    // (e.g. servicing a client call that causes a self-reposting notification to complete and thus repost).
-    // Such cases are not supported because iReqHandleType is in the context of this class instance,
-    // not this request, and we don't want the values set by the inner request and the outer request
-    // interfering with each other.
-    __ASSERT_DEBUG(iReqHandleType==EMultimodeCallReqHandleUnknown, User::Invariant());
-
-
-    //before processing further the request, check if offline mode status
-    //is enabled and if the given request can be perfomed in that case.
-    if ( ERfsStateInfoInactive == iMmPhone->GetRfStateInfo () &&
-        !IsRequestPossibleInOffline( aIpc ) )  
-        {
-TFLOGSTRING2("TSY: Offline mode ON, request is not allowed: %d", aIpc );
-        ret = CMmCommonStaticUtility::EpocErrorCode(
-            KErrGeneral, KErrGsmOfflineOpNotAllowed );
-
-        //Complete the request with appropiate error
-        ReqCompleted ( aTsyReqHandle, ret ); 
-        }
-    else
-        {
-        TRAP( trapError, ret = DoExtFuncL( aTsyReqHandle, aIpc, aPackage ); );
-
-        if ( trapError != KErrNone )
-            {
-            //error handling. Object cannot be created. 
-            ReqCompleted( aTsyReqHandle, trapError );
-            }
-        else if ( ret != KErrNone )
-            {
-            ReqCompleted( aTsyReqHandle, ret );
-            }   
-        //save request handle
-        if ( EMultimodeCallReqHandleUnknown != iReqHandleType )
-            {
-#ifdef REQHANDLE_TIMER
-            SetTypeOfResponse( iReqHandleType, aTsyReqHandle );
-#else
-            iTsyReqHandleStore->SetTsyReqHandle(
-                iReqHandleType, aTsyReqHandle );
-#endif
-            // We've finished with this value now. Clear it so it doesn't leak
-            //  up to any other instances of this method down the call stack
-            iReqHandleType = EMultimodeCallReqHandleUnknown;
-            }
-    
-        }
-
-    return KErrNone;
-    }
-
-// ---------------------------------------------------------------------------
-// CMmCallTsy::GetInfo
-// This CORE API method returns core Call information.
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-TInt CMmCallTsy::GetInfo(
-    const TTsyReqHandle aTsyReqHandle,
-    RCall::TCallInfo* aCallInfo )
-    {
-    //Fill Core Call information
-    aCallInfo->iCallName = iCallName;
-    aCallInfo->iStatus = iCallStatus;
-    aCallInfo->iLineName = iMmLine->LineName();
-    aCallInfo->iHookStatus = RCall::EHookStatusUnknown;
-    aCallInfo->iDuration = GetCallDurationInSeconds();
-
-    ReqCompleted( aTsyReqHandle, KErrNone );
-    return KErrNone;
-    }
-
-// ---------------------------------------------------------------------------
-// CMmCallTsy::NotifyCapsChange
-// This CORE API method requests notifications when core caps change.
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-TInt CMmCallTsy::NotifyCapsChange(
-    const TTsyReqHandle aTsyReqHandle,
-    RCall::TCaps* aCaps )
-    {
-    iRetCaps = aCaps;
-    //Store the current capabilities
-    iPreviousCaps =  iCallCaps;
-
-    iTsyReqHandleStore->SetTsyReqHandle(
-        EMultimodeCallCapsChangeNotification, aTsyReqHandle );
-
-    return KErrNone;
-    }
-
-// ---------------------------------------------------------------------------
-// CMmCallTsy::NotifyCapsChangeCancel
-// This CORE API method cancels core caps change notifications.
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-TInt CMmCallTsy::NotifyCapsChangeCancel(
-    const TTsyReqHandle aTsyReqHandle )
-    {    
-    iRetCaps = NULL;
-    iTsyReqHandleStore->ResetTsyReqHandle(
-        EMultimodeCallCapsChangeNotification );
-
-    ReqCompleted( aTsyReqHandle, KErrCancel );
-
-    return KErrNone;
-    }
-
-// ---------------------------------------------------------------------------
-// CMmCallTsy::CompleteNotifyCapsChange
-// Complete notification when caps change.
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-void CMmCallTsy::CompleteNotifyCapsChange()
-    {
-    //reset req handle. Returns the deleted req handle
-    TTsyReqHandle reqHandle = iTsyReqHandleStore->ResetTsyReqHandle(
-        EMultimodeCallCapsChangeNotification );
-
-    //if caps have changed and client has requested capability notifications
-    if ( EMultimodeCallReqHandleUnknown != reqHandle &&
-        iRetCaps != NULL &&
-        iCallCaps.iFlags != iPreviousCaps.iFlags )
-        {
-        iRetCaps->iFlags = iCallCaps.iFlags;
-        ReqCompleted( reqHandle, KErrNone );
-        }
-    }
-
-// ---------------------------------------------------------------------------
-// CMmCallTsy::NotifyHookChange
-// This CORE API method requests notifications on hook change.
-// Feature not supported.
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-TInt CMmCallTsy::NotifyHookChange(
-    const TTsyReqHandle aTsyReqHandle,
-    RCall::THookStatus* )
-    {
-    ReqCompleted( aTsyReqHandle, KErrNotSupported );
-    return KErrNone;
-    }
-
-// ---------------------------------------------------------------------------
-// CMmCallTsy::NotifyHookChange
-// This CORE API method cancels hook change notifications.
-// Feature not supported.
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-TInt CMmCallTsy::NotifyHookChangeCancel(
-    const TTsyReqHandle aTsyReqHandle )
-    {
-    ReqCompleted( aTsyReqHandle, KErrNotSupported );
-    return KErrNone;
-    }
-
-// ---------------------------------------------------------------------------
-// CMmCallTsy::NotifyStatusChange
-// This CORE API method requests notifications when Core status changes.
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-TInt CMmCallTsy::NotifyStatusChange(
-    const TTsyReqHandle aTsyReqHandle,
-    RCall::TStatus* aStatus )
-    {
-    // Save request handle and ptr to aStatus. 
-    iRetStatus = aStatus;
-    iTsyReqHandleStore->SetTsyReqHandle(
-        EMultimodeCallNotifyStatusChange, aTsyReqHandle );
-    return KErrNone;
-    }
-
-// ---------------------------------------------------------------------------
-// CMmCallTsy::NotifyStatusChangeCancel
-// This CORE API method cancels core status change notifications.
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-TInt CMmCallTsy::NotifyStatusChangeCancel(
-    const TTsyReqHandle aTsyReqHandle )
-    {
-    iRetStatus = NULL;
-    iTsyReqHandleStore->ResetTsyReqHandle( EMultimodeCallNotifyStatusChange );
-    ReqCompleted( aTsyReqHandle, KErrCancel );
-    return KErrNone;
-    }
-
-// ---------------------------------------------------------------------------
-// CMmCallTsy::HandleGhostCallStatusChange
-// Handles status change notifications of a call object that is not monitored 
-// by any client (handle to this call object has not been opened by any client).
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-void CMmCallTsy::HandleGhostCallStatusChange(
-    TInt aResult,
-    CMmDataPackage* aDataPackage )
-    {
-    RMobileCall::TMobileCallStatus callStatus( RMobileCall::EStatusIdle );
-    RMobileCall::TMobileCallStatus receivedCallStatus( 
-        RMobileCall::EStatusIdle );
-
-    aDataPackage->UnPackData( receivedCallStatus );
-
-    TTsyReqHandle mobileStatusHandle = iTsyReqHandleStore->GetTsyReqHandle(
-        EMultimodeCallNotifyMobileCallStatusChange );
-
-    //client is ready for receiving status change indications
-    //or call has entered either idle or active status -> no
-    //more status changes are assumed soon.
-    if ( mobileStatusHandle ||
-        ( receivedCallStatus == RMobileCall::EStatusConnected ) ||
-        ( receivedCallStatus == RMobileCall::EStatusIdle ) )
-        {
-        //this call is not anymore a ghost call
-        iGhostCall = EFalse;
-
-        //idle state indicated -> no more indications waited.
-        if ( RMobileCall::EStatusIdle == receivedCallStatus )
-            {
-            //ghost call has terminated, inform client
-            CompleteNotifyStatusChange( aResult, aDataPackage );
-            }
-        //complete one or more simulated status change indications
-        else
-            {
-            if ( RMobileCall::EStatusDisconnecting == receivedCallStatus ||
-                RMobileCall::EStatusDisconnectingWithInband == 
-                                                          receivedCallStatus )
-                {
-                CompleteNotifyStatusChange( aResult, aDataPackage );                
-                }
-            else 
-                {
-                //Send simulated status indications to the client
-                //since it has missed the real ones.
-                if ( receivedCallStatus >= RMobileCall::EStatusDialling )
-                    {
-                    callStatus = RMobileCall::EStatusDialling;
-                    aDataPackage->PackData( &callStatus );
-                    CompleteNotifyStatusChange( aResult, aDataPackage );
-                    }
-                if ( receivedCallStatus >= RMobileCall::EStatusConnecting )
-                    {
-                    callStatus = RMobileCall::EStatusConnecting;
-                    aDataPackage->PackData( &callStatus );
-                    CompleteNotifyStatusChange( aResult, aDataPackage );
-                    }
-                if ( receivedCallStatus >= RMobileCall::EStatusConnected )
-                    {
-                    callStatus = RMobileCall::EStatusConnected;
-                    aDataPackage->PackData( &callStatus );
-                    CompleteNotifyStatusChange( aResult, aDataPackage );
-                    }                
-                }
-            }
-        }
-    }
-
-// ---------------------------------------------------------------------------
-// CMmCallTsy::NotifyDurationChange
-// This CORE API method requests notification when call duration changes.
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-TInt CMmCallTsy::NotifyDurationChange(
-    const TTsyReqHandle aTsyReqHandle,
-    TTimeIntervalSeconds* aTime )
-    {
-    iRetTimeIntervalSeconds = aTime;
-    iTsyReqHandleStore->SetTsyReqHandle(
-        EMultimodeCallNotifyDurationChange, aTsyReqHandle );
-
-    if ( iCallStatus == RCall::EStatusConnected && iCallTimer != NULL)
-        {
-        //start duration notifications immediately
-        iCallTimer->Start();
-        }
-
-    return KErrNone;
-    }
-
-// ---------------------------------------------------------------------------
-// CMmCallTsy::NotifyDurationChangeCancel
-// This CORE API method cancels call duration change notifications.
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-TInt CMmCallTsy::NotifyDurationChangeCancel(
-    const TTsyReqHandle aTsyReqHandle )
-    {
-    iRetTimeIntervalSeconds = NULL;
-
-    if ( iCallTimer != NULL )
-        {
-        //stop notifications
-        iCallTimer->Stop();
-        }
-
-    iTsyReqHandleStore->ResetTsyReqHandle(
-        EMultimodeCallNotifyDurationChange );
-
-    ReqCompleted( aTsyReqHandle, KErrCancel );
-
-    return KErrNone;
-    }
-
-// ---------------------------------------------------------------------------
-// CMmCallTsy::CompleteNotifyCallDurationChange
-// Complete notification when duration changes. Timer causes calling of
-// this completion every second. Type is not defined because this is
-// called by iCallTimer.
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-void CMmCallTsy::CompleteNotifyCallDurationChange()
-    {
-    //reset req handle. Returns the deleted req handle
-    TTsyReqHandle reqHandle = iTsyReqHandleStore->ResetTsyReqHandle( 
-        EMultimodeCallNotifyDurationChange );
-
-    if ( EMultimodeCallReqHandleUnknown != reqHandle )
-        {
-        //get current duration.
-        *iRetTimeIntervalSeconds = GetCallDurationInSeconds();
-        ReqCompleted( reqHandle, KErrNone );
-        }
-    }
-
-// ---------------------------------------------------------------------------
-// CMmCallTsy::GetStatus
-// This CORE API methods returns core call status through the aStatus param.
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-TInt CMmCallTsy::GetStatus(
-    const TTsyReqHandle aTsyReqHandle,
-    RCall::TStatus* aStatus )
-    {
-    *aStatus = iCallStatus;
-    ReqCompleted( aTsyReqHandle, KErrNone );    
-    return KErrNone;
-    }
-
-// ---------------------------------------------------------------------------
-// CMmCallTsy::GetCaps
-// This CORE API method returns Core call capabilities.
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-TInt CMmCallTsy::GetCaps(
-    const TTsyReqHandle aTsyReqHandle,
-    RCall::TCaps* aCaps )
-    {
-    *aCaps = iCallCaps;
-    ReqCompleted( aTsyReqHandle, KErrNone );
-    return KErrNone;
-    }
-
-// ---------------------------------------------------------------------------
-// CMmCallTsy::DialCancel
-// This CORE API method cancels an outstanding dial request.Calls HangUp 
-// method to do this and set a flag so that we can know that DialCancel 
-// handling is going on.
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-TInt CMmCallTsy::DialCancel(
-    const TTsyReqHandle aTsyReqHandle )
-    {
-TFLOGSTRING3("TSY: CMmCallTsy::DialCancel. Req handle: %d, Call name: %S", aTsyReqHandle, &iCallName);
-
-    TInt ret( KErrGeneral );
-
-    //check if dial cancel has been called
-    if ( CMmCallTsy::EDialCancelNotCalled != iDialCancelFlag )
-        {       
-        ret = KErrServerBusy;
-        }
-    else
-        {
-        ret = KErrNone;
-        iDialCancelFlag = CMmCallTsy::EDialCancelCallCalled;
-
-        if ( iCallId > 0 || (GetDialFlag()&& iCallStatus!=RMobileCall::EStatusIdle) )
-            {
-            if ( RMobileCall::EStatusDisconnecting != iMobileCallStatus )
-                {
-TFLOGSTRING("TSY: CMmCallTsy::DialCancel Hangup called");                
-            HangUp( aTsyReqHandle );
-                }
-            else
-                {
-TFLOGSTRING("TSY: CMmCallTsy::DialCancel skipped Hangup call");
-                }      
-            }
-        }
-    return ret;
-    }
-
-// ---------------------------------------------------------------------------
-// CMmCallTsy::CompleteDial
-// Completes a Dial request.
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-void CMmCallTsy::CompleteDial(
-    TInt aResult )
-    {
-TFLOGSTRING2("TSY: CMmCallTsy::CompleteDial. Result:%d", aResult ); 
-TFLOGSTRING3("TSY: CMmCallTsy::CompleteDial. Call Id:%d Call name:%S", iCallId, &iCallName);
-
-	//Set dial flag to false
-	SetDialFlag( EFalse );
-
-	TTsyReqHandle reqHandle ( EMultimodeCallReqHandleUnknown );
-	
-	if ( KETelExt3rdPartyV1 == iExtensionId )
-		{
-		//3rd Party Client
-		//reset req handle. Returns the deleted req handle
-TFLOGSTRING("TSY: CMmCallTsy::CompleteDial. EMultimodeCallDialISV");		
-	    reqHandle =
-    	    iTsyReqHandleStore->ResetTsyReqHandle( EMultimodeCallDialISV );
-    	
-		}
-	else
-		{
-		//reset req handle. Returns the deleted req handle
-TFLOGSTRING("TSY: CMmCallTsy::CompleteDial. EMultimodeCallDial");		
-	    reqHandle =
-    	    iTsyReqHandleStore->ResetTsyReqHandle( EMultimodeCallDial );	
-		}
-   
-
-    if ( EMultimodeCallReqHandleUnknown != reqHandle )
-        {
-        if ( aResult != KErrNone )
-            {
-            // The creation has failed.
-            iLastExitCode = aResult;
-            ClearCallStatus();
-
-            //Dial has failed, update core status - dial possible again
-            iCallCaps.iFlags |= RCall::KCapsDial;
-            iCallCaps.iFlags &= ~( RCall::KCapsHangUp );
-
-            //complete caps change notification
-            CompleteNotifyCapsChange();
-            }
-
-        ReqCompleted( reqHandle, aResult );
-        }
-    }
-
-// ---------------------------------------------------------------------------
-// CMmCallTsy::AnswerIncomingCallCancel
-// TSY has started a request and it is not possible to then cancel this 
-// request. The best thing for the TSY to do in this case is to call
-// HangUp method to do this and set a flag so that we can know that
-// AnswerIncomingCallCancel handling is going on.
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-TInt CMmCallTsy::AnswerIncomingCallCancel(
-    const TTsyReqHandle aTsyReqHandle )
-    {
-TFLOGSTRING3("TSY: CMmCallTsy::AnswerIncomingCallCancel. Req handle: %d,  Call name: %S", aTsyReqHandle, &iCallName);
-
-    TInt ret( KErrNone );
-
-    if( iAnswerCancelFlag )
-        {
-        ret = KErrServerBusy;
-        }
-    else
-        {
-        iAnswerCancelFlag = ETrue;
-
-        if ( 0 < iCallId )
-            {
-            HangUp( aTsyReqHandle );
-            }
-        }
-
-    return ret;
-    }
-
-// ---------------------------------------------------------------------------
-// CMmCallTsy::CompleteAnswerIncomingCall
-// Completes answer request to client.
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-void CMmCallTsy::CompleteAnswerIncomingCall(
-    TInt aResult )
-    {
-TFLOGSTRING2("TSY: CMmCallTsy::CompleteAnswerIncomingCall. Result:%d", aResult ); 
-TFLOGSTRING3("TSY: CMmCallTsy::CompleteAnswerIncomingCall. Call Id:%d Call name:%S", iCallId, &iCallName);
-
-	TTsyReqHandle reqHandle ( EMultimodeCallReqHandleUnknown );
-	
-TFLOGSTRING2("TSY: CMmCallTsy::CompleteAnswerIncomingCall. iExtensionId:%d", iExtensionId );	
-	
-	if ( KETelExt3rdPartyV1 == iExtensionId )
-		{
-		//3rd Party Client
-		//reset req handle. Returns the deleted req handle
-	    reqHandle =
-    	    iTsyReqHandleStore->ResetTsyReqHandle( EMultimodeCallAnswerISV );	
-		}
-	else
-		{
-		//reset req handle. Returns the deleted req handle
-	    reqHandle =
-    	    iTsyReqHandleStore->ResetTsyReqHandle( EMultimodeCallAnswer );
-		}
-
-    if ( EMultimodeCallReqHandleUnknown != reqHandle )
-        {
-        if ( KErrNone != aResult )
-            {
-            TInt extendedError(
-                CMmCommonStaticUtility::ExtendedErrorCode( aResult ) );
-
-            if ( KErrGsmCCNormalUnspecified == extendedError )
-                {
-                //Call MT released while answer request was ongoing
-                //Set Symbian error value to disconnected.
-                aResult = CMmCommonStaticUtility::EpocErrorCode( 
-                    KErrGeneral, KErrDisconnected );
-                }
-            else
-                {
-                iCallCaps.iFlags |= RCall::KCapsAnswer | RCall::KCapsDial;
-                iCallCaps.iFlags &= ~( RCall::KCapsHangUp );
-
-                CompleteNotifyCapsChange();
-                }
-
-            iLastExitCode = aResult;
-
-            ClearCallStatus();
-            }
-        ReqCompleted( reqHandle, aResult );
-        }
-    }
-
-// ---------------------------------------------------------------------------
-// CMmCallTsy::HangUpCancel
-// CORE API method. TSY has started a request and it is not possible to then 
-// cancel this request. The best thing for the TSY to do in this case is to 
-// proceed as though the Cancel never happened. The server's call to the TSY 
-// cancel function will return synchronously. The TSY then continues to wait 
-// for the HangUp() acknowledgemnt and when it receives it, the TSY will 
-// complete the original HangUp request.
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-TInt CMmCallTsy::HangUpCancel(
-    const TTsyReqHandle )
-    {
-    return KErrNone;
-    }
-
-// ---------------------------------------------------------------------------
-// CMmCallTsy::CompleteHangUp
-// Completes call hangup (both normal and emergency calls). If the cause value 
-// is different than the sent one, the call release requset has failed. In 
-// this case the causeValue describes the fail cause. Otherwise the call 
-// releasing  has succeeded.
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-void CMmCallTsy::CompleteHangUp(
-    TInt aResult )
-    {
-TFLOGSTRING2("TSY: CMmCallTsy::CompleteHangUp.\n  \t\t\t Result:%d", aResult ); 
-TFLOGSTRING3("TSY: CMmCallTsy::CompleteHangUp. Call Id:%d Call name:%S", iCallId, &iCallName);
-
-    TInt ret( KErrNone );
-
-    // Complete for HangUp request
-    // (not to DialCancel or AnswerIncomingCallCancel)
-    if ( CMmCallTsy::EDialCancelNotCalled == iDialCancelFlag &&
-         !iAnswerCancelFlag )
-        {
-        //reset req handle. Returns the deleted req handle
-        TTsyReqHandle reqHandle =
-            iTsyReqHandleStore->ResetTsyReqHandle( EMultimodeCallHangUp );
-
-        if ( EMultimodeCallReqHandleUnknown != reqHandle )
-            {
-            //if hangup request failed
-            if ( KErrNone != aResult )
-                {
-                //Hangup failed, it should be still possible to carry out
-                iCallCaps.iFlags |= RCall::KCapsHangUp;
-
-                //Call status is not idle. HangUp request failed, complete 
-                //HangUp request with error.
-                if ( RCall::EStatusIdle != iCallStatus )
-                    {
-                    // ignore KErrGsmReleaseByUser, which means that the call ended
-                    // because the local user released the call, and must be treated
-                    // as a normal return code from the LTSY
-                    ret = ( (aResult == KErrGsmReleaseByUser) ? KErrNone : aResult );
-                    }
-                }
-            else
-                {
-                //Dial hangup has succeeded, update core status - 
-                //dial possible again
-                iCallCaps.iFlags |= RCall::KCapsDial;
-
-                if ( KErrGsmCallRejected != iLastExitCode )
-                    {
-                    iLastExitCode = KErrNone;
-                    }
-                //If client refuses to answer, remove the answering capability
-                iCallCaps.iFlags &= ~( RCall::KCapsAnswer );
-                }
-            ReqCompleted( reqHandle, ret );
-
-            //complete caps change notification
-            CompleteNotifyCapsChange();
-            }
-        }
-    // Complete for DialCancel or AnswerIncomingCallCancel, success
-    else if ( KErrNone == aResult ) 
-        { 
-        // Find out if this is cancelling of Dial
-        TTsyReqHandle cancelHandle = iTsyReqHandleStore->
-            ResetTsyReqHandle( EMultimodeCallDial ); 
-
-        if ( cancelHandle == NULL ) 
-            { 
-            // Find out if this is cancelling of AnswerIncomingCall
-            cancelHandle = iTsyReqHandleStore->
-                ResetTsyReqHandle( EMultimodeCallAnswer );
-
-			if( NULL == cancelHandle )
-				{
-				// Find out if this is cancelling of AnswerIncomingCallISV
-            	cancelHandle = iTsyReqHandleStore->
-            	    ResetTsyReqHandle( EMultimodeCallAnswerISV );
-            	    
-                if( NULL == cancelHandle )
-                	{
-                	// Find out if this is cancelling of DialISV
-            		cancelHandle = iTsyReqHandleStore->
-            		    ResetTsyReqHandle( EMultimodeCallDialISV );
-                                            
-                    if ( NULL == cancelHandle )
-                        {   
-                        // Find out if this is cancelling of DialNoFdnCheck
-            		    cancelHandle = iTsyReqHandleStore->
-            		        ResetTsyReqHandle( EMultimodeCallDialNoFdnCheck );
-                        }
-                	}
-				}
-            }
-
-        if ( 0 < cancelHandle ) 
-            { 
-            // Complete with error value KErrCancel
-            ReqCompleted( cancelHandle, KErrCancel );
-
-            // Cancel has succeeded, update core status -
-            // dial possible again
-            iCallCaps.iFlags |= RCall::KCapsDial;
-
-            // If client refuses to answer, remove the answering capability
-            iCallCaps.iFlags &= ~( RCall::KCapsAnswer );
-
-            // Complete caps change notification
-            CompleteNotifyCapsChange();
-            }
-        } 
-    // Cancel failed and the request succeeded (connected)
-    else if ( RCall::EStatusConnected == iCallStatus ) 
-        { 
-        // Find out if this is cancelling of Dial
-        TTsyReqHandle cancelHandle = iTsyReqHandleStore->
-            ResetTsyReqHandle( EMultimodeCallDial ); 
-
-         if ( cancelHandle == NULL ) 
-            { 
-            // Find out if this is cancelling of AnswerIncomingCall
-            cancelHandle = iTsyReqHandleStore->
-                ResetTsyReqHandle( EMultimodeCallAnswer );
-
-			if( NULL == cancelHandle )
-				{
-				// Find out if this is cancelling of AnswerIncomingCallISV
-            	cancelHandle = iTsyReqHandleStore->
-            	    ResetTsyReqHandle( EMultimodeCallAnswerISV );
-            	    
-                if( NULL == cancelHandle )
-                	{
-                	// Find out if this is cancelling of DialISV
-            		cancelHandle = iTsyReqHandleStore->
-            		    ResetTsyReqHandle( EMultimodeCallDialISV );
-                	                                            
-                    if ( NULL == cancelHandle )
-                        {   
-                        // Find out if this is cancelling of DialNoFdnCheck
-            		    cancelHandle = iTsyReqHandleStore->
-            		        ResetTsyReqHandle( EMultimodeCallDialNoFdnCheck );
-                	    }
-                	}
-				}
-            }
-
-        // Cancel to Dial or AnswerIncomingCall
-        if ( 0 < cancelHandle ) 
-            { 
-            // Complete with success (KErrNone)
-            ReqCompleted( cancelHandle, KErrNone ); 
-
-            // Succeeded, update core status - hangup possible again
-            iCallCaps.iFlags |= RCall::KCapsHangUp;
-
-            // Complete caps change notification
-            CompleteNotifyCapsChange();
-            } 
-        } 
-
-    // Reset cancel flags
-    iDialCancelFlag = CMmCallTsy::EDialCancelNotCalled;
-    iAnswerCancelFlag = EFalse;
-    // Reset HangUp flag
-    iHangUpFlag = EFalse;
-    }
-
-// ---------------------------------------------------------------------------
-// CMmCallTsy::GetOwnershipStatus
-// Get call ownership status.
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-TInt CMmCallTsy::GetOwnershipStatus(
-    const TTsyReqHandle,
-    RCall::TOwnershipStatus* )
-    {
-    return KErrNotSupported;
-    }
-
-// ---------------------------------------------------------------------------
-// CMmCallTsy::TransferOwnership
-// Transfers the call ownership.
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-TInt CMmCallTsy::TransferOwnership(
-    const TTsyReqHandle )
-    {
-    return KErrNotSupported;
-    }
-
-// ---------------------------------------------------------------------------
-// CMmCallTsy::AcquireOwnership
-// Acquire the call ownership.
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-TInt CMmCallTsy::AcquireOwnership(
-    const TTsyReqHandle )
-    {
-    return KErrNotSupported;
-    }
-
-// ---------------------------------------------------------------------------
-// CMmCallTsy::AcquireOwnershipCancel
-// Cancel the call ownership acquire.
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-TInt CMmCallTsy::AcquireOwnershipCancel(
-    const TTsyReqHandle )
-    {
-    return KErrNotSupported;
-    }
-
-// ---------------------------------------------------------------------------
-// CMmCallTsy::RelinquishOwnership
-// Relinquish the call ownership.
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-TInt CMmCallTsy::RelinquishOwnership()
-    {
-    return KErrNotSupported;
-    }
-
-// ---------------------------------------------------------------------------
-// CMmCallTsy::GetCallParams
-// This CORE API method is used for getting Core call parameters.
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-TInt CMmCallTsy::GetCallParams(
-    const TTsyReqHandle aTsyReqHandle, 
-    TDes8* aParams )
-    {
-    
-    if(sizeof(RMobileCall::TMobileCallParamsV1) > aParams->MaxLength())
-	  	{
-	  	TFLOGSTRING ("TSY: CMmCallTsy::GetCallParams bad size argument");
-	  	// Complete the request with appropiate error        
-	  	return KErrArgument;
-	  	}
-    
-    RMobileCall::TMobileCallParamsV1Pckg* paramsPckgV1 = 
-        reinterpret_cast<RMobileCall::TMobileCallParamsV1Pckg*>( aParams );
-    RMobileCall::TMobileCallParamsV1& paramsV1 = ( *paramsPckgV1 )(); 
-
-    paramsV1.iSpeakerControl = iCallParams.iSpeakerControl; 
-    paramsV1.iSpeakerVolume = iCallParams.iSpeakerVolume; 
-    paramsV1.iInterval = iCallParams.iInterval; 
-    paramsV1.iWaitForDialTone = iCallParams.iWaitForDialTone; 
-
-    //let extension to update mode specific params as well
-    iMmCallExtInterface->GetCallParams( aParams ); 
-        
-    ReqCompleted( aTsyReqHandle, KErrNone );
-    return KErrNone;
-    }
-
-// ---------------------------------------------------------------------------
-// CMmCallTsy::GetCallDuration
-// This CORE API method is used for getting call duration. Calls 
-// GetCallDurationInSeconds() method to return the current call duration.
-// See details from there.
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-TInt CMmCallTsy::GetCallDuration(
-    const TTsyReqHandle aTsyReqHandle,
-    TTimeIntervalSeconds* aTime )
-    {
-    //get duration
-    *aTime = GetCallDurationInSeconds();
-    ReqCompleted( aTsyReqHandle, KErrNone );
-    return KErrNone;
-    }
-
-// ---------------------------------------------------------------------------
-// CMmCallTsy::CallId
-// Returns call ID.of this call
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-TInt CMmCallTsy::CallId() const
-    {
-    return iCallId;
-    }
-
-// ---------------------------------------------------------------------------
-// CMmCallTsy::SetCallId
-// Sets call ID.
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-TInt CMmCallTsy::SetCallId(
-    TInt aCallId )
-    {
-    TInt ret( KErrGeneral );
-
-    if ( aCallId <= KMaxCallIdValue )
-        {
-        iCallId = aCallId;
-        ret = KErrNone;
-        }
-    return ret;
-    }
-
-// ---------------------------------------------------------------------------
-// CMmCallTsy::SetCallStatus
-// Sets call Status.
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-void CMmCallTsy::SetCallStatus(
-    RCall::TStatus aCallStatus,
-    RMobileCall::TMobileCallStatus aMobileCallStatus )
-    {
-    iCallStatus = aCallStatus;
-    iMobileCallStatus = aMobileCallStatus;
-    }
-
-// ---------------------------------------------------------------------------
-// CMmCallTsy::SetPreviousCallId
-// Sets previous active call ID. The Call ID is set when the call goes to idle 
-// state. Before the previous call ID is set, all other calls are checked and 
-// if they have the same previous call ID, their call id will be cleared. This 
-// is required by Conference call implementation.
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-void CMmCallTsy::SetPreviousCallId(
-    TInt aCurrentId )
-    {
-    if ( aCurrentId > 0 )
-        {
-        CMmCallTsy* mmCall = NULL;
-
-        for ( TInt i = 0; i < iMmPhone->CallList()->
-                  GetNumberOfObjects(); i++ )
-            {
-            mmCall = iMmPhone->CallList()->GetMmCallByIndex( i );
-
-            if ( mmCall->PreviousCallId() == aCurrentId )
-                {
-                mmCall->SetPreviousCallId( -1 );
-                }
-            }
-        }
-    iPreviousCallId = aCurrentId;
-    }
-
-// ---------------------------------------------------------------------------
-// CMmCallTsy::PreviousCallId
-// Returns previous active call ID. The Call ID is reset when the call goes to 
-// idle state. This is required by Conference call implementation.
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-TInt CMmCallTsy::PreviousCallId() const
-    {
-    return iPreviousCallId;
-    }
-
-// ---------------------------------------------------------------------------
-// CMmCallTsy::ResetPreviousCallId
-// Resets previous active call ID. The Call ID is reset when the call goes to 
-// idle state. This is required by Conference call implementation.
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-void CMmCallTsy::ResetPreviousCallId()
-    {
-    iPreviousCallId = -1;
-    }
-
-// ---------------------------------------------------------------------------
-// CMmCallTsy::CallMode
-// Returns call mode.
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-RMobilePhone::TMobileService CMmCallTsy::CallMode() const
-    {
-    return iCallMode;
-    }
-
-// ---------------------------------------------------------------------------
-// CMmCallTsy::CallDirection
-// Returns call direction.
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-RMobileCall::TMobileCallDirection CMmCallTsy::CallDirection() const
-    { 
-    return iCallDirection; 
-    } 
-
-// ---------------------------------------------------------------------------
-// CMmCallTsy::SetCallDirection
-// Sets call direction.
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-TInt CMmCallTsy::SetCallDirection(
-    RMobileCall::TMobileCallDirection aCallDirection )
-    {
-    iCallDirection = aCallDirection;
-    return KErrNone;
-    }
-
-// ---------------------------------------------------------------------------
-// CMmCallTsy::CallName
-// Returns call name.
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-const TDesC& CMmCallTsy::CallName() const
-    {
-    return iCallName;
-    }
-
-// ---------------------------------------------------------------------------
-// CMmCallTsy::SetCallName
-// Sets call name.
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-void CMmCallTsy::SetCallName(
-    const TName& aCallName )
-    {
-    iCallName = aCallName;
-    }
-
-// ---------------------------------------------------------------------------
-// CMmCallTsy::SetCallCaps
-// Sets call capabilities.
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-void CMmCallTsy::SetCallCaps(
-    TUint32 aCallCaps )
-    {
-    iCallCaps.iFlags = aCallCaps;
-    CompleteNotifyCapsChange();
-    }
-
-// ---------------------------------------------------------------------------
-// CMmCallTsy::CallCaps
-// Returns call capabilities.
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-TUint32 CMmCallTsy::CallCaps() const
-    {
-    //get call caps
-    TUint32 aCallCaps = iCallCaps.iFlags;
-    //return them
-    return aCallCaps;
-    }
-
-// ---------------------------------------------------------------------------
-// CMmCallTsy::GetMobileCallCaps
-// This function returns the call control and call event dynamic capabilities.
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-TInt CMmCallTsy::GetMobileCallCaps(
-    const TTsyReqHandle aTsyReqHandle,
-    TDes8* aCaps )
-    {
-    TInt ret( KErrArgument );
-    
-    if ( sizeof ( RMobileCall::TMobileCallCapsV1 ) <= aCaps->MaxLength() )
-        {
-        RMobileCall::TMobileCallCapsV1Pckg* callCapsV1Pckg = 
-            reinterpret_cast<RMobileCall::TMobileCallCapsV1Pckg*>( aCaps );
-        RMobileCall::TMobileCallCapsV1& callCapsV1 = 
-            ( *callCapsV1Pckg )();
-
-        if ( KETelExtMultimodeV1 == callCapsV1.ExtensionId() )
-            {   
-            ret = KErrNone;
-            iMmCallExtInterface->GetMobileCallCapsV1( callCapsV1 );
-            }
-        }
-        
-    ReqCompleted( aTsyReqHandle, ret );
-    return KErrNone;
-    }
-
-
-// ---------------------------------------------------------------------------
-// CMmCallTsy::NotifyMobileCallCapsChange
-// Notifies the change of Mobile Call Capabilities.
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-TInt CMmCallTsy::NotifyMobileCallCapsChange(
-    TDes8* aCaps )
-    {
-    TInt ret( KErrArgument ); 
-    
-    if ( sizeof ( RMobileCall::TMobileCallCapsV1 ) <= aCaps->MaxLength() )
-        {
-        RMobileCall::TMobileCallCapsV1Pckg* callCapsV1Pckg = 
-            reinterpret_cast<RMobileCall::TMobileCallCapsV1Pckg*>( aCaps );
-        RMobileCall::TMobileCallCapsV1& callCapsV1 = 
-            ( *callCapsV1Pckg )();  
-     
-        if ( KETelExtMultimodeV1 == callCapsV1.ExtensionId() )
-            {    
-            ret = KErrNone;
-            iRetNotifyMobileCallCaps = aCaps;
-            iReqHandleType = EMultimodeCallNotifyMobileCallCapsChange;
-            }
-        }
-    return ret;
-
-    }
-
-// ---------------------------------------------------------------------------
-// CMmCallTsy::NotifyMobileCallCapsChangeCancel
-// Cancels an outstanding asynchronous NotifyMobileCallCapsChange request.
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-TInt CMmCallTsy::NotifyMobileCallCapsChangeCancel(
-    const TTsyReqHandle aTsyReqHandle )
-    {
-    //reset pointer
-    iRetNotifyMobileCallCaps = NULL; 
-    iTsyReqHandleStore->ResetTsyReqHandle( 
-        EMultimodeCallNotifyMobileCallCapsChange );
-    ReqCompleted( aTsyReqHandle, KErrCancel );
-    return KErrNone;
-    }
-
-// ---------------------------------------------------------------------------
-// CMmCallTsy::CompleteNotifyMobileCallCapsChange
-// Completes a NotifyMobileCallCapsChange method. The caps request is directed 
-// to the currently active protocol extension.
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-void CMmCallTsy::CompleteNotifyMobileCallCapsChange(
-    TInt aErrorCode )
-    {
-      //get req handle. 
-    TTsyReqHandle reqHandle = iTsyReqHandleStore->GetTsyReqHandle( 
-                                EMultimodeCallNotifyMobileCallCapsChange );
-
-    if ( EMultimodeCallReqHandleUnknown != reqHandle )
-        {
-        RMobileCall::TMobileCallCapsV1Pckg* callCapsV1Pckg = 
-            reinterpret_cast<RMobileCall::TMobileCallCapsV1Pckg*>( 
-                iRetNotifyMobileCallCaps );
-        RMobileCall::TMobileCallCapsV1& callCapsV1 = 
-            ( *callCapsV1Pckg )();
-                        
-        iMmCallExtInterface->GetMobileCallCapsV1( callCapsV1 );
-        
-        if (callCapsV1.iCallControlCaps != iPreviousCallControlCaps )
-            {           
-            //reset req handle. 
-            iTsyReqHandleStore->ResetTsyReqHandle( 
-                EMultimodeCallNotifyMobileCallCapsChange );
-                
-            iPreviousCallControlCaps = callCapsV1.iCallControlCaps;
-            iRetNotifyMobileCallCaps = NULL;
-            ReqCompleted( reqHandle, aErrorCode );  
-            }
-        }
-    }
-
-// ---------------------------------------------------------------------------
-// CMmCallTsy::CompleteNotifyMobileCallCapsChange
-// Returns a pointer to the active extension.
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-CMmCallExtInterface* CMmCallTsy::ActiveCallExtension()
-    {
-    return iMmCallExtInterface;
-    }
-
-// ---------------------------------------------------------------------------
-// CMmCallTsy::ClearCallStatus
-// Clears internal call status.
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-void CMmCallTsy::ClearCallStatus()
-    {
-    iCallDirection = RMobileCall::EDirectionUnknown;
-    iEtelOriginated = ETrue;
-    }
-
-// ---------------------------------------------------------------------------
-// CMmCallTsy::Status
-// Returns the current core call status. Can be called from TSY classes.
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-RCall::TStatus CMmCallTsy::Status() const
-    {
-    return iCallStatus;
-    }
-
-// ---------------------------------------------------------------------------
-// CMmCallTsy::MobileCallStatus
-// Returns the current mobile call status. Can be called from TSY classes.
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-RMobileCall::TMobileCallStatus CMmCallTsy::MobileCallStatus() const
-    {
-    return iMobileCallStatus;
-    }
-
-// ---------------------------------------------------------------------------
-// CMmCallTsy::GetMobileCallStatus
-// Returns the current status of the call through the aStatus argument.
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-TInt CMmCallTsy::GetMobileCallStatus(
-    const TTsyReqHandle aTsyReqHandle,
-    RMobileCall::TMobileCallStatus* aStatus )
-    {
-    *aStatus = iMobileCallStatus;
-    ReqCompleted( aTsyReqHandle, KErrNone );
-    return KErrNone;
-    }
-
-// ---------------------------------------------------------------------------
-// CMmCallTsy::NotifyMobileCallStatusChange
-// Allows a client to be notified when the call changes state. The request 
-// completes when the call changes state, the new state being passed in the 
-// aStatus parameter.
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-TInt CMmCallTsy::NotifyMobileCallStatusChange(
-    RMobileCall::TMobileCallStatus* aStatus )
-    {
-    iRetMobileCallStatus = aStatus;
-    iReqHandleType = EMultimodeCallNotifyMobileCallStatusChange;
-    return KErrNone;
-    }
-
-// ---------------------------------------------------------------------------
-// CMmCallTsy::NotifyMobileCallStatusChangeCancel
-// Cancels an outstanding asynchronous NotifyMobileCallStatusChange request.
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-TInt CMmCallTsy::NotifyMobileCallStatusChangeCancel(
-    const TTsyReqHandle aTsyReqHandle )
-    {
-    iRetMobileCallStatus = NULL;
-    iTsyReqHandleStore->ResetTsyReqHandle( 
-        EMultimodeCallNotifyMobileCallStatusChange );
-
-    ReqCompleted( aTsyReqHandle, KErrCancel );
-    return KErrNone;
-    }
-
-// ---------------------------------------------------------------------------
-// CMmCallTsy::NotifyCallEvent
-// Allows clients to be notified when various call events occur. These events 
-// may be generated locally (i.e. from within the ME) or remotely (by the 
-// remote connected party). The request completes when an event occurs. Upon 
-// completion, the aEvent parameter will return the event type.
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-TInt CMmCallTsy::NotifyCallEvent(
-    RMobileCall::TMobileCallEvent* aEvent )
-    {
-    iRetCallEvent = aEvent;
-    iReqHandleType = EMultimodeCallNotifyCallEvent;
-    return KErrNone;
-    }
-
-// ---------------------------------------------------------------------------
-// CMmCallTsy::NotifyCallEventCancel
-// This method cancels an outstanding asynchronous NotifyCallEvent request.
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-TInt CMmCallTsy::NotifyCallEventCancel(
-    const TTsyReqHandle aTsyReqHandle )
-    {
-    iRetCallEvent = NULL;
-    iTsyReqHandleStore->ResetTsyReqHandle( EMultimodeCallNotifyCallEvent );
-    ReqCompleted( aTsyReqHandle, KErrCancel );
-    return KErrNone;
-    }
-
-// ---------------------------------------------------------------------------
-// CMmCallTsy::CompleteNotifyCallEvent
-// Allows clients to be notified when various call events occur.
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-void CMmCallTsy::CompleteNotifyCallEvent(
-    RMobileCall::TMobileCallEvent aEvent )
-    {    
-    //reset req handle. Returns the deleted req handle
-    TTsyReqHandle reqHandle = iTsyReqHandleStore->ResetTsyReqHandle(
-        EMultimodeCallNotifyCallEvent );
-
-    if ( EMultimodeCallReqHandleUnknown != reqHandle &&
-        iRetCallEvent != NULL )
-        {
-		if( IsPartOfConference() && RMobileCall::ERemoteTerminated == aEvent )
-			{
-TFLOGSTRING("TSY: iIsRemoteReleasedCall = ETrue");
-			iIsRemoteReleasedCall = ETrue;
-			}
-        *iRetCallEvent = aEvent;
-        ReqCompleted( reqHandle, KErrNone );
-        }
-    }
-
-// ---------------------------------------------------------------------------
-// CMmCallTsy::CompleteNotifyRemoteCallEvent
-// Informs common TSY about a remote event (that cannot be understood from
-// status indication.
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-void CMmCallTsy::CompleteNotifyRemoteCallEvent(
-    const CMmDataPackage* aDataPackage )
-    {    
-    RMobileCall::TMobileCallEvent callEvent( RMobileCall::ERemoteHold );
-    aDataPackage->UnPackData( callEvent );
-
-    switch ( callEvent )
-        {
-        case RMobileCall::ERemoteHold:
-        case RMobileCall::ERemoteResume:
-        case RMobileCall::ERemoteTerminated:
-        case RMobileCall::ERemoteConferenceCreate:
-            CompleteNotifyCallEvent( callEvent );
-            break;
-        //local events handled by CMmCallTsy::CompleteNotifyStatusChange 
-        case RMobileCall::ELocalHold:
-        case RMobileCall::ELocalResume:
-        case RMobileCall::ELocalDeflectCall:
-        case RMobileCall::ELocalTransfer:
-        //not supported cases
-        case RMobileCall::ERemoteTransferring:
-        case RMobileCall::ERemoteTransferAlerting:
-		case RMobileCall::ERemoteBarred:
-		case RMobileCall::ERemoteForwarding:
-		case RMobileCall::ERemoteWaiting:
-		case RMobileCall::ELocalBarred:
-        default:
-            break;
-        }
-    }
-
-// ---------------------------------------------------------------------------
-// CMmCallTsy::GetMobileCallInfo
-// The method returns a current snapshot of the call information
-// described in the TMobileCallInfoVx class. The class is packaged into
-// a TMobileCallInfoVxPckg before being passed to the GetMobileCallInfo method.
-// This method actually calls FillMobileCallInfo method to get mobile call 
-// information.
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-TInt CMmCallTsy::GetMobileCallInfo(
-    const TTsyReqHandle aTsyReqHandle,
-    TDes8* aInfo )
-    {
-    //get the mobile call information
-    TInt ret = FillMobileCallInfo( aInfo );
-
-    ReqCompleted( aTsyReqHandle, ret );
-    return KErrNone;
-    }
-
-// ---------------------------------------------------------------------------
-// CMmCallTsy::FillMobileCallInfo
-// The method fills a current snapshot of the call information described in 
-// the TMobileCallInfoVx class to the aInfo. The mode specific fields will
-// be filled by the extension.
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-TInt CMmCallTsy::FillMobileCallInfo(
-    TDes8* aInfo )
-    {
-TFLOGSTRING("TSY: CMmCallTsy::FillMobileCallInfo");
-
-    TInt ret = KErrArgument;
-    TInt extensionId = 0;
-
-	if ( sizeof ( RMobilePhone::TMultimodeType ) <= aInfo->MaxLength() )
-    	{
-        RMobilePhone::TMultimodeTypePckg* infoParamsPckg =
-            reinterpret_cast<RMobilePhone::TMultimodeTypePckg*>(
-            aInfo );
-        RMobilePhone::TMultimodeType& callInfo = ( *infoParamsPckg )();
-            
-        // get extensionid from the recieved data
-        extensionId = callInfo.ExtensionId();
-TFLOGSTRING2("TSY: CMmCallTsy::FillMobileCallInfo - extensionid=%d",callInfo.ExtensionId());      
-        }
- 
-    //TMobileCallInfoV1
-    if ( KETelExtMultimodeV1 == extensionId ||
-    	 KETelExtMultimodeV3 == extensionId ||
-    	 KEtelExtMultimodeV7 == extensionId ||
-    	 KEtelExtMultimodeV8 == extensionId )
-        {
-TFLOGSTRING("TSY: CMmCallTsy::FillMobileCallInfo - V1");    
-
-        // Set ret to KErrNone. We can fill this parameter class.
-        ret = KErrNone;            
-            
-        RMobileCall::TMobileCallInfoV1Pckg* paramsPckgV1 =
-            reinterpret_cast<RMobileCall::TMobileCallInfoV1Pckg*>( aInfo );
-        RMobileCall::TMobileCallInfoV1& info = ( *paramsPckgV1 )();
-          
-        // set mobilecallinfo default values
-        FillMobileCallInfoDefaults( &info );
-                    
-        // fill specific data
-        iMmCallExtInterface->FillMobileCallInfo( &info );
-        }
-            
-    // TMobileCallInfoV3
-    if ( KETelExtMultimodeV3 == extensionId ||
-		 KEtelExtMultimodeV7 == extensionId ||
-    	 KEtelExtMultimodeV8 == extensionId )
-        {
-TFLOGSTRING("TSY: CMmCallTsy::FillMobileCallInfo - V3");                
-            
-        RMobileCall::TMobileCallInfoV3Pckg* paramsPckgV3 =
-            reinterpret_cast<RMobileCall::TMobileCallInfoV3Pckg*>( aInfo );
-        RMobileCall::TMobileCallInfoV3& info = ( *paramsPckgV3 )();        
-            
-        // fill specific data
-        iMmCallExtInterface->FillMobileCallInfoV3( &info ) ;
-        }
-
-    // TMobileCallInfoV7
-    if ( KEtelExtMultimodeV7 == extensionId ||
-    	 KEtelExtMultimodeV8 == extensionId )
-        {
-TFLOGSTRING("TSY: CMmCallTsy::FillMobileCallInfo - V7");
-            
-        RMobileCall::TMobileCallInfoV7Pckg* paramsPckgV7 =
-            reinterpret_cast<RMobileCall::TMobileCallInfoV7Pckg*>( aInfo );
-        RMobileCall::TMobileCallInfoV7& info = ( *paramsPckgV7 )();
-            
-        // fill specific data
-        iMmCallExtInterface->FillMobileCallInfoV7( &info );
-        }
-    
-    // TMobileCallInfoV8
-    if ( KEtelExtMultimodeV8 == extensionId )
-        {
-TFLOGSTRING("TSY: CMmCallTsy::FillMobileCallInfo - V8");
-                
-        RMobileCall::TMobileCallInfoV8Pckg* paramsPckgV8 =
-            reinterpret_cast<RMobileCall::TMobileCallInfoV8Pckg*>( aInfo );
-        RMobileCall::TMobileCallInfoV8& info = ( *paramsPckgV8 )();
-                
-        // fill specific data
-        iMmCallExtInterface->FillMobileCallInfoV8( &info );
-        }
-
-TFLOGSTRING2("TSY: CMmCallTsy::FillMobileCallInfo end. ret=%d",ret);
-      
-    return ret;
-    }
-
-// ---------------------------------------------------------------------------
-// CMmCallTsy::NotifyRemotePartyInfoChange
-// This method allows the client to be notified of any change in the remote 
-// party information. 
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-TInt CMmCallTsy::NotifyRemotePartyInfoChange(
-    TDes8* aRemotePartyInfo )
-    {
-    TInt ret = KErrNone;
-    
-    if( sizeof( RMobileCall::TMobileCallRemotePartyInfoV1 ) > aRemotePartyInfo->MaxLength() )
-    	{
-TFLOGSTRING ("TSY: CMmCallTsy::NotifyRemotePartyInfoChange Bad size argument");
-        
-        // Complete the request with appropiate error        
-        ret = KErrArgument;
-    	}
-    else
-        {
-        iRetRemotePartyInfo = aRemotePartyInfo;
-        iReqHandleType = EMultimodeCallNotifyRemotePartyInfoChange;
-        }
-        
-    return ret;
-    }
-
-// ---------------------------------------------------------------------------
-// CMmCallTsy::NotifyRemotePartyInfoChangeCancel
-// This method cancels an outstanding asynchronous NotifyRemotePartyInfoChange 
-// request.
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-TInt CMmCallTsy::NotifyRemotePartyInfoChangeCancel(
-    const TTsyReqHandle aTsyReqHandle )
-    {
-    iRetRemotePartyInfo = NULL;
-    iTsyReqHandleStore->ResetTsyReqHandle( 
-        EMultimodeCallNotifyRemotePartyInfoChange );
-
-    ReqCompleted( aTsyReqHandle, KErrCancel );
-    return KErrNone;
-    }
-
-// ---------------------------------------------------------------------------
-// CMmCallTsy::CompleteNotifyRemotePartyInfoChange
-// Completes a NotifyRemotePartyInfoChange method.
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-void CMmCallTsy::CompleteNotifyRemotePartyInfoChange()
-    {     
-    //reset req handle. Returns the deleted req handle
-    TTsyReqHandle reqHandle = iTsyReqHandleStore->ResetTsyReqHandle( 
-                                EMultimodeCallNotifyRemotePartyInfoChange );
-
-    if ( EMultimodeCallReqHandleUnknown != reqHandle )
-        {
-        iMmCallExtInterface->GetRemotePartyInfo( 
-            reinterpret_cast<RMobileCall::TMobileCallRemotePartyInfoV1Pckg*> 
-            ( iRetRemotePartyInfo ) );
-        ReqCompleted( reqHandle, KErrNone );
-        }
-    }
-
-// ---------------------------------------------------------------------------
-// CMmCallTsy::CompleteNotifyMobileCallInfoChange
-// Notifies common TSY about mobile call information change.
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-void CMmCallTsy::CompleteNotifyMobileCallInfoChange(
-    CMmDataPackage* aDataPackage )
-    {
-    //set data to gsm extension
-    //( direction added because not uppdated in messagehandler)
-    iMmCallExtInterface->SetMobileCallData(
-        aDataPackage, iCallDirection );
-    //call completenotify remotepartyinfochange
-    CompleteNotifyRemotePartyInfoChange();
-    }
-
-// ---------------------------------------------------------------------------
-// CMmCallTsy::TransferL
-// This method allows a client to transfer a call so that the remote party of 
-// one call ends up connected to the remote party of another call while this 
-// user drops out of both calls. 
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-TInt CMmCallTsy::TransferL(
-    const TTsyReqHandle aTsyReqHandle )
-    {
-    TInt ret( KErrServerBusy );
-
-    TTsyReqHandle transferHandle = 
-        iTsyReqHandleStore->GetTsyReqHandle( EMultimodeCallTransfer );
-
-    if ( !transferHandle )
-        {
-        ret = iMmCallExtInterface->TransferL();
-
-        if ( KErrNone != ret )
-            {
-            ReqCompleted( aTsyReqHandle, ret );
-            }
-        else
-            {
-            //save tsy req handle type
-            iReqHandleType = EMultimodeCallTransfer;
-            }
-        }
-    else
-        {
-        ReqCompleted( aTsyReqHandle, ret );
-        }      
-    return KErrNone;
-    }
-
-// ---------------------------------------------------------------------------
-// CMmCallTsy::CompleteTransfer
-// This method completes an outstanding asynchronous Transfer request.
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-void CMmCallTsy::CompleteTransfer(
-    TInt aErrorCode )
-    {
-    //reset req handle. Returns the deleted req handle
-    TTsyReqHandle reqHandle =
-        iTsyReqHandleStore->ResetTsyReqHandle( EMultimodeCallTransfer );
-
-    if ( EMultimodeCallReqHandleUnknown != reqHandle )
-        {
-        ReqCompleted( reqHandle, aErrorCode );
-        }    
-    }
-
-// ---------------------------------------------------------------------------
-// CMmCallTsy::NotifyPrivacyConfirmation
-// This method allows the client to be notified when the network has confirmed 
-// the privacy setting.
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-TInt CMmCallTsy::NotifyPrivacyConfirmation(
-    RMobilePhone::TMobilePhonePrivacy* aPrivacyStatus )
-    {
-    iRetPrivacyStatus = aPrivacyStatus;
-    iReqHandleType = EMultimodeCallNotifyPrivacyConfirmation;    
-    return KErrNone;
-    }
-
-// ---------------------------------------------------------------------------
-// CMmCallTsy::NotifyPrivacyConfirmationCancel
-// Cancels an outstanding asynchronous NotifyPrivacyConfirmation request.
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-TInt CMmCallTsy::NotifyPrivacyConfirmationCancel(
-    const TTsyReqHandle aTsyReqHandle )
-    {
-    iRetPrivacyStatus = NULL;
-    iTsyReqHandleStore->ResetTsyReqHandle( 
-        EMultimodeCallNotifyPrivacyConfirmation );
-
-    ReqCompleted( aTsyReqHandle, KErrCancel );
-    return KErrNone;
-    }
-
-// ---------------------------------------------------------------------------
-// CMmCallTsy::CompleteNotifyPrivacyConfirmation
-// Completes a NotifyPrivacyConfirmation request. 
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-void CMmCallTsy::CompleteNotifyPrivacyConfirmation(
-    RMobilePhone::TMobilePhonePrivacy aStatus )
-    {
-    //reset req handle. Returns the deleted req handle
-    TTsyReqHandle reqHandle = iTsyReqHandleStore->ResetTsyReqHandle(
-        EMultimodeCallNotifyPrivacyConfirmation );
-
-    if ( EMultimodeCallReqHandleUnknown != reqHandle ) 
-        {
-        *iRetPrivacyStatus = aStatus;
-        ReqCompleted( reqHandle, KErrNone );
-        }
-    }
-
-// ---------------------------------------------------------------------------
-// CMmCallTsy::Line
-// Return the line from which this call object has been opened from.
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-CMmLineTsy* CMmCallTsy::Line()
-    {
-    //Return the line from which this call object has been opened from.
-    return iMmLine;
-    }
-
-// ---------------------------------------------------------------------------
-// CMmCallTsy::Phone
-// This method returns pointer to the Phone object.
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-CMmPhoneTsy* CMmCallTsy::Phone()
-    {
-    //This method returns pointer to the Phone object.
-    return iMmPhone;
-    }
-
-// ---------------------------------------------------------------------------
-// CMmCallTsy::GetCallDurationInSeconds
-// Returns call duration in seconds. If call is not active, the duration of 
-// the last successful call will be returned.
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-TTimeIntervalSeconds CMmCallTsy::GetCallDurationInSeconds()
-    {
-    // If the call is active, NumberOfBeats will return the current duration
-    // If the call is not active, NumberOfBeats will return the last 
-    // call duration
-    TTimeIntervalSeconds duration ( iCallTimer->NumberOfBeats() );
-    return duration;
-    }
-
-// ---------------------------------------------------------------------------
-// CMmCallTsy::IsServiceLocallyRequested
-// Return ETrue if this type of request is requested by any of TSY's client. 
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-TBool CMmCallTsy::IsServiceLocallyRequested(
-    CMmCallTsy::TCallRequestTypes aReqType )
-    {
-    //Return ETrue if this type of request is requested by any TSY's client.
-    //create parameter callCount and get number of objects from call list to 
-    //it
-    TInt callCount = iMmPhone->CallList()->GetNumberOfObjects();
-    CMmCallTsy* mmCall = NULL;
-    TBool ret( EFalse);
-
-    for ( TInt i = 0; i < callCount; i++ )
-        {
-        mmCall = reinterpret_cast<CMmCallTsy*>(
-            iMmPhone->CallList()->GetObjectByIndex(i));
-
-        if( mmCall->ServiceRequested( aReqType ) )
-            {
-            ret = ETrue;
-            break;
-            }
-        }
-    return ret;
-    }
-
-// ---------------------------------------------------------------------------
-// CMmCallTsy::GetGhostCall
-// Return ETrue if this call is a Ghost Call
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-TBool CMmCallTsy::GetGhostCall() const
-    {    
-    return iGhostCall;
-    }
-
-// ---------------------------------------------------------------------------
-// CMmCallTsy::GetDiagnostics
-// Returns value of iDiagnosticOctect internal attribute
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-TUint8 CMmCallTsy::GetDiagnostics() const
-    {
-    return iDiagnosticOctet;
-    }
-
-// ---------------------------------------------------------------------------
-// CMmCallTsy::SetDiagnostics
-// Sets aDiagnosticOctet into internal variable iDiagnosticOctet
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-void CMmCallTsy::SetDiagnostics( 
-    TUint8 aDiagnosticOctet )
-    {
-    iDiagnosticOctet = aDiagnosticOctet;
-    }
-
-// ---------------------------------------------------------------------------
-// CMmCallTsy::GetCallReqHandleStore
-// Returns pointer to iTsyReqHandleStore
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//    
-CMmTsyReqHandleStore* CMmCallTsy::GetCallReqHandleStore()
-    {
-    return iTsyReqHandleStore;
-    }
-
-// ---------------------------------------------------------------------------
-// CMmCallTsy::SetUnownedCallObjectFlag
-// TSY creates automatically call object for incoming call or ghost call that 
-// is created using AT-commands. This method sets flag indicating if a client 
-// has't opened existing call object for this call.
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//    
-void CMmCallTsy::SetUnownedCallObjectFlag(
-    TBool aIsUnownedCallObject )
-    {   
-    iUnownedCallObject = aIsUnownedCallObject;
-    }
-
-// ---------------------------------------------------------------------------
-// CMmCallTsy::IsUnownedCallObject
-// TSY creates automatically call object for incoming call or ghost call that 
-// is created using AT-commands. This flag indicates that client haven't 
-// opened existing call object for this call.
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-TBool CMmCallTsy::IsUnownedCallObject() const
-    {  
-    return iUnownedCallObject;
-    }
-
-// ---------------------------------------------------------------------------
-// CMmCallTsy::SetGhostCall
-// Sets a flag that indicates that this call is not created through ETel
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-void CMmCallTsy::SetGhostCall(
-    TBool aValue )
-    {
-    //Sets a flag that indicates that this call is not created through ETel
-    iGhostCall = aValue;
-
-    if ( aValue )
-        {
-        iEtelOriginated = EFalse;
-        }
-    }
-
-// ---------------------------------------------------------------------------
-// CMmCallTsy::ETelOriginated
-// Returns ETrue is this call has been originated through ETel API
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-TBool CMmCallTsy::ETelOriginated() const
-    {    
-    return iEtelOriginated;
-    }
-
-// ---------------------------------------------------------------------------
-// CMmCallTsy::ServiceRequested
-// Returns ETrue if this service is pending on this call object
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-TBool CMmCallTsy::ServiceRequested(
-    CMmCallTsy::TCallRequestTypes aReqType )
-    {
-    TBool ret( EFalse );
-
-    if( CMmCallTsy::EMultimodeCallReqHandleUnknown != 
-        iTsyReqHandleStore->GetTsyReqHandle( aReqType ) )
-        {
-        //Returns ETrue if this service is pending on this call object
-        ret = ETrue;
-        }
-    return ret;
-    }
-
-#ifdef REQHANDLE_TIMER
-// ---------------------------------------------------------------------------
-// CMmCallTsy::Complete
-// Completes the request due timer expiration
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-void CMmCallTsy::Complete(
-    TInt aReqHandleType,
-    TInt aError )
-    {
-    //All possible TSY req handle types are listed in the
-    //switch case below. 
-    switch( aReqHandleType )
-        {
-        //cases handled with automatic completion
-        case EMultimodeCallDial:
-        case EMultimodeCallDialISV:
-            CompleteDial( aError );
-            break;
-        case EMultimodeCallDialNoFdnCheck:
-            CompleteDialNoFdn( aError );
-            break;
-        case EMultimodeCallAnswer:
-        case EMultimodeCallAnswerISV:
-            CompleteAnswerIncomingCall( aError );
-            break;
-        case EMultimodeCallHangUp:
-            CompleteHangUp( aError );
-            break;
-        case EMultimodeCallTransfer: 
-            CompleteTransfer( aError );
-            break;
-
-        //Can't use timer:
-        // - all notifications
-            //case EMultimodeCallNotifyStatusChange: 
-            //case EMultimodeCallNotifyDurationChange:
-            //case EMultimodeCallCapsChangeNotification:
-            //case EMultimodeCallNotifyMobileCallStatusChange: 
-            //case EMultimodeCallNotifyCallEvent:
-            //case EMultimodeCallNotifyRemotePartyInfoChange:
-            //case EMultimodeCallNotifyMobileCallCapsChange:
-            //case EMultimodeCallNotifyDataCallCapsChange:
-            //case EMultimodeCallNotifyHscsdInfoChange:
-            //case EMultimodeCallNotifyPrivacyConfirmation:
-
-        case EMultimodeMobileCallHold:
-        case EMultimodeMobileCallResume:
-        case EMultimodeMobileCallSwap:
-        case EMultimodeMobileCallDeflectCall:
-        case EMultimodeMobileCallDialEmergencyCall:
-        case EMultimodeCallGoOneToOne:
-        case EMultimodeCallSetDynamicHscsdParams:
-        default:
-            ReqCompleted(
-                iTsyReqHandleStore->ResetTsyReqHandle( aReqHandleType ),
-                aError );
-            break;
-        }
-    }
-#endif
-
-
-#ifdef TF_LOGGING_ENABLED
-// ---------------------------------------------------------------------------
-// CMmCallTsy::ReqCompleted
-// Overloads CTelObject::ReqCompleted for logging purposes. It prints the 
-// aTsyReqHandle and aError variable in the log file and then calls 
-// CTelObject::ReqCompleted.
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-void CMmCallTsy::ReqCompleted(
-    const TTsyReqHandle aTsyReqHandle,
-    const TInt aError )
-    {
-    //Overloads CTelObject::ReqCompleted for logging purposes. It 
-    //prints the aTsyReqHandle and aError variable in the log file and then 
-    //calls CTelObject::ReqCompleted.
-TFLOGSTRING3("TSY: CMmCallTsy::Request Completed. Handle:%d Error:%d", aTsyReqHandle, aError); 
-
-    CTelObject::ReqCompleted(aTsyReqHandle,aError);
-    }
-#endif
-
-// ---------------------------------------------------------------------------
-// CMmCallTsy::IsPartOfConference
-// Returns ETrue if this call is part of a conference
-// ---------------------------------------------------------------------------
-//
-TBool CMmCallTsy::IsPartOfConference() const
-	{
-	return iIsPartOfConference;
-	}
-
-// ---------------------------------------------------------------------------
-// CMmCallTsy::SetPartOfConference
-// Sets the flag indicating that this call is part of a MO conference
-// ---------------------------------------------------------------------------
-//
-void CMmCallTsy::SetPartOfConference( TBool aPartOfConference )
-{
-	iIsPartOfConference = aPartOfConference;
-
-#ifdef TF_LOGGING_METHOD
-	if ( iIsPartOfConference )
-		{
-TFLOGSTRING2( "TSY: CMmCallTsy::SetPartOfConference: Call %d has joined the conference", iCallId );
-		}
-	else
-		{
-TFLOGSTRING( "TSY: CMmCallTsy::SetPartOfConference: Call has left the conference" );
-		}
-#endif // TF_LOGGING_METHOD
-
-}
-// ---------------------------------------------------------------------------
-// CMmCallTsy::IsRequestPossibleInOffLine
-// Checks wether a ETel request can be performed or not while offline mode is
-// enabled
-// ---------------------------------------------------------------------------
-//
-TBool CMmCallTsy::IsRequestPossibleInOffline( TInt aIpc ) const
-    {
-    // we assume here that most of the requests are possible, thefore
-    // we switch for the not possible ones, optimizing a bit the checking.
-    TBool isRequestPossible ( ETrue );
-
-    switch ( aIpc )
-        {
-        case EMobileCallDialEmergencyCall://OK (when flag is enabled)
-        	{
-        	isRequestPossible = EFalse;        	
-        	RFeatureControl featureControl;
-        	TInt err = featureControl.Open();
-        	if ( (err == KErrNone) && (featureControl.FeatureSupported(NFeature::KEmergencyCallsEnabledInOfflineMode) == KFeatureSupported) )
-                {
-                isRequestPossible = ETrue;
-                }
-            featureControl.Close();    
-        	}
-            break;
-        //case EMobileCallGetMobileCallStatus: //OK
-        //case EMobileCallNotifyMobileCallStatusChange://OK
-        case EMobileCallHold://NO
-        case EMobileCallResume://NO
-        case EMobileCallSwap://NO
-        case EMobileCallTransfer://NO
-        case EMobileCallGoOneToOne://NO
-        //case EMobileCallNotifyCallEvent://OK
-        //case EMobileCallGetMobileCallCaps: //OK
-        //case EMobileCallNotifyMobileCallCapsChange: //OK
-        //case EMobileCallGetMobileCallInfo://OK
-        //case EMobileCallNotifyRemotePartyInfoChange://OK
-        //case EMobileCallNotifyPrivacyConfirmation://OK
-        //case EMobileCallGetMobileDataCallCaps: //OK
-        //case EMobileCallNotifyMobileDataCallCapsChange: //OK
-        //case EMobileCallGetMobileDataCallRLPRange://OK
-        //case EMobileCallSetDynamicHscsdParams://OK
-        //case EMobileCallGetCurrentHscsdInfo://OK
-        //case EMobileCallNotifyHscsdInfoChange://OK
-            isRequestPossible = EFalse;
-            break;
-        default:
-            break;
-        }
-        
-    return isRequestPossible;
-
-    }
-
-// ---------------------------------------------------------------------------
-// CMmCallTsy::GetFaxSettings
-// This CORE API method is used for getting fax settings
-// (not supported by default).
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-TInt CMmCallTsy::GetFaxSettings(
-    const TTsyReqHandle,
-    RCall::TFaxSessionSettings* )
-    {
-    return KErrNotSupported;
-    }
-
-// ---------------------------------------------------------------------------
-// CMmCallTsy::SetFaxSettings
-// This CORE API method is used for set fax settings
-// (not supported by default).
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-TInt CMmCallTsy::SetFaxSettings(
-    const TTsyReqHandle,
-    const RCall::TFaxSessionSettings*)
-    {
-    return KErrNotSupported;
-    }
-    
-
-// ---------------------------------------------------------------------------
-// CMmCallTsy::SetExtensionId
-// Set iExtensionId attribute
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-void CMmCallTsy::SetExtensionId(
-	TInt aExtensionId )
-	{
-	iExtensionId = aExtensionId;
-TFLOGSTRING2("TSY: CMmCallTsy::SetExtensionId.iExtensionId:%d",iExtensionId );
-	}
-
-// ---------------------------------------------------------------------------
-// CMmCallTsy::GetExtensionId
-// Get iExtensionId attribute
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-TInt CMmCallTsy::GetExtensionId()
-	{
-	return iExtensionId; 
-	}
-	
-// ---------------------------------------------------------------------------
-// CMmCallTsy::SetDialFlag
-// Sets iDialFlag boolean value
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//	
-void CMmCallTsy::SetDialFlag(
-	TBool aDialFlag )
-	{	
-	iDialFlag= aDialFlag;
-TFLOGSTRING2("TSY: CMmCallTsy::SetDialFlag. iDialFlag:%d",iDialFlag );			
-	}
-
-// ---------------------------------------------------------------------------
-// CMmCallTsy::GetDialFlag
-// Returns iDialFlag boolean value
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-TBool CMmCallTsy::GetDialFlag()
-	{	
-	
-TFLOGSTRING2("TSY: CMmCallTsy::GetDialFlag. iDialFlag:%d",iDialFlag );			
-	return iDialFlag;	
-	}
-
-// ---------------------------------------------------------------------------
-// CMmCallTsy::IsRemoteReleasedCall
-// Returns iIsRemoteReleasedCall boolean value
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-TBool CMmCallTsy::IsRemoteReleasedCall() const
-	{
-TFLOGSTRING("TSY: CMmCallTsy::IsRemoteReleasedCall()");
-	return iIsRemoteReleasedCall;
-	}
-
-// ---------------------------------------------------------------------------
-// CMmCallTsy::ActivateUUS
-// Specifies which User-To-User Signalling service(s) should be activated.
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-TInt CMmCallTsy::ActivateUUS( const TTsyReqHandle aTsyReqHandle,
-    RMobileCall::TMobileCallUUSRequestV1Pckg* aUUSRequest )
-	{
-    // Support only implicit-UUS1 service,
-    // save the UUS-Request and send it during the Dial so that
-    // UUS-Request can be mapped on LTSY side to correct phone call (with id).
-    // details of the message send, see CMmVoiceCallTsy::Dial 
-    
-    // To support UUS2 and UUS3 services in future the logic must be
-    // changed so that the UUS information can be sended to LTSY immediately.
-    
-    // Unpack UUS parameters
-	RMobileCall::TMobileCallUUSRequestV1 requestUUS = ( *aUUSRequest )();	
-TFLOGSTRING3("TSY: CMmCallTsy::ActivateUUS() -ServiceReq:%u  -UUI:%S", requestUUS.iServiceReq, &requestUUS.iUUI );
-    // handle implicit UUS1 request only
-    if ( requestUUS.iServiceReq & RMobileCall::KUUS1Implicit )
-        {
-        // take a copy of the UUS request
-        iUUSRequest = requestUUS; 
-        // complete req, with KErrNone
-        ReqCompleted( aTsyReqHandle, KErrNone );
-        }
-    else
-        {
-        // other UUS services are not supported in this phase
-        ReqCompleted( aTsyReqHandle, KErrNotSupported );
-        }
-        
-	return KErrNone;
-	}	
-	
-// ---------------------------------------------------------------------------
-// CMmCallTsy::ReceiveUUI
-// Enables the client to receive the next incoming UUI message or in case 
-// already received, return the buffered UUI.
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-TInt CMmCallTsy::ReceiveUUI( const TTsyReqHandle aTsyReqHandle,
-    RMobileCall::TMobileCallUUI* aUUI )
-	{
-TFLOGSTRING("TSY: CMmCallTsy::ReceiveUUI()" );
-    
-    // check are there any UUI information already in the buffer (UUS1)
-    if ( 0 < iReceivedUUI.Length() )
-        {
-TFLOGSTRING2("TSY: CMmCallTsy::ReceiveUUI() - information in BUFFER:%S", &iReceivedUUI );
-        // copy and empty the buffered information
-        *aUUI = iReceivedUUI;
-        iReceivedUUI.Zero(); 
-        
-        // complete the request
-        ReqCompleted( aTsyReqHandle, KErrNone );        
-        }
-    else
-        {
-TFLOGSTRING("TSY: CMmCallTsy::ReceiveUUI() - wait for next incoming UUI message" );
-        // Save request handle and pointer of the UUI message. 
-        iRetUUI = aUUI;
-        iTsyReqHandleStore->SetTsyReqHandle(
-            EMultimodeCallReceiveUUI, aTsyReqHandle );
-        }
-         
-    return KErrNone;
-	}
-
-// ---------------------------------------------------------------------------
-// CMmCallTsy::ReceiveUUICancel
-// Use this method to cancel a previously placed asynchronous 
-// EMobileCallReceiveUUI request.
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-TInt CMmCallTsy::ReceiveUUICancel( const TTsyReqHandle aTsyReqHandle )
-	{
-TFLOGSTRING("TSY: CMmCallTsy::ReceiveUUICancel()");
-    
-    // reset the client side pointer, empty buffer and cancel the handle
-    iRetUUI = NULL;
-    iReceivedUUI.Zero(); 
-    iTsyReqHandleStore->ResetTsyReqHandle( EMultimodeCallReceiveUUI );
-    ReqCompleted( aTsyReqHandle, KErrCancel );
-    return KErrNone;
-	}
-	
-// ---------------------------------------------------------------------------
-// CMmCallTsy::CompleteReceiveUUI
-// This method completes an outstanding ReceiveUUI request.
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-void CMmCallTsy::CompleteReceiveUUI( CMmDataPackage* aDataPackage, 
-    TInt aResult )
-	{
-TFLOGSTRING("TSY: CMmCallTsy::CompleteReceiveUUI()" );
-
-    RMobileCall::TMobileCallUUI* receiveUUI = NULL; 
-    aDataPackage->UnPackData( &receiveUUI );
-    
-TFLOGSTRING2("TSY: CMmCallTsy::CompleteReceiveUUI() - receiveUUI:%S", &receiveUUI );
-    
-    // reset req handle. Returns the deleted req handle
-    TTsyReqHandle reqHandle =
-        iTsyReqHandleStore->ResetTsyReqHandle( EMultimodeCallReceiveUUI );
-
-    if ( EMultimodeCallReqHandleUnknown != reqHandle )
-        {
-TFLOGSTRING("TSY: CMmCallTsy::CompleteReceiveUUI() - Handle found, complete" );
-        // Update the client side data through pointer        
-        *iRetUUI = *receiveUUI;
-        // Null client side pointer, data copied
-        iRetUUI = NULL;
-        // complete req
-        ReqCompleted( reqHandle, aResult );
-        }
-    else if ( KErrNone == aResult )
-        {
-TFLOGSTRING("TSY: CMmCallTsy::CompleteReceiveUUI() - Handle NOT found, buffer" );
-        // set initial information to the buffer
-        iReceivedUUI = *receiveUUI; 
-        }
-	}
-
-// ---------------------------------------------------------------------------
-// CMmCallTsy::SetDialTypeId
-// Set iDialTypeId attribute
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-void CMmCallTsy::SetDialTypeId(
-	TUint8 aDialType )
-	{
-	iDialTypeId = aDialType;
-TFLOGSTRING2("TSY: CMmCallTsy::SetDialTypeId.iDialType:%d",aDialType );
-	}
-
-// ---------------------------------------------------------------------------
-// CMmCallTsy::GetDialTypeId
-// Returns iDialTypeId value
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-TUint8 CMmCallTsy::GetDialTypeId()
-	{	
-	
-TFLOGSTRING2("TSY: CMmCallTsy::GetDialType. iDialType:%d",iDialTypeId );			
-	return iDialTypeId;	
-	}
-
-// ---------------------------------------------------------------------------
-// CMmCallTsy::CompleteDialNoFdn
-// Completes a Dial request.
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------	
-//
-void CMmCallTsy::CompleteDialNoFdn( 
-    TInt aResult )
-	{	
-TFLOGSTRING2("TSY: CMmCallTsy::CompleteDialNoFdn. Result:%d", aResult ); 
-TFLOGSTRING3("TSY: CMmCallTsy::CompleteDialNoFdn. Call Id:%d Call name:%S", iCallId, &iCallName);
-
-	//Set dial flag to false
-	SetDialFlag( EFalse );
-
-	TTsyReqHandle reqHandle ( EMultimodeCallReqHandleUnknown );	
-	
-	// Reset req handle. Returns the deleted req handle
-	reqHandle = iTsyReqHandleStore->ResetTsyReqHandle( 
-        EMultimodeCallDialNoFdnCheck );
-    
-    if ( EMultimodeCallReqHandleUnknown != reqHandle )
-        {
-        if ( aResult != KErrNone )
-            {
-            // The creation has failed.
-            iLastExitCode = aResult;
-            ClearCallStatus();
-
-            //Dial has failed, update core status - dial possible again
-            iCallCaps.iFlags |= RCall::KCapsDial;
-            iCallCaps.iFlags &= ~( RCall::KCapsHangUp );
-
-            //complete caps change notification
-            CompleteNotifyCapsChange();
-            }
-        //Complete request
-        ReqCompleted( reqHandle, aResult );
-        }
-        	
-	//Set dial type to none 
-	SetDialTypeId( KMultimodeCallTypeDialNone );	
-	}
-
-// ---------------------------------------------------------------------------
-// CMmCallTsy::UpdateLifeTimer
-// When the last call from conference call becomes idle, we are updating
-// life time duration param with remaining call duration
-// ---------------------------------------------------------------------------	
-//     
-void CMmCallTsy::UpdateLifeTimer()
-	{
-    if ( iMmPhone->NumberOfActiveCalls() == 0 )
-    	{                    	                                        
-        TTimeIntervalSeconds tis;
-		iMmPhone->GetAirTimeDuration(tis);
-		TUint32 duration;
-		duration = tis.Int();
-		duration = duration % iMmPhone->KLifeTimeUpdateInterval;
-
-		TFLOGSTRING2("TSY: CMmCallTsy::UpdateLifeTimer - \
-		        duration: %d", duration);
-				
-		//errors: trap and ignore
-        CMmDataPackage dataPackage;
-        dataPackage.PackData( &duration );
-		
-#ifdef USING_CTSY_DISPATCHER	
-    TRAP_IGNORE(iMessageManager->HandleRequestL( 
-    				ECtsyUpdateLifeTimeReq, &dataPackage );
-        ); 
-#else	
-    TRAP_IGNORE(iMessageManager->HandleRequestL( 
-    				EMmTsyUpdateLifeTimeIPC, &dataPackage );
-        ); 
-#endif //USING_CTSY_DISPATCHER 
-    	}	
-	}
-// CMmCallTsy::FillMobileCallInfoDefaults
-// The method fills a current snapshot of the call information described in 
-// the TMobileCallInfoV1 class to the aInfo. The mode specific fields will
-// be filled by the extension.
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-TInt CMmCallTsy::FillMobileCallInfoDefaults(
-    RMobileCall::TMobileCallInfoV1* aInfo )
-    {
-TFLOGSTRING("TSY: CMmCallTsy::FillMobileCallInfoDefaults");    
-
-    //set validity fields to 0 in the beginning.
-    aInfo->iValid = 0;
-    //The name of the call
-    aInfo->iCallName.Copy( iCallName );
-    //The name of the line on which the call is open
-    aInfo->iLineName.Copy( iMmLine->LineName() );
-    //The current status of the call
-    aInfo->iStatus = iMobileCallStatus;
-
-    //The time & date the call started.
-    TDateTime temp( iCallTimer->GetTimerStartTime()->DateTime() );
-    aInfo->iStartTime.Set(
-        temp.Year(), temp.Month(), temp.Day(),
-        temp.Hour(), temp.Minute(), temp.Second(), temp.MicroSecond() );
-
-    //The current duration of the call
-    aInfo->iDuration = GetCallDurationInSeconds();
-
-    //Set validity indication
-    aInfo->iValid |= RMobileCall::KCallStartTime | RMobileCall::KCallDuration;
-
-    //Client call Id. Note! Call server uses different call Id.
-    aInfo->iCallId = iCallId;
-    aInfo->iValid |= RMobileCall::KCallId; 
-
-    //The reason for termination of a finished call. Will equal KErrNone if
-    //the call ended normally and KErrNotFound if the call has not ended.
-    aInfo->iExitCode = iLastExitCode;
-    aInfo->iValid |= RMobileCall::KCallExitCode;
-
-    //ETrue if the call is an emergency call or EFalse if it is not.
-    aInfo->iEmergency = iEmergencyCall;
-    aInfo->iValid |= RMobileCall::KCallEmergency;
-TFLOGSTRING("TSY: CMmCallTsy::FillMobileCallInfoDefaults end");     
-    return KErrNone;
-    }
-    
-//  End of File  
+// Copyright (c) 2006-2009 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:
+//
+
+
+
+// INCLUDE FILES
+#include "cmmcalltsy.h"
+#include <featmgr/featurecontrol.h>
+#include <featureuids.h>
+#include "cmmphonetsy.h"
+#include "cmmlinetsy.h"
+#include "cmmtsyreqhandlestore.h"
+#include "cmmcalllist.h"
+#include "CMmCommonStaticUtility.h"
+#include "cmmlinelist.h"
+#include "cmmmessagemanagerbase.h"
+#include <ctsy/pluginapi/cmmdatapackage.h>
+#include <ctsy/serviceapi/gsmerror.h>
+#include "cmmcallgsmwcdmaext.h"
+#include <ctsy/pluginapi/mtelephonyaudiocontrol.h>
+
+// ======== MEMBER FUNCTIONS ========
+
+CMmCallTsy::CMmCallTsy() :
+    iCallParamsPckg(iCallParams),
+    iReqHandleType(EMultimodeCallReqHandleUnknown)
+    {
+    }
+
+void CMmCallTsy::ConstructL( 
+	RMobilePhone::TMobileService aMode )
+    {    
+#ifdef REQHANDLE_TIMER   
+    //Create req handle store
+    iTsyReqHandleStore = CMmTsyReqHandleStore::NewL( this, iMmPhone, 
+        EMultimodeCallMaxNumOfRequests, iCallReqHandles);
+#else
+    //Create req handle store
+    iTsyReqHandleStore = CMmTsyReqHandleStore::NewL( 
+        EMultimodeCallMaxNumOfRequests, iCallReqHandles);
+#endif
+
+    iCallMode = aMode;
+
+    //Call ownership change request list
+    iList = CAcquireOwnerList::NewL();
+
+    //initialise call duration notifier
+    iCallTimer = CHeartbeatRunner::NewL( this );
+
+    //Initialise extension modules
+    InitExtensionModulesL( aMode );
+
+    //Initialise miscellaneous internal attributes
+    InitInternalAttributes();
+    }
+
+CMmCallTsy::~CMmCallTsy()
+    {
+TFLOGSTRING3("TSY: CMmCallTsy::~CMmCallTsy. Call deleted iCallId:%d iCallName:%S",iCallId, &iCallName);
+
+    TInt trapError( KErrNone );
+
+    //Hang up call if call is still connecting or active and hang up is not
+    //called
+    if( iTsyReqHandleStore )
+        {
+        if ( !( RMobileCall::EStatusIdle == iMobileCallStatus ||
+            RMobileCall::EStatusDisconnecting == iMobileCallStatus ||
+            RMobileCall::EStatusDisconnectingWithInband == iMobileCallStatus ) 
+            && ( 0 == iTsyReqHandleStore->GetTsyReqHandle( 
+                                                    EMultimodeCallHangUp ) ) )
+            {
+                TBool timerStarted = EFalse;
+                if( iCallTimer )
+                    {
+                    timerStarted = iCallTimer->Stop();
+                    }
+            //Check air time timer only if call was in active state(call timer 
+            //was started)
+            if ( timerStarted )
+                {
+                if( iMmPhone )
+                	{
+                	iMmPhone->AirTimeTimerCheckStop();
+                	//TODO: attention reviewers - please check if UpdateLifeTimer should/shouldn't be called here
+                    UpdateLifeTimer();
+                    }
+                }
+    
+            //Send call release request before deleting this object
+            TInt symbianHangUpCause( KErrGsmReleaseByUser );
+    
+    		//Create package
+    		CCallDataPackage package;
+    		//Set call id and call mode
+    		package.SetCallIdAndMode( iCallId, iCallMode );
+    		
+    		TBool autoStChangeDisable = EFalse;
+    		//Pack call parameters and mobile call info
+    		package.PackData( &symbianHangUpCause, &autoStChangeDisable );
+    		//Send request to the Domestic OS layer.
+            if( iMessageManager )
+            	{
+            	TRAP( trapError,
+                iMessageManager->HandleRequestL( EEtelCallHangUp, &package );
+                );
+                // inform telephony audio control that we're hanging up the call	
+                if ( iTelephonyAudioControlSetup && iTelephonyAudioControl )
+                    {
+                    iTelephonyAudioControl->TeardownTelephonyAudio( iCallName, 
+                                                                    KErrNone );
+TFLOGSTRING2("TSY: CMmCallTsy::~CMmCallTsy Call routing tear down: Call name:%S", &iCallName );
+                    }
+                
+            	}
+    
+            // We can't do nothing if hanguprequest fails here,
+            // because call object is closed.
+            }
+        }
+
+    //delete req handle store
+    if ( iTsyReqHandleStore )
+        {
+        delete iTsyReqHandleStore;
+        }
+    iTsyReqHandleStore = NULL;
+    
+    //delete req handle store
+    if ( iList )
+        {
+        delete iList;
+        }
+    iList = NULL;
+
+    //delete call ownership change request list
+    if ( iCallTimer )
+        {
+        delete iCallTimer;
+        }
+    iCallTimer = NULL;
+
+    //Decrement number of opened calls from line.
+    if( iMmLine )
+    	{
+    	iMmLine->DecrementNumberOfCalls();
+    	}
+    
+    // Remove the call from the list of calls
+    if( iMmPhone )
+    	{
+    	iMmPhone->CallList()->RemoveObject( this );
+    	}
+
+    //delete call extension
+    if ( iMmCallExtInterface )
+        {
+    	delete iMmCallExtInterface;
+        }
+    iMmCallExtInterface = NULL;
+
+    iMmPhone = NULL;
+    iMmLine = NULL;
+    iCallTimer = NULL;
+    iRetNotifyMobileCallCaps = NULL;
+    iRetCaps = NULL;
+    iRetStatus = NULL;
+    iRetMobileCallStatus = NULL;
+    iRetRemotePartyInfo = NULL;
+    iRetTimeIntervalSeconds = NULL;
+    iRetCallEvent = NULL;
+    iList = NULL;
+    iTsyReqHandleStore = NULL;
+    iRetPrivacyStatus = NULL;
+    iMessageManager = NULL;
+    iRetUUI = NULL; 
+    }
+
+// ---------------------------------------------------------------------------
+// CMmCallTsy::InitExtensionModulesL
+// Initialises extension modules for CMmCallTsy
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+void CMmCallTsy::InitExtensionModulesL(
+    RMobilePhone::TMobileService aMode )
+    {
+    RMobilePhone::TMobilePhoneNetworkMode currentMode;
+    iMmPhone->GetStaticExtensionMode( &currentMode );
+
+    iMmCallExtInterface  = reinterpret_cast<CMmCallExtInterface*> 
+        (CMmCallGsmWcdmaExt::NewL( this, aMode, iMessageManager ) );
+
+    }
+
+// ---------------------------------------------------------------------------
+// CMmCallTsy::InitInternalAttributes
+// Initialises miscellaneous internal attributes.
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+void CMmCallTsy::InitInternalAttributes()
+    {
+    //Set status parameters
+    iCallStatus = RCall::EStatusIdle;
+    iMobileCallStatus = RMobileCall::EStatusIdle;
+
+    //Initialise call params
+    iCallParams.iSpeakerControl = RCall::EMonitorSpeakerControlOnUntilCarrier;
+    iCallParams.iSpeakerVolume = RCall::EMonitorSpeakerVolumeLow;
+    iCallParams.iInterval = 4;
+    iCallParams.iWaitForDialTone = RCall::EDialToneWait;
+    iCallParams.iIdRestrict = RMobileCall::EIdRestrictDefault;
+    iCallParams.iCug.iExplicitInvoke = EFalse;
+    iCallParams.iCug.iCugIndex = 0;
+    iCallParams.iCug.iSuppressPrefCug = EFalse;
+    iCallParams.iCug.iSuppressOA = EFalse;
+    iCallParams.iAutoRedial = EFalse;
+    // CallParamsV2
+    iCallParams.iBearerMode = RMobileCall::EMulticallNotSupported;
+
+    // CallParamsV7
+    iCallParams.iCallParamOrigin = RMobileCall::EOriginatorUnknown;
+    iCallParams.iBCRepeatIndicator = RMobileCall::EBCAlternateMode;
+    iCallParams.iIconId.iQualifier = RMobileCall::EIconQualifierNotSet;
+    iCallParams.iIconId.iIdentifier = 0;
+    iCallParams.iAlphaId.Zero();
+    iCallParams.iSubAddress.Zero();
+    iCallParams.iBearerCap1.Zero();
+    iCallParams.iBearerCap2.Zero();
+    iCallParams.iBCRepeatIndicator = RMobileCall::EBCAlternateMode;
+    
+    iDialCancelFlag = CMmCallTsy::EDialCancelNotCalled;
+    iAnswerCancelFlag = EFalse;
+    iHangUpFlag = EFalse; 
+
+    //this is required for the Conference call.
+    iPreviousCallId = -1;
+
+    //Initialize last exit code
+    iLastExitCode = KErrNotFound;
+    //this is required for custom tsy
+    iDiagnosticOctet = NULL;
+
+    //by default a call object has been created through ETel
+    iGhostCall = EFalse;
+    iEtelOriginated = ETrue;
+
+    iPreviousCallControlCaps = 0;
+	iIsRemoteReleasedCall = EFalse;
+    }
+
+// ---------------------------------------------------------------------------
+// CMmCallTsy::OpenNewObjectByNameL
+// Creates new  object and returns a pointer to it. Not supported.
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+CTelObject* CMmCallTsy::OpenNewObjectByNameL(    
+    const TDesC& )
+    {
+    //Not supported
+    User::Leave( KErrNotSupported );
+	//lint -e{527} "unreachable code"
+    return NULL;
+    }
+
+// ---------------------------------------------------------------------------
+// CMmCallTsy::OpenNewObjectL
+// Creates new object and returns a pointer to it. Not supported.
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+CTelObject* CMmCallTsy::OpenNewObjectL(
+    TDes& )
+    {
+    // Not supported
+    User::Leave( KErrNotSupported );
+	//lint -e{527} "unreachable code"
+    return NULL;
+    }
+
+// ---------------------------------------------------------------------------
+// CMmCallTsy::ExtFunc
+// TRAP's all CMmCallTsy related MM API requests in case that they fail. This 
+// method functions only as a centralized TRAP for the DoExtFuncL method that 
+// does the actual mapping of IPC number to TSY method call.
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+TInt CMmCallTsy::ExtFunc( 
+    const TTsyReqHandle aTsyReqHandle,
+    const TInt aIpc,
+    const TDataPackage& aPackage )
+    {    
+    TInt ret( KErrNone );
+    TInt trapError( KErrNone );
+
+    // Ensure the ReqHandleType is unset.
+    // This will detect cases where this method indirectly calls itself
+    // (e.g. servicing a client call that causes a self-reposting notification to complete and thus repost).
+    // Such cases are not supported because iReqHandleType is in the context of this class instance,
+    // not this request, and we don't want the values set by the inner request and the outer request
+    // interfering with each other.
+    __ASSERT_DEBUG(iReqHandleType==EMultimodeCallReqHandleUnknown, User::Invariant());
+
+
+    //before processing further the request, check if offline mode status
+    //is enabled and if the given request can be perfomed in that case.
+    if ( ERfsStateInfoInactive == iMmPhone->GetRfStateInfo () &&
+        !IsRequestPossibleInOffline( aIpc ) )  
+        {
+TFLOGSTRING2("TSY: Offline mode ON, request is not allowed: %d", aIpc );
+        ret = CMmCommonStaticUtility::EpocErrorCode(
+            KErrGeneral, KErrGsmOfflineOpNotAllowed );
+
+        //Complete the request with appropiate error
+        ReqCompleted ( aTsyReqHandle, ret ); 
+        }
+    else
+        {
+        TRAP( trapError, ret = DoExtFuncL( aTsyReqHandle, aIpc, aPackage ); );
+
+        if ( trapError != KErrNone )
+            {
+            //error handling. Object cannot be created. 
+            ReqCompleted( aTsyReqHandle, trapError );
+            }
+        else if ( ret != KErrNone )
+            {
+            ReqCompleted( aTsyReqHandle, ret );
+            }   
+        //save request handle
+        if ( EMultimodeCallReqHandleUnknown != iReqHandleType )
+            {
+#ifdef REQHANDLE_TIMER
+            SetTypeOfResponse( iReqHandleType, aTsyReqHandle );
+#else
+            iTsyReqHandleStore->SetTsyReqHandle(
+                iReqHandleType, aTsyReqHandle );
+#endif
+            // We've finished with this value now. Clear it so it doesn't leak
+            //  up to any other instances of this method down the call stack
+            iReqHandleType = EMultimodeCallReqHandleUnknown;
+            }
+    
+        }
+
+    return KErrNone;
+    }
+
+// ---------------------------------------------------------------------------
+// CMmCallTsy::GetInfo
+// This CORE API method returns core Call information.
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+TInt CMmCallTsy::GetInfo(
+    const TTsyReqHandle aTsyReqHandle,
+    RCall::TCallInfo* aCallInfo )
+    {
+    //Fill Core Call information
+    aCallInfo->iCallName = iCallName;
+    aCallInfo->iStatus = iCallStatus;
+    aCallInfo->iLineName = iMmLine->LineName();
+    aCallInfo->iHookStatus = RCall::EHookStatusUnknown;
+    aCallInfo->iDuration = GetCallDurationInSeconds();
+
+    ReqCompleted( aTsyReqHandle, KErrNone );
+    return KErrNone;
+    }
+
+// ---------------------------------------------------------------------------
+// CMmCallTsy::NotifyCapsChange
+// This CORE API method requests notifications when core caps change.
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+TInt CMmCallTsy::NotifyCapsChange(
+    const TTsyReqHandle aTsyReqHandle,
+    RCall::TCaps* aCaps )
+    {
+    iRetCaps = aCaps;
+    //Store the current capabilities
+    iPreviousCaps =  iCallCaps;
+
+    iTsyReqHandleStore->SetTsyReqHandle(
+        EMultimodeCallCapsChangeNotification, aTsyReqHandle );
+
+    return KErrNone;
+    }
+
+// ---------------------------------------------------------------------------
+// CMmCallTsy::NotifyCapsChangeCancel
+// This CORE API method cancels core caps change notifications.
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+TInt CMmCallTsy::NotifyCapsChangeCancel(
+    const TTsyReqHandle aTsyReqHandle )
+    {    
+    iRetCaps = NULL;
+    iTsyReqHandleStore->ResetTsyReqHandle(
+        EMultimodeCallCapsChangeNotification );
+
+    ReqCompleted( aTsyReqHandle, KErrCancel );
+
+    return KErrNone;
+    }
+
+// ---------------------------------------------------------------------------
+// CMmCallTsy::CompleteNotifyCapsChange
+// Complete notification when caps change.
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+void CMmCallTsy::CompleteNotifyCapsChange()
+    {
+    //reset req handle. Returns the deleted req handle
+    TTsyReqHandle reqHandle = iTsyReqHandleStore->ResetTsyReqHandle(
+        EMultimodeCallCapsChangeNotification );
+
+    //if caps have changed and client has requested capability notifications
+    if ( EMultimodeCallReqHandleUnknown != reqHandle &&
+        iRetCaps != NULL &&
+        iCallCaps.iFlags != iPreviousCaps.iFlags )
+        {
+        iRetCaps->iFlags = iCallCaps.iFlags;
+        ReqCompleted( reqHandle, KErrNone );
+        }
+    }
+
+// ---------------------------------------------------------------------------
+// CMmCallTsy::NotifyHookChange
+// This CORE API method requests notifications on hook change.
+// Feature not supported.
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+TInt CMmCallTsy::NotifyHookChange(
+    const TTsyReqHandle aTsyReqHandle,
+    RCall::THookStatus* )
+    {
+    ReqCompleted( aTsyReqHandle, KErrNotSupported );
+    return KErrNone;
+    }
+
+// ---------------------------------------------------------------------------
+// CMmCallTsy::NotifyHookChange
+// This CORE API method cancels hook change notifications.
+// Feature not supported.
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+TInt CMmCallTsy::NotifyHookChangeCancel(
+    const TTsyReqHandle aTsyReqHandle )
+    {
+    ReqCompleted( aTsyReqHandle, KErrNotSupported );
+    return KErrNone;
+    }
+
+// ---------------------------------------------------------------------------
+// CMmCallTsy::NotifyStatusChange
+// This CORE API method requests notifications when Core status changes.
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+TInt CMmCallTsy::NotifyStatusChange(
+    const TTsyReqHandle aTsyReqHandle,
+    RCall::TStatus* aStatus )
+    {
+    // Save request handle and ptr to aStatus. 
+    iRetStatus = aStatus;
+    iTsyReqHandleStore->SetTsyReqHandle(
+        EMultimodeCallNotifyStatusChange, aTsyReqHandle );
+    return KErrNone;
+    }
+
+// ---------------------------------------------------------------------------
+// CMmCallTsy::NotifyStatusChangeCancel
+// This CORE API method cancels core status change notifications.
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+TInt CMmCallTsy::NotifyStatusChangeCancel(
+    const TTsyReqHandle aTsyReqHandle )
+    {
+    iRetStatus = NULL;
+    iTsyReqHandleStore->ResetTsyReqHandle( EMultimodeCallNotifyStatusChange );
+    ReqCompleted( aTsyReqHandle, KErrCancel );
+    return KErrNone;
+    }
+
+// ---------------------------------------------------------------------------
+// CMmCallTsy::HandleGhostCallStatusChange
+// Handles status change notifications of a call object that is not monitored 
+// by any client (handle to this call object has not been opened by any client).
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+void CMmCallTsy::HandleGhostCallStatusChange(
+    TInt aResult,
+    CMmDataPackage* aDataPackage )
+    {
+    RMobileCall::TMobileCallStatus callStatus( RMobileCall::EStatusIdle );
+    RMobileCall::TMobileCallStatus receivedCallStatus( 
+        RMobileCall::EStatusIdle );
+
+    aDataPackage->UnPackData( receivedCallStatus );
+
+    TTsyReqHandle mobileStatusHandle = iTsyReqHandleStore->GetTsyReqHandle(
+        EMultimodeCallNotifyMobileCallStatusChange );
+
+    //client is ready for receiving status change indications
+    //or call has entered either idle or active status -> no
+    //more status changes are assumed soon.
+    if ( mobileStatusHandle ||
+        ( receivedCallStatus == RMobileCall::EStatusConnected ) ||
+        ( receivedCallStatus == RMobileCall::EStatusIdle ) )
+        {
+        //this call is not anymore a ghost call
+        iGhostCall = EFalse;
+
+        //idle state indicated -> no more indications waited.
+        if ( RMobileCall::EStatusIdle == receivedCallStatus )
+            {
+            //ghost call has terminated, inform client
+            CompleteNotifyStatusChange( aResult, aDataPackage );
+            }
+        //complete one or more simulated status change indications
+        else
+            {
+            if ( RMobileCall::EStatusDisconnecting == receivedCallStatus ||
+                RMobileCall::EStatusDisconnectingWithInband == 
+                                                          receivedCallStatus )
+                {
+                CompleteNotifyStatusChange( aResult, aDataPackage );                
+                }
+            else 
+                {
+                //Send simulated status indications to the client
+                //since it has missed the real ones.
+                if ( receivedCallStatus >= RMobileCall::EStatusDialling )
+                    {
+                    callStatus = RMobileCall::EStatusDialling;
+                    aDataPackage->PackData( &callStatus );
+                    CompleteNotifyStatusChange( aResult, aDataPackage );
+                    }
+                if ( receivedCallStatus >= RMobileCall::EStatusConnecting )
+                    {
+                    callStatus = RMobileCall::EStatusConnecting;
+                    aDataPackage->PackData( &callStatus );
+                    CompleteNotifyStatusChange( aResult, aDataPackage );
+                    }
+                if ( receivedCallStatus >= RMobileCall::EStatusConnected )
+                    {
+                    callStatus = RMobileCall::EStatusConnected;
+                    aDataPackage->PackData( &callStatus );
+                    CompleteNotifyStatusChange( aResult, aDataPackage );
+                    }                
+                }
+            }
+        }
+    }
+
+// ---------------------------------------------------------------------------
+// CMmCallTsy::NotifyDurationChange
+// This CORE API method requests notification when call duration changes.
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+TInt CMmCallTsy::NotifyDurationChange(
+    const TTsyReqHandle aTsyReqHandle,
+    TTimeIntervalSeconds* aTime )
+    {
+    iRetTimeIntervalSeconds = aTime;
+    iTsyReqHandleStore->SetTsyReqHandle(
+        EMultimodeCallNotifyDurationChange, aTsyReqHandle );
+
+    if ( iCallStatus == RCall::EStatusConnected && iCallTimer != NULL)
+        {
+        //start duration notifications immediately
+        iCallTimer->Start();
+        }
+
+    return KErrNone;
+    }
+
+// ---------------------------------------------------------------------------
+// CMmCallTsy::NotifyDurationChangeCancel
+// This CORE API method cancels call duration change notifications.
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+TInt CMmCallTsy::NotifyDurationChangeCancel(
+    const TTsyReqHandle aTsyReqHandle )
+    {
+    iRetTimeIntervalSeconds = NULL;
+
+    if ( iCallTimer != NULL )
+        {
+        //stop notifications
+        iCallTimer->Stop();
+        }
+
+    iTsyReqHandleStore->ResetTsyReqHandle(
+        EMultimodeCallNotifyDurationChange );
+
+    ReqCompleted( aTsyReqHandle, KErrCancel );
+
+    return KErrNone;
+    }
+
+// ---------------------------------------------------------------------------
+// CMmCallTsy::CompleteNotifyCallDurationChange
+// Complete notification when duration changes. Timer causes calling of
+// this completion every second. Type is not defined because this is
+// called by iCallTimer.
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+void CMmCallTsy::CompleteNotifyCallDurationChange()
+    {
+    //reset req handle. Returns the deleted req handle
+    TTsyReqHandle reqHandle = iTsyReqHandleStore->ResetTsyReqHandle( 
+        EMultimodeCallNotifyDurationChange );
+
+    if ( EMultimodeCallReqHandleUnknown != reqHandle )
+        {
+        //get current duration.
+        *iRetTimeIntervalSeconds = GetCallDurationInSeconds();
+        ReqCompleted( reqHandle, KErrNone );
+        }
+    }
+
+// ---------------------------------------------------------------------------
+// CMmCallTsy::GetStatus
+// This CORE API methods returns core call status through the aStatus param.
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+TInt CMmCallTsy::GetStatus(
+    const TTsyReqHandle aTsyReqHandle,
+    RCall::TStatus* aStatus )
+    {
+    *aStatus = iCallStatus;
+    ReqCompleted( aTsyReqHandle, KErrNone );    
+    return KErrNone;
+    }
+
+// ---------------------------------------------------------------------------
+// CMmCallTsy::GetCaps
+// This CORE API method returns Core call capabilities.
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+TInt CMmCallTsy::GetCaps(
+    const TTsyReqHandle aTsyReqHandle,
+    RCall::TCaps* aCaps )
+    {
+    *aCaps = iCallCaps;
+    ReqCompleted( aTsyReqHandle, KErrNone );
+    return KErrNone;
+    }
+
+// ---------------------------------------------------------------------------
+// CMmCallTsy::DialCancel
+// This CORE API method cancels an outstanding dial request.Calls HangUp 
+// method to do this and set a flag so that we can know that DialCancel 
+// handling is going on.
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+TInt CMmCallTsy::DialCancel(
+    const TTsyReqHandle aTsyReqHandle )
+    {
+TFLOGSTRING3("TSY: CMmCallTsy::DialCancel. Req handle: %d, Call name: %S", aTsyReqHandle, &iCallName);
+
+    TInt ret( KErrGeneral );
+
+    //check if dial cancel has been called
+    if ( CMmCallTsy::EDialCancelNotCalled != iDialCancelFlag )
+        {       
+        ret = KErrServerBusy;
+        }
+    else
+        {
+        ret = KErrNone;
+        iDialCancelFlag = CMmCallTsy::EDialCancelCallCalled;
+
+        if ( iCallId > 0 || (GetDialFlag()&& iCallStatus!=RMobileCall::EStatusIdle) )
+            {
+            if ( RMobileCall::EStatusDisconnecting != iMobileCallStatus )
+                {
+TFLOGSTRING("TSY: CMmCallTsy::DialCancel Hangup called");                
+            HangUp( aTsyReqHandle );
+                }
+            else
+                {
+TFLOGSTRING("TSY: CMmCallTsy::DialCancel skipped Hangup call");
+                }      
+            }
+        }
+    return ret;
+    }
+
+// ---------------------------------------------------------------------------
+// CMmCallTsy::CompleteDial
+// Completes a Dial request.
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+void CMmCallTsy::CompleteDial(
+    TInt aResult )
+    {
+TFLOGSTRING2("TSY: CMmCallTsy::CompleteDial. Result:%d", aResult ); 
+TFLOGSTRING3("TSY: CMmCallTsy::CompleteDial. Call Id:%d Call name:%S", iCallId, &iCallName);
+
+	//Set dial flag to false
+	SetDialFlag( EFalse );
+
+	TTsyReqHandle reqHandle ( EMultimodeCallReqHandleUnknown );
+	
+	if ( KETelExt3rdPartyV1 == iExtensionId )
+		{
+		//3rd Party Client
+		//reset req handle. Returns the deleted req handle
+TFLOGSTRING("TSY: CMmCallTsy::CompleteDial. EMultimodeCallDialISV");		
+	    reqHandle =
+    	    iTsyReqHandleStore->ResetTsyReqHandle( EMultimodeCallDialISV );
+    	
+		}
+	else
+		{
+		//reset req handle. Returns the deleted req handle
+TFLOGSTRING("TSY: CMmCallTsy::CompleteDial. EMultimodeCallDial");		
+	    reqHandle =
+    	    iTsyReqHandleStore->ResetTsyReqHandle( EMultimodeCallDial );	
+		}
+   
+
+    if ( EMultimodeCallReqHandleUnknown != reqHandle )
+        {
+        if ( aResult != KErrNone )
+            {
+            // The creation has failed.
+            iLastExitCode = aResult;
+            ClearCallStatus();
+
+            //Dial has failed, update core status - dial possible again
+            iCallCaps.iFlags |= RCall::KCapsDial;
+            iCallCaps.iFlags &= ~( RCall::KCapsHangUp );
+
+            //complete caps change notification
+            CompleteNotifyCapsChange();
+            }
+
+        ReqCompleted( reqHandle, aResult );
+        }
+    }
+
+// ---------------------------------------------------------------------------
+// CMmCallTsy::AnswerIncomingCallCancel
+// TSY has started a request and it is not possible to then cancel this 
+// request. The best thing for the TSY to do in this case is to call
+// HangUp method to do this and set a flag so that we can know that
+// AnswerIncomingCallCancel handling is going on.
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+TInt CMmCallTsy::AnswerIncomingCallCancel(
+    const TTsyReqHandle aTsyReqHandle )
+    {
+TFLOGSTRING3("TSY: CMmCallTsy::AnswerIncomingCallCancel. Req handle: %d,  Call name: %S", aTsyReqHandle, &iCallName);
+
+    TInt ret( KErrNone );
+
+    if( iAnswerCancelFlag )
+        {
+        ret = KErrServerBusy;
+        }
+    else
+        {
+        iAnswerCancelFlag = ETrue;
+
+        if ( 0 < iCallId )
+            {
+            HangUp( aTsyReqHandle );
+            }
+        }
+
+    return ret;
+    }
+
+// ---------------------------------------------------------------------------
+// CMmCallTsy::CompleteAnswerIncomingCall
+// Completes answer request to client.
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+void CMmCallTsy::CompleteAnswerIncomingCall(
+    TInt aResult )
+    {
+TFLOGSTRING2("TSY: CMmCallTsy::CompleteAnswerIncomingCall. Result:%d", aResult ); 
+TFLOGSTRING3("TSY: CMmCallTsy::CompleteAnswerIncomingCall. Call Id:%d Call name:%S", iCallId, &iCallName);
+
+	TTsyReqHandle reqHandle ( EMultimodeCallReqHandleUnknown );
+	
+TFLOGSTRING2("TSY: CMmCallTsy::CompleteAnswerIncomingCall. iExtensionId:%d", iExtensionId );	
+	
+	if ( KETelExt3rdPartyV1 == iExtensionId )
+		{
+		//3rd Party Client
+		//reset req handle. Returns the deleted req handle
+	    reqHandle =
+    	    iTsyReqHandleStore->ResetTsyReqHandle( EMultimodeCallAnswerISV );	
+		}
+	else
+		{
+		//reset req handle. Returns the deleted req handle
+	    reqHandle =
+    	    iTsyReqHandleStore->ResetTsyReqHandle( EMultimodeCallAnswer );
+		}
+
+    if ( EMultimodeCallReqHandleUnknown != reqHandle )
+        {
+        if ( KErrNone != aResult )
+            {
+            TInt extendedError(
+                CMmCommonStaticUtility::ExtendedErrorCode( aResult ) );
+
+            if ( KErrGsmCCNormalUnspecified == extendedError )
+                {
+                //Call MT released while answer request was ongoing
+                //Set Symbian error value to disconnected.
+                aResult = CMmCommonStaticUtility::EpocErrorCode( 
+                    KErrGeneral, KErrDisconnected );
+                }
+            else
+                {
+                iCallCaps.iFlags |= RCall::KCapsAnswer | RCall::KCapsDial;
+                iCallCaps.iFlags &= ~( RCall::KCapsHangUp );
+
+                CompleteNotifyCapsChange();
+                }
+
+            iLastExitCode = aResult;
+
+            ClearCallStatus();
+            }
+        ReqCompleted( reqHandle, aResult );
+        }
+    }
+
+// ---------------------------------------------------------------------------
+// CMmCallTsy::HangUpCancel
+// CORE API method. TSY has started a request and it is not possible to then 
+// cancel this request. The best thing for the TSY to do in this case is to 
+// proceed as though the Cancel never happened. The server's call to the TSY 
+// cancel function will return synchronously. The TSY then continues to wait 
+// for the HangUp() acknowledgemnt and when it receives it, the TSY will 
+// complete the original HangUp request.
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+TInt CMmCallTsy::HangUpCancel(
+    const TTsyReqHandle )
+    {
+    return KErrNone;
+    }
+
+// ---------------------------------------------------------------------------
+// CMmCallTsy::CompleteHangUp
+// Completes call hangup (both normal and emergency calls). If the cause value 
+// is different than the sent one, the call release requset has failed. In 
+// this case the causeValue describes the fail cause. Otherwise the call 
+// releasing  has succeeded.
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+void CMmCallTsy::CompleteHangUp(
+    TInt aResult )
+    {
+TFLOGSTRING2("TSY: CMmCallTsy::CompleteHangUp.\n  \t\t\t Result:%d", aResult ); 
+TFLOGSTRING3("TSY: CMmCallTsy::CompleteHangUp. Call Id:%d Call name:%S", iCallId, &iCallName);
+
+    TInt ret( KErrNone );
+
+    // Complete for HangUp request
+    // (not to DialCancel or AnswerIncomingCallCancel)
+    if ( CMmCallTsy::EDialCancelNotCalled == iDialCancelFlag &&
+         !iAnswerCancelFlag )
+        {
+        //reset req handle. Returns the deleted req handle
+        TTsyReqHandle reqHandle =
+            iTsyReqHandleStore->ResetTsyReqHandle( EMultimodeCallHangUp );
+
+        if ( EMultimodeCallReqHandleUnknown != reqHandle )
+            {
+            //if hangup request failed
+            if ( KErrNone != aResult )
+                {
+                //Hangup failed, it should be still possible to carry out
+                iCallCaps.iFlags |= RCall::KCapsHangUp;
+
+                //Call status is not idle. HangUp request failed, complete 
+                //HangUp request with error.
+                if ( RCall::EStatusIdle != iCallStatus )
+                    {
+                    // ignore KErrGsmReleaseByUser, which means that the call ended
+                    // because the local user released the call, and must be treated
+                    // as a normal return code from the LTSY
+                    ret = ( (aResult == KErrGsmReleaseByUser) ? KErrNone : aResult );
+                    }
+                }
+            else
+                {
+                //Dial hangup has succeeded, update core status - 
+                //dial possible again
+                iCallCaps.iFlags |= RCall::KCapsDial;
+
+                if ( KErrGsmCallRejected != iLastExitCode )
+                    {
+                    iLastExitCode = KErrNone;
+                    }
+                //If client refuses to answer, remove the answering capability
+                iCallCaps.iFlags &= ~( RCall::KCapsAnswer );
+                }
+            ReqCompleted( reqHandle, ret );
+
+            //complete caps change notification
+            CompleteNotifyCapsChange();
+            }
+        }
+    // Complete for DialCancel or AnswerIncomingCallCancel, success
+    else if ( KErrNone == aResult ) 
+        { 
+        // Find out if this is cancelling of Dial
+        TTsyReqHandle cancelHandle = iTsyReqHandleStore->
+            ResetTsyReqHandle( EMultimodeCallDial ); 
+
+        if ( cancelHandle == NULL ) 
+            { 
+            // Find out if this is cancelling of AnswerIncomingCall
+            cancelHandle = iTsyReqHandleStore->
+                ResetTsyReqHandle( EMultimodeCallAnswer );
+
+			if( NULL == cancelHandle )
+				{
+				// Find out if this is cancelling of AnswerIncomingCallISV
+            	cancelHandle = iTsyReqHandleStore->
+            	    ResetTsyReqHandle( EMultimodeCallAnswerISV );
+            	    
+                if( NULL == cancelHandle )
+                	{
+                	// Find out if this is cancelling of DialISV
+            		cancelHandle = iTsyReqHandleStore->
+            		    ResetTsyReqHandle( EMultimodeCallDialISV );
+                                            
+                    if ( NULL == cancelHandle )
+                        {   
+                        // Find out if this is cancelling of DialNoFdnCheck
+            		    cancelHandle = iTsyReqHandleStore->
+            		        ResetTsyReqHandle( EMultimodeCallDialNoFdnCheck );
+                        }
+                	}
+				}
+            }
+
+        if ( 0 < cancelHandle ) 
+            { 
+            // Complete with error value KErrCancel
+            ReqCompleted( cancelHandle, KErrCancel );
+
+            // Cancel has succeeded, update core status -
+            // dial possible again
+            iCallCaps.iFlags |= RCall::KCapsDial;
+
+            // If client refuses to answer, remove the answering capability
+            iCallCaps.iFlags &= ~( RCall::KCapsAnswer );
+
+            // Complete caps change notification
+            CompleteNotifyCapsChange();
+            }
+        } 
+    // Cancel failed and the request succeeded (connected)
+    else if ( RCall::EStatusConnected == iCallStatus ) 
+        { 
+        // Find out if this is cancelling of Dial
+        TTsyReqHandle cancelHandle = iTsyReqHandleStore->
+            ResetTsyReqHandle( EMultimodeCallDial ); 
+
+         if ( cancelHandle == NULL ) 
+            { 
+            // Find out if this is cancelling of AnswerIncomingCall
+            cancelHandle = iTsyReqHandleStore->
+                ResetTsyReqHandle( EMultimodeCallAnswer );
+
+			if( NULL == cancelHandle )
+				{
+				// Find out if this is cancelling of AnswerIncomingCallISV
+            	cancelHandle = iTsyReqHandleStore->
+            	    ResetTsyReqHandle( EMultimodeCallAnswerISV );
+            	    
+                if( NULL == cancelHandle )
+                	{
+                	// Find out if this is cancelling of DialISV
+            		cancelHandle = iTsyReqHandleStore->
+            		    ResetTsyReqHandle( EMultimodeCallDialISV );
+                	                                            
+                    if ( NULL == cancelHandle )
+                        {   
+                        // Find out if this is cancelling of DialNoFdnCheck
+            		    cancelHandle = iTsyReqHandleStore->
+            		        ResetTsyReqHandle( EMultimodeCallDialNoFdnCheck );
+                	    }
+                	}
+				}
+            }
+
+        // Cancel to Dial or AnswerIncomingCall
+        if ( 0 < cancelHandle ) 
+            { 
+            // Complete with success (KErrNone)
+            ReqCompleted( cancelHandle, KErrNone ); 
+
+            // Succeeded, update core status - hangup possible again
+            iCallCaps.iFlags |= RCall::KCapsHangUp;
+
+            // Complete caps change notification
+            CompleteNotifyCapsChange();
+            } 
+        } 
+
+    // Reset cancel flags
+    iDialCancelFlag = CMmCallTsy::EDialCancelNotCalled;
+    iAnswerCancelFlag = EFalse;
+    // Reset HangUp flag
+    iHangUpFlag = EFalse;
+    }
+
+// ---------------------------------------------------------------------------
+// CMmCallTsy::GetOwnershipStatus
+// Get call ownership status.
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+TInt CMmCallTsy::GetOwnershipStatus(
+    const TTsyReqHandle,
+    RCall::TOwnershipStatus* )
+    {
+    return KErrNotSupported;
+    }
+
+// ---------------------------------------------------------------------------
+// CMmCallTsy::TransferOwnership
+// Transfers the call ownership.
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+TInt CMmCallTsy::TransferOwnership(
+    const TTsyReqHandle )
+    {
+    return KErrNotSupported;
+    }
+
+// ---------------------------------------------------------------------------
+// CMmCallTsy::AcquireOwnership
+// Acquire the call ownership.
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+TInt CMmCallTsy::AcquireOwnership(
+    const TTsyReqHandle )
+    {
+    return KErrNotSupported;
+    }
+
+// ---------------------------------------------------------------------------
+// CMmCallTsy::AcquireOwnershipCancel
+// Cancel the call ownership acquire.
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+TInt CMmCallTsy::AcquireOwnershipCancel(
+    const TTsyReqHandle )
+    {
+    return KErrNotSupported;
+    }
+
+// ---------------------------------------------------------------------------
+// CMmCallTsy::RelinquishOwnership
+// Relinquish the call ownership.
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+TInt CMmCallTsy::RelinquishOwnership()
+    {
+    return KErrNotSupported;
+    }
+
+// ---------------------------------------------------------------------------
+// CMmCallTsy::GetCallParams
+// This CORE API method is used for getting Core call parameters.
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+TInt CMmCallTsy::GetCallParams(
+    const TTsyReqHandle aTsyReqHandle, 
+    TDes8* aParams )
+    {
+    
+    if(sizeof(RMobileCall::TMobileCallParamsV1) > aParams->MaxLength())
+	  	{
+	  	TFLOGSTRING ("TSY: CMmCallTsy::GetCallParams bad size argument");
+	  	// Complete the request with appropiate error        
+	  	return KErrArgument;
+	  	}
+    
+    RMobileCall::TMobileCallParamsV1Pckg* paramsPckgV1 = 
+        reinterpret_cast<RMobileCall::TMobileCallParamsV1Pckg*>( aParams );
+    RMobileCall::TMobileCallParamsV1& paramsV1 = ( *paramsPckgV1 )(); 
+
+    paramsV1.iSpeakerControl = iCallParams.iSpeakerControl; 
+    paramsV1.iSpeakerVolume = iCallParams.iSpeakerVolume; 
+    paramsV1.iInterval = iCallParams.iInterval; 
+    paramsV1.iWaitForDialTone = iCallParams.iWaitForDialTone; 
+
+    //let extension to update mode specific params as well
+    iMmCallExtInterface->GetCallParams( aParams ); 
+        
+    ReqCompleted( aTsyReqHandle, KErrNone );
+    return KErrNone;
+    }
+
+// ---------------------------------------------------------------------------
+// CMmCallTsy::GetCallDuration
+// This CORE API method is used for getting call duration. Calls 
+// GetCallDurationInSeconds() method to return the current call duration.
+// See details from there.
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+TInt CMmCallTsy::GetCallDuration(
+    const TTsyReqHandle aTsyReqHandle,
+    TTimeIntervalSeconds* aTime )
+    {
+    //get duration
+    *aTime = GetCallDurationInSeconds();
+    ReqCompleted( aTsyReqHandle, KErrNone );
+    return KErrNone;
+    }
+
+// ---------------------------------------------------------------------------
+// CMmCallTsy::CallId
+// Returns call ID.of this call
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+TInt CMmCallTsy::CallId() const
+    {
+    return iCallId;
+    }
+
+// ---------------------------------------------------------------------------
+// CMmCallTsy::SetCallId
+// Sets call ID.
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+TInt CMmCallTsy::SetCallId(
+    TInt aCallId )
+    {
+    TInt ret( KErrGeneral );
+
+    if ( aCallId <= KMaxCallIdValue )
+        {
+        iCallId = aCallId;
+        ret = KErrNone;
+        }
+    return ret;
+    }
+
+// ---------------------------------------------------------------------------
+// CMmCallTsy::SetCallStatus
+// Sets call Status.
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+void CMmCallTsy::SetCallStatus(
+    RCall::TStatus aCallStatus,
+    RMobileCall::TMobileCallStatus aMobileCallStatus )
+    {
+    iCallStatus = aCallStatus;
+    iMobileCallStatus = aMobileCallStatus;
+    }
+
+// ---------------------------------------------------------------------------
+// CMmCallTsy::SetPreviousCallId
+// Sets previous active call ID. The Call ID is set when the call goes to idle 
+// state. Before the previous call ID is set, all other calls are checked and 
+// if they have the same previous call ID, their call id will be cleared. This 
+// is required by Conference call implementation.
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+void CMmCallTsy::SetPreviousCallId(
+    TInt aCurrentId )
+    {
+    if ( aCurrentId > 0 )
+        {
+        CMmCallTsy* mmCall = NULL;
+
+        for ( TInt i = 0; i < iMmPhone->CallList()->
+                  GetNumberOfObjects(); i++ )
+            {
+            mmCall = iMmPhone->CallList()->GetMmCallByIndex( i );
+
+            if ( mmCall->PreviousCallId() == aCurrentId )
+                {
+                mmCall->SetPreviousCallId( -1 );
+                }
+            }
+        }
+    iPreviousCallId = aCurrentId;
+    }
+
+// ---------------------------------------------------------------------------
+// CMmCallTsy::PreviousCallId
+// Returns previous active call ID. The Call ID is reset when the call goes to 
+// idle state. This is required by Conference call implementation.
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+TInt CMmCallTsy::PreviousCallId() const
+    {
+    return iPreviousCallId;
+    }
+
+// ---------------------------------------------------------------------------
+// CMmCallTsy::ResetPreviousCallId
+// Resets previous active call ID. The Call ID is reset when the call goes to 
+// idle state. This is required by Conference call implementation.
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+void CMmCallTsy::ResetPreviousCallId()
+    {
+    iPreviousCallId = -1;
+    }
+
+// ---------------------------------------------------------------------------
+// CMmCallTsy::CallMode
+// Returns call mode.
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+RMobilePhone::TMobileService CMmCallTsy::CallMode() const
+    {
+    return iCallMode;
+    }
+
+// ---------------------------------------------------------------------------
+// CMmCallTsy::CallDirection
+// Returns call direction.
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+RMobileCall::TMobileCallDirection CMmCallTsy::CallDirection() const
+    { 
+    return iCallDirection; 
+    } 
+
+// ---------------------------------------------------------------------------
+// CMmCallTsy::SetCallDirection
+// Sets call direction.
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+TInt CMmCallTsy::SetCallDirection(
+    RMobileCall::TMobileCallDirection aCallDirection )
+    {
+    iCallDirection = aCallDirection;
+    return KErrNone;
+    }
+
+// ---------------------------------------------------------------------------
+// CMmCallTsy::CallName
+// Returns call name.
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+const TDesC& CMmCallTsy::CallName() const
+    {
+    return iCallName;
+    }
+
+// ---------------------------------------------------------------------------
+// CMmCallTsy::SetCallName
+// Sets call name.
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+void CMmCallTsy::SetCallName(
+    const TName& aCallName )
+    {
+    iCallName = aCallName;
+    }
+
+// ---------------------------------------------------------------------------
+// CMmCallTsy::SetCallCaps
+// Sets call capabilities.
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+void CMmCallTsy::SetCallCaps(
+    TUint32 aCallCaps )
+    {
+    iCallCaps.iFlags = aCallCaps;
+    CompleteNotifyCapsChange();
+    }
+
+// ---------------------------------------------------------------------------
+// CMmCallTsy::CallCaps
+// Returns call capabilities.
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+TUint32 CMmCallTsy::CallCaps() const
+    {
+    //get call caps
+    TUint32 aCallCaps = iCallCaps.iFlags;
+    //return them
+    return aCallCaps;
+    }
+
+// ---------------------------------------------------------------------------
+// CMmCallTsy::GetMobileCallCaps
+// This function returns the call control and call event dynamic capabilities.
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+TInt CMmCallTsy::GetMobileCallCaps(
+    const TTsyReqHandle aTsyReqHandle,
+    TDes8* aCaps )
+    {
+    TInt ret( KErrArgument );
+    
+    if ( sizeof ( RMobileCall::TMobileCallCapsV1 ) <= aCaps->MaxLength() )
+        {
+        RMobileCall::TMobileCallCapsV1Pckg* callCapsV1Pckg = 
+            reinterpret_cast<RMobileCall::TMobileCallCapsV1Pckg*>( aCaps );
+        RMobileCall::TMobileCallCapsV1& callCapsV1 = 
+            ( *callCapsV1Pckg )();
+
+        if ( KETelExtMultimodeV1 == callCapsV1.ExtensionId() )
+            {   
+            ret = KErrNone;
+            iMmCallExtInterface->GetMobileCallCapsV1( callCapsV1 );
+            }
+        }
+        
+    ReqCompleted( aTsyReqHandle, ret );
+    return KErrNone;
+    }
+
+
+// ---------------------------------------------------------------------------
+// CMmCallTsy::NotifyMobileCallCapsChange
+// Notifies the change of Mobile Call Capabilities.
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+TInt CMmCallTsy::NotifyMobileCallCapsChange(
+    TDes8* aCaps )
+    {
+    TInt ret( KErrArgument ); 
+    
+    if ( sizeof ( RMobileCall::TMobileCallCapsV1 ) <= aCaps->MaxLength() )
+        {
+        RMobileCall::TMobileCallCapsV1Pckg* callCapsV1Pckg = 
+            reinterpret_cast<RMobileCall::TMobileCallCapsV1Pckg*>( aCaps );
+        RMobileCall::TMobileCallCapsV1& callCapsV1 = 
+            ( *callCapsV1Pckg )();  
+     
+        if ( KETelExtMultimodeV1 == callCapsV1.ExtensionId() )
+            {    
+            ret = KErrNone;
+            iRetNotifyMobileCallCaps = aCaps;
+            iReqHandleType = EMultimodeCallNotifyMobileCallCapsChange;
+            }
+        }
+    return ret;
+
+    }
+
+// ---------------------------------------------------------------------------
+// CMmCallTsy::NotifyMobileCallCapsChangeCancel
+// Cancels an outstanding asynchronous NotifyMobileCallCapsChange request.
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+TInt CMmCallTsy::NotifyMobileCallCapsChangeCancel(
+    const TTsyReqHandle aTsyReqHandle )
+    {
+    //reset pointer
+    iRetNotifyMobileCallCaps = NULL; 
+    iTsyReqHandleStore->ResetTsyReqHandle( 
+        EMultimodeCallNotifyMobileCallCapsChange );
+    ReqCompleted( aTsyReqHandle, KErrCancel );
+    return KErrNone;
+    }
+
+// ---------------------------------------------------------------------------
+// CMmCallTsy::CompleteNotifyMobileCallCapsChange
+// Completes a NotifyMobileCallCapsChange method. The caps request is directed 
+// to the currently active protocol extension.
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+void CMmCallTsy::CompleteNotifyMobileCallCapsChange(
+    TInt aErrorCode )
+    {
+      //get req handle. 
+    TTsyReqHandle reqHandle = iTsyReqHandleStore->GetTsyReqHandle( 
+                                EMultimodeCallNotifyMobileCallCapsChange );
+
+    if ( EMultimodeCallReqHandleUnknown != reqHandle )
+        {
+        RMobileCall::TMobileCallCapsV1Pckg* callCapsV1Pckg = 
+            reinterpret_cast<RMobileCall::TMobileCallCapsV1Pckg*>( 
+                iRetNotifyMobileCallCaps );
+        RMobileCall::TMobileCallCapsV1& callCapsV1 = 
+            ( *callCapsV1Pckg )();
+                        
+        iMmCallExtInterface->GetMobileCallCapsV1( callCapsV1 );
+        
+        if (callCapsV1.iCallControlCaps != iPreviousCallControlCaps )
+            {           
+            //reset req handle. 
+            iTsyReqHandleStore->ResetTsyReqHandle( 
+                EMultimodeCallNotifyMobileCallCapsChange );
+                
+            iPreviousCallControlCaps = callCapsV1.iCallControlCaps;
+            iRetNotifyMobileCallCaps = NULL;
+            ReqCompleted( reqHandle, aErrorCode );  
+            }
+        }
+    }
+
+// ---------------------------------------------------------------------------
+// CMmCallTsy::CompleteNotifyMobileCallCapsChange
+// Returns a pointer to the active extension.
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+CMmCallExtInterface* CMmCallTsy::ActiveCallExtension()
+    {
+    return iMmCallExtInterface;
+    }
+
+// ---------------------------------------------------------------------------
+// CMmCallTsy::ClearCallStatus
+// Clears internal call status.
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+void CMmCallTsy::ClearCallStatus()
+    {
+    iCallDirection = RMobileCall::EDirectionUnknown;
+    iEtelOriginated = ETrue;
+    }
+
+// ---------------------------------------------------------------------------
+// CMmCallTsy::Status
+// Returns the current core call status. Can be called from TSY classes.
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+RCall::TStatus CMmCallTsy::Status() const
+    {
+    return iCallStatus;
+    }
+
+// ---------------------------------------------------------------------------
+// CMmCallTsy::MobileCallStatus
+// Returns the current mobile call status. Can be called from TSY classes.
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+RMobileCall::TMobileCallStatus CMmCallTsy::MobileCallStatus() const
+    {
+    return iMobileCallStatus;
+    }
+
+// ---------------------------------------------------------------------------
+// CMmCallTsy::GetMobileCallStatus
+// Returns the current status of the call through the aStatus argument.
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+TInt CMmCallTsy::GetMobileCallStatus(
+    const TTsyReqHandle aTsyReqHandle,
+    RMobileCall::TMobileCallStatus* aStatus )
+    {
+    *aStatus = iMobileCallStatus;
+    ReqCompleted( aTsyReqHandle, KErrNone );
+    return KErrNone;
+    }
+
+// ---------------------------------------------------------------------------
+// CMmCallTsy::NotifyMobileCallStatusChange
+// Allows a client to be notified when the call changes state. The request 
+// completes when the call changes state, the new state being passed in the 
+// aStatus parameter.
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+TInt CMmCallTsy::NotifyMobileCallStatusChange(
+    RMobileCall::TMobileCallStatus* aStatus )
+    {
+    iRetMobileCallStatus = aStatus;
+    iReqHandleType = EMultimodeCallNotifyMobileCallStatusChange;
+    return KErrNone;
+    }
+
+// ---------------------------------------------------------------------------
+// CMmCallTsy::NotifyMobileCallStatusChangeCancel
+// Cancels an outstanding asynchronous NotifyMobileCallStatusChange request.
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+TInt CMmCallTsy::NotifyMobileCallStatusChangeCancel(
+    const TTsyReqHandle aTsyReqHandle )
+    {
+    iRetMobileCallStatus = NULL;
+    iTsyReqHandleStore->ResetTsyReqHandle( 
+        EMultimodeCallNotifyMobileCallStatusChange );
+
+    ReqCompleted( aTsyReqHandle, KErrCancel );
+    return KErrNone;
+    }
+
+// ---------------------------------------------------------------------------
+// CMmCallTsy::NotifyCallEvent
+// Allows clients to be notified when various call events occur. These events 
+// may be generated locally (i.e. from within the ME) or remotely (by the 
+// remote connected party). The request completes when an event occurs. Upon 
+// completion, the aEvent parameter will return the event type.
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+TInt CMmCallTsy::NotifyCallEvent(
+    RMobileCall::TMobileCallEvent* aEvent )
+    {
+    iRetCallEvent = aEvent;
+    iReqHandleType = EMultimodeCallNotifyCallEvent;
+    return KErrNone;
+    }
+
+// ---------------------------------------------------------------------------
+// CMmCallTsy::NotifyCallEventCancel
+// This method cancels an outstanding asynchronous NotifyCallEvent request.
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+TInt CMmCallTsy::NotifyCallEventCancel(
+    const TTsyReqHandle aTsyReqHandle )
+    {
+    iRetCallEvent = NULL;
+    iTsyReqHandleStore->ResetTsyReqHandle( EMultimodeCallNotifyCallEvent );
+    ReqCompleted( aTsyReqHandle, KErrCancel );
+    return KErrNone;
+    }
+
+// ---------------------------------------------------------------------------
+// CMmCallTsy::CompleteNotifyCallEvent
+// Allows clients to be notified when various call events occur.
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+void CMmCallTsy::CompleteNotifyCallEvent(
+    RMobileCall::TMobileCallEvent aEvent )
+    {    
+    //reset req handle. Returns the deleted req handle
+    TTsyReqHandle reqHandle = iTsyReqHandleStore->ResetTsyReqHandle(
+        EMultimodeCallNotifyCallEvent );
+
+    if ( EMultimodeCallReqHandleUnknown != reqHandle &&
+        iRetCallEvent != NULL )
+        {
+		if( IsPartOfConference() && RMobileCall::ERemoteTerminated == aEvent )
+			{
+TFLOGSTRING("TSY: iIsRemoteReleasedCall = ETrue");
+			iIsRemoteReleasedCall = ETrue;
+			}
+        *iRetCallEvent = aEvent;
+        ReqCompleted( reqHandle, KErrNone );
+        }
+    }
+
+// ---------------------------------------------------------------------------
+// CMmCallTsy::CompleteNotifyRemoteCallEvent
+// Informs common TSY about a remote event (that cannot be understood from
+// status indication.
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+void CMmCallTsy::CompleteNotifyRemoteCallEvent(
+    const CMmDataPackage* aDataPackage )
+    {    
+    RMobileCall::TMobileCallEvent callEvent( RMobileCall::ERemoteHold );
+    aDataPackage->UnPackData( callEvent );
+
+    switch ( callEvent )
+        {
+        case RMobileCall::ERemoteHold:
+        case RMobileCall::ERemoteResume:
+        case RMobileCall::ERemoteTerminated:
+        case RMobileCall::ERemoteConferenceCreate:
+            CompleteNotifyCallEvent( callEvent );
+            break;
+        //local events handled by CMmCallTsy::CompleteNotifyStatusChange 
+        case RMobileCall::ELocalHold:
+        case RMobileCall::ELocalResume:
+        case RMobileCall::ELocalDeflectCall:
+        case RMobileCall::ELocalTransfer:
+        //not supported cases
+        case RMobileCall::ERemoteTransferring:
+        case RMobileCall::ERemoteTransferAlerting:
+		case RMobileCall::ERemoteBarred:
+		case RMobileCall::ERemoteForwarding:
+		case RMobileCall::ERemoteWaiting:
+		case RMobileCall::ELocalBarred:
+        default:
+            break;
+        }
+    }
+
+// ---------------------------------------------------------------------------
+// CMmCallTsy::GetMobileCallInfo
+// The method returns a current snapshot of the call information
+// described in the TMobileCallInfoVx class. The class is packaged into
+// a TMobileCallInfoVxPckg before being passed to the GetMobileCallInfo method.
+// This method actually calls FillMobileCallInfo method to get mobile call 
+// information.
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+TInt CMmCallTsy::GetMobileCallInfo(
+    const TTsyReqHandle aTsyReqHandle,
+    TDes8* aInfo )
+    {
+    //get the mobile call information
+    TInt ret = FillMobileCallInfo( aInfo );
+
+    ReqCompleted( aTsyReqHandle, ret );
+    return KErrNone;
+    }
+
+// ---------------------------------------------------------------------------
+// CMmCallTsy::FillMobileCallInfo
+// The method fills a current snapshot of the call information described in 
+// the TMobileCallInfoVx class to the aInfo. The mode specific fields will
+// be filled by the extension.
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+TInt CMmCallTsy::FillMobileCallInfo(
+    TDes8* aInfo )
+    {
+TFLOGSTRING("TSY: CMmCallTsy::FillMobileCallInfo");
+
+    TInt ret = KErrArgument;
+    TInt extensionId = 0;
+
+	if ( sizeof ( RMobilePhone::TMultimodeType ) <= aInfo->MaxLength() )
+    	{
+        RMobilePhone::TMultimodeTypePckg* infoParamsPckg =
+            reinterpret_cast<RMobilePhone::TMultimodeTypePckg*>(
+            aInfo );
+        RMobilePhone::TMultimodeType& callInfo = ( *infoParamsPckg )();
+            
+        // get extensionid from the recieved data
+        extensionId = callInfo.ExtensionId();
+TFLOGSTRING2("TSY: CMmCallTsy::FillMobileCallInfo - extensionid=%d",callInfo.ExtensionId());      
+        }
+ 
+    //TMobileCallInfoV1
+    if ( KETelExtMultimodeV1 == extensionId ||
+    	 KETelExtMultimodeV3 == extensionId ||
+    	 KEtelExtMultimodeV7 == extensionId ||
+    	 KEtelExtMultimodeV8 == extensionId )
+        {
+TFLOGSTRING("TSY: CMmCallTsy::FillMobileCallInfo - V1");    
+
+        // Set ret to KErrNone. We can fill this parameter class.
+        ret = KErrNone;            
+            
+        RMobileCall::TMobileCallInfoV1Pckg* paramsPckgV1 =
+            reinterpret_cast<RMobileCall::TMobileCallInfoV1Pckg*>( aInfo );
+        RMobileCall::TMobileCallInfoV1& info = ( *paramsPckgV1 )();
+          
+        // set mobilecallinfo default values
+        FillMobileCallInfoDefaults( &info );
+                    
+        // fill specific data
+        iMmCallExtInterface->FillMobileCallInfo( &info );
+        }
+            
+    // TMobileCallInfoV3
+    if ( KETelExtMultimodeV3 == extensionId ||
+		 KEtelExtMultimodeV7 == extensionId ||
+    	 KEtelExtMultimodeV8 == extensionId )
+        {
+TFLOGSTRING("TSY: CMmCallTsy::FillMobileCallInfo - V3");                
+            
+        RMobileCall::TMobileCallInfoV3Pckg* paramsPckgV3 =
+            reinterpret_cast<RMobileCall::TMobileCallInfoV3Pckg*>( aInfo );
+        RMobileCall::TMobileCallInfoV3& info = ( *paramsPckgV3 )();        
+            
+        // fill specific data
+        iMmCallExtInterface->FillMobileCallInfoV3( &info ) ;
+        }
+
+    // TMobileCallInfoV7
+    if ( KEtelExtMultimodeV7 == extensionId ||
+    	 KEtelExtMultimodeV8 == extensionId )
+        {
+TFLOGSTRING("TSY: CMmCallTsy::FillMobileCallInfo - V7");
+            
+        RMobileCall::TMobileCallInfoV7Pckg* paramsPckgV7 =
+            reinterpret_cast<RMobileCall::TMobileCallInfoV7Pckg*>( aInfo );
+        RMobileCall::TMobileCallInfoV7& info = ( *paramsPckgV7 )();
+            
+        // fill specific data
+        iMmCallExtInterface->FillMobileCallInfoV7( &info );
+        }
+    
+    // TMobileCallInfoV8
+    if ( KEtelExtMultimodeV8 == extensionId )
+        {
+TFLOGSTRING("TSY: CMmCallTsy::FillMobileCallInfo - V8");
+                
+        RMobileCall::TMobileCallInfoV8Pckg* paramsPckgV8 =
+            reinterpret_cast<RMobileCall::TMobileCallInfoV8Pckg*>( aInfo );
+        RMobileCall::TMobileCallInfoV8& info = ( *paramsPckgV8 )();
+                
+        // fill specific data
+        iMmCallExtInterface->FillMobileCallInfoV8( &info );
+        }
+
+TFLOGSTRING2("TSY: CMmCallTsy::FillMobileCallInfo end. ret=%d",ret);
+      
+    return ret;
+    }
+
+// ---------------------------------------------------------------------------
+// CMmCallTsy::NotifyRemotePartyInfoChange
+// This method allows the client to be notified of any change in the remote 
+// party information. 
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+TInt CMmCallTsy::NotifyRemotePartyInfoChange(
+    TDes8* aRemotePartyInfo )
+    {
+    TInt ret = KErrNone;
+    
+    if( sizeof( RMobileCall::TMobileCallRemotePartyInfoV1 ) > aRemotePartyInfo->MaxLength() )
+    	{
+TFLOGSTRING ("TSY: CMmCallTsy::NotifyRemotePartyInfoChange Bad size argument");
+        
+        // Complete the request with appropiate error        
+        ret = KErrArgument;
+    	}
+    else
+        {
+        iRetRemotePartyInfo = aRemotePartyInfo;
+        iReqHandleType = EMultimodeCallNotifyRemotePartyInfoChange;
+        }
+        
+    return ret;
+    }
+
+// ---------------------------------------------------------------------------
+// CMmCallTsy::NotifyRemotePartyInfoChangeCancel
+// This method cancels an outstanding asynchronous NotifyRemotePartyInfoChange 
+// request.
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+TInt CMmCallTsy::NotifyRemotePartyInfoChangeCancel(
+    const TTsyReqHandle aTsyReqHandle )
+    {
+    iRetRemotePartyInfo = NULL;
+    iTsyReqHandleStore->ResetTsyReqHandle( 
+        EMultimodeCallNotifyRemotePartyInfoChange );
+
+    ReqCompleted( aTsyReqHandle, KErrCancel );
+    return KErrNone;
+    }
+
+// ---------------------------------------------------------------------------
+// CMmCallTsy::CompleteNotifyRemotePartyInfoChange
+// Completes a NotifyRemotePartyInfoChange method.
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+void CMmCallTsy::CompleteNotifyRemotePartyInfoChange()
+    {     
+    //reset req handle. Returns the deleted req handle
+    TTsyReqHandle reqHandle = iTsyReqHandleStore->ResetTsyReqHandle( 
+                                EMultimodeCallNotifyRemotePartyInfoChange );
+
+    if ( EMultimodeCallReqHandleUnknown != reqHandle )
+        {
+        iMmCallExtInterface->GetRemotePartyInfo( 
+            reinterpret_cast<RMobileCall::TMobileCallRemotePartyInfoV1Pckg*> 
+            ( iRetRemotePartyInfo ) );
+        ReqCompleted( reqHandle, KErrNone );
+        }
+    }
+
+// ---------------------------------------------------------------------------
+// CMmCallTsy::CompleteNotifyMobileCallInfoChange
+// Notifies common TSY about mobile call information change.
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+void CMmCallTsy::CompleteNotifyMobileCallInfoChange(
+    CMmDataPackage* aDataPackage )
+    {
+    //set data to gsm extension
+    //( direction added because not uppdated in messagehandler)
+    iMmCallExtInterface->SetMobileCallData(
+        aDataPackage, iCallDirection );
+    //call completenotify remotepartyinfochange
+    CompleteNotifyRemotePartyInfoChange();
+    }
+
+// ---------------------------------------------------------------------------
+// CMmCallTsy::TransferL
+// This method allows a client to transfer a call so that the remote party of 
+// one call ends up connected to the remote party of another call while this 
+// user drops out of both calls. 
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+TInt CMmCallTsy::TransferL(
+    const TTsyReqHandle aTsyReqHandle )
+    {
+    TInt ret( KErrServerBusy );
+
+    TTsyReqHandle transferHandle = 
+        iTsyReqHandleStore->GetTsyReqHandle( EMultimodeCallTransfer );
+
+    if ( !transferHandle )
+        {
+        ret = iMmCallExtInterface->TransferL();
+
+        if ( KErrNone != ret )
+            {
+            ReqCompleted( aTsyReqHandle, ret );
+            }
+        else
+            {
+            //save tsy req handle type
+            iReqHandleType = EMultimodeCallTransfer;
+            }
+        }
+    else
+        {
+        ReqCompleted( aTsyReqHandle, ret );
+        }      
+    return KErrNone;
+    }
+
+// ---------------------------------------------------------------------------
+// CMmCallTsy::CompleteTransfer
+// This method completes an outstanding asynchronous Transfer request.
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+void CMmCallTsy::CompleteTransfer(
+    TInt aErrorCode )
+    {
+    //reset req handle. Returns the deleted req handle
+    TTsyReqHandle reqHandle =
+        iTsyReqHandleStore->ResetTsyReqHandle( EMultimodeCallTransfer );
+
+    if ( EMultimodeCallReqHandleUnknown != reqHandle )
+        {
+        ReqCompleted( reqHandle, aErrorCode );
+        }    
+    }
+
+// ---------------------------------------------------------------------------
+// CMmCallTsy::NotifyPrivacyConfirmation
+// This method allows the client to be notified when the network has confirmed 
+// the privacy setting.
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+TInt CMmCallTsy::NotifyPrivacyConfirmation(
+    RMobilePhone::TMobilePhonePrivacy* aPrivacyStatus )
+    {
+    iRetPrivacyStatus = aPrivacyStatus;
+    iReqHandleType = EMultimodeCallNotifyPrivacyConfirmation;    
+    return KErrNone;
+    }
+
+// ---------------------------------------------------------------------------
+// CMmCallTsy::NotifyPrivacyConfirmationCancel
+// Cancels an outstanding asynchronous NotifyPrivacyConfirmation request.
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+TInt CMmCallTsy::NotifyPrivacyConfirmationCancel(
+    const TTsyReqHandle aTsyReqHandle )
+    {
+    iRetPrivacyStatus = NULL;
+    iTsyReqHandleStore->ResetTsyReqHandle( 
+        EMultimodeCallNotifyPrivacyConfirmation );
+
+    ReqCompleted( aTsyReqHandle, KErrCancel );
+    return KErrNone;
+    }
+
+// ---------------------------------------------------------------------------
+// CMmCallTsy::CompleteNotifyPrivacyConfirmation
+// Completes a NotifyPrivacyConfirmation request. 
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+void CMmCallTsy::CompleteNotifyPrivacyConfirmation(
+    RMobilePhone::TMobilePhonePrivacy aStatus )
+    {
+    //reset req handle. Returns the deleted req handle
+    TTsyReqHandle reqHandle = iTsyReqHandleStore->ResetTsyReqHandle(
+        EMultimodeCallNotifyPrivacyConfirmation );
+
+    if ( EMultimodeCallReqHandleUnknown != reqHandle ) 
+        {
+        *iRetPrivacyStatus = aStatus;
+        ReqCompleted( reqHandle, KErrNone );
+        }
+    }
+
+// ---------------------------------------------------------------------------
+// CMmCallTsy::Line
+// Return the line from which this call object has been opened from.
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+CMmLineTsy* CMmCallTsy::Line()
+    {
+    //Return the line from which this call object has been opened from.
+    return iMmLine;
+    }
+
+// ---------------------------------------------------------------------------
+// CMmCallTsy::Phone
+// This method returns pointer to the Phone object.
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+CMmPhoneTsy* CMmCallTsy::Phone()
+    {
+    //This method returns pointer to the Phone object.
+    return iMmPhone;
+    }
+
+// ---------------------------------------------------------------------------
+// CMmCallTsy::GetCallDurationInSeconds
+// Returns call duration in seconds. If call is not active, the duration of 
+// the last successful call will be returned.
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+TTimeIntervalSeconds CMmCallTsy::GetCallDurationInSeconds()
+    {
+    // If the call is active, NumberOfBeats will return the current duration
+    // If the call is not active, NumberOfBeats will return the last 
+    // call duration
+    TTimeIntervalSeconds duration ( iCallTimer->NumberOfBeats() );
+    return duration;
+    }
+
+// ---------------------------------------------------------------------------
+// CMmCallTsy::IsServiceLocallyRequested
+// Return ETrue if this type of request is requested by any of TSY's client. 
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+TBool CMmCallTsy::IsServiceLocallyRequested(
+    CMmCallTsy::TCallRequestTypes aReqType )
+    {
+    //Return ETrue if this type of request is requested by any TSY's client.
+    //create parameter callCount and get number of objects from call list to 
+    //it
+    TInt callCount = iMmPhone->CallList()->GetNumberOfObjects();
+    CMmCallTsy* mmCall = NULL;
+    TBool ret( EFalse);
+
+    for ( TInt i = 0; i < callCount; i++ )
+        {
+        mmCall = reinterpret_cast<CMmCallTsy*>(
+            iMmPhone->CallList()->GetObjectByIndex(i));
+
+        if( mmCall->ServiceRequested( aReqType ) )
+            {
+            ret = ETrue;
+            break;
+            }
+        }
+    return ret;
+    }
+
+// ---------------------------------------------------------------------------
+// CMmCallTsy::GetGhostCall
+// Return ETrue if this call is a Ghost Call
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+TBool CMmCallTsy::GetGhostCall() const
+    {    
+    return iGhostCall;
+    }
+
+// ---------------------------------------------------------------------------
+// CMmCallTsy::GetDiagnostics
+// Returns value of iDiagnosticOctect internal attribute
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+TUint8 CMmCallTsy::GetDiagnostics() const
+    {
+    return iDiagnosticOctet;
+    }
+
+// ---------------------------------------------------------------------------
+// CMmCallTsy::SetDiagnostics
+// Sets aDiagnosticOctet into internal variable iDiagnosticOctet
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+void CMmCallTsy::SetDiagnostics( 
+    TUint8 aDiagnosticOctet )
+    {
+    iDiagnosticOctet = aDiagnosticOctet;
+    }
+
+// ---------------------------------------------------------------------------
+// CMmCallTsy::GetCallReqHandleStore
+// Returns pointer to iTsyReqHandleStore
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//    
+CMmTsyReqHandleStore* CMmCallTsy::GetCallReqHandleStore()
+    {
+    return iTsyReqHandleStore;
+    }
+
+// ---------------------------------------------------------------------------
+// CMmCallTsy::SetUnownedCallObjectFlag
+// TSY creates automatically call object for incoming call or ghost call that 
+// is created using AT-commands. This method sets flag indicating if a client 
+// has't opened existing call object for this call.
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//    
+void CMmCallTsy::SetUnownedCallObjectFlag(
+    TBool aIsUnownedCallObject )
+    {   
+    iUnownedCallObject = aIsUnownedCallObject;
+    }
+
+// ---------------------------------------------------------------------------
+// CMmCallTsy::IsUnownedCallObject
+// TSY creates automatically call object for incoming call or ghost call that 
+// is created using AT-commands. This flag indicates that client haven't 
+// opened existing call object for this call.
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+TBool CMmCallTsy::IsUnownedCallObject() const
+    {  
+    return iUnownedCallObject;
+    }
+
+// ---------------------------------------------------------------------------
+// CMmCallTsy::SetGhostCall
+// Sets a flag that indicates that this call is not created through ETel
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+void CMmCallTsy::SetGhostCall(
+    TBool aValue )
+    {
+    //Sets a flag that indicates that this call is not created through ETel
+    iGhostCall = aValue;
+
+    if ( aValue )
+        {
+        iEtelOriginated = EFalse;
+        }
+    }
+
+// ---------------------------------------------------------------------------
+// CMmCallTsy::ETelOriginated
+// Returns ETrue is this call has been originated through ETel API
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+TBool CMmCallTsy::ETelOriginated() const
+    {    
+    return iEtelOriginated;
+    }
+
+// ---------------------------------------------------------------------------
+// CMmCallTsy::ServiceRequested
+// Returns ETrue if this service is pending on this call object
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+TBool CMmCallTsy::ServiceRequested(
+    CMmCallTsy::TCallRequestTypes aReqType )
+    {
+    TBool ret( EFalse );
+
+    if( CMmCallTsy::EMultimodeCallReqHandleUnknown != 
+        iTsyReqHandleStore->GetTsyReqHandle( aReqType ) )
+        {
+        //Returns ETrue if this service is pending on this call object
+        ret = ETrue;
+        }
+    return ret;
+    }
+
+#ifdef REQHANDLE_TIMER
+// ---------------------------------------------------------------------------
+// CMmCallTsy::Complete
+// Completes the request due timer expiration
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+void CMmCallTsy::Complete(
+    TInt aReqHandleType,
+    TInt aError )
+    {
+    //All possible TSY req handle types are listed in the
+    //switch case below. 
+    switch( aReqHandleType )
+        {
+        //cases handled with automatic completion
+        case EMultimodeCallDial:
+        case EMultimodeCallDialISV:
+            CompleteDial( aError );
+            break;
+        case EMultimodeCallDialNoFdnCheck:
+            CompleteDialNoFdn( aError );
+            break;
+        case EMultimodeCallAnswer:
+        case EMultimodeCallAnswerISV:
+            CompleteAnswerIncomingCall( aError );
+            break;
+        case EMultimodeCallHangUp:
+            CompleteHangUp( aError );
+            break;
+        case EMultimodeCallTransfer: 
+            CompleteTransfer( aError );
+            break;
+
+        //Can't use timer:
+        // - all notifications
+            //case EMultimodeCallNotifyStatusChange: 
+            //case EMultimodeCallNotifyDurationChange:
+            //case EMultimodeCallCapsChangeNotification:
+            //case EMultimodeCallNotifyMobileCallStatusChange: 
+            //case EMultimodeCallNotifyCallEvent:
+            //case EMultimodeCallNotifyRemotePartyInfoChange:
+            //case EMultimodeCallNotifyMobileCallCapsChange:
+            //case EMultimodeCallNotifyDataCallCapsChange:
+            //case EMultimodeCallNotifyHscsdInfoChange:
+            //case EMultimodeCallNotifyPrivacyConfirmation:
+
+        case EMultimodeMobileCallHold:
+        case EMultimodeMobileCallResume:
+        case EMultimodeMobileCallSwap:
+        case EMultimodeMobileCallDeflectCall:
+        case EMultimodeMobileCallDialEmergencyCall:
+        case EMultimodeCallGoOneToOne:
+        case EMultimodeCallSetDynamicHscsdParams:
+        default:
+            ReqCompleted(
+                iTsyReqHandleStore->ResetTsyReqHandle( aReqHandleType ),
+                aError );
+            break;
+        }
+    }
+#endif
+
+
+#ifdef TF_LOGGING_ENABLED
+// ---------------------------------------------------------------------------
+// CMmCallTsy::ReqCompleted
+// Overloads CTelObject::ReqCompleted for logging purposes. It prints the 
+// aTsyReqHandle and aError variable in the log file and then calls 
+// CTelObject::ReqCompleted.
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+void CMmCallTsy::ReqCompleted(
+    const TTsyReqHandle aTsyReqHandle,
+    const TInt aError )
+    {
+    //Overloads CTelObject::ReqCompleted for logging purposes. It 
+    //prints the aTsyReqHandle and aError variable in the log file and then 
+    //calls CTelObject::ReqCompleted.
+TFLOGSTRING3("TSY: CMmCallTsy::Request Completed. Handle:%d Error:%d", aTsyReqHandle, aError); 
+
+    CTelObject::ReqCompleted(aTsyReqHandle,aError);
+    }
+#endif
+
+// ---------------------------------------------------------------------------
+// CMmCallTsy::IsPartOfConference
+// Returns ETrue if this call is part of a conference
+// ---------------------------------------------------------------------------
+//
+TBool CMmCallTsy::IsPartOfConference() const
+	{
+	return iIsPartOfConference;
+	}
+
+// ---------------------------------------------------------------------------
+// CMmCallTsy::SetPartOfConference
+// Sets the flag indicating that this call is part of a MO conference
+// ---------------------------------------------------------------------------
+//
+void CMmCallTsy::SetPartOfConference( TBool aPartOfConference )
+{
+	iIsPartOfConference = aPartOfConference;
+
+#ifdef TF_LOGGING_METHOD
+	if ( iIsPartOfConference )
+		{
+TFLOGSTRING2( "TSY: CMmCallTsy::SetPartOfConference: Call %d has joined the conference", iCallId );
+		}
+	else
+		{
+TFLOGSTRING( "TSY: CMmCallTsy::SetPartOfConference: Call has left the conference" );
+		}
+#endif // TF_LOGGING_METHOD
+
+}
+// ---------------------------------------------------------------------------
+// CMmCallTsy::IsRequestPossibleInOffLine
+// Checks wether a ETel request can be performed or not while offline mode is
+// enabled
+// ---------------------------------------------------------------------------
+//
+TBool CMmCallTsy::IsRequestPossibleInOffline( TInt aIpc ) const
+    {
+    // we assume here that most of the requests are possible, thefore
+    // we switch for the not possible ones, optimizing a bit the checking.
+    TBool isRequestPossible ( ETrue );
+
+    switch ( aIpc )
+        {
+        case EMobileCallDialEmergencyCall://OK (when flag is enabled)
+        	{
+        	isRequestPossible = EFalse;        	
+        	RFeatureControl featureControl;
+        	TInt err = featureControl.Open();
+        	if ( (err == KErrNone) && (featureControl.FeatureSupported(NFeature::KEmergencyCallsEnabledInOfflineMode) == KFeatureSupported) )
+                {
+                isRequestPossible = ETrue;
+                }
+            featureControl.Close();    
+        	}
+            break;
+        //case EMobileCallGetMobileCallStatus: //OK
+        //case EMobileCallNotifyMobileCallStatusChange://OK
+        case EMobileCallHold://NO
+        case EMobileCallResume://NO
+        case EMobileCallSwap://NO
+        case EMobileCallTransfer://NO
+        case EMobileCallGoOneToOne://NO
+        //case EMobileCallNotifyCallEvent://OK
+        //case EMobileCallGetMobileCallCaps: //OK
+        //case EMobileCallNotifyMobileCallCapsChange: //OK
+        //case EMobileCallGetMobileCallInfo://OK
+        //case EMobileCallNotifyRemotePartyInfoChange://OK
+        //case EMobileCallNotifyPrivacyConfirmation://OK
+        //case EMobileCallGetMobileDataCallCaps: //OK
+        //case EMobileCallNotifyMobileDataCallCapsChange: //OK
+        //case EMobileCallGetMobileDataCallRLPRange://OK
+        //case EMobileCallSetDynamicHscsdParams://OK
+        //case EMobileCallGetCurrentHscsdInfo://OK
+        //case EMobileCallNotifyHscsdInfoChange://OK
+            isRequestPossible = EFalse;
+            break;
+        default:
+            break;
+        }
+        
+    return isRequestPossible;
+
+    }
+
+// ---------------------------------------------------------------------------
+// CMmCallTsy::GetFaxSettings
+// This CORE API method is used for getting fax settings
+// (not supported by default).
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+TInt CMmCallTsy::GetFaxSettings(
+    const TTsyReqHandle,
+    RCall::TFaxSessionSettings* )
+    {
+    return KErrNotSupported;
+    }
+
+// ---------------------------------------------------------------------------
+// CMmCallTsy::SetFaxSettings
+// This CORE API method is used for set fax settings
+// (not supported by default).
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+TInt CMmCallTsy::SetFaxSettings(
+    const TTsyReqHandle,
+    const RCall::TFaxSessionSettings*)
+    {
+    return KErrNotSupported;
+    }
+    
+
+// ---------------------------------------------------------------------------
+// CMmCallTsy::SetExtensionId
+// Set iExtensionId attribute
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+void CMmCallTsy::SetExtensionId(
+	TInt aExtensionId )
+	{
+	iExtensionId = aExtensionId;
+TFLOGSTRING2("TSY: CMmCallTsy::SetExtensionId.iExtensionId:%d",iExtensionId );
+	}
+
+// ---------------------------------------------------------------------------
+// CMmCallTsy::GetExtensionId
+// Get iExtensionId attribute
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+TInt CMmCallTsy::GetExtensionId()
+	{
+	return iExtensionId; 
+	}
+	
+// ---------------------------------------------------------------------------
+// CMmCallTsy::SetDialFlag
+// Sets iDialFlag boolean value
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//	
+void CMmCallTsy::SetDialFlag(
+	TBool aDialFlag )
+	{	
+	iDialFlag= aDialFlag;
+TFLOGSTRING2("TSY: CMmCallTsy::SetDialFlag. iDialFlag:%d",iDialFlag );			
+	}
+
+// ---------------------------------------------------------------------------
+// CMmCallTsy::GetDialFlag
+// Returns iDialFlag boolean value
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+TBool CMmCallTsy::GetDialFlag()
+	{	
+	
+TFLOGSTRING2("TSY: CMmCallTsy::GetDialFlag. iDialFlag:%d",iDialFlag );			
+	return iDialFlag;	
+	}
+
+// ---------------------------------------------------------------------------
+// CMmCallTsy::IsRemoteReleasedCall
+// Returns iIsRemoteReleasedCall boolean value
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+TBool CMmCallTsy::IsRemoteReleasedCall() const
+	{
+TFLOGSTRING("TSY: CMmCallTsy::IsRemoteReleasedCall()");
+	return iIsRemoteReleasedCall;
+	}
+
+// ---------------------------------------------------------------------------
+// CMmCallTsy::ActivateUUS
+// Specifies which User-To-User Signalling service(s) should be activated.
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+TInt CMmCallTsy::ActivateUUS( const TTsyReqHandle aTsyReqHandle,
+    RMobileCall::TMobileCallUUSRequestV1Pckg* aUUSRequest )
+	{
+    // Support only implicit-UUS1 service,
+    // save the UUS-Request and send it during the Dial so that
+    // UUS-Request can be mapped on LTSY side to correct phone call (with id).
+    // details of the message send, see CMmVoiceCallTsy::Dial 
+    
+    // To support UUS2 and UUS3 services in future the logic must be
+    // changed so that the UUS information can be sended to LTSY immediately.
+    
+    // Unpack UUS parameters
+	RMobileCall::TMobileCallUUSRequestV1 requestUUS = ( *aUUSRequest )();	
+TFLOGSTRING3("TSY: CMmCallTsy::ActivateUUS() -ServiceReq:%u  -UUI:%S", requestUUS.iServiceReq, &requestUUS.iUUI );
+    // handle implicit UUS1 request only
+    if ( requestUUS.iServiceReq & RMobileCall::KUUS1Implicit )
+        {
+        // take a copy of the UUS request
+        iUUSRequest = requestUUS; 
+        // complete req, with KErrNone
+        ReqCompleted( aTsyReqHandle, KErrNone );
+        }
+    else
+        {
+        // other UUS services are not supported in this phase
+        ReqCompleted( aTsyReqHandle, KErrNotSupported );
+        }
+        
+	return KErrNone;
+	}	
+	
+// ---------------------------------------------------------------------------
+// CMmCallTsy::ReceiveUUI
+// Enables the client to receive the next incoming UUI message or in case 
+// already received, return the buffered UUI.
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+TInt CMmCallTsy::ReceiveUUI( const TTsyReqHandle aTsyReqHandle,
+    RMobileCall::TMobileCallUUI* aUUI )
+	{
+TFLOGSTRING("TSY: CMmCallTsy::ReceiveUUI()" );
+    
+    // check are there any UUI information already in the buffer (UUS1)
+    if ( 0 < iReceivedUUI.Length() )
+        {
+TFLOGSTRING2("TSY: CMmCallTsy::ReceiveUUI() - information in BUFFER:%S", &iReceivedUUI );
+        // copy and empty the buffered information
+        *aUUI = iReceivedUUI;
+        iReceivedUUI.Zero(); 
+        
+        // complete the request
+        ReqCompleted( aTsyReqHandle, KErrNone );        
+        }
+    else
+        {
+TFLOGSTRING("TSY: CMmCallTsy::ReceiveUUI() - wait for next incoming UUI message" );
+        // Save request handle and pointer of the UUI message. 
+        iRetUUI = aUUI;
+        iTsyReqHandleStore->SetTsyReqHandle(
+            EMultimodeCallReceiveUUI, aTsyReqHandle );
+        }
+         
+    return KErrNone;
+	}
+
+// ---------------------------------------------------------------------------
+// CMmCallTsy::ReceiveUUICancel
+// Use this method to cancel a previously placed asynchronous 
+// EMobileCallReceiveUUI request.
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+TInt CMmCallTsy::ReceiveUUICancel( const TTsyReqHandle aTsyReqHandle )
+	{
+TFLOGSTRING("TSY: CMmCallTsy::ReceiveUUICancel()");
+    
+    // reset the client side pointer, empty buffer and cancel the handle
+    iRetUUI = NULL;
+    iReceivedUUI.Zero(); 
+    iTsyReqHandleStore->ResetTsyReqHandle( EMultimodeCallReceiveUUI );
+    ReqCompleted( aTsyReqHandle, KErrCancel );
+    return KErrNone;
+	}
+	
+// ---------------------------------------------------------------------------
+// CMmCallTsy::CompleteReceiveUUI
+// This method completes an outstanding ReceiveUUI request.
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+void CMmCallTsy::CompleteReceiveUUI( CMmDataPackage* aDataPackage, 
+    TInt aResult )
+	{
+TFLOGSTRING("TSY: CMmCallTsy::CompleteReceiveUUI()" );
+
+    RMobileCall::TMobileCallUUI* receiveUUI = NULL; 
+    aDataPackage->UnPackData( &receiveUUI );
+    
+TFLOGSTRING2("TSY: CMmCallTsy::CompleteReceiveUUI() - receiveUUI:%S", &receiveUUI );
+    
+    // reset req handle. Returns the deleted req handle
+    TTsyReqHandle reqHandle =
+        iTsyReqHandleStore->ResetTsyReqHandle( EMultimodeCallReceiveUUI );
+
+    if ( EMultimodeCallReqHandleUnknown != reqHandle )
+        {
+TFLOGSTRING("TSY: CMmCallTsy::CompleteReceiveUUI() - Handle found, complete" );
+        // Update the client side data through pointer        
+        *iRetUUI = *receiveUUI;
+        // Null client side pointer, data copied
+        iRetUUI = NULL;
+        // complete req
+        ReqCompleted( reqHandle, aResult );
+        }
+    else if ( KErrNone == aResult )
+        {
+TFLOGSTRING("TSY: CMmCallTsy::CompleteReceiveUUI() - Handle NOT found, buffer" );
+        // set initial information to the buffer
+        iReceivedUUI = *receiveUUI; 
+        }
+	}
+
+// ---------------------------------------------------------------------------
+// CMmCallTsy::SetDialTypeId
+// Set iDialTypeId attribute
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+void CMmCallTsy::SetDialTypeId(
+	TUint8 aDialType )
+	{
+	iDialTypeId = aDialType;
+TFLOGSTRING2("TSY: CMmCallTsy::SetDialTypeId.iDialType:%d",aDialType );
+	}
+
+// ---------------------------------------------------------------------------
+// CMmCallTsy::GetDialTypeId
+// Returns iDialTypeId value
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+TUint8 CMmCallTsy::GetDialTypeId()
+	{	
+	
+TFLOGSTRING2("TSY: CMmCallTsy::GetDialType. iDialType:%d",iDialTypeId );			
+	return iDialTypeId;	
+	}
+
+// ---------------------------------------------------------------------------
+// CMmCallTsy::CompleteDialNoFdn
+// Completes a Dial request.
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------	
+//
+void CMmCallTsy::CompleteDialNoFdn( 
+    TInt aResult )
+	{	
+TFLOGSTRING2("TSY: CMmCallTsy::CompleteDialNoFdn. Result:%d", aResult ); 
+TFLOGSTRING3("TSY: CMmCallTsy::CompleteDialNoFdn. Call Id:%d Call name:%S", iCallId, &iCallName);
+
+	//Set dial flag to false
+	SetDialFlag( EFalse );
+
+	TTsyReqHandle reqHandle ( EMultimodeCallReqHandleUnknown );	
+	
+	// Reset req handle. Returns the deleted req handle
+	reqHandle = iTsyReqHandleStore->ResetTsyReqHandle( 
+        EMultimodeCallDialNoFdnCheck );
+    
+    if ( EMultimodeCallReqHandleUnknown != reqHandle )
+        {
+        if ( aResult != KErrNone )
+            {
+            // The creation has failed.
+            iLastExitCode = aResult;
+            ClearCallStatus();
+
+            //Dial has failed, update core status - dial possible again
+            iCallCaps.iFlags |= RCall::KCapsDial;
+            iCallCaps.iFlags &= ~( RCall::KCapsHangUp );
+
+            //complete caps change notification
+            CompleteNotifyCapsChange();
+            }
+        //Complete request
+        ReqCompleted( reqHandle, aResult );
+        }
+        	
+	//Set dial type to none 
+	SetDialTypeId( KMultimodeCallTypeDialNone );	
+	}
+
+// ---------------------------------------------------------------------------
+// CMmCallTsy::UpdateLifeTimer
+// When the last call from conference call becomes idle, we are updating
+// life time duration param with remaining call duration
+// ---------------------------------------------------------------------------	
+//     
+void CMmCallTsy::UpdateLifeTimer()
+	{
+    if ( iMmPhone->NumberOfActiveCalls() == 0 )
+    	{                    	                                        
+        TTimeIntervalSeconds tis;
+		iMmPhone->GetAirTimeDuration(tis);
+		TUint32 duration;
+		duration = tis.Int();
+		duration = duration % iMmPhone->KLifeTimeUpdateInterval;
+
+		TFLOGSTRING2("TSY: CMmCallTsy::UpdateLifeTimer - \
+		        duration: %d", duration);
+				
+		//errors: trap and ignore
+        CMmDataPackage dataPackage;
+        dataPackage.PackData( &duration );
+		
+#ifdef USING_CTSY_DISPATCHER	
+    TRAP_IGNORE(iMessageManager->HandleRequestL( 
+    				ECtsyUpdateLifeTimeReq, &dataPackage );
+        ); 
+#else	
+    TRAP_IGNORE(iMessageManager->HandleRequestL( 
+    				EMmTsyUpdateLifeTimeIPC, &dataPackage );
+        ); 
+#endif //USING_CTSY_DISPATCHER 
+    	}	
+	}
+// CMmCallTsy::FillMobileCallInfoDefaults
+// The method fills a current snapshot of the call information described in 
+// the TMobileCallInfoV1 class to the aInfo. The mode specific fields will
+// be filled by the extension.
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+TInt CMmCallTsy::FillMobileCallInfoDefaults(
+    RMobileCall::TMobileCallInfoV1* aInfo )
+    {
+TFLOGSTRING("TSY: CMmCallTsy::FillMobileCallInfoDefaults");    
+
+    //set validity fields to 0 in the beginning.
+    aInfo->iValid = 0;
+    //The name of the call
+    aInfo->iCallName.Copy( iCallName );
+    //The name of the line on which the call is open
+    aInfo->iLineName.Copy( iMmLine->LineName() );
+    //The current status of the call
+    aInfo->iStatus = iMobileCallStatus;
+
+    //The time & date the call started.
+    TDateTime temp( iCallTimer->GetTimerStartTime()->DateTime() );
+    aInfo->iStartTime.Set(
+        temp.Year(), temp.Month(), temp.Day(),
+        temp.Hour(), temp.Minute(), temp.Second(), temp.MicroSecond() );
+
+    //The current duration of the call
+    aInfo->iDuration = GetCallDurationInSeconds();
+
+    //Set validity indication
+    aInfo->iValid |= RMobileCall::KCallStartTime | RMobileCall::KCallDuration;
+
+    //Client call Id. Note! Call server uses different call Id.
+    aInfo->iCallId = iCallId;
+    aInfo->iValid |= RMobileCall::KCallId; 
+
+    //The reason for termination of a finished call. Will equal KErrNone if
+    //the call ended normally and KErrNotFound if the call has not ended.
+    aInfo->iExitCode = iLastExitCode;
+    aInfo->iValid |= RMobileCall::KCallExitCode;
+
+    //ETrue if the call is an emergency call or EFalse if it is not.
+    aInfo->iEmergency = iEmergencyCall;
+    aInfo->iValid |= RMobileCall::KCallEmergency;
+TFLOGSTRING("TSY: CMmCallTsy::FillMobileCallInfoDefaults end");     
+    return KErrNone;
+    }
+    
+//  End of File