adaptationlayer/tsy/simatktsy_dll/src/sateventdownload.cpp
changeset 0 63b37f68c1ce
child 5 8ccc39f9d787
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/adaptationlayer/tsy/simatktsy_dll/src/sateventdownload.cpp	Fri Nov 06 17:28:23 2009 +0000
@@ -0,0 +1,1178 @@
+/*
+* Copyright (c) 2007-2009 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "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 "sateventdownload.h"   // sat event download class
+#include "satmessaging.h"       // sat messaging class
+#include "ber_tlv.h"            // sat ber-tlv classes
+#include "satutil.h"            // sat utility class
+
+#include <pn_const.h>           // server id constants
+#include <tisi.h>               // isi message
+#include <net_modemisi.h>       // net server
+#include <call_modemisi.h>      // Call Modem server
+#include "osttracedefinitions.h"
+#ifdef OST_TRACE_COMPILER_IN_USE
+#include "sateventdownloadtraces.h"
+#endif
+
+
+// CONSTANTS
+const TUint8 KMaxCallModemDetailedCause = 248;
+const TUint8 KCallModemOriginCsAddressMaxLength = 246;
+const TUint8 KMSBMask = 0x80;
+
+
+// ==================== MEMBER FUNCTIONS ====================================
+
+// -----------------------------------------------------------------------------
+// CSatEventDownload::CSatEventDownload
+// C++ default constructor can NOT contain any code, that
+// might leave.
+// -----------------------------------------------------------------------------
+//
+CSatEventDownload::CSatEventDownload
+        (
+        CSatMessHandler*    aSatMessHandler,
+        CTsySatMessaging*   aSatMessaging
+        )
+        :
+        iSatMessHandler( aSatMessHandler ),
+        iSatMessaging( aSatMessaging ),
+        iSetUpCallOngoing( EFalse ),
+        iForceLocationStatusEnvelope( EFalse ),
+        iCallsOngoing( EFalse ),
+        iLocationStatusEnvelopePending( EFalse ),
+        iNetCellInfoIndReceived( EFalse )
+    {
+    OstTrace0( TRACE_NORMAL, CSATEVENTDOWNLOAD_CSATEVENTDOWNLOAD, "CSatEventDownload::CSatEventDownload" );
+    iLocInfo.iOperatorCode.FillZ( iLocInfo.iOperatorCode.MaxLength() );
+    iLocInfo.iLac.FillZ( iLocInfo.iLac.MaxLength() );
+    iLocInfo.iCellId.FillZ( iLocInfo.iCellId.MaxLength() );
+    iLocInfo.iRegStatus = NET_NO_COVERAGE;
+    }
+
+// -----------------------------------------------------------------------------
+// CSatEventDownload::ConstructL
+// Symbian 2nd phase constructor can leave.
+// -----------------------------------------------------------------------------
+//
+void CSatEventDownload::ConstructL()
+    {
+    OstTrace0( TRACE_NORMAL, CSATEVENTDOWNLOAD_CONSTRUCTL, "CSatEventDownload::ConstructL" );
+    // None. Reserved for future use.
+    }
+
+
+// -----------------------------------------------------------------------------
+// CSatEventDownload::NewL
+// Two-phased constructor.
+// -----------------------------------------------------------------------------
+//
+CSatEventDownload* CSatEventDownload::NewL
+        (
+        CSatMessHandler*    aSatMessHandler,
+        CTsySatMessaging*   aSatMessaging
+        )
+    {
+    OstTrace0( TRACE_NORMAL, CSATEVENTDOWNLOAD_NEWL, "CSatEventDownload::NewL" );
+    TFLOGSTRING("TSY: CSatEventDownload::NewL");
+
+    CSatEventDownload* self =
+        new( ELeave ) CSatEventDownload( aSatMessHandler, aSatMessaging );
+
+    CleanupStack::PushL( self );
+    self->ConstructL();
+    CleanupStack::Pop( self );
+
+    return self;
+    }
+
+
+// -----------------------------------------------------------------------------
+// CSatEventDownload::~CSatEventDownload
+// C++ destructor
+// -----------------------------------------------------------------------------
+//
+CSatEventDownload::~CSatEventDownload()
+    {
+    OstTrace0( TRACE_NORMAL, DUP1_CSATEVENTDOWNLOAD_CSATEVENTDOWNLOAD, "CSatEventDownload::~CSatEventDownload" );
+    TFLOGSTRING("TSY: CSatEventDownload::~CSatEventDownload");
+    }
+
+
+// -----------------------------------------------------------------------------
+// CSatEventDownload::GetTransactionId
+// Generate transaction id for ISI message
+// -----------------------------------------------------------------------------
+//
+TUint8 CSatEventDownload::GetTransactionId()
+    {
+    OstTrace0( TRACE_NORMAL, CSATEVENTDOWNLOAD_GETTRANSACTIONID, "CSatEventDownload::GetTransactionId" );
+    TFLOGSTRING("TSY: CSatEventDownload::GetTransactionId");
+    return iSatMessaging->GetTransactionId();
+    }
+
+// -----------------------------------------------------------------------------
+// CSatEventDownload::SetUpEventList
+// Sets up event list
+// -----------------------------------------------------------------------------
+//
+void CSatEventDownload::SetUpEventList
+        (
+        TUint32 aEvents        // bit mask of enabled events
+        )
+    {
+    OstTrace0( TRACE_NORMAL, CSATEVENTDOWNLOAD_SETUPEVENTLIST, "CSatEventDownload::SetUpEventList" );
+    TFLOGSTRING("TSY: CSatEventDownload::SetUpEventList");
+    iEventList.Set( aEvents );
+
+    // Force sending of envelope at least once, if location status event set
+    if ( iEventList.IsEnabled( RSat::KLocationStatus ) )
+        {
+        iForceLocationStatusEnvelope = ETrue;
+        }
+    // Reset flag if removal of event list or not location status event
+    else
+        {
+        iForceLocationStatusEnvelope = EFalse;
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// CSatEventDownload::SendMTCallEnvelope
+// Send MT call envelope to USIM.
+// -----------------------------------------------------------------------------
+//
+TInt CSatEventDownload::SendMTCallEnvelope
+        (
+        TUint8 aTransactionId,                 // Transaction Identifier
+        const TDesC8& aDiallingNumber,         // Calling Party BCD number
+        const TDesC8& aCalledPartySubAddress   // Calling Party Subaddress
+        )
+    {
+    OstTraceExt1( TRACE_NORMAL, CSATEVENTDOWNLOAD_SENDMTCALLENVELOPE, "CSatEventDownload::SendMTCallEnvelope (transactionId=%hhu)", aTransactionId );
+    TFLOGSTRING2("TSY: CSatEventDownload::SendMTCallEnvelope\
+        (transactionId=%d)", TInt( aTransactionId ) );
+
+    TInt ret( KErrNone );
+
+    // create envelope
+    TTlv envelope;
+    envelope.Begin  ( KBerTlvEventDownloadTag );
+
+    // event list
+    envelope.AddTag ( KTlvEventListTag );
+    envelope.AddByte( KEventMTCall );
+
+    // device identities
+    envelope.AddTag ( KTlvDeviceIdentityTag );
+    envelope.AddByte( KNetwork );
+    envelope.AddByte( KSim );
+
+    // transaction identifier
+    envelope.AddTag ( KTlvTransactionIdentifierTag );
+    envelope.AddByte( aTransactionId );
+
+    if ( aDiallingNumber.Length() )
+        {
+        envelope.AddTag( KTlvAddressTag );
+        // First byte contains TON/NPI, rest of the bytes address
+        envelope.AddData( aDiallingNumber );
+        }
+
+    if ( aCalledPartySubAddress.Length() )
+        {
+        // optional called party subaddress
+        envelope.AddTag( KTlvSubaddressTag );
+        envelope.AddData( aCalledPartySubAddress );
+        }
+
+    ret = iSatMessHandler->UiccCatReqEnvelope(
+        GetTransactionId(), envelope.End() );
+
+    return ret;
+    }
+
+// -----------------------------------------------------------------------------
+// CSatEventDownload::SendCallConnectedEnvelope
+// Send Call connected envelope to USIM.
+// -----------------------------------------------------------------------------
+//
+TInt CSatEventDownload::SendCallConnectedEnvelope
+        (
+        TUint8 aTransactionId, // Transaction Identifier in the CONNECT message.
+        TBool aNearEnd
+        )
+    {
+    OstTraceExt1( TRACE_NORMAL, CSATEVENTDOWNLOAD_SENDCALLCONNECTEDENVELOPE, "CSatEventDownload::SendCallConnectedEnvelope (transactionId=%hhu)", aTransactionId );
+    TFLOGSTRING2("TSY: CSatEventDownload::SendCallConnectedEnvelope\
+        (transactionId=%d)", TInt( aTransactionId ) );
+
+    TInt ret( KErrNone );
+
+    // create envelope
+    TTlv envelope;
+    envelope.Begin  ( KBerTlvEventDownloadTag );
+
+    // event list
+    envelope.AddTag ( KTlvEventListTag );
+    envelope.AddByte( KEventCallConnected );
+
+    // device identities
+    envelope.AddTag ( KTlvDeviceIdentityTag );
+    envelope.AddByte( aNearEnd ? KMe : KNetwork );
+    envelope.AddByte( KSim );
+
+    // transaction identifier
+    envelope.AddTag ( KTlvTransactionIdentifierTag );
+    envelope.AddByte( aTransactionId );
+
+    // Check if the call is SetUpCall originated and it's an MO call
+    if ( iSetUpCallOngoing && !aNearEnd )
+        {
+        // Store envelope to cache and it will be send after a terminal resp
+        // of set up call.
+        iSatMessaging->StoreCallConnectedEvent( envelope.End() );
+        }
+    else
+        {
+        // send envelope now
+        ret = iSatMessHandler->UiccCatReqEnvelope(
+            GetTransactionId(), envelope.End() );
+        }
+
+    return ret;
+    }
+
+// -----------------------------------------------------------------------------
+// CSatEventDownload::SendCallDisconnectedEnvelope
+// Send call disconnected event to USIM
+// -----------------------------------------------------------------------------
+//
+TInt CSatEventDownload::SendCallDisconnectedEnvelope
+        (
+        TUint8 aTransactionId,
+        TBool aNearEnd,
+        TBool aCauseGiven,
+        const TDesC8& aCause
+        )
+    {
+    OstTraceExt1( TRACE_NORMAL, CSATEVENTDOWNLOAD_SENDCALLDISCONNECTEDENVELOPE, "CSatEventDownload::SendCallDisconnectedEnvelope (transactionId=%hhu)", aTransactionId );
+    TFLOGSTRING2("TSY: CSatEventDownload::SendCallDisconnectedEnvelope\
+        (transactionId=%d)", TInt( aTransactionId ) );
+
+    TInt ret( KErrNone );
+
+    // create envelope
+    TTlv envelope;
+    envelope.Begin  ( KBerTlvEventDownloadTag );
+
+    // event list
+    envelope.AddTag ( KTlvEventListTag );
+    envelope.AddByte( KEventCallDisconnected );
+
+    // device identities
+    envelope.AddTag ( KTlvDeviceIdentityTag );
+    envelope.AddByte( aNearEnd ? KMe : KNetwork );
+    envelope.AddByte( KSim );
+
+    // transaction identifier
+    envelope.AddTag ( KTlvTransactionIdentifierTag );
+    envelope.AddByte( aTransactionId );
+
+    // cause
+    if ( aCauseGiven )
+        {
+        envelope.AddTag ( KTlvCauseTag );
+        envelope.AddData( aCause );
+        }
+
+    // send
+    ret = iSatMessHandler->UiccCatReqEnvelope(
+        GetTransactionId(), envelope.End() );
+
+    return ret;
+    }
+
+// -----------------------------------------------------------------------------
+// CSatEventDownload::SendLocationStatusEnvelope
+// Send location status event to USIM
+// -----------------------------------------------------------------------------
+//
+TInt CSatEventDownload::SendLocationStatusEnvelope
+        (
+        const CSatMessHandler::TLocationInfo& aNewLocInfo
+        )
+    {
+    OstTrace1( TRACE_NORMAL, CSATEVENTDOWNLOAD_SENDLOCATIONSTATUSENVELOPE, "CSatEventDownload::SendLocationStatusEnvelope locationStatus = %d", aNewLocInfo.iRegStatus );
+    TFLOGSTRING2("TSY: CSatEventDownload::SendLocationStatusEnvelope \
+        locationStatus = %d", TInt( aNewLocInfo.iRegStatus ) );
+
+    TInt ret( KErrNone );
+
+    // Send location status envelope only if there
+    // have been changes
+    if ( ( iLocInfo.iRegStatus    != aNewLocInfo.iRegStatus )
+      || ( iLocInfo.iOperatorCode != aNewLocInfo.iOperatorCode )
+      || ( iLocInfo.iLac          != aNewLocInfo.iLac )
+      || ( iLocInfo.iCellId       != aNewLocInfo.iCellId )
+      || iForceLocationStatusEnvelope )
+        {
+        TFLOGSTRING("TSY: CSatEventDownload::SendLocationStatusEnvelope \
+            Saving and sending");
+        OstTrace0( TRACE_NORMAL, DUP1_CSATEVENTDOWNLOAD_SENDLOCATIONSTATUSENVELOPE, "CSatEventDownload::SendLocationStatusEnvelope Saving and sending" );
+
+        // Cache values
+        iLocInfo = aNewLocInfo;
+
+        // Create envelope
+        TTlv envelope;
+        envelope.Begin( KBerTlvEventDownloadTag );
+
+        // Event list
+        envelope.AddTag( KTlvEventListTag );
+        envelope.AddByte( KEventLocationStatus );
+
+        // Device identities
+        envelope.AddTag( KTlvDeviceIdentityTag );
+        envelope.AddByte( KMe );
+        envelope.AddByte( KSim );
+
+        // Locationstatus
+        envelope.AddTag( KTlvLocationStatusTag );
+
+        switch ( iLocInfo.iRegStatus )
+            {
+            case NET_SERVICE:
+                {
+                envelope.AddByte( KLocationStatusNormalService );
+
+                // Location information, this is included only if status
+                // indicates normal service
+                envelope.AddTag( KTlvLocationInformationTag );
+                envelope.AddData( iLocInfo.iOperatorCode );
+                envelope.AddData( iLocInfo.iLac );
+                envelope.AddData( iLocInfo.iCellId );
+                break;
+                }
+            case NET_LIMITED_SERVICE:
+                {
+                envelope.AddByte( KLocationStatusLimitedService );
+                break;
+                }
+            case NET_NO_COVERAGE:
+            default:
+                {
+                envelope.AddByte( KLocationStatusNoService );
+                break;
+                }
+            }
+
+        // Reset the flag
+        iForceLocationStatusEnvelope = EFalse;
+
+        // send
+        ret = iSatMessHandler->UiccCatReqEnvelope(
+            GetTransactionId(),
+            envelope.End() );
+        }
+    else
+        {
+        TFLOGSTRING("TSY: CSatEventDownload::SendLocationStatusEnvelope \
+            Location Info already received, envelope sending omitted.");
+        OstTrace0( TRACE_NORMAL, DUP2_CSATEVENTDOWNLOAD_SENDLOCATIONSTATUSENVELOPE, "CSatEventDownload::SendLocationStatusEnvelope Location Info already received, envelope sending omitted." );
+
+        }
+
+    iLocationStatusEnvelopePending = EFalse;
+
+    return ret;
+    }
+
+// -----------------------------------------------------------------------------
+// CSatEventDownload::SendUserActivityEnvelope
+// Send user activity envelope to USIM
+// -----------------------------------------------------------------------------
+//
+TInt CSatEventDownload::SendUserActivityEnvelope()
+    {
+    OstTrace0( TRACE_NORMAL, CSATEVENTDOWNLOAD_SENDUSERACTIVITYENVELOPE, "CSatEventDownload::SendUserActivityEnvelope" );
+    TFLOGSTRING("TSY: CSatEventDownload::SendUserActivityEnvelope");
+
+    TInt ret = KErrNone;
+
+    if ( iEventList.IsEnabled(RSat::KUserActivity) )
+        {
+        // create envelope
+        TTlv envelope;
+        envelope.Begin  ( KBerTlvEventDownloadTag );
+
+        // event list
+        envelope.AddTag ( KTlvEventListTag );
+        envelope.AddByte( KEventUserActivity );
+
+        // device identities
+        envelope.AddTag ( KTlvDeviceIdentityTag );
+        envelope.AddByte( KMe );
+        envelope.AddByte( KSim );
+
+        // send
+        ret = iSatMessHandler->UiccCatReqEnvelope(
+            GetTransactionId(), envelope.End() );
+
+        // remove from event list
+        iEventList.Remove( RSat::KUserActivity );
+        }
+
+    return ret;
+    }
+
+// -----------------------------------------------------------------------------
+// CSatEventDownload::SendIdleScreenAvailableEnvelope
+// Send idle screeen available event to USIM
+// -----------------------------------------------------------------------------
+//
+TInt CSatEventDownload::SendIdleScreenAvailableEnvelope()
+    {
+    OstTrace0( TRACE_NORMAL, CSATEVENTDOWNLOAD_SENDIDLESCREENAVAILABLEENVELOPE, "CSatEventDownload::SendIdleScreenAvailableEnvelope" );
+    TFLOGSTRING("TSY: CSatEventDownload::SendIdleScreenAvailableEnvelope");
+
+    TInt ret = KErrNone;
+
+    if ( iEventList.IsEnabled( RSat::KIdleScreenAvailable ) )
+        {
+        // create envelope
+        TTlv envelope;
+        envelope.Begin  ( KBerTlvEventDownloadTag );
+
+        // event list
+        envelope.AddTag ( KTlvEventListTag );
+        envelope.AddByte( KEventIdleScreenAvailable );
+
+        // device identities
+        envelope.AddTag ( KTlvDeviceIdentityTag );
+        envelope.AddByte( KDisplay );
+        envelope.AddByte( KSim );
+
+        // send
+        ret = iSatMessHandler->UiccCatReqEnvelope(
+            GetTransactionId(), envelope.End() );
+
+        if( KErrNone == ret )
+            {
+            // remove from event list
+            iEventList.Remove( RSat::KIdleScreenAvailable );
+            }
+        }
+
+    return ret;
+    }
+
+// -----------------------------------------------------------------------------
+// CSatEventDownload::SendBrowserTerminationEnvelope
+// Send browser termination event to USIM
+// -----------------------------------------------------------------------------
+//
+TInt CSatEventDownload::SendBrowserTerminationEnvelope
+        (
+        RSat::TBrowserTerminationCause aCause
+        )
+    {
+    OstTrace1( TRACE_NORMAL, CSATEVENTDOWNLOAD_SENDBROWSERTERMINATIONENVELOPE, "CSatEventDownload::SendBrowserTerminationEnvelope (cause=%d)", TInt(aCause) );
+    TFLOGSTRING2("TSY: CSatEventDownload::SendBrowserTerminationEnvelope\
+        (cause=%d)", TInt( aCause ) );
+
+    TInt ret = KErrNone;
+
+    if ( iEventList.IsEnabled( RSat::KBrowserTermination ) )
+        {
+        // create envelope
+        TTlv envelope;
+        envelope.Begin  ( KBerTlvEventDownloadTag );
+
+        // event list
+        envelope.AddTag ( KTlvEventListTag );
+        envelope.AddByte( KEventBrowserTermination );
+
+        // device identities
+        envelope.AddTag ( KTlvDeviceIdentityTag );
+        envelope.AddByte( KMe );
+        envelope.AddByte( KSim );
+
+        // cause
+        envelope.AddTag( KTlvBrowserTerminationCauseTag );
+        envelope.AddByte(
+            TUint8( ( RSat::EUserTermination == aCause) ?
+            KBrowserTerminationUser : KBrowserTerminationError) );
+
+        // send
+        ret = iSatMessHandler->UiccCatReqEnvelope(
+            GetTransactionId(), envelope.End() );
+        }
+
+    return ret;
+    }
+
+// -----------------------------------------------------------------------------
+// CSatEventDownload::SendLanguageSelectionEnvelope
+// Send Languate selection event to USIMSend Languate selection event to USIM
+// -----------------------------------------------------------------------------
+//
+TInt CSatEventDownload::SendLanguageSelectionEnvelope
+        (
+        TUint16 aLanguage
+        )
+    {
+    OstTraceExt1( TRACE_NORMAL, CSATEVENTDOWNLOAD_SENDLANGUAGESELECTIONENVELOPE, "CSatEventDownload::SendLanguageSelectionEnvelope (language=%hu)", aLanguage );
+    TFLOGSTRING2("TSY: CSatEventDownload::SendLanguageSelectionEnvelope\
+        (language=%d)", TInt ( aLanguage ) );
+
+    TInt ret = KErrNone;
+
+    if ( iEventList.IsEnabled( RSat::KLanguageSelection ) )
+        {
+        // create envelope
+        TTlv envelope;
+        envelope.Begin  ( KBerTlvEventDownloadTag );
+
+        // event list
+        envelope.AddTag ( KTlvEventListTag );
+        envelope.AddByte( KEventLanguageSelection );
+
+        // device identities
+        envelope.AddTag ( KTlvDeviceIdentityTag );
+        envelope.AddByte( KMe );
+        envelope.AddByte( KSim );
+
+        // language
+        envelope.AddTag( KTlvLanguageTag );
+        envelope.AddByte( TUint8((aLanguage >> 8)&0x7f) ); // MSB
+        envelope.AddByte( TUint8((aLanguage >> 0)&0x7f) ); // LSB
+
+        // send
+        ret =  iSatMessHandler->UiccCatReqEnvelope(
+            GetTransactionId(), envelope.End() );
+        }
+
+    return ret;
+    }
+
+// -----------------------------------------------------------------------------
+// CSatEventDownload::ExtFunc
+// Handles event download IPC requests originating from ETel.
+// -----------------------------------------------------------------------------
+//
+TInt CSatEventDownload::ExtFunc
+        (
+        const TTsyReqHandle aTsyReqHandle,
+        const TDataPackage& aPackage
+        )
+    {
+    OstTrace0( TRACE_NORMAL, CSATEVENTDOWNLOAD_EXTFUNC, "CSatEventDownload::ExtFunc" );
+    TFLOGSTRING("TSY: CSatEventDownload::ExtFunc");
+
+    TInt ret ( KErrNotSupported );
+
+    // get parameters (eventList, eventInfo) from package
+    RSat::TEventDownloadBaseV2Pckg* eventInfoPckg =
+        (RSat::TEventDownloadBaseV2Pckg*)aPackage.Des2n();
+    RSat::TEventDownloadBaseV2& eventInfo = (*eventInfoPckg)();
+    RSat::TEventList& singleEvent = *(RSat::TEventList*)aPackage.Ptr1();
+
+    if ( RSat::KSatV2 == eventInfo.ExtensionId() )
+        {
+
+        // branch and do whatever is necessary according to the event type..
+        switch ( singleEvent )
+            {
+            case RSat::KUserActivity:
+                {
+                ret = SendUserActivityEnvelope();
+                break;
+                }
+            case RSat::KIdleScreenAvailable:
+                {
+                ret = SendIdleScreenAvailableEnvelope();
+                break;
+                }
+            case RSat::KBrowserTermination:
+                {
+                ret = SendBrowserTerminationEnvelope(
+                    ((RSat::TBrowserTerminationEventV2*)&eventInfo)->iCause );
+                break;
+                }
+            case RSat::KLanguageSelection:
+                {
+                ret = SendLanguageSelectionEnvelope(
+                    ((RSat::TLanguageSelectionEventV2*)&eventInfo)->iLanguage );
+                break;
+                }
+            case RSat::KDataAvailable:
+                {
+                // DataAvailable will trigger a ReceiveData PCmd
+                ret = SendDataAvailableEnvelope(
+                    ((RSat::TDataAvailableEventV2*)&eventInfo)->iStatus,
+                    ((RSat::TDataAvailableEventV2*)&eventInfo)->iLength );
+                break;
+                }
+            case RSat::KChannelStatus:
+                {
+                // when the ME detects one of the following changes:
+                // -    a link is error, or
+                // -    any other error,
+                // which is not resulting from the execution of a proactive
+                // command, the ME shall inform the SIM that this has occurred.
+                ret = SendChannelStatusEnvelope(
+                    ((RSat::TChannelStatusEventV2*)&eventInfo)->iStatus );
+                break;
+                }
+
+            // TSY is responsible for these events
+            // but they are not reported to ETel
+            //case RSat::KMTCall:
+            //case RSat::KCallConnected:
+            //case RSat::KCallDisconnected:
+            //case RSat::KLocationStatus:
+            //case RSat::KAccessTechnologyChange:
+
+            // events that can be reported by client, but are not supported
+            // by TSY
+            //case RSat::KCardReaderStatus:
+            //case RSat::KDisplayParamsChanges:
+            //case RSat::KLocalConnection:
+            default:
+                {
+                ret = KErrNotSupported;
+                break;
+                }
+            } // end switch
+
+        } // end if
+
+    // complete the request...
+    iSatMessaging->ReqCompleted( aTsyReqHandle, ret );
+    return KErrNone;
+    }
+
+// -----------------------------------------------------------------------------
+// CSatEventDownload::Cancel
+//
+// -----------------------------------------------------------------------------
+//
+TInt CSatEventDownload::Cancel
+        (
+        const TTsyReqHandle /*aTsyReqHandle*/
+        )
+    {
+    OstTrace0( TRACE_NORMAL, CSATEVENTDOWNLOAD_CANCEL, "CSatEventDownload::Cancel" );
+    TFLOGSTRING("TSY: CSatEventDownload::Cancel");
+    // since event download is served at once.
+    // we don't have anything to do here
+    return KErrNone;
+    }
+
+// -----------------------------------------------------------------------------
+// CSatEventDownload::CallModemMessageIndReceived
+// Handle CALL_MODEM_MESSAGE_IND indication
+// -----------------------------------------------------------------------------
+//
+void CSatEventDownload::CallModemMessageIndReceived
+        (
+        const TIsiReceiveC& aIsiMessage  // incoming ISI message
+        )
+    {
+TFLOGSTRING("TSY: CSatEventDownload::CallModemMessageIndReceived");
+OstTrace0( TRACE_NORMAL, CSATEVENTDOWNLOAD_CALLMODEMMESSAGEINDRECEIVED, "CSatEventDownload::CallModemMessageIndReceived" );
+
+    // CALL_MODEM_SB_DETAILED_CAUSE length max value is 248
+    TBuf8<KMaxCallModemDetailedCause> cause;
+    TBool causeGiven( EFalse );
+
+    // extract call message, message direction and transaction id
+    TUint8 callMessage( 0 );
+    TUint8 messageDirection( 0 );
+    TUint8 transactionId( 0 );
+    TUint sbStartOffset( 0 );
+
+    TInt retValue( aIsiMessage.FindSubBlockOffsetById(
+        ISI_HEADER_SIZE + SIZE_CALL_MODEM_MESSAGE_IND,
+        CALL_MODEM_SB_MSG_INFO,
+        EIsiSubBlockTypeId8Len8,
+        sbStartOffset ) );
+
+    if ( KErrNone == retValue )
+        {
+        callMessage = aIsiMessage.Get8bit(
+            sbStartOffset + CALL_MODEM_SB_MSG_INFO_OFFSET_MSG );
+        messageDirection = aIsiMessage.Get8bit(
+            sbStartOffset + CALL_MODEM_SB_MSG_INFO_OFFSET_MSGDIR );
+        transactionId = aIsiMessage.Get8bit(
+            sbStartOffset + CALL_MODEM_SB_MSG_INFO_OFFSET_TRANSACTIONID );
+
+        switch ( callMessage )
+            {
+            case CALL_MODEM_MSG_SETUP:
+                {
+                if ( CALL_MODEM_MSG_DIRECT_RECEIVED == messageDirection )
+                    {
+                    // Received event is mobile terminated call
+                    if ( iEventList.IsEnabled( RSat::KMTCall ) )
+                        {
+                        // 'Calling Party BCD Number IE'.
+                        TBuf8<KCallModemOriginCsAddressMaxLength> BCDAddress;
+                        // CALL_ORIGIN_SUBADDRESS, value range is 0 to 248
+                        TPtrC8 subAddress;
+                           
+                        // Extract address and address type (=TON and NPI)
+                        retValue = aIsiMessage.FindSubBlockOffsetById(
+                            ISI_HEADER_SIZE + SIZE_CALL_MODEM_MESSAGE_IND,
+                            CALL_MODEM_SB_ORIGIN_CS_ADDRESS,
+                            EIsiSubBlockTypeId8Len8,
+                            sbStartOffset );
+
+                        if ( KErrNone == retValue )
+                            {
+                            TInt addressLength( aIsiMessage.Get8bit(
+                                sbStartOffset +
+                                CALL_MODEM_SB_ORIGIN_CS_ADDRESS_OFFSET_ADDRLEN ) );
+
+                            // Set address type (TON/NPI) in correct form
+                            BCDAddress.Append( aIsiMessage.Get8bit( 
+                                sbStartOffset +
+                                CALL_MODEM_SB_ORIGIN_CS_ADDRESS_OFFSET_ADDR )
+                                | KMSBMask );
+                            // Append BCD address. Skip call type and mode
+                            // ( 2 first bytes, not required in envelope )
+                            BCDAddress.Append( aIsiMessage.GetData(
+                                sbStartOffset +
+                                CALL_MODEM_SB_ORIGIN_CS_ADDRESS_OFFSET_ADDR + 2,
+                                addressLength - 2 ) );
+                            }
+                        // Extract subaddress
+                        retValue = aIsiMessage.FindSubBlockOffsetById(
+                            ISI_HEADER_SIZE + SIZE_CALL_MODEM_MESSAGE_IND,
+                            CALL_MODEM_SB_ORIGIN_SUBADDRESS,
+                            EIsiSubBlockTypeId8Len8,
+                            sbStartOffset );
+
+                        if ( KErrNone == retValue )
+                            {
+                            TInt subAddressLength( aIsiMessage.Get8bit(
+                                sbStartOffset +
+                                CALL_MODEM_SB_ORIGIN_SUBADDRESS_OFFSET_ADDRLEN ) );
+
+                            subAddress.Set( aIsiMessage.GetData(
+                                sbStartOffset + CALL_MODEM_SB_ORIGIN_SUBADDRESS_OFFSET_ADDR,
+                                subAddressLength ) );
+                            }
+TFLOGSTRING( "CSatEventDownload::CallModemMessageIndReceived Send MT call event" );
+OstTrace0( TRACE_NORMAL, DUP1_CSATEVENTDOWNLOAD_CALLMODEMMESSAGEINDRECEIVED, "CSatEventDownload::CallModemMessageIndReceived Send MT call event" );
+
+                        SendMTCallEnvelope( 
+                            transactionId,
+                            BCDAddress,
+                            subAddress );
+                        }
+                    }
+                break;
+                }
+            case CALL_MODEM_MSG_CONNECT:
+                {
+                if ( iEventList.IsEnabled( RSat::KCallConnected ) )
+                    {
+                    if ( CALL_MODEM_MSG_DIRECT_RECEIVED == messageDirection )
+                        {
+TFLOGSTRING("CSatEventDownload::CallModemMessageIndReceived Creating a call");
+OstTrace0( TRACE_NORMAL, DUP2_CSATEVENTDOWNLOAD_CALLMODEMMESSAGEINDRECEIVED, "CSatEventDownload::CallModemMessageIndReceived Creating a call" );
+
+                        SendCallConnectedEnvelope(
+                            transactionId,
+                            EFalse/*mobile originated*/ );
+                        }
+                    else if ( CALL_MODEM_MSG_DIRECT_SENT == messageDirection )
+                        {
+TFLOGSTRING("CSatEventDownload::CallModemMessageIndReceived Incoming call arrives");
+OstTrace0( TRACE_NORMAL, DUP3_CSATEVENTDOWNLOAD_CALLMODEMMESSAGEINDRECEIVED, "CSatEventDownload::CallModemMessageIndReceived Incoming call arrives" );
+
+                        SendCallConnectedEnvelope(
+                            transactionId,
+                            ETrue/*mobile terminated*/);
+                        }
+                    }
+                break;
+                }
+            case CALL_MODEM_MSG_RELEASE:
+                {
+                if ( iEventList.IsEnabled( RSat::KCallDisconnected ) )
+                    {
+                    // extract cause
+                    retValue = aIsiMessage.FindSubBlockOffsetById(
+                        ISI_HEADER_SIZE + SIZE_CALL_MODEM_MESSAGE_IND,
+                        CALL_MODEM_SB_DETAILED_CAUSE,
+                        EIsiSubBlockTypeId8Len8,
+                        sbStartOffset );
+
+                    if ( KErrNone == retValue )
+                        {
+                        TInt causeLength( aIsiMessage.Get8bit(
+                            sbStartOffset + CALL_MODEM_SB_DETAILED_CAUSE_OFFSET_CAUSELEN ) );
+                        cause.Copy( aIsiMessage.GetData(
+                            sbStartOffset + CALL_MODEM_SB_DETAILED_CAUSE_OFFSET_CAUSE,
+                            causeLength ) );
+                        causeGiven = ETrue;
+                        }
+                        
+                    if ( CALL_MODEM_MSG_DIRECT_SENT == messageDirection )
+                        {
+                        // 2.33.11 Event Indications on Mobile Originated Call
+                        // Clearing (GSM)
+TFLOGSTRING( "CSatEventDownload::CallModemMessageIndReceived MO call clearing ");
+OstTrace0( TRACE_NORMAL, DUP4_CSATEVENTDOWNLOAD_CALLMODEMMESSAGEINDRECEIVED, "CSatEventDownload::CallModemMessageIndReceived MO call clearing" );
+
+                        SendCallDisconnectedEnvelope(
+                            transactionId,
+                            ETrue/*near end*/,
+                            causeGiven,
+                            cause );
+                        }
+                    else if ( CALL_MODEM_MSG_DIRECT_RECEIVED == messageDirection )
+                        {
+                        // 2.33.12 Event indications on Mobile Terminated Call
+                        // Clearing (GSM)
+TFLOGSTRING( "CSatEventDownload::CallModemMessageIndReceived MT call clearing");
+OstTrace0( TRACE_NORMAL, DUP7_CSATEVENTDOWNLOAD_CALLMODEMMESSAGEINDRECEIVED, "CSatEventDownload::CallModemMessageIndReceived MT call clearing" );
+
+                        SendCallDisconnectedEnvelope(
+                            transactionId,
+                            EFalse/*far end*/,
+                            causeGiven,
+                            cause );
+                        }
+                    else if ( CALL_MODEM_MSG_DIRECT_INTERNAL == messageDirection )
+                        {
+                        // 2.33.13 Event indications on radio link failure
+TFLOGSTRING( "CSatEventDownload::CallModemMessageIndReceived radiolink failure");
+OstTrace0( TRACE_NORMAL, DUP5_CSATEVENTDOWNLOAD_CALLMODEMMESSAGEINDRECEIVED, "CSatEventDownload::CallModemMessageIndReceived Radiolink failure" );
+                        // In the case of a radio link timeout, the Cause data
+                        // object shall be included, with a value part of zero
+                        // length.
+                        causeGiven = ETrue;
+                        cause.Zero();
+                        SendCallDisconnectedEnvelope(
+                            transactionId,
+                            ETrue/*near end*/,
+                            causeGiven,
+                            cause );
+                        }
+                    }
+                break;
+                }
+            default:
+                {
+TFLOGSTRING( "CSatEventDownload::CallModemMessageIndReceived UNKNOWN" );
+OstTrace0( TRACE_NORMAL, DUP6_CSATEVENTDOWNLOAD_CALLMODEMMESSAGEINDRECEIVED, "CSatEventDownload::CallModemMessageIndReceived UNKNOWN" );
+                // do nothing
+                break;
+                }
+            }
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// CSatEventDownload::SendDataAvailableEnvelope
+// Send data available event to USIM
+// -----------------------------------------------------------------------------
+//
+TInt CSatEventDownload::SendDataAvailableEnvelope
+        (
+        RSat::TChannelStatus aStatus,    // Status of the channel
+        TInt8                 aLength     // Channel data length
+        )
+    {
+    OstTrace0( TRACE_NORMAL, CSATEVENTDOWNLOAD_SENDDATAAVAILABLEENVELOPE, "CSatEventDownload::SendDataAvailableEnvelope" );
+    TFLOGSTRING( "TSY: CSatEventDownload::SendDataAvailableEnvelope" );
+
+    TInt ret = KErrNone;
+
+    if ( iEventList.IsEnabled( RSat::KDataAvailable ) )
+        {
+        // create envelope
+        TTlv envelope;
+        envelope.Begin  ( KBerTlvEventDownloadTag );
+
+        // event list
+        envelope.AddTag ( KTlvEventListTag );
+        envelope.AddByte( KEventDataAvailable );
+
+        // device identities
+        envelope.AddTag ( KTlvDeviceIdentityTag );
+        envelope.AddByte( KMe );
+        envelope.AddByte( KSim );
+
+        // channel status
+        envelope.AddTag( KTlvChannelStatusTag );
+        envelope.AddData( aStatus );
+
+        // channel data length
+        envelope.AddTag( KTlvChannelDataLengthTag );
+        envelope.AddByte( aLength );
+
+        // send
+        ret =  iSatMessHandler->UiccCatReqEnvelope(
+            GetTransactionId(), envelope.End() );
+        }
+
+    return ret;
+    }
+
+// -----------------------------------------------------------------------------
+// CSatEventDownload::SendChannelStatusEnvelope
+// Send channel status event to USIM
+// -----------------------------------------------------------------------------
+//
+TInt CSatEventDownload::SendChannelStatusEnvelope
+        (
+        RSat::TChannelStatus aStatus    // Status of the channel
+        )
+    {
+    OstTrace0( TRACE_NORMAL, CSATEVENTDOWNLOAD_SENDCHANNELSTATUSENVELOPE, "CSatEventDownload::SendChannelStatusEnvelope" );
+    TFLOGSTRING("TSY: CSatEventDownload::SendChannelStatusEnvelope");
+
+    TInt ret = KErrNone;
+
+    if ( iEventList.IsEnabled( RSat::KChannelStatus ) )
+        {
+        // create envelope
+        TTlv envelope;
+        envelope.Begin  ( KBerTlvEventDownloadTag );
+
+        // event list
+        envelope.AddTag ( KTlvEventListTag );
+        envelope.AddByte( KEventChannelStatus );
+
+        // device identities
+        envelope.AddTag ( KTlvDeviceIdentityTag );
+        envelope.AddByte( KMe );
+        envelope.AddByte( KSim );
+
+        // channel status
+        envelope.AddTag( KTlvChannelStatusTag );
+        envelope.AddData( aStatus );
+
+        // send
+        ret =  iSatMessHandler->UiccCatReqEnvelope(
+            GetTransactionId(), envelope.End() );
+        }
+
+    return ret;
+    }
+
+// -----------------------------------------------------------------------------
+// CSatEventDownload::MessageReceived
+// Handle received messages related to event download.
+// Called by CSatMessHandler::MessageReceivedL, when a new ISI message arrives.
+// Identifies call server CALL_STATUS_IND message and passes it to
+// CallStatusIndReceived.
+// -----------------------------------------------------------------------------
+//
+TInt CSatEventDownload::MessageReceived
+        (
+        const TIsiReceiveC& aIsiMessage
+        )
+    {
+    OstTrace0( TRACE_NORMAL, CSATEVENTDOWNLOAD_MESSAGERECEIVED, "CSatEventDownload::MessageReceived" );
+    TFLOGSTRING("TSY: CSatEventDownload::MessageReceived");
+    // Get resource and message id's
+    TInt resource( aIsiMessage.Get8bit( ISI_HEADER_OFFSET_RESOURCEID ) );
+    TInt messageId( aIsiMessage.Get8bit( ISI_HEADER_OFFSET_MESSAGEID ) );
+
+    if ( PN_MODEM_CALL == resource )
+        {
+        switch ( messageId )
+            {
+            case CALL_MODEM_MESSAGE_IND:
+                {
+                if ( iEventList.IsEnabled( RSat::KMTCall )
+                    || iEventList.IsEnabled( RSat::KCallConnected )
+                    || iEventList.IsEnabled( RSat::KCallDisconnected ) )
+                    {
+                    // for call connected and disconnected events
+                    CallModemMessageIndReceived( aIsiMessage );
+                    }
+                break;
+                }
+            case CALL_MODEM_PRESENT_IND:
+                {
+                // Used only for location status event
+                if ( iEventList.IsEnabled( RSat::KLocationStatus ) )
+                    {
+                    TUint8 serverStatus( aIsiMessage.Get8bit(
+                        ISI_HEADER_SIZE +
+                        CALL_MODEM_PRESENT_IND_OFFSET_CALLPRESENT ) );
+                    // Upper three bits (5-7) indicate the underlying
+                    // cellular system. We don't use them, let's AND them away
+                    serverStatus &= 0x0F;
+
+                    if ( CALL_MODEM_NOT_PRESENT == serverStatus )
+                        {
+                        if ( iLocationStatusEnvelopePending )
+                            {
+                            // Location status event sent if ME is not busy
+                            // on calls and envelope is pending
+                            SendLocationStatusEnvelope(
+                                iSatMessHandler->LocationInfo() );
+                            }
+                        iCallsOngoing = EFalse;
+                        }
+                    else
+                        {
+                        // There's active calls
+                        iCallsOngoing = ETrue;
+                        }
+                    }
+                break;
+                }
+            default:
+                {
+                // do nothing
+                break;
+                }
+            }
+        }
+    else if ( PN_MODEM_NETWORK == resource )
+        {
+        switch ( messageId )
+            {
+            case NET_CELL_INFO_IND:
+                {
+                iNetCellInfoIndReceived = ETrue;
+                if ( iEventList.IsEnabled( RSat::KLocationStatus ) )
+                    {
+                    if ( !iCallsOngoing )
+                        {
+                        // Location status event sent if ME is not busy on calls
+                        SendLocationStatusEnvelope(
+                            iSatMessHandler->LocationInfo() );
+                        }
+                    else
+                        {
+                        // Let's send envelope after ongoing call(s)
+                        iLocationStatusEnvelopePending = ETrue;
+                        }
+                    }
+                break;
+                }
+            default:
+                {
+                // do nothing
+                break;
+                }
+            }
+        }
+
+    return KErrNone;
+    }
+
+// -----------------------------------------------------------------------------
+// CSatEventDownload::SetSetUpCallStatus
+// Set SetUpCall status
+// -----------------------------------------------------------------------------
+//
+void CSatEventDownload::SetSetUpCallStatus
+        (
+        const TBool aStatus // SetUpCall status
+        )
+    {
+    OstTrace0( TRACE_NORMAL, CSATEVENTDOWNLOAD_SETSETUPCALLSTATUS, "CSatEventDownload::SetSetUpCallStatus" );
+    TFLOGSTRING("TSY: CSatEventDownload::SetSetUpCallStatus");
+    iSetUpCallOngoing = aStatus;
+    }
+
+// -----------------------------------------------------------------------------
+// CSatEventDownload::SendAccessTechnologyChangeEnvelope
+// Send access technology change event to USIM
+// -----------------------------------------------------------------------------
+//
+TInt CSatEventDownload::SendAccessTechnologyChangeEnvelope
+        (
+        TUint8  accTechChange //Acc Tech
+        )
+    {
+    OstTrace0( TRACE_NORMAL, CSATEVENTDOWNLOAD_SENDACCESSTECHNOLOGYCHANGEENVELOPE, "CSatEventDownload::SendAccessTechnologyChangeEnvelope" );
+    TFLOGSTRING("TSY: CSatEventDownload::SendAccessTechnologyChangeEnvelope");
+
+    TInt ret = KErrNone;
+
+    if ( iEventList.IsEnabled( RSat::KAccessTechnologyChange ) )
+        {
+        TFLOGSTRING("TSY: CSatEventDownload::SendAccessTechnologyChangeEnvelope\
+        - Event enabled: sending envelope");
+        OstTrace0( TRACE_NORMAL, DUP1_CSATEVENTDOWNLOAD_SENDACCESSTECHNOLOGYCHANGEENVELOPE, "CSatEventDownload::SendAccessTechnologyChangeEnvelope - Event enabled: sending envelope" );
+        // create envelope
+        TTlv envelope;
+        envelope.Begin  ( KBerTlvEventDownloadTag );
+
+        // event list
+        envelope.AddTag ( KTlvEventListTag );
+        envelope.AddByte( KEventAccessTechnologyChange );
+
+        // device identities
+        envelope.AddTag ( KTlvDeviceIdentityTag );
+        envelope.AddByte( KMe );
+        envelope.AddByte( KSim );
+
+        // channel status
+        envelope.AddTag( KTlvAccessTechnologyTag );
+        envelope.AddByte( accTechChange );
+
+        // send
+        ret =  iSatMessHandler->UiccCatReqEnvelope(
+            GetTransactionId(), envelope.End() );
+        }
+
+    return ret;
+    }
+
+// -----------------------------------------------------------------------------
+// CSatEventDownload::ForceLocationStatusEnvelope
+// Force sending of Location status envelope if ENS supported in product profile
+// and SET UP EVENT LIST terminal response is sent
+// -----------------------------------------------------------------------------
+//
+#ifdef INFO_PP_ENHANCED_NETWORK_SELECTION
+TInt CSatEventDownload::ForceLocationStatusEnvelope()
+    {
+    TFLOGSTRING("TSY: CSatEventDownload::ForceLocationStatusEnvelope");
+    OstTrace0( TRACE_NORMAL, CSATEVENTDOWNLOAD_FORCELOCATIONSTATUSENVELOPE, "CSatEventDownload::ForceLocationStatusEnvelope" );
+
+    TInt ret( KErrNone );
+    if ( iEventList.IsEnabled( RSat::KLocationStatus )
+        && iSatMessHandler->EnsSupported()
+        && iNetCellInfoIndReceived )
+        {
+        TFLOGSTRING("TSY: CSatEventDownload::ForceLocationStatusEnvelope, Event list includes Location status and ENS is supported in PP");
+        OstTrace0( TRACE_NORMAL, DUP1_CSATEVENTDOWNLOAD_FORCELOCATIONSTATUSENVELOPE, "CSatEventDownload::ForceLocationStatusEnvelope, Event list includes Location status and ENS is supported in PP" );
+        ret = SendLocationStatusEnvelope( 
+            iSatMessHandler->LocationInfo() );
+        }
+    return ret;
+    }
+#endif // INFO_PP_ENHANCED_NETWORK_SELECTION
+// End of File