convergedcallengine/csplugin/src/cspeteldtmfmonitor.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:  Implements the class CSPEtelDtmfMonitor
*
*/



#include <mccpdtmfobserver.h>
#include <rmmcustomapi.h>
#include <gsmerror.h>

#include "cspeteldtmfmonitor.h"
#include "csplogger.h"
#include "cspdtmfprovider.h"
#include "cspconsts.h"
#include "cspdtmfprovider.h"



// ---------------------------------------------------------------------------
// CSPEtelDtmfMonitor::NewL.
// ---------------------------------------------------------------------------
//
CSPEtelDtmfMonitor* CSPEtelDtmfMonitor::NewL( 
                                        CSPDTMFProvider& aObserver, 
                                        RMmCustomAPI& aMmCustom ) 
    {
    CSPLOGSTRING(CSPOBJECT, 
        "CSPEtelDtmfMonitor::NewL()" );
    CSPEtelDtmfMonitor* self = new ( ELeave ) CSPEtelDtmfMonitor( 
                                        aObserver, aMmCustom );
    return self;    
    }


// ---------------------------------------------------------------------------
// Destructs the object by canceling first ongoing monitoring.
// ---------------------------------------------------------------------------
//
CSPEtelDtmfMonitor::~CSPEtelDtmfMonitor( )
    {
    CSPLOGSTRING(CSPOBJECT, 
        "CSPEtelDtmfMonitor::~CSPEtelDtmfMonitor()" );
    Cancel();
    }

// ---------------------------------------------------------------------------
// Starts the monitor.
// ---------------------------------------------------------------------------
//
void CSPEtelDtmfMonitor::StartMonitoring()
    {
    CSPLOGSTRING(CSPINT, 
        "CSPEtelDtmfMonitor::StartMonitoring()" );

    if ( !IsActive() )
        {
        CSPLOGSTRING( CSPINT, 
            "CSP: CSPEtelDtmfMonitor::StartMonitoring: Request \
                    iMmCustom.NotifyDTMFEvent( iStatus, iEventData )" );
        iMmCustom.NotifyDtmfEvent( iStatus, iEventData );
        SetActive();
        }
    else
        {
        CSPLOGSTRING( CSPERROR, 
            "CSP: CSPEtelDtmfMonitor::StartMonitoring: Already active" );
        }
    }
// ---------------------------------------------------------------------------
// From CActive.
// Handles line status change notifying.
// ---------------------------------------------------------------------------
//
void CSPEtelDtmfMonitor::RunL()
    {
    TInt err = iStatus.Int();
    CSPLOGSTRING2( CSPREQEND, 
        "CSPEtelDtmfMonitor::RunL: status: %d", err );
    
    if ( err == KErrNone )
        {
        MCCPDTMFObserver::TCCPDtmfEvent event;
        if ( iEventData.iEvent == RMmCustomAPI::EDtmfStart 
             && iEventData.iType == RMmCustomAPI::EDtmfManual )
            {
            event = MCCPDTMFObserver::ECCPDtmfManualStart;
            }
        else if ( iEventData.iEvent == RMmCustomAPI::EDtmfStart 
             && iEventData.iType == RMmCustomAPI::EDtmfSequence )
            {
            event = MCCPDTMFObserver::ECCPDtmfSequenceStart;
            }
        else if ( iEventData.iEvent == RMmCustomAPI::EDtmfStop 
             && iEventData.iType == RMmCustomAPI::EDtmfManual )
            {
            event = MCCPDTMFObserver::ECCPDtmfManualStop;
            }
        else if ( iEventData.iEvent == RMmCustomAPI::EDtmfStop 
             && iEventData.iType == RMmCustomAPI::EDtmfSequence )
            {
            event = MCCPDTMFObserver::ECCPDtmfSequenceStop;
            }
        else if ( iEventData.iEvent == RMmCustomAPI::EDtmfAbort 
             && iEventData.iType == RMmCustomAPI::EDtmfManual )
            {
            event = MCCPDTMFObserver::ECCPDtmfManualAbort;
            }
        else if ( iEventData.iEvent == RMmCustomAPI::EDtmfAbort 
             && iEventData.iType == RMmCustomAPI::EDtmfSequence )
            {
            event = MCCPDTMFObserver::ECCPDtmfSequenceAbort;
            }
        else
            {
            // Unknown event
            CSPLOGSTRING3( CSPERROR, 
                "CSPEtelDtmfMonitor::RunL: Unknown event = %¨d, type = %d", 
                    iEventData.iEvent, iEventData.iType );
            
            // Refresh and return (no observer notfiying).
            StartMonitoring();
            return;
            }
        
        iObserver.NotifyDTMFEvent( event, err, iEventData.iTone );
        }
    else
        {
        CSPLOGSTRING2( CSPERROR, "CSPEtelDtmfMonitor::RunL: Error \
                    from DTMF: %d", err );
        }
    
    // Continue if not in offline mode
    if ( err != KErrGsmOfflineOpNotAllowed && err != KErrCancel 
         && err != KErrNotSupported )
        {
        StartMonitoring();
        }
    CSPLOGSTRING( CSPREQEND, "CSPEtelDtmfMonitor::RunL End of RunL." );
    }

// ---------------------------------------------------------------------------
// From CActive
// Canceling functionality.
// ---------------------------------------------------------------------------
//
void CSPEtelDtmfMonitor::DoCancel()
    {
    if ( iStatus == KRequestPending )
        {
        CSPLOGSTRING( CSPINT, 
            "CSPEtelDtmfMonitor::DoCancel Canceling pending request.." );
        iMmCustom.CancelAsyncRequest( ECustomNotifyDtmfEventIPC ); 
        }
    }


// ---------------------------------------------------------------------------
// Constructs the monitor.
// ---------------------------------------------------------------------------
//
CSPEtelDtmfMonitor::CSPEtelDtmfMonitor(
            CSPDTMFProvider& aObserver, 
            RMmCustomAPI& aMmCustom ) : 
                CActive( EPriorityStandard ),             
                iObserver( aObserver ),
                iMmCustom( aMmCustom )
    {
    CSPLOGSTRING(CSPOBJECT, 
        "CSPEtelDtmfMonitor::CSPEtelDtmfMonitor()" );
    CActiveScheduler::Add( this );
    }
    

// End of file