satengine/satserver/Commands/SetUpCallCmd/src/csetupcalldtmfsender.cpp
author Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
Tue, 31 Aug 2010 15:45:17 +0300
branchRCL_3
changeset 19 7d48bed6ce0c
permissions -rw-r--r--
Revision: 201033 Kit: 201035

/*
* Copyright (c) 2010 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: Send DTMF string if necessary after creating a call 
*
*/

#include <etelmm.h>
#include <mmtsy_names.h>
#include "msatmultimodeapi.h"
#include "csetupcalldtmfsender.h"
#include "msatasynctosync.h"
#include "SatLog.h"

_LIT( KSatDtmfCharp, "p" );
_LIT( KSatDtmfCharw, "w" );

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

// -----------------------------------------------------------------------------
// CSetupCallDtmfSender::CSetupCallDtmfSender
// The class constructor.
// -----------------------------------------------------------------------------
//
CSetupCallDtmfSender::CSetupCallDtmfSender( MSatMultiModeApi& aPhone )
    : CActive( EPriorityStandard ), iPhone( aPhone ), iDtmfString( NULL ) 
    {
    LOG( SIMPLE,
        "SETUPCALL: CSetupCallDtmfSender::CSetupCallDtmfSender calling" )

    CActiveScheduler::Add( this );

    LOG( SIMPLE,
        "SETUPCALL: CSetupCallDtmfSender::CSetupCallDtmfSender exiting" )
    }

// -----------------------------------------------------------------------------
// CSetupCallDtmfSender::NewL
// Two-phased constructor.
// -----------------------------------------------------------------------------
//
CSetupCallDtmfSender* CSetupCallDtmfSender::NewL( MSatMultiModeApi& aPhone )
    {
    LOG( SIMPLE, "SETUPCALL: CSetupCallDtmfSender::NewL calling" )

    CSetupCallDtmfSender* self =
        new ( ELeave ) CSetupCallDtmfSender( aPhone );
 
    LOG( SIMPLE, "SETUPCALL: CSetupCallDtmfSender::NewL exiting" )
    return self;
    }

// -----------------------------------------------------------------------------
// CSetupCallDtmfSender::~CSetupCallDtmfSender
// Destructor
// -----------------------------------------------------------------------------
//
CSetupCallDtmfSender::~CSetupCallDtmfSender()
    {
    LOG( SIMPLE, "SETUPCALL: \
            CSetupCallDtmfSender::~CSetupCallDtmfSender calling" )
    Cancel();
    
    delete iDtmfString;
    iDtmfString = NULL;

    LOG( SIMPLE, "SETUPCALL: \
            CSetupCallDtmfSender::~CSetupCallDtmfSender exiting" )
    }

// -----------------------------------------------------------------------------
// CSetupCallDtmfSender::SendDtmfString
// -----------------------------------------------------------------------------
//
void CSetupCallDtmfSender::SendDtmfString()
{
    LOG( SIMPLE, "SETUPCALL: CSetupCallDtmfSender::SendDtmfString calling" )
    if( !IsActive() && iDtmfString )
        {
        const TInt ret = iPhone.ContinueDTMFStringSending( ETrue );
        LOG2( SIMPLE, "SETUPCALL: CSetupCallDtmfSender::SendDtmfString\
            ContinueDTMFStringSending ret %d", ret )        
        iPhone.SendDTMFTones( iStatus, *iDtmfString );  
        
        SetActive();
        }
    LOG( SIMPLE, "SETUPCALL: CSetupCallDtmfSender::SendDtmfString exit" )
}

// -----------------------------------------------------------------------------
// CSetupCallDtmfSender::SeparateDtmfFromTelNumber
// Refers to 
// RPhCltEmergencyCall::RemoveDTMF
// RPhCltEmergencyCall::FindStartOfDtmfString
// -----------------------------------------------------------------------------
//
void CSetupCallDtmfSender::SeparateDtmfFromTelNumber(TDes& aString)
    {
    LOG( SIMPLE, 
        "SETUPCALL: CSetupCallDtmfSender::SeparateDtmfFromTelNumber calling")
        
    delete iDtmfString;
    iDtmfString = NULL;
    
    // String must contain 'p' or 'w'. Find start of dtmf string.
    TInt indexp; //char 'p' index
    TInt indexw; // char 'w' index
    TPtrC ptrDtmfCharp( KSatDtmfCharp );
    TPtrC ptrDtmfCharw( KSatDtmfCharw );

    indexp = aString.Locate( ptrDtmfCharp[ 0 ] );
    indexw = aString.Locate( ptrDtmfCharw[ 0 ] ); 

    TInt dtmfIndex = KErrNotFound;
    if ( indexp != KErrNotFound || indexw != KErrNotFound )
        {
        // dtmf char found
        if ( indexw == KErrNotFound )
            {
            // char p index
            dtmfIndex = indexp;    
            }   
        else if ( indexp == KErrNotFound )
            {
            // char w index
            dtmfIndex = indexw;    
            }                 
        else
            {
            // Both chars p and w found, smaller index selected
            indexp < indexw ? dtmfIndex = indexp : dtmfIndex = indexw;    
            }         
        }
    LOG2( SIMPLE, 
        "SETUPCALL: CSetupCallDtmfSender::SeparateDtmfFromTelNumber \
        dtmfIndex=%d", dtmfIndex )  
    
    // Separate purl tel number and dtmf string
    if ( dtmfIndex != KErrNotFound )
        {
        // Dtmf string to member data for furture sending
        TPtrC temp( aString.Right( aString.Length() - dtmfIndex ) );
        LOG2( SIMPLE, 
            "SETUPCALL: CSetupCallDtmfSender::SeparateDtmfFromTelNumber \
            DTMF=%S", &temp)  
        
        iDtmfString = temp.Alloc();
        LOG2( SIMPLE, 
            "SETUPCALL: CSetupCallDtmfSender::SeparateDtmfFromTelNumber \
            iDtmfString address=%d", iDtmfString )         
        
        // Tel number for dialing call
        aString.Delete( dtmfIndex, aString.Length() - dtmfIndex );
        LOG2( SIMPLE, 
            "SETUPCALL: CSetupCallDtmfSender::SeparateDtmfFromTelNumber \
            TelNumber=%S", &aString ) 
        }
    LOG( SIMPLE, 
        "SETUPCALL: CSetupCallDtmfSender::SeparateDtmfFromTelNumber exit" )
    }

// -----------------------------------------------------------------------------
// CSetupCallDtmfSender::RunL
// Handles the command.
// -----------------------------------------------------------------------------
//
void CSetupCallDtmfSender::RunL()
    {
    LOG2( SIMPLE, "SETUPCALL: CSetupCallDtmfSender::RunL calling iStatus=%i", 
        iStatus.Int() )
    
    delete iDtmfString;
    iDtmfString = NULL;
    
    LOG( SIMPLE, "SETUPCALL: CSetupCallDtmfSender::RunL exiting" )
    }

// -----------------------------------------------------------------------------
// From class CActive.
// Cancels the sat request.
// -----------------------------------------------------------------------------
//
void CSetupCallDtmfSender::DoCancel()
    {
    LOG( SIMPLE, "SETUPCALL: CSetupCallDtmfSender::DoCancel calling" )
    iPhone.CancelAsyncRequest( EMobilePhoneSendDTMFTones );
    LOG( SIMPLE, "SETUPCALL: CSetupCallDtmfSender::DoCancel exiting" )
    }

//  End of File