--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/telephonyserverplugins/simatktsy/src/csattsy.cpp Tue Feb 02 01:41:59 2010 +0200
@@ -0,0 +1,1217 @@
+// 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:
+// Name : CSatTsy.cpp
+// Part of : Common SIM ATK TSY / commonsimatktsy
+// Main entry point for Etel requests
+// Version : 1.0
+//
+
+
+
+// INCLUDE FILES
+#include <etelsat.h> // Etel SAT API
+#include <satcs.h> // Etel SAT API
+//#include "CMmPhoneTsy.h" // Phone Tsy class
+#include "CSatDataPackage.h" // For data packages
+//#include "MmTsy_numberOfSlots.h" // Number of Slots
+#include "cmmmessagemanagerbase.h" // Message manager base
+#include <ctsy/pluginapi/mmessagerouter.h>
+#include <ctsy/serviceapi/mctsysatservice.h>
+//#include "CMmMessageRouterBase.h" // Message router
+
+//#include "CMmSmsTsy.h" // MmSmsTsy
+//#include "CMmMessageManager.h" // Message manager
+
+#include "CSatTsy.h" // Messaging class
+#include "CSatCCTsy.h" // SatCallControl class
+#include "CSatIconTsy.h" // SatIcon class
+#include "CSatNotificationsTsy.h" // SatNotifications class
+#include "CSatNotifySetUpCall.h" // CSatNotifySetUpCall
+#include "CSatEventDownloadTsy.h" // SatEventDownload class
+#include "CSatDataDownloadTsy.h" // SatDataDownload class
+
+#include "msattsy_ipcdefs.h" // Sat Tsy specific request types
+#include "TfLogger.h" // For TFLOGSTRING
+#include "TSatUtility.h" // Sat Tsy Utility class
+#include "TTlv.h" // TTlv class
+#include "CSatTsyReqHandleStore.h" // Request handle storage
+
+#include "stktsy_number_of_slots.h"
+
+// -----------------------------------------------------------------------------
+// CSatTsy::NewL
+// Two-phased constructor.
+// -----------------------------------------------------------------------------
+//
+CSatTsy* CSatTsy::NewL
+ (
+ MMessageRouter& aMmMessageRouter,
+ MCtsySatService& aSatService
+ )
+ {
+ TFLOGSTRING("CSAT: CSatTsy::NewL");
+
+ // Create subsession
+ CSatTsy* subsession = new ( ELeave ) CSatTsy( aMmMessageRouter, aSatService );
+
+ CleanupStack::PushL( subsession );
+ subsession->ConstructL();
+ CleanupStack::Pop();
+
+ TFLOGSTRING("CSAT: CSatTsy::NewL, end of method");
+ return subsession;
+ }
+
+// -----------------------------------------------------------------------------
+// CSatTsy::~CSatTsy
+// Destructor
+// -----------------------------------------------------------------------------
+//
+CSatTsy::~CSatTsy
+ (
+ // None
+ )
+ {
+ TFLOGSTRING("CSAT: CSatTsy::~CSatTsy");
+
+ // Unregister.
+ iMessageManager->RegisterTsyObject(
+ CMmMessageManagerBase::ESatTsyObjType, NULL );
+
+ // Delete also specific TSY objects
+ delete iSatCCTsy;
+ delete iSatIconTsy;
+ delete iSatNotificationsTsy;
+ delete iSatDataDownloadTsy;
+ delete iSatEventDownloadTsy;
+ // Message router and message manager are deleted here
+ delete iMessageManager;
+ // Request handle store
+ delete iSatReqHandleStore;
+ TFLOGSTRING("CSAT: CSatTsy::~CSatTsy, end of method");
+ }
+
+// -----------------------------------------------------------------------------
+// CSatTsy::CSatTsy
+// C++ constructor
+// -----------------------------------------------------------------------------
+//
+CSatTsy::CSatTsy
+ (
+ MMessageRouter& aMmMessageRouter,
+ MCtsySatService& aSatService
+ ):
+ iMessageRouter ( aMmMessageRouter ),
+ iSatService(aSatService)
+ {
+ // None
+ }
+
+// -----------------------------------------------------------------------------
+// CSatTsy::ConstructL
+// Symbian 2nd phase constructor. Initialises internal attributes.
+// -----------------------------------------------------------------------------
+//
+void CSatTsy::ConstructL
+ (
+ )
+ {
+ TFLOGSTRING("CSAT: CSatTsy::ConstructL");
+
+ // Set pointer to the message router
+ iMessageManager = CMmMessageManagerBase::NewL(iMessageRouter);
+
+ // Register
+ iMessageManager->RegisterTsyObject(
+ CMmMessageManagerBase::ESatTsyObjType, this );
+
+ // Create request handle store
+ iSatReqHandleStore = CSatTsyReqHandleStore::NewL(
+ ESatMaxNumOfRequests, iSatReqHandles );
+
+ // Create IconTsy instance
+ iSatIconTsy = CSatIconTsy::NewL( this );
+ // Create NotificationsTsy instance
+ iSatNotificationsTsy = CSatNotificationsTsy::NewL(
+ this, iSatReqHandleStore );
+ // Create CCTsy instance
+ iSatCCTsy = CSatCCTsy::NewL( this, iSatNotificationsTsy );
+ // Create DataDownloadTsy instance
+ iSatDataDownloadTsy = CSatDataDownloadTsy::NewL( this );
+ // Create EventDownloadTsy instance
+ iSatEventDownloadTsy = CSatEventDownloadTsy::NewL( this );
+
+ // Request to read Cbmids
+#ifdef USING_CTSY_DISPATCHER
+ //Commented out due to not seemingly doing anything as the STK TSY does not hold EF_cbmid cache
+ //iSatDataDownloadTsy->CompleteReadCbmidsL( );
+ // Request Network status (removed as no known completion)
+ //iMessageManager->HandleRequestL( ESatTsyNetStatus );
+ // Check if guardians should be activated (removed as no known completion)
+ //iMessageManager->HandleRequestL( ESatTsyCallControlActivation );
+ //Check if the SIM card suppords USSD tlv's in the call control envelopes (removed as no known completion)
+ //iMessageManager->HandleRequestL( ESatTsyUssdControlActivation );
+ // Get the default bearer data
+ iMessageManager->HandleRequestL( ESatTsyGetBearerCapability );
+ //prime the cached version of this setting
+ iMessageManager->HandleRequestL( ESatTsyUssdStatus);
+#else
+ iSatDataDownloadTsy->CompleteReadCbmidsL( );
+ // Request Network status
+ iMessageManager->HandleRequestL( ESatTsyNetStatus );
+ // Check if guardians should be activated
+ iMessageManager->HandleRequestL( ESatTsyCallControlActivation );
+ //Check if the SIM card suppords USSD tlv's in the call control envelopes
+ iMessageManager->HandleRequestL( ESatTsyUssdControlActivation );
+ // Get the default bearer data
+ iMessageManager->HandleRequestL( ESatTsyGetBearerCapability );
+#endif //USING_CTSY_DISPATCHER
+ // Notify Licencee SIM ATK TSY that we are ready to receive messages
+ iMessageManager->HandleRequestL( ESatTsyReady );
+ // Get SMS Point to Point Data Download support status
+ iMessageManager->HandleRequestL( ESatTsySmsPpDdlStatus );
+
+ TFLOGSTRING("CSAT: CSatTsy::ConstructL, end of method");
+ }
+
+// -----------------------------------------------------------------------------
+// CSatTsy::ExtFunc
+// TRAP's all CSatTsy related Etel API requests in cases that they fail.
+// -----------------------------------------------------------------------------
+//
+TInt CSatTsy::ExtFunc
+ (
+ const TTsyReqHandle aTsyReqHandle,
+ const TInt aIpc,
+ const TDataPackage& aPackage
+ )
+ {
+ TFLOGSTRING3("CSAT: CSatTsy::ExtFunc ReqHandle=%d IPC=%d", aTsyReqHandle,
+ aIpc);
+ TInt ret( KErrNone );
+
+ // Some SAT functions need trapping so we use two level function where
+ // first one is just a trap harness
+
+ // It is responsibility of IPC handling functions to always handle
+ // calling ReqComplete, ( it must either call it, or arrange it to
+ // be called in some way ), except in the case of Leave. It is also
+ // assumed that if after IPC handling function has called ReqComplete,
+ // then it doesn't Leave.
+ TInt trapError( KErrNone );
+
+ TRAP( trapError, ret = DoExtFuncL( aTsyReqHandle, aIpc, aPackage ) );
+
+ if ( KErrNone != trapError )
+ {
+ TFLOGSTRING2("CSAT: CSatTsy::ExtFunc, trapError: %d", trapError );
+ ReqCompleted( aTsyReqHandle, trapError );
+ }
+ else if ( KErrNone != ret )
+ {
+ TFLOGSTRING2("CSAT: CSatTsy::ExtFunc, ret: %d", ret);
+ ReqCompleted( aTsyReqHandle, ret );
+ }
+ else
+ {
+ // Reset last Tsy request type
+ iReqHandleType = ESatReqHandleUnknown;
+ }
+
+ return KErrNone;
+ }
+
+// -----------------------------------------------------------------------------
+// CSatTsy::SaveReqHandle
+// Saves the request handle
+// -----------------------------------------------------------------------------
+//
+void CSatTsy::SaveReqHandle
+ (
+ const TTsyReqHandle aTsyReqHandle,
+ const TSatRequestTypes aSatRequestType
+ )
+ {
+ TFLOGSTRING3("CSAT: CSatTsy::SaveReqHandle ReqHandle=%d ReqHandleType=%d",
+ aTsyReqHandle, aSatRequestType);
+
+ // Don't save the request handle if the type is unknown.
+ if ( ESatReqHandleUnknown != aSatRequestType )
+ {
+ iSatReqHandleStore->SetTsyReqHandle( aSatRequestType, aTsyReqHandle );
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// CSatTsy::ReqModeL
+// Mode service function used by ETel, request mode. ReqModeL is called from
+// the server's CTelObject::ReqAnalyserL in order to check the type of request
+// it has.
+// -----------------------------------------------------------------------------
+//
+CTelObject::TReqMode CSatTsy::ReqModeL
+ (
+ const TInt aIpc
+ )
+ {
+ TFLOGSTRING("CSAT: CSatTsy::ReqModeL.");
+ CTelObject::TReqMode ret = 0;
+
+ switch ( aIpc )
+ {
+ // Multiple Completion Services
+ case ESatNotifyDisplayTextPCmd:
+ case ESatNotifyGetInkeyPCmd:
+ case ESatNotifyGetInputPCmd:
+ case ESatNotifyPlayTonePCmd:
+ case ESatNotifySetUpMenuPCmd:
+ case ESatNotifySelectItemPCmd:
+ case ESatNotifySendSmPCmd:
+ case ESatNotifySendSsPCmd:
+ case ESatNotifySendUssdPCmd:
+ case ESatNotifySetUpCallPCmd:
+ case ESatNotifyRefreshPCmd:
+ case ESatNotifyRefreshRequiredParam:
+ case ESatRefreshAllowed:
+ case ESatNotifyCallControlRequest:
+ case ESatNotifySendDtmfPCmd:
+ case ESatNotifyMoSmControlRequest:
+ case ESatNotifySetUpEventListPCmd:
+ case ESatNotifySetUpIdleModeTextPCmd:
+ case ESatNotifyProactiveSimSessionEnd:
+ case ESatNotifyLaunchBrowserPCmd:
+ case ESatNotifyPollingIntervalPCmd:
+ case ESatNotifyPollingOffPCmd:
+ case ESatNotifyLanguageNotificationPCmd:
+ case ESatNotifyLocalInfoPCmd:
+ case ESatNotifyOpenChannelPCmd:
+ case ESatNotifyGetChannelStatusPCmd:
+ case ESatNotifyCloseChannelPCmd:
+ case ESatNotifySendDataPCmd:
+ case ESatNotifyReceiveDataPCmd:
+ {
+ ret = KReqModeMultipleCompletionEnabled;
+ break;
+ }
+ // Non-flow Controlled Services
+ case ESatTerminalRsp:
+ case ESatMenuSelection:
+ case ESatEventDownload:
+ case ESatGetIcon:
+ case ESatGetImageInstance:
+ case ESatGetClut:
+ case ESatGetMeSideSatProfile:
+ case ESatClientSatProfileIndication:
+ case ESatSendMessageNoLogging:
+ {
+ break;
+ }
+ default:
+ {
+ TFLOGSTRING2("CSAT: CSatTsy::ReqModeL unsupported IPC %d", aIpc);
+ User::Leave( KErrNotSupported );
+ break;
+ }
+ }
+ return ret;
+ }
+
+// -----------------------------------------------------------------------------
+// CSatTsy::CancelService
+// Cancels Sat requests
+// -----------------------------------------------------------------------------
+//
+TInt CSatTsy::CancelService
+ (
+ const TInt aIpc,
+ const TTsyReqHandle aTsyReqHandle
+ )
+ {
+ TFLOGSTRING3("CSAT: CSatTsy::CancelService ReqHandle=%d IPC=%d",
+ aTsyReqHandle, aIpc);
+ TInt ret( KErrNotSupported );
+
+ // When the clients close their sub-sessions (eg. by calling RLine::Close),
+ // they may not have cancelled all their outstanding asynchronous requests
+ // before closing. It is up to the ETel server to clean up in this
+ // situation, so the server will find the list of outstanding requests
+ // related to that sub-session object and pass these outstanding IPC
+ // request numbers, one at a time, to the CancelService method in the TSY.
+
+ switch ( aIpc )
+ {
+ case ESatTerminalRsp:
+ case ESatMenuSelection:
+ //case ESatSendMessageNoLogging:
+ {
+ ret = KErrNone;
+ break;
+ }
+ case ESatNotifyCallControlRequest:
+ case ESatNotifyMoSmControlRequest:
+ case ESatNotifyDisplayTextPCmd:
+ case ESatNotifyGetInkeyPCmd:
+ case ESatNotifyGetInputPCmd:
+ case ESatNotifyPlayTonePCmd:
+ case ESatNotifySetUpMenuPCmd:
+ case ESatNotifySelectItemPCmd:
+ case ESatNotifySetUpCallPCmd:
+ case ESatNotifySendSmPCmd:
+ case ESatNotifySendSsPCmd:
+ case ESatNotifySendUssdPCmd:
+ case ESatNotifyRefreshPCmd:
+ case ESatNotifyRefreshRequiredParam:
+ case ESatNotifySetUpIdleModeTextPCmd:
+ case ESatNotifySendDtmfPCmd:
+ case ESatNotifyLaunchBrowserPCmd:
+ case ESatNotifyLocalInfoPCmd:
+ case ESatNotifyLanguageNotificationPCmd:
+ case ESatNotifySetUpEventListPCmd:
+ case ESatNotifyProactiveSimSessionEnd:
+ case ESatNotifyOpenChannelPCmd:
+ case ESatNotifyGetChannelStatusPCmd:
+ case ESatNotifyCloseChannelPCmd:
+ case ESatNotifySendDataPCmd:
+ case ESatNotifyReceiveDataPCmd:
+ {
+ ret = iSatNotificationsTsy->CancelService ( aIpc, aTsyReqHandle );
+ break;
+ }
+
+ case ESatEventDownload:
+ {
+ ret = iSatEventDownloadTsy->CancelService ( aIpc, aTsyReqHandle );
+ break;
+ }
+
+ // Following functions are not supported, hence they are completed
+ // by DoExtFuncL function at once.
+ // ETel server will not pass cancel function to SAT, because the
+ // request is not 'ON' in ETel.
+ // They are listed here for future reference.
+ //
+
+ // ESatNotifyMoSmControlRequest
+ // ESatEventDownload
+ // ESatGetMeSideSatProfile
+
+ default:
+ {
+ TFLOGSTRING2("CSAT: CSatTsy::CancelService invalid IPC %d", aIpc);
+ ret = KErrGeneral;
+ break;
+ }
+ }
+ return ret;
+
+ }
+
+// -----------------------------------------------------------------------------
+// CSatTsy::RegisterNotification
+// ETel Server subscribe notifications from NOS. 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 the phone.
+// -----------------------------------------------------------------------------
+//
+TInt CSatTsy::RegisterNotification
+ (
+ const TInt aIpc // IPC number of request
+ )
+ {
+ TFLOGSTRING("CSAT: CSatTsy::RegisterNotification.");
+ // Initialize return value
+ TInt ret( KErrNone );
+
+ switch ( aIpc )
+ {
+ case ESatNotifyDisplayTextPCmd:
+ case ESatNotifyGetInkeyPCmd:
+ case ESatNotifyGetInputPCmd:
+ case ESatNotifyPlayTonePCmd:
+ case ESatNotifySetUpMenuPCmd:
+ case ESatNotifySelectItemPCmd:
+ case ESatNotifySendSmPCmd:
+ case ESatNotifySendSsPCmd:
+ case ESatNotifySendUssdPCmd:
+ case ESatNotifySetUpCallPCmd:
+ case ESatNotifyRefreshPCmd:
+ case ESatNotifyRefreshRequiredParam:
+ case ESatRefreshAllowed:
+ case ESatNotifyProactiveSimSessionEnd:
+ case ESatNotifySetUpIdleModeTextPCmd:
+ case ESatNotifyLaunchBrowserPCmd:
+ case ESatNotifyCallControlRequest:
+ case ESatNotifySendDtmfPCmd:
+ case ESatNotifySetUpEventListPCmd:
+ case ESatNotifyLanguageNotificationPCmd:
+ case ESatNotifyLocalInfoPCmd:
+ case ESatNotifyMoSmControlRequest:
+ case ESatNotifyOpenChannelPCmd:
+ case ESatNotifyGetChannelStatusPCmd:
+ case ESatNotifyCloseChannelPCmd:
+ case ESatNotifySendDataPCmd:
+ case ESatNotifyReceiveDataPCmd:
+ {
+ // Ret already set to KErrNone
+ break;
+ }
+ default:
+ {
+ // Unknown or invalid IPC
+ TFLOGSTRING2("CSAT: CSatTsy::RegisterNotification, \
+ Unsupported IPC %d", aIpc);
+ ret = KErrNotSupported;
+ break;
+ }
+ }
+ return ret;
+ }
+
+// -----------------------------------------------------------------------------
+// CSatTsy::DeregisterNotification
+// ETel server unsubscribe notifications from NOS. DeregisterNotification is
+// called when the server recognizes 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 the phone.
+// -----------------------------------------------------------------------------
+//
+TInt CSatTsy::DeregisterNotification
+ (
+ const TInt aIpc // IPC number of request
+ )
+ {
+ TFLOGSTRING("CSAT: CSatTsy::DeregisterNotification.");
+ // Initialize return value
+ TInt ret( KErrNone );
+
+ switch ( aIpc )
+ {
+ case ESatNotifyDisplayTextPCmd:
+ case ESatNotifyGetInkeyPCmd:
+ case ESatNotifyGetInputPCmd:
+ case ESatNotifyPlayTonePCmd:
+ case ESatNotifySetUpMenuPCmd:
+ case ESatNotifySelectItemPCmd:
+ case ESatNotifySendSmPCmd:
+ case ESatNotifySendSsPCmd:
+ case ESatNotifySendUssdPCmd:
+ case ESatNotifySetUpCallPCmd:
+ case ESatNotifyRefreshPCmd:
+ case ESatNotifyRefreshRequiredParam:
+ case ESatRefreshAllowed:
+ case ESatNotifyProactiveSimSessionEnd:
+ case ESatNotifySetUpIdleModeTextPCmd:
+ case ESatNotifyLaunchBrowserPCmd:
+ case ESatNotifyCallControlRequest:
+ case ESatNotifySendDtmfPCmd:
+ case ESatNotifySetUpEventListPCmd:
+ case ESatNotifyLanguageNotificationPCmd:
+ case ESatNotifyLocalInfoPCmd:
+ case ESatNotifyOpenChannelPCmd:
+ case ESatNotifyGetChannelStatusPCmd:
+ case ESatNotifyMoSmControlRequest:
+ case ESatNotifyCloseChannelPCmd:
+ case ESatNotifySendDataPCmd:
+ case ESatNotifyReceiveDataPCmd:
+ {
+ // Ret already set to KErrNone
+ break;
+ }
+ default:
+ {
+ // Unknown or invalid IPC
+ TFLOGSTRING2("CSAT: CSatTsy::DeregisterNotification, \
+ Unsupported IPC %d", aIpc);
+ ret = KErrNotSupported;
+ break;
+ }
+ }
+ return ret;
+ }
+
+// -----------------------------------------------------------------------------
+// CSatTsy::NumberOfSlotsL
+// Returns number of slots to be used for given IPC. 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.
+// -----------------------------------------------------------------------------
+//
+TInt CSatTsy::NumberOfSlotsL
+ (
+ const TInt aIpc // IPC number of request
+ )
+ {
+ TFLOGSTRING("CSAT: CSatTsy::NumberOfSlotsL.");
+ TInt numberOfSlots( 1 );
+
+ switch ( aIpc )
+ {
+ case ESatNotifyDisplayTextPCmd:
+ {
+ numberOfSlots = KSatNotifyDisplayTextPCmdSlots;
+ break;
+ }
+ case ESatNotifyGetInkeyPCmd:
+ {
+ numberOfSlots = KSatNotifyGetInkeyPCmdSlots;
+ break;
+ }
+ case ESatNotifyGetInputPCmd:
+ {
+ numberOfSlots = KSatNotifyGetInputPCmdSlots;
+ break;
+ }
+ case ESatNotifyPlayTonePCmd:
+ {
+ numberOfSlots = KSatNotifyPlayTonePCmdSlots;
+ break;
+ }
+ case ESatNotifySetUpMenuPCmd:
+ {
+ numberOfSlots = KSatNotifySetUpMenuPCmdSlots;
+ break;
+ }
+ case ESatNotifySelectItemPCmd:
+ {
+ numberOfSlots = KSatNotifySelectItemPCmdSlots;
+ break;
+ }
+ case ESatNotifySendSmPCmd:
+ {
+ numberOfSlots = KSatNotifySendSmPCmdSlots;
+ break;
+ }
+ case ESatNotifySendSsPCmd:
+ {
+ numberOfSlots = KSatNotifySendSsPCmdSlots;
+ break;
+ }
+ case ESatNotifySendUssdPCmd:
+ {
+ numberOfSlots = KSatNotifySendUssdPCmdSlots;
+ break;
+ }
+ case ESatNotifySetUpCallPCmd:
+ {
+ numberOfSlots = KSatNotifySetUpCallPCmdSlots;
+ break;
+ }
+ case ESatNotifyRefreshPCmd:
+ {
+ numberOfSlots = KSatNotifyRefreshPCmdSlots;
+ break;
+ }
+ case ESatNotifyProactiveSimSessionEnd:
+ {
+ numberOfSlots = KSatNotifyProactiveSimSessionEndSlots;
+ break;
+ }
+ case ESatNotifySetUpIdleModeTextPCmd:
+ {
+ numberOfSlots = KSatNotifySetUpIdleModeTextPCmdSlots;
+ break;
+ }
+ case ESatNotifyLaunchBrowserPCmd:
+ {
+ numberOfSlots = KSatNotifyLaunchBrowserSlots;
+ break;
+ }
+ case ESatNotifyCallControlRequest:
+ {
+ numberOfSlots = KSatNotifyCallControlRequestSlots;
+ break;
+ }
+ case ESatNotifySendDtmfPCmd:
+ {
+ numberOfSlots = KSatNotifySendDtmfSlots;
+ break;
+ }
+ case ESatNotifySetUpEventListPCmd:
+ {
+ numberOfSlots = KSatNotifySetUpEventListSlots;
+ break;
+ }
+ case ESatNotifyLanguageNotificationPCmd:
+ {
+ numberOfSlots = KSatNotifySetUpEventListSlots;
+ break;
+ }
+ case ESatNotifyLocalInfoPCmd:
+ case ESatNotifyOpenChannelPCmd:
+ case ESatNotifyCloseChannelPCmd:
+ case ESatNotifyReceiveDataPCmd:
+ case ESatNotifySendDataPCmd:
+ case ESatNotifyGetChannelStatusPCmd:
+ case ESatNotifyMoSmControlRequest:
+ {
+ numberOfSlots = KSatNotifySetUpEventListSlots;
+ break;
+ }
+ case ESatNotifyRefreshRequiredParam:
+ case ESatRefreshAllowed:
+ {
+ // Default is set to one
+ break;
+ }
+ default:
+ {
+ // Unknown or invalid IPC
+ TFLOGSTRING2("CSAT: CSatTsy::NumberOfSlotsL, Unsupported IPC %d",
+ aIpc);
+ User::Leave( KErrNotSupported );
+ break;
+ }
+ }
+ return numberOfSlots;
+ }
+
+// -----------------------------------------------------------------------------
+// CSatTsy::ReqCompleted
+// Completes requests to ETel
+// -----------------------------------------------------------------------------
+//
+void CSatTsy::ReqCompleted
+ (
+ TTsyReqHandle aReqHandle,
+ TInt aRet
+ )
+ {
+ TFLOGSTRING2("CSAT: CSatTsy::ReqCompleted, ReqHandle=%d ", aReqHandle);
+#ifdef USING_CTSY_DISPATCHER
+ CTelObject::ReqCompleted( aReqHandle, aRet );
+#else
+ ReqCompleted( aReqHandle, aRet );
+#endif //USING_CTSY_DISPATCHER
+ }
+
+// -----------------------------------------------------------------------------
+// CSatTsy::StoreCallConnectedEvent
+// Cache call connected envelope to CSatNotifySetUpCall class
+// -----------------------------------------------------------------------------
+//
+void CSatTsy::StoreCallConnectedEvent
+ (
+ const TDesC8& aEnvelope
+ )
+ {
+ TFLOGSTRING("CSAT: CSatTsy::StoreCallConnectedEvent");
+ iSatNotificationsTsy->SatNotifySetUpCall()->StoreCallConnectedEvent(
+ aEnvelope );
+ }
+
+// -----------------------------------------------------------------------------
+// CSatTsy::SetSetUpCallStatus
+// Set Status of SetUpCall command to the CSatEventDownloadTsy class
+// -----------------------------------------------------------------------------
+//
+void CSatTsy::SetSetUpCallStatus
+ (
+ const TBool aStatus
+ )
+ {
+ TFLOGSTRING("CSAT: CSatTsy::SetSetUpCallStatus");
+ iSatEventDownloadTsy->SetSetUpCallStatus( aStatus );
+ }
+
+// -----------------------------------------------------------------------------
+// CSatTsy::SetUpEventList
+// Sets events that are reported to NAA
+// -----------------------------------------------------------------------------
+//
+void CSatTsy::SetUpEventList
+ (
+ TUint32 aEvents // events to be monitored
+ )
+ {
+ TFLOGSTRING("CSAT: CSatTsy::SetUpEventList");
+ iSatEventDownloadTsy->SetUpEventList( aEvents );
+ }
+
+// -----------------------------------------------------------------------------
+// CSatTsy::MessageManager
+// This method returns a pointer to iMessageManager object.
+// -----------------------------------------------------------------------------
+//
+CMmMessageManagerBase* CSatTsy::MessageManager
+ (
+ // none
+ )
+ {
+ TFLOGSTRING("CSAT: CSatTsy::MessageManager");
+ return iMessageManager;
+ }
+
+// -----------------------------------------------------------------------------
+// CSatTsy::SatCCTsy
+// This method returns a pointer to Call Control TSY object.
+// -----------------------------------------------------------------------------
+//
+CSatCCTsy* CSatTsy::SatCCTsy
+ (
+ // none
+ )
+ {
+ TFLOGSTRING("CSAT: CSatTsy::SatCCTsy");
+ return iSatCCTsy;
+ }
+
+// -----------------------------------------------------------------------------
+// CSatTsy::GetSatReqHandleStore
+// Returns iSatReqHandleStore pointer and control to calling object
+// -----------------------------------------------------------------------------
+//
+CSatTsyReqHandleStore* CSatTsy::GetSatReqHandleStore
+ (
+ //none
+ )
+ {
+ TFLOGSTRING("CSAT: CSatTsy::GetSatReqHandleStore");
+ return iSatReqHandleStore;
+ }
+
+// -----------------------------------------------------------------------------
+// CSatTsy::GetReqHandleType
+// Returns pointer to request handle type
+// -----------------------------------------------------------------------------
+//
+CSatTsy::TSatRequestTypes* CSatTsy::GetReqHandleType
+ (
+ //none
+ )
+ {
+ TFLOGSTRING("CSAT: CSatTsy::GetReqHandleType");
+ return &iReqHandleType;
+ }
+
+// -----------------------------------------------------------------------------
+// CSatTsy::CompleteSendSmsMessage
+// Message from MMSMS side that message sending has been completed
+// -----------------------------------------------------------------------------
+//
+TInt CSatTsy::CompleteSendSmsMessage
+ (
+ TInt aStatus
+ )
+ {
+ TFLOGSTRING("CSAT: CSatTsy::CompleteSendSmsMessage");
+
+ // Reset req handle. Returns the deleted req handle
+ TTsyReqHandle reqHandle = iSatNotificationsTsy->RequestHandleStore()->
+ ResetTsyReqHandle( CSatTsy::ESatSendMessageNoLoggingReqType );
+
+ // In case the request was ongoing, continue..
+ if ( CSatTsy::ESatReqHandleUnknown != reqHandle )
+ {
+ ReqCompleted( reqHandle, aStatus );
+ }
+ return KErrNone;
+ }
+
+// -----------------------------------------------------------------------------
+// CSatTsy::IsMoSmControlBySimActivated
+// This method is required by CommonTSY, which needs to know whether the
+// MoSmControlBySim is activated or not.
+// -----------------------------------------------------------------------------
+//
+TBool CSatTsy::IsMoSmControlBySimActivated
+ (
+ void
+ )
+ {
+ TFLOGSTRING("CSAT: CSatTsy::IsMoSmControlBySimActivated");
+ return iSatNotificationsTsy->IsMoSmControlActivated();
+ }
+
+#ifdef USING_CTSY_DISPATCHER
+ /**
+ * From MStkTsyCallOrigin
+ * Dummy implementation for IsSimOriginatedCall function
+ *
+ * @param aAddress The number whose origin is required.
+ * @return ETrue if call originates from a Proactive Command
+ */
+TBool CSatTsy::IsSimOriginatedCall
+ (
+ const TDesC8& aAddress
+ )
+ {
+ TFLOGSTRING("CSAT: CSatTsy::IsSimOriginatedCall");
+ TBool ret = EFalse;
+ if (iSatCCTsy)
+ {
+ ret = iSatCCTsy->HasProactiveOrigin(aAddress);
+ }
+ return ret;
+ }
+#endif //USING_CTSY_DISPATCHER
+
+// -----------------------------------------------------------------------------
+// CSatTsy::StoreProactiveAddress
+// Stores latest address of Send SS/Setup call proactive command to CSatCC
+// (other items were commented in a header). Method is also called when
+// proactive session is over with parameter NULL.
+// -----------------------------------------------------------------------------
+//
+void CSatTsy::StoreProactiveAddress
+ (
+ const TDesC8* aAddress
+ )
+ {
+ TFLOGSTRING("CSAT: CSatTsy::StoreProactiveAddress");
+ iSatCCTsy->StoreAddressForCC( *aAddress );
+ }
+
+// -----------------------------------------------------------------------------
+// CSatTsy::SetTonNpi
+// Stores Ton Npi to CSatCC
+// -----------------------------------------------------------------------------
+//
+void CSatTsy::SetTonNpi
+ (
+ const TUint8 aTonNpi
+ )
+ {
+ TFLOGSTRING("CSAT: CSatTsy::SetTonNpi");
+ iSatCCTsy->SetTonNpiForSS( aTonNpi );
+ }
+
+// -----------------------------------------------------------------------------
+// CSatTsy::DoExtFuncL
+// Dispatch to correct SAT Tsy/function according to the IPC
+// -----------------------------------------------------------------------------
+//
+TInt CSatTsy::DoExtFuncL
+ (
+ const TTsyReqHandle aTsyReqHandle,
+ const TInt aIpc,
+ const TDataPackage& aPackage
+ )
+ {
+ TFLOGSTRING3("CSAT: CSatTsy::DoExtFuncL\t IPC:%d,\t Handle:%d",
+ aIpc, aTsyReqHandle);
+ TInt ret( KErrNone );
+
+ // Add here ALL supported Sat request types, and call either the correct
+ // Sat Tsy to handle the request, or a request directly here in CSatTsy.
+ switch ( aIpc )
+ {
+ // General
+ case ESatMenuSelection:
+ {
+ ret = MenuSelectionL( aTsyReqHandle,
+ reinterpret_cast<RSat::TMenuSelectionV1Pckg*>(
+ aPackage.Des1n() ) );
+ break;
+ }
+ case ESatSendMessageNoLogging:
+ {
+ SendMessageNoLogging( aPackage.Des1n(), aTsyReqHandle );
+ break;
+ }
+ // Icon
+ case ESatGetIcon:
+ case ESatGetImageInstance:
+ case ESatGetClut:
+ {
+ ret = iSatIconTsy->DoExtFuncL ( aTsyReqHandle, aIpc, aPackage );
+ break;
+ }
+ // Notifications
+ case ESatTerminalRsp:
+ case ESatNotifyCallControlRequest:
+ case ESatNotifyDisplayTextPCmd:
+ case ESatNotifyGetInkeyPCmd:
+ case ESatNotifyGetInputPCmd:
+ case ESatNotifyPlayTonePCmd:
+ case ESatNotifySetUpMenuPCmd:
+ case ESatNotifySelectItemPCmd:
+ case ESatNotifySendSmPCmd:
+ case ESatNotifySendSsPCmd:
+ case ESatNotifySendUssdPCmd:
+ case ESatNotifySetUpCallPCmd:
+ case ESatNotifyRefreshPCmd:
+ case ESatNotifyRefreshRequiredParam:
+ case ESatRefreshAllowed:
+ case ESatNotifySetUpEventListPCmd:
+ case ESatNotifySetUpIdleModeTextPCmd:
+ case ESatNotifySendDtmfPCmd:
+ case ESatNotifyLanguageNotificationPCmd:
+ case ESatNotifyLaunchBrowserPCmd:
+ case ESatNotifyLocalInfoPCmd:
+ case ESatNotifyProactiveSimSessionEnd:
+ case ESatNotifyOpenChannelPCmd:
+ case ESatNotifyGetChannelStatusPCmd:
+ case ESatNotifyCloseChannelPCmd:
+ case ESatNotifySendDataPCmd:
+ case ESatNotifyReceiveDataPCmd:
+ case ESatNotifySmsPpDownload:
+ case ESatNotifyCbDownload:
+ case ESatNotifyMoSmControlRequest:
+ {
+ iSatNotificationsTsy->DoExtFuncL ( aTsyReqHandle, aIpc, aPackage );
+ break;
+ }
+ // EventDownload
+ case ESatEventDownload:
+ {
+ ret = iSatEventDownloadTsy->DoExtFuncL ( aTsyReqHandle, aIpc,
+ aPackage );
+ break;
+ }
+ // Tsy internal requests
+ // Not supported
+ /*
+ case ESatGetMeSideSatProfile:
+ case ESatClientSatProfileIndication:
+ case ESatUsatClientReadyIndication:
+ case ESatGetProvisioningRefFile:
+ case ESatNotifyRefreshRequired:
+ // Notifications
+ case ESatNotifyPerformCardApduPCmd:
+ case ESatNotifyPowerOffCardPCmd:
+ case ESatNotifyPowerOnCardPCmd:
+ case ESatNotifyGetReaderStatusPCmd:
+ case ESatNotifyRunAtCommandPCmd:
+ case ESatNotifyPollingOff:
+ case ESatNotifyPollingInterval:
+ case ESatNotifyServiceSearchPCmd:
+ case ESatNotifyGetServiceInfoPCmd:
+ case ESatNotifyDeclareServicePCmd:
+ case ESatNotifyProactiveSimSessionStart:
+ case ESatNotifyTimerExpiration:
+ case ESatNotifyTimerMgmtPCmd:
+ case ESatNotifyTsyStateUpdated:
+ */
+
+ // Complete with KErrNotSupported, function not supported
+ default:
+ {
+ TFLOGSTRING2("CSAT: CSatTsy::DoExtFuncL unsupported IPC %d", aIpc);
+ ReqCompleted( aTsyReqHandle, KErrNotSupported );
+ break;
+ }
+ }
+
+ return ret;
+ }
+
+// -----------------------------------------------------------------------------
+// CSatTsy::MenuSelection
+// Passes a menu selection response to DOS
+// -----------------------------------------------------------------------------
+//
+TInt CSatTsy::MenuSelectionL
+ (
+ TTsyReqHandle aTsyReqHandle,
+ RSat::TMenuSelectionV1Pckg* aSelection
+ )
+ {
+ TFLOGSTRING("CSAT: CSatTsy::MenuSelection");
+ TInt ret( KErrNone );
+
+ // It should not be possible that the request is asked more than once at
+ // time, therefore we do not need to check whether it is already ongoing
+
+ RSat::TMenuSelectionV1& selectionV1 = ( *aSelection ) ();
+ TFLOGSTRING3("CSAT:MenuSelection, iItemId %x, Help: %c",
+ selectionV1.iItemId, selectionV1.iHelp );
+
+ TTlv tlvSpecificData;
+
+ tlvSpecificData.Begin( KBerTlvMenuSelectionTag );
+ tlvSpecificData.AddTag( KTlvDeviceIdentityTag );
+ tlvSpecificData.AddByte( KKeypad );
+ tlvSpecificData.AddByte( KSim );
+ tlvSpecificData.AddTag( KTlvItemIdentifierTag );
+ tlvSpecificData.AddByte( selectionV1.iItemId );
+
+ // If user has requested help, add tag.
+ if ( RSat::EHelpRequested == selectionV1.iHelp )
+ {
+ tlvSpecificData.AddTag( KTlvHelpRequestTag );
+ }
+
+ // Pack parameter for DOS call.
+ TPtrC8 berTlv = tlvSpecificData.End();
+ CSatDataPackage dataPackage;
+ dataPackage.PackData( &berTlv );
+
+ ret = iMessageManager->HandleRequestL( ESatMenuSelection, &dataPackage );
+
+ if ( KErrNone == ret )
+ {
+ // We must complete the request to the client right away, as an
+ // indication that the request has been handled
+ ReqCompleted( aTsyReqHandle, ret );
+ }
+
+ return ret;
+ }
+
+// -----------------------------------------------------------------------------
+// CSatTsy::SendMessageNoLogging
+// Called by ETel server, passes SMS message to MMSMS
+// -----------------------------------------------------------------------------
+//
+TInt CSatTsy::SendMessageNoLogging
+ (
+ TDes8* aMsg,
+ TTsyReqHandle aTsyReqHandle
+ )
+ {
+ TFLOGSTRING("CSAT: CSatTsy::SendMessageNoLogging");
+ TInt ret( KErrNone );
+
+ // Save the request handle
+ SaveReqHandle( aTsyReqHandle, ESatSendMessageNoLoggingReqType );
+
+ RSat::TSatSmsV1Pckg* aPckg = reinterpret_cast<RSat::TSatSmsV1Pckg*>(
+ aMsg );
+ RSat::TSatSmsV1& satSmsV1 = ( *aPckg ) ();
+
+ // SMS GSM extension checks that SCA length is not over the max limit
+ // that SMS allows
+
+ // Check that we have a SCA address
+ if ( 0x0 < satSmsV1.iServiceCenter.iTelNumber.Length() )
+ {
+ // SCA number conversion from unicode to GSM 3.40 format
+ // is done by MMSMS dll
+
+ // Set SCA pointer
+ TDes16* sca;
+ sca = &satSmsV1.iServiceCenter.iTelNumber;
+
+ // Type of Number, mapping from ETelSat format to MMETel format
+ RMobilePhone::TMobileTON numberType;
+
+ switch ( satSmsV1.iServiceCenter.iTypeOfNumber )
+ {
+ case RSat::ETypeOfNumberNotSet:
+ case RSat::EUnknownNumber:
+ {
+ numberType = RMobilePhone::EUnknownNumber;
+ break;
+ }
+ case RSat::EInternationalNumber:
+ {
+ numberType = RMobilePhone::EInternationalNumber;
+ break;
+ }
+ case RSat::ENationalNumber:
+ {
+ numberType = RMobilePhone::ENationalNumber;
+ break;
+ }
+ case RSat::ENetworkSpecificNumber:
+ {
+ numberType = RMobilePhone::ENetworkSpecificNumber;
+ break;
+ }
+ case RSat::EDedicatedNumber:
+ {
+ numberType = RMobilePhone::ESubscriberNumber;
+ break;
+ }
+ default:
+ {
+ // Unknown or invalid Type of Number
+ numberType = RMobilePhone::EUnknownNumber;
+ break;
+ }
+ }
+
+ // Numbering Plan, mapping from ETelSat format to MMETel format
+ RMobilePhone::TMobileNPI numberPlan;
+ switch ( satSmsV1.iServiceCenter.iNumberPlan )
+ {
+ case RSat::ENumberingPlanNotSet:
+ case RSat::EUnknownNumberingPlan:
+ {
+ numberPlan = RMobilePhone::EUnknownNumberingPlan;
+ break;
+ }
+ case RSat::EIsdnNumberPlan:
+ {
+ numberPlan = RMobilePhone::EIsdnNumberPlan;
+ break;
+ }
+ case RSat::EDataNumberPlan:
+ {
+ numberPlan = RMobilePhone::EDataNumberPlan;
+ break;
+ }
+ case RSat::ETelexNumberPlan:
+ {
+ numberPlan = RMobilePhone::ETelexNumberPlan;
+ break;
+ }
+ case RSat::ENationalNumberPlan:
+ {
+ numberPlan = RMobilePhone::ENationalNumberPlan;
+ break;
+ }
+ case RSat::EPrivateNumberPlan:
+ {
+ numberPlan = RMobilePhone::EPrivateNumberPlan;
+ break;
+ }
+ default:
+ {
+ // Unknown or invalid Numbering Plan
+ numberPlan = RMobilePhone::EUnknownNumberingPlan;
+ break;
+ }
+ }
+
+ // SMS message, Packet Data Unit
+ TDes8* pdu;
+ pdu = &satSmsV1.iBuf;
+
+ // Call SMS sending function from MMSMS
+ ret = iSatService.SendSatMessage( *this, pdu, sca, &numberType,
+ &numberPlan, EFalse, aTsyReqHandle );
+ TFLOGSTRING2("CSAT: CSatTsy::SendMessageNoLogging, \
+ SendSmsMessage done, ret: %x", ret);
+
+
+ }
+ else // SCA missing
+ {
+ ret = KErrGeneral;
+ TFLOGSTRING("CSAT: CSatTsy::SendMessageNoLogging, SCA missing");
+ }
+
+ // Failure in sending of SAT SMS, call complete method
+ if ( KErrNone != ret )
+ {
+ CompleteSendSmsMessage( ret );
+ TFLOGSTRING("CSAT: CSatTsy::SendMessageNoLogging, \
+ failure sending SAT SMS, complete");
+ }
+
+ return KErrNone;
+
+ }
+
+MmMessageManagerCallback* CSatTsy::GetMessageManagerCallback()
+{
+ return iMessageManager->GetMessageManagerCallback();
+}
+
+
+// End of File