/*
* Copyright (c) 2003-2008 Nokia Corporation and/or its subsidiary(-ies). 
* All rights reserved.
* This component and the accompanying materials are made available
* under the terms of "Eclipse Public License v1.0"
* which accompanies this distribution, and is available
* at the URL "http://www.eclipse.org/legal/epl-v10.html".
*
* Initial Contributors:
* Nokia Corporation - initial contribution.
*
* Contributors:
*
* Description:  This file contains the implementation of CPESingleCall class 
*                member functions.
*
*/


// INCLUDE FILES
#include <pepanic.pan>
#include <talogger.h>

#include "cpesinglecall.h"
#include "mpecallowner.h"
#include "cpevideocallhandling.h"


// ================= MEMBER FUNCTIONS =======================
// Destructor
//
CPESingleCall::~CPESingleCall()
    {
    TEFLOGSTRING( KTAOBJECT, "CALL CPESingleCall::~CPESingleCall: Start." );
    TEFLOGSTRING( KTAOBJECT, "CALL CPESingleCall::~CPESingleCall: Complete." );
    }

// -----------------------------------------------------------------------------
// CPESingleCall::CPESingleCall
// C++ default constructor can NOT contain any code, that
// might leave.
// -----------------------------------------------------------------------------
//
CPESingleCall::CPESingleCall( 
        MPEMessageSender& aOwner
        ) : CPESingleCallObserver( aOwner ),
		    iMissedCall( EFalse)
    {
    TEFLOGSTRING( KTAOBJECT, "CALL CPESingleCall::CPESingleCall start." );
    TEFLOGSTRING( KTAOBJECT, "CALL CPESingleCall::CPESingleCall complete." );
    }

// -----------------------------------------------------------------------------
// CPEGsmVoiceCall::ConstructL
// Symbian 2nd phase constructor can leave.
// -----------------------------------------------------------------------------
//
void CPESingleCall::ConstructL()
    {
    TEFLOGSTRING( KTAOBJECT, "CALL CPESingleCall:::ConstructL start." );
    TEFLOGSTRING( KTAOBJECT, "CALL CPESingleCall::ConstructL complete." );
    }

// -----------------------------------------------------------------------------
// CPEGsmVoiceCall::NewL
// Two-phased constructor.
// -----------------------------------------------------------------------------
//
CPESingleCall* CPESingleCall::NewL( 
        MPEMessageSender& aOwner )
    {
    TEFLOGSTRING( KTAOBJECT, "CALL CPESingleCall::NewL start." );
    CPESingleCall* self = new ( ELeave ) CPESingleCall( aOwner );
    CleanupStack::PushL(self);
    self->ConstructL( );
    CleanupStack::Pop( self );

    TEFLOGSTRING( KTAOBJECT, "CALL CPESingleCall::NewL complete." );
    return self;
    }

// -----------------------------------------------------------------------------
// CPESingleCall::SendMessage
// Method reroutes messages from other modules to the CPEPhoneData-object
// Note that it does not use base class SendMessage.
// -----------------------------------------------------------------------------
//
void CPESingleCall::SendMessage( 
        const MEngineMonitor::TPEMessagesFromPhoneEngine aMessage )
    {
    iErrorCode = KErrNone;
    if( aMessage == MEngineMonitor::EPEMessageIdle )
        {
        // Get the call duration before the call object is closed.
        iDuration = Call().CallDuration();
        TEFLOGSTRING2( 
            KTAREQEND, 
            "CALL CPESingleCall::SendMessage: MCCECall::GetCallDuration() called, Duration: %d", 
            iDuration.Int() );
        }
   
    if ( aMessage != MEngineMonitor::EPEMessageUnknown )
        {
        CPECall::SendMessage( aMessage );
        }
        
    }

