convergedcallengine/csplugin/src/cspetelcalleventmonitor.cpp
author Pat Downey <patd@symbian.org>
Wed, 01 Sep 2010 12:15:03 +0100
branchRCL_3
changeset 20 987c9837762f
parent 0 ff3b6d0fd310
permissions -rw-r--r--
Revert incorrect RCL_3 drop: Revision: 201033 Kit: 201035

/*
* Copyright (c) 2007 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:  Implementation of class CSPEtelCallEventMonitor which
*                monitors call events from ETel and notifies observer
*                accordingly.
*
*/


#include <mccptransferobserver.h>
#include <mccpforwardobserver.h>
#include <mccpconferencecallobserver.h>

#include "cspetelcalleventmonitor.h"
#include "csplogger.h"
#include "cspcall.h"



// ---------------------------------------------------------------------------
// CSPEtelCallEventMonitor::NewL.
// ---------------------------------------------------------------------------
//
CSPEtelCallEventMonitor* CSPEtelCallEventMonitor::NewL( MCSPCallObserver& aObserver,
                                                        RMobileCall& aCall ) 
    {
    CSPLOGSTRING(CSPOBJECT, 
        "CSPEtelCallEventMonitor::NewL()" );
    CSPEtelCallEventMonitor* self = new ( ELeave ) CSPEtelCallEventMonitor( 
                                        aObserver, aCall );
    return self;    
    }

// ---------------------------------------------------------------------------
// Destructs the object by canceling first ongoing monitoring.
// ---------------------------------------------------------------------------
//
CSPEtelCallEventMonitor::~CSPEtelCallEventMonitor( )
    {
    CSPLOGSTRING(CSPOBJECT, 
        "CSPEtelCallEventMonitor::~CSPEtelCallEventMonitor()" );
    Cancel();
    
    if ( iDestrPtr )
        {
        *iDestrPtr = ETrue;
        iDestrPtr = NULL;
        }
    }

// ---------------------------------------------------------------------------
// Starts the monitoring.
// ---------------------------------------------------------------------------
//
void CSPEtelCallEventMonitor::StartMonitoring()
    {
    CSPLOGSTRING( CSPINT, "CSPEtelCallEventMonitor::StartMonitoring" );
    
    if ( !IsActive() )
        {
        CSPLOGSTRING( CSPREQOUT, 
            "CSP: CSPEtelCallEventMonitor::StartMonitoring: \
                    Request RMobilePhone::NotifyCallEvent" );
        iCall.NotifyCallEvent( iStatus, iCallEvent );
        SetActive();
        }
    else
        {
        CSPLOGSTRING( CSPERROR, 
            "CSP: CSPEtelCallEventMonitor::StartMonitoring: Already active" );
        }
    }

