satengine/SatServer/SatInternalClient/src/CSatCPlayToneHandler.cpp
author Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
Tue, 02 Feb 2010 01:11:09 +0200
changeset 0 ff3b6d0fd310
permissions -rw-r--r--
Revision: 201003 Kit: 201005

/*
* Copyright (c) 2002-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 is the handler for the SIM Application Toolkit
*                Play Tone proactive command.
*
*/


#include    <e32svr.h>
#include    "RSatUiSession.h"
#include    "MSatUiObserver.h"
#include    "SatSOpcodes.h"
#include    "CSatCPlayToneHandler.h"
#include    "SatLog.h"

// Used when Play tone doesn't contain duration.
const TInt KSatPtDefaultDuration = 5;

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

// -----------------------------------------------------------------------------
// CSatCPlayToneHandler::CSatCPlayToneHandler
// C++ default constructor can NOT contain any code, that
// might leave.
// -----------------------------------------------------------------------------
//
CSatCPlayToneHandler::CSatCPlayToneHandler(
    TInt aPriority,
    RSatUiSession* aSession ) :
    CActive( aPriority ),
    iSession( aSession ),
    iPlayToneData(),
    iPlayTonePckg( iPlayToneData ),
    iPlayToneRsp(),
    iPlayToneRspPckg( iPlayToneRsp )
    {
    LOG( SIMPLE,
        "SATINTERNALCLIENT: CSatCPlayToneHandler::CSatCPlayToneHandler calling" )

    // Add to active scheduler.
    CActiveScheduler::Add( this );

    LOG( SIMPLE,
        "SATINTERNALCLIENT: CSatCPlayToneHandler::CSatCPlayToneHandler exiting" )
    }

// -----------------------------------------------------------------------------
// CSatCPlayToneHandler::NewL
// Two-phased constructor.
// -----------------------------------------------------------------------------
//
CSatCPlayToneHandler* CSatCPlayToneHandler::NewL(
    RSatUiSession* aSat )
    {
    LOG( SIMPLE, "SATINTERNALCLIENT: CSatCPlayToneHandler::NewL calling" )

    // Perform the construction.
    CSatCPlayToneHandler* self =
        new ( ELeave ) CSatCPlayToneHandler( EPriorityLow, aSat );

    LOG( SIMPLE, "SATINTERNALCLIENT: CSatCPlayToneHandler::NewL exiting" )
    return self;
    }

// Destructor
CSatCPlayToneHandler::~CSatCPlayToneHandler()
    {
    LOG( SIMPLE,
        "SATINTERNALCLIENT: CSatCPlayToneHandler::~CSatCPlayToneHandler calling" )
    // Cancel any outstanding requests.

    Cancel();
    iSession = NULL;

    LOG( SIMPLE,
        "SATINTERNALCLIENT: CSatCPlayToneHandler::~CSatCPlayToneHandler exiting" )
    }

// -----------------------------------------------------------------------------
// CSatCPlayToneHandler::Start
// Starts the handler.
// -----------------------------------------------------------------------------
//
void CSatCPlayToneHandler::Start()
    {
    LOG( SIMPLE, "SATINTERNALCLIENT: CSatCPlayToneHandler::Start calling" )

    // Empty the IPC data
    RSat::TPlayToneV2 temp;
    iPlayToneData = temp;
    RSat::TPlayToneRspV1 temp2;
    iPlayToneRsp = temp2;

    // Request Play Tone notification.
    TIpcArgs arguments( &iPlayTonePckg );

    // Pass the Play Tone IPC package.
    iSession->CreateRequest( ESatSProactivePlayTone, arguments, iStatus );

    // Set this handler to active so that it can receive requests.
    SetActive();

    LOG( SIMPLE, "SATINTERNALCLIENT: CSatCPlayToneHandler::Start exiting" )
    }

// -----------------------------------------------------------------------------
// CSatCPlayToneHandler::RunL
// Handles the command.
// -----------------------------------------------------------------------------
//
void CSatCPlayToneHandler::RunL()
    {
    LOG( SIMPLE, "SATINTERNALCLIENT: CSatCPlayToneHandler::RunL calling" )

    // Check the status of the asnychronous operation
    if ( KErrNone != iStatus.Int() )
        {
        LOG2(
            SIMPLE,
            "SATINTERNALCLIENT: CSatCPlayToneHandler::RunL exiting, error: %d",
            iStatus.Int() )

        // Renew the request
        Start();

        return;
        }

    // Determine the play duration.
    TTimeIntervalMicroSeconds interval( static_cast<TInt64>( 0 ) );
    LOG2( SIMPLE,
    "SATINTERNALCLIENT: CSatCPlayToneHandler::RunL \
    iPlayToneData.iDuration.iTimeUnit: %d",iPlayToneData.iDuration.iTimeUnit )
    switch ( iPlayToneData.iDuration.iTimeUnit )
        {
        case RSat::EMinutes:
            {
            TInt64 temp1(
            static_cast<TInt>( iPlayToneData.iDuration.iNumOfUnits ) );
            TInt64 temp2( KSatCMicroSecondsInMinute );
            interval = temp1 * temp2;
            break;
            }
        case RSat::ESeconds:
            {
            interval = iPlayToneData.iDuration.iNumOfUnits *
                KSatCMicroSecondsInSecond;
            break;
            }
        case RSat::ETenthsOfSeconds:
            {
            interval = iPlayToneData.iDuration.iNumOfUnits *
                KSatCMicroSecondsInOneTenthSecond;
            break;
            }
        case RSat::ETimeUnitNotSet:
        case RSat::ENoDurationAvailable:
            {
            // We are defaulting to 5 seconds in S60
            interval = KSatPtDefaultDuration *
                KSatCMicroSecondsInSecond;
            break;
            }
        default:
            {
            LOG( SIMPLE, "SATINTERNALCLIENT: Unexpected time unit" )
            }
        }
    // Set the type of tone to be played.
    // Cannot use static_cast directly because of GCC
    TSatTone dialTone( static_cast<TSatTone>(
        static_cast<TInt>( iPlayToneData.iTone ) ) );

    // Has to be casted to TInt before casting to TSatIconQualifier, because
    // GCC warns about the direct cast.
    const struct TSatIconId iconId = { iPlayToneData.iIconId.iIdentifier,
        static_cast<TSatIconQualifier>(
            static_cast<TInt>( iPlayToneData.iIconId.iQualifier ) ) };

    // This will contain EFalse if requested icon is not displayed.
    // And if icon is displayed, it contains ETrue.
    TBool requestedIconDisplayed( EFalse );

    // Notify the registered client and save the response.
    TSatUiResponse response = iSession->SatUiObserver()->PlayTone(
        iPlayToneData.iAlphaId.iAlphaId, dialTone, interval,
        iconId, requestedIconDisplayed );

    // This command never has any additional information.
    iPlayToneRsp.iInfoType = RSat::KNoAdditionalInfo;
    iPlayToneRsp.iAdditionalInfo.Zero();

    iPlayToneRsp.SetPCmdNumber( iPlayToneData.PCmdNumber() );

    // Examine the client response.
    ExamineClientResponse(
        response, requestedIconDisplayed );

    // Pass the Play Tone response IPC package.
    TIpcArgs arguments( &iPlayToneRspPckg );

    // Perform the IPC data transfer.
    iSession->CreateRequest( ESatSProactivePlayToneResponse, arguments );

    // Renew the request
    Start();

    LOG( SIMPLE, "SATINTERNALCLIENT: CSatCPlayToneHandler::RunL exiting" )
    }