// -----------------------------------------------------------------------------
// CPESingleCall::Answer
// Method Answers the incoming call.
// Method creates iCallInfo parameter package and
// makes answer request to CPECallCommand-parameter.
// -----------------------------------------------------------------------------
//
TInt CPESingleCall::Answer()
    {
    SetMissedCall( EFalse );
    return Call().Answer();    
    }

// -----------------------------------------------------------------------------
// CPESingleCall::Dial
// creates dial request to the CPECallCommand object.
// Method opens the line for the new call.
// If error occurs the method returns error value.
// Method makes call parameter package and
// starts monitoring call statuses and call events and
// makes a dial request to the CPECallCommand object.
// -----------------------------------------------------------------------------
//
TInt CPESingleCall::Dial( 
        const RMobileCall::TTelNumberC& aNumber )
    {
    TInt errorCode( KErrNone );
    iDialledNumber = aNumber;
    
    TEFLOGSTRING( KTAINT, "CALL CPESingleCall::Dial");
    errorCode = Call().Dial(KNullDesC8);
    
    return errorCode;
    }

// -----------------------------------------------------------------------------
// CPESingleCall::DialEmergency
// creates emergency dial request to the CPECallCommand object
// -----------------------------------------------------------------------------
//
void CPESingleCall::DialEmergency(
        const TPEPhoneNumber& aEmergencyNumber )
    {
    TEFLOGSTRING( KTAINT, "CALL CPESingleCall::DialEmergency" );
    iCall->DialEmergencyCall( aEmergencyNumber );
    }

// -----------------------------------------------------------------------------
// CPESingleCall::DisableFDNCheck
// Disables FDN checking for SIM ATK originated calls
// -----------------------------------------------------------------------------
//
void CPESingleCall::DisableFDNCheck()
    {
    TEFLOGSTRING( KTAINT, "CALL CPESingleCall::DisableFDNCheck UNSUPPORTED" );
    
    // NOTE! Currently disabled due to incomplete TSY implementation
    // Remove comments after this task is completed
    
    //iCall->NoFDNCheck();
    }
		
// -----------------------------------------------------------------------------
// CPESingleCall::Hold
// creates hold request to the CPECallCommand object
// -----------------------------------------------------------------------------
//
TInt CPESingleCall::Hold()
    {
    TEFLOGSTRING( KTAINT, "CALL CPESingleCall::Hold" );
    return iCall->Hold();
    }

// -----------------------------------------------------------------------------
// CPESingleCall::Resume
// Method resumes held call
// -----------------------------------------------------------------------------
//
TInt CPESingleCall::Resume()
    {
    TEFLOGSTRING( KTAINT, "CALL CPESingleCall::Resume" );
    return iCall->Resume();
    }

// -----------------------------------------------------------------------------
// CPESingleCall::Swap
// Method swaps active and held call
// -----------------------------------------------------------------------------
//
TInt CPESingleCall::Swap()
    {
    TEFLOGSTRING( KTAINT, "CALL CPESingleCall::Swap" );
    return iCall->Swap();
    }

// -----------------------------------------------------------------------------
// CPESingleCall::Transfer
// Method Transfers the active and the held call.
// -----------------------------------------------------------------------------
//
void CPESingleCall::Transfer( const TDesC& aTransferTarget )
    {
    TEFLOGSTRING( KTAINT, "CALL CPESingleCall::Transfer" );
    iCall->AttendedTransfer( aTransferTarget );
    }

// -----------------------------------------------------------------------------
// CPESingleCall::Tone
// Returns the inband tone needed to play in state transition
// -----------------------------------------------------------------------------
//
TCCPTone CPESingleCall::Tone()
    {
    TEFLOGSTRING( KTAINT, "CALL CPESingleCall::Tone" );
    return iCall->Tone();
    }

// -----------------------------------------------------------------------------
// CPESingleCall::HangUp
// 
// -----------------------------------------------------------------------------
//
TInt CPESingleCall::HangUp()
    {
    TEFLOGSTRING( KTAREQOUT, "CALL CPESingleCall::HangUp" );
    SetMissedCall( EFalse );
    return iCall->HangUp();
    }

