vtengines/videoteleng/Src/Session/CVtEngSessionHandler.cpp
author Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
Mon, 23 Nov 2009 14:47:47 +0200
changeset 0 ed9695c8bcbe
permissions -rw-r--r--
Revision: 200948

/*
* Copyright (c) 2006 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:  Session handler.
*
*/



// INCLUDE FILES
#include    "CVtEngSessionHandler.h"
#include    "CVtEngOperation.h"
#include    "CVtEngStateManager.h"
#include 	"cvtengincomingcallmonitor.h"
#include    "vtengcommands.h"
#include    "CVtEngOperation.h"
#include    "CVtCtlFactory.h"
#include    "MVtCtlCallControl.h"
#include    "CVtEngSettings.h"
#include    "VtEngUtils.h"
#include    "VtCtlTypes.h" // for TVtCtlCSSessionInfoV1 
#include    "cvtlogger.h"

// ============================ MEMBER FUNCTIONS ===============================

// -----------------------------------------------------------------------------
// CVtEngSessionHandler::CVtEngSessionHandler
// C++ default constructor can NOT contain any code, that
// might leave.
// -----------------------------------------------------------------------------
//
CVtEngSessionHandler::CVtEngSessionHandler() 
    : CActive( CActive::EPriorityStandard ), iIncomingCallMonitor(NULL)
    {
    CActiveScheduler::Add( this );
    }

// -----------------------------------------------------------------------------
// CVtEngSessionHandler::ConstructL
// Symbian 2nd phase constructor can leave.
// -----------------------------------------------------------------------------
//
void CVtEngSessionHandler::ConstructL()
    {
    SetActive();
    TRequestStatus* status = &iStatus;
    User::RequestComplete( status, KErrNone );
    StartIncomingCallMonitorL();
    }

// -----------------------------------------------------------------------------
// CVtEngSessionHandler::NewL
// Two-phased constructor.
// -----------------------------------------------------------------------------
//
CVtEngSessionHandler* CVtEngSessionHandler::NewL(  )
    {
    CVtEngSessionHandler* self = new( ELeave ) 
        CVtEngSessionHandler( );
    
    CleanupStack::PushL( self );
    self->ConstructL();
    CleanupStack::Pop();

    return self;
    }

    
// -----------------------------------------------------------------------------
// CVtEngSessionHandler::~CVtEngSessionHandler
// Destructor
// 
// -----------------------------------------------------------------------------
//
CVtEngSessionHandler::~CVtEngSessionHandler()
    {
    __VTPRINTENTER( "SH.~" )
    Cancel();
    Uninitialize();
    delete iIncomingCallMonitor;
    __VTPRINTEXIT( "SH.~" )
    }

// -----------------------------------------------------------------------------
// CVtEngSessionHandler::HandleL
// Performs session request.
// 
// -----------------------------------------------------------------------------
//
void CVtEngSessionHandler::HandleL( 
    CVtEngOperation& /*aOperation*/ )
    {
    __VTPRINT( DEBUG_SESSION, "SH.HandleL leave not supported" )
    User::Leave( KErrNotSupported );
    }

// -----------------------------------------------------------------------------
// CVtEngSessionHandler::State
// Returns session state
// 
// -----------------------------------------------------------------------------
//
MVtEngSessionInfo::TSessionState CVtEngSessionHandler::State( 
    TBool aForcedRefresh ) const
    {
    CVtEngStateManager* states = CVtEngUtility::StateManager();
    if ( aForcedRefresh )
        {
        states->Update();
        }
    return states->SessionState();
    }

// -----------------------------------------------------------------------------
// CVtEngSessionHandler::GetDirection
// Returns direction.
// 
// -----------------------------------------------------------------------------
//
TInt CVtEngSessionHandler::GetDirection( 
    TDirection& aDirection ) const
    {
    __VTPRINTENTER( "SH.GetDirection" )
    if ( !iSessionControl )
        {
        __VTPRINTEXITR( "SH.GetDirection err=%d", KErrNotFound )
        return KErrNotFound;
        }

    TVtCtlCSSessionInfoV1 info;
    TPckg<TVtCtlCSSessionInfoV1> pckg( info );
    TRAPD( err, iSessionControl->GetSessionInfoL( KActiveSessionId, pckg ) );
    if ( err == KErrNone )
        {
        switch ( info.iDirection )
            {
            case MVtCtlCallControl::EDirectionMobileOriginated:
                aDirection = EDirectionMO;
                break;
            case MVtCtlCallControl::DirectionMobileTerminated:
                aDirection = EDirectionMT;
                break;
            default:
                aDirection = EDirectionNone;
                break;
            }
        }
    __VTPRINT2( DEBUG_SESSION, "SH.direction dir=%d", aDirection )
    __VTPRINTEXITR( "SH.GetDirection err=%d", err )
    return err;
    }

