--- a/telephonyserverplugins/common_tsy/commontsy/src/mmsms/cmmsmstsy.cpp Mon May 03 13:37:20 2010 +0300
+++ b/telephonyserverplugins/common_tsy/commontsy/src/mmsms/cmmsmstsy.cpp Thu May 06 15:10:38 2010 +0100
@@ -1,3246 +1,3246 @@
-// 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 "cmmsmstsy.h"
-#include "cmmphonetsy.h"
-#include "cmmsmsstoragetsy.h"
-#include "cmmsmsgsmext.h"
-#include "cmmtsyreqhandlestore.h"
-#include <ctsy/serviceapi/mmtsy_ipcdefs.h>
-#include "MmTsy_numberOfSlots.h"
-#include <ctsy/serviceapi/cmmsmsutility.h>
-#include "cmmsmssendrequest.h"
-#include <ctsy/serviceapi/mstktsysatservice.h>
-#include "CMmCommonStaticUtility.h"
-#include <ctsy/serviceapi/gsmerror.h>
-#include <ctsy/pluginapi/cmmdatapackage.h>
-#include <etelsat.h> // for Sat MO SM Control error values
-
-
-// ======== MEMBER FUNCTIONS ========
-
-CMmSmsTsy::CMmSmsTsy():
- iReqHandleType(EMultimodeSmsReqHandleUnknown)
- {
-TFLOGSTRING("TSY: CMmSmsTsy::CMmSmsTsy: constructor");
- }
-
-void CMmSmsTsy::ConstructL()
- {
-TFLOGSTRING("TSY: CMmSmsTsy::ConstructL");
-#ifdef REQHANDLE_TIMER
- //create req handle store
- iTsyReqHandleStore = CMmTsyReqHandleStore::NewL( this, iMmPhone,
- EMultimodeSmsMaxNumOfRequests, iSmsReqHandles );
-#else
- // create req handle store
- iTsyReqHandleStore = CMmTsyReqHandleStore::NewL(
- EMultimodeSmsMaxNumOfRequests, iSmsReqHandles );
-#endif // REQHANDLE_TIMER
-
- // Reset all CMmSmsTsy variables
- ResetVariables();
-
- // SMS message array
- iSmsMsgArray = new ( ELeave ) CArrayPtrFlat<TSmsMsg>( 1 );
-
- // Create GSM mode SMS extension
- iMmSmsExtInterface = CMmSmsGsmExt::NewL();
-
-
- // register sms tsy in the message manager
- iMmPhone->MessageManager()->RegisterTsyObject(
- CMmMessageManagerBase::ESmsMessagingTsy, this );
-
- // at startup, there is no pending Send request
- iSmsSendReq = NULL;
-
- // Initialise off-line/on-line mode variable with information
- // from PhoneTsy. After object construction, this information
- // will be updated using DOS indications.
- TRfStateInfo phoneRfInfo = iMmPhone->GetRfStateInfo();
- if ( ERfsStateInfoInactive == phoneRfInfo )
- {
- iIsOffline = ETrue;
- }
- else
- {
- iIsOffline = EFalse;
- }
-TFLOGSTRING2("TSY: CMmSmsTsy::ConstructL: iIsOffline has been initialised to %d", iIsOffline);
-
- // there's no pending ResumeSmsReception request at startup
- iResumeSmsReceptionPending = EFalse;
-
- // Initialization for sms NoFdnCheck
- iSmsNoFdnCheckFlag = ESmsNoFdnCheckUnknown;
-
- iExpectAckOrNack = 0;
-
- }
-
-CMmSmsTsy* CMmSmsTsy::NewL(
- CMmPhoneTsy* aMmPhone )
- {
- CMmSmsTsy* aMmSmsTsy = new ( ELeave ) CMmSmsTsy();
- CleanupClosePushL(*aMmSmsTsy);
- aMmSmsTsy->iMmPhone = aMmPhone;
- aMmSmsTsy->ConstructL();
- CleanupStack::Pop();
-
- return aMmSmsTsy;
- }
-
-CMmSmsTsy::~CMmSmsTsy()
- {
-TFLOGSTRING("TSY: CMmSmsTsy::~CMmSmsTsy");
- if ( iMmPhone )
- {
- // deregister tsy object from message manager
- iMmPhone->MessageManager()->DeregisterTsyObject(this);
-
- // Release the SMS routing from DOS to TSY.
- // Send request to the Domestic OS layer. Ignore if it leaves
- TInt trapError = KErrNone;
- TRAP( trapError, iMmPhone->MessageManager()->HandleRequestL(
- EMmTsyDeactivateSmsRouting ); );
- }
-
- // try to complete send sms message.
- if ( iTsySatMessaging )
- {
- iTsySatMessaging->CompleteSendSmsMessage( KErrAccessDenied );
- }
-
- if ( iTsyReqHandleStore )
- {
- delete iTsyReqHandleStore;
- iTsyReqHandleStore = NULL;
- }
-
- if ( iSmsMsgArray )
- {
- iSmsMsgArray->ResetAndDestroy();
- delete iSmsMsgArray;
- iSmsMsgArray = NULL;
- }
-
- // Delete extension object
- if ( iMmSmsExtInterface )
- {
- delete iMmSmsExtInterface;
- iMmSmsExtInterface = NULL;
- }
-
- if ( iMmPhone )
- {
- iMmPhone->SetSmsSession( NULL );
- iMmPhone = NULL;
- }
-
- if ( iSmsSendReq )
- {
- delete iSmsSendReq;
- iSmsSendReq = NULL;
- }
-
- if ( iSMSPClientId )
- {
- delete iSMSPClientId;
- iSMSPClientId = NULL;
- }
-
- // set pointers to NULL
- iMmSmsStorageTsy = NULL;
- iTsySatMessaging = NULL;
- iNotifyReceiveModeChangePtr = NULL;
- iReceiveMessageParamsPtr = NULL;
- iReceiveMessagePduPtr = NULL;
- iNotifySmsBearerPtr = NULL;
- iSendMessageMsgAttrPckgPtr = NULL;
- iGetMessageStoreInfoPtr = NULL;
- iStoreSmspBufferPtr = NULL;
- }
-
-// ---------------------------------------------------------------------------
-// CMmSmsTsy::Init
-// Initialisation method that is called from ETel Server
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-void CMmSmsTsy::Init()
- {
- }
-
-// ---------------------------------------------------------------------------
-// CMmSmsTsy::OpenNewObjectByNameL
-// Creates new object and returns a pointer to it
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-CTelObject* CMmSmsTsy::OpenNewObjectByNameL(
- const TDesC& aName )
- {
- if ( aName.Compare( KETelIccSmsStore ) == KErrNone )
- {
- iMmSmsStorageTsy = CMmSmsStorageTsy::NewL( this, iMmPhone,
- iMmSmsExtInterface, iTsyReqHandleStore );
-
- return iMmSmsStorageTsy;
- }
-
- // ME memory (KETelMeSmsStore) and combined memory (KETelCombinedSmsStore)
- // are not supported
- User::Leave( KErrNotSupported );
- //lint -e{527} "unreachable code"
-
- return NULL;
- }
-
-// ---------------------------------------------------------------------------
-// CMmSmsTsy::OpenNewObjectL
-// Creates new object and returns a pointer to it
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-CTelObject* CMmSmsTsy::OpenNewObjectL(
- TDes& /*aNewName*/ )
- {
- // Not supported
- User::Leave( KErrNotSupported );
- //lint -e{527} "unreachable code"
-
- return NULL;
- }
-
-// ---------------------------------------------------------------------------
-// CMmSmsTsy::ExtFunc
-// ExtFunc is called by the server when it has a "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 CMmSmsTsy::ExtFunc(
- const TTsyReqHandle aTsyReqHandle,
- const TInt aIpc,
- const TDataPackage& aPackage )
- {
- TAny* dataPtr = aPackage.Ptr1();
- TInt ret( 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 );
- TInt error = CMmCommonStaticUtility::EpocErrorCode( KErrGeneral,
- KErrGsmOfflineOpNotAllowed );
-
- // Complete the request with appropiate error
- ReqCompleted ( aTsyReqHandle, error );
- }
- else
- {
- switch ( aIpc )
- {
- // SMS messaging requests that doesn't need trapping
- case EMobileSmsMessagingGetCaps:
- ret = GetCaps( aTsyReqHandle, aPackage.Des1n() );
- break;
- case EMobileSmsMessagingGetReceiveMode:
- ret = GetReceiveMode( aTsyReqHandle, reinterpret_cast<
- RMobileSmsMessaging::TMobileSmsReceiveMode* >( dataPtr ) );
- break;
- case EMobileSmsMessagingGetMoSmsBearer:
- ret = GetMoSmsBearer( aTsyReqHandle, reinterpret_cast<
- RMobileSmsMessaging::TMobileSmsBearer* >( dataPtr) );
- break;
- case EMobileSmsMessagingSetMoSmsBearer:
- ret = SetMoSmsBearer( aTsyReqHandle, reinterpret_cast<
- RMobileSmsMessaging::TMobileSmsBearer*>( dataPtr) );
- break;
- case EMobileSmsMessagingEnumerateMessageStores:
- ret = EnumerateMessageStores( aTsyReqHandle,
- reinterpret_cast< TInt* >( dataPtr ) );
- break;
- case EMobileSmsMessagingGetSmspListPhase2:
- ret = ReadSmspListPhase2( aTsyReqHandle, reinterpret_cast<
- RMobilePhone::TClientId*>( dataPtr ), aPackage.Des2n() );
- break;
- // SMS messaging requests that need trapping
- default:
- // Ensure the ReqHandleType is unset.
- // This will detect cases where this method indirectly calls itself
- // (e.g. servicing a client call that causes a self-reposting notification to complete and thus repost).
- // Such cases are not supported because iReqHandleType is in the context of this class instance,
- // not this request, and we don't want the values set by the inner request and the outer request
- // interfering with each other.
- __ASSERT_DEBUG(iReqHandleType==EMultimodeSmsReqHandleUnknown, User::Invariant());
-
- TInt leaveCode( KErrNone );
- TRAP( leaveCode, ret = DoExtFuncL( aTsyReqHandle, aIpc,
- aPackage ); );
-
- if ( KErrNone != leaveCode )
- {
-TFLOGSTRING3("CMmSmsTsy: Leave trapped!, IPC=%d, error value:%d", aIpc, leaveCode );
- ReqCompleted( aTsyReqHandle, leaveCode );
- }
-
- //save request handle
- if ( EMultimodeSmsReqHandleUnknown != iReqHandleType )
- {
-#ifdef REQHANDLE_TIMER
- SetTypeOfResponse( iReqHandleType, aTsyReqHandle );
-#else
- //Never comes here. See SetTypeOfResponse.
- iTsyReqHandleStore->SetTsyReqHandle( iReqHandleType,
- aTsyReqHandle );
-#endif // REQHANDLE_TIMER
- // We've finished with this value now. Clear it so it doesn't leak
- // up to any other instances of this method down the call stack
- iReqHandleType = EMultimodeSmsReqHandleUnknown;
- }
- break;
- }
- }
-
- return ret;
- }
-
-// ---------------------------------------------------------------------------
-// CMmSmsTsy::DoExtFuncL
-// DoExtFuncL calls messaging methods that can leave
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-TInt CMmSmsTsy::DoExtFuncL(
- const TTsyReqHandle aTsyReqHandle,
- const TInt aIpc,
- const TDataPackage& aPackage )
- {
- TAny* dataPtr = aPackage.Ptr1();
- TAny* dataPtr2 = aPackage.Ptr2();
-
- TInt ret( KErrNone );
-
- switch ( aIpc )
- {
- // SMS messaging requests
- case EMobileSmsMessagingSetReceiveMode:
- ret = SetReceiveMode( aTsyReqHandle, reinterpret_cast<
- RMobileSmsMessaging::TMobileSmsReceiveMode* >( dataPtr ) );
- break;
- case EMobileSmsMessagingNotifyReceiveModeChange:
- ret = NotifyReceiveModeChange( reinterpret_cast<
- RMobileSmsMessaging::TMobileSmsReceiveMode*>( dataPtr) );
- break;
- case EMobileSmsMessagingReceiveMessage:
- ret = ReceiveMessageL( aTsyReqHandle, aPackage.Des1n(),
- aPackage.Des2n() );
- break;
- case EMobileSmsMessagingAckSmsStored:
- ret = AckSmsStoredL( aTsyReqHandle, aPackage.Des1n(),
- reinterpret_cast< TBool* >( dataPtr2 ) );
- break;
- case EMobileSmsMessagingNackSmsStored:
- ret = NackSmsStoredL( aTsyReqHandle, aPackage.Des1n(),
- reinterpret_cast< TInt* >( dataPtr2 ) );
- break;
- case EMobileSmsMessagingResumeSmsReception:
- ret = ResumeSmsReceptionL( aTsyReqHandle );
- break;
- case EMobileSmsMessagingNotifyMoSmsBearerChange:
- ret = NotifyMoSmsBearerChange( reinterpret_cast<
- RMobileSmsMessaging::TMobileSmsBearer*> ( dataPtr ) );
- break;
- case EMobileSmsMessagingSendMessage:
- {
- iSmsNoFdnCheckFlag = ESmsNoFdnCheckNotUsed;
- ret = SendMessageL( aTsyReqHandle, aPackage.Des1n(),
- aPackage.Des2n() );
- }
- break;
- case EMobileSmsMessagingSendMessageNoFdnCheck:
- {
- iSmsNoFdnCheckFlag = ESmsNoFdnCheckUsed;
- ret = SendMessageL( aTsyReqHandle, aPackage.Des1n(),
- aPackage.Des2n() );
- }
- break;
- case EMobileSmsMessagingGetMessageStoreInfo:
- ret = GetMessageStoreInfoL( aTsyReqHandle,
- reinterpret_cast< TInt* >( dataPtr ), aPackage.Des2n() );
- break;
- case EMobileSmsMessagingGetSmspListPhase1:
- ret = ReadSmspListPhase1L( aTsyReqHandle,
- reinterpret_cast< RMobilePhone::TClientId*>( dataPtr ),
- reinterpret_cast< TInt* >( dataPtr2 ) );
- break;
- case EMobileSmsMessagingNotifySmspListChange:
- ret = NotifySmspListChange();
- break;
- case EMobileSmsMessagingStoreSmspList:
- ret = StoreSmspList( aTsyReqHandle, aPackage.Des1n() );
- break;
- default:
- ret = KErrNotSupported;
- break;
- }
-
- return ret;
- }
-
-// ---------------------------------------------------------------------------
-// CMmSmsTsy::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
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-CTelObject::TReqMode CMmSmsTsy::ReqModeL(
- const TInt aIpc )
- {
- CTelObject::TReqMode ret = 0;
- switch ( aIpc )
- {
- // Non-flow Controlled Services
- case EMobileSmsMessagingGetCaps:
- case EMobileSmsMessagingGetMoSmsBearer:
- case EMobileSmsMessagingSetMoSmsBearer:
- case EMobileSmsMessagingGetReceiveMode:
- case EMobileSmsMessagingEnumerateMessageStores:
- case EMobileSmsMessagingGetSmspListPhase2:
- case EMobileSmsMessagingAckSmsStored:
- case EMobileSmsMessagingNackSmsStored:
- case EMobileSmsMessagingSendMessage:
- case EMobileSmsMessagingSendMessageNoFdnCheck:
- case EMobileSmsMessagingResumeSmsReception:
- case EMobileSmsMessagingGetMessageStoreInfo:
- case EMobileSmsMessagingGetSmspListPhase1:
- case EMobileSmsMessagingStoreSmspList:
- case EMobileSmsMessagingSetReceiveMode:
- break;
- // Immediate Server Repost - but not multiple completion enabled
- case EMobileSmsMessagingReceiveMessage:
- ret = KReqModeRePostImmediately;
- break;
- // Multiple Completion Services with Immediate Server Repost
- case EMobileSmsMessagingNotifyReceiveModeChange:
- case EMobileSmsMessagingNotifyMoSmsBearerChange:
- case EMobileSmsMessagingNotifySmspListChange:
- ret = KReqModeMultipleCompletionEnabled |
- KReqModeRePostImmediately;
- break;
- default:
- User::Leave( KErrNotSupported );
- break;
- }
-
- return ret;
- }
-
-//----------------------------------------------------------------------------
-// CMmSmsTsy::NumberOfSlotsL
-// When the ETel server discovers that a request is "repost
-// immediately" it will ask the TSY how big a buffer it wants.
-// NumberOfSlotsL Returns number of slots to be used for given requests
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-TInt CMmSmsTsy::NumberOfSlotsL(
- const TInt aIpc )
- {
- TInt numberOfSlots = 1;
- switch ( aIpc )
- {
- case EMobileSmsMessagingReceiveMessage:
- numberOfSlots = KMmSmsMessagingReceiveMessageSlots;
- break;
- // It is safer that normal notification trigger value is three
- // => Slotlimits are defined according to the requirements of
- // environment, five for messagereception and three for normal
- // notifications
- case EMobileSmsMessagingNotifyReceiveModeChange:
- numberOfSlots = KMmSmsMessagingNotifyReceiveModeChangeSlots;
- break;
- case EMobileSmsMessagingNotifyMoSmsBearerChange:
- numberOfSlots = KMmSmsMessagingNotifyMoSmsBearerChangeSlots;
- break;
- case EMobileSmsMessagingNotifySmspListChange:
- numberOfSlots = KMmSmsMessagingNotifySmspListChangeSlots;
- break;
- default:
- User::Leave( KErrNotSupported );
- break;
- }
-
- return numberOfSlots;
- }
-
-//----------------------------------------------------------------------------
-// CMmSmsTsy::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 on
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-TInt CMmSmsTsy::CancelService(
- const TInt aIpc,
- const TTsyReqHandle aTsyReqHandle )
- {
- TInt ret( KErrNone );
-
- switch ( aIpc )
- {
- case EMobileSmsMessagingSetReceiveMode:
- ret = SetReceiveModeCancel( aTsyReqHandle );
- break;
- case EMobileSmsMessagingNotifyReceiveModeChange:
- ret = NotifyReceiveModeChangeCancel( aTsyReqHandle );
- break;
- case EMobileSmsMessagingSetMoSmsBearer:
- ret = SetMoSmsBearerCancel( aTsyReqHandle );
- break;
- case EMobileSmsMessagingNotifyMoSmsBearerChange:
- ret = NotifyMoSmsBearerChangeCancel( aTsyReqHandle );
- break;
- case EMobileSmsMessagingGetMessageStoreInfo:
- ret = GetMessageStoreInfoCancel( aTsyReqHandle );
- break;
- case EMobileSmsMessagingGetSmspListPhase1:
- case EMobileSmsMessagingGetSmspListPhase2:
- ret = ReadAllSmspCancel( aTsyReqHandle );
- break;
- case EMobileSmsMessagingNotifySmspListChange:
- ret = NotifySmspListChangeCancel( aTsyReqHandle );
- break;
- case EMobileSmsMessagingSendMessage:
- case EMobileSmsMessagingAckSmsStored:
- case EMobileSmsMessagingNackSmsStored:
- case EMobileSmsMessagingResumeSmsReception:
- case EMobileSmsMessagingStoreSmspList:
- break;
- case EMobileSmsMessagingReceiveMessage:
- ret = ReceiveMessageCancel( aTsyReqHandle );
- break;
- case EMobileSmsMessagingSendMessageNoFdnCheck:
- ret = SendMessageNoFdnCheckCancel( aTsyReqHandle );
- break;
- default:
- ret = KErrGeneral;
- break;
- }
-
- return ret;
- }
-
-//----------------------------------------------------------------------------
-// CMmSmsTsy::RegisterNotification
-// 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 CMmSmsTsy::RegisterNotification(
- const TInt aIpc )
- {
- TInt ret( KErrNotSupported );
-
- switch ( aIpc )
- {
- case EMobileSmsMessagingReceiveMessage:
- case EMobileSmsMessagingNotifyReceiveModeChange:
- case EMobileSmsMessagingNotifyMoSmsBearerChange:
- case EMobileSmsMessagingNotifySmspListChange:
- ret = KErrNone;
- break;
- default:
- ret = KErrNotSupported;
- }
-
- return ret;
- }
-
-//----------------------------------------------------------------------------
-// CMmSmsTsy::DeregisterNotification
-// 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 the DOS
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-TInt CMmSmsTsy::DeregisterNotification(
- const TInt aIpc )
- {
- TInt ret( KErrNotSupported );
-
- switch ( aIpc )
- {
- case EMobileSmsMessagingReceiveMessage:
- case EMobileSmsMessagingNotifyReceiveModeChange:
- case EMobileSmsMessagingNotifyMoSmsBearerChange:
- case EMobileSmsMessagingNotifySmspListChange:
- ret = KErrNone;
- break;
- default:
- ret = KErrNotSupported;
- }
-
- return ret;
- }
-
-//----------------------------------------------------------------------------
-// CMmSmsTsy::GetCaps
-// This method returns SMS messaging capabilities of the phone
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-TInt CMmSmsTsy::GetCaps(
- const TTsyReqHandle aTsyReqHandle,
- TDes8* aCaps )
- {
- if(sizeof(RMobileSmsMessaging::TMobileSmsCapsV1) > aCaps->Size())
- {
- return KErrArgument;
- }
-
- RMobileSmsMessaging::TMobileSmsCapsV1Pckg* smsCapsPckg =
- reinterpret_cast< RMobileSmsMessaging::TMobileSmsCapsV1Pckg* >( aCaps );
- RMobileSmsMessaging::TMobileSmsCapsV1& smsCaps = ( *smsCapsPckg )();
-
- // Capabilities depend on the TSY implementation.
- smsCaps.iSmsMode = KSmsGsmModeCaps;
- smsCaps.iSmsControl = KSmsControlCaps;
-
- ReqCompleted( aTsyReqHandle, KErrNone );
-
- return KErrNone;
- }
-
-//----------------------------------------------------------------------------
-// CMmSmsTsy::GetReceiveMode
-// This method retrieves the current setting of the TSY-phone
-// incoming SMS receive mode
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-TInt CMmSmsTsy::GetReceiveMode(
- const TTsyReqHandle aTsyReqHandle,
- RMobileSmsMessaging::TMobileSmsReceiveMode* aReceiveMode )
- {
- *aReceiveMode = iMobileSmsReceiveMode;
-
- ReqCompleted( aTsyReqHandle, KErrNone );
-
- return KErrNone;
- }
-
-//----------------------------------------------------------------------------
-// CMmSmsTsy::SetReceiveMode
-// This method sets the setting of the TSY-phone incoming SMS receive mode
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-TInt CMmSmsTsy::SetReceiveMode(
- const TTsyReqHandle aTsyReqHandle,
- RMobileSmsMessaging::TMobileSmsReceiveMode const* aReceiveMode )
- {
- if ( RMobileSmsMessaging::EReceiveUnstoredClientAck == *aReceiveMode )
- {
- iMobileSmsReceiveMode = *aReceiveMode;
-
- CompleteNotifyReceiveModeChange();
-
- ReqCompleted( aTsyReqHandle, KErrNone );
- }
- else
- {
- // EReceiveModeUnspecified, EReceiveStored, EReceiveUnstoredPhoneAck &
- // EReceiveAny modes not supported because of CS functionality.
- ReqCompleted( aTsyReqHandle, KErrNotSupported );
- }
-
- return KErrNone;
- }
-
-//----------------------------------------------------------------------------
-// CMmSmsTsy::SetReceiveModeCancel
-// This method is used to cancel the outstanding asynchronous
-// SetReceiveMode request
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-TInt CMmSmsTsy::SetReceiveModeCancel(
- const TTsyReqHandle aTsyReqHandle )
- {
- ReqCompleted( aTsyReqHandle, KErrCancel );
-
- return KErrNone;
- }
-
-//----------------------------------------------------------------------------
-// CMmSmsTsy::NotifyReceiveModeChange
-// This method is used to notify the client if there is a
-// change to the receive mode setting
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-TInt CMmSmsTsy::NotifyReceiveModeChange(
- RMobileSmsMessaging::TMobileSmsReceiveMode* aReceiveMode )
- {
- iReqHandleType = EMultimodeSmsNotifyReceiveModeChange;
- iNotifyReceiveModeChangePtr = aReceiveMode;
-
- return KErrNone;
- }
-
-//----------------------------------------------------------------------------
-// CMmSmsTsy::NotifyReceiveModeChangeCancel
-// This method cancel notify receive mode change request
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-TInt CMmSmsTsy::NotifyReceiveModeChangeCancel(
- const TTsyReqHandle aTsyReqHandle )
- {
- iTsyReqHandleStore->ResetTsyReqHandle(
- EMultimodeSmsNotifyReceiveModeChange );
- ReqCompleted( aTsyReqHandle, KErrCancel );
- iNotifyReceiveModeChangePtr = NULL;
-
- return KErrNone;
- }
-
-//----------------------------------------------------------------------------
-// CMmSmsTsy::CompleteNotifyReceiveModeChange
-// This method completes notify receive mode change request
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-void CMmSmsTsy::CompleteNotifyReceiveModeChange()
- {
- TTsyReqHandle reqHandle = iTsyReqHandleStore->ResetTsyReqHandle(
- EMultimodeSmsNotifyReceiveModeChange );
-
- if ( reqHandle )
- {
- if ( iNotifyReceiveModeChangePtr )
- {
- *iNotifyReceiveModeChangePtr = iMobileSmsReceiveMode;
- }
- ReqCompleted( reqHandle, KErrNone );
- }
- }
-
-//----------------------------------------------------------------------------
-// CMmSmsTsy::ReceiveMessageL
-// This method starts the reception of incoming unstored SMS
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-TInt CMmSmsTsy::ReceiveMessageL(
- const TTsyReqHandle aTsyReqHandle,
- TDes8* aMsgData,
- TDes8* aMsgAttributes )
- {
-TFLOGSTRING("TSY: CMmSmsTsy::ReceiveMessageL\n");
-
- if(sizeof(RMobileSmsMessaging::TMobileSmsReceiveAttributesV1) > aMsgAttributes->Size())
- {
- return KErrArgument;
- }
-
- iReceiveMessagePduPtr = aMsgData;
- iReceiveMessageParamsPtr = aMsgAttributes;
-
- if ( iMmPhone->IsModemStatusReady() )
- {
- // activate smsrouting only when modem status is ready
- ActivateSmsRoutingL();
- }
-
- // Store request handle here. DeliverClass2ToSmsStack-method may complete
- // ReceiveMessage request
-#ifdef REQHANDLE_TIMER
- SetTypeOfResponse( EMultimodeSmsReceiveMessage, aTsyReqHandle );
-#else
- iTsyReqHandleStore->SetTsyReqHandle(
- EMultimodeSmsReceiveMessage, aTsyReqHandle );
-#endif // REQHANDLE_TIMER
-
- // Check if there is class 2 messages waiting in TSY's internal memory.
- DeliverClass2ToSmsStack();
-
- return KErrNone;
- }
-
-//----------------------------------------------------------------------------
-// CMmSmsTsy::ReceiveMessageCancel
-// This method cancels an MT message routing to the SMS
-// stack. TSY can not stop routing from SMS server because
-// otherwise SMS server routes incoming messages to SIM server.
-// Negative acknowledgement is sent to the network if message
-// comes when SMS stack routing is not activated
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-TInt CMmSmsTsy::ReceiveMessageCancel(
- const TTsyReqHandle aTsyReqHandle )
- {
- iTsyReqHandleStore->ResetTsyReqHandle( EMultimodeSmsReceiveMessage );
-
- ReqCompleted( aTsyReqHandle, KErrCancel );
-
- return KErrNone;
- }
-
-//----------------------------------------------------------------------------
-// CMmSmsTsy::ActivateSmsRoutingL
-// Activate SMS routing
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-void CMmSmsTsy::ActivateSmsRoutingL()
- {
- if ( ( ERoutingNotActivated == iServerRoutingActivity ) ||
- ( ERoutingActivating == iServerRoutingActivity ) )
- {
- //Send request to the Domestic OS layer..
- User::LeaveIfError( iMmPhone->MessageManager()->HandleRequestL(
- EMmTsyActivateSmsRouting ) );
- iServerRoutingActivity = ERoutingActivating;
- }
- }
-
-//----------------------------------------------------------------------------
-// CMmSmsTsy::CompleteActivateSmsRouting
-// This method completes Activation of SMS routing
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-void CMmSmsTsy::CompleteActivateSmsRouting(
- TInt aError,
- CMmDataPackage* aDataPackage )
- {
- TUint8 aSmsRoutingStatus ( 0 );
- aDataPackage->UnPackData( aSmsRoutingStatus ) ;
-
- if ( ( KErrNone == aError ) &&
- ( KSmsRoutingActivated == aSmsRoutingStatus ) )
- {
-TFLOGSTRING("TSY: CMmSmsTsy::CompleteActivateSmsRouting SMS routing activated");
- iServerRoutingActivity = ERoutingActivated;
- }
- else if ( ( KErrNone == aError ) &&
- ( KSmsRoutingDeactivated == aSmsRoutingStatus ) )
- {
-TFLOGSTRING("TSY: CMmSmsTsy::CompleteActivateSmsRouting SMS routing not activated");
- iServerRoutingActivity = ERoutingNotActivated;
- }
- else
- {
-TFLOGSTRING("TSY: CMmSmsTsy::CompleteActivateSmsRouting SMS routing activation failed");
- iServerRoutingActivity = ERoutingNotActivated;
-
- TTsyReqHandle reqHandle = iTsyReqHandleStore->ResetTsyReqHandle(
- EMultimodeSmsReceiveMessage );
-
- if ( reqHandle )
- {
- ReqCompleted( reqHandle, aError );
- }
- }
- }
-
-//----------------------------------------------------------------------------
-// CMmSmsTsy::CompleteReceiveMessage
-// This method completes reception of incoming unstored SMS
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-void CMmSmsTsy::CompleteReceiveMessage(
- TInt aError,
- CMmDataPackage* aDataPackage )
- {
- TInt ret( KErrNone );
- TBool smsInd( EFalse );
- TSmsMsg* smsMsg;
-
- TTsyReqHandle reqHandle = iTsyReqHandleStore->GetTsyReqHandle(
- EMultimodeSmsReceiveMessage );
-
-TFLOGSTRING2("TSY: CMmSmsTsy::CompleteReceiveMessage. iClientStorageFull: %d", iClientStorageFull );
-
- // SMS successfully received
- if ( KErrNone == aError )
- {
- //unpack received data
- aDataPackage->UnPackData( smsInd, smsMsg );
-
- // is the SMS a class2 SMS or not.
- TBool smsClass2 = smsMsg->iSmsClass2;
-
- // if store is not full, receive new class2 message and get
- // notification
- if ( smsClass2 && ( 0 != smsMsg->iLocation ) && iMmSmsStorageTsy )
- {
-TFLOGSTRING("TSY: CMmSmsTsy::CompleteReceiveMessage. CompleteNotifyStoreEvent happens");
- iMmSmsStorageTsy->CMmSmsStorageTsy::CompleteNotifyStoreEvent(
- smsMsg->iLocation, RMobilePhoneStore::KStoreEntryAdded );
- }
-
- // if SMS is a Class2 and SMS Memories are full and SIM SMS Memory
- // not full
- if ( iClientStorageFull && smsClass2 )
- {
- if ( reqHandle )
- {
- // Store SMS in TSY's internal memory
- TRAP( ret, StoreClass2MessageL( smsMsg ) );
-
- // Message is not delivered to SMS Stack.Deliver message to
- // SMS. Stack after SMS Stack has called ReceiveMessage..
- smsMsg->iDeleteAfterClientAck = EFalse;
-
-#ifdef USING_CTSY_DISPATCHER
- CMmDataPackage package;
- TDesC8* msgData = NULL;
- package.PackData( &msgData );
-
- // ignore if Acking fails
- TRAP_IGNORE(
- ret = iMmPhone->MessageManager()->HandleRequestL(EMobileSmsMessagingAckSmsStored, &package);
- );
- iTsyReqHandleStore->ResetTsyReqHandle(EMultimodeSmsReceiveMessage);
- ReqCompleted(reqHandle, aError);
-#else
- // ignore if Acking fails
- TRAP_IGNORE(
- ret = iMmPhone->MessageManager()->HandleRequestL(
- EMobileSmsMessagingAckSmsStored );
- );
-#endif //USING_CTSY_DISPATCHER
- }
- else
- {
- // Routing is activated, but SMS stack hasn't called
- // ReceiveMessage. Nack received message internally with cause
- // value "protocol error", otherwise SMS server releases
- // routings.
- CMmDataPackage package;
- TSmsMsg* nullSms = NULL;
- TInt rpCause( KErrGsmSMSMemoryCapacityExceeded );
- package.PackData( &nullSms, &rpCause );
-
- // ignore if Nacking fails
- TRAP_IGNORE(
- ret = iMmPhone->MessageManager()->HandleRequestL(
- EMobileSmsMessagingNackSmsStored, &package );
- );
- }
- }
- else
- {
- // Class 0 or Class 1 or Class 2 message received.
- // This message has to be acknowledged to the network
- TInt rpError( KErrNone );
-
- if ( reqHandle && !iClientStorageFull )
- {
- // Deliver message to SMS stack
- if(smsMsg->iSmsMsg.Length() > iReceiveMessagePduPtr->MaxLength())
- {
- ret = KErrArgument;
- }
- else
- {
- ret = iMmSmsExtInterface->CompleteReceiveMessage( smsMsg,
- iReceiveMessageParamsPtr, iReceiveMessagePduPtr );
- }
-
- iTsyReqHandleStore->ResetTsyReqHandle(
- EMultimodeSmsReceiveMessage );
-
-TFLOGSTRING("TSY: CMmSmsTsy::CompleteReceiveMessage. Deliver SMS to the SMS stack");
- ReqCompleted( reqHandle, ret );
-
- // increase the count of expected acknowledgements
- if(ret == KErrNone)
- {
- iExpectAckOrNack++;
- }
- }
- else
- {
- // Routing is activated, but SMS stack hasn't called
- // ReceiveMessage. Nack received message internally with cause
- // value "protocol error", otherwise SMS server releases
- // routings.
- if (iClientStorageFull)
- {
- // SMS stack's memory is full. Nack message with error
- // MemoryExceeded
- rpError = KErrGsmSMSMemoryCapacityExceeded;
- }
- else
- {
- rpError = KErrGsmSMSUnspecifiedProtocolError;
- }
- }
-
- if ( KErrNone != rpError )
- {
- CMmDataPackage package;
- TSmsMsg* nullSms = NULL;
- package.PackData( &nullSms, &rpError );
-
- // ignore if Nacking fails
- TRAP_IGNORE(
- ret = iMmPhone->MessageManager()->HandleRequestL(
- EMobileSmsMessagingNackSmsStored, &package );
- );
- }
- }
-
- // end of successful SMS reception
- }
- // error in SMS reception
- else
- {
- //unpack received data - only one parameter information is needed
- aDataPackage->UnPackData( smsInd );
-
- // if SIM SMS Memory is full
- if ( ( KErrGsmSMSUnspecifiedProtocolError == aError ) &&
- ( reqHandle ) )
- {
- // SMS Memories not full
- if ( !iClientStorageFull )
- {
- CMmDataPackage package;
- TSmsMsg* nullSms = NULL;
- TInt rpCause( KErrGsmSMSUnspecifiedProtocolError );
- package.PackData( &nullSms, &rpCause );
-
- // ignore if Nacking fails
- TRAPD( trapError,
- ret = iMmPhone->MessageManager()->HandleRequestL(
- EMobileSmsMessagingNackSmsStored, &package ); );
- if ( KErrNone != trapError )
- {
- ret = trapError;
- }
-TFLOGSTRING("TSY: CMmSmsTsy::CompleteReceiveMessage.KErrGsmSMSUnspecifiedProtocolError ");
- }
- else // SMS Memory is full
- {
- CMmDataPackage package;
- TSmsMsg* nullSms = NULL;
- TInt rpCause( KErrGsmSMSMemoryCapacityExceeded );
- package.PackData( &nullSms, &rpCause );
-
- // ignore if Nacking fails
- TRAPD( trapError,
- ret = iMmPhone->MessageManager()->HandleRequestL(
- EMobileSmsMessagingNackSmsStored, &package ); );
- if ( KErrNone != trapError )
- {
- ret = trapError;
- }
- }
- }
- else if ( ( KErrGsmSMSMemoryCapacityExceeded == aError ) &&
- ( reqHandle ) )
- {
- CMmDataPackage package;
- TSmsMsg* nullSms = NULL;
- TInt rpCause( KErrGsmSMSMemoryCapacityExceeded );
- package.PackData( &nullSms, &rpCause );
-
- // ignore if Nacking fails
- TRAPD( trapError,
- ret = iMmPhone->MessageManager()->HandleRequestL(
- EMobileSmsMessagingNackSmsStored, &package );
- );
- if ( KErrNone != trapError )
- {
- ret = trapError;
- }
-TFLOGSTRING("TSY: CMmSmsTsy::CompleteReceiveMessage.KErrGsmSMSMemoryCapacityExceeded ");
- }
- else if ( !reqHandle )
- {
- // Routing is activated, but SMS stack hasn't called
- // ReceiveMessage. Nack received message internally with cause
- // value "protocol error", otherwise SMS server releases
- // routings
- CMmDataPackage package;
- TSmsMsg* nullSms = NULL;
- TInt rpCause;
- if (iClientStorageFull)
- {
- rpCause = KErrGsmSMSMemoryCapacityExceeded;
- }
- else
- {
- rpCause = KErrGsmSMSUnspecifiedProtocolError;
- }
- package.PackData( &nullSms, &rpCause );
-
- // ignore if Nacking fails
- TRAPD( trapError,
- ret = iMmPhone->MessageManager()->HandleRequestL(
- EMobileSmsMessagingNackSmsStored, &package );
- );
- if ( KErrNone != trapError )
- {
- ret = trapError;
- }
- }
- else if ( !smsInd )
- {
- // Error occurred while handling incoming message or acknowledging
- // received message
- // Request handle exists (already checked above)
- iTsyReqHandleStore->ResetTsyReqHandle(
- EMultimodeSmsReceiveMessage );
-
- ReqCompleted( reqHandle, aError );
-
- // Incoming message handling failed. If client or TSY doesn't .
- // ack incoming message, SMS Server may release all routings.
- // Set iSmsServerRoutingActivity to FALSE so client can activate
- // routings again.
- iServerRoutingActivity = ERoutingNotActivated;
- }
-
- if ( KErrNone != ret )
- {
- // Nack of received message failed. SMS Server releases all
- // routings. Set iSmsServerRoutingActivity to FALSE so client
- // can activate routings again
- iServerRoutingActivity = ERoutingNotActivated;
- }
- }
- }
-
-//----------------------------------------------------------------------------
-// CMmSmsTsy::StoreClass2MessageL
-// This method stores received Class 2 message in TSY's internal memory
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-void CMmSmsTsy::StoreClass2MessageL(
- TSmsMsg const* aSmsMsg )
- {
- TSmsMsg* smsMsg = new ( ELeave ) TSmsMsg();
- CleanupStack::PushL( smsMsg );
-
- smsMsg->iDeleteAfterClientAck = aSmsMsg->iDeleteAfterClientAck;
- smsMsg->iLocation = aSmsMsg->iLocation;
- smsMsg->iMessageStatus = aSmsMsg->iMessageStatus;
- smsMsg->iMobileScNPI = aSmsMsg->iMobileScNPI;
- smsMsg->iMobileScTON = aSmsMsg->iMobileScTON;
- smsMsg->iServiceCentre.Copy( aSmsMsg->iServiceCentre );
- smsMsg->iSmsMsg.Copy( aSmsMsg->iSmsMsg );
-
- iSmsMsgArray->AppendL( smsMsg );
-
- CleanupStack::Pop( smsMsg );
- // note: Lint doesn't understand the use of Pop and 'thinks'
- // that there is a memory leak for smsMsg, we disable that warning with
- // the following command
- // lint -e429
- }
-
-//----------------------------------------------------------------------------
-// CMmSmsTsy::DeliverClass2ToSmsStack
-// This method delivers a received Class 2 messages that are
-// stored in TSY's internal memory to the SMS stack
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-void CMmSmsTsy::DeliverClass2ToSmsStack()
- {
- // Check if there is Class 2 messages in TSY's internal memory that can be
- // now delivered to the SMS stack
- TTsyReqHandle reqHandle = iTsyReqHandleStore->GetTsyReqHandle(
- EMultimodeSmsReceiveMessage );
-
- if ( reqHandle && !iClientStorageFull )
- {
- for ( TInt i = 0; i < iSmsMsgArray->Count(); i++ )
- {
- if ( EFalse == iSmsMsgArray->At( i )->iDeleteAfterClientAck )
- {
-TFLOGSTRING2("TSY: CMmSmsTsy::DeliverClass2ToSmsStack. Deliver SMS to the SMS stack. Array count: %d", iSmsMsgArray->Count());
- // TSY can now delete the message if SMS stack ack message
- // successfully
- iSmsMsgArray->At( i )->iDeleteAfterClientAck = ETrue;
-
- TInt ret = iMmSmsExtInterface->CompleteReceiveMessage(
- iSmsMsgArray->At( i ), iReceiveMessageParamsPtr,
- iReceiveMessagePduPtr );
-
- // ReceiveMessage request completed Reset request handle
- iTsyReqHandleStore->ResetTsyReqHandle(
- EMultimodeSmsReceiveMessage );
-
- // increase the count of expected acknowledgements
- if(ret == KErrNone)
- {
- iExpectAckOrNack++;
- }
-
- ReqCompleted( reqHandle, ret );
- break;
- }
- }
- }
- }
-
-//----------------------------------------------------------------------------
-// CMmSmsTsy::AckSmsStoredL
-// Route RP-Ack request to active messagehandler
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-TInt CMmSmsTsy::AckSmsStoredL(
- const TTsyReqHandle aTsyReqHandle,
- const TDesC8* aMsgData,
- TBool const * aMemoryFull )
- {
-TFLOGSTRING2("TSY: CMmSmsTsy::AckSmsStored. aMemoryFull: %d",*aMemoryFull);
- TTsyReqHandle getAckStoredMessageHandle =
- iTsyReqHandleStore->GetTsyReqHandle( EMultimodeSmsAckStored );
-
- if ( EMultimodeSmsReqHandleUnknown < getAckStoredMessageHandle )
- {
- // Send request is already ongoing
- ReqCompleted( aTsyReqHandle, KErrServerBusy );
- }
- else
- if ( iExpectAckOrNack <= 0 )
- {
-TFLOGSTRING("TSY: CMmSmsTsy::AckSmsStoredL. -> ReceiveMessage not requested - error returned ");
- ReqCompleted( aTsyReqHandle, KErrNotReady );
- return KErrNone;
- }
- else
- {
- iClientStorageFull = *aMemoryFull;
- TBool ackMessage( ETrue );
-
- // Check if TSY has stored received Class 2 message to it's internal
- // memory. TSY can now delete message from it's internal memory
- // because SMS stack received message successfully.
- for ( TInt i = 0; i < iSmsMsgArray->Count(); i++ )
- {
- if ( EFalse != iSmsMsgArray->At( i )->iDeleteAfterClientAck &&
- KErrNone == aMsgData->CompareF(
- iSmsMsgArray->At( i )->iSmsMsg ) )
- {
-TFLOGSTRING3("TSY: CMmSmsTsy::AckSmsStored. Delete SMS: %d, Array count: %d",i,iSmsMsgArray->Count());
- delete iSmsMsgArray->At( i ); // Delete object from memory
- iSmsMsgArray->Delete( i ); // Delete pointer from array
- iSmsMsgArray->Compress();
-
- // Class 2 message is already acknowledged to the network
- // Complete request here and don't send ack to the .
- // network.
- ReqCompleted( aTsyReqHandle, KErrNone );
- ackMessage = EFalse;
-
- // Check if there is more class 2 messages waiting in TSY's
- // internal memory
- DeliverClass2ToSmsStack();
- break;
- }
- }
-
- if ( ackMessage )
- {
- // Pack data
- CMmDataPackage package;
- TDesC8* msgData = const_cast<TDesC8*>( aMsgData );
- package.PackData( &msgData );
-
- TInt ret = iMmPhone->MessageManager()->HandleRequestL(
- EMobileSmsMessagingAckSmsStored, &package );
-
- if ( KErrNone == ret )
- {
- iReqHandleType = EMultimodeSmsAckStored;
- }
- else
- {
- // Message construction failed or phonet returned error
- ReqCompleted( aTsyReqHandle, ret );
-
- // Acknowledging failed. SMS Server will now release routings.
- // Complete receive message request with KErrGeneral and
- // set routing activity to false. SMS Stack makes new
- // ReceiveMessage request.
- TBool smsInd( EFalse );
- CMmDataPackage data;
- TSmsMsg* nullSms = NULL;
- data.PackData( &smsInd, &nullSms );
- CompleteReceiveMessage( KErrGeneral, &data );
- }
- }
- }
-
- // decrease the count of expeced acknowledgements
- iExpectAckOrNack--;
-
- return KErrNone;
- }
-
-//----------------------------------------------------------------------------
-// CMmSmsTsy::CompleteAckSmsStored
-// Complete clients AckSmsStored request
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-void CMmSmsTsy::CompleteAckSmsStored(
- TInt aError )
- {
- TTsyReqHandle reqHandle = iTsyReqHandleStore->ResetTsyReqHandle(
- EMultimodeSmsAckStored );
- if ( reqHandle )
- {
- ReqCompleted( reqHandle, aError );
- }
-
- if (aError != KErrNone)
- {
- // Ack error from LTSY. Need to reject receive messege request, to force the client to repost it.
- reqHandle = iTsyReqHandleStore->ResetTsyReqHandle(EMultimodeSmsReceiveMessage);
- if( reqHandle != 0 )
- {
- ReqCompleted(reqHandle, KErrGeneral);
- }
- iServerRoutingActivity = ERoutingNotActivated;
- }
- }
-
-//----------------------------------------------------------------------------
-// CMmSmsTsy::NackSmsStored
-// Route RP-Error request to messagehandler
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-TInt CMmSmsTsy::NackSmsStoredL(
- const TTsyReqHandle aTsyReqHandle,
- const TDesC8* aMsgData,
- TInt* aRpCause )
- {
-TFLOGSTRING2("TSY: CMmSmsTsy::NackSmsStored. aRpCause: %d",*aRpCause);
- TTsyReqHandle nackHandle =
- iTsyReqHandleStore->GetTsyReqHandle( EMultimodeSmsNackStored );
-
- if ( 0 < nackHandle )
- {
- // The request is already in processing because of previous request
- // Complete request with status value informing the client about
- // the situation.
- ReqCompleted( aTsyReqHandle, KErrServerBusy );
- }
- else
- if ( iExpectAckOrNack <= 0 )
- {
-TFLOGSTRING("TSY: CMmSmsTsy::AckSmsStoredL. -> ReceiveMessage not requested - error returned ");
- ReqCompleted( aTsyReqHandle, KErrNotReady );
- return KErrNone;
- }
- else
- {
- TBool nackMessage( ETrue );
-
- // Check if TSY has stored received Class 2 message to it's internal
- // memory. TSY can now delete message from it's internal memory
- // because SMS stack received message successfully
- for ( TInt i = 0; i < iSmsMsgArray->Count(); i++ )
- {
- // Check if message is waiting SMS stack's acknowledging and
- // message contents is same as aMsgData.
- if ( EFalse != iSmsMsgArray->At( i )->iDeleteAfterClientAck &&
- KErrNone == aMsgData->CompareF(
- iSmsMsgArray->At( i )->iSmsMsg ) )
- {
- switch ( *aRpCause )
- {
- // ETel specific value
- case KErrGsmSMSMemoryCapacityExceeded:
- // Defect in SMS stack. Stack sets TP cause value to the
- // RP cause value TP-FCS 0xD3, RP cause 0x16
- // 0xD3:Memory Capacity Exceeded
- iClientStorageFull = ETrue;
- // without break statement, it will run "iSmsMsgArray->At( i )->iDeleteAfterClientAck = EFalse" in next case block.
- case 0xD3:
- // Deliver this message to SMS stack when SMS stack
- // has enough memory.
- iSmsMsgArray->At( i )->iDeleteAfterClientAck = EFalse;
- break;
- default:
- // Delete message because SMS stack couldn't handle it.
- // Delete object from memory
- delete iSmsMsgArray->At( i );
- // Delete pointer from array
- iSmsMsgArray->Delete( i );
- iSmsMsgArray->Compress();
- break;
- }
-
- // Class 2 message is already acknowledged to the network by
- // adaptation. Complete request here and don't send ack to the
- // network.
- ReqCompleted( aTsyReqHandle, KErrNone );
- nackMessage = EFalse;
- break;
- }
- }
-
- if ( nackMessage )
- {
- CMmDataPackage package;
- // packed parameter: pointer to TDesC8 (TPDU data)
- // and TInt (RP cause)
- TDesC8* tempMsgDataPtr = const_cast<TDesC8*>( aMsgData );
- package.PackData( &tempMsgDataPtr, aRpCause );
-
- TInt ret = iMmPhone->MessageManager()->HandleRequestL(
- EMobileSmsMessagingNackSmsStored, &package );
-
- if ( KErrNone == ret )
- {
- iReqHandleType = EMultimodeSmsNackStored;
- }
- else
- {
- // Message construction failed or phonet sender returned
- // error
- ReqCompleted( aTsyReqHandle, ret );
-
- // Acknowledging failed. SMS Server will now release routings.
- // Complete receive message request with KErrGeneral and
- // set routing activity to false. SMS Stack makes new
- // ReceiveMessage request.
- TBool smsInd( EFalse );
- CMmDataPackage data;
- TSmsMsg* nullSms = NULL;
- data.PackData( &smsInd, &nullSms );
- CompleteReceiveMessage( KErrGeneral, &data );
- }
- }
- }
-
-
- // decrease the count of expeced acknowledgements
- iExpectAckOrNack--;
-
- return KErrNone;
- }
-
-//----------------------------------------------------------------------------
-// CMmSmsTsy::CompleteNackSmsStored
-// Complete clients NackSmsStored request
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-void CMmSmsTsy::CompleteNackSmsStored(
- TInt aError )
- {
- // reset req handle. Returns the deleted req handle
- TTsyReqHandle reqHandle = iTsyReqHandleStore->ResetTsyReqHandle(
- EMultimodeSmsNackStored );
- if ( reqHandle )
- {
- ReqCompleted( reqHandle, aError );
- }
-
- if (aError != KErrNone)
- {
- // Nack error from LTSY. Need to reject receive messege request, to force the client to repost it.
- reqHandle = iTsyReqHandleStore->ResetTsyReqHandle(EMultimodeSmsReceiveMessage);
- if( reqHandle != 0 )
- {
- ReqCompleted(reqHandle, KErrGeneral);
- }
- iServerRoutingActivity = ERoutingNotActivated;
- }
- }
-
-//----------------------------------------------------------------------------
-// CMmSmsTsy::ResumeSmsReception
-// Notify SMS Server, that client have again free memory for incoming SMSes
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-TInt CMmSmsTsy::ResumeSmsReceptionL(
- const TTsyReqHandle aTsyReqHandle )
- {
-TFLOGSTRING("TSY: CMmSmsTsy::ResumeSmsReceptionL");
- TTsyReqHandle resumeHandle =
- iTsyReqHandleStore->GetTsyReqHandle( EMultimodeSmsResumeReception );
-
- if ( 0 < resumeHandle )
- {
- // The request is already in processing because of previous request
- // Complete request with status value informing the client about
- // the situation
- ReqCompleted( aTsyReqHandle, KErrServerBusy );
- }
- else if ( iIsOffline )
- {
- // CS hardware is in off-line mode. We cannot issue this request
- // now, but we will do it as soon as we are on-line again. See
- // method SetOffline.
- iResumeSmsReceptionPending = ETrue;
-
- // Complete with KErrNone. Client will never notice that the
- // request was not yet sent to DOS.
- ReqCompleted( aTsyReqHandle, KErrNone );
- }
- else
- {
- TInt ret = iMmPhone->MessageManager()->HandleRequestL(
- EMobileSmsMessagingResumeSmsReception );
-
- if ( KErrNone == ret )
- {
- iReqHandleType = EMultimodeSmsResumeReception;
- }
- else
- {
- // Message construction failed or phonet sender returned error
- ReqCompleted( aTsyReqHandle, ret );
- }
- }
-
- return KErrNone;
- }
-
-//----------------------------------------------------------------------------
-// CMmSmsTsy::CompleteResumeSmsReception
-// This method completes clients ResumeSmsReception request
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-void CMmSmsTsy::CompleteResumeSmsReception(
- TInt aError )
- {
- if ( KErrNone == aError )
- {
- iClientStorageFull = EFalse;
- }
-
- TTsyReqHandle reqHandle = iTsyReqHandleStore->ResetTsyReqHandle(
- EMultimodeSmsResumeReception );
- if ( reqHandle )
- {
- ReqCompleted( reqHandle, aError );
- }
-
- // Suspended SMS reception resumed. Check if there is class 2 messages
- // waiting in TSY's internal memory.
- DeliverClass2ToSmsStack();
- }
-
-//----------------------------------------------------------------------------
-// CMmSmsTsy::SetOffline
-// Sets information about CS hardware mode (off-line/on-line)
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-void CMmSmsTsy::SetOffline(
- TBool aIsOffline )
- {
-TFLOGSTRING2("TSY: CMmSmsTsy::SetOffline has been called with %d", aIsOffline);
-
- if ( !aIsOffline && iIsOffline )
- {
- // changing from off-line to on-line
- if ( iResumeSmsReceptionPending )
- {
- // now send the pending ResumeSmsReception
- // request to DOS. We are not interested if the
- // request has failed, and it has already been completed
- // to the client (with KErrNone). See method ResumeSmsReception.
- TInt trapError = KErrNone;
- TRAP( trapError, iMmPhone->MessageManager()->HandleRequestL(
- EMobileSmsMessagingResumeSmsReception );
- );
- iResumeSmsReceptionPending = EFalse;
- }
- }
- iIsOffline = aIsOffline;
- }
-
-//----------------------------------------------------------------------------
-// CMmSmsTsy::GetMoSmsBearer
-// This method is used to retrieve the current setting for the
-// bearer type used for sending SMS messages
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-TInt CMmSmsTsy::GetMoSmsBearer(
- const TTsyReqHandle /*aTsyReqHandle*/,
- RMobileSmsMessaging::TMobileSmsBearer* /*aBearer*/ )
- {
- return KErrNotSupported;
- }
-
-//----------------------------------------------------------------------------
-// CMmSmsTsy::SetMoSmsBearer
-// This method sets the bearer type for sending SMS messages
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-TInt CMmSmsTsy::SetMoSmsBearer(
- const TTsyReqHandle aTsyReqHandle,
- RMobileSmsMessaging::TMobileSmsBearer* aBearer )
- {
-TFLOGSTRING("TSY: CMmSmsTsy::SetMoSmsBearer called");
-
- TTsyReqHandle setMoSmsBearerHandle =
- iTsyReqHandleStore->GetTsyReqHandle( EMultimodeSmsSetMoSmsBearer );
-
- if ( 0 < setMoSmsBearerHandle )
- {
- // The request is already processing because of previous request.
- // Complete request with status value informing the client about
- // the situation.
- ReqCompleted( aTsyReqHandle, KErrServerBusy );
- }
- else
- {
- if ( ( *aBearer == RMobileSmsMessaging::ESmsBearerPacketOnly ) ||
- ( *aBearer == RMobileSmsMessaging::ESmsBearerCircuitOnly ) ||
- ( *aBearer == RMobileSmsMessaging::ESmsBearerPacketPreferred ) ||
- ( *aBearer == RMobileSmsMessaging::ESmsBearerCircuitPreferred ) )
- {
- TInt ret = KErrNone;
-
- CMmDataPackage package;
- package.PackData( aBearer );
-
- // Send request to the DOS layer.
- TRAP_IGNORE( ret = iMmPhone->MessageManager()->HandleRequestL(
- EMobileSmsMessagingSetMoSmsBearer, &package ); );
-
- if ( KErrNone == ret )
- {
-#ifdef REQHANDLE_TIMER
- SetTypeOfResponse( EMultimodeSmsSetMoSmsBearer, aTsyReqHandle );
-#else
- iTsyReqHandleStore->SetTsyReqHandle(
- EMultimodeSmsSetMoSmsBearer, aTsyReqHandle );
-#endif // REQHANDLE_TIMER
- }
- else
- {
- // Call to DOS failed
- ReqCompleted( aTsyReqHandle, ret );
- }
- }
- else
- {
- ReqCompleted( aTsyReqHandle, KErrNotSupported );
- }
- }
- return KErrNone;
- }
-
-//----------------------------------------------------------------------------
-// CMmSmsTsy::CompleteSetMoSmsBearer
-// Complete clients SetMoSmsBearer request
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-void CMmSmsTsy::CompleteSetMoSmsBearer(
- TInt aResult )
- {
- // reset req handle. Returns the deleted req handle
- TTsyReqHandle reqHandle = iTsyReqHandleStore->ResetTsyReqHandle(
- EMultimodeSmsSetMoSmsBearer );
-
- if ( reqHandle )
- {
- ReqCompleted( reqHandle, aResult );
- }
- }
-
-//----------------------------------------------------------------------------
-// CMmSmsTsy::SetMoSmsBearerCancel
-// This method is used to cancel an outstanding asynchronous
-// SetMoSmsBearer request
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-TInt CMmSmsTsy::SetMoSmsBearerCancel(
- const TTsyReqHandle aTsyReqHandle )
- {
- iTsyReqHandleStore->ResetTsyReqHandle( EMultimodeSmsSetMoSmsBearer );
-
- ReqCompleted( aTsyReqHandle, KErrCancel );
-
- return KErrNone;
- }
-
-//----------------------------------------------------------------------------
-// CMmSmsTsy::NotifyMoSmsBearerChange
-// This method is used to notify the client if there is a
-// change to the setting for the bearer type used for sending SMS messages
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-TInt CMmSmsTsy::NotifyMoSmsBearerChange(
- RMobileSmsMessaging::TMobileSmsBearer* /*aBearer*/ )
- {
- return KErrNotSupported;
- }
-
-//----------------------------------------------------------------------------
-// CMmSmsTsy::NotifyMoSmsBearerChangeCancel
-// This method is used to cancel an outstanding asynchronous
-// NotifyMoSmsBearerChange request
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-TInt CMmSmsTsy::NotifyMoSmsBearerChangeCancel(
- const TTsyReqHandle aTsyReqHandle )
- {
- iTsyReqHandleStore->ResetTsyReqHandle(
- EMultimodeSmsNotifyMoSmsBearerChange );
- ReqCompleted( aTsyReqHandle, KErrCancel );
- iNotifySmsBearerPtr = NULL;
-
- return KErrNone;
- }
-
-//----------------------------------------------------------------------------
-// CMmSmsTsy::SendMessageL
-// Routes send message to network request to message handler
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-TInt CMmSmsTsy::SendMessageL(
- const TTsyReqHandle aTsyReqHandle,
- TDes8* aMsgData,
- TDes8* aMsgAttributes )
- {
- TInt ret( KErrNone );
-
- TTsyReqHandle getSendMessageHandle =
- iTsyReqHandleStore->GetTsyReqHandle( EMultimodeSmsSendMessage );
- TTsyReqHandle getSendSatMessageHandle =
- iTsyReqHandleStore->GetTsyReqHandle( EMultimodeSmsSendSatMessage );
-
- TTsyReqHandle getSendMessageNoFdnHandle =
- iTsyReqHandleStore->GetTsyReqHandle( EMultimodeSmsSendMessageNoFdnCheck );
- if ( ( EMultimodeSmsReqHandleUnknown < getSendMessageHandle )
- || ( EMultimodeSmsReqHandleUnknown < getSendSatMessageHandle )
- || ( EMultimodeSmsReqHandleUnknown < getSendMessageNoFdnHandle ) )
- {
- // Send request is already ongoing
- // (through ETel messaging or through SAT)
- ReqCompleted( aTsyReqHandle, KErrServerBusy );
- }
- else if(sizeof(RMobileSmsMessaging::TMobileSmsReceiveAttributesV1) > aMsgAttributes->Size())
- {
- ReqCompleted( aTsyReqHandle, KErrArgument );
- }
- else
- {
- iSendMessageMsgAttrPckgPtr = aMsgAttributes;
-
- // Create package
- CMmDataPackage package;
-
- // typecast for aMsgAttributes
- RMobileSmsMessaging::TMobileSmsSendAttributesV1Pckg* attsPckg =
- reinterpret_cast<
- RMobileSmsMessaging::TMobileSmsSendAttributesV1Pckg* >(
- aMsgAttributes );
- RMobileSmsMessaging::TMobileSmsSendAttributesV1& msgAttr =
- ( *attsPckg )();
-
- // structure for all sms parameters and data
- TSendSmsDataAndAttributes sendData;
-
- sendData.iAttributes = &msgAttr;
- sendData.iMsgData = aMsgData;
-
- if ( iSmsNoFdnCheckFlag == ESmsNoFdnCheckUsed )
- {
- //set ipc
- sendData.iIpc = EMobileSmsMessagingSendMessageNoFdnCheck;
- }
- if ( iSmsNoFdnCheckFlag == ESmsNoFdnCheckNotUsed )
- {
- //set ipc
- sendData.iIpc = EMobileSmsMessagingSendMessage;
- }
-
- // Pack parameters
- package.PackData( &sendData );
-
- CSmsSendRequest* smsSendReq = new (ELeave) CSmsSendRequest();
- smsSendReq->SetSmsDataAndAttributes( sendData );
-
- // save send request
- iSmsSendReq = smsSendReq;
-TFLOGSTRING("TSY: CMmSmsTsy::SendMessageL: Send request saved");
-
- // send request to DOS
- // packed parameter: TSendSmsDataAndAttributes
- if ( iSmsNoFdnCheckFlag == ESmsNoFdnCheckUsed )
- {
- ret = iMmPhone->MessageManager()->HandleRequestL(
- EMobileSmsMessagingSendMessageNoFdnCheck, &package );
- }
- if ( iSmsNoFdnCheckFlag == ESmsNoFdnCheckNotUsed )
- {
- ret = iMmPhone->MessageManager()->HandleRequestL(
- EMobileSmsMessagingSendMessage, &package );
- }
-
- if ( KErrNone == ret )
- {
- if ( iSmsNoFdnCheckFlag == ESmsNoFdnCheckUsed )
- {
- //set request type
- iReqHandleType = EMultimodeSmsSendMessageNoFdnCheck;
- }
- if ( iSmsNoFdnCheckFlag == ESmsNoFdnCheckNotUsed )
- {
- //set request type
- iReqHandleType = EMultimodeSmsSendMessage;
- }
- smsSendReq->IncreaseSendCounter();
- }
- else
- {
- // Phonet returned error
- delete smsSendReq; // Delete object
- iSmsSendReq = NULL; // Reset pointer
- // Message construction failed or phonet sender returned error
- ReqCompleted( aTsyReqHandle, ret );
- // reset pointer to client memory
- iSendMessageMsgAttrPckgPtr = NULL;
-
- iSmsNoFdnCheckFlag = ESmsNoFdnCheckUnknown;
- }
- }
-
- return KErrNone;
- }
-
-//----------------------------------------------------------------------------
-// CMmSmsTsy::IsRPError
-// Checks if error code is a relay protocol error
-// ---------------------------------------------------------------------------
-TBool CMmSmsTsy::IsRPError(TInt aError)
- {
- TFLOGSTRING2("CMmSmsTsy::IsRPError(): %d", aError);
-
- TBool isRPError = EFalse;
- switch (aError)
- {
- case KErrGsmSMSShortMessageTransferRejected:
- {
- isRPError = ETrue;
- }
- break;
- case KErrGsmSMSInvalidMandatoryInformation:
- {
- isRPError = ETrue;
- }
- break;
- case KErrGsmSMSUnidentifiedSubscriber:
- {
- isRPError = ETrue;
- }
- break;
- case KErrGsmSMSUnknownSubscriber:
- {
- isRPError = ETrue;
- }
- break;
- case KErrGsmSMSNetworkOutOfOrder:
- {
- isRPError = ETrue;
- }
- break;
- default:
- {
- // NOP
- }
- break;
- }
-
- return isRPError;
- } // CMmSmsTsy::IsRPError
-
-
-//----------------------------------------------------------------------------
-// CMmSmsTsy::CompleteSendMessage
-// Complete SendMessage request
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-void CMmSmsTsy::CompleteSendMessage(
- TInt aError,
- CMmDataPackage* aDataPackage )
- {
- TInt extendedError = CMmCommonStaticUtility::ExtendedErrorCode(aError);
- TBool res = IsRPError(extendedError);
- if(res)
- {
- // Delete send message entry from send array
- if ( iSmsSendReq )
- {
- delete iSmsSendReq; // Delete object
- iSmsSendReq = NULL; // Reset pointer
- }
- // reset req handle and complete request
- TTsyReqHandle reqHandle = iTsyReqHandleStore->ResetTsyReqHandle(
- EMultimodeSmsSendMessage );
- ReqCompleted( reqHandle, extendedError );
- // reset pointer to client memory
- iSendMessageMsgAttrPckgPtr = NULL;
- iSmsNoFdnCheckFlag = ESmsNoFdnCheckUnknown;
- }
- else if ( ( KErrNone != aError ) && ( KErrTimedOut != aError )
- && ( KErrGsmSMSOperationNotAllowed !=
- CMmCommonStaticUtility::ExtendedErrorCode ( aError ) )
- // FDB check failed
- && ( KErrGsmSMSUnspecifiedProtocolError !=
- CMmCommonStaticUtility::ExtendedErrorCode ( aError ) )
- && ( KErrSatControl !=
- CMmCommonStaticUtility::ExtendedErrorCode ( aError ) )
- && ( !( iMmPhone->GetSatMessaging() &&
- iMmPhone->GetSatMessaging()->IsMoSmControlBySimActivated() ) )
- && ( NULL != iSmsSendReq ) && ( 2 >=
- iSmsSendReq->GetSendCounter() ) )
- {
- // DOS returned error to send request. Message might be tried to be
- // resent (see method ResendSms).
- // Timeout mechanism cannot access this part of code, ever.
-TFLOGSTRING2("TSY: CMmSmsTsy::CompleteSendMessage. Resend counter: %d", iSmsSendReq->GetSendCounter());
- }
- else
- {
- // This is executed
- // - if sending was successful
- // - if there are no more resending attempts
- // - if timer expires (called from the Complete of CMmSmsTsy class)
-
- // Delete send message entry from send array
- if ( iSmsSendReq )
- {
- delete iSmsSendReq; // Delete object
- iSmsSendReq = NULL; // Reset pointer
- }
-
- // reset req handle and complete request
- TTsyReqHandle reqHandle = iTsyReqHandleStore->ResetTsyReqHandle(
- EMultimodeSmsSendMessage );
-
- if ( EMultimodeSmsReqHandleUnknown < reqHandle )
- {
- // get values only if there was no error, and if return pointer to
- // client is available
- if ( KErrNone == aError && iSendMessageMsgAttrPckgPtr )
- {
- TInt16 msgRef( 0 );
- TBuf8<RMobileSmsMessaging::KGsmTpduSize> smsMsg;
-
- aDataPackage->UnPackData( msgRef, smsMsg );
-
- RMobileSmsMessaging::TMobileSmsSendAttributesV1Pckg* attsPckg =
- reinterpret_cast<
- RMobileSmsMessaging::TMobileSmsSendAttributesV1Pckg* >(
- iSendMessageMsgAttrPckgPtr );
- RMobileSmsMessaging::TMobileSmsSendAttributesV1& msgAttr =
- ( *attsPckg )();
-
- msgAttr.iFlags = RMobileSmsMessaging::KMessageReference;
- msgAttr.iMsgRef = static_cast< TUint16 >( msgRef );
-
- if ( NULL != smsMsg.Length() )
- {
- msgAttr.iSubmitReport.Copy(smsMsg);
- msgAttr.iFlags |= RMobileSmsMessaging::KGsmSubmitReport;
- }
- }
-
- ReqCompleted( reqHandle, aError );
- // reset pointer to client memory
- iSendMessageMsgAttrPckgPtr = NULL;
- iSmsNoFdnCheckFlag = ESmsNoFdnCheckUnknown;
- }
- }
-
- // Resend unsent message
- ResendSms();
- }
-
-//----------------------------------------------------------------------------
-// CMmSmsTsy::SendSatMessage
-// SimAtkTsy can send SMS messages to the network by calling this method
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-TInt CMmSmsTsy::SendSatMessage(
- MStkTsySatService& aStkTsySatService,
- TDes8* aSmsTpdu,
- TDes16* aScAddress,
- RMobilePhone::TMobileTON* aMobileTON,
- RMobilePhone::TMobileNPI* aMobileNPI,
- TBool aMoreToSend,
- TTsyReqHandle aTsyReqHandle )
- {
- iTsySatMessaging = &aStkTsySatService;
-
- TTsyReqHandle getSendMessageHandle =
- iTsyReqHandleStore->GetTsyReqHandle( EMultimodeSmsSendMessage );
- TTsyReqHandle getSendSatMessageHandle =
- iTsyReqHandleStore->GetTsyReqHandle( EMultimodeSmsSendSatMessage );
-
- if ( ( EMultimodeSmsReqHandleUnknown < getSendMessageHandle )
- || ( EMultimodeSmsReqHandleUnknown < getSendSatMessageHandle ) )
- {
- // Send request is already ongoing
- // (through ETel messaging or through SAT)
- iTsySatMessaging->CompleteSendSmsMessage( KErrServerBusy );
- }
- else
- {
-
- TRAPD( leaveCode, DoSendSatMessageL( aSmsTpdu, aScAddress, aMobileTON,
- aMobileNPI, aMoreToSend, aTsyReqHandle ); );
-
- if ( KErrNone != leaveCode )
- {
- // Call to DOS failed
- CompleteSendSatMessage( leaveCode );
- }
- }
-
- return KErrNone;
- }
-
-//----------------------------------------------------------------------------
-// CMmSmsTsy::DoSendSatMessageL
-// SimAtkTsy can send SMS messages to the network by calling this method.
-// This method TRAPs failures.
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-void CMmSmsTsy::DoSendSatMessageL(
- TDes8* aSmsTpdu,
- TDes16* aScAddress,
- RMobilePhone::TMobileTON* aMobileTON,
- RMobilePhone::TMobileNPI* aMobileNPI,
- TBool aMoreToSend,
- TTsyReqHandle aTsyReqHandle )
- {
- // Leave if SendSatMessageL returns an error
- User::LeaveIfError( SendSatMessageL( iMmPhone, aSmsTpdu,
- aScAddress, aMobileTON, aMobileNPI, aMoreToSend ) );
-
-#ifdef REQHANDLE_TIMER
- SetTypeOfResponse( EMultimodeSmsSendSatMessage, aTsyReqHandle );
-#endif // REQHANDLE_TIMER
- }
-
-//----------------------------------------------------------------------------
-// CMmSmsTsy::CompleteSendSatMessage
-// Compelete SendSatMessage request to the MMSAT
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-void CMmSmsTsy::CompleteSendSatMessage(
- TInt aError )
- {
-TFLOGSTRING2("TSY: CMmSmsTsy::CompleteSendSatMessage. Complete SAT SMS send Error: %d", aError);
- iTsyReqHandleStore->ResetTsyReqHandle( EMultimodeSmsSendSatMessage );
-
- if ( iTsySatMessaging )
- {
- iTsySatMessaging->CompleteSendSmsMessage( aError );
- }
-
-#ifdef USING_CTSY_DISPATCHER
-
- //the iTsySatMessaging is now Nulled on the complete
- //open issue that if the iTsySatMessaging pointer (to the SIM ATK) is not nulled (i.e. the callback is
- //not completed) and the CTSY is destructed after the SIM ATK then the CMmSmsTsy has a invalid pointer which
- //is used in the CMmSmsTsy destructor
-
- iTsySatMessaging = NULL;
-#endif //USING_CTSY_DISPATCHER
- }
-
-//----------------------------------------------------------------------------
-// CMmSmsTsy::EnumerateMessageStores
-// This methods returns the number of phone-side SMS message
-// stores supported by the phone
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-TInt CMmSmsTsy::EnumerateMessageStores(
- const TTsyReqHandle aTsyReqHandle,
- TInt* aCount )
- {
- *aCount = KSmsStoreNumber;
- ReqCompleted( aTsyReqHandle, KErrNone );
-
- return KErrNone;
- }
-
-//----------------------------------------------------------------------------
-// CMmSmsTsy::GetMessageStoreInfo
-// This method gets used SMS entries and total number of SMS entries on SIM
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-TInt CMmSmsTsy::GetMessageStoreInfoL(
- const TTsyReqHandle aTsyReqHandle,
- TInt const* aIndex,
- TDes8* aInfo )
- {
- TTsyReqHandle getStoreInfoHandle =
- iTsyReqHandleStore->GetTsyReqHandle(
- EMultimodeSmsGetMessageStoreInfo );
-
- if ( EMultimodeSmsReqHandleUnknown < getStoreInfoHandle )
- {
- // The request is already in processing because of previous request.
- // Complete request with status value informing the client about
- // the situation.
- ReqCompleted( aTsyReqHandle, KErrServerBusy );
- }
- else if ( (*aIndex >= KSmsStoreNumber) || (*aIndex < 0) )
- {
- // First store number is "0" and SIM is only supported store
- ReqCompleted( aTsyReqHandle, KErrArgument );
- }
- else
- {
- iGetMessageStoreInfoPtr = aInfo;
- // allow for EMobileSmsMessagingGetMessageStoreInfo immediate
- // completion
-#ifdef REQHANDLE_TIMER
- SetTypeOfResponse( EMultimodeSmsGetMessageStoreInfo, aTsyReqHandle );
-#else
- // Never comes here. See SetTypeOfResponse.
- iTsyReqHandleStore->SetTsyReqHandle( EMultimodeSmsGetMessageStoreInfo,
- aTsyReqHandle );
-#endif // REQHANDLE_TIMER
-
- //Send request to the Domestic OS layer.
- TInt ret = iMmPhone->MessageManager()->HandleRequestL(
- EMobileSmsMessagingGetMessageStoreInfo );
-
- // DOS layer returned with error without completing request
- if ( KErrNone != ret && iTsyReqHandleStore->ResetTsyReqHandle(
- EMultimodeSmsGetMessageStoreInfo) )
- {
- ReqCompleted( aTsyReqHandle, ret );
- }
- }
-
- return KErrNone;
- }
-
-//----------------------------------------------------------------------------
-// CMmSmsTsy::GetMessageStoreInfoCancel
-// Cancel pending GetMessagestoreInfo request
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-TInt CMmSmsTsy::GetMessageStoreInfoCancel(
- const TTsyReqHandle aTsyReqHandle )
- {
- iTsyReqHandleStore->ResetTsyReqHandle( EMultimodeSmsGetMessageStoreInfo );
-
- ReqCompleted( aTsyReqHandle, KErrCancel );
-
- return KErrNone;
- }
-
-//----------------------------------------------------------------------------
-// CMmSmsTsy::CompleteGetMessageStoreInfo
-// Complete GetMessageStoreInfo request to client
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-void CMmSmsTsy::CompleteGetMessageStoreInfo(
- TInt aError,
- CMmDataPackage* aDataPackage )
- {
- TUint8 totalEntries( 0 );
- TInt usedEntries( 0 );
-
- TTsyReqHandle reqHandle = iTsyReqHandleStore->ResetTsyReqHandle(
- EMultimodeSmsGetMessageStoreInfo );
-
- if ( reqHandle )
- {
- // Request was successful
- if ( ( KErrNone == aError ) || ( KErrNotFound == aError ) )
- {
- aDataPackage->UnPackData( totalEntries, usedEntries );
-
- aError = iMmSmsExtInterface->MessageStoreInfo(
- iGetMessageStoreInfoPtr, totalEntries, usedEntries );
- }
-
- iSmsNumOfLoc = totalEntries;
-
- ReqCompleted( reqHandle, aError );
- }
- }
-
-//----------------------------------------------------------------------------
-// CMmSmsTsy::ReadSmspListPhase1L
-// This method starts first phase of SMS Parameter sets
-// retrieval On the first phase method store locations
-// temporarely to the TSY. On the second phase method copies the
-// list to the client
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-TInt CMmSmsTsy::ReadSmspListPhase1L(
- const TTsyReqHandle aTsyReqHandle,
- RMobilePhone::TClientId const* aId,
- TInt* aBufSize )
- {
-TFLOGSTRING("TSY: CMmSmsTsy::ReadSmspListPhase1L");
-
- TTsyReqHandle readSmspHandle = iTsyReqHandleStore->GetTsyReqHandle(
- EMultimodeSmsReadSmspListPhase1 );
-
- if ( 0 < readSmspHandle )
- {
- // The request is already processing because of previous request
- // Complete request with status value informing the client about
- // the situation.
- ReqCompleted( aTsyReqHandle, KErrServerBusy );
- }
- else
- {
- // Lets check how many SMSP sets are there.
- TInt ret = iMmPhone->MessageManager()->HandleRequestL(
- EMobileSmsMessagingGetSmspListPhase1 );
-
- if ( KErrNone == ret )
- {
- iReqHandleType = EMultimodeSmsReadSmspListPhase1;
-
- iRetSMSPSize = aBufSize;
-
- // Copy client id (session and subsession handle). it's used for
- // matching phase 1 and 2 of a request
-
- if ( iSMSPClientId )
- {
- delete iSMSPClientId;
- iSMSPClientId = NULL;
- }
-
- iSMSPClientId = new ( ELeave ) RMobilePhone::TClientId( *aId );
- }
- else
- {
- // Call to DOS failed
- ReqCompleted( aTsyReqHandle, ret );
- }
- }
-
- return KErrNone;
- }
-
-//----------------------------------------------------------------------------
-// CMmSmsTsy::ReadSmspListPhase2
-// This method starts second phase of SMS Parameter sets retrieval. It is
-// guaranteed that this is only called if phase 1 was completed with KErrNone.
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-TInt CMmSmsTsy::ReadSmspListPhase2(
- TTsyReqHandle aTsyReqHandle,
- RMobilePhone::TClientId const* aId,
- TDes8* aBuffer )
- {
- // Check if client id matches between phase 1 and phase 2
- if ( ( iSMSPClientId->iSessionHandle == aId->iSessionHandle ) &&
- ( iSMSPClientId->iSubSessionHandle == aId->iSubSessionHandle ) )
- {
- // Copy the streamed list to the client
- aBuffer->Copy( iSMSPList->Ptr( 0 ) );
-
- iMmPhone->ReqCompleted( aTsyReqHandle, KErrNone );
- }
- else
- {
- iMmPhone->ReqCompleted( aTsyReqHandle, KErrCorrupt );
- }
-
- // Reset the client Id
- delete iSMSPClientId;
- iSMSPClientId = NULL;
-
- // Reset the streamed list
- delete iSMSPList;
- iSMSPList = NULL;
-
- return KErrNone;
- }
-
-//----------------------------------------------------------------------------
-// CMmSmsTsy::ReadAllSmspCancel
-// This method cancels read all SMS Parameter sets request.
-// This method can be called between phase1 and phase2
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-TInt CMmSmsTsy::ReadAllSmspCancel(
- const TTsyReqHandle aTsyReqHandle )
- {
- iTsyReqHandleStore->ResetTsyReqHandle( EMultimodeSmsReadSmspListPhase1 );
-
- iRetSMSPSize = NULL;
-
- if ( iSMSPClientId )
- {
- delete iSMSPClientId;
- iSMSPClientId = NULL;
- }
-
- if ( iSMSPList )
- {
- delete iSMSPList;
- iSMSPList = NULL;
- }
-
- ReqCompleted( aTsyReqHandle, KErrCancel );
-
- return KErrNone;
- }
-
-//----------------------------------------------------------------------------
-// CMmSmsTsy::CreateSmspListL
-// This method creates SMSP list from read entries.
-// Method reads the list, and stores its content in iSMSPList.
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-void CMmSmsTsy::CreateSmspListL(
- CArrayPtrFlat<TSmsParameters>& aSmspList )
- {
- CMobilePhoneSmspList* list = CMobilePhoneSmspList::NewL();
- CleanupStack::PushL( list );
-
- TUint8 amountOfSets = static_cast< TUint8 >( aSmspList.Count() );
-
- RMobileSmsMessaging::TMobileSmspEntryV1 entry;
-
- // Runs until TSY's internal SMSP storage is empty
- while ( 0 != aSmspList.Count() )
- {
- TSmsParameters* smsParam = aSmspList.At( 0 );
- entry.iIndex = ( smsParam->iLocationNumber );
-
- if ( smsParam->iAlphaTagPresent )
- {
- entry.iText.Copy( smsParam->iAlphaTagData );
- }
- else
- {
- entry.iText.SetLength( 0 );
- }
-
- entry.iValidParams = ( smsParam->iParameterIndicator );
-
- TInt paramask =
- KSmsGsmParametersIndMask & ( smsParam->iParameterIndicator );
-
- if ( paramask & KDestinationAddress )
- {
- entry.iDestination.iTypeOfNumber = ( smsParam->iMobileDeTON );
- entry.iDestination.iNumberPlan = ( smsParam->iMobileDeNPI );
- entry.iDestination.iTelNumber = ( smsParam->iDestinationAddress );
- }
-
- if ( paramask & KServiceCentreAddress )
- {
- entry.iServiceCentre.iTypeOfNumber = ( smsParam->iMobileScTON );
- entry.iServiceCentre.iNumberPlan = ( smsParam->iMobileScNPI );
- entry.iServiceCentre.iTelNumber =
- ( smsParam->iServiceCenterAddress );
- }
-
- if ( paramask & KProtocolID )
- {
- entry.iProtocolId = ( smsParam->iProtocolId );
- }
-
- if ( paramask & KDataCodingScheme )
- {
- entry.iDcs = ( smsParam->iDataCodingScheme );
- }
-
- if ( paramask & KValidityPeriod )
- {
- entry.iValidityPeriod = ( smsParam->iValidityPeriod );
- }
-
- list->AddEntryL( entry );
-
- // Delete handled SMSP set
- delete smsParam; // Delete object
- aSmspList.Delete( 0 ); // Delete pointer from array
- aSmspList.Compress();
- }
-
- // Set maximum amount of SMSP sets to the list.
- list->SetMaxNumberEntries( amountOfSets );
-
- iSMSPList = list->StoreLC(); // creates new CBufFlat buffer and
- // pushes it on cleanup stack
- CleanupStack::Pop(); // pop the iSMSPList
-
- CleanupStack::PopAndDestroy(); // pop&destroy CMobilePhoneSmspList* list
- }
-
-//----------------------------------------------------------------------------
-// CMmSmsTsy::CompleteReadAllSmspPhase1
-// Complete first phase of read all SMSP sets request, i.e. returns
-// size of iSMSPList buffer to client.
-// Parameter aDataPackage contains SMSP list in CArrayPtrFlat<TSmsParameters>.
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-void CMmSmsTsy::CompleteReadAllSmspPhase1(
- TInt aError,
- CMmDataPackage* aDataPackage )
- {
- CArrayPtrFlat<TSmsParameters>* smsParams;
-
- TTsyReqHandle reqHandle = iTsyReqHandleStore->ResetTsyReqHandle(
- EMultimodeSmsReadSmspListPhase1 );
-
-TFLOGSTRING2("TSY: CMmSmsTsy::CompleteReadAllSmspPhase1 Complete read first phase error: %d",aError);
- if ( KErrNone == aError )
- {
- aDataPackage->UnPackData( &smsParams );
- if ( reqHandle )
- {
- // Create the Smsp list
- TInt trapError;
- if( NULL == smsParams)
- {
- trapError = KErrGeneral;
- }
- else
- {
- TRAP( trapError, CreateSmspListL( *smsParams ); );
- }
-
- if ( KErrNone == trapError )
- {
- *iRetSMSPSize = iSMSPList->Size();
-TFLOGSTRING("TSY: CMmSmsTsy::CompleteReadAllSmspPhase1: Phase 1 OK.");
- // Complete first phase of read all SMSP sets
- ReqCompleted( reqHandle, KErrNone );
- }
- else
- {
-TFLOGSTRING2("TSY: CMmSmsTsy::CompleteReadAllSmspPhase1: Could not create SMSP list, trapError=%d",trapError);
- // Complete with error
- ReqCompleted( reqHandle, trapError );
- }
- }
- }
- else
- {
- if ( reqHandle )
- {
- // Complete first phase of read all SMSP sets.
- ReqCompleted( reqHandle, aError );
- }
- }
- iRetSMSPSize = NULL;
- }
-
-//----------------------------------------------------------------------------
-// CMmSmsTsy::StoreSmspList
-// This method start storing of new version of the entire list
-// of SMSP entries prosess
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-TInt CMmSmsTsy::StoreSmspList(
- const TTsyReqHandle aTsyReqHandle,
- TDes8* aBuffer )
- {
- TTsyReqHandle storeSmspListHandle =
- iTsyReqHandleStore->GetTsyReqHandle( EMultimodeSmsStoreSmspList );
-
- if ( 0 < storeSmspListHandle )
- {
- // The request is already processing because of previous request.
- // Complete request with status value informing the client about
- // the situation.
- ReqCompleted( aTsyReqHandle, KErrServerBusy );
- }
- else
- {
- iStoreSmspBufferPtr = aBuffer;
- iStoreSmspIndex = 0;
-
- // We must store request handle here and not in ExtFunc-method.
- // If SMSP list is empty we must complete store SMSP list request in
- // ProcessStoreSmspListL-method and then we need request handle.
-#ifdef REQHANDLE_TIMER
- SetTypeOfResponse( EMultimodeSmsStoreSmspList, aTsyReqHandle );
-#else
- iTsyReqHandleStore->SetTsyReqHandle( EMultimodeSmsStoreSmspList,
- aTsyReqHandle );
-#endif // REQHANDLE_TIMER
- CallProcessStoreSmspList();
- }
-
- return KErrNone;
- }
-
-//----------------------------------------------------------------------------
-// CMmSmsTsy::InternalStoreSmspList
-// This method check if there was error while updating last SMSP
-//set. If there was no error it calls CompleteStoreSmspListL- method
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-void CMmSmsTsy::InternalStoreSmspList(
- TInt aError )
- {
- TTsyReqHandle reqHandle = iTsyReqHandleStore->GetTsyReqHandle(
- EMultimodeSmsStoreSmspList );
-
- if ( reqHandle )
- {
- if ( KErrNone == aError )
- {
- // Lets continue storing prosess
- CallProcessStoreSmspList();
- }
- else
- {
- CompleteStoreSmspList( aError );
- }
- }
- }
-
-//----------------------------------------------------------------------------
-// CMmSmsTsy::CallProcessStoreSmspList
-// This method calls ProcessStoreSmspListL-method
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-void CMmSmsTsy::CallProcessStoreSmspList()
- {
- TRAPD ( ret, ProcessStoreSmspListL(); );
- if ( ret != KErrNone )
- {
- CompleteStoreSmspList( ret );
- }
- }
-
-//----------------------------------------------------------------------------
-// CMmSmsTsy::ProcessStoreSmspListL
-// This method gets one SMSP sets from clients list and calls
-// DOS OR completes client's request
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-void CMmSmsTsy::ProcessStoreSmspListL()
- {
- CMobilePhoneSmspList* smspList = CMobilePhoneSmspList::NewL();
- CleanupStack::PushL( smspList );
-
- smspList->RestoreL( *iStoreSmspBufferPtr );
-
- if ( smspList->Enumerate() > iStoreSmspIndex )
- {
- RMobileSmsMessaging::TMobileSmspEntryV1 smsParam;
- CMmDataPackage package;
-
- // Clients SMSP lists first location is 0
- smsParam = smspList->GetEntryL( iStoreSmspIndex );
-
- iStoreSmspIndex++;
-
- // Pack parameters
- package.PackData( &smsParam );
-
- // Lets make new routing request so new CBMI list can be delivered to
- // DOS
- TInt ret = iMmPhone->MessageManager()->HandleRequestL(
- EMobileSmsMessagingStoreSmspList, &package );
-
- if ( KErrNone != ret )
- {
- // Message construction failed or phonet sender
- // returned error. Complete request in CallProsessStoreSmspList
- // method
- CompleteStoreSmspList( ret );
- }
- }
-
- // All SMSP sets have successfully been stored
- else
- {
- // Notify that SMSP set was updated in the store
- CompleteNotifySmspListChange();
-
- // Complete store SMSP list request to the client
- CompleteStoreSmspList( KErrNone );
- }
-
- CleanupStack::PopAndDestroy(); // aSmspList
- }
-
-//----------------------------------------------------------------------------
-// CMmSmsTsy::CompleteStoreSmspList
-// Complete store SMSP list request
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-void CMmSmsTsy::CompleteStoreSmspList(
- TInt aError )
- {
- TTsyReqHandle reqHandle = iTsyReqHandleStore->ResetTsyReqHandle(
- EMultimodeSmsStoreSmspList );
- if ( reqHandle )
- {
- ReqCompleted( reqHandle, aError );
- }
- }
-
-//----------------------------------------------------------------------------
-// CMmSmsTsy::NotifySmspListChange
-// This method activates notifying of SMS Parameter store events
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-TInt CMmSmsTsy::NotifySmspListChange()
- {
- iReqHandleType = EMultimodeSmsNotifySmspListChange;
-
- return KErrNone;
- }
-
-//----------------------------------------------------------------------------
-// CMmSmsTsy::NotifySmspListChangeCancel
-// This method cancels NotifyStoreEventCancel request
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-TInt CMmSmsTsy::NotifySmspListChangeCancel(
- const TTsyReqHandle aTsyReqHandle )
- {
- iTsyReqHandleStore->ResetTsyReqHandle(
- EMultimodeSmsNotifySmspListChange );
- ReqCompleted( aTsyReqHandle, KErrCancel );
-
- return KErrNone;
- }
-
-//----------------------------------------------------------------------------
-// CMmSmsTsy::CompleteNotifySmspListChange
-// This method is called when some of SMS parameter store events happen
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-void CMmSmsTsy::CompleteNotifySmspListChange()
- {
- TTsyReqHandle reqHandle = iTsyReqHandleStore->ResetTsyReqHandle(
- EMultimodeSmsNotifySmspListChange );
- if ( reqHandle )
- {
- ReqCompleted( reqHandle, KErrNone );
- }
- }
-
-//----------------------------------------------------------------------------
-// CMmSmsTsy::GetSmsNumOfLoc
-// Get SMS number of Location on SIM card
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-TInt16 CMmSmsTsy::GetSmsNumOfLoc()
- {
- return static_cast< TInt16 >( iSmsNumOfLoc );
- }
-
-//----------------------------------------------------------------------------
-// CMmSmsTsy::SetSmsNumOfLoc
-// Set SMS number of Location on SIM card to member variable
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-void CMmSmsTsy::SetSmsNumOfLoc(
- TInt aSmsNumOfLoc )
- {
- iSmsNumOfLoc = static_cast< TUint8 >( aSmsNumOfLoc );
- }
-
-//----------------------------------------------------------------------------
-// CMmSmsTsy::GetSmsStorageTsy
-// Returns a pointer to the SMS Storage sub-session
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-CMmSmsStorageTsy* CMmSmsTsy::GetSmsStorageTsy()
- {
- return iMmSmsStorageTsy;
- }
-
-//----------------------------------------------------------------------------
-// CMmSmsTsy::SetSmsStorageTsy
-// Sets a new pointer to the SMS Storage sub-session
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-void CMmSmsTsy::SetSmsStorageTsy(
- CMmSmsStorageTsy* aNewPointer )
- {
- iMmSmsStorageTsy = aNewPointer;
- }
-
-//----------------------------------------------------------------------------
-// CMmSmsTsy::ResetVariables
-// Reset used variables
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-void CMmSmsTsy::ResetVariables()
- {
- // Resets routing activity variable. If routing is active in DOS
- // this parameter is true.
- iServerRoutingActivity = ERoutingNotActivated;
-
- // Resets mobile sms receive mode to EReceiveUnstoredClientAck. Mobile
- // sms receive mode includes the receive mode type.
- iMobileSmsReceiveMode = RMobileSmsMessaging::EReceiveUnstoredClientAck;
-
- // Resets receive mode change notify variables.
- iNotifyReceiveModeChangePtr = NULL;
-
- // Resets receive message variables.
- iReceiveMessagePduPtr = NULL;
- iReceiveMessageParamsPtr = NULL;
-
- // Resets sms bearer notify variables.
- iNotifySmsBearerPtr = NULL;
-
- // Resets send message variables.
- iSendMessageMsgAttrPckgPtr = NULL;
-
- // Resets get message store variables.
- iGetMessageStoreInfoPtr = NULL;
-
- // Resets smsp (sms parameters) variables.
- iRetSMSPSize = NULL;
- iSMSPClientId = NULL;
- iSMSPList = NULL;
-
- // Resets sms storage parameter variables.
- iStoreSmspBufferPtr = NULL;
- iStoreSmspIndex = NULL;
-
- // Resets sms storage tsy variable.
- iMmSmsStorageTsy = NULL;
-
- // Resets SMS stack storage status variables
- iClientStorageFull = EFalse;
-
-
- //Set number of SMS locations on SIM card to 0
- iSmsNumOfLoc = 0;
- }
-
-#ifdef REQHANDLE_TIMER
-//----------------------------------------------------------------------------
-// CMmSmsTsy::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 CMmSmsTsy::SetTypeOfResponse(
- const TInt aReqHandleType,
- const TTsyReqHandle aTsyReqHandle )
- {
- TInt timeOut( 0 );
-
- switch ( aReqHandleType )
- {
- // SMS specific requests
- case EMultimodeSmsAckStored:
- case EMultimodeSmsNackStored:
- timeOut = KMmSmsAckNackMessage;
- break;
- case EMultimodeSmsSendMessage:
- timeOut = KMmSmsSendMessage;
- break;
- case EMultimodeSmsSendMessageNoFdnCheck:
- timeOut = KMmSmsSendMessageNoFdnCheckTimeOut;
- break;
- case EMultimodeSmsSendSatMessage:
- timeOut = KMmSmsSendSatMessage;
- break;
- case EMultimodeSmsResumeReception:
- timeOut = KMmSmsResumeSmsReception;
- break;
- case EMultimodeSmsGetMessageStoreInfo:
- timeOut = KMmSmsGetMessageStoreInfo;
- break;
- case EMultimodeSmsReadSmspListPhase1:
- case EMultimodeSmsStoreSmspList:
- timeOut = KMmSmsReadAndStoreSmspList;
- break;
- // SMS storage specific requests
- case EMultimodeSmsGetInfo:
- timeOut = KMmSimSmsGetInfo;
- break;
- case EMultimodeSimStSmsWriteSms:
- timeOut = KMmSimSmsWriteSms;
- break;
- case EMultimodeSimStSmsReadSms:
- case EMultimodeSimStSmsEraseSms:
- timeOut = KMmSimSmsReadDeleteSms;
- break;
- case EMultimodeSimStSmsEraseAllSms:
- timeOut = KMmSimSmsDeleteAllSms;
- break;
- case EMultimodeSimStSmsReadAllSms:
- timeOut = KMmSimSmsReadAllSms;
- break;
- // Must not use timer:
- // case EMultimodeSmsReceiveMessage:
- // case EMultimodeSmsNotifyReceiveModeChange:
- // case EMultimodeSmsNotifyMoSmsBearerChange:
- // case EMultimodeSmsNotifySmspListChange:
- // case EMultimodeSmsMemoryNotifyStoreEvent:
- 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 );
- }
- }
-
-//----------------------------------------------------------------------------
-// CMmSmsTsy::Complete
-// Completes the request due timer expiration
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-void CMmSmsTsy::Complete(
- TInt aReqHandleType,
- TInt aError )
- {
- // All possible TSY req handle types are listed in the
- // switch case below.
- switch( aReqHandleType )
- {
- // Cases handled with automatic completion
- // SMS specific requests
- case EMultimodeSmsAckStored:
- CompleteAckSmsStored( aError );
- break;
- case EMultimodeSmsNackStored:
- CompleteNackSmsStored( aError );
- break;
- case EMultimodeSmsSendMessage:
- CompleteSendMessage( KErrTimedOut, NULL );
- break;
- case EMultimodeSmsSendMessageNoFdnCheck:
- CompleteSendMessageNoFdnCheck( KErrTimedOut, NULL );
- break;
- case EMultimodeSmsSendSatMessage:
- CompleteSendSatMessage( KErrTimedOut );
- break;
- case EMultimodeSmsResumeReception:
- CompleteResumeSmsReception( aError );
- break;
- case EMultimodeSmsGetMessageStoreInfo:
- CompleteGetMessageStoreInfo( aError, NULL );
- break;
- case EMultimodeSmsReadSmspListPhase1:
- CompleteReadAllSmspPhase1( aError, NULL );
- break;
- case EMultimodeSmsStoreSmspList:
- CompleteStoreSmspList( aError );
- break;
- // SMS storage specific requests
- case EMultimodeSmsGetInfo:
- if ( iMmSmsStorageTsy )
- {
- iMmSmsStorageTsy->CompleteGetInfo( aError, NULL );
- }
- break;
- case EMultimodeSimStSmsReadSms:
- if ( iMmSmsStorageTsy )
- {
- iMmSmsStorageTsy->CompleteReadSms( aError, NULL );
- }
- break;
- case EMultimodeSimStSmsWriteSms:
- if ( iMmSmsStorageTsy )
- {
- iMmSmsStorageTsy->CompleteWriteSms( aError, NULL );
- }
- break;
- case EMultimodeSimStSmsEraseSms:
- if ( iMmSmsStorageTsy )
- {
- iMmSmsStorageTsy->CompleteDeleteSms( aError );
- }
- break;
- case EMultimodeSimStSmsEraseAllSms:
- if ( iMmSmsStorageTsy )
- {
- iMmSmsStorageTsy->CompleteDeleteAllSms( aError );
- }
- break;
- case EMultimodeSimStSmsReadAllSms:
- if ( iMmSmsStorageTsy )
- {
- iMmSmsStorageTsy->CompleteReadAllSmsPhase1( aError, EFalse );
- }
- break;
- // Can't use timer:
- // case EMultimodeSmsReceiveMessage:
- // case EMultimodeSmsNotifyReceiveModeChange:
- // case EMultimodeSmsNotifyMoSmsBearerChange:
- // case EMultimodeSmsNotifySmspListChange:
- // case EMultimodeSmsMemoryNotifyStoreEvent:
- default:
- ReqCompleted( iTsyReqHandleStore->ResetTsyReqHandle(
- aReqHandleType ), aError );
- break;
- }
- }
-
-#endif // REQHANDLE_TIMER
-
-//----------------------------------------------------------------------------
-// CMmSmsTsy::SendSatMessageL
-// SimAtkTsy can send SMS messages to the network by calling this method.
-// This method can leave.
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-TInt CMmSmsTsy::SendSatMessageL(
- CMmPhoneTsy* aMmPhone,
- TDes8* aSmsTpdu,
- TDes16* aScAddress,
- RMobilePhone::TMobileTON* aMobileTON,
- RMobilePhone::TMobileNPI* aMobileNPI,
- TBool aMoreToSend )
- {
- TInt ret( KErrNone );
- // Deliver attributes to message handler by using
- // TMobileSmsSendAttributesV1 class.
- RMobileSmsMessaging::TMobileSmsSendAttributesV1 msgAttrib;
-
- msgAttrib.iFlags = ( RMobileSmsMessaging::KSmsDataFormat |
- RMobileSmsMessaging::KGsmServiceCentre |
- RMobileSmsMessaging::KMoreToSend );
-
- msgAttrib.iDataFormat = RMobileSmsMessaging::EFormatGsmTpdu;
-
- // if service center address length > 20 digits plus "+" sign
- if ( aScAddress->Length() > ( KMaxAmountOfDigits + 1 ) )
- {
- ret = KErrArgument;
- }
- else
- {
- msgAttrib.iGsmServiceCentre.iTelNumber.Copy( *aScAddress );
- msgAttrib.iGsmServiceCentre.iTypeOfNumber = *aMobileTON;
- msgAttrib.iGsmServiceCentre.iNumberPlan = *aMobileNPI;
-
- msgAttrib.iMore = aMoreToSend;
-
- // create package
- CMmDataPackage package;
-
- // structure for all sms parameters and data
- TSendSmsDataAndAttributes sendData;
-
- sendData.iAttributes = &msgAttrib;
- sendData.iMsgData = aSmsTpdu;
- sendData.iIpc = EMmTsySmsSendSatMessage;
-
- // Pack parameters
- package.PackData( &sendData );
-
- // send request to DOS
- ret = aMmPhone->MessageManager()->HandleRequestL(
- EMmTsySmsSendSatMessage, &package );
-
- if ( KErrNone == ret )
- {
- iReqHandleType = EMultimodeSmsSendSatMessage;
- }
- }
-
- return ret;
- }
-
-//----------------------------------------------------------------------------
-// CMmSmsTsy::ResendSms
-// Resends unsent message which is stored in iSmsSendReq
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-void CMmSmsTsy::ResendSms()
- {
- if ( NULL != iSmsSendReq )
- {
- // Create package
- CMmDataPackage package;
-
- // structure for all sms parameters and data
- TSendSmsDataAndAttributes sendData =
- iSmsSendReq->GetSmsDataAndAttributes();
-
- // Pack parameters
- package.PackData( &sendData );
-
- // send request to DOS
- TInt ret = KErrNone;
- TRAPD( trapError, ret = iMmPhone->MessageManager()->HandleRequestL(
- sendData.iIpc, &package ); );
-
- if ( ( KErrNone != ret ) || ( KErrNone != trapError ) )
- {
- delete iSmsSendReq; // Delete object
- iSmsSendReq = NULL; // Reset pointer
-
- // Response for send SMS request
- if ( EMobileSmsMessagingSendMessage == sendData.iIpc )
- {
- iSmsNoFdnCheckFlag = ESmsNoFdnCheckNotUsed;
- CompleteSendMessage( KErrGeneral, NULL );
- }
- // Response for send SAT SMS request
- else if ( EMmTsySmsSendSatMessage == sendData.iIpc )
- {
- CompleteSendSatMessage( KErrGeneral );
- }
- // Response for send SMS NoFdnCheck request
- else if ( EMobileSmsMessagingSendMessageNoFdnCheck ==
- sendData.iIpc )
- {
- iSmsNoFdnCheckFlag = ESmsNoFdnCheckUsed;
-TFLOGSTRING2("TSY: CMmSmsTsy::ResendSms. EMobileSmsMessagingSendMessageNoFdnCheck: %d", sendData.iIpc);
- CompleteSendMessageNoFdnCheck( KErrGeneral, NULL );
- }
- }
- else
- {
- iSmsSendReq->IncreaseSendCounter();
- }
- }
- }
-
-// ---------------------------------------------------------------------------
-// CMmSmsTsy::IsRequestPossibleInOffLine
-// Checks wether a ETel request can be performed or not while offline mode is
-// enabled
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-TBool CMmSmsTsy::IsRequestPossibleInOffline( TInt aIpc ) const
- {
- TBool isRequestPossible ( ETrue );
- switch ( aIpc )
- {
- case EMobileSmsMessagingSendMessage: //NO
- case EMobileSmsMessagingSendMessageNoFdnCheck: //NO
- isRequestPossible = EFalse;
- break;
- // case EMobileSmsMessagingSetReceiveMode:
- // case EMobileSmsMessagingNotifyReceiveModeChange:
- // case EMobileSmsMessagingReceiveMessage:
- // case EMobileSmsMessagingAckSmsStored:
- // case EMobileSmsMessagingNackSmsStored:
- // case EMobileSmsMessagingResumeSmsReception: //request is possible
- //(will be delayed
- // and sent later, see
- // ResumeSmsReception)
- // case EMobileSmsMessagingNotifyMoSmsBearerChange:
- // case EMobileSmsMessagingGetMessageStoreInfo:
- // case EMobileSmsMessagingGetSmspListPhase1:
- // case EMobileSmsMessagingNotifySmspListChange:
- // case EMobileSmsMessagingStoreSmspList:
- default:
- break;
- }
-
- return isRequestPossible;
- }
-
-// ---------------------------------------------------------------------------
-// CMmSmsTsy::SendMessageNoFdnCheckCancel
-// Cancels SendMessageNoFdnCheck request.
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-TInt CMmSmsTsy::SendMessageNoFdnCheckCancel(
- const TTsyReqHandle aTsyReqHandle )
- {
-TFLOGSTRING("TSY: CMmSmsTsy::SendMessageNoFdnCheckCancel" );
- // Reset req handle. Returns the deleted req handle
- TTsyReqHandle reqHandle = iTsyReqHandleStore->ResetTsyReqHandle(
- EMultimodeSmsSendMessageNoFdnCheck );
-
- if ( EMultimodeSmsReqHandleUnknown < reqHandle )
- {
- ReqCompleted( aTsyReqHandle, KErrCancel );
-
- iSmsNoFdnCheckFlag = ESmsNoFdnCheckUnknown;
- }
-
- return KErrNone;
- }
-
-//----------------------------------------------------------------------------
-// CMmSmsTsy::CompleteSendMessageNoFdnCheck
-// Complete SendMessage request
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-void CMmSmsTsy::CompleteSendMessageNoFdnCheck(
- TInt aError,
- CMmDataPackage* aDataPackage )
- {
- if ( ( KErrNone != aError ) && ( KErrTimedOut != aError )
- && ( KErrGsmSMSOperationNotAllowed !=
- CMmCommonStaticUtility::ExtendedErrorCode ( aError ) )
- // FDB check failed
- && ( KErrGsmSMSUnspecifiedProtocolError !=
- CMmCommonStaticUtility::ExtendedErrorCode ( aError ) )
- && ( KErrSatControl !=
- CMmCommonStaticUtility::ExtendedErrorCode ( aError ) )
- && ( !( iMmPhone->GetSatMessaging() &&
- iMmPhone->GetSatMessaging()->IsMoSmControlBySimActivated() ) )
- && ( NULL != iSmsSendReq ) && ( 2 >=
- iSmsSendReq->GetSendCounter() ) )
- {
- // DOS returned error to send request. Message might be tried to be
- // resent (see method ResendSms).
- // Timeout mechanism cannot access this part of code, ever.
-TFLOGSTRING2("TSY: CMmSmsTsy::CompleteSendMessageNoFdnCheck. Resend counter: %d", iSmsSendReq->GetSendCounter());
- }
- else
- {
- // This is executed
- // - if sending was successful
- // - if there are no more resending attempts
- // - if timer expires (called from the Complete of CMmSmsTsy class)
-
- // Delete send message entry from send array
- if ( iSmsSendReq )
- {
- delete iSmsSendReq; // Delete object
- iSmsSendReq = NULL; // Reset pointer
- }
-
- // reset req handle and complete request
- TTsyReqHandle reqHandle = iTsyReqHandleStore->
- ResetTsyReqHandle( EMultimodeSmsSendMessageNoFdnCheck );
-
- if ( EMultimodeSmsReqHandleUnknown < reqHandle )
- {
- // get values only if there was no error, and if return pointer to
- // client is available
- if ( KErrNone == aError && iSendMessageMsgAttrPckgPtr )
- {
- TInt16 msgRef( 0 );
- TBuf8<RMobileSmsMessaging::KGsmTpduSize> smsMsg;
-
- aDataPackage->UnPackData( msgRef, smsMsg );
-
- RMobileSmsMessaging::TMobileSmsSendAttributesV1Pckg* attsPckg =
- reinterpret_cast<
- RMobileSmsMessaging::TMobileSmsSendAttributesV1Pckg* >(
- iSendMessageMsgAttrPckgPtr );
- RMobileSmsMessaging::TMobileSmsSendAttributesV1& msgAttr =
- ( *attsPckg )();
-
- msgAttr.iFlags = RMobileSmsMessaging::KMessageReference;
- msgAttr.iMsgRef = static_cast< TUint16 >( msgRef );
-
- if ( NULL != smsMsg.Length() )
- {
- msgAttr.iSubmitReport.Copy(smsMsg);
- msgAttr.iFlags |= RMobileSmsMessaging::KGsmSubmitReport;
- }
- }
-
- ReqCompleted( reqHandle, aError );
- // reset pointer to client memory
- iSendMessageMsgAttrPckgPtr = NULL;
-
- iSmsNoFdnCheckFlag = ESmsNoFdnCheckUnknown;
- }
- }
-
- // Resend unsent message
- ResendSms();
- }
-
-
-// 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 "cmmsmstsy.h"
+#include "cmmphonetsy.h"
+#include "cmmsmsstoragetsy.h"
+#include "cmmsmsgsmext.h"
+#include "cmmtsyreqhandlestore.h"
+#include <ctsy/serviceapi/mmtsy_ipcdefs.h>
+#include "MmTsy_numberOfSlots.h"
+#include <ctsy/serviceapi/cmmsmsutility.h>
+#include "cmmsmssendrequest.h"
+#include <ctsy/serviceapi/mstktsysatservice.h>
+#include "CMmCommonStaticUtility.h"
+#include <ctsy/serviceapi/gsmerror.h>
+#include <ctsy/pluginapi/cmmdatapackage.h>
+#include <etelsat.h> // for Sat MO SM Control error values
+
+
+// ======== MEMBER FUNCTIONS ========
+
+CMmSmsTsy::CMmSmsTsy():
+ iReqHandleType(EMultimodeSmsReqHandleUnknown)
+ {
+TFLOGSTRING("TSY: CMmSmsTsy::CMmSmsTsy: constructor");
+ }
+
+void CMmSmsTsy::ConstructL()
+ {
+TFLOGSTRING("TSY: CMmSmsTsy::ConstructL");
+#ifdef REQHANDLE_TIMER
+ //create req handle store
+ iTsyReqHandleStore = CMmTsyReqHandleStore::NewL( this, iMmPhone,
+ EMultimodeSmsMaxNumOfRequests, iSmsReqHandles );
+#else
+ // create req handle store
+ iTsyReqHandleStore = CMmTsyReqHandleStore::NewL(
+ EMultimodeSmsMaxNumOfRequests, iSmsReqHandles );
+#endif // REQHANDLE_TIMER
+
+ // Reset all CMmSmsTsy variables
+ ResetVariables();
+
+ // SMS message array
+ iSmsMsgArray = new ( ELeave ) CArrayPtrFlat<TSmsMsg>( 1 );
+
+ // Create GSM mode SMS extension
+ iMmSmsExtInterface = CMmSmsGsmExt::NewL();
+
+
+ // register sms tsy in the message manager
+ iMmPhone->MessageManager()->RegisterTsyObject(
+ CMmMessageManagerBase::ESmsMessagingTsy, this );
+
+ // at startup, there is no pending Send request
+ iSmsSendReq = NULL;
+
+ // Initialise off-line/on-line mode variable with information
+ // from PhoneTsy. After object construction, this information
+ // will be updated using DOS indications.
+ TRfStateInfo phoneRfInfo = iMmPhone->GetRfStateInfo();
+ if ( ERfsStateInfoInactive == phoneRfInfo )
+ {
+ iIsOffline = ETrue;
+ }
+ else
+ {
+ iIsOffline = EFalse;
+ }
+TFLOGSTRING2("TSY: CMmSmsTsy::ConstructL: iIsOffline has been initialised to %d", iIsOffline);
+
+ // there's no pending ResumeSmsReception request at startup
+ iResumeSmsReceptionPending = EFalse;
+
+ // Initialization for sms NoFdnCheck
+ iSmsNoFdnCheckFlag = ESmsNoFdnCheckUnknown;
+
+ iExpectAckOrNack = 0;
+
+ }
+
+CMmSmsTsy* CMmSmsTsy::NewL(
+ CMmPhoneTsy* aMmPhone )
+ {
+ CMmSmsTsy* aMmSmsTsy = new ( ELeave ) CMmSmsTsy();
+ CleanupClosePushL(*aMmSmsTsy);
+ aMmSmsTsy->iMmPhone = aMmPhone;
+ aMmSmsTsy->ConstructL();
+ CleanupStack::Pop();
+
+ return aMmSmsTsy;
+ }
+
+CMmSmsTsy::~CMmSmsTsy()
+ {
+TFLOGSTRING("TSY: CMmSmsTsy::~CMmSmsTsy");
+ if ( iMmPhone )
+ {
+ // deregister tsy object from message manager
+ iMmPhone->MessageManager()->DeregisterTsyObject(this);
+
+ // Release the SMS routing from DOS to TSY.
+ // Send request to the Domestic OS layer. Ignore if it leaves
+ TInt trapError = KErrNone;
+ TRAP( trapError, iMmPhone->MessageManager()->HandleRequestL(
+ EMmTsyDeactivateSmsRouting ); );
+ }
+
+ // try to complete send sms message.
+ if ( iTsySatMessaging )
+ {
+ iTsySatMessaging->CompleteSendSmsMessage( KErrAccessDenied );
+ }
+
+ if ( iTsyReqHandleStore )
+ {
+ delete iTsyReqHandleStore;
+ iTsyReqHandleStore = NULL;
+ }
+
+ if ( iSmsMsgArray )
+ {
+ iSmsMsgArray->ResetAndDestroy();
+ delete iSmsMsgArray;
+ iSmsMsgArray = NULL;
+ }
+
+ // Delete extension object
+ if ( iMmSmsExtInterface )
+ {
+ delete iMmSmsExtInterface;
+ iMmSmsExtInterface = NULL;
+ }
+
+ if ( iMmPhone )
+ {
+ iMmPhone->SetSmsSession( NULL );
+ iMmPhone = NULL;
+ }
+
+ if ( iSmsSendReq )
+ {
+ delete iSmsSendReq;
+ iSmsSendReq = NULL;
+ }
+
+ if ( iSMSPClientId )
+ {
+ delete iSMSPClientId;
+ iSMSPClientId = NULL;
+ }
+
+ // set pointers to NULL
+ iMmSmsStorageTsy = NULL;
+ iTsySatMessaging = NULL;
+ iNotifyReceiveModeChangePtr = NULL;
+ iReceiveMessageParamsPtr = NULL;
+ iReceiveMessagePduPtr = NULL;
+ iNotifySmsBearerPtr = NULL;
+ iSendMessageMsgAttrPckgPtr = NULL;
+ iGetMessageStoreInfoPtr = NULL;
+ iStoreSmspBufferPtr = NULL;
+ }
+
+// ---------------------------------------------------------------------------
+// CMmSmsTsy::Init
+// Initialisation method that is called from ETel Server
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+void CMmSmsTsy::Init()
+ {
+ }
+
+// ---------------------------------------------------------------------------
+// CMmSmsTsy::OpenNewObjectByNameL
+// Creates new object and returns a pointer to it
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+CTelObject* CMmSmsTsy::OpenNewObjectByNameL(
+ const TDesC& aName )
+ {
+ if ( aName.Compare( KETelIccSmsStore ) == KErrNone )
+ {
+ iMmSmsStorageTsy = CMmSmsStorageTsy::NewL( this, iMmPhone,
+ iMmSmsExtInterface, iTsyReqHandleStore );
+
+ return iMmSmsStorageTsy;
+ }
+
+ // ME memory (KETelMeSmsStore) and combined memory (KETelCombinedSmsStore)
+ // are not supported
+ User::Leave( KErrNotSupported );
+ //lint -e{527} "unreachable code"
+
+ return NULL;
+ }
+
+// ---------------------------------------------------------------------------
+// CMmSmsTsy::OpenNewObjectL
+// Creates new object and returns a pointer to it
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+CTelObject* CMmSmsTsy::OpenNewObjectL(
+ TDes& /*aNewName*/ )
+ {
+ // Not supported
+ User::Leave( KErrNotSupported );
+ //lint -e{527} "unreachable code"
+
+ return NULL;
+ }
+
+// ---------------------------------------------------------------------------
+// CMmSmsTsy::ExtFunc
+// ExtFunc is called by the server when it has a "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 CMmSmsTsy::ExtFunc(
+ const TTsyReqHandle aTsyReqHandle,
+ const TInt aIpc,
+ const TDataPackage& aPackage )
+ {
+ TAny* dataPtr = aPackage.Ptr1();
+ TInt ret( 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 );
+ TInt error = CMmCommonStaticUtility::EpocErrorCode( KErrGeneral,
+ KErrGsmOfflineOpNotAllowed );
+
+ // Complete the request with appropiate error
+ ReqCompleted ( aTsyReqHandle, error );
+ }
+ else
+ {
+ switch ( aIpc )
+ {
+ // SMS messaging requests that doesn't need trapping
+ case EMobileSmsMessagingGetCaps:
+ ret = GetCaps( aTsyReqHandle, aPackage.Des1n() );
+ break;
+ case EMobileSmsMessagingGetReceiveMode:
+ ret = GetReceiveMode( aTsyReqHandle, reinterpret_cast<
+ RMobileSmsMessaging::TMobileSmsReceiveMode* >( dataPtr ) );
+ break;
+ case EMobileSmsMessagingGetMoSmsBearer:
+ ret = GetMoSmsBearer( aTsyReqHandle, reinterpret_cast<
+ RMobileSmsMessaging::TMobileSmsBearer* >( dataPtr) );
+ break;
+ case EMobileSmsMessagingSetMoSmsBearer:
+ ret = SetMoSmsBearer( aTsyReqHandle, reinterpret_cast<
+ RMobileSmsMessaging::TMobileSmsBearer*>( dataPtr) );
+ break;
+ case EMobileSmsMessagingEnumerateMessageStores:
+ ret = EnumerateMessageStores( aTsyReqHandle,
+ reinterpret_cast< TInt* >( dataPtr ) );
+ break;
+ case EMobileSmsMessagingGetSmspListPhase2:
+ ret = ReadSmspListPhase2( aTsyReqHandle, reinterpret_cast<
+ RMobilePhone::TClientId*>( dataPtr ), aPackage.Des2n() );
+ break;
+ // SMS messaging requests that need trapping
+ default:
+ // Ensure the ReqHandleType is unset.
+ // This will detect cases where this method indirectly calls itself
+ // (e.g. servicing a client call that causes a self-reposting notification to complete and thus repost).
+ // Such cases are not supported because iReqHandleType is in the context of this class instance,
+ // not this request, and we don't want the values set by the inner request and the outer request
+ // interfering with each other.
+ __ASSERT_DEBUG(iReqHandleType==EMultimodeSmsReqHandleUnknown, User::Invariant());
+
+ TInt leaveCode( KErrNone );
+ TRAP( leaveCode, ret = DoExtFuncL( aTsyReqHandle, aIpc,
+ aPackage ); );
+
+ if ( KErrNone != leaveCode )
+ {
+TFLOGSTRING3("CMmSmsTsy: Leave trapped!, IPC=%d, error value:%d", aIpc, leaveCode );
+ ReqCompleted( aTsyReqHandle, leaveCode );
+ }
+
+ //save request handle
+ if ( EMultimodeSmsReqHandleUnknown != iReqHandleType )
+ {
+#ifdef REQHANDLE_TIMER
+ SetTypeOfResponse( iReqHandleType, aTsyReqHandle );
+#else
+ //Never comes here. See SetTypeOfResponse.
+ iTsyReqHandleStore->SetTsyReqHandle( iReqHandleType,
+ aTsyReqHandle );
+#endif // REQHANDLE_TIMER
+ // We've finished with this value now. Clear it so it doesn't leak
+ // up to any other instances of this method down the call stack
+ iReqHandleType = EMultimodeSmsReqHandleUnknown;
+ }
+ break;
+ }
+ }
+
+ return ret;
+ }
+
+// ---------------------------------------------------------------------------
+// CMmSmsTsy::DoExtFuncL
+// DoExtFuncL calls messaging methods that can leave
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+TInt CMmSmsTsy::DoExtFuncL(
+ const TTsyReqHandle aTsyReqHandle,
+ const TInt aIpc,
+ const TDataPackage& aPackage )
+ {
+ TAny* dataPtr = aPackage.Ptr1();
+ TAny* dataPtr2 = aPackage.Ptr2();
+
+ TInt ret( KErrNone );
+
+ switch ( aIpc )
+ {
+ // SMS messaging requests
+ case EMobileSmsMessagingSetReceiveMode:
+ ret = SetReceiveMode( aTsyReqHandle, reinterpret_cast<
+ RMobileSmsMessaging::TMobileSmsReceiveMode* >( dataPtr ) );
+ break;
+ case EMobileSmsMessagingNotifyReceiveModeChange:
+ ret = NotifyReceiveModeChange( reinterpret_cast<
+ RMobileSmsMessaging::TMobileSmsReceiveMode*>( dataPtr) );
+ break;
+ case EMobileSmsMessagingReceiveMessage:
+ ret = ReceiveMessageL( aTsyReqHandle, aPackage.Des1n(),
+ aPackage.Des2n() );
+ break;
+ case EMobileSmsMessagingAckSmsStored:
+ ret = AckSmsStoredL( aTsyReqHandle, aPackage.Des1n(),
+ reinterpret_cast< TBool* >( dataPtr2 ) );
+ break;
+ case EMobileSmsMessagingNackSmsStored:
+ ret = NackSmsStoredL( aTsyReqHandle, aPackage.Des1n(),
+ reinterpret_cast< TInt* >( dataPtr2 ) );
+ break;
+ case EMobileSmsMessagingResumeSmsReception:
+ ret = ResumeSmsReceptionL( aTsyReqHandle );
+ break;
+ case EMobileSmsMessagingNotifyMoSmsBearerChange:
+ ret = NotifyMoSmsBearerChange( reinterpret_cast<
+ RMobileSmsMessaging::TMobileSmsBearer*> ( dataPtr ) );
+ break;
+ case EMobileSmsMessagingSendMessage:
+ {
+ iSmsNoFdnCheckFlag = ESmsNoFdnCheckNotUsed;
+ ret = SendMessageL( aTsyReqHandle, aPackage.Des1n(),
+ aPackage.Des2n() );
+ }
+ break;
+ case EMobileSmsMessagingSendMessageNoFdnCheck:
+ {
+ iSmsNoFdnCheckFlag = ESmsNoFdnCheckUsed;
+ ret = SendMessageL( aTsyReqHandle, aPackage.Des1n(),
+ aPackage.Des2n() );
+ }
+ break;
+ case EMobileSmsMessagingGetMessageStoreInfo:
+ ret = GetMessageStoreInfoL( aTsyReqHandle,
+ reinterpret_cast< TInt* >( dataPtr ), aPackage.Des2n() );
+ break;
+ case EMobileSmsMessagingGetSmspListPhase1:
+ ret = ReadSmspListPhase1L( aTsyReqHandle,
+ reinterpret_cast< RMobilePhone::TClientId*>( dataPtr ),
+ reinterpret_cast< TInt* >( dataPtr2 ) );
+ break;
+ case EMobileSmsMessagingNotifySmspListChange:
+ ret = NotifySmspListChange();
+ break;
+ case EMobileSmsMessagingStoreSmspList:
+ ret = StoreSmspList( aTsyReqHandle, aPackage.Des1n() );
+ break;
+ default:
+ ret = KErrNotSupported;
+ break;
+ }
+
+ return ret;
+ }
+
+// ---------------------------------------------------------------------------
+// CMmSmsTsy::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
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+CTelObject::TReqMode CMmSmsTsy::ReqModeL(
+ const TInt aIpc )
+ {
+ CTelObject::TReqMode ret = 0;
+ switch ( aIpc )
+ {
+ // Non-flow Controlled Services
+ case EMobileSmsMessagingGetCaps:
+ case EMobileSmsMessagingGetMoSmsBearer:
+ case EMobileSmsMessagingSetMoSmsBearer:
+ case EMobileSmsMessagingGetReceiveMode:
+ case EMobileSmsMessagingEnumerateMessageStores:
+ case EMobileSmsMessagingGetSmspListPhase2:
+ case EMobileSmsMessagingAckSmsStored:
+ case EMobileSmsMessagingNackSmsStored:
+ case EMobileSmsMessagingSendMessage:
+ case EMobileSmsMessagingSendMessageNoFdnCheck:
+ case EMobileSmsMessagingResumeSmsReception:
+ case EMobileSmsMessagingGetMessageStoreInfo:
+ case EMobileSmsMessagingGetSmspListPhase1:
+ case EMobileSmsMessagingStoreSmspList:
+ case EMobileSmsMessagingSetReceiveMode:
+ break;
+ // Immediate Server Repost - but not multiple completion enabled
+ case EMobileSmsMessagingReceiveMessage:
+ ret = KReqModeRePostImmediately;
+ break;
+ // Multiple Completion Services with Immediate Server Repost
+ case EMobileSmsMessagingNotifyReceiveModeChange:
+ case EMobileSmsMessagingNotifyMoSmsBearerChange:
+ case EMobileSmsMessagingNotifySmspListChange:
+ ret = KReqModeMultipleCompletionEnabled |
+ KReqModeRePostImmediately;
+ break;
+ default:
+ User::Leave( KErrNotSupported );
+ break;
+ }
+
+ return ret;
+ }
+
+//----------------------------------------------------------------------------
+// CMmSmsTsy::NumberOfSlotsL
+// When the ETel server discovers that a request is "repost
+// immediately" it will ask the TSY how big a buffer it wants.
+// NumberOfSlotsL Returns number of slots to be used for given requests
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+TInt CMmSmsTsy::NumberOfSlotsL(
+ const TInt aIpc )
+ {
+ TInt numberOfSlots = 1;
+ switch ( aIpc )
+ {
+ case EMobileSmsMessagingReceiveMessage:
+ numberOfSlots = KMmSmsMessagingReceiveMessageSlots;
+ break;
+ // It is safer that normal notification trigger value is three
+ // => Slotlimits are defined according to the requirements of
+ // environment, five for messagereception and three for normal
+ // notifications
+ case EMobileSmsMessagingNotifyReceiveModeChange:
+ numberOfSlots = KMmSmsMessagingNotifyReceiveModeChangeSlots;
+ break;
+ case EMobileSmsMessagingNotifyMoSmsBearerChange:
+ numberOfSlots = KMmSmsMessagingNotifyMoSmsBearerChangeSlots;
+ break;
+ case EMobileSmsMessagingNotifySmspListChange:
+ numberOfSlots = KMmSmsMessagingNotifySmspListChangeSlots;
+ break;
+ default:
+ User::Leave( KErrNotSupported );
+ break;
+ }
+
+ return numberOfSlots;
+ }
+
+//----------------------------------------------------------------------------
+// CMmSmsTsy::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 on
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+TInt CMmSmsTsy::CancelService(
+ const TInt aIpc,
+ const TTsyReqHandle aTsyReqHandle )
+ {
+ TInt ret( KErrNone );
+
+ switch ( aIpc )
+ {
+ case EMobileSmsMessagingSetReceiveMode:
+ ret = SetReceiveModeCancel( aTsyReqHandle );
+ break;
+ case EMobileSmsMessagingNotifyReceiveModeChange:
+ ret = NotifyReceiveModeChangeCancel( aTsyReqHandle );
+ break;
+ case EMobileSmsMessagingSetMoSmsBearer:
+ ret = SetMoSmsBearerCancel( aTsyReqHandle );
+ break;
+ case EMobileSmsMessagingNotifyMoSmsBearerChange:
+ ret = NotifyMoSmsBearerChangeCancel( aTsyReqHandle );
+ break;
+ case EMobileSmsMessagingGetMessageStoreInfo:
+ ret = GetMessageStoreInfoCancel( aTsyReqHandle );
+ break;
+ case EMobileSmsMessagingGetSmspListPhase1:
+ case EMobileSmsMessagingGetSmspListPhase2:
+ ret = ReadAllSmspCancel( aTsyReqHandle );
+ break;
+ case EMobileSmsMessagingNotifySmspListChange:
+ ret = NotifySmspListChangeCancel( aTsyReqHandle );
+ break;
+ case EMobileSmsMessagingSendMessage:
+ case EMobileSmsMessagingAckSmsStored:
+ case EMobileSmsMessagingNackSmsStored:
+ case EMobileSmsMessagingResumeSmsReception:
+ case EMobileSmsMessagingStoreSmspList:
+ break;
+ case EMobileSmsMessagingReceiveMessage:
+ ret = ReceiveMessageCancel( aTsyReqHandle );
+ break;
+ case EMobileSmsMessagingSendMessageNoFdnCheck:
+ ret = SendMessageNoFdnCheckCancel( aTsyReqHandle );
+ break;
+ default:
+ ret = KErrGeneral;
+ break;
+ }
+
+ return ret;
+ }
+
+//----------------------------------------------------------------------------
+// CMmSmsTsy::RegisterNotification
+// 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 CMmSmsTsy::RegisterNotification(
+ const TInt aIpc )
+ {
+ TInt ret( KErrNotSupported );
+
+ switch ( aIpc )
+ {
+ case EMobileSmsMessagingReceiveMessage:
+ case EMobileSmsMessagingNotifyReceiveModeChange:
+ case EMobileSmsMessagingNotifyMoSmsBearerChange:
+ case EMobileSmsMessagingNotifySmspListChange:
+ ret = KErrNone;
+ break;
+ default:
+ ret = KErrNotSupported;
+ }
+
+ return ret;
+ }
+
+//----------------------------------------------------------------------------
+// CMmSmsTsy::DeregisterNotification
+// 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 the DOS
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+TInt CMmSmsTsy::DeregisterNotification(
+ const TInt aIpc )
+ {
+ TInt ret( KErrNotSupported );
+
+ switch ( aIpc )
+ {
+ case EMobileSmsMessagingReceiveMessage:
+ case EMobileSmsMessagingNotifyReceiveModeChange:
+ case EMobileSmsMessagingNotifyMoSmsBearerChange:
+ case EMobileSmsMessagingNotifySmspListChange:
+ ret = KErrNone;
+ break;
+ default:
+ ret = KErrNotSupported;
+ }
+
+ return ret;
+ }
+
+//----------------------------------------------------------------------------
+// CMmSmsTsy::GetCaps
+// This method returns SMS messaging capabilities of the phone
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+TInt CMmSmsTsy::GetCaps(
+ const TTsyReqHandle aTsyReqHandle,
+ TDes8* aCaps )
+ {
+ if(sizeof(RMobileSmsMessaging::TMobileSmsCapsV1) > aCaps->Size())
+ {
+ return KErrArgument;
+ }
+
+ RMobileSmsMessaging::TMobileSmsCapsV1Pckg* smsCapsPckg =
+ reinterpret_cast< RMobileSmsMessaging::TMobileSmsCapsV1Pckg* >( aCaps );
+ RMobileSmsMessaging::TMobileSmsCapsV1& smsCaps = ( *smsCapsPckg )();
+
+ // Capabilities depend on the TSY implementation.
+ smsCaps.iSmsMode = KSmsGsmModeCaps;
+ smsCaps.iSmsControl = KSmsControlCaps;
+
+ ReqCompleted( aTsyReqHandle, KErrNone );
+
+ return KErrNone;
+ }
+
+//----------------------------------------------------------------------------
+// CMmSmsTsy::GetReceiveMode
+// This method retrieves the current setting of the TSY-phone
+// incoming SMS receive mode
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+TInt CMmSmsTsy::GetReceiveMode(
+ const TTsyReqHandle aTsyReqHandle,
+ RMobileSmsMessaging::TMobileSmsReceiveMode* aReceiveMode )
+ {
+ *aReceiveMode = iMobileSmsReceiveMode;
+
+ ReqCompleted( aTsyReqHandle, KErrNone );
+
+ return KErrNone;
+ }
+
+//----------------------------------------------------------------------------
+// CMmSmsTsy::SetReceiveMode
+// This method sets the setting of the TSY-phone incoming SMS receive mode
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+TInt CMmSmsTsy::SetReceiveMode(
+ const TTsyReqHandle aTsyReqHandle,
+ RMobileSmsMessaging::TMobileSmsReceiveMode const* aReceiveMode )
+ {
+ if ( RMobileSmsMessaging::EReceiveUnstoredClientAck == *aReceiveMode )
+ {
+ iMobileSmsReceiveMode = *aReceiveMode;
+
+ CompleteNotifyReceiveModeChange();
+
+ ReqCompleted( aTsyReqHandle, KErrNone );
+ }
+ else
+ {
+ // EReceiveModeUnspecified, EReceiveStored, EReceiveUnstoredPhoneAck &
+ // EReceiveAny modes not supported because of CS functionality.
+ ReqCompleted( aTsyReqHandle, KErrNotSupported );
+ }
+
+ return KErrNone;
+ }
+
+//----------------------------------------------------------------------------
+// CMmSmsTsy::SetReceiveModeCancel
+// This method is used to cancel the outstanding asynchronous
+// SetReceiveMode request
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+TInt CMmSmsTsy::SetReceiveModeCancel(
+ const TTsyReqHandle aTsyReqHandle )
+ {
+ ReqCompleted( aTsyReqHandle, KErrCancel );
+
+ return KErrNone;
+ }
+
+//----------------------------------------------------------------------------
+// CMmSmsTsy::NotifyReceiveModeChange
+// This method is used to notify the client if there is a
+// change to the receive mode setting
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+TInt CMmSmsTsy::NotifyReceiveModeChange(
+ RMobileSmsMessaging::TMobileSmsReceiveMode* aReceiveMode )
+ {
+ iReqHandleType = EMultimodeSmsNotifyReceiveModeChange;
+ iNotifyReceiveModeChangePtr = aReceiveMode;
+
+ return KErrNone;
+ }
+
+//----------------------------------------------------------------------------
+// CMmSmsTsy::NotifyReceiveModeChangeCancel
+// This method cancel notify receive mode change request
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+TInt CMmSmsTsy::NotifyReceiveModeChangeCancel(
+ const TTsyReqHandle aTsyReqHandle )
+ {
+ iTsyReqHandleStore->ResetTsyReqHandle(
+ EMultimodeSmsNotifyReceiveModeChange );
+ ReqCompleted( aTsyReqHandle, KErrCancel );
+ iNotifyReceiveModeChangePtr = NULL;
+
+ return KErrNone;
+ }
+
+//----------------------------------------------------------------------------
+// CMmSmsTsy::CompleteNotifyReceiveModeChange
+// This method completes notify receive mode change request
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+void CMmSmsTsy::CompleteNotifyReceiveModeChange()
+ {
+ TTsyReqHandle reqHandle = iTsyReqHandleStore->ResetTsyReqHandle(
+ EMultimodeSmsNotifyReceiveModeChange );
+
+ if ( reqHandle )
+ {
+ if ( iNotifyReceiveModeChangePtr )
+ {
+ *iNotifyReceiveModeChangePtr = iMobileSmsReceiveMode;
+ }
+ ReqCompleted( reqHandle, KErrNone );
+ }
+ }
+
+//----------------------------------------------------------------------------
+// CMmSmsTsy::ReceiveMessageL
+// This method starts the reception of incoming unstored SMS
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+TInt CMmSmsTsy::ReceiveMessageL(
+ const TTsyReqHandle aTsyReqHandle,
+ TDes8* aMsgData,
+ TDes8* aMsgAttributes )
+ {
+TFLOGSTRING("TSY: CMmSmsTsy::ReceiveMessageL\n");
+
+ if(sizeof(RMobileSmsMessaging::TMobileSmsReceiveAttributesV1) > aMsgAttributes->Size())
+ {
+ return KErrArgument;
+ }
+
+ iReceiveMessagePduPtr = aMsgData;
+ iReceiveMessageParamsPtr = aMsgAttributes;
+
+ if ( iMmPhone->IsModemStatusReady() )
+ {
+ // activate smsrouting only when modem status is ready
+ ActivateSmsRoutingL();
+ }
+
+ // Store request handle here. DeliverClass2ToSmsStack-method may complete
+ // ReceiveMessage request
+#ifdef REQHANDLE_TIMER
+ SetTypeOfResponse( EMultimodeSmsReceiveMessage, aTsyReqHandle );
+#else
+ iTsyReqHandleStore->SetTsyReqHandle(
+ EMultimodeSmsReceiveMessage, aTsyReqHandle );
+#endif // REQHANDLE_TIMER
+
+ // Check if there is class 2 messages waiting in TSY's internal memory.
+ DeliverClass2ToSmsStack();
+
+ return KErrNone;
+ }
+
+//----------------------------------------------------------------------------
+// CMmSmsTsy::ReceiveMessageCancel
+// This method cancels an MT message routing to the SMS
+// stack. TSY can not stop routing from SMS server because
+// otherwise SMS server routes incoming messages to SIM server.
+// Negative acknowledgement is sent to the network if message
+// comes when SMS stack routing is not activated
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+TInt CMmSmsTsy::ReceiveMessageCancel(
+ const TTsyReqHandle aTsyReqHandle )
+ {
+ iTsyReqHandleStore->ResetTsyReqHandle( EMultimodeSmsReceiveMessage );
+
+ ReqCompleted( aTsyReqHandle, KErrCancel );
+
+ return KErrNone;
+ }
+
+//----------------------------------------------------------------------------
+// CMmSmsTsy::ActivateSmsRoutingL
+// Activate SMS routing
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+void CMmSmsTsy::ActivateSmsRoutingL()
+ {
+ if ( ( ERoutingNotActivated == iServerRoutingActivity ) ||
+ ( ERoutingActivating == iServerRoutingActivity ) )
+ {
+ //Send request to the Domestic OS layer..
+ User::LeaveIfError( iMmPhone->MessageManager()->HandleRequestL(
+ EMmTsyActivateSmsRouting ) );
+ iServerRoutingActivity = ERoutingActivating;
+ }
+ }
+
+//----------------------------------------------------------------------------
+// CMmSmsTsy::CompleteActivateSmsRouting
+// This method completes Activation of SMS routing
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+void CMmSmsTsy::CompleteActivateSmsRouting(
+ TInt aError,
+ CMmDataPackage* aDataPackage )
+ {
+ TUint8 aSmsRoutingStatus ( 0 );
+ aDataPackage->UnPackData( aSmsRoutingStatus ) ;
+
+ if ( ( KErrNone == aError ) &&
+ ( KSmsRoutingActivated == aSmsRoutingStatus ) )
+ {
+TFLOGSTRING("TSY: CMmSmsTsy::CompleteActivateSmsRouting SMS routing activated");
+ iServerRoutingActivity = ERoutingActivated;
+ }
+ else if ( ( KErrNone == aError ) &&
+ ( KSmsRoutingDeactivated == aSmsRoutingStatus ) )
+ {
+TFLOGSTRING("TSY: CMmSmsTsy::CompleteActivateSmsRouting SMS routing not activated");
+ iServerRoutingActivity = ERoutingNotActivated;
+ }
+ else
+ {
+TFLOGSTRING("TSY: CMmSmsTsy::CompleteActivateSmsRouting SMS routing activation failed");
+ iServerRoutingActivity = ERoutingNotActivated;
+
+ TTsyReqHandle reqHandle = iTsyReqHandleStore->ResetTsyReqHandle(
+ EMultimodeSmsReceiveMessage );
+
+ if ( reqHandle )
+ {
+ ReqCompleted( reqHandle, aError );
+ }
+ }
+ }
+
+//----------------------------------------------------------------------------
+// CMmSmsTsy::CompleteReceiveMessage
+// This method completes reception of incoming unstored SMS
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+void CMmSmsTsy::CompleteReceiveMessage(
+ TInt aError,
+ CMmDataPackage* aDataPackage )
+ {
+ TInt ret( KErrNone );
+ TBool smsInd( EFalse );
+ TSmsMsg* smsMsg;
+
+ TTsyReqHandle reqHandle = iTsyReqHandleStore->GetTsyReqHandle(
+ EMultimodeSmsReceiveMessage );
+
+TFLOGSTRING2("TSY: CMmSmsTsy::CompleteReceiveMessage. iClientStorageFull: %d", iClientStorageFull );
+
+ // SMS successfully received
+ if ( KErrNone == aError )
+ {
+ //unpack received data
+ aDataPackage->UnPackData( smsInd, smsMsg );
+
+ // is the SMS a class2 SMS or not.
+ TBool smsClass2 = smsMsg->iSmsClass2;
+
+ // if store is not full, receive new class2 message and get
+ // notification
+ if ( smsClass2 && ( 0 != smsMsg->iLocation ) && iMmSmsStorageTsy )
+ {
+TFLOGSTRING("TSY: CMmSmsTsy::CompleteReceiveMessage. CompleteNotifyStoreEvent happens");
+ iMmSmsStorageTsy->CMmSmsStorageTsy::CompleteNotifyStoreEvent(
+ smsMsg->iLocation, RMobilePhoneStore::KStoreEntryAdded );
+ }
+
+ // if SMS is a Class2 and SMS Memories are full and SIM SMS Memory
+ // not full
+ if ( iClientStorageFull && smsClass2 )
+ {
+ if ( reqHandle )
+ {
+ // Store SMS in TSY's internal memory
+ TRAP( ret, StoreClass2MessageL( smsMsg ) );
+
+ // Message is not delivered to SMS Stack.Deliver message to
+ // SMS. Stack after SMS Stack has called ReceiveMessage..
+ smsMsg->iDeleteAfterClientAck = EFalse;
+
+#ifdef USING_CTSY_DISPATCHER
+ CMmDataPackage package;
+ TDesC8* msgData = NULL;
+ package.PackData( &msgData );
+
+ // ignore if Acking fails
+ TRAP_IGNORE(
+ ret = iMmPhone->MessageManager()->HandleRequestL(EMobileSmsMessagingAckSmsStored, &package);
+ );
+ iTsyReqHandleStore->ResetTsyReqHandle(EMultimodeSmsReceiveMessage);
+ ReqCompleted(reqHandle, aError);
+#else
+ // ignore if Acking fails
+ TRAP_IGNORE(
+ ret = iMmPhone->MessageManager()->HandleRequestL(
+ EMobileSmsMessagingAckSmsStored );
+ );
+#endif //USING_CTSY_DISPATCHER
+ }
+ else
+ {
+ // Routing is activated, but SMS stack hasn't called
+ // ReceiveMessage. Nack received message internally with cause
+ // value "protocol error", otherwise SMS server releases
+ // routings.
+ CMmDataPackage package;
+ TSmsMsg* nullSms = NULL;
+ TInt rpCause( KErrGsmSMSMemoryCapacityExceeded );
+ package.PackData( &nullSms, &rpCause );
+
+ // ignore if Nacking fails
+ TRAP_IGNORE(
+ ret = iMmPhone->MessageManager()->HandleRequestL(
+ EMobileSmsMessagingNackSmsStored, &package );
+ );
+ }
+ }
+ else
+ {
+ // Class 0 or Class 1 or Class 2 message received.
+ // This message has to be acknowledged to the network
+ TInt rpError( KErrNone );
+
+ if ( reqHandle && !iClientStorageFull )
+ {
+ // Deliver message to SMS stack
+ if(smsMsg->iSmsMsg.Length() > iReceiveMessagePduPtr->MaxLength())
+ {
+ ret = KErrArgument;
+ }
+ else
+ {
+ ret = iMmSmsExtInterface->CompleteReceiveMessage( smsMsg,
+ iReceiveMessageParamsPtr, iReceiveMessagePduPtr );
+ }
+
+ iTsyReqHandleStore->ResetTsyReqHandle(
+ EMultimodeSmsReceiveMessage );
+
+TFLOGSTRING("TSY: CMmSmsTsy::CompleteReceiveMessage. Deliver SMS to the SMS stack");
+ ReqCompleted( reqHandle, ret );
+
+ // increase the count of expected acknowledgements
+ if(ret == KErrNone)
+ {
+ iExpectAckOrNack++;
+ }
+ }
+ else
+ {
+ // Routing is activated, but SMS stack hasn't called
+ // ReceiveMessage. Nack received message internally with cause
+ // value "protocol error", otherwise SMS server releases
+ // routings.
+ if (iClientStorageFull)
+ {
+ // SMS stack's memory is full. Nack message with error
+ // MemoryExceeded
+ rpError = KErrGsmSMSMemoryCapacityExceeded;
+ }
+ else
+ {
+ rpError = KErrGsmSMSUnspecifiedProtocolError;
+ }
+ }
+
+ if ( KErrNone != rpError )
+ {
+ CMmDataPackage package;
+ TSmsMsg* nullSms = NULL;
+ package.PackData( &nullSms, &rpError );
+
+ // ignore if Nacking fails
+ TRAP_IGNORE(
+ ret = iMmPhone->MessageManager()->HandleRequestL(
+ EMobileSmsMessagingNackSmsStored, &package );
+ );
+ }
+ }
+
+ // end of successful SMS reception
+ }
+ // error in SMS reception
+ else
+ {
+ //unpack received data - only one parameter information is needed
+ aDataPackage->UnPackData( smsInd );
+
+ // if SIM SMS Memory is full
+ if ( ( KErrGsmSMSUnspecifiedProtocolError == aError ) &&
+ ( reqHandle ) )
+ {
+ // SMS Memories not full
+ if ( !iClientStorageFull )
+ {
+ CMmDataPackage package;
+ TSmsMsg* nullSms = NULL;
+ TInt rpCause( KErrGsmSMSUnspecifiedProtocolError );
+ package.PackData( &nullSms, &rpCause );
+
+ // ignore if Nacking fails
+ TRAPD( trapError,
+ ret = iMmPhone->MessageManager()->HandleRequestL(
+ EMobileSmsMessagingNackSmsStored, &package ); );
+ if ( KErrNone != trapError )
+ {
+ ret = trapError;
+ }
+TFLOGSTRING("TSY: CMmSmsTsy::CompleteReceiveMessage.KErrGsmSMSUnspecifiedProtocolError ");
+ }
+ else // SMS Memory is full
+ {
+ CMmDataPackage package;
+ TSmsMsg* nullSms = NULL;
+ TInt rpCause( KErrGsmSMSMemoryCapacityExceeded );
+ package.PackData( &nullSms, &rpCause );
+
+ // ignore if Nacking fails
+ TRAPD( trapError,
+ ret = iMmPhone->MessageManager()->HandleRequestL(
+ EMobileSmsMessagingNackSmsStored, &package ); );
+ if ( KErrNone != trapError )
+ {
+ ret = trapError;
+ }
+ }
+ }
+ else if ( ( KErrGsmSMSMemoryCapacityExceeded == aError ) &&
+ ( reqHandle ) )
+ {
+ CMmDataPackage package;
+ TSmsMsg* nullSms = NULL;
+ TInt rpCause( KErrGsmSMSMemoryCapacityExceeded );
+ package.PackData( &nullSms, &rpCause );
+
+ // ignore if Nacking fails
+ TRAPD( trapError,
+ ret = iMmPhone->MessageManager()->HandleRequestL(
+ EMobileSmsMessagingNackSmsStored, &package );
+ );
+ if ( KErrNone != trapError )
+ {
+ ret = trapError;
+ }
+TFLOGSTRING("TSY: CMmSmsTsy::CompleteReceiveMessage.KErrGsmSMSMemoryCapacityExceeded ");
+ }
+ else if ( !reqHandle )
+ {
+ // Routing is activated, but SMS stack hasn't called
+ // ReceiveMessage. Nack received message internally with cause
+ // value "protocol error", otherwise SMS server releases
+ // routings
+ CMmDataPackage package;
+ TSmsMsg* nullSms = NULL;
+ TInt rpCause;
+ if (iClientStorageFull)
+ {
+ rpCause = KErrGsmSMSMemoryCapacityExceeded;
+ }
+ else
+ {
+ rpCause = KErrGsmSMSUnspecifiedProtocolError;
+ }
+ package.PackData( &nullSms, &rpCause );
+
+ // ignore if Nacking fails
+ TRAPD( trapError,
+ ret = iMmPhone->MessageManager()->HandleRequestL(
+ EMobileSmsMessagingNackSmsStored, &package );
+ );
+ if ( KErrNone != trapError )
+ {
+ ret = trapError;
+ }
+ }
+ else if ( !smsInd )
+ {
+ // Error occurred while handling incoming message or acknowledging
+ // received message
+ // Request handle exists (already checked above)
+ iTsyReqHandleStore->ResetTsyReqHandle(
+ EMultimodeSmsReceiveMessage );
+
+ ReqCompleted( reqHandle, aError );
+
+ // Incoming message handling failed. If client or TSY doesn't .
+ // ack incoming message, SMS Server may release all routings.
+ // Set iSmsServerRoutingActivity to FALSE so client can activate
+ // routings again.
+ iServerRoutingActivity = ERoutingNotActivated;
+ }
+
+ if ( KErrNone != ret )
+ {
+ // Nack of received message failed. SMS Server releases all
+ // routings. Set iSmsServerRoutingActivity to FALSE so client
+ // can activate routings again
+ iServerRoutingActivity = ERoutingNotActivated;
+ }
+ }
+ }
+
+//----------------------------------------------------------------------------
+// CMmSmsTsy::StoreClass2MessageL
+// This method stores received Class 2 message in TSY's internal memory
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+void CMmSmsTsy::StoreClass2MessageL(
+ TSmsMsg const* aSmsMsg )
+ {
+ TSmsMsg* smsMsg = new ( ELeave ) TSmsMsg();
+ CleanupStack::PushL( smsMsg );
+
+ smsMsg->iDeleteAfterClientAck = aSmsMsg->iDeleteAfterClientAck;
+ smsMsg->iLocation = aSmsMsg->iLocation;
+ smsMsg->iMessageStatus = aSmsMsg->iMessageStatus;
+ smsMsg->iMobileScNPI = aSmsMsg->iMobileScNPI;
+ smsMsg->iMobileScTON = aSmsMsg->iMobileScTON;
+ smsMsg->iServiceCentre.Copy( aSmsMsg->iServiceCentre );
+ smsMsg->iSmsMsg.Copy( aSmsMsg->iSmsMsg );
+
+ iSmsMsgArray->AppendL( smsMsg );
+
+ CleanupStack::Pop( smsMsg );
+ // note: Lint doesn't understand the use of Pop and 'thinks'
+ // that there is a memory leak for smsMsg, we disable that warning with
+ // the following command
+ // lint -e429
+ }
+
+//----------------------------------------------------------------------------
+// CMmSmsTsy::DeliverClass2ToSmsStack
+// This method delivers a received Class 2 messages that are
+// stored in TSY's internal memory to the SMS stack
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+void CMmSmsTsy::DeliverClass2ToSmsStack()
+ {
+ // Check if there is Class 2 messages in TSY's internal memory that can be
+ // now delivered to the SMS stack
+ TTsyReqHandle reqHandle = iTsyReqHandleStore->GetTsyReqHandle(
+ EMultimodeSmsReceiveMessage );
+
+ if ( reqHandle && !iClientStorageFull )
+ {
+ for ( TInt i = 0; i < iSmsMsgArray->Count(); i++ )
+ {
+ if ( EFalse == iSmsMsgArray->At( i )->iDeleteAfterClientAck )
+ {
+TFLOGSTRING2("TSY: CMmSmsTsy::DeliverClass2ToSmsStack. Deliver SMS to the SMS stack. Array count: %d", iSmsMsgArray->Count());
+ // TSY can now delete the message if SMS stack ack message
+ // successfully
+ iSmsMsgArray->At( i )->iDeleteAfterClientAck = ETrue;
+
+ TInt ret = iMmSmsExtInterface->CompleteReceiveMessage(
+ iSmsMsgArray->At( i ), iReceiveMessageParamsPtr,
+ iReceiveMessagePduPtr );
+
+ // ReceiveMessage request completed Reset request handle
+ iTsyReqHandleStore->ResetTsyReqHandle(
+ EMultimodeSmsReceiveMessage );
+
+ // increase the count of expected acknowledgements
+ if(ret == KErrNone)
+ {
+ iExpectAckOrNack++;
+ }
+
+ ReqCompleted( reqHandle, ret );
+ break;
+ }
+ }
+ }
+ }
+
+//----------------------------------------------------------------------------
+// CMmSmsTsy::AckSmsStoredL
+// Route RP-Ack request to active messagehandler
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+TInt CMmSmsTsy::AckSmsStoredL(
+ const TTsyReqHandle aTsyReqHandle,
+ const TDesC8* aMsgData,
+ TBool const * aMemoryFull )
+ {
+TFLOGSTRING2("TSY: CMmSmsTsy::AckSmsStored. aMemoryFull: %d",*aMemoryFull);
+ TTsyReqHandle getAckStoredMessageHandle =
+ iTsyReqHandleStore->GetTsyReqHandle( EMultimodeSmsAckStored );
+
+ if ( EMultimodeSmsReqHandleUnknown < getAckStoredMessageHandle )
+ {
+ // Send request is already ongoing
+ ReqCompleted( aTsyReqHandle, KErrServerBusy );
+ }
+ else
+ if ( iExpectAckOrNack <= 0 )
+ {
+TFLOGSTRING("TSY: CMmSmsTsy::AckSmsStoredL. -> ReceiveMessage not requested - error returned ");
+ ReqCompleted( aTsyReqHandle, KErrNotReady );
+ return KErrNone;
+ }
+ else
+ {
+ iClientStorageFull = *aMemoryFull;
+ TBool ackMessage( ETrue );
+
+ // Check if TSY has stored received Class 2 message to it's internal
+ // memory. TSY can now delete message from it's internal memory
+ // because SMS stack received message successfully.
+ for ( TInt i = 0; i < iSmsMsgArray->Count(); i++ )
+ {
+ if ( EFalse != iSmsMsgArray->At( i )->iDeleteAfterClientAck &&
+ KErrNone == aMsgData->CompareF(
+ iSmsMsgArray->At( i )->iSmsMsg ) )
+ {
+TFLOGSTRING3("TSY: CMmSmsTsy::AckSmsStored. Delete SMS: %d, Array count: %d",i,iSmsMsgArray->Count());
+ delete iSmsMsgArray->At( i ); // Delete object from memory
+ iSmsMsgArray->Delete( i ); // Delete pointer from array
+ iSmsMsgArray->Compress();
+
+ // Class 2 message is already acknowledged to the network
+ // Complete request here and don't send ack to the .
+ // network.
+ ReqCompleted( aTsyReqHandle, KErrNone );
+ ackMessage = EFalse;
+
+ // Check if there is more class 2 messages waiting in TSY's
+ // internal memory
+ DeliverClass2ToSmsStack();
+ break;
+ }
+ }
+
+ if ( ackMessage )
+ {
+ // Pack data
+ CMmDataPackage package;
+ TDesC8* msgData = const_cast<TDesC8*>( aMsgData );
+ package.PackData( &msgData );
+
+ TInt ret = iMmPhone->MessageManager()->HandleRequestL(
+ EMobileSmsMessagingAckSmsStored, &package );
+
+ if ( KErrNone == ret )
+ {
+ iReqHandleType = EMultimodeSmsAckStored;
+ }
+ else
+ {
+ // Message construction failed or phonet returned error
+ ReqCompleted( aTsyReqHandle, ret );
+
+ // Acknowledging failed. SMS Server will now release routings.
+ // Complete receive message request with KErrGeneral and
+ // set routing activity to false. SMS Stack makes new
+ // ReceiveMessage request.
+ TBool smsInd( EFalse );
+ CMmDataPackage data;
+ TSmsMsg* nullSms = NULL;
+ data.PackData( &smsInd, &nullSms );
+ CompleteReceiveMessage( KErrGeneral, &data );
+ }
+ }
+ }
+
+ // decrease the count of expeced acknowledgements
+ iExpectAckOrNack--;
+
+ return KErrNone;
+ }
+
+//----------------------------------------------------------------------------
+// CMmSmsTsy::CompleteAckSmsStored
+// Complete clients AckSmsStored request
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+void CMmSmsTsy::CompleteAckSmsStored(
+ TInt aError )
+ {
+ TTsyReqHandle reqHandle = iTsyReqHandleStore->ResetTsyReqHandle(
+ EMultimodeSmsAckStored );
+ if ( reqHandle )
+ {
+ ReqCompleted( reqHandle, aError );
+ }
+
+ if (aError != KErrNone)
+ {
+ // Ack error from LTSY. Need to reject receive messege request, to force the client to repost it.
+ reqHandle = iTsyReqHandleStore->ResetTsyReqHandle(EMultimodeSmsReceiveMessage);
+ if( reqHandle != 0 )
+ {
+ ReqCompleted(reqHandle, KErrGeneral);
+ }
+ iServerRoutingActivity = ERoutingNotActivated;
+ }
+ }
+
+//----------------------------------------------------------------------------
+// CMmSmsTsy::NackSmsStored
+// Route RP-Error request to messagehandler
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+TInt CMmSmsTsy::NackSmsStoredL(
+ const TTsyReqHandle aTsyReqHandle,
+ const TDesC8* aMsgData,
+ TInt* aRpCause )
+ {
+TFLOGSTRING2("TSY: CMmSmsTsy::NackSmsStored. aRpCause: %d",*aRpCause);
+ TTsyReqHandle nackHandle =
+ iTsyReqHandleStore->GetTsyReqHandle( EMultimodeSmsNackStored );
+
+ if ( 0 < nackHandle )
+ {
+ // The request is already in processing because of previous request
+ // Complete request with status value informing the client about
+ // the situation.
+ ReqCompleted( aTsyReqHandle, KErrServerBusy );
+ }
+ else
+ if ( iExpectAckOrNack <= 0 )
+ {
+TFLOGSTRING("TSY: CMmSmsTsy::AckSmsStoredL. -> ReceiveMessage not requested - error returned ");
+ ReqCompleted( aTsyReqHandle, KErrNotReady );
+ return KErrNone;
+ }
+ else
+ {
+ TBool nackMessage( ETrue );
+
+ // Check if TSY has stored received Class 2 message to it's internal
+ // memory. TSY can now delete message from it's internal memory
+ // because SMS stack received message successfully
+ for ( TInt i = 0; i < iSmsMsgArray->Count(); i++ )
+ {
+ // Check if message is waiting SMS stack's acknowledging and
+ // message contents is same as aMsgData.
+ if ( EFalse != iSmsMsgArray->At( i )->iDeleteAfterClientAck &&
+ KErrNone == aMsgData->CompareF(
+ iSmsMsgArray->At( i )->iSmsMsg ) )
+ {
+ switch ( *aRpCause )
+ {
+ // ETel specific value
+ case KErrGsmSMSMemoryCapacityExceeded:
+ // Defect in SMS stack. Stack sets TP cause value to the
+ // RP cause value TP-FCS 0xD3, RP cause 0x16
+ // 0xD3:Memory Capacity Exceeded
+ iClientStorageFull = ETrue;
+ // without break statement, it will run "iSmsMsgArray->At( i )->iDeleteAfterClientAck = EFalse" in next case block.
+ case 0xD3:
+ // Deliver this message to SMS stack when SMS stack
+ // has enough memory.
+ iSmsMsgArray->At( i )->iDeleteAfterClientAck = EFalse;
+ break;
+ default:
+ // Delete message because SMS stack couldn't handle it.
+ // Delete object from memory
+ delete iSmsMsgArray->At( i );
+ // Delete pointer from array
+ iSmsMsgArray->Delete( i );
+ iSmsMsgArray->Compress();
+ break;
+ }
+
+ // Class 2 message is already acknowledged to the network by
+ // adaptation. Complete request here and don't send ack to the
+ // network.
+ ReqCompleted( aTsyReqHandle, KErrNone );
+ nackMessage = EFalse;
+ break;
+ }
+ }
+
+ if ( nackMessage )
+ {
+ CMmDataPackage package;
+ // packed parameter: pointer to TDesC8 (TPDU data)
+ // and TInt (RP cause)
+ TDesC8* tempMsgDataPtr = const_cast<TDesC8*>( aMsgData );
+ package.PackData( &tempMsgDataPtr, aRpCause );
+
+ TInt ret = iMmPhone->MessageManager()->HandleRequestL(
+ EMobileSmsMessagingNackSmsStored, &package );
+
+ if ( KErrNone == ret )
+ {
+ iReqHandleType = EMultimodeSmsNackStored;
+ }
+ else
+ {
+ // Message construction failed or phonet sender returned
+ // error
+ ReqCompleted( aTsyReqHandle, ret );
+
+ // Acknowledging failed. SMS Server will now release routings.
+ // Complete receive message request with KErrGeneral and
+ // set routing activity to false. SMS Stack makes new
+ // ReceiveMessage request.
+ TBool smsInd( EFalse );
+ CMmDataPackage data;
+ TSmsMsg* nullSms = NULL;
+ data.PackData( &smsInd, &nullSms );
+ CompleteReceiveMessage( KErrGeneral, &data );
+ }
+ }
+ }
+
+
+ // decrease the count of expeced acknowledgements
+ iExpectAckOrNack--;
+
+ return KErrNone;
+ }
+
+//----------------------------------------------------------------------------
+// CMmSmsTsy::CompleteNackSmsStored
+// Complete clients NackSmsStored request
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+void CMmSmsTsy::CompleteNackSmsStored(
+ TInt aError )
+ {
+ // reset req handle. Returns the deleted req handle
+ TTsyReqHandle reqHandle = iTsyReqHandleStore->ResetTsyReqHandle(
+ EMultimodeSmsNackStored );
+ if ( reqHandle )
+ {
+ ReqCompleted( reqHandle, aError );
+ }
+
+ if (aError != KErrNone)
+ {
+ // Nack error from LTSY. Need to reject receive messege request, to force the client to repost it.
+ reqHandle = iTsyReqHandleStore->ResetTsyReqHandle(EMultimodeSmsReceiveMessage);
+ if( reqHandle != 0 )
+ {
+ ReqCompleted(reqHandle, KErrGeneral);
+ }
+ iServerRoutingActivity = ERoutingNotActivated;
+ }
+ }
+
+//----------------------------------------------------------------------------
+// CMmSmsTsy::ResumeSmsReception
+// Notify SMS Server, that client have again free memory for incoming SMSes
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+TInt CMmSmsTsy::ResumeSmsReceptionL(
+ const TTsyReqHandle aTsyReqHandle )
+ {
+TFLOGSTRING("TSY: CMmSmsTsy::ResumeSmsReceptionL");
+ TTsyReqHandle resumeHandle =
+ iTsyReqHandleStore->GetTsyReqHandle( EMultimodeSmsResumeReception );
+
+ if ( 0 < resumeHandle )
+ {
+ // The request is already in processing because of previous request
+ // Complete request with status value informing the client about
+ // the situation
+ ReqCompleted( aTsyReqHandle, KErrServerBusy );
+ }
+ else if ( iIsOffline )
+ {
+ // CS hardware is in off-line mode. We cannot issue this request
+ // now, but we will do it as soon as we are on-line again. See
+ // method SetOffline.
+ iResumeSmsReceptionPending = ETrue;
+
+ // Complete with KErrNone. Client will never notice that the
+ // request was not yet sent to DOS.
+ ReqCompleted( aTsyReqHandle, KErrNone );
+ }
+ else
+ {
+ TInt ret = iMmPhone->MessageManager()->HandleRequestL(
+ EMobileSmsMessagingResumeSmsReception );
+
+ if ( KErrNone == ret )
+ {
+ iReqHandleType = EMultimodeSmsResumeReception;
+ }
+ else
+ {
+ // Message construction failed or phonet sender returned error
+ ReqCompleted( aTsyReqHandle, ret );
+ }
+ }
+
+ return KErrNone;
+ }
+
+//----------------------------------------------------------------------------
+// CMmSmsTsy::CompleteResumeSmsReception
+// This method completes clients ResumeSmsReception request
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+void CMmSmsTsy::CompleteResumeSmsReception(
+ TInt aError )
+ {
+ if ( KErrNone == aError )
+ {
+ iClientStorageFull = EFalse;
+ }
+
+ TTsyReqHandle reqHandle = iTsyReqHandleStore->ResetTsyReqHandle(
+ EMultimodeSmsResumeReception );
+ if ( reqHandle )
+ {
+ ReqCompleted( reqHandle, aError );
+ }
+
+ // Suspended SMS reception resumed. Check if there is class 2 messages
+ // waiting in TSY's internal memory.
+ DeliverClass2ToSmsStack();
+ }
+
+//----------------------------------------------------------------------------
+// CMmSmsTsy::SetOffline
+// Sets information about CS hardware mode (off-line/on-line)
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+void CMmSmsTsy::SetOffline(
+ TBool aIsOffline )
+ {
+TFLOGSTRING2("TSY: CMmSmsTsy::SetOffline has been called with %d", aIsOffline);
+
+ if ( !aIsOffline && iIsOffline )
+ {
+ // changing from off-line to on-line
+ if ( iResumeSmsReceptionPending )
+ {
+ // now send the pending ResumeSmsReception
+ // request to DOS. We are not interested if the
+ // request has failed, and it has already been completed
+ // to the client (with KErrNone). See method ResumeSmsReception.
+ TInt trapError = KErrNone;
+ TRAP( trapError, iMmPhone->MessageManager()->HandleRequestL(
+ EMobileSmsMessagingResumeSmsReception );
+ );
+ iResumeSmsReceptionPending = EFalse;
+ }
+ }
+ iIsOffline = aIsOffline;
+ }
+
+//----------------------------------------------------------------------------
+// CMmSmsTsy::GetMoSmsBearer
+// This method is used to retrieve the current setting for the
+// bearer type used for sending SMS messages
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+TInt CMmSmsTsy::GetMoSmsBearer(
+ const TTsyReqHandle /*aTsyReqHandle*/,
+ RMobileSmsMessaging::TMobileSmsBearer* /*aBearer*/ )
+ {
+ return KErrNotSupported;
+ }
+
+//----------------------------------------------------------------------------
+// CMmSmsTsy::SetMoSmsBearer
+// This method sets the bearer type for sending SMS messages
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+TInt CMmSmsTsy::SetMoSmsBearer(
+ const TTsyReqHandle aTsyReqHandle,
+ RMobileSmsMessaging::TMobileSmsBearer* aBearer )
+ {
+TFLOGSTRING("TSY: CMmSmsTsy::SetMoSmsBearer called");
+
+ TTsyReqHandle setMoSmsBearerHandle =
+ iTsyReqHandleStore->GetTsyReqHandle( EMultimodeSmsSetMoSmsBearer );
+
+ if ( 0 < setMoSmsBearerHandle )
+ {
+ // The request is already processing because of previous request.
+ // Complete request with status value informing the client about
+ // the situation.
+ ReqCompleted( aTsyReqHandle, KErrServerBusy );
+ }
+ else
+ {
+ if ( ( *aBearer == RMobileSmsMessaging::ESmsBearerPacketOnly ) ||
+ ( *aBearer == RMobileSmsMessaging::ESmsBearerCircuitOnly ) ||
+ ( *aBearer == RMobileSmsMessaging::ESmsBearerPacketPreferred ) ||
+ ( *aBearer == RMobileSmsMessaging::ESmsBearerCircuitPreferred ) )
+ {
+ TInt ret = KErrNone;
+
+ CMmDataPackage package;
+ package.PackData( aBearer );
+
+ // Send request to the DOS layer.
+ TRAP_IGNORE( ret = iMmPhone->MessageManager()->HandleRequestL(
+ EMobileSmsMessagingSetMoSmsBearer, &package ); );
+
+ if ( KErrNone == ret )
+ {
+#ifdef REQHANDLE_TIMER
+ SetTypeOfResponse( EMultimodeSmsSetMoSmsBearer, aTsyReqHandle );
+#else
+ iTsyReqHandleStore->SetTsyReqHandle(
+ EMultimodeSmsSetMoSmsBearer, aTsyReqHandle );
+#endif // REQHANDLE_TIMER
+ }
+ else
+ {
+ // Call to DOS failed
+ ReqCompleted( aTsyReqHandle, ret );
+ }
+ }
+ else
+ {
+ ReqCompleted( aTsyReqHandle, KErrNotSupported );
+ }
+ }
+ return KErrNone;
+ }
+
+//----------------------------------------------------------------------------
+// CMmSmsTsy::CompleteSetMoSmsBearer
+// Complete clients SetMoSmsBearer request
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+void CMmSmsTsy::CompleteSetMoSmsBearer(
+ TInt aResult )
+ {
+ // reset req handle. Returns the deleted req handle
+ TTsyReqHandle reqHandle = iTsyReqHandleStore->ResetTsyReqHandle(
+ EMultimodeSmsSetMoSmsBearer );
+
+ if ( reqHandle )
+ {
+ ReqCompleted( reqHandle, aResult );
+ }
+ }
+
+//----------------------------------------------------------------------------
+// CMmSmsTsy::SetMoSmsBearerCancel
+// This method is used to cancel an outstanding asynchronous
+// SetMoSmsBearer request
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+TInt CMmSmsTsy::SetMoSmsBearerCancel(
+ const TTsyReqHandle aTsyReqHandle )
+ {
+ iTsyReqHandleStore->ResetTsyReqHandle( EMultimodeSmsSetMoSmsBearer );
+
+ ReqCompleted( aTsyReqHandle, KErrCancel );
+
+ return KErrNone;
+ }
+
+//----------------------------------------------------------------------------
+// CMmSmsTsy::NotifyMoSmsBearerChange
+// This method is used to notify the client if there is a
+// change to the setting for the bearer type used for sending SMS messages
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+TInt CMmSmsTsy::NotifyMoSmsBearerChange(
+ RMobileSmsMessaging::TMobileSmsBearer* /*aBearer*/ )
+ {
+ return KErrNotSupported;
+ }
+
+//----------------------------------------------------------------------------
+// CMmSmsTsy::NotifyMoSmsBearerChangeCancel
+// This method is used to cancel an outstanding asynchronous
+// NotifyMoSmsBearerChange request
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+TInt CMmSmsTsy::NotifyMoSmsBearerChangeCancel(
+ const TTsyReqHandle aTsyReqHandle )
+ {
+ iTsyReqHandleStore->ResetTsyReqHandle(
+ EMultimodeSmsNotifyMoSmsBearerChange );
+ ReqCompleted( aTsyReqHandle, KErrCancel );
+ iNotifySmsBearerPtr = NULL;
+
+ return KErrNone;
+ }
+
+//----------------------------------------------------------------------------
+// CMmSmsTsy::SendMessageL
+// Routes send message to network request to message handler
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+TInt CMmSmsTsy::SendMessageL(
+ const TTsyReqHandle aTsyReqHandle,
+ TDes8* aMsgData,
+ TDes8* aMsgAttributes )
+ {
+ TInt ret( KErrNone );
+
+ TTsyReqHandle getSendMessageHandle =
+ iTsyReqHandleStore->GetTsyReqHandle( EMultimodeSmsSendMessage );
+ TTsyReqHandle getSendSatMessageHandle =
+ iTsyReqHandleStore->GetTsyReqHandle( EMultimodeSmsSendSatMessage );
+
+ TTsyReqHandle getSendMessageNoFdnHandle =
+ iTsyReqHandleStore->GetTsyReqHandle( EMultimodeSmsSendMessageNoFdnCheck );
+ if ( ( EMultimodeSmsReqHandleUnknown < getSendMessageHandle )
+ || ( EMultimodeSmsReqHandleUnknown < getSendSatMessageHandle )
+ || ( EMultimodeSmsReqHandleUnknown < getSendMessageNoFdnHandle ) )
+ {
+ // Send request is already ongoing
+ // (through ETel messaging or through SAT)
+ ReqCompleted( aTsyReqHandle, KErrServerBusy );
+ }
+ else if(sizeof(RMobileSmsMessaging::TMobileSmsReceiveAttributesV1) > aMsgAttributes->Size())
+ {
+ ReqCompleted( aTsyReqHandle, KErrArgument );
+ }
+ else
+ {
+ iSendMessageMsgAttrPckgPtr = aMsgAttributes;
+
+ // Create package
+ CMmDataPackage package;
+
+ // typecast for aMsgAttributes
+ RMobileSmsMessaging::TMobileSmsSendAttributesV1Pckg* attsPckg =
+ reinterpret_cast<
+ RMobileSmsMessaging::TMobileSmsSendAttributesV1Pckg* >(
+ aMsgAttributes );
+ RMobileSmsMessaging::TMobileSmsSendAttributesV1& msgAttr =
+ ( *attsPckg )();
+
+ // structure for all sms parameters and data
+ TSendSmsDataAndAttributes sendData;
+
+ sendData.iAttributes = &msgAttr;
+ sendData.iMsgData = aMsgData;
+
+ if ( iSmsNoFdnCheckFlag == ESmsNoFdnCheckUsed )
+ {
+ //set ipc
+ sendData.iIpc = EMobileSmsMessagingSendMessageNoFdnCheck;
+ }
+ if ( iSmsNoFdnCheckFlag == ESmsNoFdnCheckNotUsed )
+ {
+ //set ipc
+ sendData.iIpc = EMobileSmsMessagingSendMessage;
+ }
+
+ // Pack parameters
+ package.PackData( &sendData );
+
+ CSmsSendRequest* smsSendReq = new (ELeave) CSmsSendRequest();
+ smsSendReq->SetSmsDataAndAttributes( sendData );
+
+ // save send request
+ iSmsSendReq = smsSendReq;
+TFLOGSTRING("TSY: CMmSmsTsy::SendMessageL: Send request saved");
+
+ // send request to DOS
+ // packed parameter: TSendSmsDataAndAttributes
+ if ( iSmsNoFdnCheckFlag == ESmsNoFdnCheckUsed )
+ {
+ ret = iMmPhone->MessageManager()->HandleRequestL(
+ EMobileSmsMessagingSendMessageNoFdnCheck, &package );
+ }
+ if ( iSmsNoFdnCheckFlag == ESmsNoFdnCheckNotUsed )
+ {
+ ret = iMmPhone->MessageManager()->HandleRequestL(
+ EMobileSmsMessagingSendMessage, &package );
+ }
+
+ if ( KErrNone == ret )
+ {
+ if ( iSmsNoFdnCheckFlag == ESmsNoFdnCheckUsed )
+ {
+ //set request type
+ iReqHandleType = EMultimodeSmsSendMessageNoFdnCheck;
+ }
+ if ( iSmsNoFdnCheckFlag == ESmsNoFdnCheckNotUsed )
+ {
+ //set request type
+ iReqHandleType = EMultimodeSmsSendMessage;
+ }
+ smsSendReq->IncreaseSendCounter();
+ }
+ else
+ {
+ // Phonet returned error
+ delete smsSendReq; // Delete object
+ iSmsSendReq = NULL; // Reset pointer
+ // Message construction failed or phonet sender returned error
+ ReqCompleted( aTsyReqHandle, ret );
+ // reset pointer to client memory
+ iSendMessageMsgAttrPckgPtr = NULL;
+
+ iSmsNoFdnCheckFlag = ESmsNoFdnCheckUnknown;
+ }
+ }
+
+ return KErrNone;
+ }
+
+//----------------------------------------------------------------------------
+// CMmSmsTsy::IsRPError
+// Checks if error code is a relay protocol error
+// ---------------------------------------------------------------------------
+TBool CMmSmsTsy::IsRPError(TInt aError)
+ {
+ TFLOGSTRING2("CMmSmsTsy::IsRPError(): %d", aError);
+
+ TBool isRPError = EFalse;
+ switch (aError)
+ {
+ case KErrGsmSMSShortMessageTransferRejected:
+ {
+ isRPError = ETrue;
+ }
+ break;
+ case KErrGsmSMSInvalidMandatoryInformation:
+ {
+ isRPError = ETrue;
+ }
+ break;
+ case KErrGsmSMSUnidentifiedSubscriber:
+ {
+ isRPError = ETrue;
+ }
+ break;
+ case KErrGsmSMSUnknownSubscriber:
+ {
+ isRPError = ETrue;
+ }
+ break;
+ case KErrGsmSMSNetworkOutOfOrder:
+ {
+ isRPError = ETrue;
+ }
+ break;
+ default:
+ {
+ // NOP
+ }
+ break;
+ }
+
+ return isRPError;
+ } // CMmSmsTsy::IsRPError
+
+
+//----------------------------------------------------------------------------
+// CMmSmsTsy::CompleteSendMessage
+// Complete SendMessage request
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+void CMmSmsTsy::CompleteSendMessage(
+ TInt aError,
+ CMmDataPackage* aDataPackage )
+ {
+ TInt extendedError = CMmCommonStaticUtility::ExtendedErrorCode(aError);
+ TBool res = IsRPError(extendedError);
+ if(res)
+ {
+ // Delete send message entry from send array
+ if ( iSmsSendReq )
+ {
+ delete iSmsSendReq; // Delete object
+ iSmsSendReq = NULL; // Reset pointer
+ }
+ // reset req handle and complete request
+ TTsyReqHandle reqHandle = iTsyReqHandleStore->ResetTsyReqHandle(
+ EMultimodeSmsSendMessage );
+ ReqCompleted( reqHandle, extendedError );
+ // reset pointer to client memory
+ iSendMessageMsgAttrPckgPtr = NULL;
+ iSmsNoFdnCheckFlag = ESmsNoFdnCheckUnknown;
+ }
+ else if ( ( KErrNone != aError ) && ( KErrTimedOut != aError )
+ && ( KErrGsmSMSOperationNotAllowed !=
+ CMmCommonStaticUtility::ExtendedErrorCode ( aError ) )
+ // FDB check failed
+ && ( KErrGsmSMSUnspecifiedProtocolError !=
+ CMmCommonStaticUtility::ExtendedErrorCode ( aError ) )
+ && ( KErrSatControl !=
+ CMmCommonStaticUtility::ExtendedErrorCode ( aError ) )
+ && ( !( iMmPhone->GetSatMessaging() &&
+ iMmPhone->GetSatMessaging()->IsMoSmControlBySimActivated() ) )
+ && ( NULL != iSmsSendReq ) && ( 2 >=
+ iSmsSendReq->GetSendCounter() ) )
+ {
+ // DOS returned error to send request. Message might be tried to be
+ // resent (see method ResendSms).
+ // Timeout mechanism cannot access this part of code, ever.
+TFLOGSTRING2("TSY: CMmSmsTsy::CompleteSendMessage. Resend counter: %d", iSmsSendReq->GetSendCounter());
+ }
+ else
+ {
+ // This is executed
+ // - if sending was successful
+ // - if there are no more resending attempts
+ // - if timer expires (called from the Complete of CMmSmsTsy class)
+
+ // Delete send message entry from send array
+ if ( iSmsSendReq )
+ {
+ delete iSmsSendReq; // Delete object
+ iSmsSendReq = NULL; // Reset pointer
+ }
+
+ // reset req handle and complete request
+ TTsyReqHandle reqHandle = iTsyReqHandleStore->ResetTsyReqHandle(
+ EMultimodeSmsSendMessage );
+
+ if ( EMultimodeSmsReqHandleUnknown < reqHandle )
+ {
+ // get values only if there was no error, and if return pointer to
+ // client is available
+ if ( KErrNone == aError && iSendMessageMsgAttrPckgPtr )
+ {
+ TInt16 msgRef( 0 );
+ TBuf8<RMobileSmsMessaging::KGsmTpduSize> smsMsg;
+
+ aDataPackage->UnPackData( msgRef, smsMsg );
+
+ RMobileSmsMessaging::TMobileSmsSendAttributesV1Pckg* attsPckg =
+ reinterpret_cast<
+ RMobileSmsMessaging::TMobileSmsSendAttributesV1Pckg* >(
+ iSendMessageMsgAttrPckgPtr );
+ RMobileSmsMessaging::TMobileSmsSendAttributesV1& msgAttr =
+ ( *attsPckg )();
+
+ msgAttr.iFlags = RMobileSmsMessaging::KMessageReference;
+ msgAttr.iMsgRef = static_cast< TUint16 >( msgRef );
+
+ if ( NULL != smsMsg.Length() )
+ {
+ msgAttr.iSubmitReport.Copy(smsMsg);
+ msgAttr.iFlags |= RMobileSmsMessaging::KGsmSubmitReport;
+ }
+ }
+
+ ReqCompleted( reqHandle, aError );
+ // reset pointer to client memory
+ iSendMessageMsgAttrPckgPtr = NULL;
+ iSmsNoFdnCheckFlag = ESmsNoFdnCheckUnknown;
+ }
+ }
+
+ // Resend unsent message
+ ResendSms();
+ }
+
+//----------------------------------------------------------------------------
+// CMmSmsTsy::SendSatMessage
+// SimAtkTsy can send SMS messages to the network by calling this method
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+TInt CMmSmsTsy::SendSatMessage(
+ MStkTsySatService& aStkTsySatService,
+ TDes8* aSmsTpdu,
+ TDes16* aScAddress,
+ RMobilePhone::TMobileTON* aMobileTON,
+ RMobilePhone::TMobileNPI* aMobileNPI,
+ TBool aMoreToSend,
+ TTsyReqHandle aTsyReqHandle )
+ {
+ iTsySatMessaging = &aStkTsySatService;
+
+ TTsyReqHandle getSendMessageHandle =
+ iTsyReqHandleStore->GetTsyReqHandle( EMultimodeSmsSendMessage );
+ TTsyReqHandle getSendSatMessageHandle =
+ iTsyReqHandleStore->GetTsyReqHandle( EMultimodeSmsSendSatMessage );
+
+ if ( ( EMultimodeSmsReqHandleUnknown < getSendMessageHandle )
+ || ( EMultimodeSmsReqHandleUnknown < getSendSatMessageHandle ) )
+ {
+ // Send request is already ongoing
+ // (through ETel messaging or through SAT)
+ iTsySatMessaging->CompleteSendSmsMessage( KErrServerBusy );
+ }
+ else
+ {
+
+ TRAPD( leaveCode, DoSendSatMessageL( aSmsTpdu, aScAddress, aMobileTON,
+ aMobileNPI, aMoreToSend, aTsyReqHandle ); );
+
+ if ( KErrNone != leaveCode )
+ {
+ // Call to DOS failed
+ CompleteSendSatMessage( leaveCode );
+ }
+ }
+
+ return KErrNone;
+ }
+
+//----------------------------------------------------------------------------
+// CMmSmsTsy::DoSendSatMessageL
+// SimAtkTsy can send SMS messages to the network by calling this method.
+// This method TRAPs failures.
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+void CMmSmsTsy::DoSendSatMessageL(
+ TDes8* aSmsTpdu,
+ TDes16* aScAddress,
+ RMobilePhone::TMobileTON* aMobileTON,
+ RMobilePhone::TMobileNPI* aMobileNPI,
+ TBool aMoreToSend,
+ TTsyReqHandle aTsyReqHandle )
+ {
+ // Leave if SendSatMessageL returns an error
+ User::LeaveIfError( SendSatMessageL( iMmPhone, aSmsTpdu,
+ aScAddress, aMobileTON, aMobileNPI, aMoreToSend ) );
+
+#ifdef REQHANDLE_TIMER
+ SetTypeOfResponse( EMultimodeSmsSendSatMessage, aTsyReqHandle );
+#endif // REQHANDLE_TIMER
+ }
+
+//----------------------------------------------------------------------------
+// CMmSmsTsy::CompleteSendSatMessage
+// Compelete SendSatMessage request to the MMSAT
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+void CMmSmsTsy::CompleteSendSatMessage(
+ TInt aError )
+ {
+TFLOGSTRING2("TSY: CMmSmsTsy::CompleteSendSatMessage. Complete SAT SMS send Error: %d", aError);
+ iTsyReqHandleStore->ResetTsyReqHandle( EMultimodeSmsSendSatMessage );
+
+ if ( iTsySatMessaging )
+ {
+ iTsySatMessaging->CompleteSendSmsMessage( aError );
+ }
+
+#ifdef USING_CTSY_DISPATCHER
+
+ //the iTsySatMessaging is now Nulled on the complete
+ //open issue that if the iTsySatMessaging pointer (to the SIM ATK) is not nulled (i.e. the callback is
+ //not completed) and the CTSY is destructed after the SIM ATK then the CMmSmsTsy has a invalid pointer which
+ //is used in the CMmSmsTsy destructor
+
+ iTsySatMessaging = NULL;
+#endif //USING_CTSY_DISPATCHER
+ }
+
+//----------------------------------------------------------------------------
+// CMmSmsTsy::EnumerateMessageStores
+// This methods returns the number of phone-side SMS message
+// stores supported by the phone
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+TInt CMmSmsTsy::EnumerateMessageStores(
+ const TTsyReqHandle aTsyReqHandle,
+ TInt* aCount )
+ {
+ *aCount = KSmsStoreNumber;
+ ReqCompleted( aTsyReqHandle, KErrNone );
+
+ return KErrNone;
+ }
+
+//----------------------------------------------------------------------------
+// CMmSmsTsy::GetMessageStoreInfo
+// This method gets used SMS entries and total number of SMS entries on SIM
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+TInt CMmSmsTsy::GetMessageStoreInfoL(
+ const TTsyReqHandle aTsyReqHandle,
+ TInt const* aIndex,
+ TDes8* aInfo )
+ {
+ TTsyReqHandle getStoreInfoHandle =
+ iTsyReqHandleStore->GetTsyReqHandle(
+ EMultimodeSmsGetMessageStoreInfo );
+
+ if ( EMultimodeSmsReqHandleUnknown < getStoreInfoHandle )
+ {
+ // The request is already in processing because of previous request.
+ // Complete request with status value informing the client about
+ // the situation.
+ ReqCompleted( aTsyReqHandle, KErrServerBusy );
+ }
+ else if ( (*aIndex >= KSmsStoreNumber) || (*aIndex < 0) )
+ {
+ // First store number is "0" and SIM is only supported store
+ ReqCompleted( aTsyReqHandle, KErrArgument );
+ }
+ else
+ {
+ iGetMessageStoreInfoPtr = aInfo;
+ // allow for EMobileSmsMessagingGetMessageStoreInfo immediate
+ // completion
+#ifdef REQHANDLE_TIMER
+ SetTypeOfResponse( EMultimodeSmsGetMessageStoreInfo, aTsyReqHandle );
+#else
+ // Never comes here. See SetTypeOfResponse.
+ iTsyReqHandleStore->SetTsyReqHandle( EMultimodeSmsGetMessageStoreInfo,
+ aTsyReqHandle );
+#endif // REQHANDLE_TIMER
+
+ //Send request to the Domestic OS layer.
+ TInt ret = iMmPhone->MessageManager()->HandleRequestL(
+ EMobileSmsMessagingGetMessageStoreInfo );
+
+ // DOS layer returned with error without completing request
+ if ( KErrNone != ret && iTsyReqHandleStore->ResetTsyReqHandle(
+ EMultimodeSmsGetMessageStoreInfo) )
+ {
+ ReqCompleted( aTsyReqHandle, ret );
+ }
+ }
+
+ return KErrNone;
+ }
+
+//----------------------------------------------------------------------------
+// CMmSmsTsy::GetMessageStoreInfoCancel
+// Cancel pending GetMessagestoreInfo request
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+TInt CMmSmsTsy::GetMessageStoreInfoCancel(
+ const TTsyReqHandle aTsyReqHandle )
+ {
+ iTsyReqHandleStore->ResetTsyReqHandle( EMultimodeSmsGetMessageStoreInfo );
+
+ ReqCompleted( aTsyReqHandle, KErrCancel );
+
+ return KErrNone;
+ }
+
+//----------------------------------------------------------------------------
+// CMmSmsTsy::CompleteGetMessageStoreInfo
+// Complete GetMessageStoreInfo request to client
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+void CMmSmsTsy::CompleteGetMessageStoreInfo(
+ TInt aError,
+ CMmDataPackage* aDataPackage )
+ {
+ TUint8 totalEntries( 0 );
+ TInt usedEntries( 0 );
+
+ TTsyReqHandle reqHandle = iTsyReqHandleStore->ResetTsyReqHandle(
+ EMultimodeSmsGetMessageStoreInfo );
+
+ if ( reqHandle )
+ {
+ // Request was successful
+ if ( ( KErrNone == aError ) || ( KErrNotFound == aError ) )
+ {
+ aDataPackage->UnPackData( totalEntries, usedEntries );
+
+ aError = iMmSmsExtInterface->MessageStoreInfo(
+ iGetMessageStoreInfoPtr, totalEntries, usedEntries );
+ }
+
+ iSmsNumOfLoc = totalEntries;
+
+ ReqCompleted( reqHandle, aError );
+ }
+ }
+
+//----------------------------------------------------------------------------
+// CMmSmsTsy::ReadSmspListPhase1L
+// This method starts first phase of SMS Parameter sets
+// retrieval On the first phase method store locations
+// temporarely to the TSY. On the second phase method copies the
+// list to the client
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+TInt CMmSmsTsy::ReadSmspListPhase1L(
+ const TTsyReqHandle aTsyReqHandle,
+ RMobilePhone::TClientId const* aId,
+ TInt* aBufSize )
+ {
+TFLOGSTRING("TSY: CMmSmsTsy::ReadSmspListPhase1L");
+
+ TTsyReqHandle readSmspHandle = iTsyReqHandleStore->GetTsyReqHandle(
+ EMultimodeSmsReadSmspListPhase1 );
+
+ if ( 0 < readSmspHandle )
+ {
+ // The request is already processing because of previous request
+ // Complete request with status value informing the client about
+ // the situation.
+ ReqCompleted( aTsyReqHandle, KErrServerBusy );
+ }
+ else
+ {
+ // Lets check how many SMSP sets are there.
+ TInt ret = iMmPhone->MessageManager()->HandleRequestL(
+ EMobileSmsMessagingGetSmspListPhase1 );
+
+ if ( KErrNone == ret )
+ {
+ iReqHandleType = EMultimodeSmsReadSmspListPhase1;
+
+ iRetSMSPSize = aBufSize;
+
+ // Copy client id (session and subsession handle). it's used for
+ // matching phase 1 and 2 of a request
+
+ if ( iSMSPClientId )
+ {
+ delete iSMSPClientId;
+ iSMSPClientId = NULL;
+ }
+
+ iSMSPClientId = new ( ELeave ) RMobilePhone::TClientId( *aId );
+ }
+ else
+ {
+ // Call to DOS failed
+ ReqCompleted( aTsyReqHandle, ret );
+ }
+ }
+
+ return KErrNone;
+ }
+
+//----------------------------------------------------------------------------
+// CMmSmsTsy::ReadSmspListPhase2
+// This method starts second phase of SMS Parameter sets retrieval. It is
+// guaranteed that this is only called if phase 1 was completed with KErrNone.
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+TInt CMmSmsTsy::ReadSmspListPhase2(
+ TTsyReqHandle aTsyReqHandle,
+ RMobilePhone::TClientId const* aId,
+ TDes8* aBuffer )
+ {
+ // Check if client id matches between phase 1 and phase 2
+ if ( ( iSMSPClientId->iSessionHandle == aId->iSessionHandle ) &&
+ ( iSMSPClientId->iSubSessionHandle == aId->iSubSessionHandle ) )
+ {
+ // Copy the streamed list to the client
+ aBuffer->Copy( iSMSPList->Ptr( 0 ) );
+
+ iMmPhone->ReqCompleted( aTsyReqHandle, KErrNone );
+ }
+ else
+ {
+ iMmPhone->ReqCompleted( aTsyReqHandle, KErrCorrupt );
+ }
+
+ // Reset the client Id
+ delete iSMSPClientId;
+ iSMSPClientId = NULL;
+
+ // Reset the streamed list
+ delete iSMSPList;
+ iSMSPList = NULL;
+
+ return KErrNone;
+ }
+
+//----------------------------------------------------------------------------
+// CMmSmsTsy::ReadAllSmspCancel
+// This method cancels read all SMS Parameter sets request.
+// This method can be called between phase1 and phase2
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+TInt CMmSmsTsy::ReadAllSmspCancel(
+ const TTsyReqHandle aTsyReqHandle )
+ {
+ iTsyReqHandleStore->ResetTsyReqHandle( EMultimodeSmsReadSmspListPhase1 );
+
+ iRetSMSPSize = NULL;
+
+ if ( iSMSPClientId )
+ {
+ delete iSMSPClientId;
+ iSMSPClientId = NULL;
+ }
+
+ if ( iSMSPList )
+ {
+ delete iSMSPList;
+ iSMSPList = NULL;
+ }
+
+ ReqCompleted( aTsyReqHandle, KErrCancel );
+
+ return KErrNone;
+ }
+
+//----------------------------------------------------------------------------
+// CMmSmsTsy::CreateSmspListL
+// This method creates SMSP list from read entries.
+// Method reads the list, and stores its content in iSMSPList.
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+void CMmSmsTsy::CreateSmspListL(
+ CArrayPtrFlat<TSmsParameters>& aSmspList )
+ {
+ CMobilePhoneSmspList* list = CMobilePhoneSmspList::NewL();
+ CleanupStack::PushL( list );
+
+ TUint8 amountOfSets = static_cast< TUint8 >( aSmspList.Count() );
+
+ RMobileSmsMessaging::TMobileSmspEntryV1 entry;
+
+ // Runs until TSY's internal SMSP storage is empty
+ while ( 0 != aSmspList.Count() )
+ {
+ TSmsParameters* smsParam = aSmspList.At( 0 );
+ entry.iIndex = ( smsParam->iLocationNumber );
+
+ if ( smsParam->iAlphaTagPresent )
+ {
+ entry.iText.Copy( smsParam->iAlphaTagData );
+ }
+ else
+ {
+ entry.iText.SetLength( 0 );
+ }
+
+ entry.iValidParams = ( smsParam->iParameterIndicator );
+
+ TInt paramask =
+ KSmsGsmParametersIndMask & ( smsParam->iParameterIndicator );
+
+ if ( paramask & KDestinationAddress )
+ {
+ entry.iDestination.iTypeOfNumber = ( smsParam->iMobileDeTON );
+ entry.iDestination.iNumberPlan = ( smsParam->iMobileDeNPI );
+ entry.iDestination.iTelNumber = ( smsParam->iDestinationAddress );
+ }
+
+ if ( paramask & KServiceCentreAddress )
+ {
+ entry.iServiceCentre.iTypeOfNumber = ( smsParam->iMobileScTON );
+ entry.iServiceCentre.iNumberPlan = ( smsParam->iMobileScNPI );
+ entry.iServiceCentre.iTelNumber =
+ ( smsParam->iServiceCenterAddress );
+ }
+
+ if ( paramask & KProtocolID )
+ {
+ entry.iProtocolId = ( smsParam->iProtocolId );
+ }
+
+ if ( paramask & KDataCodingScheme )
+ {
+ entry.iDcs = ( smsParam->iDataCodingScheme );
+ }
+
+ if ( paramask & KValidityPeriod )
+ {
+ entry.iValidityPeriod = ( smsParam->iValidityPeriod );
+ }
+
+ list->AddEntryL( entry );
+
+ // Delete handled SMSP set
+ delete smsParam; // Delete object
+ aSmspList.Delete( 0 ); // Delete pointer from array
+ aSmspList.Compress();
+ }
+
+ // Set maximum amount of SMSP sets to the list.
+ list->SetMaxNumberEntries( amountOfSets );
+
+ iSMSPList = list->StoreLC(); // creates new CBufFlat buffer and
+ // pushes it on cleanup stack
+ CleanupStack::Pop(); // pop the iSMSPList
+
+ CleanupStack::PopAndDestroy(); // pop&destroy CMobilePhoneSmspList* list
+ }
+
+//----------------------------------------------------------------------------
+// CMmSmsTsy::CompleteReadAllSmspPhase1
+// Complete first phase of read all SMSP sets request, i.e. returns
+// size of iSMSPList buffer to client.
+// Parameter aDataPackage contains SMSP list in CArrayPtrFlat<TSmsParameters>.
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+void CMmSmsTsy::CompleteReadAllSmspPhase1(
+ TInt aError,
+ CMmDataPackage* aDataPackage )
+ {
+ CArrayPtrFlat<TSmsParameters>* smsParams;
+
+ TTsyReqHandle reqHandle = iTsyReqHandleStore->ResetTsyReqHandle(
+ EMultimodeSmsReadSmspListPhase1 );
+
+TFLOGSTRING2("TSY: CMmSmsTsy::CompleteReadAllSmspPhase1 Complete read first phase error: %d",aError);
+ if ( KErrNone == aError )
+ {
+ aDataPackage->UnPackData( &smsParams );
+ if ( reqHandle )
+ {
+ // Create the Smsp list
+ TInt trapError;
+ if( NULL == smsParams)
+ {
+ trapError = KErrGeneral;
+ }
+ else
+ {
+ TRAP( trapError, CreateSmspListL( *smsParams ); );
+ }
+
+ if ( KErrNone == trapError )
+ {
+ *iRetSMSPSize = iSMSPList->Size();
+TFLOGSTRING("TSY: CMmSmsTsy::CompleteReadAllSmspPhase1: Phase 1 OK.");
+ // Complete first phase of read all SMSP sets
+ ReqCompleted( reqHandle, KErrNone );
+ }
+ else
+ {
+TFLOGSTRING2("TSY: CMmSmsTsy::CompleteReadAllSmspPhase1: Could not create SMSP list, trapError=%d",trapError);
+ // Complete with error
+ ReqCompleted( reqHandle, trapError );
+ }
+ }
+ }
+ else
+ {
+ if ( reqHandle )
+ {
+ // Complete first phase of read all SMSP sets.
+ ReqCompleted( reqHandle, aError );
+ }
+ }
+ iRetSMSPSize = NULL;
+ }
+
+//----------------------------------------------------------------------------
+// CMmSmsTsy::StoreSmspList
+// This method start storing of new version of the entire list
+// of SMSP entries prosess
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+TInt CMmSmsTsy::StoreSmspList(
+ const TTsyReqHandle aTsyReqHandle,
+ TDes8* aBuffer )
+ {
+ TTsyReqHandle storeSmspListHandle =
+ iTsyReqHandleStore->GetTsyReqHandle( EMultimodeSmsStoreSmspList );
+
+ if ( 0 < storeSmspListHandle )
+ {
+ // The request is already processing because of previous request.
+ // Complete request with status value informing the client about
+ // the situation.
+ ReqCompleted( aTsyReqHandle, KErrServerBusy );
+ }
+ else
+ {
+ iStoreSmspBufferPtr = aBuffer;
+ iStoreSmspIndex = 0;
+
+ // We must store request handle here and not in ExtFunc-method.
+ // If SMSP list is empty we must complete store SMSP list request in
+ // ProcessStoreSmspListL-method and then we need request handle.
+#ifdef REQHANDLE_TIMER
+ SetTypeOfResponse( EMultimodeSmsStoreSmspList, aTsyReqHandle );
+#else
+ iTsyReqHandleStore->SetTsyReqHandle( EMultimodeSmsStoreSmspList,
+ aTsyReqHandle );
+#endif // REQHANDLE_TIMER
+ CallProcessStoreSmspList();
+ }
+
+ return KErrNone;
+ }
+
+//----------------------------------------------------------------------------
+// CMmSmsTsy::InternalStoreSmspList
+// This method check if there was error while updating last SMSP
+//set. If there was no error it calls CompleteStoreSmspListL- method
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+void CMmSmsTsy::InternalStoreSmspList(
+ TInt aError )
+ {
+ TTsyReqHandle reqHandle = iTsyReqHandleStore->GetTsyReqHandle(
+ EMultimodeSmsStoreSmspList );
+
+ if ( reqHandle )
+ {
+ if ( KErrNone == aError )
+ {
+ // Lets continue storing prosess
+ CallProcessStoreSmspList();
+ }
+ else
+ {
+ CompleteStoreSmspList( aError );
+ }
+ }
+ }
+
+//----------------------------------------------------------------------------
+// CMmSmsTsy::CallProcessStoreSmspList
+// This method calls ProcessStoreSmspListL-method
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+void CMmSmsTsy::CallProcessStoreSmspList()
+ {
+ TRAPD ( ret, ProcessStoreSmspListL(); );
+ if ( ret != KErrNone )
+ {
+ CompleteStoreSmspList( ret );
+ }
+ }
+
+//----------------------------------------------------------------------------
+// CMmSmsTsy::ProcessStoreSmspListL
+// This method gets one SMSP sets from clients list and calls
+// DOS OR completes client's request
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+void CMmSmsTsy::ProcessStoreSmspListL()
+ {
+ CMobilePhoneSmspList* smspList = CMobilePhoneSmspList::NewL();
+ CleanupStack::PushL( smspList );
+
+ smspList->RestoreL( *iStoreSmspBufferPtr );
+
+ if ( smspList->Enumerate() > iStoreSmspIndex )
+ {
+ RMobileSmsMessaging::TMobileSmspEntryV1 smsParam;
+ CMmDataPackage package;
+
+ // Clients SMSP lists first location is 0
+ smsParam = smspList->GetEntryL( iStoreSmspIndex );
+
+ iStoreSmspIndex++;
+
+ // Pack parameters
+ package.PackData( &smsParam );
+
+ // Lets make new routing request so new CBMI list can be delivered to
+ // DOS
+ TInt ret = iMmPhone->MessageManager()->HandleRequestL(
+ EMobileSmsMessagingStoreSmspList, &package );
+
+ if ( KErrNone != ret )
+ {
+ // Message construction failed or phonet sender
+ // returned error. Complete request in CallProsessStoreSmspList
+ // method
+ CompleteStoreSmspList( ret );
+ }
+ }
+
+ // All SMSP sets have successfully been stored
+ else
+ {
+ // Notify that SMSP set was updated in the store
+ CompleteNotifySmspListChange();
+
+ // Complete store SMSP list request to the client
+ CompleteStoreSmspList( KErrNone );
+ }
+
+ CleanupStack::PopAndDestroy(); // aSmspList
+ }
+
+//----------------------------------------------------------------------------
+// CMmSmsTsy::CompleteStoreSmspList
+// Complete store SMSP list request
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+void CMmSmsTsy::CompleteStoreSmspList(
+ TInt aError )
+ {
+ TTsyReqHandle reqHandle = iTsyReqHandleStore->ResetTsyReqHandle(
+ EMultimodeSmsStoreSmspList );
+ if ( reqHandle )
+ {
+ ReqCompleted( reqHandle, aError );
+ }
+ }
+
+//----------------------------------------------------------------------------
+// CMmSmsTsy::NotifySmspListChange
+// This method activates notifying of SMS Parameter store events
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+TInt CMmSmsTsy::NotifySmspListChange()
+ {
+ iReqHandleType = EMultimodeSmsNotifySmspListChange;
+
+ return KErrNone;
+ }
+
+//----------------------------------------------------------------------------
+// CMmSmsTsy::NotifySmspListChangeCancel
+// This method cancels NotifyStoreEventCancel request
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+TInt CMmSmsTsy::NotifySmspListChangeCancel(
+ const TTsyReqHandle aTsyReqHandle )
+ {
+ iTsyReqHandleStore->ResetTsyReqHandle(
+ EMultimodeSmsNotifySmspListChange );
+ ReqCompleted( aTsyReqHandle, KErrCancel );
+
+ return KErrNone;
+ }
+
+//----------------------------------------------------------------------------
+// CMmSmsTsy::CompleteNotifySmspListChange
+// This method is called when some of SMS parameter store events happen
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+void CMmSmsTsy::CompleteNotifySmspListChange()
+ {
+ TTsyReqHandle reqHandle = iTsyReqHandleStore->ResetTsyReqHandle(
+ EMultimodeSmsNotifySmspListChange );
+ if ( reqHandle )
+ {
+ ReqCompleted( reqHandle, KErrNone );
+ }
+ }
+
+//----------------------------------------------------------------------------
+// CMmSmsTsy::GetSmsNumOfLoc
+// Get SMS number of Location on SIM card
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+TInt16 CMmSmsTsy::GetSmsNumOfLoc()
+ {
+ return static_cast< TInt16 >( iSmsNumOfLoc );
+ }
+
+//----------------------------------------------------------------------------
+// CMmSmsTsy::SetSmsNumOfLoc
+// Set SMS number of Location on SIM card to member variable
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+void CMmSmsTsy::SetSmsNumOfLoc(
+ TInt aSmsNumOfLoc )
+ {
+ iSmsNumOfLoc = static_cast< TUint8 >( aSmsNumOfLoc );
+ }
+
+//----------------------------------------------------------------------------
+// CMmSmsTsy::GetSmsStorageTsy
+// Returns a pointer to the SMS Storage sub-session
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+CMmSmsStorageTsy* CMmSmsTsy::GetSmsStorageTsy()
+ {
+ return iMmSmsStorageTsy;
+ }
+
+//----------------------------------------------------------------------------
+// CMmSmsTsy::SetSmsStorageTsy
+// Sets a new pointer to the SMS Storage sub-session
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+void CMmSmsTsy::SetSmsStorageTsy(
+ CMmSmsStorageTsy* aNewPointer )
+ {
+ iMmSmsStorageTsy = aNewPointer;
+ }
+
+//----------------------------------------------------------------------------
+// CMmSmsTsy::ResetVariables
+// Reset used variables
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+void CMmSmsTsy::ResetVariables()
+ {
+ // Resets routing activity variable. If routing is active in DOS
+ // this parameter is true.
+ iServerRoutingActivity = ERoutingNotActivated;
+
+ // Resets mobile sms receive mode to EReceiveUnstoredClientAck. Mobile
+ // sms receive mode includes the receive mode type.
+ iMobileSmsReceiveMode = RMobileSmsMessaging::EReceiveUnstoredClientAck;
+
+ // Resets receive mode change notify variables.
+ iNotifyReceiveModeChangePtr = NULL;
+
+ // Resets receive message variables.
+ iReceiveMessagePduPtr = NULL;
+ iReceiveMessageParamsPtr = NULL;
+
+ // Resets sms bearer notify variables.
+ iNotifySmsBearerPtr = NULL;
+
+ // Resets send message variables.
+ iSendMessageMsgAttrPckgPtr = NULL;
+
+ // Resets get message store variables.
+ iGetMessageStoreInfoPtr = NULL;
+
+ // Resets smsp (sms parameters) variables.
+ iRetSMSPSize = NULL;
+ iSMSPClientId = NULL;
+ iSMSPList = NULL;
+
+ // Resets sms storage parameter variables.
+ iStoreSmspBufferPtr = NULL;
+ iStoreSmspIndex = NULL;
+
+ // Resets sms storage tsy variable.
+ iMmSmsStorageTsy = NULL;
+
+ // Resets SMS stack storage status variables
+ iClientStorageFull = EFalse;
+
+
+ //Set number of SMS locations on SIM card to 0
+ iSmsNumOfLoc = 0;
+ }
+
+#ifdef REQHANDLE_TIMER
+//----------------------------------------------------------------------------
+// CMmSmsTsy::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 CMmSmsTsy::SetTypeOfResponse(
+ const TInt aReqHandleType,
+ const TTsyReqHandle aTsyReqHandle )
+ {
+ TInt timeOut( 0 );
+
+ switch ( aReqHandleType )
+ {
+ // SMS specific requests
+ case EMultimodeSmsAckStored:
+ case EMultimodeSmsNackStored:
+ timeOut = KMmSmsAckNackMessage;
+ break;
+ case EMultimodeSmsSendMessage:
+ timeOut = KMmSmsSendMessage;
+ break;
+ case EMultimodeSmsSendMessageNoFdnCheck:
+ timeOut = KMmSmsSendMessageNoFdnCheckTimeOut;
+ break;
+ case EMultimodeSmsSendSatMessage:
+ timeOut = KMmSmsSendSatMessage;
+ break;
+ case EMultimodeSmsResumeReception:
+ timeOut = KMmSmsResumeSmsReception;
+ break;
+ case EMultimodeSmsGetMessageStoreInfo:
+ timeOut = KMmSmsGetMessageStoreInfo;
+ break;
+ case EMultimodeSmsReadSmspListPhase1:
+ case EMultimodeSmsStoreSmspList:
+ timeOut = KMmSmsReadAndStoreSmspList;
+ break;
+ // SMS storage specific requests
+ case EMultimodeSmsGetInfo:
+ timeOut = KMmSimSmsGetInfo;
+ break;
+ case EMultimodeSimStSmsWriteSms:
+ timeOut = KMmSimSmsWriteSms;
+ break;
+ case EMultimodeSimStSmsReadSms:
+ case EMultimodeSimStSmsEraseSms:
+ timeOut = KMmSimSmsReadDeleteSms;
+ break;
+ case EMultimodeSimStSmsEraseAllSms:
+ timeOut = KMmSimSmsDeleteAllSms;
+ break;
+ case EMultimodeSimStSmsReadAllSms:
+ timeOut = KMmSimSmsReadAllSms;
+ break;
+ // Must not use timer:
+ // case EMultimodeSmsReceiveMessage:
+ // case EMultimodeSmsNotifyReceiveModeChange:
+ // case EMultimodeSmsNotifyMoSmsBearerChange:
+ // case EMultimodeSmsNotifySmspListChange:
+ // case EMultimodeSmsMemoryNotifyStoreEvent:
+ 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 );
+ }
+ }
+
+//----------------------------------------------------------------------------
+// CMmSmsTsy::Complete
+// Completes the request due timer expiration
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+void CMmSmsTsy::Complete(
+ TInt aReqHandleType,
+ TInt aError )
+ {
+ // All possible TSY req handle types are listed in the
+ // switch case below.
+ switch( aReqHandleType )
+ {
+ // Cases handled with automatic completion
+ // SMS specific requests
+ case EMultimodeSmsAckStored:
+ CompleteAckSmsStored( aError );
+ break;
+ case EMultimodeSmsNackStored:
+ CompleteNackSmsStored( aError );
+ break;
+ case EMultimodeSmsSendMessage:
+ CompleteSendMessage( KErrTimedOut, NULL );
+ break;
+ case EMultimodeSmsSendMessageNoFdnCheck:
+ CompleteSendMessageNoFdnCheck( KErrTimedOut, NULL );
+ break;
+ case EMultimodeSmsSendSatMessage:
+ CompleteSendSatMessage( KErrTimedOut );
+ break;
+ case EMultimodeSmsResumeReception:
+ CompleteResumeSmsReception( aError );
+ break;
+ case EMultimodeSmsGetMessageStoreInfo:
+ CompleteGetMessageStoreInfo( aError, NULL );
+ break;
+ case EMultimodeSmsReadSmspListPhase1:
+ CompleteReadAllSmspPhase1( aError, NULL );
+ break;
+ case EMultimodeSmsStoreSmspList:
+ CompleteStoreSmspList( aError );
+ break;
+ // SMS storage specific requests
+ case EMultimodeSmsGetInfo:
+ if ( iMmSmsStorageTsy )
+ {
+ iMmSmsStorageTsy->CompleteGetInfo( aError, NULL );
+ }
+ break;
+ case EMultimodeSimStSmsReadSms:
+ if ( iMmSmsStorageTsy )
+ {
+ iMmSmsStorageTsy->CompleteReadSms( aError, NULL );
+ }
+ break;
+ case EMultimodeSimStSmsWriteSms:
+ if ( iMmSmsStorageTsy )
+ {
+ iMmSmsStorageTsy->CompleteWriteSms( aError, NULL );
+ }
+ break;
+ case EMultimodeSimStSmsEraseSms:
+ if ( iMmSmsStorageTsy )
+ {
+ iMmSmsStorageTsy->CompleteDeleteSms( aError );
+ }
+ break;
+ case EMultimodeSimStSmsEraseAllSms:
+ if ( iMmSmsStorageTsy )
+ {
+ iMmSmsStorageTsy->CompleteDeleteAllSms( aError );
+ }
+ break;
+ case EMultimodeSimStSmsReadAllSms:
+ if ( iMmSmsStorageTsy )
+ {
+ iMmSmsStorageTsy->CompleteReadAllSmsPhase1( aError, EFalse );
+ }
+ break;
+ // Can't use timer:
+ // case EMultimodeSmsReceiveMessage:
+ // case EMultimodeSmsNotifyReceiveModeChange:
+ // case EMultimodeSmsNotifyMoSmsBearerChange:
+ // case EMultimodeSmsNotifySmspListChange:
+ // case EMultimodeSmsMemoryNotifyStoreEvent:
+ default:
+ ReqCompleted( iTsyReqHandleStore->ResetTsyReqHandle(
+ aReqHandleType ), aError );
+ break;
+ }
+ }
+
+#endif // REQHANDLE_TIMER
+
+//----------------------------------------------------------------------------
+// CMmSmsTsy::SendSatMessageL
+// SimAtkTsy can send SMS messages to the network by calling this method.
+// This method can leave.
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+TInt CMmSmsTsy::SendSatMessageL(
+ CMmPhoneTsy* aMmPhone,
+ TDes8* aSmsTpdu,
+ TDes16* aScAddress,
+ RMobilePhone::TMobileTON* aMobileTON,
+ RMobilePhone::TMobileNPI* aMobileNPI,
+ TBool aMoreToSend )
+ {
+ TInt ret( KErrNone );
+ // Deliver attributes to message handler by using
+ // TMobileSmsSendAttributesV1 class.
+ RMobileSmsMessaging::TMobileSmsSendAttributesV1 msgAttrib;
+
+ msgAttrib.iFlags = ( RMobileSmsMessaging::KSmsDataFormat |
+ RMobileSmsMessaging::KGsmServiceCentre |
+ RMobileSmsMessaging::KMoreToSend );
+
+ msgAttrib.iDataFormat = RMobileSmsMessaging::EFormatGsmTpdu;
+
+ // if service center address length > 20 digits plus "+" sign
+ if ( aScAddress->Length() > ( KMaxAmountOfDigits + 1 ) )
+ {
+ ret = KErrArgument;
+ }
+ else
+ {
+ msgAttrib.iGsmServiceCentre.iTelNumber.Copy( *aScAddress );
+ msgAttrib.iGsmServiceCentre.iTypeOfNumber = *aMobileTON;
+ msgAttrib.iGsmServiceCentre.iNumberPlan = *aMobileNPI;
+
+ msgAttrib.iMore = aMoreToSend;
+
+ // create package
+ CMmDataPackage package;
+
+ // structure for all sms parameters and data
+ TSendSmsDataAndAttributes sendData;
+
+ sendData.iAttributes = &msgAttrib;
+ sendData.iMsgData = aSmsTpdu;
+ sendData.iIpc = EMmTsySmsSendSatMessage;
+
+ // Pack parameters
+ package.PackData( &sendData );
+
+ // send request to DOS
+ ret = aMmPhone->MessageManager()->HandleRequestL(
+ EMmTsySmsSendSatMessage, &package );
+
+ if ( KErrNone == ret )
+ {
+ iReqHandleType = EMultimodeSmsSendSatMessage;
+ }
+ }
+
+ return ret;
+ }
+
+//----------------------------------------------------------------------------
+// CMmSmsTsy::ResendSms
+// Resends unsent message which is stored in iSmsSendReq
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+void CMmSmsTsy::ResendSms()
+ {
+ if ( NULL != iSmsSendReq )
+ {
+ // Create package
+ CMmDataPackage package;
+
+ // structure for all sms parameters and data
+ TSendSmsDataAndAttributes sendData =
+ iSmsSendReq->GetSmsDataAndAttributes();
+
+ // Pack parameters
+ package.PackData( &sendData );
+
+ // send request to DOS
+ TInt ret = KErrNone;
+ TRAPD( trapError, ret = iMmPhone->MessageManager()->HandleRequestL(
+ sendData.iIpc, &package ); );
+
+ if ( ( KErrNone != ret ) || ( KErrNone != trapError ) )
+ {
+ delete iSmsSendReq; // Delete object
+ iSmsSendReq = NULL; // Reset pointer
+
+ // Response for send SMS request
+ if ( EMobileSmsMessagingSendMessage == sendData.iIpc )
+ {
+ iSmsNoFdnCheckFlag = ESmsNoFdnCheckNotUsed;
+ CompleteSendMessage( KErrGeneral, NULL );
+ }
+ // Response for send SAT SMS request
+ else if ( EMmTsySmsSendSatMessage == sendData.iIpc )
+ {
+ CompleteSendSatMessage( KErrGeneral );
+ }
+ // Response for send SMS NoFdnCheck request
+ else if ( EMobileSmsMessagingSendMessageNoFdnCheck ==
+ sendData.iIpc )
+ {
+ iSmsNoFdnCheckFlag = ESmsNoFdnCheckUsed;
+TFLOGSTRING2("TSY: CMmSmsTsy::ResendSms. EMobileSmsMessagingSendMessageNoFdnCheck: %d", sendData.iIpc);
+ CompleteSendMessageNoFdnCheck( KErrGeneral, NULL );
+ }
+ }
+ else
+ {
+ iSmsSendReq->IncreaseSendCounter();
+ }
+ }
+ }
+
+// ---------------------------------------------------------------------------
+// CMmSmsTsy::IsRequestPossibleInOffLine
+// Checks wether a ETel request can be performed or not while offline mode is
+// enabled
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+TBool CMmSmsTsy::IsRequestPossibleInOffline( TInt aIpc ) const
+ {
+ TBool isRequestPossible ( ETrue );
+ switch ( aIpc )
+ {
+ case EMobileSmsMessagingSendMessage: //NO
+ case EMobileSmsMessagingSendMessageNoFdnCheck: //NO
+ isRequestPossible = EFalse;
+ break;
+ // case EMobileSmsMessagingSetReceiveMode:
+ // case EMobileSmsMessagingNotifyReceiveModeChange:
+ // case EMobileSmsMessagingReceiveMessage:
+ // case EMobileSmsMessagingAckSmsStored:
+ // case EMobileSmsMessagingNackSmsStored:
+ // case EMobileSmsMessagingResumeSmsReception: //request is possible
+ //(will be delayed
+ // and sent later, see
+ // ResumeSmsReception)
+ // case EMobileSmsMessagingNotifyMoSmsBearerChange:
+ // case EMobileSmsMessagingGetMessageStoreInfo:
+ // case EMobileSmsMessagingGetSmspListPhase1:
+ // case EMobileSmsMessagingNotifySmspListChange:
+ // case EMobileSmsMessagingStoreSmspList:
+ default:
+ break;
+ }
+
+ return isRequestPossible;
+ }
+
+// ---------------------------------------------------------------------------
+// CMmSmsTsy::SendMessageNoFdnCheckCancel
+// Cancels SendMessageNoFdnCheck request.
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+TInt CMmSmsTsy::SendMessageNoFdnCheckCancel(
+ const TTsyReqHandle aTsyReqHandle )
+ {
+TFLOGSTRING("TSY: CMmSmsTsy::SendMessageNoFdnCheckCancel" );
+ // Reset req handle. Returns the deleted req handle
+ TTsyReqHandle reqHandle = iTsyReqHandleStore->ResetTsyReqHandle(
+ EMultimodeSmsSendMessageNoFdnCheck );
+
+ if ( EMultimodeSmsReqHandleUnknown < reqHandle )
+ {
+ ReqCompleted( aTsyReqHandle, KErrCancel );
+
+ iSmsNoFdnCheckFlag = ESmsNoFdnCheckUnknown;
+ }
+
+ return KErrNone;
+ }
+
+//----------------------------------------------------------------------------
+// CMmSmsTsy::CompleteSendMessageNoFdnCheck
+// Complete SendMessage request
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+void CMmSmsTsy::CompleteSendMessageNoFdnCheck(
+ TInt aError,
+ CMmDataPackage* aDataPackage )
+ {
+ if ( ( KErrNone != aError ) && ( KErrTimedOut != aError )
+ && ( KErrGsmSMSOperationNotAllowed !=
+ CMmCommonStaticUtility::ExtendedErrorCode ( aError ) )
+ // FDB check failed
+ && ( KErrGsmSMSUnspecifiedProtocolError !=
+ CMmCommonStaticUtility::ExtendedErrorCode ( aError ) )
+ && ( KErrSatControl !=
+ CMmCommonStaticUtility::ExtendedErrorCode ( aError ) )
+ && ( !( iMmPhone->GetSatMessaging() &&
+ iMmPhone->GetSatMessaging()->IsMoSmControlBySimActivated() ) )
+ && ( NULL != iSmsSendReq ) && ( 2 >=
+ iSmsSendReq->GetSendCounter() ) )
+ {
+ // DOS returned error to send request. Message might be tried to be
+ // resent (see method ResendSms).
+ // Timeout mechanism cannot access this part of code, ever.
+TFLOGSTRING2("TSY: CMmSmsTsy::CompleteSendMessageNoFdnCheck. Resend counter: %d", iSmsSendReq->GetSendCounter());
+ }
+ else
+ {
+ // This is executed
+ // - if sending was successful
+ // - if there are no more resending attempts
+ // - if timer expires (called from the Complete of CMmSmsTsy class)
+
+ // Delete send message entry from send array
+ if ( iSmsSendReq )
+ {
+ delete iSmsSendReq; // Delete object
+ iSmsSendReq = NULL; // Reset pointer
+ }
+
+ // reset req handle and complete request
+ TTsyReqHandle reqHandle = iTsyReqHandleStore->
+ ResetTsyReqHandle( EMultimodeSmsSendMessageNoFdnCheck );
+
+ if ( EMultimodeSmsReqHandleUnknown < reqHandle )
+ {
+ // get values only if there was no error, and if return pointer to
+ // client is available
+ if ( KErrNone == aError && iSendMessageMsgAttrPckgPtr )
+ {
+ TInt16 msgRef( 0 );
+ TBuf8<RMobileSmsMessaging::KGsmTpduSize> smsMsg;
+
+ aDataPackage->UnPackData( msgRef, smsMsg );
+
+ RMobileSmsMessaging::TMobileSmsSendAttributesV1Pckg* attsPckg =
+ reinterpret_cast<
+ RMobileSmsMessaging::TMobileSmsSendAttributesV1Pckg* >(
+ iSendMessageMsgAttrPckgPtr );
+ RMobileSmsMessaging::TMobileSmsSendAttributesV1& msgAttr =
+ ( *attsPckg )();
+
+ msgAttr.iFlags = RMobileSmsMessaging::KMessageReference;
+ msgAttr.iMsgRef = static_cast< TUint16 >( msgRef );
+
+ if ( NULL != smsMsg.Length() )
+ {
+ msgAttr.iSubmitReport.Copy(smsMsg);
+ msgAttr.iFlags |= RMobileSmsMessaging::KGsmSubmitReport;
+ }
+ }
+
+ ReqCompleted( reqHandle, aError );
+ // reset pointer to client memory
+ iSendMessageMsgAttrPckgPtr = NULL;
+
+ iSmsNoFdnCheckFlag = ESmsNoFdnCheckUnknown;
+ }
+ }
+
+ // Resend unsent message
+ ResendSms();
+ }
+
+
+// End of File