phoneclientserver/phoneserver/Src/Ussd/CPhSrvUssdManager.cpp
changeset 46 2fa1fa551b0b
parent 42 35488577e233
child 48 78df25012fda
--- a/phoneclientserver/phoneserver/Src/Ussd/CPhSrvUssdManager.cpp	Mon Aug 23 15:50:31 2010 +0300
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,2192 +0,0 @@
-/*
-* Copyright (c) 2002-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:  USSD Manager.
-*
-*/
-
-// INCLUDE FILES
-#include "cphsrvussdmanager.h" 
-#include "phsrvutils.h" 
-#include "cphsrvussdsendhandler.h" 
-#include "cphsrvussdreceivehandler.h" 
-#include "cphsrvussdnotifynwrelease.h" 
-#include "cphsrvresourcemanager.h" 
-#include "cphsrvussdreplytimer.h" 
-#include "mphsrvussdmessagesentobserver.h" 
-#include "mphsrvphoneinterface.h" 
-#include "cphsrvussdsessioncancelwaiter.h" 
-
-#include <apacmdln.h>
-#include <apgtask.h>
-#include <bautils.h>
-#include <textresolver.h>
-#include <charconv.h>
-#include <gsmuelem.h>
-#include <exterror.h>
-#include <rmmcustomapi.h>
-
-#include <w32std.h>
-#include <apgcli.h>
-#include <cphcltussd.h> 
-#include <hbtextresolversymbian.h>
-#include <phoneserver.rsg> 
-#include "phsrvdebuginfo.h" 
-#include <e32property.h>
-#include <centralrepository.h>
-#include <coreapplicationuisdomainpskeys.h>
-
-
-// CONSTANTS
-const TInt KPhSrvDefaultValue = 0x00000000;
-// See SharedDataKeysVariant.h or NcnListInternalPSKeys.h
-// const TInt KPhSrvUssdNoTone = 0; 
-// const TInt KPhSrvUssdTimeOutObserverGranularity = 2;
-// const TInt KPhSrvUssdSentMessageObserverGranularity = 2;
-// See KUssdSecureId in phcltclientserver.h
-//const TInt KPhSrvUssdAppUID = 0x10005955; 
-
-const TInt KPhSrvUssdMessageQueryInterval = 500000; // 0.5 sec
-//const TInt KPhSrvUssdNoteExitPeriod = 500000; // 0.5 sec
-//
-const TUint KPhSrvUssdDefaultDCS = 0x0f;                        // 00001111
-
-const TUint KPhSrvUssdDcsAlphabetDefaultPrecededLanguage = 0x10;// 00010000
-const TUint KPhSrvUssdDcsAlphabetDefaultPrecededLanguageSkipChars3 = 3;
-const TUint KPhSrvUssdDcsAlphabetDefaultPrecededLanguageSkipChars2 = 2;
-const TUint KPhSrvUssdDcsAlphabetDefaultPrecededLanguageStartBit = 5;
-
-const TUint KPhSrvUssdDcsAlphabetUCS2PrecededLanguage = 0x11;   // 00010001
-const TUint KPhSrvUssdDcsAlphabetUCS2PrecededLanguageSkipChars = 2;
-
-const TUint KPhSrvUssdDcsGeneralInformationMask = 0xc0;         // 11000000
-const TUint KPhSrvUssdDcsGeneralInformation = 0x40;             // 01xxxxxx
-const TUint KPhSrvUssdDcsGeneralInformationCompressed = 0x20;   // xx1xxxxx
-const TUint KPhSrvUssdDcsGeneralInformationSimMask = 0x13;      // 00010011
-const TUint KPhSrvUssdDcsGeneralInformationSim = 0x12;          // xxx1xx10
-const TUint KPhSrvUssdDcsGeneralInformationAlphabetMask = 0x0c; // 00001100
-const TUint KPhSrvUssdDcsGeneralInformationAlphabet8Bit = 0x04; // xxxx01xx
-const TUint KPhSrvUssdDcsGeneralInformationAlphabetUCS2 = 0x08; // xxxx10xx
-
-const TUint KPhSrvUssdDcsMessageHandlingAlphabetMask = 0xf4;    // 11110100
-const TUint KPhSrvUssdDcsMessageHandlingAlphabet8Bit = 0xf4;    // 1111x1xx
-const TInt KPhrUssdNotifyArraySize = 1;
-
-// Refers to HbPopup::NoDismiss = 0
-const TInt KPhSrvUssdPopupDismissPolicy = 0; 
-// The time out only for testing, from CPhSrvUssdReplyTimer.cpp
-const TUint KPhSrvUssdTimeout = 300000000;
-
-// Use QT style localization
-_LIT(KUssdLocFilename, "ussd_");
-_LIT(KCommonLocFilename, "common_");
-_LIT(KLocPath, "z:\\resource\\qt\\translations");
-_LIT(KUssdReply, "txt_ussd_button_reply"); // Reply
-_LIT(KUssdExit, "txt_ussd_button_exit"); // Exit
-_LIT(KUssdNext, "txt_ussd_button_next"); //Next
-_LIT(KUssdYes, "txt_common_button_yes"); // Yes
-_LIT(KUssdNo, "txt_common_button_no"); // No
-_LIT(KUssdTitle, "txt_ussd_title_message"); // Message
-_LIT(KUssdDone, "txt_ussd_dpopinfo_done"); // Done
-_LIT(KUssdConfirm, "txt_ussd_info_there_are_still_unread_notifications");
-
-// MACROS
-
-#define _DPRINT_FLAGS() \
-    _DDPRINT( 4, "PhSrv.FLAGS.MsgTypeReply ", iMsgTypeReply ); \
-    _DDPRINT( 4, "PhSrv.FLAGS.NwReleased   ", iNetworkReleased ); \
-    _DDPRINT( 4, "PhSrv.FLAGS.SendingAck   ", iSendingAck ); \
-    _DDPRINT( 4, "PhSrv.FLAGS.AcksToBeSent ", iAcksToBeSent ); \
-    _DDPRINT( 4, "PhSrv.FLAGS.iSendRelease ", iSendRelease ); \
-    _DDPRINT( 4, "PhSrv.FLAGS.iClearArray  ", iClearArray ); \
-    _DDPRINT( 4, "PhSrv.FLAGS.iLaunchGMQ   ", iLaunchGMQ ); \
-    _DDPRINT( 4, "PhSrv.FLAGS.NotifyCount  ", NotifyCount() ); \
-    _DDPRINT( 4, "PhSrv.FLAGS.iShowDone    ", iShowDone ); 
-
-// ============================= LOCAL FUNCTIONS ===============================
-
-// CLASS DECLARATION
-
-#ifndef TPHSRVUSSDALPHABETPACKER_H
-#define TPHSRVUSSDALPHABETPACKER_H
-
-// CONSTANTS
-const TUint8 KPhSrvUssdCarriageReturn = 0x0d;
-
-/**
-*  Packs and unpacks data encoded in an Ussd alphabet.
-*
-*  @since 1.0
-*/
-class TPhSrvUssdAlphabetPacker
-    {
-    public:  // Constructors and destructor
-
-        /**
-        * Constructor.
-        *
-        * @param aAlphabet The alphabet that is used.
-        * @param aIsBinary Is the data binary, that will be converted.
-        * @param aStartBit The start bit for conversion.
-        */
-        TPhSrvUssdAlphabetPacker(
-            TSmsDataCodingScheme::TSmsAlphabet aAlphabet,
-            TBool aIsBinary,
-            TInt aStartBit );
-
-
-    public: // New functions
-
-        /**
-        * Unpacks 7-bit buffer to 8-bit buffer.
-        *
-        * @param aIn Descriptor where the 7-bit buffer is.
-        * @param aOut 8-bit buffer to set the result.
-        * @param aNumUDUnits Buffer length.
-        * @return Length of the result buffer.
-        */
-        TInt UnpackL(
-            const TDesC8& aIn,
-            TDes8& aOut,
-            TInt aNumUDUnits );
-
-        /**
-        * Unpacks 7-bit buffer to 8-bit and converts to unicode.
-        *
-        * @param aCharacterSetConverter Does the converting.
-        * @param aFs File server session.
-        * @param aIn Packed 7-bit buffer.
-        * @param aOut Unicode buffer.
-        * @param aNumUDUnits Number of charahters.
-        * @return Number of used octets in 8-bit buffer.
-        */
-        TInt UnpackAndConvertL(
-            CCnvCharacterSetConverter& aCharacterSetConverter,
-            RFs& aFs,
-            const TDesC8& aIn,
-            TDes& aOut,
-            TInt aNumUDUnits );
-
-        /**
-        * Counts the needed octet amout.
-        *
-        * @param aNumUDUnits Number of source characters.
-        * @return Octets needed.
-        */
-        TInt PackedOctetsRequiredL( TInt aNumUDUnits ) const;
-
-
-    private:
-
-        // Private helper methods
-        TInt ElementSizeInBitsL() const;
-
-
-    private:    // Data
-
-        // The used coding alphabet.
-        TSmsDataCodingScheme::TSmsAlphabet iAlphabet;
-
-        // Is the packed data binary.
-        TBool iIsBinary;
-
-        // The start bit for packing.
-        TInt iStartBit;
-    };
-
-#endif // TPHSRVUSSDALPHABETPACKER_H
-
-
-// -----------------------------------------------------------------------------
-// TPhSrvUssdAlphabetPacker::TPhSrvUssdAlphabetPacker
-// Constructor.
-//
-// -----------------------------------------------------------------------------
-//
-TPhSrvUssdAlphabetPacker::TPhSrvUssdAlphabetPacker(
-    TSmsDataCodingScheme::TSmsAlphabet aAlphabet,
-    TBool aIsBinary,
-    TInt aStartBit)
-    : iAlphabet( aAlphabet ),iIsBinary( aIsBinary ),iStartBit( aStartBit )
-    {
-    }
-
-
-// -----------------------------------------------------------------------------
-// TPhSrvUssdAlphabetPacker::UnpackL
-// Unpacks user data units from aIn and appends to aOut.
-//
-// -----------------------------------------------------------------------------
-//
-TInt TPhSrvUssdAlphabetPacker::UnpackL(
-    const TDesC8& aIn,
-    TDes8& aOut,
-    TInt aNumUDUnits )
-    {
-    TInt length = aNumUDUnits;
-    // Ensure we've got enough  output buffer
-    if ( aOut.Length() + length > aOut.MaxLength() )
-        {
-        User::Leave(KErrCorrupt);
-        }
-
-    TInt elementSizeInBits = ElementSizeInBitsL();
-    if ( elementSizeInBits == 8 ) // 8-bit data?
-        {
-        aOut.Append( aIn );
-        }
-    else if ( elementSizeInBits == 7 ) // need unpacking from 7-bit data
-        {
-        // Get raw pointers and do unpacking
-        TUint8* outPtr = ( TUint8* )aOut.Ptr() + aOut.Length();
-        const TUint8* inPtr = aIn.Ptr();
-
-        for ( TInt i = 0; i < length; i++ )
-            {
-            TInt from = ( *inPtr >> iStartBit ) & 0x7F; // Take seven bits
-            if ( iStartBit )
-                {
-                inPtr++;
-                // Take more from next byte
-                from |= ( *inPtr << ( 8 - iStartBit ) ) & 0x7F;
-                }
-            outPtr[i] = ( TUint8 ) from;
-            iStartBit = ( iStartBit + 7 ) % 8; // roll: 0,1,2,...,6,7,0,1,2...
-            }
-
-        // The last character will be ignored if message ends
-        // on an octet bounday with CR.
-        if ( outPtr[ length-1 ] == KPhSrvUssdCarriageReturn && iStartBit == 0 )
-            {
-            length--;
-            }
-        aOut.SetLength( aOut.Length() + length );
-        }
-    else
-        {
-        __ASSERT_DEBUG(EFalse,
-            PhoneServerUtils::Panic( EPhoneServerPanicModeLogicFault ) );
-        }
-    return length;
-    }
-
-
-// -----------------------------------------------------------------------------
-// TPhSrvUssdAlphabetPacker::UnpackAndConvertL
-// Unpacks the converts the input data, aIn, and appends to aOut
-//
-// -----------------------------------------------------------------------------
-//
-TInt TPhSrvUssdAlphabetPacker::UnpackAndConvertL(
-    CCnvCharacterSetConverter& aCharacterSetConverter,
-    RFs& aFs,
-    const TDesC8& aIn,
-    TDes& aOut,
-    TInt aNumUDUnits )
-    {
-
-    // Unpack first
-    HBufC8* unpackedBuffer = HBufC8::NewLC( aNumUDUnits );
-    TPtr8 unpackedBufferPtr( unpackedBuffer->Des() );
-    UnpackL( aIn, unpackedBufferPtr,aNumUDUnits );
-
-    // Convert
-    CSmsAlphabetConverter* converter =
-        CSmsAlphabetConverter::NewLC(
-            aCharacterSetConverter, aFs, iAlphabet, iIsBinary );
-
-    TPtrC convertedPtr = converter->ConvertToNativeL( *unpackedBuffer );
-    if ( convertedPtr.Length() > ( aOut.MaxLength() - aOut.Length() ) )
-        {
-        User::Leave( KErrCorrupt );
-        }
-    // Cleanup and return
-    aOut.Append( convertedPtr );
-    CleanupStack::PopAndDestroy( 2 );    // unpackedBuffer, converter
-    return aNumUDUnits;
-    }
-
-
-// -----------------------------------------------------------------------------
-// TPhSrvUssdAlphabetPacker::PackedOctetsRequiredL
-// Returns the number of octets needed to pack the specified number of
-//
-// -----------------------------------------------------------------------------
-//
-TInt TPhSrvUssdAlphabetPacker::PackedOctetsRequiredL( TInt aNumUDUnits ) const
-
-    {
-    TInt octetsRequired = 0;
-    TInt elementSizeInBits = ElementSizeInBitsL();
-    if ( elementSizeInBits == 8 )
-        {
-        octetsRequired=aNumUDUnits;
-        }
-    else
-        {
-        octetsRequired =
-            ( iStartBit+aNumUDUnits * elementSizeInBits + 7 ) / 8;  // Rounds up
-        }
-    return octetsRequired;
-    }
-
-// -----------------------------------------------------------------------------
-// TPhSrvUssdAlphabetPacker::ElementSizeInBitsL
-// Returns the size in bits of a UDL element for the alphabet.  Leaves if
-// invalid data coding scheme.
-// -----------------------------------------------------------------------------
-//
-TInt TPhSrvUssdAlphabetPacker::ElementSizeInBitsL() const
-    {
-    if (iIsBinary)
-        return 8;
-    switch ( iAlphabet )
-        {
-        case TSmsDataCodingScheme::ESmsAlphabet7Bit:
-            {
-            return 7;
-            }
-        case TSmsDataCodingScheme::ESmsAlphabet8Bit:
-        case TSmsDataCodingScheme::ESmsAlphabetUCS2:
-            {
-            return 8;
-            }
-        default:
-            {
-            User::Leave(KErrGsmSMSDataCodingSchemeNotSupported);
-            return 8;
-            }
-        }
-    }
-
-
-
-// ============================ MEMBER FUNCTIONS ===============================
-
-// -----------------------------------------------------------------------------
-// CPhSrvUssdManager::CPhSrvUssdManager
-//
-// Constructor
-//
-// -----------------------------------------------------------------------------
-//
-CPhSrvUssdManager::CPhSrvUssdManager(
-    RFs& aFsSession,
-    CPhSrvResourceManager& aResourceManager
-    )
-    :CActive( EPriorityLow ),
-     iFsSession( aFsSession ),
-     iResourceManager( aResourceManager ),
-     iDeviceDialog( NULL ),
-     iDCS ( KPhCltDcsUnknown ),
-     iReturnResultPckg ( iReturnResult ),
-     iTextResolver ( EFalse ),
-     iTextBuffer ( NULL )
-    {
-    CActiveScheduler::Add( this );
-    }
-
-
-// -----------------------------------------------------------------------------
-// CPhSrvUssdManager::~CPhSrvUssdManager
-//
-// Destructor
-//
-// -----------------------------------------------------------------------------
-//
-CPhSrvUssdManager::~CPhSrvUssdManager()
-    {
-    _DPRINT( 4, "PhSrv.~CPhSrvUssdManager.start" );
-
-
-    delete iUssdSendHandler;
-    iUssdSendHandler = NULL;
-
-    delete iUssdReceiveHandler;
-    iUssdReceiveHandler = NULL;
-
-    delete iUssdNotifyNWRelease;
-    iUssdNotifyNWRelease = NULL;
-
-    Cancel();
-
-    iTimer.Close();
-    
-    delete iTextBuffer;
-    iTextBuffer = NULL;
-    
-    delete iDeviceDialog;
-    iDeviceDialog = NULL;
-
-    if ( iNotifyArray )
-        {
-        iNotifyArray->Reset();
-        }
-    delete iNotifyArray;
-    if ( iUssdReplyTimer )
-        {
-        iUssdReplyTimer->Stop();
-        }
-    delete iUssdReplyTimer;
-    iUssdReplyTimer = NULL;
-
-    iFsSession.Close();
-
-    iMobileUssdMessaging.Close();
-    
-    delete iMoAckCallback;
-
-    _DPRINT( 4, "PhSrv.~CPhSrvUssdManager.end" );
-    }
-
-
-// -----------------------------------------------------------------------------
-// CPhSrvUssdManager::ConstructL
-//
-// Symbian OS 2nd phase constructor
-//
-// -----------------------------------------------------------------------------
-//
-void CPhSrvUssdManager::ConstructL( MPhSrvPhoneInterface& aPhoneInterface )
-    {
-    _DPRINT( 4, "PhSrv.ConstructL.Start" );
-    iTextResolver = HbTextResolverSymbian::Init( 
-        KUssdLocFilename, KLocPath );
-    _DDPRINT( 4, "PhSrv.ConstructL.ussd loc:", iTextResolver );
-    User::LeaveIfError( iTimer.CreateLocal() );
-
-    User::LeaveIfError( iMobileUssdMessaging.Open( aPhoneInterface.PhSrvMobilePhone() ) );
-
-    // Check support
-    RMobileUssdMessaging::TMobileUssdCapsV1 caps;
-    RMobileUssdMessaging::TMobileUssdCapsV1Pckg pckgCaps( caps );
-    User::LeaveIfError( iMobileUssdMessaging.GetCaps( pckgCaps ) );
-
-    if ( !( ( caps.iUssdTypes & RMobileUssdMessaging::KCapsMTUssd ) == 0 &&
-        ( caps.iUssdFormat & RMobileUssdMessaging::KCapsPackedString ) == 0 ) )
-        {
-        _DPRINT( 4, "PhSrv.CPhSrvUssdManager::ConstructL" );
-        iUssdReceiveHandler = new( ELeave ) CPhSrvUssdReceiveHandler(
-            *this,
-            iMobileUssdMessaging );
-        iUssdReceiveHandler->ConstructL();
-
-        iUssdNotifyNWRelease = new( ELeave )  CPhSrvUssdNotifyNWRelease(
-            *this,
-            iMobileUssdMessaging );
-
-        iUssdNotifyNWRelease->ConstructL();
-        }
-
-    iPhoneInterface = &aPhoneInterface;
-
-    SendHandlerL();
-    
-    iMoAckCallback = new (ELeave) CAsyncCallBack( TCallBack( MoAckCallback, this ), CActive::EPriorityIdle );
-
-    iVariantReadOnlyValues = KPhSrvDefaultValue;
-
-    User::LeaveIfError( GetTelephonyVariantData() );
-
-    _DDPRINT( 4, "PhSrv.ConstructL.iSatCanceled ", iSatCanceled );
-    _DDPRINT( 4, "PhSrv.ConstructL.iShowDone ", iShowDone );
-    iNotifyArray = new( ELeave ) CDesCArrayFlat( KPhrUssdNotifyArraySize );
-    _DPRINT( 4, "PhSrv.ConstructL.End" );
-    }
-
-
-// -----------------------------------------------------------------------------
-// CPhSrvUssdManager::SendHandlerL
-//
-// The send handler.
-//
-// -----------------------------------------------------------------------------
-//
-CPhSrvUssdSendHandler& CPhSrvUssdManager::SendHandlerL()
-    {
-    // If SendHandler is not created, first check that MO Ussd
-    // is supported by the TSY.
-    _DPRINT( 4, "PhSrv.SendHandlerL.Start" );
-    if ( iUssdSendHandler == NULL )
-        {
-        _DPRINT( 4, "PhSrv.SendHandlerL.iUssdSendHandler.NULL" );
-        RMobileUssdMessaging::TMobileUssdCapsV1 caps;
-        RMobileUssdMessaging::TMobileUssdCapsV1Pckg pckgCaps( caps );
-        User::LeaveIfError( iMobileUssdMessaging.GetCaps( pckgCaps ) );
-        _DPRINT( 4, "PhSrv.SendHandlerL.iMobileUssdMessaging.GetCaps" );
-
-        if ( ( caps.iUssdTypes & RMobileUssdMessaging::KCapsMOUssd ) == 0 ||
-            ( caps.iUssdFormat & RMobileUssdMessaging::KCapsPackedString )
-            == 0 )
-            {
-            _DPRINT( 4, "PhSrv.SendHandlerL.KErrNotSupported" );
-            User::Leave( KErrNotSupported );
-            }
-
-        iUssdSendHandler =
-            new( ELeave ) CPhSrvUssdSendHandler(
-                *this,
-                iMobileUssdMessaging,
-                *iPhoneInterface );
-        }
-    _DPRINT( 4, "PhSrv.SendHandlerL.End" );
-    return *iUssdSendHandler;
-    }
-
-
-// -----------------------------------------------------------------------------
-// CPhSrvUssdManager::SendUssdL
-//
-// Send the USSD message.
-//
-// -----------------------------------------------------------------------------
-//
-void CPhSrvUssdManager::SendUssdL(
-    const TDesC8& aMsgData,
-    RMobileUssdMessaging::TMobileUssdAttributesV1& aMsgAttribute,
-    MPhSrvUssdMessageSentObserver& aObserver )
-    {
-    _DPRINT( 4, "PhSrv.SendUssdL.Start ######" );
-    _DPRINT_FLAGS();
-    
-    if ( iObserver && iNetworkReleased ) 
-        {
-        // Network has been released but the previous send request is still alive.
-        // Cancel the pervious send operation, complete the old request with error
-        // and clean up the pointer.
-        _DPRINT( 4, "PhSrv.SendUssdL.Error.Complete.Existing" );
-        if ( iUssdSendHandler ) 
-            {
-            iUssdSendHandler->Cancel();
-            }
-        iObserver->UssdMessageSentObserverHandleResult( KErrSessionClosed );
-        iObserver = NULL;
-        }
-    
-    if ( iObserver || iSendingAck )
-        {
-        _DPRINT( 4, "PhSrv.SendUssdL.KErrInUse" );
-        // Other client is using the service.
-        User::Leave( KErrInUse );
-        }
-
-    // Check that message type is set
-    if( ( aMsgAttribute.iFlags & RMobileUssdMessaging::KUssdMessageType )
-        == 0 )
-        _DPRINT( 4, "PhSrv.SendUssdL.KUssdMessageType.0" );
-        {
-        // Mesasge type not set -> Set it.
-        aMsgAttribute.iFlags |= RMobileUssdMessaging::KUssdMessageType;
-        if ( NetworkWaitingForAnAnswer() )
-            {
-            // Network is waiting for an answer
-            _DPRINT( 4, "PhSrv.SendUssdL.EUssdMOReply" );   // debug print
-            aMsgAttribute.iType = RMobileUssdMessaging::EUssdMOReply;
-            }
-        else
-            {
-            _DPRINT( 4, "PhSrv.SendUssdL.EUssdMORequest" );  // debug print
-            aMsgAttribute.iType = RMobileUssdMessaging::EUssdMORequest;
-            }
-        }
-        
-    RMobileUssdMessaging::TMobileUssdAttributesV1Pckg attribs( aMsgAttribute );
-    iShowDone = ETrue;
-    _DPRINT( 4, "PhSrv.SendUssdL.iShowDone.ETrue" );
-    _DPRINT( 4, "PhSrv.SendUssdL.Send" );
-    SendHandlerL().SendUssdL( aMsgData , attribs );
-    iObserver = &aObserver;
-    // Not closing nor closed anymore
-    iNetworkReleased = EFalse;
-    iSendRelease = EFalse;
-    iClearArray = EFalse;
-    
-    // Reply timer can be killed here... Receive event might come right after this
-    // which will setup the timer again if needed.
-    if ( NetworkWaitingForAnAnswer() )
-        {
-        _DPRINT( 4, "PhSrv.SendUssdCancel.TimerStop" );   // debug print
-        iUssdReplyTimer->Stop();
-        }
-    _DPRINT( 4, "PhSrv.SendUssdL.End" );
-    }
-
-// -----------------------------------------------------------------------------
-// CPhSrvUssdManager::NetworkWaitingForAnAnswer
-// -----------------------------------------------------------------------------
-//
-TBool CPhSrvUssdManager::NetworkWaitingForAnAnswer() 
-    {
-    return iUssdReplyTimer && iUssdReplyTimer->IsTimerActive();
-    }
-// -----------------------------------------------------------------------------
-// CPhSrvUssdManager::SendUssdCancel
-//
-// Cancel the USSD sending.
-//
-// -----------------------------------------------------------------------------
-//
-void CPhSrvUssdManager::SendUssdCancel()
-    {
-    _DPRINT( 4, "PhSrv.SendUssdCancel.Start #######" );
-
-    // Ack sending should not be canceled unless it's about terminating
-    // the whole session
-    _DPRINT_FLAGS();
-    if ( !iSendingAck || iSendRelease ) 
-        {
-        _DPRINT( 4, "PhSrv.SendUssdCancel.DoingCancel" );
-        iUssdSendHandler->SendUssdCancel();
-        }
-
-    if ( iHavePendingSatMessagePointer )
-        {
-        _DPRINT( 4, "PhSrv.SendUssdCancel.SatCancel" );
-        iSatCanceled = ETrue;
-        }
-    iObserver = NULL;
-    
-    SetActiveIfPendingNotificationsExist();
-    _DPRINT( 4, "PhSrv.SendUssdCancel.End" );
-    }
-
-// -----------------------------------------------------------------------------
-// CPhSrvUssdManager::SetActiveIfPendingNotificationsExist
-// -----------------------------------------------------------------------------
-//
-void CPhSrvUssdManager::SetActiveIfPendingNotificationsExist()
-    {
-    if ( !IsActive() && NotifyCount() > 0 )
-        {
-        _DPRINT( 4, "PhSrv.AcrtivateIf.NotActiveSelf" );
-        iLaunchGMQ = ETrue;
-        iNotifyMessage = ETrue;
-        _DPRINT( 4, "PhSrv.SendUssdCancel.iNotifyMessage.ETrue" );
-        iTimer.After( iStatus , KPhSrvUssdMessageQueryInterval );
-        SetActive();
-        _DPRINT_FLAGS();
-        _DDPRINT( 4, "PhSrv.AcrtivateIf.SetActive ", iStatus.Int() );
-        }
-    }
-// -----------------------------------------------------------------------------
-// CPhSrvUssdManager::UssdNetworkObserverHandleSendEventL
-//
-//
-//
-// -----------------------------------------------------------------------------
-//
-void CPhSrvUssdManager::UssdNetworkObserverHandleSendEventL( TInt aError )
-    {
-    // debug print
-    _DDPRINT(
-        4,
-        "PhSrv.UssdNetworkObserverHandleSendEventL.Start: ##### ",
-        aError );
-
-    // complete SAT if needed
-    if ( aError < KErrNone )
-        {
- 
-        _DPRINT( 4, "PhSrv.UssdNetworkObserverHandleSendEventL.CompleteSat" );
-        CompleteSatL( NULL, aError );
-        }
-
-    if ( iObserver )
-        {
- 
-        _DPRINT( 4, "PhSrv.UssdNetworkObserverHandleSendEventL.Observer" );
-
-        iObserver->UssdMessageSentObserverHandleResult( aError );
-        iObserver = NULL;
-        }
-    
-    iSendingAck = EFalse;
-    
-    AsyncProcessMoAcks();
-    
-    // debug print
-    _DPRINT( 4, "PhSrv.UssdNetworkObserverHandleSendEventL.End" );
-    }
-
-
-// -----------------------------------------------------------------------------
-// CPhSrvUssdManager::UssdAppTaskExists
-//
-//
-//
-// -----------------------------------------------------------------------------
-//
-TBool CPhSrvUssdManager::UssdAppTaskExistsL()
-{   
-    TBool ret = EFalse;
-    RWsSession wsSession;
-    User::LeaveIfError(wsSession.Connect());
-    _DPRINT( 4, "PhSrv.UssdAppTaskExists.wsSession.Connect" );
-    CleanupClosePushL(wsSession);
-    TApaTaskList tasklist(wsSession);
-    TApaTask task = tasklist.FindApp( KUssdSecureId );
-    ret = task.Exists();
-
-    CleanupStack::PopAndDestroy();
-    return ret;
-}
-
-// -----------------------------------------------------------------------------
-// CPhSrvUssdManager::UssdNetworkObserverHandleReceivedEventL
-//
-//
-//
-// -----------------------------------------------------------------------------
-//
-void CPhSrvUssdManager::UssdNetworkObserverHandleReceivedEventL(
-    const TDes8& aMsgData,
-    const RMobileUssdMessaging::TMobileUssdAttributesV1& aMsgAttributes,
-    TInt aError )
-    {
-    _DDPRINT(
-        4,
-        "PhSrv.UssdNetworkObserverHandleReceivedEventL.Start: ### ",
-        aError );
-    _DPRINT_FLAGS();
-    if ( aError != KErrNone )
-        {
-        TurnLightsOn(); //Ensure lights on
- 
-        _DPRINT( 4, "PhSrv.UssdNetworkObserverHandleReceivedEventL.ShErNote" );
-        ShowErrorNoteL( aError );
-        }
-    else if ( iSendRelease )
-        {
-        // Ignore if sendrelease is to be done. If the message was
-        _DPRINT( 4, "PhSrv.UssdNetworkObserverHandleReceivedEventL.SendRelease.Ignore" );
-        }
-    else
-        {
-        UssdHandleReceivedEventL( aMsgData, aMsgAttributes );
-        }
-    }
-
-// -----------------------------------------------------------------------------
-// CPhSrvUssdManager::UssdHandleReceivedEventL
-// -----------------------------------------------------------------------------
-//
-void CPhSrvUssdManager::UssdHandleReceivedEventL(
-    const TDes8& aMsgData,
-    const RMobileUssdMessaging::TMobileUssdAttributesV1& aMsgAttributes )
-    {
-    // This always is either ongoing transaction or starting a new based
-    // on incoming message, mark transaction to be open.
-    iNetworkReleased = EFalse;
-        
-    // 2. Complete Send with some positive value.
-    if ( iObserver )
-        {
- 
-        _DPRINT( 4, "PhSrv.UssdHandleReceivedEventL.Observer" );
-        UssdNetworkObserverHandleSendEventL( 1 ); // some positive value
-        }
-    
-    if ( aMsgAttributes.iFlags&RMobileUssdMessaging::KUssdMessageType &&
-         aMsgAttributes.iType == RMobileUssdMessaging::EUssdMTRequest )
-        {
-        // 3. Stop old reply timer and start new one if needed.
-        RestartReplyTimerL();
-        _DPRINT( 4, "PhSrv.UssdNetworkObserverHandleReceivedEventL.Timer.Stop" );
-        _DPRINT( 4, "PhSrv.UssdNetworkObserverHandleReceivedEventL.Timer.New" );
-        }
-    _DPRINT( 4, "PhSrv.UssdHandleReceivedEventL.Decode" );
-    TUint8 dcs = KPhSrvUssdDefaultDCS;
-    if(aMsgAttributes.iFlags & RMobileUssdMessaging::KUssdMessageDcs)
-        {
-        dcs = aMsgAttributes.iDcs;
-        }
-    iDecodedMessage.Zero();
-    iReceivedMessage.Zero();
-    DecodeL(aMsgData, iDecodedMessage, dcs);
-    if(iDecodedMessage.Length() > 0)
-        {
-        iReceivedMessage = iDecodedMessage;
-        }
-    // 5. Show note.
-    // debug print
-    _DPRINT( 4, "PhSrv.UssdHandleReceivedEventL.Note" );
-    if ( !( aMsgAttributes.iFlags & RMobileUssdMessaging::KUssdMessageType ) ||
-            aMsgAttributes.iType != RMobileUssdMessaging::EUssdMTRequest )
-        {
-        if ( !ShowNotesL() )
-            {
-     
-            _DPRINT( 4,
-                "PhSrv.UssdHandleReceivedEventL.SAtReturn" );
-            return;
-            }
-        }
-
-    // empty string is handled as ok message
-    if ( !iDecodedMessage.Length() )
-        {
-        TurnLightsOn(); //Ensure lights on
- 
-        _DPRINT( 4,
-            "PhSrv.UssdHandleReceivedEventL.EmptyString" );
-        
-        ShowDoneNoteL();
-
- 
-        _DPRINT( 4,
-            "PhSrv.UssdHandleReceivedEventL.EmptyString.OK" );
-        }
-    else
-        {
-        _DPRINT( 4, "PhSrv.UssdHandleReceivedEventL.String" );
-        iNotifyMessage = ( aMsgAttributes.iType == RMobileUssdMessaging::EUssdMTNotify );
-        _DDPRINT( 4, "PhSrv.UssdHandleReceivedEventL.iNotifyMessage: ", iNotifyMessage );
-        _DDPRINT( 4, "PhSrv.UssdNOHREventL.iNotifyMessage: ", iNotifyMessage );
-        iMsgTypeReply = ( aMsgAttributes.iType == RMobileUssdMessaging::EUssdMTReply );
-        _DDPRINT( 4, "PhSrv.UssdHandleReceivedEventL.iMsgTypeReply: ", iMsgTypeReply );
-        
-        if ( iNotifyMessage ) 
-            {
-            // need to send an MO ack
-            iAcksToBeSent ++;
-            }
-        
-        if ( !iDeviceDialog  ){
-            iDeviceDialog = CHbDeviceMessageBoxSymbian::NewL(
-                CHbDeviceMessageBoxSymbian::EInformation );
-            iDeviceDialog->SetObserver( this );
-            iDeviceDialog->SetTimeout( KPhSrvUssdTimeout );
-            iDeviceDialog->SetDismissPolicy ( KPhSrvUssdPopupDismissPolicy );
-            
-            // Show left key with empty string accoring to ui concept
-            iDeviceDialog->SetButton( 
-                CHbDeviceMessageBoxSymbian::EAcceptButton, EFalse );
-            // Show Exit Key always
-            iDeviceDialog->SetButton( 
-                CHbDeviceMessageBoxSymbian::ERejectButton, ETrue );
-            iDeviceDialog->SetButtonTextL(
-                CHbDeviceMessageBoxSymbian::ERejectButton, 
-                LoadDefaultString( KUssdExit ) );
-            _DPRINT( 4, "PhSrv.UssdHandleReceivedEventL.Exit" );             
-        }
-      
-        if ( iNotifyMessage || iMsgTypeReply )
-            {
-            //This is for reply message in notifyarray
-            iNotifyMessage = ETrue;
-            _DDPRINT( 4, "PhSrv.UssdHandleReceivedEventL.iNotifyMessage: ", iNotifyMessage );
-
-            //Notify added to array
-            iNotifyArray->AppendL( iReceivedMessage );
-
-            _DPRINT( 4, "PhSrv.UssdHandleReceivedEventL.AppendL" );
-            UpdateNotifyMessageL();
-
-            if ( !iSendRelease && NotifyCount() <= 1 )
-                {
-                _DPRINT( 4, "PhSrv.UssdHandleReceivedEventL.!SendRelease.Cancel" );
-                Cancel();
-                }
-            }
-        else
-            {
-            // New message deletes old message, i.e. Cancel existing query.
-            Cancel();
-            _DPRINT( 4, "PhSrv.UssdHandleReceivedEventL.NewAnswerable" );
-            }
-
-        // Remove Reply key
-        if( !( aMsgAttributes.iFlags & RMobileUssdMessaging::KUssdMessageType )
-             || aMsgAttributes.iType != RMobileUssdMessaging::EUssdMTRequest )
-            {
-            // Remove Answer key
-            iDeviceDialog->SetButton( 
-                CHbDeviceMessageBoxSymbian::EAcceptButton, EFalse );
-            _DPRINT( 4, "PhSrv.UssdHandleReceivedEventL.NoAnswer" ); 
-            }
-        // Show Reply key
-        else
-            {
-            iDeviceDialog->SetButton( 
-                CHbDeviceMessageBoxSymbian::EAcceptButton, ETrue );              
-            iDeviceDialog->SetButtonTextL(
-                CHbDeviceMessageBoxSymbian::EAcceptButton, 
-                LoadDefaultString( KUssdReply ) ); 
-            _DPRINT( 4, "PhSrv.UssdHandleReceivedEventL.WithAnswer" ); 
-            }
-
- 
-        _DPRINT( 4,
-            "PhSrv.UssdHandleReceivedEventL.String.Middle" );
-
-        // Play the USSD tone if needed. Logically should be in RunL, but here
-        // to give better balancing with voice and visible message.
-        // <-- QT PHONE START-->
-        /*
-        if ( IsTelephonyFeatureSupported( KTelephonyLVFlagUssdTone ) )
-            {
-            _DPRINT( 4, "PhSrv.UssdHandleReceivedEventL.PlayTone" );
-            PlayUssdTone();
-            }
-        */
-            // <-- QT PHONE END-->
-        // Launch the new message query
-        if ( !IsActive() )
-            {
-            iLaunchGMQ = ETrue;
-            iTimer.After( iStatus , KPhSrvUssdMessageQueryInterval );
-            SetActive();
-            }
-        AsyncProcessMoAcks();
-        }
-    _DPRINT( 4, "PhSrv.UssdHandleReceivedEventL.Editor" );
-    if( aMsgAttributes.iType == RMobileUssdMessaging::EUssdMTRequest && UssdAppTaskExistsL() )
-        {
-        iEmptyEditor = ETrue;
-        }
-    _DPRINT( 4, "PhSrv.UssdHandleReceivedEventL.End" );
-    }
-
-// -----------------------------------------------------------------------------
-// CPhSrvUssdManager::RestartReplyTimerL
-//
-//
-//
-// -----------------------------------------------------------------------------
-//
-void CPhSrvUssdManager::RestartReplyTimerL()
-    {
-    if ( iUssdReplyTimer )
-        {
-        _DPRINT( 4, "PhSrv.RestartReplyTimerL.Stop" );
-        iUssdReplyTimer->Stop();
-        }
-
-    if ( !iUssdReplyTimer )
-        {
-        _DPRINT( 4, "PhSrv.RestartReplyTimerL.New" );
-        iUssdReplyTimer = CPhSrvUssdReplyTimer::NewL( *this );
-        }
-    
-    _DPRINT( 4, "PhSrv.RestartReplyTimerL.Start" );
-    iUssdReplyTimer->Start();
-    }
-
-// -----------------------------------------------------------------------------
-// CPhSrvUssdManager::UssdNetworkObserverHandleNotifyNWReleaseL
-//
-//
-//
-// -----------------------------------------------------------------------------
-//
-void CPhSrvUssdManager::UssdNetworkObserverHandleNotifyNWReleaseL(
-const RMobilePhone::TMobilePhoneSendSSRequestV3 & aReturnResult,
-TInt aError )
-    {
-    _DDPRINT( 4, "PhSrv.UssdNotifyNWRelease ##### ", aError ); // debug print
-    _DPRINT_FLAGS();
-    TBool showNotes = ShowNotesL();
-    iNetworkReleased = ETrue;
-    iSendingAck = EFalse;
-    iSendRelease = EFalse;
-    iAcksToBeSent = 0;
-    
-    if ( iHavePendingSatMessagePointer )
-        {
-        iReturnResult = aReturnResult;
-        if ( !iSatCanceled )
-            {
-            CompleteSatL(&iReceivedMessage, aError );
-            _DPRINT( 4, "PhSrv.UssdNetworkObserverHandleNotifyNWReleaseL.CompleteSat" );
-            }
-        }
-    if ( iUssdReplyTimer && iUssdReplyTimer->IsTimerActive() )
-        {
-        _DPRINT( 4, "PhSrv.UssdNetworkObserverHandleNotifyNWReleaseL.Timer.Stop" );
-        iUssdReplyTimer->Stop();
-        Cancel();
-        CheckArray();
-        }
-    if ( showNotes && iShowDone )
-        {
-        ShowDoneNoteL();
-        }
-    if ( iUssdSendHandler && iSendingAck ) 
-        {
-        // if we are sending ack, it can be canceled.
-        iUssdSendHandler->Cancel();
-        }
-    
-    iSatCanceled = EFalse;
-    _DPRINT( 4, "PhSrv.UssdNetworkObserverHandleNotifyNWReleaseL.iSatCanceled.EFalse" );
-    iShowDone = EFalse;
-    _DPRINT( 4, "PhSrv.UssdNetworkObserverHandleNotifyNWReleaseL.Ending" );
-    _DPRINT_FLAGS();
-    _DPRINT( 4, "PhSrv.UssdNetworkObserverHandleNotifyNWReleaseL.End" );
-    }
-
-// -----------------------------------------------------------------------------
-// CPhSrvUssdManager::ShowDoneNoteL
-//
-// -----------------------------------------------------------------------------
-//
-void CPhSrvUssdManager::ShowDoneNoteL()
-    {
-    _DDPRINT( 4, "PhSrv.ShowDoneNoteL.iShowDone", iShowDone );
-    // Show global confirmation note "Done"
-    CHbDeviceMessageBoxSymbian::InformationL(
-        LoadDefaultString( KUssdDone ) );
-    iShowDone = EFalse;
-    }
-
-// -----------------------------------------------------------------------------
-// CPhSrvUssdManager::ShowErrorNoteL
-//
-// -----------------------------------------------------------------------------
-//
-void CPhSrvUssdManager::ShowErrorNoteL( TInt aError )
-    {
-    _DDPRINT( 4, "PhSrv.ShowErrorNoteL.Start ", aError );
-    if ( aError == KErrCancel )
-        {
-        _DPRINT( 4, "PhSrv.ShowErrorNoteL.Return" );
-        return;
-        }
-
-    // Show specific error message
-    CTextResolver* textResolver = CTextResolver::NewLC();
-    HBufC* buffer = textResolver->ResolveErrorString( aError ).AllocLC();
-
-    CHbDeviceMessageBoxSymbian::InformationL( buffer ->Des() );
-
-    CleanupStack::PopAndDestroy( buffer ); 
-    CleanupStack::PopAndDestroy( textResolver ); 
-    
-    
-    _DPRINT( 4, "PhSrv.ShowErrorNoteL.End" );
-    return;
-    }
-
-
-// -----------------------------------------------------------------------------
-// CPhSrvUssdManager::DecodeL
-//
-// -----------------------------------------------------------------------------
-//
-void CPhSrvUssdManager::DecodeL(
-    const TDesC8& aSrc,
-    TDes& aDes ,
-    TUint8 aDcs )
-    {
-    _DPRINT( 4, "PhSrv.DecodeL.Start" );
-    aDes.Zero();
-    CCnvCharacterSetConverter* charConv = CCnvCharacterSetConverter::NewLC();
-
-    iDCS = KPhCltDcsUnknown; // default
-
-    // Check DCS
-    TSmsDataCodingScheme::TSmsAlphabet alphabet =
-        TSmsDataCodingScheme::ESmsAlphabet7Bit; // default
-    TUint cutChars = 0;
-    TUint startBit = 0;
-
-    // Codes from GSM 03.38
-    if ( aDcs == KPhSrvUssdDcsAlphabetDefaultPrecededLanguage )
-        {
-        FindFirstCarriageReturnL( aSrc , cutChars , startBit );
-        }
-    else if ( aDcs == KPhSrvUssdDcsAlphabetUCS2PrecededLanguage )
-        {
-        alphabet = TSmsDataCodingScheme::ESmsAlphabetUCS2;
-        cutChars = KPhSrvUssdDcsAlphabetUCS2PrecededLanguageSkipChars;
-        }
-    else if ( (aDcs&KPhSrvUssdDcsGeneralInformationMask)  ==
-            KPhSrvUssdDcsGeneralInformation ) // General data coding information
-        {
-        //Is text compressed?
-        if ( aDcs & KPhSrvUssdDcsGeneralInformationCompressed )
-            {
-            _DPRINT( 4, "PhSrv.DecodeL.KErrNotSupported" );
-            User::Leave( KErrNotSupported );
-            }
-        // Is SIM specific message
-        else if ( ( aDcs & KPhSrvUssdDcsGeneralInformationSimMask )
-                   == KPhSrvUssdDcsGeneralInformationSim )
-            {
-            _DPRINT( 4, "PhSrv.DecodeL.KErrAbort" );
-            User::Leave( KErrAbort ); // Do not show any messages
-            }
-        // 8 bit data?
-        else if ( ( aDcs&KPhSrvUssdDcsGeneralInformationAlphabetMask ) ==
-                   KPhSrvUssdDcsGeneralInformationAlphabet8Bit )
-            {
-            alphabet = TSmsDataCodingScheme::ESmsAlphabet8Bit;
-            }
-        // UCS2 bit data?
-        else if ( ( aDcs&KPhSrvUssdDcsGeneralInformationAlphabetMask ) ==
-                   KPhSrvUssdDcsGeneralInformationAlphabetUCS2 )
-            {
-            alphabet = TSmsDataCodingScheme::ESmsAlphabetUCS2;
-            }
-        }
-    // Data coding/message handling
-    else if ( ( aDcs & KPhSrvUssdDcsMessageHandlingAlphabetMask )
-               == KPhSrvUssdDcsMessageHandlingAlphabet8Bit )
-        {
-        alphabet = TSmsDataCodingScheme::ESmsAlphabet8Bit;
-        }
-
-    TPhSrvUssdAlphabetPacker* packer =
-        new ( ELeave ) TPhSrvUssdAlphabetPacker( alphabet , EFalse, startBit );
-    CleanupStack::PushL( packer );
-
-    if ( alphabet == TSmsDataCodingScheme::ESmsAlphabet7Bit )
-        {
-        TInt numberOfElem = ( ( aSrc.Length() - cutChars ) * 8 - startBit ) / 7;
-        packer->UnpackAndConvertL(
-            *charConv ,
-            iFsSession ,
-            aSrc.Right( aSrc.Length() - cutChars ),
-            aDes ,
-            numberOfElem );
-
-        // DCS was 7-bit data.
-        iDCS = KPhCltDcs7Bit;
-        }
-    else // ESmsAlphabet8Bit || ESmsAlphabetUCS2
-        {
-        CSmsAlphabetConverter* converter =
-            CSmsAlphabetConverter::NewLC(
-                *charConv , iFsSession,alphabet,EFalse );
-
-        aDes = converter->ConvertToNativeL(
-            aSrc.Right( aSrc.Length() - cutChars ) );
-        CleanupStack::PopAndDestroy( converter );
-
-        if( alphabet == TSmsDataCodingScheme::ESmsAlphabet8Bit )
-            {
-            // DCS was 8-bit data.
-            iDCS = KPhCltDcs8Bit;
-            }
-        else if( alphabet == TSmsDataCodingScheme::ESmsAlphabetUCS2 )
-            {
-            // DCS was UCS2 data.
-            iDCS = KPhCltDcsUcs2;
-            }
-        // If DCS not 8-bit or UCS2, then EPhCltDcsUnknown is returned.
-        }
-
-    //
-    CleanupStack::PopAndDestroy(2); // packer, charConv
-    _DPRINT( 4, "PhSrv.DecodeL.End" );
-    }
-
-
-// -----------------------------------------------------------------------------
-// CPhSrvUssdManager::FindFirstCarriageReturnL
-// -----------------------------------------------------------------------------
-//
-void CPhSrvUssdManager::FindFirstCarriageReturnL(
-    const TDesC8& aBuffer ,
-    TUint& aSkipChars ,
-    TUint& aStartBit )
-    {
-    _DPRINT( 4, "PhSrv.FindFirstCarriageReturnL.Start" );
-    if ( aBuffer.Length() < 3 )
-        {
-        _DPRINT( 4, "PhSrv.FindFirstCarriageReturnL.KErrUnderflow" );
-        User::Leave( KErrUnderflow );
-        }
-
-    aSkipChars = 0;
-    aStartBit = 0;
-
-    // Try out two different cases:
-    // 1. Find CR from thrid byte
-    // 2. Find CR from second byte, starting from bit 6
-
-    // 1.:
-    if ( aBuffer[2] == KPhSrvUssdCarriageReturn )
-        {
-        aSkipChars = KPhSrvUssdDcsAlphabetDefaultPrecededLanguageSkipChars3;
-        aStartBit = 0;
-        _DPRINT( 4, "PhSrv.FindFirstCarriageReturnL.ThirdByte.Return" );
-        return;
-        }
-
-    // 2.:
-    // First put the pieces together and then compare
-    // Take last 2 bits from the second byte:
-    TUint result1 = aBuffer[1];
-    result1 = result1 >> 6;
-
-    // Take first 5 bits from the third byte:
-    TUint result2 = aBuffer[2];
-    result2 = result2 & 0x1f; // bits 0-4.
-    result2 = result2 << 2; // move to bits 2-6.
-
-    TUint result = result1 + result2; // 0000 00xx + 0xxx xx00
-    if ( result == KPhSrvUssdCarriageReturn )
-        {
-        aSkipChars = KPhSrvUssdDcsAlphabetDefaultPrecededLanguageSkipChars2;
-        aStartBit = KPhSrvUssdDcsAlphabetDefaultPrecededLanguageStartBit;
-        _DPRINT( 4, "PhSrv.FindFirstCarriageReturnL.SecondByte.Return" );
-        return;
-        }
-
-    // Is was not case 1. or 2. so we are not supporting sort of string.
-    User::Leave( KErrNotSupported );
-    _DPRINT( 4, "PhSrv.FindFirstCarriageReturnL.KErrNotSupported" );
-    }
-
-
-// -----------------------------------------------------------------------------
-// CPhSrvUssdManager::UssdReplyTimerObserverHandleExpired
-//
-//
-//
-// -----------------------------------------------------------------------------
-//
-void CPhSrvUssdManager::UssdReplyTimerObserverHandleExpiredL( TInt aError )
-    {
-    _DDPRINT( 4, "PhSrv.ReplyTimer.Start.aError ", aError );     // debug print
-    delete iUssdReplyTimer;
-    iUssdReplyTimer = NULL;
-
-    if ( aError == KErrNone &&
-         IsActive() &&
-         iDeviceDialog ) 
-        {
-        Cancel();
-        // Terminates USSD session.
-        _DPRINT( 4, "PhSrv.ReplyTimer.SendRelease" );     // debug print
-        if ( iNotifyArray ) 
-            {
-            iNotifyArray->Reset();
-            }
-        TryCloseSession();
-        }
-    _DPRINT( 4, "PhSrv.ReplyTimer.End" );     // debug print
-    }
-
-
-// -----------------------------------------------------------------------------
-// CPhSrvUssdManager::MessageBoxClosed
-// -----------------------------------------------------------------------------
-//       
-void CPhSrvUssdManager::MessageBoxClosed(
-    const CHbDeviceMessageBoxSymbian* aMessageBox,
-    CHbDeviceMessageBoxSymbian::TButtonId aButton)
-    {
-    _DPRINT( 4, "PhSrv.MsgClose.Start" );
-    // ussd device dialog observer callback function
-    TPtrC leftBtn = aMessageBox->ButtonText( 
-        CHbDeviceMessageBoxSymbian::EAcceptButton );
-    TPtrC rightBtn = aMessageBox->ButtonText( 
-        CHbDeviceMessageBoxSymbian::ERejectButton );    
-
-    TInt err = KErrNone;
-    // Click Yes on Confirmation note (Yes, No) 
-    if ( !leftBtn.Compare( 
-          LoadDefaultString( KUssdYes ) ) && 
-          ( CHbDeviceMessageBoxSymbian::EAcceptButton == aButton ) )
-        {
-        _DPRINT( 4, "PhSrv.MsgClose.SK.Yes" );
-        iClearArray = EFalse;
-        iNotifyArray->Reset();
-        TryCloseSession();
-        }
-    // Click "No" on Confirmation note (Yes, No) 
-    else if ( !rightBtn.Compare( 
-               LoadDefaultString( KUssdNo ) ) && 
-              ( CHbDeviceMessageBoxSymbian::ERejectButton == aButton ) )
-        {
-        _DPRINT( 4, "PhSrv.MsgClose.SK.No" );
-        iClearArray = EFalse;
-        iNotifyMessage = ETrue; // for removing the yes/no query
-        CheckArray();
-        TryCloseSession();
-        }
-    // Click "Next" on Notification note (Next, Exit) 
-    else if ( !leftBtn.Compare( 
-               LoadDefaultString( KUssdNext ) ) && 
-               ( CHbDeviceMessageBoxSymbian::EAcceptButton == aButton ) )
-        {
-        _DPRINT( 4, "PhSrv.MsgClose.SK.Next" ); 
-        CheckArray();
-        TryCloseSession();
-        }
-    // Click "Exit" on Notification note (Next, Exit or only Exit) 
-    else if ( !rightBtn.Compare( 
-               LoadDefaultString( KUssdExit ) ) && 
-               ( CHbDeviceMessageBoxSymbian::ERejectButton == aButton ) )
-        {
-        TRAP( err, ClearArrayL() );
-        _DDPRINT( 4, "PhSrv.MsgClose.SK.Clear.%d", err );
-        TryCloseSession();
-        _DPRINT( 4, "PhSrv.MsgClose.SK.Exit" ); 
-        }
-    // Click "Reply" on Message note (Reply, Exit) 
-    else if ( !leftBtn.Compare( 
-               LoadDefaultString( KUssdReply ) ) && 
-               ( CHbDeviceMessageBoxSymbian::EAcceptButton == aButton ) )
-        {
-        // Answer
-        iStartEditor = ETrue;
-        iShowDone = EFalse;
-        // Start the USSD editor now.
-        TRAP( err, RequestStartEditingL() );
-        _DDPRINT( 4, "PhSrv.MsgClose.RequestStartEditingL.%d", err );
-        }    
-    else 
-        {
-        _DPRINT( 4, "PhSrv.MsgClose.SK.Default" ); 
-        }
-  
-    _DPRINT( 4, "PhSrv.MsgClose.End" ); 
-    }
-
-// -----------------------------------------------------------------------------
-// CPhSrvUssdManager::RunL
-// -----------------------------------------------------------------------------
-//
-void CPhSrvUssdManager::RunL()
-    {
-    _DPRINT( 4, "PhSrv.RunL.Start" );    
-
-    ProcessMoAcksL();
-    
-    if ( iLaunchGMQ )
-        {
-        LaunchGlobalMessageQueryL();
-        // Do not launch Global Message Query next time.
-        iLaunchGMQ = EFalse;
-        _DPRINT( 4, "PhSrv.iLaunchGMQ.EFalse" );
-        }
-    else
-        {
-        iStartEditor = EFalse;
-        // update device dialog
-        _DPRINT( 4, "PhSrv.RunL.End" );     // debug print
-        }
-    }
-
-// -----------------------------------------------------------------------------
-// CPhSrvUssdManager::LaunchGlobalMessageQueryL
-// -----------------------------------------------------------------------------
-//
-void CPhSrvUssdManager::LaunchGlobalMessageQueryL()
-    {
-    _DPRINT( 4, "PhSrv.LGMQ.start" );
-    _DPRINT_FLAGS();
-
-    if ( iNotifyMessage )
-        {
-        _DDPRINT( 4, "PhSrv.LGMQ.NotifyMessage", iNotifyMessage );
-        iNotifyMessage = ETrue;
-        TInt count = NotifyCount();
-        //check softkey in avkon.rss 
-        if ( count > 1 )
-            {
-            // Next, Exit
-            iDeviceDialog->SetButton(
-                CHbDeviceMessageBoxSymbian::EAcceptButton, ETrue );            
-            iDeviceDialog->SetButtonTextL(
-                CHbDeviceMessageBoxSymbian::EAcceptButton, 
-                LoadDefaultString( KUssdNext ) );
-            iDeviceDialog->SetButton(
-                CHbDeviceMessageBoxSymbian::ERejectButton, ETrue );    
-            iDeviceDialog->SetButtonTextL(
-                CHbDeviceMessageBoxSymbian::ERejectButton, 
-                LoadDefaultString( KUssdExit ) );  
-            _DPRINT( 4, "PhSrv.LGMQ.Next&Exit" );
-            }
-        else
-            {
-            // Only Exit
-            iDeviceDialog->SetButton(
-                CHbDeviceMessageBoxSymbian::EAcceptButton, EFalse ); 
-            iDeviceDialog->SetButton(
-                CHbDeviceMessageBoxSymbian::ERejectButton, ETrue );               
-            iDeviceDialog->SetButtonTextL(
-                CHbDeviceMessageBoxSymbian::ERejectButton, 
-                LoadDefaultString( KUssdExit ) );   
-            _DPRINT( 4, "PhSrv.LGMQ.onlyExit" );
-            }
-        if ( iClearArray )
-            {
-            iTextResolver = HbTextResolverSymbian::Init( 
-                KCommonLocFilename, KLocPath );
-            _DPRINT( 4, "PhSrv.LGMQ.use common loc file" );
-            // Yes, No
-            iDeviceDialog->SetButton(
-                CHbDeviceMessageBoxSymbian::EAcceptButton, ETrue );               
-            iDeviceDialog->SetButtonTextL(
-                CHbDeviceMessageBoxSymbian::EAcceptButton, 
-                LoadDefaultString( KUssdYes ) );
-            iDeviceDialog->SetButton(
-                CHbDeviceMessageBoxSymbian::ERejectButton, ETrue );              
-            iDeviceDialog->SetButtonTextL(
-                CHbDeviceMessageBoxSymbian::ERejectButton, 
-                LoadDefaultString( KUssdNo ) );  
-            _DPRINT( 4, "PhSrv.LGMQ.Yes&No" );
-            iTextResolver = HbTextResolverSymbian::Init( 
-                KUssdLocFilename, KLocPath );
-            _DPRINT( 4, "PhSrv.LGMQ.back up to use ussd loc file" );
-            }
-        iReceivedMessage.Zero();
-        iReceivedMessage = (*iNotifyArray)[0];
-        }
-    TurnLightsOn(); //Ensure lights on
-
-    _DPRINT( 4, "PhSrv.LGMQ.ShMsgQuery" ); // debug print
-    // Launch Global MessageQuery as requested.
-    // Dialog not support header text, this code is only 
-    // for testing, not final solution.
-    TInt receiveLength = iReceivedMessage.Length();
-    _DDPRINT( 4, "PhSrv.LGMQ.ShMsgQuery.MsgLength", receiveLength ); 
-    
-    TInt titleLength = LoadDefaultString( KUssdTitle ).Length();
-    _DDPRINT( 4, "PhSrv.LGMQ.ShMsgQuery.TilteLength", titleLength );
-    
-    TInt length = receiveLength + titleLength;
-    _DDPRINT( 4, "PhSrv.LGMQ.ShMsgQuery.TotalLength", length );    
-        
-    HBufC* titleAndText = HBufC::NewLC( length );
-    titleAndText->Des().Append( LoadDefaultString( KUssdTitle ) );
-    titleAndText->Des().Append( iReceivedMessage );
-    iDeviceDialog->SetTextL( titleAndText->Des() );
-    CleanupStack::Pop( titleAndText );
-    
-    iDeviceDialog->Close();
-    iDeviceDialog->ShowL();
-    iShowDone = EFalse;
-   
-    // Do nothing else in RunL this time.
-    _DPRINT( 4, "PhSrv.LGMQ.ShMsgQuery.ret" ); // debug print
-    }
-
-// -----------------------------------------------------------------------------
-// CPhSrvUssdManager::ProcessMoAcksL()
-// -----------------------------------------------------------------------------
-//
-void CPhSrvUssdManager::ProcessMoAcksL()
-    {
-    //Acknowledgment is sent if notify message
-    if ( iNotifyMessage && iAcksToBeSent )
-        {
-        _DPRINT( 4, "PhSrv.LGMQ.SendMoAcknowledgementL, start" );
-        _DPRINT_FLAGS();
-        if ( iUssdSendHandler && !iUssdSendHandler->IsActive() &&
-             !iNetworkReleased && !iSendRelease && !iSendingAck )
-            {
-            _DPRINT( 4, "PhSrv.LGMQ.MoAckNeededToBeSent" );
-            SendMoAcknowledgementL();
-            iAcksToBeSent--;
-            iSendingAck = ETrue;
-            }
-        _DPRINT( 4, "PhSrv.LGMQ.SendMoAcknowledgementL, end" );
-        }
-    }
- 
-// -----------------------------------------------------------------------------
-// CPhSrvUssdManager::AsyncProcessMoAcks()
-// -----------------------------------------------------------------------------
-//
-void CPhSrvUssdManager::AsyncProcessMoAcks()
-    {
-    if ( iMoAckCallback ) 
-        {
-        iMoAckCallback->CallBack();
-        _DPRINT( 4, "PhSrv.LGMQ.AsyncProcessMoAcksL, queued" );
-        }
-    }
-// -----------------------------------------------------------------------------
-// CPhSrvUssdManager::MoAckCallback()
-// -----------------------------------------------------------------------------
-//
-TInt CPhSrvUssdManager::MoAckCallback( TAny *aUssdManager )
-    {
-    _DPRINT( 4, "PhSrv.MoAckCallback.start" );
-    if ( aUssdManager )
-        {
-        CPhSrvUssdManager* manager = static_cast<CPhSrvUssdManager*>( aUssdManager );
-        TRAP_IGNORE( manager->ProcessMoAcksL() );
-        }
-    _DPRINT( 4, "PhSrv.MoAckCallback.end" );
-    return ETrue;
-    }
-
-// -----------------------------------------------------------------------------
-// CPhSrvUssdManager::TryCloseSession()
-// -----------------------------------------------------------------------------
-//
-void CPhSrvUssdManager::TryCloseSession() 
-    {
-    // Dismiss, cancel the session.
-    _DPRINT( 4, "PhSrv.CheckAndCloseSession.close" );  // debug print
-       
-    iShowDone = EFalse;
-    iEmptyEditor = EFalse;
-    
-    // If the notification array is empty, close the session.
-    if ( NotifyCount() == 0 && !iNetworkReleased )
-        {
-        CloseSession();
-        }
-    }
-// -----------------------------------------------------------------------------
-// CPhSrvUssdManager::CloseSession()
-// -----------------------------------------------------------------------------
-//
-void CPhSrvUssdManager::CloseSession()
-    {
-    iSendRelease = ETrue;
-    iClearArray = EFalse;
-    iAcksToBeSent = 0;
-    _DPRINT( 4, "PhSrv.CheckAndCloseSession.canceling" ); 
-    SendUssdCancel();
-    Cancel();
-        
-    // Terminates USSD session.
-    if ( !iNetworkReleased ) 
-        {
-        iUssdSendHandler->SendReleaseSession();
-        }
-    if ( iUssdReplyTimer )
-        {
-        _DPRINT( 4, "PhSrv.CheckAndCloseSession.Timer.Stop" );
-        iUssdReplyTimer->Stop();
-        }
-    }
- 
-// -----------------------------------------------------------------------------
-// CPhSrvUssdManager::CheckArray()
-// -----------------------------------------------------------------------------
-//
-void CPhSrvUssdManager::CheckArray()
-    {
-    _DPRINT( 4, "PhSrv.CheckArray.Start" );     // debug print
-    if (iNotifyArray  && NotifyCount() > 0)
-        {
-        if  ( !iNotifyMessage && !iClearArray )
-            {
-            iLaunchGMQ = ETrue;
-            iNotifyMessage = ETrue;
-            _DPRINT( 4, "PhSrv.CheckArray.iNotifyMessage.ETrue" );
-            iTimer.After( iStatus , KPhSrvUssdMessageQueryInterval );
-            _DDPRINT( 4, "PhSrv.CheckArray.SetActive.NoNotifyMessage ", iStatus.Int() );
-            SetActive();
-            }
-        else if( NotifyCount() > 1 )
-            {
-            ( iNotifyArray )->Delete( 0 );
-            ( iNotifyArray )->Compress();
-            iLaunchGMQ = ETrue;
-            iNotifyMessage = ETrue;
-            _DPRINT( 4, "PhSrv.CheckArray.iNotifyMessage.ETrue" );
-            iTimer.After( iStatus , KPhSrvUssdMessageQueryInterval );
-            _DDPRINT( 4, "PhSrv.CheckArray.SetActive.NotifyCount>1 ", iStatus.Int() );
-            SetActive();
-            }
-        else
-            {
-            iNotifyArray->Reset();
-            iNotifyMessage = EFalse;
-            _DPRINT( 4, "PhSrv.CheckArray.iNotifyMessage.EFalse" );
-            }
-        }
-    _DPRINT_FLAGS();
-    _DPRINT( 4, "PhSrv.CheckArray.End" );     // debug print
-    }
-
-// -----------------------------------------------------------------------------
-// CPhSrvUssdManager::ClearArray()
-// -----------------------------------------------------------------------------
-//
-  void CPhSrvUssdManager::ClearArrayL()
-    {
-    _DPRINT( 4, "PhSrv.ClearArrayL.Start" );     // debug print
-    if (iNotifyArray && NotifyCount() > 0)
-        {
-        if (iNotifyMessage && NotifyCount()== 1 )
-            {
-            iNotifyArray->Reset();
-            }
-        else
-            {
-            iReceivedMessage.Zero();
-            iReceivedMessage.Append( 
-                LoadDefaultString( KUssdConfirm ) );
-            iNotifyArray->InsertL( 0, iReceivedMessage );
-            iLaunchGMQ = ETrue;
-            iNotifyMessage = ETrue;
-            _DPRINT( 4, "PhSrv.ClearArrayL.iNotifyMessage.ETrue" );
-            iClearArray = ETrue;
-            iTimer.After( iStatus , KPhSrvUssdMessageQueryInterval );
-            _DDPRINT( 4, "PhSrv.ClearArrayL.iTimer ", iStatus.Int() );
-            SetActive();
-            }
-        }
-    _DPRINT_FLAGS();
-    _DPRINT( 4, "PhSrv.ClearArrayL.End" );     // debug print
-    }
-
-// -----------------------------------------------------------------------------
-// CPhSrvUssdManager::NotifyCount()
-// -----------------------------------------------------------------------------
-//
-TInt CPhSrvUssdManager:: NotifyCount()
-{
-    TInt count = iNotifyArray->Count();
-    _DDPRINT( 4, "PhSrv.NotifyCount:", count );     // debug print
-    return count;
-}
-
-// -----------------------------------------------------------------------------
-// CPhSrvUssdManager::UpdateNotifyMessageL()
-// -----------------------------------------------------------------------------
-//
-  void CPhSrvUssdManager:: UpdateNotifyMessageL()
-    {
-    _DDPRINT( 4, "PhSrv.UpdateNotifyMessageL.Start, clear: ", iClearArray );     // debug print
-
-    // Show left softkey - "Next"
-    if (NotifyCount() > 1 && !iClearArray )
-        {
-        _DPRINT( 4, "PhSrv.UpdateNotifyMessageL" );     // debug print
-        iDeviceDialog->SetButton( 
-            CHbDeviceMessageBoxSymbian::EAcceptButton, ETrue ); 
-        iDeviceDialog->SetButtonTextL(
-            CHbDeviceMessageBoxSymbian::EAcceptButton, 
-            LoadDefaultString( KUssdNext ) );
-        }
-    // Remove left softkey
-    else
-        {
-        iDeviceDialog->SetButton( 
-                    CHbDeviceMessageBoxSymbian::EAcceptButton, EFalse );         
-        }
-    iDeviceDialog->UpdateL();        
-    
-    _DPRINT( 4, "PhSrv.UpdateNotifyMessageL.End" );     // debug print
-    }
-
-// -----------------------------------------------------------------------------
-// CPhSrvUssdManager::DoCancel
-// -----------------------------------------------------------------------------
-//
-void CPhSrvUssdManager::DoCancel()
-    {
-    _DPRINT( 4, "PhSrv.DoCancel.Start" ); // debug print
-    iTimer.Cancel();
-    iLaunchGMQ = EFalse;
-    if ( iDeviceDialog )
-        {
-        _DPRINT( 4, "PhSrv.DoCancel" ); // debug print
-        iDeviceDialog->Close();
-        delete iDeviceDialog;
-        iDeviceDialog = NULL;
-        }
-    _DPRINT( 4, "PhSrv.DoCancel.End" ); // debug print
-    }
-
-// -----------------------------------------------------------------------------
-// CPhSrvUssdManager::RunError
-//
-// Because the RunL can leave, this function exists.
-// In case of error, just returning KErrNone is OK.
-// -----------------------------------------------------------------------------
-//
-TInt CPhSrvUssdManager::RunError( TInt /*aError*/ )
-    {
-    _DPRINT( 4, "PhSrv.RunError.Start" );     // debug print
-    return KErrNone;
-    }
-
-// -----------------------------------------------------------------------------
-// CPhSrvUssdManager::RequestStartEditingL
-// -----------------------------------------------------------------------------
-//
-void CPhSrvUssdManager::RequestStartEditingL()
-    {
-    _DPRINT( 4, "PhSrv.UssdM.RequestStartEditingL.start" ); // debug print
-
-    RWsSession wsSession;
-    User::LeaveIfError( wsSession.Connect() );
-    _DPRINT( 4, "PhSrv.RequestStartEditingL.wsSession.connect" );     // debug print
-    CleanupClosePushL( wsSession );
-
-    // Find the task with name
-    TApaTaskList tasklist( wsSession );
-    TApaTask task = tasklist.FindApp( KUssdSecureId );
-
-    // If task exists, bring it to foreground
-    if ( task.Exists() )
-        {
-        _DPRINT( 4, "PhSrv.UssdM.RequestStartEditingL.task.BringToForeground" );
-        task.BringToForeground();
-        }
-    else
-        {
-        // Start new app
-        RApaLsSession apaLsSession;
-        User::LeaveIfError( apaLsSession.Connect() );
-        _DPRINT( 4, "PhSrv.RequestStartEditingL.apaLsSession.connect" );     // debug print
-        CleanupClosePushL( apaLsSession );
-
-        TApaAppInfo appInfo;
-        
-        TInt err = apaLsSession.GetAppInfo( appInfo, KUssdSecureId );
-        _DDPRINT( 4, "PhSrv.RequestStartEditingL.GetAppInfo ", err );     // debug print
-        
-        if ( err == KErrNone )
-            {
-        #ifndef SYMBIAN_SUPPORT_UI_FRAMEWORKS_V1
-            CApaCommandLine* apaCommandLine = CApaCommandLine::NewLC();
-            apaCommandLine->SetExecutableNameL( appInfo.iFullName );
-        #else // SYMBIAN_SUPPORT_UI_FRAMEWORKS_V1
-            CApaCommandLine* apaCommandLine =
-                CApaCommandLine::NewLC( appInfo.iFullName );
-        #endif // SYMBIAN_SUPPORT_UI_FRAMEWORKS_V1
-
-            TThreadId id( static_cast<TInt64>( 0 ) );
-            err = apaLsSession.StartApp( *apaCommandLine, id );
-            _DDPRINT( 4, "PhSrv.RequestStartEditingL.ThreadId ", id ); 
-            CleanupStack::PopAndDestroy( apaCommandLine );
-            }
-        CleanupStack::PopAndDestroy( &apaLsSession ); // apaLsSession
-        
-        // bring the ussd editor to foreground, only for testing
-        TApaTaskList tasklist( wsSession );
-        TApaTask task = tasklist.FindApp( KUssdSecureId );
-        if ( task.Exists() )
-            {
-            _DPRINT( 4, "PhSrv.UssdM.RequestStartEditingL.task.BringToForeground" );
-            task.BringToForeground();
-            }
-        // bring the ussd editor to foreground, only for testing
-        }
-    CleanupStack::PopAndDestroy(); // wsSession
-
-    _DPRINT( 4, "PhSrv.UssdM.RequestStartEditingL.end" ); // debug print
-    }
-
-
-// -----------------------------------------------------------------------------
-// CPhSrvUssdManager::InformUssdApplicationStarting
-// -----------------------------------------------------------------------------
-//
-void CPhSrvUssdManager::InformUssdApplicationStarting()
-    {
-    _DPRINT( 4, "PhSrv.UssdM.InfUssdAppStarting.start" ); // debug print
-    if ( iUssdReplyTimer )
-        {
-        _DPRINT( 4, "PhSrv.InformUssdApplicationStarting.iUssdReplyTimer" );
-        if ( iUssdReplyTimer->IsTimerActive() )
-            {
-            _DPRINT( 4, "PhSrv.InformUssdApplicationStarting.iUssdReplyTimer.active" );
-            iUssdReplyTimer->Pause();
-            }
-        }
-    _DPRINT( 4, "PhSrv.UssdM.InfUssdAppStarting.end" ); // debug print
-    }
-
-// -----------------------------------------------------------------------------
-// CPhSrvUssdManager::InformUssdApplicationTerminatingL
-// -----------------------------------------------------------------------------
-//
-void CPhSrvUssdManager::InformUssdApplicationTerminatingL(
-    const RMessage2& aMessage )
-    {
-    _DPRINT( 4, "PhSrv.UssdM.InfUssdAppTerminatingL.start" ); // debug print
-    if ( iUssdReplyTimer )
-        {
-        if ( iUssdReplyTimer->IsTimerActive() )
-            {
-     
-            _DPRINT( 4, "PhSrv.UssdM.InfUssdAppTerminatingL.timer" );
-
-            // Read the information what is the reason
-            // for application termination.
-            TPhCltUssdAppExitReason exitReason = EPhCltExitReasonUnknown;
-            TPckg< TPhCltUssdAppExitReason > exitReasonPckg( exitReason );
-            aMessage.ReadL(
-                0,
-                exitReasonPckg );
-
-     
-            _DPRINT( 4, "PhSrv.UssdM.InfUssdAppTerminatingL.timer2" );
-
-            // If reason was the completion of send operation, the USSD
-            // session is not canceled, otherwise it is canceled.
-            if ( exitReason != EPhCltSendCompleted )
-                {
-         
-                _DPRINT( 4, "PhSrv.UssdM.InfUssdAppTerminatingL.SendRelease" );
-                CloseSession();
-                }
-            }
-        }
-    _DPRINT( 4, "PhSrv.UssdM.InfUssdAppTerminatingL.end" ); // debug print
-    }
-
-
-// -----------------------------------------------------------------------------
-// CPhSrvUssdManager::InformUssdApplicationToForeground
-// -----------------------------------------------------------------------------
-//
-TInt CPhSrvUssdManager::InformUssdApplicationToForeground()
-    {
-    _DPRINT( 4, "PhSrv.UssdM.InfUssdAppToForeground.start" ); // debug print
-
-    // Do the same actions as in InformUssdApplicationStarting,
-    // that is why it is called.
-    InformUssdApplicationStarting();
-
-    if ( iEmptyEditor )
-        {
-        _DPRINT( 4, "PhSrv.UssdM.InfUssdAppToForeground.empty" ); // debug print
-        iEmptyEditor = EFalse;
-        return 1; // some positive number
-        }
-    _DPRINT( 4, "PhSrv.UssdM.InfUssdAppToForeground.end" ); // debug print
-    return KErrNone;
-    }
-
-
-// -----------------------------------------------------------------------------
-// CPhSrvUssdManager::InformUssdApplicationToBackground
-// -----------------------------------------------------------------------------
-//
-void CPhSrvUssdManager::InformUssdApplicationToBackground()
-    {
-    _DPRINT( 4, "PhSrv.UssdM.InfUssdAppToBackground.start" ); // debug print
-    if ( iUssdReplyTimer )
-        {
-        _DPRINT( 4, "PhSrv.UssdM.InfUssdAppToBackground.timer" ); // debug print
-        if ( iUssdReplyTimer->IsTimerActive() )
-            {
-            _DPRINT( 4, "PhSrv.UssdM.InfUssdAppToBackground.timer.Active" ); // debug print
-            iUssdReplyTimer->Continue();
-            }
-        }
-    _DPRINT( 4, "PhSrv.UssdM.InfUssdAppToBackground.end" ); // debug print
-    }
-
-
-// -----------------------------------------------------------------------------
-// CPhSrvUssdManager::InformStartSAT
-// -----------------------------------------------------------------------------
-//
-void CPhSrvUssdManager::InformStartSAT( const RMessage2& aSatMessage )
-    {
-    _DPRINT( 4, "PhSrv.InformStartSAT.Start" );    // debug print
-
-    if ( iHavePendingSatMessagePointer )
-        {
-        _DPRINT( 4, "PhSrv.InformStartSAT.Complete.InUse" ); // debug print
-        aSatMessage.Complete( KErrInUse );
-        }
-    else
-        {
-        _DPRINT( 4, "PhSrv.InformStartSAT.Set" );    
-
-        // There was not pending SAT message
-        iHavePendingSatMessagePointer = ETrue;
-        _DDPRINT( 4, "PhSrv.UssdM.InformStartSAT.PendingSatPointer ", iHavePendingSatMessagePointer );
-        iPendingSatMessagePointer = aSatMessage;
-        }
-
-    _DPRINT( 4, "PhSrv.InformStartSAT.End" );   // debug print
-    }
-
-
-// -----------------------------------------------------------------------------
-// CPhSrvUssdManager::InformStopSAT
-// -----------------------------------------------------------------------------
-//
-void CPhSrvUssdManager::InformStopSAT()
-    {
-    _DPRINT( 4, "PhSrv.InformStopSAT.Start" );        
-
-    // Do the actions only if there is pending SAT message.
-    if ( iHavePendingSatMessagePointer )
-        {
-        _DPRINT( 4, "PhSrv.InformStopSAT.Complete.Cancel" ); // debug print
-        if ( !iPendingSatMessagePointer.IsNull() )
-            {
-            iPendingSatMessagePointer.Complete( KErrCancel );
-            _DPRINT( 4, "PhSrv.InformStopSAT.Complete.KErrCancel" );
-            }
-        iHavePendingSatMessagePointer = EFalse;
-        }
-    _DPRINT( 4, "PhSrv.InformStopSAT.End" );          
-    }
-
-// -----------------------------------------------------------------------------
-// CPhSrvUssdManager::ShowNotes
-// -----------------------------------------------------------------------------
-//
-
-
-TBool CPhSrvUssdManager::ShowNotesL()
-{
-_DPRINT( 4, "PhSrv.ShowNotesL.Start" );
-
-if ( !iHavePendingSatMessagePointer )
-    {
-    if ( iSatCanceled )
-        {
-        _DPRINT( 4, "PhSrv.ShowNotesL, EFalse" );  // debug print
-        return EFalse;
-        }
-    else
-        {
-        _DPRINT( 4, "PhSrv.ShowNotesL, ETrue" );  // debug print
-        return ETrue;
-        }
-    }
-// Read the information whether the notes are shown or not.
-    TUint notesShown = 0;
-    TPckg< TUint > noShPckg( notesShown );
-    iPendingSatMessagePointer.ReadL(
-        0,
-        noShPckg );
-
-    TBool showNotes = EFalse;
-    _DPRINT( 4, "PhSrv.ShowNotes Sat= EFalse" );    // debug print
-    if ( notesShown == KPhCltShowNotes )
-        {
-        _DPRINT( 4, "PhSrv.ShowNotes Sat= ETrue" ); // debug print
-        showNotes = ETrue;
-        }
-    _DPRINT( 4, "PhSrv.ShowNotesL.End" );
-    return showNotes;
-}
-
-// -----------------------------------------------------------------------------
-// CPhSrvUssdManager::CompleteSatL
-// -----------------------------------------------------------------------------
-//
-void CPhSrvUssdManager::CompleteSatL(
-    TDesC* aReceiveString,
-    TInt aError )
-    {
-    _DPRINT( 4, "PhSrv.CompleteSatL.Start" );         
-    if ( aReceiveString )
-        {
-        if ( aReceiveString->Length() )
-            {
-            _DPRINT( 4, "PhSrv.CompleteSatL.recString.>0" ); // debug print
-            // copy the received string to client side.
-            if ( iPendingSatMessagePointer.Int1() < aReceiveString->Length() )
-                {
-         
-                _DPRINT( 4, "PhSrv.CompleteSatL.recString.LengthError" );
-                if ( !iPendingSatMessagePointer.IsNull() )
-                    {
-                    iPendingSatMessagePointer.Complete( KErrOverflow );
-                    _DPRINT( 4, "PhSrv.CompleteSatLComplete.KErrOverFlow" );
-                    }
-                iHavePendingSatMessagePointer = EFalse;
-                }
-            else
-                {
-            _DPRINT( 4, "PhSrv.CompleteSatL.recString.Write" );  // debug print
-            iPendingSatMessagePointer.WriteL(
-                2,
-                *aReceiveString );
-
-            _DPRINT( 4, "PhSrv.CompleteSatL.recString.Write2" ); // debug print
-            TPckg< TUint > dcsPackage( iDCS );
-            iPendingSatMessagePointer.WriteL(
-                0,
-                dcsPackage );
-            }
-        }
-        }
-    _DPRINT( 4, "PhSrv.CompleteSatL.Middle" );    
-    if ( !iPendingSatMessagePointer.IsNull() )
-        {
-        if ( aReceiveString && !iSatCanceled )
-            {
-            _DDPRINT( 4, "PhSrv.CompleteSatL.Complete.", iReturnResult.iOpCode  );   // debug print
-            iPendingSatMessagePointer.Complete( iReturnResult.iOpCode ); // Some positive value
-            }
-        else
-            {
-            _DPRINT( 4, "PhSrv.CompleteSatL.Complete.aError" ); // debug print
-            iPendingSatMessagePointer.Complete( aError );
-            }
-        }
-
-    iHavePendingSatMessagePointer = EFalse;
-
-    _DPRINT( 4, "PhSrv.CompleteSatL.End" );    
-    }
-
-
-// -----------------------------------------------------------------------------
-// CPhSrvUssdManager::IsTelephonyFeatureSupported
-//
-// -----------------------------------------------------------------------------
-//
-TBool CPhSrvUssdManager::IsTelephonyFeatureSupported(
-    const TInt aFeatureId )
-    {
-    return ( aFeatureId & iVariantReadOnlyValues );
-    }
-
-
-// -----------------------------------------------------------------------------
-// CPhSrvUssdManager::PlayUssdTone
-//
-// -----------------------------------------------------------------------------
-//
-TInt CPhSrvUssdManager::PlayUssdTone()
-    {
-    _DPRINT( 4, "PhSrv.UssdM.PlayTone.start" );    
-
-    TInt err = KErrNone;
-// <-- QT PHONE  START-->
-//    RProperty::Define( KPSUidNcnList, KNcnPlayAlertTone, RProperty::EInt, ECapability_None , ECapabilityWriteDeviceData );
-//    RProperty::Set( KPSUidNcnList, KNcnPlayAlertTone, KPhSrvUssdTone );
-// <-- QT PHONE END-->
-
-    // debug print
-    _DDPRINT(
-        4,
-        "PhSrv.UssdM.PlayTone.end",
-        err );
-    return err;
-    }
-
-// -----------------------------------------------------------------------------
-// CPhSrvUssdManager::GetTelephonyVariantData
-//
-// -----------------------------------------------------------------------------
-//
-TInt CPhSrvUssdManager::GetTelephonyVariantData()
-    {
-    _DPRINT( 4, "PhSrv.UssdM.GetTelephonyVariantData.Start" );
-    TInt err = KErrNone;
-// <-- QT PHONE START-->
-/*
-    // Variation data should be unchangable during run-time,
-    // therefore, if once succesfully read, later reads are
-    // not allowed.
-    if ( iVariantReadOnlyValues == KPhSrvDefaultValue )
-        {
-        CRepository* cenRepSession = NULL;
-        TRAP ( err ,
-               cenRepSession = CRepository::NewL( KCRUidTelVariation ) );
-        if ( err == KErrNone )
-            {
-            err = cenRepSession->Get( KTelVariationFlags,
-                                   iVariantReadOnlyValues );
-            }
-        delete cenRepSession;
-        }
-
-    _DDPRINT( 4, "PhSrv.UssdM.variant", iVariantReadOnlyValues ); // debug print
-    _DPRINT( 4, "PhSrv.UssdM.GetTelephonyVariantData.End" );
-    */
-// <-- QT PHONE END-->
-    return err;
-    }
-
-
-// -----------------------------------------------------------------------------
-// CPhSrvUssdManager::SendMoAcknowledgementL
-//
-// -----------------------------------------------------------------------------
-//
-void CPhSrvUssdManager::SendMoAcknowledgementL()
-    {
-    _DPRINT( 4, "PhSrv.SendMoAckL.Start" );    
-
-    // Acknowledge MT USSD message.
-    RMobileUssdMessaging::TMobileUssdAttributesV1 msgAttribs;
-    msgAttribs.iFlags =
-        RMobileUssdMessaging::KUssdMessageType +
-        RMobileUssdMessaging::KUssdDataFormat  +
-        RMobileUssdMessaging::KUssdMessageDcs;
-
-    msgAttribs.iType   = RMobileUssdMessaging::EUssdMOAcknowledgement;
-    _DDPRINT( 4, "PhSrv.SendMoAckL.msgAttribs.iType ", msgAttribs.iType );
-    msgAttribs.iFormat = RMobileUssdMessaging::EFormatUnspecified;
-    _DDPRINT( 4, "PhSrv.SendMoAckL.msgAttribs.iFormat ", msgAttribs.iFormat );
-    msgAttribs.iDcs    = KPhSrvUssdDefaultDCS;
-
-    RMobileUssdMessaging::TMobileUssdAttributesV1Pckg attribs = msgAttribs;
-    SendHandlerL().SendUssdL( KNullDesC8() , attribs );
-
-    _DPRINT( 4, "PhSrv.SendMoAckL.End" );    
-    }
-
-// -----------------------------------------------------------------------------
-// CPhSrvUssdManager::TurnLightsOn
-//
-// -----------------------------------------------------------------------------
-//
-void CPhSrvUssdManager::TurnLightsOn()
-    {
-    _DPRINT( 4, "PhSrv.TurnLightsOn.Start" );    
-
-
-     // Change the bit on and off. SysAp will detect that
-     // the lights should be switched on for the specified time.
-     //
-     RProperty::Set(KPSUidCoreApplicationUIs, KLightsControl, ELightsOn);
-     TInt err = RProperty::Set(KPSUidCoreApplicationUIs, KLightsControl, ELightsOff);
-
-     if ( err != KErrNone )
-         {
-         _DDPRINT( 4,"PhSrv.TurnLightsOn.Error: ",err );// debug print
-         }
-
-    _DPRINT( 4, "PhSrv.TurnLightsOn.End" );    
-    }
-
-// -----------------------------------------------------------------------------
-// CPhSrvUssdManager::LoadDefaultString
-// -----------------------------------------------------------------------------
-//
-const TPtrC CPhSrvUssdManager::LoadDefaultString( const TDesC& aText )
-    {
-    _DPRINT( 4, "PhSrv.LoadDefaultString.Start" );
-    
-    if ( iTextBuffer )
-        {
-        delete iTextBuffer;
-        iTextBuffer = NULL;
-        _DPRINT( 4, "PhSrv.LoadDefaultString.Clear" );
-        }
-    TInt err = KErrNone;
-    TPtrC ptr( aText );
-    if ( iTextResolver && ptr.Length() )
-        {
-        TRAP( err, iTextBuffer = HbTextResolverSymbian::LoadL( ptr ) );
-        _DDPRINT( 4, "PhSrv.LoadDefaultString.LoadL.%d", err );
-        if ( iTextBuffer )
-            {
-            ptr.Set( iTextBuffer->Des() );   
-            _DPRINT( 4, "PhSrv.LoadDefaultString.Set" );
-            }
-        }    
-    _DPRINT( 4, "PhSrv.LoadDefaultString.End" );
-    return ptr;
-    }
-
-// End of File