// -----------------------------------------------------------------------------
// CVtEngSessionHandler::GetDuration
// Returns session duration.
// 
// -----------------------------------------------------------------------------
//
TInt CVtEngSessionHandler::GetDuration( 
    TDuration& aDuration,
    TBool& aEnabled ) const
    {
    if ( !iSessionControl )
        {
        return KErrNotFound;
        }

    TVtCtlDuration duration;
    TInt err ( iSessionControl->GetDuration( KActiveSessionId, duration ) );
    if ( err == KErrNone )
        {
        aDuration = duration;
        const CVtEngSettings& settings = CVtEngUtility::Settings();
        aEnabled = settings.Config().iCallTimerOn;
        }
    return err;
    }

// -----------------------------------------------------------------------------
// CVtEngSessionHandler::GetCLI
// 
// 
// -----------------------------------------------------------------------------
//
TInt CVtEngSessionHandler::GetCLI( TCLI& aCLI ) const
    {
    const CVtEngSettings& settings = CVtEngUtility::Settings();
    const TBool isValid = settings.GetCLI( aCLI);
    TInt res = KErrNone;
    if ( !isValid )
        {
        res = KErrNotReady;    
        }
    return res;
    }


// -----------------------------------------------------------------------------
// CVtEngSessionHandler::HandleVtSessionEventL
// 
// 
// -----------------------------------------------------------------------------
//
void CVtEngSessionHandler::HandleVtSessionEventL( 
    TVtCtlEvent aEvent,
    TAny* /*aParams*/ )
    {
    if ( aEvent == KVtCtlEventSessionStatusChanged )
        {
        CVtEngStateManager* states = CVtEngUtility::StateManager();
        states->Update( );
        }
    }

// -----------------------------------------------------------------------------
// CVtEngSessionHandler::InitializeL
// 
// 
// -----------------------------------------------------------------------------
//
void CVtEngSessionHandler::InitializeL()
    {
    __VTPRINTENTER( "SH.Initilialize" )
    if ( iSessionControl )
        {
        // already initialized
        __VTPRINTEXIT( "SH.Initilialize" )
        return;
        }
    TInt err = iLib.Load( KVtCtlLibraryName() );
    CleanupClosePushL( iLib );
    if ( err == KErrNone )
        {
        TLibraryFunction func = iLib.Lookup( 1 );
        iFactory = reinterpret_cast<CVtCtlFactory*>( func() );
        iSessionControl = iFactory->CreateCallControlL( *this );
        
        // Update state
        CVtEngStateManager* states = CVtEngUtility::StateManager();
        states->Update();
        }    
    CleanupStack::Pop(); // lib
    __VTPRINTEXIT( "SH.Initilialize" )
    }

// -----------------------------------------------------------------------------
// CVtEngSessionHandler::Uninitialize
// 
// 
// -----------------------------------------------------------------------------
//
void CVtEngSessionHandler::Uninitialize()
    {
    if ( iFactory )
        {
        iFactory->Delete( iSessionControl );
        delete iFactory;
        iFactory = NULL;
        iSessionControl = NULL;
        }
    iLib.Close();
    }

// -----------------------------------------------------------------------------
// CVtEngSessionHandler::RealState
// 
// 
// -----------------------------------------------------------------------------
//
MVtCtlCallControl::TVtCtlState CVtEngSessionHandler::RealState() const
    {
    MVtCtlCallControl::TVtCtlState state( MVtCtlCallControl::EUnknown );
    if ( iSessionControl )
        {
        state = iSessionControl->GetSessionState( KActiveSessionId );
        __VTPRINT2( DEBUG_SESSION, "SH.realState=%d", state )
        }
    return state;
    }
// -----------------------------------------------------------------------------
// CVtEngSessionHandler::RunL
// 
// 
// -----------------------------------------------------------------------------
//
void CVtEngSessionHandler::RunL()
    {
    InitializeL();
    }

// -----------------------------------------------------------------------------
// CVtEngSessionHandler::DoCancel
// 
// 
// -----------------------------------------------------------------------------
//
void CVtEngSessionHandler::DoCancel()
    {
    // nothing here
    }

// -----------------------------------------------------------------------------
// CVtEngSessionHandler::StartIncomingCallMonitorL
// 
// 
// -----------------------------------------------------------------------------
//
void CVtEngSessionHandler::StartIncomingCallMonitorL()
    {
    iIncomingCallMonitor = CVtEngIncomingCallMonitor::NewL();
    }

//  End of File