// -----------------------------------------------------------------------------
// CPESingleCall::GetCallInfo
// Method returns call information.
// -----------------------------------------------------------------------------
//
TInt CPESingleCall::GetCallInfo(
        RMobileCall::TMobileCallInfoV3& aCallInfo )
    {
    TEFLOGSTRING( KTAREQOUT, 
            "CALL CPESingleCall::GetCallInfo > RMobileCall::GetMobileCallInfo()" );
    RMobileCall::TMobileCallInfoV3Pckg callInfoPckg( iCallInfo );
    Call().GetMobileCallInfo( callInfoPckg );

    iCallInfo = callInfoPckg();
   
    aCallInfo = iCallInfo;
    return KErrNone;
    }

// -----------------------------------------------------------------------------
// CPESingleCall::SetMissedCall
// Set the missed call indicator = ETrue, if the current call
// was hanged up on state ringing by remote party.
// -----------------------------------------------------------------------------
//
void CPESingleCall::SetMissedCall( TBool aMissed )
    {
    TEFLOGSTRING2( KTAINT, "CALL CPESingleCall::SetMissedCall: Call Missed. %d", aMissed );
    iMissedCall = aMissed; 
    }

// -----------------------------------------------------------------------------
// CPESingleCall::GetMissedCall
// Returns the missed data call indicator.
// -----------------------------------------------------------------------------
//
TInt CPESingleCall::GetMissedCall(
        TBool& aMissedCall) const
    {
    aMissedCall = iMissedCall;
    return KErrNone;
    }

// -----------------------------------------------------------------------------
// CPESingleCall::IsSecureCall
// -----------------------------------------------------------------------------
//
TBool CPESingleCall::IsSecureCall() const
    {
    TEFLOGSTRING( KTAINT, "CALL CPESingleCall::IsSecureCall" );
    return iCall->IsSecured();
    }

// -----------------------------------------------------------------------------
// CPESingleCall::SecureSpecified
// -----------------------------------------------------------------------------
//
TBool CPESingleCall::SecureSpecified() const
    {
    TEFLOGSTRING( KTAINT, "CALL CPESingleCall::SecureSpecified" );
    return iCall->SecureSpecified(); 
    }

// -----------------------------------------------------------------------------
// CPESingleCall::AcceptUnattendedTransfer
// -----------------------------------------------------------------------------
//
TInt CPESingleCall::AcceptUnattendedTransfer()
    {
    TEFLOGSTRING( KTAINT, "CALL CPESingleCall::AcceptUnattendedTransfer" );
    
    return iCall->AcceptTransfer( ETrue );
    }


// -----------------------------------------------------------------------------
// CPESingleCall::RejectUnattendedTransfer
// -----------------------------------------------------------------------------
//
TInt CPESingleCall::RejectUnattendedTransfer()
    {
    TEFLOGSTRING( KTAINT, "CALL CPESingleCall::RejectUnattendedTransfer" );
    
    return iCall->AcceptTransfer( EFalse );
    }

// -----------------------------------------------------------------------------
// CPESingleCall::UnattendedTransfer
// -----------------------------------------------------------------------------
//
TInt CPESingleCall::UnattendedTransfer( const TDesC& aTransferTo ) const
    {
    TEFLOGSTRING( KTAINT, "CALL CPESingleCall::UnattendedTransfer" );

    return iCall->UnattendedTransfer( aTransferTo );
    }

// -----------------------------------------------------------------------------
// CPESingleCall::ForwardCallToAddress
// -----------------------------------------------------------------------------
//
TInt CPESingleCall::ForwardCallToAddress( TInt aIndex )
    {
    TEFLOGSTRING( KTAINT, "CALL CPESingleCall::ForwardToAddress" );
    TRAPD( err, iCall->ForwardToAddressL( aIndex ) );
    return err;
    }
    
// End of File 
