satengine/SatServer/SatInternalClient/src/CSatCGetInputHandler.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
*                Get Input proactive command.
*
*/


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

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

// -----------------------------------------------------------------------------
// CSatCGetInputHandler::CSatCGetInputHandler
// C++ default constructor can NOT contain any code, that
// might leave.
// -----------------------------------------------------------------------------
//
CSatCGetInputHandler::CSatCGetInputHandler(
    TInt aPriority,
    RSatUiSession* aSession ) :
    CActive( aPriority ),
    iSession( aSession ),
    iGetInputData(),
    iGetInputPckg( iGetInputData ),
    iGetInputRsp(),
    iGetInputRspPckg( iGetInputRsp )
    {
    LOG( SIMPLE,
        "SATINTERNALCLIENT: CSatCGetInputHandler::CSatCGetInputHandler calling" )

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

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

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

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

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

// Class destructor.
CSatCGetInputHandler::~CSatCGetInputHandler()
    {
    LOG( SIMPLE,
        "SATINTERNALCLIENT: CSatCGetInputHandler::~CSatCGetInputHandler calling" )

    // Cancel any outstanding requests.
    Cancel();

    iSession = NULL;

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

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

    // Empty the IPC data
    RSat::TGetInputV1 temp;
    iGetInputData = temp;
    RSat::TGetInputRspV1 temp2;
    iGetInputRsp = temp2;

    // Request Get Input notification.
    TIpcArgs arguments( &iGetInputPckg );

    // Pass the Get Input IPC package.
    iSession->CreateRequest( ESatSProactiveGetInput, arguments, iStatus );

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

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

// -----------------------------------------------------------------------------
// CSatCGetInputHandler::ConvertCharacterSet
// Converts USAT character set to SAT character set type.
// -----------------------------------------------------------------------------
//
TSatCharacterSet CSatCGetInputHandler::ConvertCharacterSet(
    const RSat::TGetInputRspFormat& aCharacterSet ) const
    {
    LOG( SIMPLE,
        "SATINTERNALCLIENT: CSatCGetInputHandler::ConvertCharacterSet calling" )

    TSatCharacterSet charSet( ESatCharSmsDefaultAlphabet );
    
    LOG2( SIMPLE,
    "SATINTERNALCLIENT: CSatCGetInputHandler::ConvertCharacterSet aCharacterSet: %d",
    aCharacterSet )
    
    if ( ( RSat::EDigitOnlyUnpacked == aCharacterSet ) ||
         ( RSat::EDigitOnlyPacked == aCharacterSet ) )
        {        
        charSet = ESatDigitOnly;
        }
    else if ( aCharacterSet == RSat::EUcs2Alphabet )
        {       
        charSet = ESatCharUcs2Alphabet;
        }
    else
        {        
        charSet = ESatCharSmsDefaultAlphabet;
        }

    LOG( SIMPLE,
        "SATINTERNALCLIENT: CSatCGetInputHandler::ConvertCharacterSet exiting" )
    return charSet;
    }

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

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

        // Renew the request
        Start();

        return;
        }

    // Determine the character set.
    const TSatCharacterSet characterSet(
        ConvertCharacterSet( iGetInputData.iRspFormat ) );

    // Determine whether user input should be hidden or not.
    TBool hideInput( EFalse );
    if ( RSat::EHideUserInput == iGetInputData.iInputDisplayOption )
        {
        LOG( SIMPLE, "SATINTERNALCLIENT: CSatCGetInputHandler::RunL EHideUserInput" )
        hideInput = ETrue;
        }

    // This will contain user input.
    TBuf<KSatGetInputEntrySize> inputText( iGetInputData.iDefaultText );

    // Indicates whether help is available
    TBool helpIsAvailable( EFalse );
    if ( RSat::EHelpAvailable == iGetInputData.iHelp )
        {
        LOG( SIMPLE, "SATINTERNALCLIENT: CSatCGetInputHandler::RunL EHelpAvailable" )
        helpIsAvailable = ETrue;
        }

    // Has to be casted to TInt before casting to TSatIconQualifier, because
    // GCC warns about the direct cast.
    const struct TSatIconId iconId = { iGetInputData.iIconId.iIdentifier,
        static_cast<TSatIconQualifier>(
            static_cast<TInt>( iGetInputData.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()->GetInputL(
        iGetInputData.iText,
        characterSet, inputText, iGetInputData.iRspLength.iMinRspLength,
        iGetInputData.iRspLength.iMaxRspLength, hideInput,
        helpIsAvailable, iconId, requestedIconDisplayed );

    // Use the same format in the response as it is in the input.
    iGetInputRsp.iRspFormat = iGetInputData.iRspFormat;

    // By default, this command does not have additional information.
    iGetInputRsp.iInfoType = RSat::KNoAdditionalInfo;
    iGetInputRsp.iAdditionalInfo.Zero();

    iGetInputRsp.SetPCmdNumber( iGetInputData.PCmdNumber() );

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

    // Pass the Get Input response package.
    TIpcArgs arguments( &iGetInputRspPckg );

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

    // Renew the service request.
    Start();

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

// -----------------------------------------------------------------------------
// CSatCGetInputHandler::ExamineClientResponse
// Examine the client response.
// -----------------------------------------------------------------------------
//
void CSatCGetInputHandler::ExamineClientResponse(
    TSatUiResponse aResponse,
    const TDes& aInputText,
    TBool aRequestedIconDisplayed )
    {
    LOG2( SIMPLE,
    "SATINTERNALCLIENT: CSatCGetInputHandler::ExamineClientResponse calling,\
    aResponse: %d", aResponse )

    // Examine the client response.
    switch ( aResponse )
        {
        case ESatSuccess:
            {

            // Convert terminal rsp if icon used
            RSat::TPCmdResult result( RSat::KSuccess );
            RSat::TIconQualifier iconQualifier(
                iGetInputData.iIconId.iQualifier );

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

            iGetInputRsp.iGeneralResult = result;
            LOG2( SIMPLE,
            "SATINTERNALCLIENT: CSatCGetInputHandler::ExamineClientResponse length \
            of aInputText: %d", aInputText.Length() )
            // Change the additional information type
            if ( aInputText.Length() > 0 )
                {
                iGetInputRsp.iInfoType = RSat::KTextString;

                // Save the character input by the user
                iGetInputRsp.iAdditionalInfo.Append( aInputText );
                }
            break;
            }

        // Otherwise, just return the response.
        case ESatFailure:
            {
            iGetInputRsp.iInfoType = RSat::KMeProblem;
            iGetInputRsp.iGeneralResult = RSat::KMeUnableToProcessCmd;
            iGetInputRsp.iAdditionalInfo.SetLength( 1 );
            iGetInputRsp.iAdditionalInfo[0] = RSat::KNoSpecificMeProblem;
            break;
            }

        case ESatSessionTerminatedByUser:
            {
            iGetInputRsp.iGeneralResult = RSat::KPSessionTerminatedByUser;
            break;
            }

        case ESatBackwardModeRequestedByUser:
            {
            iGetInputRsp.iGeneralResult =
                RSat::KBackwardModeRequestedByUser;
            break;
            }

        case ESatNoResponseFromUser:
            {
            iGetInputRsp.iGeneralResult = RSat::KNoResponseFromUser;
            break;
            }

        case EHelpRequestedByUser:
            {
            iGetInputRsp.iGeneralResult = RSat::KHelpRequestedByUser;
            break;
            }

        case EPCmdNotAcceptedByUser:
        case ESatCmdDataNotUnderstood:
        default:
            {
            iSession->Panic( ESatInvalidResponse );
            break;
            }
        }

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

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

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

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