// ---------------------------------------------------------------------------
// From CActive
// Handles event notifying.
// ---------------------------------------------------------------------------
//
void CSPEtelCallEventMonitor::RunL()
    {
    CSPLOGSTRING( CSPINT, "CSPEtelCallEventMonitor::RunL")
    
    // Survive from monitor destruction during observing sequence
    TBool destroyed = EFalse;
    iDestrPtr = &destroyed;
    
    if ( iStatus == KErrNone )
        {
        switch ( iCallEvent )
            {
            // The call has been terminated by the remote party. 
            case RMobileCall::ERemoteTerminated:
                {
                CSPLOGSTRING( CSPINT, 
                   "CSP CSPEtelCallEventMonitor::RunL: Remotely terminated" );
                iObserver.NotifyCallEventOccurred( 
                        MCCPCallObserver::ECCPRemoteTerminated );
                break;
                }
             // The call has been placed on hold as a result of a local action
            case RMobileCall::ELocalHold:
                {
                CSPLOGSTRING( CSPINT, 
                    "CSP CSPEtelCallEventMonitor::RunL: Locally held" );
                iObserver.NotifyCallEventOccurred( 
                        MCCPCallObserver::ECCPLocalHold );
                break;
                }
                
            // The call has been resumed as a result of a local action. 
            case RMobileCall::ELocalResume:
                {
                CSPLOGSTRING( CSPINT, 
                    "CSP CSPEtelCallEventMonitor::RunL: Locally resumed" );
                iObserver.NotifyCallEventOccurred( 
                        MCCPCallObserver::ECCPLocalResume );
                break;
                }
            // The call has been deflected to another remote party as a result
            // of a local action.
            case RMobileCall::ELocalDeflectCall:
                {
                CSPLOGSTRING( CSPINT, 
                    "CSP CSPEtelCallEventMonitor::RunL: Locally deflected" );
                iObserver.NotifyTransferCallEventOccurred(  
                        MCCPTransferObserver::ECCPLocalTransfer );
                break;
                }
            // The call has been transferred to another remote party as a 
            // result of a local action. 
            case RMobileCall::ELocalTransfer:
                {
                CSPLOGSTRING( CSPINT, 
                    "CSP CSPEtelCallEventMonitor::RunL: Locally transfered" );
                iObserver.NotifyTransferCallEventOccurred( 
                        MCCPTransferObserver::ECCPLocalTransfer );
                break;
                }
            // The call has been placed on hold by the remote connected party
            case RMobileCall::ERemoteHold:
                {
                CSPLOGSTRING( CSPINT, 
                    "CSP CSPEtelCallEventMonitor::RunL: Remotely held" );
                iObserver.NotifyCallEventOccurred( 
                        MCCPCallObserver::ECCPRemoteHold );
                break;
                }
            // The call has been resumed by the remote connected party. 
            case RMobileCall::ERemoteResume:
                {
                CSPLOGSTRING( CSPINT, 
                    "CSP CSPEtelCallEventMonitor::RunL: Remotely resumed" );
                iObserver.NotifyCallEventOccurred( 
                        MCCPCallObserver::ECCPRemoteResume );
                break;
                }
            // The call has been joined by the remote connected party to other
            // call(s) to create/add to a conference call. 
            case RMobileCall::ERemoteConferenceCreate:
                {
                CSPLOGSTRING( CSPINT, 
                    "CSP CSPEtelCallEventMonitor::RunL: Remotely created \
                             conference" );
                
                iObserver.NotifyCallEventOccurred( 
                        MCCPCallObserver::ECCPRemoteConferenceCreate );
                        
                break;
                }
            case RMobileCall::ERemoteTransferring:
                {
                CSPLOGSTRING( CSPINT, 
                    "CSP CSPEtelCallEventMonitor::RunL: Remotely created \
                     conference" );
                iObserver.NotifyTransferCallEventOccurred( 
                        MCCPTransferObserver::ECCPRemoteTransferring );
                break;
                }
            case RMobileCall::ERemoteTransferAlerting:
                {
                CSPLOGSTRING( CSPINT, 
                    "CSP CSPEtelCallEventMonitor::RunL: Remotely created \
                     conference" );
                iObserver.NotifyTransferCallEventOccurred( 
                            MCCPTransferObserver::ECCPRemoteTransferAlerting );
                break;
                }
            // The outgoing call has been barred by the remote party
            case RMobileCall::ERemoteBarred:
                {
                CSPLOGSTRING( CSPINT, 
                    "CSP CSPEtelCallEventMonitor::RunL: Remotely barred" );
                iObserver.NotifyCallEventOccurred( 
                        MCCPCallObserver::ECCPRemoteBarred );
                break;
                }

            // The call is being forwarded by the remote party. 
            case RMobileCall::ERemoteForwarding:
                {
                CSPLOGSTRING( CSPINT, 
                    "CSP CSPEtelCallEventMonitor::RunL: Remotely forwarded" );
                iObserver.NotifyForwardEventOccurred( 
                        MCCPForwardObserver::ECCPRemoteForwarding );
                break;
                }

            // The call is waiting at the remote end. 
            case RMobileCall::ERemoteWaiting:
                {
                CSPLOGSTRING( CSPINT, 
                    "CSP CSPEtelCallEventMonitor::RunL: Remotely waiting" );
                iObserver.NotifyCallEventOccurred( 
                        MCCPCallObserver::ECCPRemoteWaiting );
                break;
                }

            // The outgoing call has been barred by the local party. 
            case RMobileCall::ELocalBarred:
                {
                CSPLOGSTRING( CSPINT, 
                    "CSP CSPEtelCallEventMonitor::RunL: Locally barred" );
                iObserver.NotifyCallEventOccurred( 
                        MCCPCallObserver::ECCPLocalBarred );
                break;
                }

            default:
                {
                CSPLOGSTRING2( CSPINT, 
                    "CSP CSPEtelCallEventMonitor::RunL: Unspecified/protocol \
                     specific call event: %d", iCallEvent );
                break;
                }
            }
        }
        
    if ( !destroyed )
        {
        // In case instance has not been deleted, pointer must be cleared.
        iDestrPtr = NULL;
        if ( iStatus == KErrNone )
            {
            StartMonitoring();
            }
        }
    else
        {
        // already destroyed, do not touch members.
        }
    }

// ---------------------------------------------------------------------------
// From CActive
// Request canceling.
// ---------------------------------------------------------------------------
//
void CSPEtelCallEventMonitor::DoCancel()
    {
    CSPLOGSTRING( CSPINT, "CSPEtelCallEventMonitor::DoCancel" );
    iCall.CancelAsyncRequest( EMobileCallNotifyCallEvent );
    }
    
// ---------------------------------------------------------------------------
// Constructs the monitor.
// ---------------------------------------------------------------------------
//
CSPEtelCallEventMonitor::CSPEtelCallEventMonitor( MCSPCallObserver& aObserver,
                                                  RMobileCall& aCall ) : 
                                   CActive( EPriorityStandard ), 
                                   iObserver( aObserver ),
                                   iCall ( aCall )
    {
    CSPLOGSTRING(CSPOBJECT, 
        "CSPEtelCallEventMonitor::CSPEtelCallEventMonitor()" );
    CActiveScheduler::Add( this );
    }

// End of File