telephonyserverplugins/common_tsy/commontsy/src/mmsms/cmmussdtsy.cpp
branchopencode
changeset 24 6638e7f4bd8f
parent 23 6b1d113cdff3
child 77 930a53cdc2d3
--- a/telephonyserverplugins/common_tsy/commontsy/src/mmsms/cmmussdtsy.cpp	Mon May 03 13:37:20 2010 +0300
+++ b/telephonyserverplugins/common_tsy/commontsy/src/mmsms/cmmussdtsy.cpp	Thu May 06 15:10:38 2010 +0100
@@ -1,1160 +1,1222 @@
-// Copyright (c) 2006-2009 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:
-//
-
-
-
-// INCLUDE FILES
-#include <etelmm.h>
-#include <mmlist.h>
-#include "cmmussdtsy.h"
-#include <ctsy/serviceapi/cmmsmsutility.h>
-#include "MmTsy_timeoutdefs.h"
-#include "MmTsy_numberOfSlots.h"
-#include "cmmtsyreqhandlestore.h"
-#include "CMmCommonStaticUtility.h"
-#include "cmmmessagemanagerbase.h"
-#include <ctsy/pluginapi/cmmdatapackage.h>
-#include <ctsy/serviceapi/gsmerror.h>
-
-// ======== MEMBER FUNCTIONS ========
-
-CMmUssdTsy::CMmUssdTsy()
-    {
-    }
-
-void CMmUssdTsy::ConstructL(
-    CMmPhoneTsy* aMmPhoneTsy )
-    {
-TFLOGSTRING("TSY: CMmUssdTsy::ConstructL\n" );
-    iMmPhone = aMmPhoneTsy;
-
-    // register .
-    iMmPhone->MessageManager()->RegisterTsyObject(
-		CMmMessageManagerBase::EUssdMessagingTsy, this );
-
-#ifdef REQHANDLE_TIMER   
-    // create req handle store
-    iTsyReqHandleStore = CMmTsyReqHandleStore::NewL( this, iMmPhone,
-        EMultimodeUssdMaxNumOfRequests, iUssdReqHandles);
-#else
-    // create req handle store
-    iTsyReqHandleStore = CMmTsyReqHandleStore::NewL(
-        EMultimodeUssdMaxNumOfRequests, iUssdReqHandles);
-
-#endif // REQHANDLE_TIMER
-
-    // Reset all CMmUssdTsy variables
-    ResetVariables();
-
-    // Initialize boolean flag
-    iUssdNoFdnCheckFlag =  EUssdNoFdnCheckUnknown;
-    }
-
-CMmUssdTsy* CMmUssdTsy::NewL( 
-    CMmPhoneTsy* aMmPhone )                                 
-    {
-    CMmUssdTsy* aMmUssdTsy = new( ELeave ) CMmUssdTsy();
-    CleanupClosePushL( *aMmUssdTsy );
-    aMmUssdTsy->ConstructL( aMmPhone );
-    aMmUssdTsy->iMmPhone = aMmPhone;
-    CleanupStack::Pop();
-    
-    return aMmUssdTsy;
-    }
-
-CMmUssdTsy::~CMmUssdTsy()
-    {
-TFLOGSTRING("TSY: CMmUssdTsy::~CMmUssdTsy" );
-    // unregister.
-    if ( iMmPhone )
-        {
-        // deregister tsy object from message manager
-        iMmPhone->MessageManager()->DeregisterTsyObject(this);        
-        }
-
-    // delete req handle store
-    delete iTsyReqHandleStore;
-    iTsyReqHandleStore = NULL;
-
-    // Null other pointers
-    iReturnResultPtr = NULL;
-    iReceiveUssdMessagePtr = NULL;
-    iReceiveUssdMessageAttributesPtr = NULL;
-    iMmPhone = NULL;
-    }
-
-// ---------------------------------------------------------------------------
-// CMmUssdTsy::Init
-// Initialisation method that is called from ETel Server.
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-void CMmUssdTsy::Init()
-    {
-    }
-
-// ---------------------------------------------------------------------------
-// CMmUssdTsy::ExtFunc
-// ExtFunc is called by the server when it has an "extended",i.e.
-// non-core ETel request for the TSY. To process a request handle, request type
-// and request data are passed to the TSY.
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-TInt CMmUssdTsy::ExtFunc( 
-    const TTsyReqHandle aTsyReqHandle, 
-    const TInt aIpc, 
-    const TDataPackage& aPackage )        
-    {
-    TInt ret = KErrNone;
-    TInt trapError = KErrNone;
-
-    // before processing further the request, check if offline mode status
-    // is enabled and if the given request can be perfomed in that case.
-    if ( ERfsStateInfoInactive == iMmPhone->GetRfStateInfo() && 
-        ( !IsRequestPossibleInOffline( aIpc ) ) )  
-        {
-TFLOGSTRING2 ("TSY: Offline mode ON, request is not allowed: %d", aIpc );
-        ret = CMmCommonStaticUtility::EpocErrorCode( KErrGeneral, 
-            KErrGsmOfflineOpNotAllowed );
-
-        // Complete the request with appropiate error
-        ReqCompleted ( aTsyReqHandle, ret ); 
-        }
-    else
-        {
-        // Original code continues here.
-        TRAP( trapError, ret = DoExtFuncL( aTsyReqHandle, aIpc, aPackage ); );
-
-        if ( trapError != KErrNone )
-            {
-            // Object cannot be created. 
-            ReqCompleted( aTsyReqHandle, trapError );
-            }
-        else if ( ret != KErrNone )
-            {
-            ReqCompleted( aTsyReqHandle, ret );
-            }
-        }
-    
-    return KErrNone;
-    }
-
-// ---------------------------------------------------------------------------
-// CMmUssdTsy::DoExtFuncL
-// ExtFunc is called by the server when it has an "extended",i.e.
-// non-core ETel request for the TSY. To process a request handle,request type
-// and request data are passed to the TSY.
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-TInt CMmUssdTsy::DoExtFuncL( 
-    const TTsyReqHandle aTsyReqHandle, 
-    const TInt aIpc, 
-    const TDataPackage& aPackage )
-    {
-    TInt ret(KErrNone);
-
-    switch ( aIpc ) 
-        {
-        // Ussd Messaging requests
-        case EMobileUssdMessagingGetCaps:
-            ret = GetCaps( aTsyReqHandle, aPackage.Des1n() );
-            break;
-        case EMobileUssdMessagingReceiveMessage:
-            ret = ReceiveMessage( aTsyReqHandle, aPackage.Des1n(), 
-                aPackage.Des2n() );
-            break;
-        case EMobileUssdMessagingSendMessage:
-            {
-            iUssdNoFdnCheckFlag = EUssdNoFdnCheckNotUsed;
-            ret = SendMessageL( 
-                aTsyReqHandle, aPackage.Des1n(), aPackage.Des2n() );
-            }
-            break;
-        case EMobileUssdMessagingSendMessageNoFdnCheck:
-            {
-            iUssdNoFdnCheckFlag = EUssdNoFdnCheckUsed;
-            ret = SendMessageL( 
-                aTsyReqHandle, aPackage.Des1n(), aPackage.Des2n() );                
-            }
-            break;
-        case EMobileUssdMessagingSendRelease:
-            ret = SendReleaseL( aTsyReqHandle, aPackage.Des1n() );
-            break;
-        case EMobileUssdMessagingNotifyNetworkRelease:
-            switch( aPackage.Type() )
-                 {
-             	// Switch between alternative implementations of NotifyNetworkRelease
-                 case TDataPackage::EPackage1n:
-                	 ret = NotifyNetworkRelease( aTsyReqHandle, aPackage.Des1n(), NULL );
-                	 break;
-                 case TDataPackage::EPackage1n2n:
-                	 ret = NotifyNetworkRelease( aTsyReqHandle, aPackage.Des1n(), aPackage.Des2n() );
-                     break;
-                 default:
-                     ret = KErrNotSupported;
-                     break;
-                 }
-            
-            break;
-        default:
-            ret = KErrNotSupported;
-            break;
-        }
-
-    return ret;
-    }
-
-// ---------------------------------------------------------------------------
-// CMmUssdTsy::CancelService
-// CancelService is called by the server when it is "cleaning-up"
-// any still outstanding asynchronous requests before closing a client's
-// sub-session. This will happen if a client closes its R-class handle without
-// cancelling outstanding asynchronous requests
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-TInt CMmUssdTsy::CancelService( 
-    const TInt aIpc, 
-    const TTsyReqHandle aTsyReqHandle )           
-    {
-    TInt ret( KErrNone );
-
-    switch ( aIpc )
-        {
-        case EMobileUssdMessagingReceiveMessage:
-            ReceiveMessageCancel( aTsyReqHandle );
-            ret = KErrNone;
-            break;
-        case EMobileUssdMessagingSendMessage:
-            SendMessageCancel( aTsyReqHandle );
-            ret = KErrNone;
-            break;
-        case EMobileUssdMessagingSendMessageNoFdnCheck:
-            SendMessageNoFdnCheckCancel( aTsyReqHandle );
-            ret = KErrNone;
-            break;            
-        case EMobileUssdMessagingSendRelease:
-            SendReleaseCancel();
-            ret = KErrNone;
-            break;
-        case EMobileUssdMessagingNotifyNetworkRelease:
-            NotifyNetworkReleaseCancel();
-            ret = KErrNone;
-            break;
-        default:
-            ret = KErrNotSupported;
-            break;
-        } 
-
-    return ret;
-    }
-
-// ---------------------------------------------------------------------------
-// CMmUssdTsy::ReqModeL
-// When the ETel server receives an "extension" client request,
-// it will pass the IPC request number down to the TSY in order to find out
-// what type of request it is. The virtual method that gets called is ReqModeL
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-CTelObject::TReqMode CMmUssdTsy::ReqModeL(
-    const TInt aIpc )    
-    {
-    CTelObject::TReqMode ret ( 0 );
-
-    switch ( aIpc )
-        {
-        // Non-Flow Controlled Services
-        case EMobileUssdMessagingGetCaps:
-            break;
-        // Flow Controlled Services
-
-        // Immediate Server Repost
-        case EMobileUssdMessagingReceiveMessage:
-        case EMobileUssdMessagingNotifyNetworkRelease:
-            ret = KReqModeRePostImmediately | 
-                KReqModeMultipleCompletionEnabled;
-            break;
-        // Services handled by TSY
-        case EMobileUssdMessagingSendMessage:
-        case EMobileUssdMessagingSendMessageNoFdnCheck:
-        case EMobileUssdMessagingSendRelease:
-            ret = 0;
-            break;
-        default:
-            User::Leave( KErrNotSupported );
-            break;
-        }
-
-    return ret;
-    }
-
-// ---------------------------------------------------------------------------
-// CMmUssdTsy::OpenNewObjectL
-// Opens new object and names it. Not supported.
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-CTelObject* CMmUssdTsy::OpenNewObjectL( 
-    TDes& /*aName*/ )    
-    {
-    User::Leave( KErrNotSupported );
-    //lint -e{527} "unreachable code"
-
-    return NULL;
-    }
-
-// ---------------------------------------------------------------------------
-// CMmUssdTsy::OpenNewObjectByNameL
-// Open extendible sub-sessions. Not Supported
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-CTelObject* CMmUssdTsy::OpenNewObjectByNameL(
-    const TDesC& /*aName*/ )       
-    {
-    User::Leave( KErrNotSupported );
-    //lint -e{527} "unreachable code"
-
-    return NULL;
-    }
-
-// ---------------------------------------------------------------------------
-// CMmUssdTsy::RegisterNotification
-// RegisterNotification is called when the server recognises that
-// this notification is being posted for the first time on this sub-session
-// object. It enables the TSY to "turn on" any regular notification messages
-// that it may receive from DOS.
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-TInt CMmUssdTsy::RegisterNotification(
-    const TInt aIpc )                             // Notification IPC number
-    {
-    TFLOGSTRING2( "TSY: CMmUssdTsy::RegisterNotification. IPC: %d", aIpc );
-
-    TInt ret( KErrNone );
-
-    switch ( aIpc )
-        {
-        case EMobileUssdMessagingNotifyNetworkRelease:
-        case EMobileUssdMessagingReceiveMessage:
-        	break;
-        default:
-            // Not supported
-            ret = KErrNotSupported;
-            break;
-        }
-
-    return ret;
-    }
-    
-// ---------------------------------------------------------------------------
-// CMmUssdTsy::DeregisterNotification
-// DeregisterNotification is called when the server recognises 
-// that this notification will not be posted again because the last client 
-// to have a handle on this sub-session object has just closed the handle.
-// It enables the TSY to "turn off" any regular notification messages that it
-// may receive from DOS.
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-TInt CMmUssdTsy::DeregisterNotification(
-    const TInt aIpc )                             // Notification IPC number
-    {        
-    TFLOGSTRING2( "TSY: CMmUssdTsy::DeregisterNotification. IPC: %d", aIpc );
-
-    TInt ret( KErrNone );
-
-    switch ( aIpc )
-        {
-        case EMobileUssdMessagingNotifyNetworkRelease:
-        case EMobileUssdMessagingReceiveMessage:
-            break;
-        default:
-            // Not supported
-            ret = KErrNotSupported;
-            break;
-        }
-
-    return ret;
-    }
-    
-// ---------------------------------------------------------------------------
-// CMmUssdTsy::NumberOfSlotsL
-// NumberOfSlotsL is called by the server when it is registering 
-// a new NOTIFICATION. It enables the TSY to tell the server how many buffer 
-// slots to allocate for "repost immediately" notifications that may trigger
-// before clients collect them.
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-TInt CMmUssdTsy::NumberOfSlotsL(
-    const TInt aIpc )
-    {
-    TInt numberOfSlots = 1;
-    switch ( aIpc )
-        {
-        case EMobileUssdMessagingReceiveMessage:
-            numberOfSlots = KMmUssdMessagingReceiveMessageSlots;  
-            break;
-        case EMobileUssdMessagingNotifyNetworkRelease:
-            numberOfSlots = KMmUssdMessagingNotifyNetworkReleaseSlots;  
-            break;
-        default:
-            User::Leave( KErrNotSupported );
-            break;
-        }
-
-    return numberOfSlots;
-    }
-
-// ---------------------------------------------------------------------------
-// CMmUssdTsy::GetCaps
-// This method returns a class that reflects the Ussd messaging 
-// capabilities of the phone. This feature can be completed without sending 
-// message, because TSY knows phones Ussd capabilities
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-TInt CMmUssdTsy::GetCaps( 
-    const TTsyReqHandle aTsyReqHandle, 
-    TDes8* aCaps )
-    {
-    TInt ret = KErrNone;
-    if( aCaps->MaxLength() >= sizeof(RMobileUssdMessaging::TMobileUssdCapsV1Pckg) )
-    	{
-        RMobileUssdMessaging::TMobileUssdCapsV1Pckg* ussdCapsPckg =
-            reinterpret_cast<RMobileUssdMessaging::TMobileUssdCapsV1Pckg*> 
-            ( aCaps );
-        
-    	RMobileUssdMessaging::TMobileUssdCapsV1& ussdCaps = ( *ussdCapsPckg )();
-    	
-    	// TSY knows what capabilities it has.
-		// Capabilities depend on the TSY implementation.
-		ussdCaps.iUssdTypes = KUssdTypeCaps;
-
-		ussdCaps.iUssdFormat = RMobileUssdMessaging::KCapsPackedString;
-    	}
-    else
-    	{
-    	ret = KErrArgument;
-    	}
-
-    ReqCompleted( aTsyReqHandle, ret );
-
-    return KErrNone;
-    }
-
-// ---------------------------------------------------------------------------
-// CMmUssdTsy::ReceiveMessage
-// This method activates receiving of Ussd messages.
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-TInt CMmUssdTsy::ReceiveMessage(
-    const TTsyReqHandle aTsyReqHandle, 
-    TDes8* aData, 
-    TDes8* aAttributes )              
-    {
-    if(sizeof(RMobileUssdMessaging::TMobileUssdAttributesV1) > aAttributes->MaxLength())
-    	{
-    	return KErrArgument;
-    	}
-
-    TPckg<RMobileUssdMessaging::TMobileUssdAttributesV1>* ussdAttributesPckg =
-         reinterpret_cast<TPckg<RMobileUssdMessaging::TMobileUssdAttributesV1>*>
-         ( aAttributes );
-
-    RMobileUssdMessaging::TMobileUssdAttributesV1& ussdAttributes = 
-    ( *ussdAttributesPckg )();
-
-    // Save request handle
-    iTsyReqHandleStore->SetTsyReqHandle( 
-        EMultimodeUssdReceiveMessage, aTsyReqHandle );
-    iReceiveUssdMessagePtr = aData;
-    iReceiveUssdMessageAttributesPtr = &ussdAttributes;
-
-    return KErrNone;
-    }
-
-// ---------------------------------------------------------------------------
-// CMmUssdTsy::ReceiveMessageCancel
-// This method cancels reception of USSD messages
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-void CMmUssdTsy::ReceiveMessageCancel(
-    const TTsyReqHandle aTsyReqHandle )
-    {
-    iTsyReqHandleStore->ResetTsyReqHandle( EMultimodeUssdReceiveMessage );
-
-    ReqCompleted( aTsyReqHandle, KErrCancel );
-    }
-
-// ---------------------------------------------------------------------------
-// CMmUssdTsy::CompleteReceiveMessage
-// This method completes reception of USSD messages request
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-void CMmUssdTsy::CompleteReceiveMessage(
-    TInt aError, 
-	CMmDataPackage* aDataPackage )
-    {
-TFLOGSTRING("TSY: CMmUssdTsy::CompleteReceiveMessage.\n" );
-    TTsyReqHandle reqHandle = iTsyReqHandleStore->GetTsyReqHandle( 
-        EMultimodeUssdReceiveMessage );
-
-    if ( ( EMultimodeUssdReqHandleUnknown != reqHandle ) )
-        {
-        // reset req handle. Returns the deleted req handle
-        reqHandle = iTsyReqHandleStore->ResetTsyReqHandle(
-            EMultimodeUssdReceiveMessage );
-
-        if ( KErrNone == aError )
-            { 
-            TDes8* unpackedReceiveUssdMessagePtr = NULL;
-            RMobileUssdMessaging::TMobileUssdAttributesV1* unpackedReceiveUssdMessageAttributesPtr = NULL;            
-            aDataPackage->UnPackData (&unpackedReceiveUssdMessagePtr, &unpackedReceiveUssdMessageAttributesPtr);           
-                                  
-            if(iReceiveUssdMessagePtr->MaxLength() >= unpackedReceiveUssdMessagePtr->Length())
-               	{             
-				*iReceiveUssdMessagePtr = *unpackedReceiveUssdMessagePtr;
-				*iReceiveUssdMessageAttributesPtr = *unpackedReceiveUssdMessageAttributesPtr;            		            	
-            	}
-            else
-            	{            	
-            	aError = KErrArgument;
-            	}               
-			}
-        ReqCompleted( reqHandle, aError );
-        }
-    }
-
-// ---------------------------------------------------------------------------
-// CMmUssdTsy::SendMessageL
-// Routes send message to message handler.
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-TInt CMmUssdTsy::SendMessageL( 
-    const TTsyReqHandle aTsyReqHandle, 
-    TDes8* aData, 
-    TDes8* aAttributes )
-    { 
-TFLOGSTRING2("TSY: CMmUssdTsy::SendMessage - Data length: %d", aData->Length() );
-TFLOGSTRING2("TSY: CMmUssdTsy::SendMessageL: iUssdNoFdnCheckFlag: %d", iUssdNoFdnCheckFlag);  
-    TInt ret = KErrNone;
-
-    if ( iSsTransactionOngoing )
-	    {
-	    ret = KErrServerBusy;
-	    }
-    else
-        {
-        // Create package
-        CMmDataPackage package;
-    
-	    // Pack call parameters and mobile call info
-        package.PackData( aData, &aAttributes );
-        
-        // Check if NoFdnCheck is used or not
-        if ( iUssdNoFdnCheckFlag == EUssdNoFdnCheckUsed )
-            {
-            // Send request to the Domestic OS layer.
-            ret = iMmPhone->MessageManager()->HandleRequestL( 
-                EMobileUssdMessagingSendMessageNoFdnCheck, &package );   
-            }
-        if ( iUssdNoFdnCheckFlag == EUssdNoFdnCheckNotUsed ) 
-            {
-            // Send request to the Domestic OS layer.
-            ret = iMmPhone->MessageManager()->HandleRequestL( 
-                EMobileUssdMessagingSendMessage, &package );            
-            }
-            
-        iSsTransactionOngoing = ETrue;
-        }
-
-    if ( KErrNone != ret )
-        {
-        ReqCompleted( aTsyReqHandle, ret );
-        iSsTransactionOngoing = EFalse;
-        iUssdNoFdnCheckFlag = EUssdNoFdnCheckUnknown;
-        }
-    else
-    	{
-#ifdef REQHANDLE_TIMER       
-        // Check if NoFdnCheck is used or not
-        if ( iUssdNoFdnCheckFlag == EUssdNoFdnCheckUsed )
-            {
-            // Set timer for the request
-            SetTypeOfResponse( EMultimodeUssdSendMessageNoFdnCheck, 
-                aTsyReqHandle );     
-            }
-        if ( iUssdNoFdnCheckFlag == EUssdNoFdnCheckNotUsed ) 
-            {
-            // Set timer for the request
-            SetTypeOfResponse( EMultimodeUssdSendMessage, 
-                aTsyReqHandle );
-            }      
-#else
-        // Check if NoFdnCheck is used or not
-        if ( iUssdNoFdnCheckFlag == EUssdNoFdnCheckUsed )
-            {
-            // Save SendMessageNoFdnCheck request handle, set timer
-            iTsyReqHandleStore->SetTsyReqHandle( 
-                EMultimodeUssdSendMessageNoFdnCheck, aTsyReqHandle );
-            }
-        
-        if ( iUssdNoFdnCheckFlag == EUssdNoFdnCheckNotUsed ) 
-            {
-            // Save SendMessage request handle, set timer
-            iTsyReqHandleStore->SetTsyReqHandle( 
-                EMultimodeUssdSendMessage, aTsyReqHandle );
-            }           
-#endif // REQHANDLE_TIMER
-    	}
-
-    return KErrNone;
-    }
-
-// ---------------------------------------------------------------------------
-// CMmCustomTsy::SendMessageCancel
-// Cancels cancelling of USSD session.
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-TInt CMmUssdTsy::SendMessageCancel(
-    const TTsyReqHandle aTsyReqHandle )
-    {
-    // reset the req handle
-    iTsyReqHandleStore->ResetTsyReqHandle( EMultimodeUssdSendMessage );
-    
-    // complete with cancel
-    ReqCompleted( aTsyReqHandle, KErrCancel );
-    iSsTransactionOngoing = EFalse;
-    
-    iUssdNoFdnCheckFlag = EUssdNoFdnCheckUnknown;
-    
-    return KErrNone;
-    }
-    
-// ---------------------------------------------------------------------------
-// CMmUssdTsy::CompleteSendMessage
-// Complete SendMessage 
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-void CMmUssdTsy::CompleteSendMessage(
-    TInt aError )
-    {
-TFLOGSTRING("TSY: CMmUssdTsy::CompleteSendMessage.\n" );
-    TTsyReqHandle reqHandle = iTsyReqHandleStore->GetTsyReqHandle( 
-        EMultimodeUssdSendMessage );
-	
-    if ( EMultimodeUssdReqHandleUnknown != reqHandle )
-        {
-        // reset req handle. Returns the deleted req handle
-        reqHandle = iTsyReqHandleStore->ResetTsyReqHandle(
-            EMultimodeUssdSendMessage );
-        
-        ReqCompleted( reqHandle, aError );
-        iSsTransactionOngoing = EFalse;
-        iUssdNoFdnCheckFlag = EUssdNoFdnCheckUnknown;
-        }
-    }
-
-// ---------------------------------------------------------------------------
-// CMmUssdTsy::SendReleaseL
-// This function cancels active ussd session asynchronously
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-TInt CMmUssdTsy::SendReleaseL(
-    const TTsyReqHandle aTsyReqHandle, 
-    TDes8* aReturnResult )
-    {
-    TTsyReqHandle sendReleaseHandle = 
-        iTsyReqHandleStore->GetTsyReqHandle( EMultimodeUssdSendRelease );
-
-    if ( 0 < sendReleaseHandle )
-        {
-        // The request is already in processing because of previous request
-        // Complete request with status value informing the client about 
-        // the situation.
-TFLOGSTRING("LTSY: CMmUssdTsy::SendRelease - KErrServerBusy");
-        ReqCompleted( aTsyReqHandle, KErrServerBusy );
-        }
-    else
-        {
-TFLOGSTRING("TSY: CMmUssdTsy::SendRelease called");
-
-        TInt ret = KErrGeneral;
-
-        TPckg<RMobilePhone::TMobilePhoneSendSSRequestV3>* ussdSendSSRequestPckg =
-            reinterpret_cast< TPckg<RMobilePhone::TMobilePhoneSendSSRequestV3>* > 
-            ( aReturnResult );
-
-        if ( sizeof(RMobilePhone::TMobilePhoneSendSSRequestV3) >
-                ussdSendSSRequestPckg->MaxLength() )
-            {
-            ret = KErrArgument;
-            }
-        else
-            {
-            RMobilePhone::TMobilePhoneSendSSRequestV3& returnResult = 
-                ( *ussdSendSSRequestPckg )();
-
-            iReturnResultPtr = &returnResult;
-
-            // Send request to the Domestic OS layer.
-            ret = iMmPhone->MessageManager()->HandleRequestL( 
-                EMobileUssdMessagingSendRelease );
-            }
-
-        // If ret is not KErrNone
-        if ( KErrNone != ret )
-            {
-            ReqCompleted( aTsyReqHandle, ret );
-            }
-        else
-        	{
-#ifdef REQHANDLE_TIMER
-            // Set timer for the request
-            SetTypeOfResponse( EMultimodeUssdSendRelease, aTsyReqHandle );
-#else
-            // Save SendMessage request handle, set timer
-            iTsyReqHandleStore->SetTsyReqHandle( 
-                EMultimodeUssdSendRelease, aTsyReqHandle );
-#endif // REQHANDLE_TIMER
-        	}
-        }
-
-    return KErrNone;
-    }
-
-// ---------------------------------------------------------------------------
-// CMmUssdTsy::CompleteSendRelease
-// This method completes an outstanding SendRelease request.
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-void CMmUssdTsy::CompleteSendRelease(
-    TInt aErrorCode, 
-    CMmDataPackage* aDataPackage )
-    {
-TFLOGSTRING("TSY: CMmUssdTsy::CompleteSendRelease" );
-    // reset req handle. Returns the deleted req handle
-    TTsyReqHandle reqHandle = iTsyReqHandleStore->ResetTsyReqHandle( 
-		EMultimodeUssdSendRelease );
-
-    if( CMmPhoneTsy::EMultimodePhoneReqHandleUnknown != reqHandle )
-        {
-        if ( KErrNone == aErrorCode )
-            {
-            aDataPackage->UnPackData ( *iReturnResultPtr );
-            }
-        ReqCompleted( reqHandle, aErrorCode );
-        }  
-    }
-
-// ---------------------------------------------------------------------------
-// CMmCustomTsy::SendReleaseCancel
-// Cancels cancelling of USSD session.
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-TInt CMmUssdTsy::SendReleaseCancel()
-    {
-    // reset the req handle
-    TTsyReqHandle reqHandle = iTsyReqHandleStore->ResetTsyReqHandle(
-        EMultimodeUssdSendRelease );
-    
-        if ( EMultimodeUssdReqHandleUnknown != reqHandle )
-           {
-            // complete with cancel
-            ReqCompleted( reqHandle, KErrCancel );
-           }
-    
-    return KErrNone;
-    }
-
-// ---------------------------------------------------------------------------
-// CMmUssdTsy::NotifyNetworkRelease
-// This method activates notifying of network release
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-TInt CMmUssdTsy::NotifyNetworkRelease(
-    const TTsyReqHandle aTsyReqHandle,
-    TDes8* aMsgData,
-    TDes8* aMsgAttributes) // aMsgAttributes may be NULL
-    {
-TFLOGSTRING("TSY: CMmUssdTsy::NotifyNetworkRelease" );
-    
-	if (aMsgData->MaxLength() < sizeof(RMobilePhone::TMobilePhoneSendSSRequestV3Pckg))
-		{
-	    TFLOGSTRING ("TSY: CMmNetTsy::NotifyNetworkRelease Bad size argument (arg1)");
-	    // Complete the request with appropiate error        
-	    return KErrArgument;		
-		}
-	if (aMsgAttributes && 
-		aMsgAttributes->MaxLength() < sizeof(RMobileUssdMessaging::TMobileUssdAttributesV1Pckg))
-		{
-	    TFLOGSTRING ("TSY: CMmNetTsy::NotifyNetworkRelease Bad size argument (arg2)");
-	    // Complete the request with appropiate error        
-	    return KErrArgument;			
-		}
-
-	TPckg<RMobilePhone::TMobilePhoneSendSSRequestV3>* ussdSendSSRequestPckg =
-            reinterpret_cast< TPckg<RMobilePhone::TMobilePhoneSendSSRequestV3>* > 
-            ( aMsgData );
-
-    RMobilePhone::TMobilePhoneSendSSRequestV3& msgData = 
-            ( *ussdSendSSRequestPckg )();
-
-    iReturnNotifyPtr = &msgData;
-
-    if (aMsgAttributes != NULL)
-    	{
-	    RMobileUssdMessaging::TMobileUssdAttributesV1Pckg* ussdAttributesPckg = 
-	    		reinterpret_cast< RMobileUssdMessaging::TMobileUssdAttributesV1Pckg* > (aMsgAttributes);
-	    		
-	    RMobileUssdMessaging::TMobileUssdAttributesV1& msgAttributes = (*ussdAttributesPckg)();
-	    
-	    iReturnNotifyUssdMessageAttributesPtr = &msgAttributes;
-    	}
-    else
-    	{
-    	iReturnNotifyUssdMessageAttributesPtr = NULL;
-    	}
-#ifdef REQHANDLE_TIMER
-    // Set timer for the request
-    SetTypeOfResponse( EMultimodeUssdNotifyNetworkRelease, aTsyReqHandle );
-#else
-    // Save SendMessage request handle, set timer
-    iTsyReqHandleStore->SetTsyReqHandle( 
-        EMultimodeUssdNotifyNetworkRelease, aTsyReqHandle );
-#endif // REQHANDLE_TIMER
-    
-    return KErrNone;
-    }
-
-// ---------------------------------------------------------------------------
-// CMmUssdTsy::CompleteNotifyNetworkRelease
-// This method completes notify network release request.
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-void CMmUssdTsy::CompleteNotifyNetworkRelease(
-    TInt aErrorCode,
-    CMmDataPackage* aDataPackage )
-    {
-
-TFLOGSTRING2("TSY: CMmUssdTsy::CompleteNotifyNetworkRelease. Error: %d", aErrorCode );
-    // reset req handle. Returns the deleted req handle
-    TTsyReqHandle reqHandle = iTsyReqHandleStore->ResetTsyReqHandle(
-		EMultimodeUssdNotifyNetworkRelease );
-
-    if( CMmPhoneTsy::EMultimodePhoneReqHandleUnknown != reqHandle )
-        {
-        if ( KErrNone == aErrorCode )
-            {
-            RMobilePhone::TMobilePhoneSendSSRequestV3* tempReturnNotifyPtr;
-            if (iReturnNotifyUssdMessageAttributesPtr != NULL)
-				{
-				RMobileUssdMessaging::TMobileUssdAttributesV1* tempReturnNotifyUssdMessageAttributesPtr;
-				aDataPackage->UnPackData ( &tempReturnNotifyPtr, &tempReturnNotifyUssdMessageAttributesPtr );
-				if (tempReturnNotifyPtr != NULL)
-				    {
-				    *iReturnNotifyPtr = *tempReturnNotifyPtr;
-				    }
-				else
-				    {
-                    iReturnNotifyPtr->iOpCode = KErrNone;
-                    iReturnNotifyPtr->iAdditionalInfo.Append( KErrNone );
-				    }
-				if (tempReturnNotifyUssdMessageAttributesPtr != NULL)
-					{
-					*iReturnNotifyUssdMessageAttributesPtr = *tempReturnNotifyUssdMessageAttributesPtr;
-					}
-				else
-				    {
-                    iReturnNotifyUssdMessageAttributesPtr->iFormat = RMobileUssdMessaging::EFormatUnspecified;
-                    iReturnNotifyUssdMessageAttributesPtr->iType = RMobileUssdMessaging::EUssdUnknown;
-				    }
-				}
-            else
-				{
-				aDataPackage->UnPackData ( &tempReturnNotifyPtr );
-				if(tempReturnNotifyPtr != NULL)
-				    {
-                    *iReturnNotifyPtr = *tempReturnNotifyPtr;
-				    }
-				else
-				    {
-                    iReturnNotifyPtr->iOpCode = KErrNone;
-                    iReturnNotifyPtr->iAdditionalInfo.Append( KErrNone );
-				    }
-				}
-            }
-         // Null ret pointers
-        iReturnNotifyPtr = NULL;
-        iReturnNotifyUssdMessageAttributesPtr = NULL;
-       
-        // Complete the client request
-        ReqCompleted( reqHandle, aErrorCode );
-        } 
-    } 
-
-// ---------------------------------------------------------------------------
-// CMmCustomTsy::NotifyNetworkReleaseCancel
-// Cancels notify network release request.
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-TInt CMmUssdTsy::NotifyNetworkReleaseCancel()
-    {
-    // reset the req handle
-    TTsyReqHandle reqHandle = iTsyReqHandleStore->ResetTsyReqHandle(
-        EMultimodeUssdNotifyNetworkRelease );
-   
-    // This will always be true if the etel is handling the request correctly.
-    // In case etel fails to block the request this will prevent crashing. 
-    if ( EMultimodeUssdReqHandleUnknown != reqHandle ) 
-        {
-        // Null ret pointers
-        iReturnNotifyPtr = NULL;
-        iReturnNotifyUssdMessageAttributesPtr = NULL;
-       
-        // complete with cancel
-        ReqCompleted( reqHandle, KErrCancel );
-        }
-    
-    return KErrNone;
-    }
-
-// ---------------------------------------------------------------------------
-// CMmUssdTsy::ResetVariables
-// Reset used member variables.
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-void CMmUssdTsy::ResetVariables()
-    {
-    iReceiveUssdMessagePtr = NULL;
-    iReceiveUssdMessageAttributesPtr = NULL;
-    iReturnResultPtr = NULL;
-    iReturnNotifyPtr = NULL;
-    iReturnNotifyUssdMessageAttributesPtr = NULL;    
-    }
-
-#ifdef REQHANDLE_TIMER
-// ---------------------------------------------------------------------------
-// CMmUssdTsy::SetTypeOfResponse
-// Sets the type of response for a given Handle. Automatic
-// mode includes an automatic response in case of non response
-// from the DOS in a specified time
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-void CMmUssdTsy::SetTypeOfResponse(
-    const TInt aReqHandleType, 
-    const TTsyReqHandle aTsyReqHandle )
-    {
-    TInt timeOut( 0 );
-
-    switch ( aReqHandleType )
-        {
-        case EMultimodeUssdSendMessage:
-            timeOut = KMmUssdSendMessageTimeOut;
-            break;
-        case EMultimodeUssdSendMessageNoFdnCheck:
-            timeOut = KMmUssdSendMessageNoFdnCheckTimeOut;
-            break;            
-        case EMultimodeUssdSendRelease:
-            timeOut = KMmUssdSendReleaseTimeOut;
-            break;
-        default:
-            // Does not use timer
-            iTsyReqHandleStore->SetTsyReqHandle( 
-                aReqHandleType, aTsyReqHandle );
-            break;
-        }
-
-    if ( timeOut > 0 )
-        {
-        // The timeout parameter is given in seconds.
-        iTsyReqHandleStore->SetTsyReqHandle( aReqHandleType, 
-            aTsyReqHandle, timeOut );
-        }
-    }
-
-// ---------------------------------------------------------------------------
-// CMmUssdTsy::Complete
-// Completes the request due timer expiration
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-void CMmUssdTsy::Complete(
-    TInt aReqHandleType, 
-    TInt aError )
-    {
-    // All possible TSY req handle types are listed in the
-    // switch case below. 
-    
-    RMobilePhone::TMobilePhoneSendSSRequestV3 returnResult;
-    // create package.
-    CMmDataPackage package;
-    
-    switch( aReqHandleType )
-        {
-        // Cases handled with automatic completion
-        case EMultimodeUssdSendMessage:
-            CompleteSendMessage( aError );
-            break;
-        case EMultimodeUssdSendMessageNoFdnCheck:
-            CompleteSendMessageNoFdnCheck( aError );
-            break;
-        case EMultimodeUssdSendRelease:
-            returnResult.iOpCode = static_cast< TUint8 >( KErrTimedOut );
-            returnResult.iAdditionalInfo.Append ( KErrNone );
-
-            // pack the data
-            package.PackData( &returnResult );
-            CompleteSendRelease( aError, &package );
-            break;
-        default:
-            ReqCompleted( iTsyReqHandleStore->ResetTsyReqHandle( 
-				aReqHandleType ), aError );
-            break;
-        }
-    }
-#endif // REQHANDLE_TIMER
-
-#ifdef TF_LOGGING_ENABLED
-// ---------------------------------------------------------------------------
-// CMmUssdTsy::ReqCompleted
-// Overloads CTelObject::ReqCompleted for logging purposes. It 
-// prints the aTsyReqHandle and aError variable in the log file and then 
-// calls CTelObject::ReqCompleted.
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-void CMmUssdTsy::ReqCompleted(
-    const TTsyReqHandle aTsyReqHandle, 
-    const TInt aError )
-    {
-TFLOGSTRING3("TSY: CMmUssdTsy::ReqCompleted. Handle: %d Error: %d", aTsyReqHandle, aError);
-    CTelObject::ReqCompleted( aTsyReqHandle, aError );
-    }
-#endif // TF_LOGGING_ENABLED
-
-// ---------------------------------------------------------------------------
-// CMmUssdTsy::Phone
-// This method returns pointer to the Phone object.
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-CMmPhoneTsy* CMmUssdTsy::Phone()
-    {
-    return iMmPhone;
-    }
-
-// ---------------------------------------------------------------------------
-// CMmUssdTsy::IsRequestPossibleInOffLine
-// Checks whether a ETel request can be performed or not while offline mode is
-// enabled
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-TBool CMmUssdTsy::IsRequestPossibleInOffline( TInt aIpc ) const
-    {
-    TBool isRequestPossible ( ETrue );
-
-    switch ( aIpc )
-        {
-        case EMobileUssdMessagingSendMessage:      
-        case EMobileUssdMessagingSendMessageNoFdnCheck:
-        case EMobileUssdMessagingSendRelease:
-            isRequestPossible = EFalse;
-            break;
-        case EMobileUssdMessagingReceiveMessage:
-        default:
-            break;
-        }
-        
-    return isRequestPossible;
-    }
-
-// ---------------------------------------------------------------------------
-// CMmUssdTsy::SendMessageNoFDNCheckCancel
-// Cancels SendMessageNoFDNCheck request.
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-TInt CMmUssdTsy::SendMessageNoFdnCheckCancel( 
-    const TTsyReqHandle aTsyReqHandle )
-    {
-TFLOGSTRING("TSY: CMmUssdTsy::SendMessageNoFdnCheckCancel" );
-
-    // reset the req handle
-    TTsyReqHandle reqHandle  = iTsyReqHandleStore->ResetTsyReqHandle( 
-        EMultimodeUssdSendMessageNoFdnCheck );
-    
-    if ( EMultimodeUssdReqHandleUnknown < reqHandle )
-        {
-        // complete with cancel
-        ReqCompleted( aTsyReqHandle, KErrCancel );
-        iSsTransactionOngoing = EFalse; 
-        }
-    
-    iUssdNoFdnCheckFlag = EUssdNoFdnCheckUnknown;
-    return KErrNone;
-    }
-    
-// ---------------------------------------------------------------------------
-// CMmUssdTsy::CompleteSendMessageNoFdnCheck
-// Complete SendMessage 
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-void CMmUssdTsy::CompleteSendMessageNoFdnCheck(
-    TInt aError )
-    {
-TFLOGSTRING("TSY: CMmUssdTsy::CompleteSendMessageNoFdnCheck.\n" );
-    // get reg handle
-    TTsyReqHandle reqHandle = iTsyReqHandleStore->GetTsyReqHandle( 
-        EMultimodeUssdSendMessageNoFdnCheck );
-	
-    if ( EMultimodeUssdReqHandleUnknown != reqHandle )
-        {
-        // reset req handle. Returns the deleted req handle
-        reqHandle = iTsyReqHandleStore->ResetTsyReqHandle(
-            EMultimodeUssdSendMessageNoFdnCheck );
-        
-        ReqCompleted( reqHandle, aError );
-        iSsTransactionOngoing = EFalse;
-        iUssdNoFdnCheckFlag = EUssdNoFdnCheckUnknown;
-        }
-    }
-
-
-// End of file
-
-
+// Copyright (c) 2006-2009 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:
+//
+
+
+
+// INCLUDE FILES
+#include <etelmm.h>
+#include <mmlist.h>
+#include "cmmussdtsy.h"
+#include <ctsy/serviceapi/cmmsmsutility.h>
+#include "MmTsy_timeoutdefs.h"
+#include "MmTsy_numberOfSlots.h"
+#include "cmmtsyreqhandlestore.h"
+#include "CMmCommonStaticUtility.h"
+#include "cmmmessagemanagerbase.h"
+#include <ctsy/pluginapi/cmmdatapackage.h>
+#include <ctsy/serviceapi/gsmerror.h>
+
+// ======== MEMBER FUNCTIONS ========
+
+CMmUssdTsy::CMmUssdTsy()
+    {
+    }
+
+void CMmUssdTsy::ConstructL(
+    CMmPhoneTsy* aMmPhoneTsy )
+    {
+TFLOGSTRING("TSY: CMmUssdTsy::ConstructL\n" );
+    iMmPhone = aMmPhoneTsy;
+
+    // register .
+    iMmPhone->MessageManager()->RegisterTsyObject(
+		CMmMessageManagerBase::EUssdMessagingTsy, this );
+
+#ifdef REQHANDLE_TIMER   
+    // create req handle store
+    iTsyReqHandleStore = CMmTsyReqHandleStore::NewL( this, iMmPhone,
+        EMultimodeUssdMaxNumOfRequests, iUssdReqHandles);
+#else
+    // create req handle store
+    iTsyReqHandleStore = CMmTsyReqHandleStore::NewL(
+        EMultimodeUssdMaxNumOfRequests, iUssdReqHandles);
+
+#endif // REQHANDLE_TIMER
+
+    // Reset all CMmUssdTsy variables
+    ResetVariables();
+
+    // Initialize boolean flag
+    iUssdNoFdnCheckFlag =  EUssdNoFdnCheckUnknown;
+    }
+
+CMmUssdTsy* CMmUssdTsy::NewL( 
+    CMmPhoneTsy* aMmPhone )                                 
+    {
+    CMmUssdTsy* aMmUssdTsy = new( ELeave ) CMmUssdTsy();
+    CleanupClosePushL( *aMmUssdTsy );
+    aMmUssdTsy->ConstructL( aMmPhone );
+    aMmUssdTsy->iMmPhone = aMmPhone;
+    CleanupStack::Pop();
+    
+    return aMmUssdTsy;
+    }
+
+CMmUssdTsy::~CMmUssdTsy()
+    {
+TFLOGSTRING("TSY: CMmUssdTsy::~CMmUssdTsy" );
+    // unregister.
+    if ( iMmPhone )
+        {
+        // deregister tsy object from message manager
+        iMmPhone->MessageManager()->DeregisterTsyObject(this);        
+        }
+
+    // delete req handle store
+    delete iTsyReqHandleStore;
+    iTsyReqHandleStore = NULL;
+
+    // Null other pointers
+    iReturnResultPtr = NULL;
+    iReceiveUssdMessagePtr = NULL;
+    iReceiveUssdMessageAttributesPtr = NULL;
+    iMmPhone = NULL;
+    }
+
+// ---------------------------------------------------------------------------
+// CMmUssdTsy::Init
+// Initialisation method that is called from ETel Server.
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+void CMmUssdTsy::Init()
+    {
+    }
+
+// ---------------------------------------------------------------------------
+// CMmUssdTsy::ExtFunc
+// ExtFunc is called by the server when it has an "extended",i.e.
+// non-core ETel request for the TSY. To process a request handle, request type
+// and request data are passed to the TSY.
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+TInt CMmUssdTsy::ExtFunc( 
+    const TTsyReqHandle aTsyReqHandle, 
+    const TInt aIpc, 
+    const TDataPackage& aPackage )        
+    {
+    TInt ret = KErrNone;
+    TInt trapError = KErrNone;
+
+    // before processing further the request, check if offline mode status
+    // is enabled and if the given request can be perfomed in that case.
+    if ( ERfsStateInfoInactive == iMmPhone->GetRfStateInfo() && 
+        ( !IsRequestPossibleInOffline( aIpc ) ) )  
+        {
+TFLOGSTRING2 ("TSY: Offline mode ON, request is not allowed: %d", aIpc );
+        ret = CMmCommonStaticUtility::EpocErrorCode( KErrGeneral, 
+            KErrGsmOfflineOpNotAllowed );
+
+        // Complete the request with appropiate error
+        ReqCompleted ( aTsyReqHandle, ret ); 
+        }
+    else
+        {
+        // Original code continues here.
+        TRAP( trapError, ret = DoExtFuncL( aTsyReqHandle, aIpc, aPackage ); );
+        TInt reqMode = 0;
+        TRAP_IGNORE( reqMode = ReqModeL(aIpc) );
+        if ( trapError != KErrNone )
+            {
+            // Object cannot be created. 
+            ReqCompleted( aTsyReqHandle, trapError );
+            }
+        else if ( ret != KErrNone && reqMode&KReqModeMultipleCompletionWithInterestLevel )
+            {
+            // As the error has occured in the synchronous part of the client call
+            // we want the error to go directly back to the client which made the
+            // call. We don't want to be offering the error to all clients as part
+            // of our deliver mechanism.
+            return ret;
+            }
+        else if ( ret != KErrNone )
+            {
+            ReqCompleted( aTsyReqHandle, ret );
+            }
+        }
+    
+    return KErrNone;
+    }
+
+// ---------------------------------------------------------------------------
+// CMmUssdTsy::DoExtFuncL
+// ExtFunc is called by the server when it has an "extended",i.e.
+// non-core ETel request for the TSY. To process a request handle,request type
+// and request data are passed to the TSY.
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+TInt CMmUssdTsy::DoExtFuncL( 
+    const TTsyReqHandle aTsyReqHandle, 
+    const TInt aIpc, 
+    const TDataPackage& aPackage )
+    {
+    TInt ret(KErrNone);
+
+    switch ( aIpc ) 
+        {
+        // Ussd Messaging requests
+        case EMobileUssdMessagingGetCaps:
+            ret = GetCaps( aTsyReqHandle, aPackage.Des1n() );
+            break;
+        case EMobileUssdMessagingReceiveMessage:
+            ret = ReceiveMessage( aTsyReqHandle, aPackage.Des1n(), 
+                aPackage.Des2n() );
+            break;
+        case EMobileUssdMessagingSendMessage:
+            {
+            iUssdNoFdnCheckFlag = EUssdNoFdnCheckNotUsed;
+            ret = SendMessageL( 
+                aTsyReqHandle, aPackage.Des1n(), aPackage.Des2n() );
+            }
+            break;
+        case EMobileUssdMessagingSendMessageNoFdnCheck:
+            {
+            iUssdNoFdnCheckFlag = EUssdNoFdnCheckUsed;
+            ret = SendMessageL( 
+                aTsyReqHandle, aPackage.Des1n(), aPackage.Des2n() );                
+            }
+            break;
+        case EMobileUssdMessagingSendRelease:
+            ret = SendReleaseL( aTsyReqHandle, aPackage.Des1n() );
+            break;
+        case EMobileUssdMessagingNotifyNetworkRelease:
+            switch( aPackage.Type() )
+                 {
+             	// Switch between alternative implementations of NotifyNetworkRelease
+                 case TDataPackage::EPackage1n:
+                	 ret = NotifyNetworkRelease( aTsyReqHandle, aPackage.Des1n(), NULL );
+                	 break;
+                 case TDataPackage::EPackage1n2n:
+                	 ret = NotifyNetworkRelease( aTsyReqHandle, aPackage.Des1n(), aPackage.Des2n() );
+                     break;
+                 default:
+                     ret = KErrNotSupported;
+                     break;
+                 }
+            
+            break;
+        default:
+            ret = KErrNotSupported;
+            break;
+        }
+
+    return ret;
+    }
+
+// ---------------------------------------------------------------------------
+// CMmUssdTsy::CancelService
+// CancelService is called by the server when it is "cleaning-up"
+// any still outstanding asynchronous requests before closing a client's
+// sub-session. This will happen if a client closes its R-class handle without
+// cancelling outstanding asynchronous requests
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+TInt CMmUssdTsy::CancelService( 
+    const TInt aIpc, 
+    const TTsyReqHandle aTsyReqHandle )           
+    {
+    TInt ret( KErrNone );
+
+    switch ( aIpc )
+        {
+        case EMobileUssdMessagingReceiveMessage:
+            ReceiveMessageCancel( aTsyReqHandle );
+            ret = KErrNone;
+            break;
+        case EMobileUssdMessagingSendMessage:
+            SendMessageCancel( aTsyReqHandle );
+            ret = KErrNone;
+            break;
+        case EMobileUssdMessagingSendMessageNoFdnCheck:
+            SendMessageNoFdnCheckCancel( aTsyReqHandle );
+            ret = KErrNone;
+            break;            
+        case EMobileUssdMessagingSendRelease:
+            SendReleaseCancel();
+            ret = KErrNone;
+            break;
+        case EMobileUssdMessagingNotifyNetworkRelease:
+            NotifyNetworkReleaseCancel();
+            ret = KErrNone;
+            break;
+        default:
+            ret = KErrNotSupported;
+            break;
+        } 
+
+    return ret;
+    }
+
+// ---------------------------------------------------------------------------
+// CMmUssdTsy::ReqModeL
+// When the ETel server receives an "extension" client request,
+// it will pass the IPC request number down to the TSY in order to find out
+// what type of request it is. The virtual method that gets called is ReqModeL
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+CTelObject::TReqMode CMmUssdTsy::ReqModeL(
+    const TInt aIpc )    
+    {
+    CTelObject::TReqMode ret ( 0 );
+
+    switch ( aIpc )
+        {
+        // Non-Flow Controlled Services
+        case EMobileUssdMessagingGetCaps:
+            break;
+        // Flow Controlled Services
+
+        // Immediate Server Repost
+        case EMobileUssdMessagingReceiveMessage:
+            ret = KReqModeRePostImmediately | 
+                KReqModeMultipleCompletionWithInterestLevel;
+            break;
+        // Services handled by TSY
+        case EMobileUssdMessagingSendMessage:
+        case EMobileUssdMessagingSendMessageNoFdnCheck:
+        case EMobileUssdMessagingSendRelease:
+            //ret = KReqModeSessionBased;
+            ret = 0;
+            break;
+        case EMobileUssdMessagingNotifyNetworkRelease:
+            // Multiple completion because the clients don't have to own the
+            // session in order to be notified that the session has been
+            // released.
+            ret = KReqModeMultipleCompletionEnabled;
+            break;
+        default:
+            User::Leave( KErrNotSupported );
+            break;
+        }
+
+    return ret;
+    }
+
+// ---------------------------------------------------------------------------
+// CMmUssdTsy::OpenNewObjectL
+// Opens new object and names it. Not supported.
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+CTelObject* CMmUssdTsy::OpenNewObjectL( 
+    TDes& /*aName*/ )    
+    {
+    User::Leave( KErrNotSupported );
+    //lint -e{527} "unreachable code"
+
+    return NULL;
+    }
+
+// ---------------------------------------------------------------------------
+// CMmUssdTsy::OpenNewObjectByNameL
+// Open extendible sub-sessions. Not Supported
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+CTelObject* CMmUssdTsy::OpenNewObjectByNameL(
+    const TDesC& /*aName*/ )       
+    {
+    User::Leave( KErrNotSupported );
+    //lint -e{527} "unreachable code"
+
+    return NULL;
+    }
+
+// ---------------------------------------------------------------------------
+// CMmUssdTsy::RegisterNotification
+// RegisterNotification is called when the server recognises that
+// this notification is being posted for the first time on this sub-session
+// object. It enables the TSY to "turn on" any regular notification messages
+// that it may receive from DOS.
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+TInt CMmUssdTsy::RegisterNotification(
+    const TInt aIpc )                             // Notification IPC number
+    {
+    TFLOGSTRING2( "TSY: CMmUssdTsy::RegisterNotification. IPC: %d", aIpc );
+
+    TInt ret( KErrNone );
+
+    switch ( aIpc )
+        {
+        case EMobileUssdMessagingNotifyNetworkRelease:
+        case EMobileUssdMessagingReceiveMessage:
+        	break;
+        default:
+            // Not supported
+            ret = KErrNotSupported;
+            break;
+        }
+
+    return ret;
+    }
+    
+// ---------------------------------------------------------------------------
+// CMmUssdTsy::DeregisterNotification
+// DeregisterNotification is called when the server recognises 
+// that this notification will not be posted again because the last client 
+// to have a handle on this sub-session object has just closed the handle.
+// It enables the TSY to "turn off" any regular notification messages that it
+// may receive from DOS.
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+TInt CMmUssdTsy::DeregisterNotification(
+    const TInt aIpc )                             // Notification IPC number
+    {        
+    TFLOGSTRING2( "TSY: CMmUssdTsy::DeregisterNotification. IPC: %d", aIpc );
+
+    TInt ret( KErrNone );
+
+    switch ( aIpc )
+        {
+        case EMobileUssdMessagingNotifyNetworkRelease:
+        case EMobileUssdMessagingReceiveMessage:
+            break;
+        default:
+            // Not supported
+            ret = KErrNotSupported;
+            break;
+        }
+
+    return ret;
+    }
+    
+// ---------------------------------------------------------------------------
+// CMmUssdTsy::NumberOfSlotsL
+// NumberOfSlotsL is called by the server when it is registering 
+// a new NOTIFICATION. It enables the TSY to tell the server how many buffer 
+// slots to allocate for "repost immediately" notifications that may trigger
+// before clients collect them.
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+TInt CMmUssdTsy::NumberOfSlotsL(
+    const TInt aIpc )
+    {
+    TInt numberOfSlots = 1;
+    switch ( aIpc )
+        {
+        case EMobileUssdMessagingReceiveMessage:
+            numberOfSlots = KMmUssdMessagingReceiveMessageSlots;  
+            break;
+        case EMobileUssdMessagingNotifyNetworkRelease:
+            numberOfSlots = KMmUssdMessagingNotifyNetworkReleaseSlots;  
+            break;
+        default:
+            User::Leave( KErrNotSupported );
+            break;
+        }
+
+    return numberOfSlots;
+    }
+
+// ---------------------------------------------------------------------------
+// CMmUssdTsy::GetCaps
+// This method returns a class that reflects the Ussd messaging 
+// capabilities of the phone. This feature can be completed without sending 
+// message, because TSY knows phones Ussd capabilities
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+TInt CMmUssdTsy::GetCaps( 
+    const TTsyReqHandle aTsyReqHandle, 
+    TDes8* aCaps )
+    {
+    TInt ret = KErrNone;
+    if( aCaps->MaxLength() >= sizeof(RMobileUssdMessaging::TMobileUssdCapsV1Pckg) )
+    	{
+        RMobileUssdMessaging::TMobileUssdCapsV1Pckg* ussdCapsPckg =
+            reinterpret_cast<RMobileUssdMessaging::TMobileUssdCapsV1Pckg*> 
+            ( aCaps );
+        
+    	RMobileUssdMessaging::TMobileUssdCapsV1& ussdCaps = ( *ussdCapsPckg )();
+    	
+    	// TSY knows what capabilities it has.
+		// Capabilities depend on the TSY implementation.
+		ussdCaps.iUssdTypes = KUssdTypeCaps;
+
+		ussdCaps.iUssdFormat = RMobileUssdMessaging::KCapsPackedString;
+    	}
+    else
+    	{
+    	ret = KErrArgument;
+    	}
+
+    ReqCompleted( aTsyReqHandle, ret );
+
+    return KErrNone;
+    }
+
+// ---------------------------------------------------------------------------
+// CMmUssdTsy::ReceiveMessage
+// This method activates receiving of Ussd messages.
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+TInt CMmUssdTsy::ReceiveMessage(
+    const TTsyReqHandle aTsyReqHandle, 
+    TDes8* aData, 
+    TDes8* aAttributes )              
+    {
+    if(sizeof(RMobileUssdMessaging::TMobileUssdAttributesV1) > aAttributes->MaxLength())
+    	{
+    	return KErrArgument;
+    	}
+
+    if (RMobileUssdMessaging::TGsmUssdMessageData().MaxLength() > aData->MaxLength()) 
+        {
+        return KErrArgument;
+        }
+    
+    TPckg<RMobileUssdMessaging::TMobileUssdAttributesV1>* ussdAttributesPckg =
+         reinterpret_cast<TPckg<RMobileUssdMessaging::TMobileUssdAttributesV1>*>
+         ( aAttributes );
+
+    RMobileUssdMessaging::TMobileUssdAttributesV1& ussdAttributes = 
+    ( *ussdAttributesPckg )();
+
+    // Save request handle
+    iTsyReqHandleStore->SetTsyReqHandle( 
+        EMultimodeUssdReceiveMessage, aTsyReqHandle );
+    iReceiveUssdMessagePtr = aData;
+    iReceiveUssdMessageAttributesPtr = &ussdAttributes;
+
+    return KErrNone;
+    }
+
+// ---------------------------------------------------------------------------
+// CMmUssdTsy::ReceiveMessageCancel
+// This method cancels reception of USSD messages
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+void CMmUssdTsy::ReceiveMessageCancel(
+    const TTsyReqHandle aTsyReqHandle )
+    {
+    iTsyReqHandleStore->ResetTsyReqHandle( EMultimodeUssdReceiveMessage );
+
+    ReqCompleted( aTsyReqHandle, KErrCancel );
+    }
+
+// ---------------------------------------------------------------------------
+// CMmUssdTsy::CompleteReceiveMessage
+// This method completes reception of USSD messages request
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+void CMmUssdTsy::CompleteReceiveMessage(
+    TInt aError, 
+	CMmDataPackage* aDataPackage )
+    {
+    // TODO if a session is in progress and this is a notification then we need to send back
+    // a USSD busy code.
+    
+TFLOGSTRING("TSY: CMmUssdTsy::CompleteReceiveMessage.\n" );
+    TTsyReqHandle reqHandle = iTsyReqHandleStore->GetTsyReqHandle( 
+        EMultimodeUssdReceiveMessage );
+
+    if ( ( EMultimodeUssdReqHandleUnknown != reqHandle ) )
+        {
+        // reset req handle. Returns the deleted req handle
+        reqHandle = iTsyReqHandleStore->ResetTsyReqHandle(
+            EMultimodeUssdReceiveMessage );
+
+        if ( KErrNone == aError )
+            { 
+            TDes8* unpackedReceiveUssdMessagePtr = NULL;
+            RMobileUssdMessaging::TMobileUssdAttributesV1* unpackedReceiveUssdMessageAttributesPtr = NULL;            
+            aDataPackage->UnPackData (&unpackedReceiveUssdMessagePtr, &unpackedReceiveUssdMessageAttributesPtr);           
+                                  
+            if(iReceiveUssdMessagePtr->MaxLength() >= unpackedReceiveUssdMessagePtr->Length())
+               	{             
+				*iReceiveUssdMessagePtr = *unpackedReceiveUssdMessagePtr;
+				*iReceiveUssdMessageAttributesPtr = *unpackedReceiveUssdMessageAttributesPtr;            		            	
+            	}
+            else
+            	{            	
+            	aError = KErrArgument;
+            	}               
+			}
+        ReqCompleted( reqHandle, aError );
+        }
+    }
+
+// ---------------------------------------------------------------------------
+// CMmUssdTsy::SendMessageL
+// Routes send message to message handler.
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+TInt CMmUssdTsy::SendMessageL( 
+    const TTsyReqHandle aTsyReqHandle, 
+    TDes8* aData, 
+    TDes8* aAttributes )
+    { 
+TFLOGSTRING2("TSY: CMmUssdTsy::SendMessage - Data length: %d", aData->Length() );
+TFLOGSTRING2("TSY: CMmUssdTsy::SendMessageL: iUssdNoFdnCheckFlag: %d", iUssdNoFdnCheckFlag);  
+    TInt ret = KErrNone;
+
+    if ( iSsTransactionOngoing )
+	    {
+	    ret = KErrServerBusy;
+	    }
+    else
+        {
+        // Create package
+        CMmDataPackage package;
+    
+	    // Pack call parameters and mobile call info
+        package.PackData( aData, &aAttributes );
+        
+        // Check if NoFdnCheck is used or not
+        if ( iUssdNoFdnCheckFlag == EUssdNoFdnCheckUsed )
+            {
+            // Send request to the Domestic OS layer.
+            ret = iMmPhone->MessageManager()->HandleRequestL( 
+                EMobileUssdMessagingSendMessageNoFdnCheck, &package );   
+            }
+        if ( iUssdNoFdnCheckFlag == EUssdNoFdnCheckNotUsed ) 
+            {
+            // Send request to the Domestic OS layer.
+            ret = iMmPhone->MessageManager()->HandleRequestL( 
+                EMobileUssdMessagingSendMessage, &package );            
+            }
+            
+        iSsTransactionOngoing = ETrue;
+        }
+
+    if ( KErrNone != ret )
+        {
+        ReqCompleted( aTsyReqHandle, ret );
+        iSsTransactionOngoing = EFalse;
+        iUssdNoFdnCheckFlag = EUssdNoFdnCheckUnknown;
+        }
+    else
+    	{
+/* TODO
+        if (!IsSessionInProgress())
+            {
+            // If a session isn't in progress then reserve the session to
+            // prevent any other attempts at opening a dialogue. If the send
+            // succeeds then the session is opened. If the send fails or the
+            // user cancels the send then we cancel it.
+            // If the session is already in progress then no reservation is
+            // necessary and the success or failure of this send does not
+            // affect the session or dialogue state.
+            (void)ReserveSession();
+            }
+*/    	
+#ifdef REQHANDLE_TIMER       
+        // Check if NoFdnCheck is used or not
+        if ( iUssdNoFdnCheckFlag == EUssdNoFdnCheckUsed )
+            {
+            // Set timer for the request
+            SetTypeOfResponse( EMultimodeUssdSendMessageNoFdnCheck, 
+                aTsyReqHandle );     
+            }
+        if ( iUssdNoFdnCheckFlag == EUssdNoFdnCheckNotUsed ) 
+            {
+            // Set timer for the request
+            SetTypeOfResponse( EMultimodeUssdSendMessage, 
+                aTsyReqHandle );
+            }      
+#else
+        // Check if NoFdnCheck is used or not
+        if ( iUssdNoFdnCheckFlag == EUssdNoFdnCheckUsed )
+            {
+            // Save SendMessageNoFdnCheck request handle, set timer
+            iTsyReqHandleStore->SetTsyReqHandle( 
+                EMultimodeUssdSendMessageNoFdnCheck, aTsyReqHandle );
+            }
+        
+        if ( iUssdNoFdnCheckFlag == EUssdNoFdnCheckNotUsed ) 
+            {
+            // Save SendMessage request handle, set timer
+            iTsyReqHandleStore->SetTsyReqHandle( 
+                EMultimodeUssdSendMessage, aTsyReqHandle );
+            }           
+#endif // REQHANDLE_TIMER
+    	}
+
+    return KErrNone;
+    }
+
+// ---------------------------------------------------------------------------
+// CmmUssdTsy::SendMessageCancel
+// Cancels cancelling of USSD session.
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+TInt CMmUssdTsy::SendMessageCancel(
+    const TTsyReqHandle aTsyReqHandle )
+    {
+    // reset the req handle
+    iTsyReqHandleStore->ResetTsyReqHandle( EMultimodeUssdSendMessage );
+
+//    CancelReserveSession(); TODO
+    
+    // complete with cancel
+    ReqCompleted( aTsyReqHandle, KErrCancel );
+    iSsTransactionOngoing = EFalse;
+    
+    iUssdNoFdnCheckFlag = EUssdNoFdnCheckUnknown;
+    
+    return KErrNone;
+    }
+    
+// ---------------------------------------------------------------------------
+// CMmUssdTsy::CompleteSendMessage
+// Complete SendMessage 
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+void CMmUssdTsy::CompleteSendMessage(
+    TInt aError )
+    {
+TFLOGSTRING("TSY: CMmUssdTsy::CompleteSendMessage.\n" );
+    TTsyReqHandle reqHandle = iTsyReqHandleStore->GetTsyReqHandle( 
+        EMultimodeUssdSendMessage );
+	
+    if ( EMultimodeUssdReqHandleUnknown != reqHandle )
+        {
+        // reset req handle. Returns the deleted req handle
+        reqHandle = iTsyReqHandleStore->ResetTsyReqHandle(
+            EMultimodeUssdSendMessage );
+/* TODO        
+        // If the session is already in progress then no session management
+        // action is required. Otherwise we either promote the reserved
+        // session to an open session or cancel the reservation.
+        if ( !IsSessionInProgress() && IsSessionReserved() )
+            {
+            if ( KErrNone == aError )
+                {
+                SetSessionOwnerByTsyHandle( reqHandle );
+                }
+            else
+                {
+                CancelReserveSession();
+                }
+            }
+*/        
+        ReqCompleted( reqHandle, aError );
+        iSsTransactionOngoing = EFalse;
+        iUssdNoFdnCheckFlag = EUssdNoFdnCheckUnknown;
+        }
+    }
+
+// ---------------------------------------------------------------------------
+// CMmUssdTsy::SendReleaseL
+// This function cancels active ussd session asynchronously
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+TInt CMmUssdTsy::SendReleaseL(
+    const TTsyReqHandle aTsyReqHandle, 
+    TDes8* aReturnResult )
+    {
+/* TODO
+    if ( !IsSessionInProgress() )
+        {
+        // You can't release a dialogue that isn't in progress.
+        return KErrDisconnected;
+        }
+*/    
+    TTsyReqHandle sendReleaseHandle = 
+        iTsyReqHandleStore->GetTsyReqHandle( EMultimodeUssdSendRelease );
+
+    if ( 0 < sendReleaseHandle )
+        {
+        // The request is already in processing because of previous request
+        // Complete request with status value informing the client about 
+        // the situation.
+TFLOGSTRING("LTSY: CMmUssdTsy::SendRelease - KErrServerBusy");
+        ReqCompleted( aTsyReqHandle, KErrServerBusy );
+        }
+    else
+        {
+TFLOGSTRING("TSY: CMmUssdTsy::SendRelease called");
+
+        TInt ret = KErrGeneral;
+
+        TPckg<RMobilePhone::TMobilePhoneSendSSRequestV3>* ussdSendSSRequestPckg =
+            reinterpret_cast< TPckg<RMobilePhone::TMobilePhoneSendSSRequestV3>* > 
+            ( aReturnResult );
+
+        if ( sizeof(RMobilePhone::TMobilePhoneSendSSRequestV3) >
+                ussdSendSSRequestPckg->MaxLength() )
+            {
+            ret = KErrArgument;
+            }
+        else
+            {
+            RMobilePhone::TMobilePhoneSendSSRequestV3& returnResult = 
+                ( *ussdSendSSRequestPckg )();
+
+            iReturnResultPtr = &returnResult;
+
+            // Send request to the Domestic OS layer.
+            ret = iMmPhone->MessageManager()->HandleRequestL( 
+                EMobileUssdMessagingSendRelease );
+            }
+
+        // If ret is not KErrNone
+        if ( KErrNone != ret )
+            {
+            ReqCompleted( aTsyReqHandle, ret );
+            }
+        else
+        	{
+#ifdef REQHANDLE_TIMER
+            // Set timer for the request
+            SetTypeOfResponse( EMultimodeUssdSendRelease, aTsyReqHandle );
+#else
+            // Save SendMessage request handle, set timer
+            iTsyReqHandleStore->SetTsyReqHandle( 
+                EMultimodeUssdSendRelease, aTsyReqHandle );
+#endif // REQHANDLE_TIMER
+        	}
+        }
+
+    return KErrNone;
+    }
+
+// ---------------------------------------------------------------------------
+// CMmUssdTsy::CompleteSendRelease
+// This method completes an outstanding SendRelease request.
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+void CMmUssdTsy::CompleteSendRelease(
+    TInt aErrorCode, 
+    CMmDataPackage* aDataPackage )
+    {
+TFLOGSTRING("TSY: CMmUssdTsy::CompleteSendRelease" );
+    // reset req handle. Returns the deleted req handle
+    TTsyReqHandle reqHandle = iTsyReqHandleStore->ResetTsyReqHandle( 
+		EMultimodeUssdSendRelease );
+
+    if( CMmPhoneTsy::EMultimodePhoneReqHandleUnknown != reqHandle )
+        {
+        if ( KErrNone == aErrorCode )
+            {
+            aDataPackage->UnPackData ( *iReturnResultPtr );
+            }
+//        EndSession();     TODO   
+        ReqCompleted( reqHandle, aErrorCode );
+        }  
+    }
+
+// ---------------------------------------------------------------------------
+// CmmUssdTsy::SendReleaseCancel
+// Cancels cancelling of USSD session.
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+TInt CMmUssdTsy::SendReleaseCancel()
+    {
+    // reset the req handle
+    TTsyReqHandle reqHandle = iTsyReqHandleStore->ResetTsyReqHandle(
+        EMultimodeUssdSendRelease );
+    
+        if ( EMultimodeUssdReqHandleUnknown != reqHandle )
+           {
+            // complete with cancel
+            ReqCompleted( reqHandle, KErrCancel );
+           }
+    
+    return KErrNone;
+    }
+
+// ---------------------------------------------------------------------------
+// CMmUssdTsy::NotifyNetworkRelease
+// This method activates notifying of network release
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+TInt CMmUssdTsy::NotifyNetworkRelease(
+    const TTsyReqHandle aTsyReqHandle,
+    TDes8* aMsgData,
+    TDes8* aMsgAttributes) // aMsgAttributes may be NULL
+    {
+TFLOGSTRING("TSY: CMmUssdTsy::NotifyNetworkRelease" );
+
+	if (aMsgData->MaxLength() < sizeof(RMobilePhone::TMobilePhoneSendSSRequestV3Pckg))
+		{
+	    TFLOGSTRING ("TSY: CMmNetTsy::NotifyNetworkRelease Bad size argument (arg1)");
+	    // Complete the request with appropiate error        
+	    return KErrArgument;		
+		}
+	if (aMsgAttributes && 
+		aMsgAttributes->MaxLength() < sizeof(RMobileUssdMessaging::TMobileUssdAttributesV1Pckg))
+		{
+	    TFLOGSTRING ("TSY: CMmNetTsy::NotifyNetworkRelease Bad size argument (arg2)");
+	    // Complete the request with appropiate error        
+	    return KErrArgument;			
+		}
+
+	TPckg<RMobilePhone::TMobilePhoneSendSSRequestV3>* ussdSendSSRequestPckg =
+            reinterpret_cast< TPckg<RMobilePhone::TMobilePhoneSendSSRequestV3>* > 
+            ( aMsgData );
+
+    RMobilePhone::TMobilePhoneSendSSRequestV3& msgData = 
+            ( *ussdSendSSRequestPckg )();
+
+    iReturnNotifyPtr = &msgData;
+
+    if (aMsgAttributes != NULL)
+    	{
+	    RMobileUssdMessaging::TMobileUssdAttributesV1Pckg* ussdAttributesPckg = 
+	    		reinterpret_cast< RMobileUssdMessaging::TMobileUssdAttributesV1Pckg* > (aMsgAttributes);
+	    		
+	    RMobileUssdMessaging::TMobileUssdAttributesV1& msgAttributes = (*ussdAttributesPckg)();
+	    
+	    iReturnNotifyUssdMessageAttributesPtr = &msgAttributes;
+    	}
+    else
+    	{
+    	iReturnNotifyUssdMessageAttributesPtr = NULL;
+    	}
+#ifdef REQHANDLE_TIMER
+    // Set timer for the request
+    SetTypeOfResponse( EMultimodeUssdNotifyNetworkRelease, aTsyReqHandle );
+#else
+    // Save SendMessage request handle, set timer
+    iTsyReqHandleStore->SetTsyReqHandle( 
+        EMultimodeUssdNotifyNetworkRelease, aTsyReqHandle );
+#endif // REQHANDLE_TIMER
+    
+    return KErrNone;
+    }
+
+// ---------------------------------------------------------------------------
+// CMmUssdTsy::CompleteNotifyNetworkRelease
+// This method completes notify network release request.
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+void CMmUssdTsy::CompleteNotifyNetworkRelease(
+    TInt aErrorCode,
+    CMmDataPackage* aDataPackage )
+    {
+//    EndSession(); TODO
+
+TFLOGSTRING2("TSY: CMmUssdTsy::CompleteNotifyNetworkRelease. Error: %d", aErrorCode );
+    // reset req handle. Returns the deleted req handle
+    TTsyReqHandle reqHandle = iTsyReqHandleStore->ResetTsyReqHandle(
+		EMultimodeUssdNotifyNetworkRelease );
+
+    if( CMmPhoneTsy::EMultimodePhoneReqHandleUnknown != reqHandle )
+        {
+        if ( KErrNone == aErrorCode )
+            {
+            RMobilePhone::TMobilePhoneSendSSRequestV3* tempReturnNotifyPtr;
+            if (iReturnNotifyUssdMessageAttributesPtr != NULL)
+				{
+				RMobileUssdMessaging::TMobileUssdAttributesV1* tempReturnNotifyUssdMessageAttributesPtr;
+				aDataPackage->UnPackData ( &tempReturnNotifyPtr, &tempReturnNotifyUssdMessageAttributesPtr );
+				if (tempReturnNotifyPtr != NULL)
+				    {
+				    *iReturnNotifyPtr = *tempReturnNotifyPtr;
+				    }
+				else
+				    {
+                    iReturnNotifyPtr->iOpCode = KErrNone;
+                    iReturnNotifyPtr->iAdditionalInfo.Append( KErrNone );
+				    }
+				if (tempReturnNotifyUssdMessageAttributesPtr != NULL)
+					{
+					*iReturnNotifyUssdMessageAttributesPtr = *tempReturnNotifyUssdMessageAttributesPtr;
+					}
+				else
+				    {
+                    iReturnNotifyUssdMessageAttributesPtr->iFormat = RMobileUssdMessaging::EFormatUnspecified;
+                    iReturnNotifyUssdMessageAttributesPtr->iType = RMobileUssdMessaging::EUssdUnknown;
+				    }
+				}
+            else
+				{
+				aDataPackage->UnPackData ( &tempReturnNotifyPtr );
+				if(tempReturnNotifyPtr != NULL)
+				    {
+                    *iReturnNotifyPtr = *tempReturnNotifyPtr;
+				    }
+				else
+				    {
+                    iReturnNotifyPtr->iOpCode = KErrNone;
+                    iReturnNotifyPtr->iAdditionalInfo.Append( KErrNone );
+				    }
+				}
+            }
+         // Null ret pointers
+        iReturnNotifyPtr = NULL;
+        iReturnNotifyUssdMessageAttributesPtr = NULL;
+       
+        // Complete the client request
+        ReqCompleted( reqHandle, aErrorCode );
+        } 
+    } 
+
+// ---------------------------------------------------------------------------
+// CmmUssdTsy::NotifyNetworkReleaseCancel
+// Cancels notify network release request.
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+TInt CMmUssdTsy::NotifyNetworkReleaseCancel()
+    {
+    // reset the req handle
+    TTsyReqHandle reqHandle = iTsyReqHandleStore->ResetTsyReqHandle(
+        EMultimodeUssdNotifyNetworkRelease );
+   
+    // This will always be true if the etel is handling the request correctly.
+    // In case etel fails to block the request this will prevent crashing. 
+    if ( EMultimodeUssdReqHandleUnknown != reqHandle ) 
+        {
+        // Null ret pointers
+        iReturnNotifyPtr = NULL;
+        iReturnNotifyUssdMessageAttributesPtr = NULL;
+       
+        // complete with cancel
+        ReqCompleted( reqHandle, KErrCancel );
+        }
+    
+    return KErrNone;
+    }
+
+// ---------------------------------------------------------------------------
+// CMmUssdTsy::ResetVariables
+// Reset used member variables.
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+void CMmUssdTsy::ResetVariables()
+    {
+    iReceiveUssdMessagePtr = NULL;
+    iReceiveUssdMessageAttributesPtr = NULL;
+    iReturnResultPtr = NULL;
+    iReturnNotifyPtr = NULL;
+    iReturnNotifyUssdMessageAttributesPtr = NULL;    
+    }
+
+#ifdef REQHANDLE_TIMER
+// ---------------------------------------------------------------------------
+// CMmUssdTsy::SetTypeOfResponse
+// Sets the type of response for a given Handle. Automatic
+// mode includes an automatic response in case of non response
+// from the DOS in a specified time
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+void CMmUssdTsy::SetTypeOfResponse(
+    const TInt aReqHandleType, 
+    const TTsyReqHandle aTsyReqHandle )
+    {
+    TInt timeOut( 0 );
+
+    switch ( aReqHandleType )
+        {
+        case EMultimodeUssdSendMessage:
+            timeOut = KMmUssdSendMessageTimeOut;
+            break;
+        case EMultimodeUssdSendMessageNoFdnCheck:
+            timeOut = KMmUssdSendMessageNoFdnCheckTimeOut;
+            break;            
+        case EMultimodeUssdSendRelease:
+            timeOut = KMmUssdSendReleaseTimeOut;
+            break;
+        default:
+            // Does not use timer
+            iTsyReqHandleStore->SetTsyReqHandle( 
+                aReqHandleType, aTsyReqHandle );
+            break;
+        }
+
+    if ( timeOut > 0 )
+        {
+        // The timeout parameter is given in seconds.
+        iTsyReqHandleStore->SetTsyReqHandle( aReqHandleType, 
+            aTsyReqHandle, timeOut );
+        }
+    }
+
+// ---------------------------------------------------------------------------
+// CMmUssdTsy::Complete
+// Completes the request due timer expiration
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+void CMmUssdTsy::Complete(
+    TInt aReqHandleType, 
+    TInt aError )
+    {
+    // All possible TSY req handle types are listed in the
+    // switch case below. 
+    
+    RMobilePhone::TMobilePhoneSendSSRequestV3 returnResult;
+    // create package.
+    CMmDataPackage package;
+    
+    switch( aReqHandleType )
+        {
+        // Cases handled with automatic completion
+        case EMultimodeUssdSendMessage:
+            CompleteSendMessage( aError );
+            break;
+        case EMultimodeUssdSendMessageNoFdnCheck:
+            CompleteSendMessageNoFdnCheck( aError );
+            break;
+        case EMultimodeUssdSendRelease:
+            returnResult.iOpCode = static_cast< TUint8 >( KErrTimedOut );
+            returnResult.iAdditionalInfo.Append ( KErrNone );
+
+            // pack the data
+            package.PackData( &returnResult );
+            CompleteSendRelease( aError, &package );
+            break;
+        default:
+            ReqCompleted( iTsyReqHandleStore->ResetTsyReqHandle( 
+				aReqHandleType ), aError );
+            break;
+        }
+    }
+#endif // REQHANDLE_TIMER
+
+#ifdef TF_LOGGING_ENABLED
+// ---------------------------------------------------------------------------
+// CMmUssdTsy::ReqCompleted
+// Overloads CTelObject::ReqCompleted for logging purposes. It 
+// prints the aTsyReqHandle and aError variable in the log file and then 
+// calls CTelObject::ReqCompleted.
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+void CMmUssdTsy::ReqCompleted(
+    const TTsyReqHandle aTsyReqHandle, 
+    const TInt aError )
+    {
+TFLOGSTRING3("TSY: CMmUssdTsy::ReqCompleted. Handle: %d Error: %d", aTsyReqHandle, aError);
+    CTelObject::ReqCompleted( aTsyReqHandle, aError );
+    }
+#endif // TF_LOGGING_ENABLED
+
+// ---------------------------------------------------------------------------
+// CMmUssdTsy::Phone
+// This method returns pointer to the Phone object.
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+CMmPhoneTsy* CMmUssdTsy::Phone()
+    {
+    return iMmPhone;
+    }
+
+// ---------------------------------------------------------------------------
+// CMmUssdTsy::IsRequestPossibleInOffLine
+// Checks whether a ETel request can be performed or not while offline mode is
+// enabled
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+TBool CMmUssdTsy::IsRequestPossibleInOffline( TInt aIpc ) const
+    {
+    TBool isRequestPossible ( ETrue );
+
+    switch ( aIpc )
+        {
+        case EMobileUssdMessagingSendMessage:      
+        case EMobileUssdMessagingSendMessageNoFdnCheck:
+        case EMobileUssdMessagingSendRelease:
+            isRequestPossible = EFalse;
+            break;
+        case EMobileUssdMessagingReceiveMessage:
+        default:
+            break;
+        }
+        
+    return isRequestPossible;
+    }
+
+// ---------------------------------------------------------------------------
+// CMmUssdTsy::SendMessageNoFDNCheckCancel
+// Cancels SendMessageNoFDNCheck request.
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+TInt CMmUssdTsy::SendMessageNoFdnCheckCancel( 
+    const TTsyReqHandle aTsyReqHandle )
+    {
+TFLOGSTRING("TSY: CMmUssdTsy::SendMessageNoFdnCheckCancel" );
+
+    // reset the req handle
+    TTsyReqHandle reqHandle  = iTsyReqHandleStore->ResetTsyReqHandle( 
+        EMultimodeUssdSendMessageNoFdnCheck );
+    
+    if ( EMultimodeUssdReqHandleUnknown < reqHandle )
+        {
+        // complete with cancel
+        ReqCompleted( aTsyReqHandle, KErrCancel );
+        iSsTransactionOngoing = EFalse; 
+        }
+    
+    iUssdNoFdnCheckFlag = EUssdNoFdnCheckUnknown;
+    return KErrNone;
+    }
+    
+// ---------------------------------------------------------------------------
+// CMmUssdTsy::CompleteSendMessageNoFdnCheck
+// Complete SendMessage 
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+void CMmUssdTsy::CompleteSendMessageNoFdnCheck(
+    TInt aError )
+    {
+TFLOGSTRING("TSY: CMmUssdTsy::CompleteSendMessageNoFdnCheck.\n" );
+    // get reg handle
+    TTsyReqHandle reqHandle = iTsyReqHandleStore->GetTsyReqHandle( 
+        EMultimodeUssdSendMessageNoFdnCheck );
+	
+    if ( EMultimodeUssdReqHandleUnknown != reqHandle )
+        {
+        // reset req handle. Returns the deleted req handle
+        reqHandle = iTsyReqHandleStore->ResetTsyReqHandle(
+            EMultimodeUssdSendMessageNoFdnCheck );
+        
+        ReqCompleted( reqHandle, aError );
+        iSsTransactionOngoing = EFalse;
+        iUssdNoFdnCheckFlag = EUssdNoFdnCheckUnknown;
+        }
+    }
+
+
+// End of file
+
+