// -----------------------------------------------------------------------------
// CSatCPlayToneHandler::ExamineClientResponse
// Examine the client response.
// -----------------------------------------------------------------------------
//
void CSatCPlayToneHandler::ExamineClientResponse(
    TSatUiResponse aResponse,
    TBool aRequestedIconDisplayed )
    {
    LOG2( SIMPLE,
    "SATINTERNALCLIENT: CSatCPlayToneHandler::ExamineClientResponse calling,\
    aResponse: %x", aResponse )

    // Examine the client response.
    switch ( aResponse )
        {
        case ESatSuccess:
        case ESatSuccessToneNotPlayed: // for future use,
        // specified in ETSI spec but not currently implemented in etelsat.
            {
            // Convert terminal rsp if icon used
            RSat::TPCmdResult result( RSat::KSuccess );
            RSat::TIconQualifier iconQualifier(
                iPlayToneData.iIconId.iQualifier );

            if ( !aRequestedIconDisplayed )
                {
                LOG( SIMPLE,
                "SATINTERNALCLIENT: CSatCPlayToneHandler::ExamineClientResponse \
                aRequestedIconDisplayed false" )
                if ( iconQualifier == RSat::ESelfExplanatory ||
                     iconQualifier == RSat::ENotSelfExplanatory )
                    {
                    LOG( SIMPLE,
                    "SATINTERNALCLIENT: CSatCPlayToneHandler::ExamineClientResponse \
                    IconNotDisplayed" )
                    result = RSat::KSuccessRequestedIconNotDisplayed;
                    }
                }

            iPlayToneRsp.iGeneralResult = result;
            break;
            }
        case ESatFailure:
            {
            iPlayToneRsp.iInfoType = RSat::KMeProblem;
            iPlayToneRsp.iGeneralResult = RSat::KMeUnableToProcessCmd;
            iPlayToneRsp.iAdditionalInfo.SetLength( 1 );
            iPlayToneRsp.iAdditionalInfo[0] = RSat::KNoSpecificMeProblem;
            break;
            }
        case ESatSessionTerminatedByUser:
            {
            iPlayToneRsp.iGeneralResult = RSat::KPSessionTerminatedByUser;
            break;
            }
        case ESatBackwardModeRequestedByUser:
            {
            iPlayToneRsp.iGeneralResult =
                RSat::KBackwardModeRequestedByUser;
            break;
            }
        case ESatNoResponseFromUser:
            {
            iPlayToneRsp.iGeneralResult = RSat::KNoResponseFromUser;
            break;
            }
        case ESatCmdDataNotUnderstood:
            {
            iPlayToneRsp.iGeneralResult = RSat::KCmdDataNotUnderstood;
            iPlayToneRsp.iInfoType = RSat::KNoAdditionalInfo;
            iPlayToneRsp.iAdditionalInfo.Zero();
            break;
            }
        // No help is ever available with this command.
        case EHelpRequestedByUser:
        case EPCmdNotAcceptedByUser:
        default:
            {
            iSession->Panic( ESatInvalidResponse );
            break;
            }
        }

    LOG( SIMPLE,
        "SATINTERNALCLIENT: CSatCPlayToneHandler::ExamineClientResponse exiting" )
    }

// -----------------------------------------------------------------------------
// CSatCPlayToneHandler::DoCancel
// Cancels the pending request.
// -----------------------------------------------------------------------------
//
void CSatCPlayToneHandler::DoCancel()
    {
    LOG( SIMPLE, "SATINTERNALCLIENT: CSatCPlayToneHandler::DoCancel calling" )

    // Complete the request with cancel code.
    TRequestStatus* requestStatus = &iStatus;
    User::RequestComplete( requestStatus, KErrCancel );

    LOG( SIMPLE, "SATINTERNALCLIENT: CSatCPlayToneHandler::DoCancel exiting" )
    }