--- a/telephonyserverplugins/common_tsy/commontsy/src/mmsms/cmmsmsstoragetsy.cpp Mon May 03 13:37:20 2010 +0300
+++ b/telephonyserverplugins/common_tsy/commontsy/src/mmsms/cmmsmsstoragetsy.cpp Thu May 06 15:10:38 2010 +0100
@@ -1,1361 +1,1361 @@
-// Copyright (c) 2006-2009 Nokia Corporation and/or its subsidiary(-ies).
-// All rights reserved.
-// This component and the accompanying materials are made available
-// under the terms of "Eclipse Public License v1.0"
-// which accompanies this distribution, and is available
-// at the URL "http://www.eclipse.org/legal/epl-v10.html".
-//
-// Initial Contributors:
-// Nokia Corporation - initial contribution.
-//
-// Contributors:
-//
-// Description:
-//
-
-
-
-// INCLUDE FILES
-#include <etelmm.h>
-#include "cmmsmsstoragetsy.h"
-#include "cmmphonetsy.h"
-#include "cmmsmstsy.h"
-#include "cmmsmsextinterface.h"
-#include "MmTsy_numberOfSlots.h"
-#include <ctsy/pluginapi/cmmdatapackage.h>
-#include <ctsy/tflogger.h>
-
-// ======== MEMBER FUNCTIONS ========
-
-CMmSmsStorageTsy::CMmSmsStorageTsy():
- iReqHandleType(CMmSmsTsy::EMultimodeSmsReqHandleUnknown)
- {
- }
-
-void CMmSmsStorageTsy::ConstructL()
- {
-TFLOGSTRING("TSY: CMmSmsStorageTsy::ConstructL\n");
- ResetVariables();
-
- iSmsListArray = new ( ELeave ) CArrayPtrFlat<TSmsMsg>( 1 );
- iSmsReadAllArray = new ( ELeave ) CArrayPtrFlat<CListReadAllAttempt>( 1 );
-
- // register sms storage tsy in the message manager
- iMmPhone->MessageManager()->RegisterTsyObject(
- CMmMessageManagerBase::EPhoneStoreTsy, this );
- }
-
-CMmSmsStorageTsy* CMmSmsStorageTsy::NewL(
- CMmSmsTsy* aMmSmsTsy,
- CMmPhoneTsy* aMmPhone,
- CMmSmsExtInterface* aMmSmsExtInterface,
- CMmTsyReqHandleStore* aMmTsyReqHandleStore )
- {
- CMmSmsStorageTsy* subsession = new ( ELeave ) CMmSmsStorageTsy();
- CleanupClosePushL( *subsession );
- subsession->iMmSmsTsy = aMmSmsTsy;
- subsession->iMmPhone = aMmPhone;
- subsession->iMmSmsExtInterface = aMmSmsExtInterface;
- subsession->iMmTsyReqHandleStore = aMmTsyReqHandleStore;
- subsession->ConstructL();
- CleanupStack::Pop(subsession);
-
- return subsession;
- }
-
-CMmSmsStorageTsy::~CMmSmsStorageTsy()
- {
-TFLOGSTRING("TSY: CMmSmsStorageTsy::~CMmSmsStorageTsy");
- if ( iMmPhone )
- {
- // deregister tsy object from message manager
- iMmPhone->MessageManager()->DeregisterTsyObject(this);
- }
-
- if ( iSmsListArray )
- {
- delete iSmsListArray;
- }
- iSmsListArray = NULL;
-
- iSmsReadAllArray->ResetAndDestroy();
- if ( iSmsReadAllArray )
- {
- delete iSmsReadAllArray;
- }
- iSmsReadAllArray = NULL;
-
- // Set pointers to NULL
- iMmTsyReqHandleStore = NULL;
- iMmPhone = NULL;
- iMmSmsExtInterface = NULL;
- iGetInfoInfoPtr = NULL;
- iNotifySmsStoreEventIndexPtr = NULL;
- iReadSmsEntryPtr = NULL;
- iReadAllBufSizePtr = NULL;
- iWriteSmsEntryPtr = NULL;
- iNotifySmsStoreEventPtr = NULL;
-
-
- // Set CMmSmsTsy's SmsStoragePointer to NULL
- iMmSmsTsy->SetSmsStorageTsy( NULL );
- iMmSmsTsy = NULL;
- }
-
-// ---------------------------------------------------------------------------
-// CMmSmsStorageTsy::Init
-// Initialisation method
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-void CMmSmsStorageTsy::Init()
- {
-TFLOGSTRING("TSY: CMmSmsStorageTsy::Init.");
- // Send request to the Domestic OS layer.
- TRAP_IGNORE( iMmPhone->MessageManager()->HandleRequestL(
- EMobilePhoneStoreGetInfo ); );
- }
-
-// ---------------------------------------------------------------------------
-// CMmSmsStorageTsy::ExtFunc
-// Handle sms storage related requests that doesn't need
-// trapping or call DoExtFuncL-method
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-TInt CMmSmsStorageTsy::ExtFunc(
- const TTsyReqHandle aTsyReqHandle,
- const TInt aIpc,
- const TDataPackage& aPackage )
- {
- TInt ret( KErrNone );
- TAny* dataPtr = aPackage.Ptr1();
-
- switch ( aIpc )
- {
- // SMS storage requests that doesn't need trapping
- case EMobilePhoneStoreReadAllPhase2:
- ret = ReadAllSmsPhase2( aTsyReqHandle,
- REINTERPRET_CAST( RMobilePhone::TClientId*, dataPtr ),
- aPackage.Des2n() );
- break;
- // SMS storage 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==CMmSmsTsy::EMultimodeSmsReqHandleUnknown, User::Invariant());
-
- TInt leaveCode( KErrNone );
- TRAP( leaveCode, ret = DoExtFuncL( aTsyReqHandle, aIpc,
- aPackage ); );
-
- if ( KErrNone != leaveCode )
- {
- ReqCompleted( aTsyReqHandle, leaveCode );
- }
-
- // save request handle
- if ( CMmSmsTsy::EMultimodeSmsReqHandleUnknown != iReqHandleType )
- {
-#ifdef REQHANDLE_TIMER
- iMmSmsTsy->SetTypeOfResponse( iReqHandleType, aTsyReqHandle );
-#else
- // Never comes here. See SetTypeOfResponse.
- iMmTsyReqHandleStore->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 = CMmSmsTsy::EMultimodeSmsReqHandleUnknown;
- }
- break;
- }
-
- return ret;
- }
-
-// ---------------------------------------------------------------------------
-// CMmSmsStorageTsy::DoExtFunc
-// Handling of sms storage related requests that needs trapping
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-TInt CMmSmsStorageTsy::DoExtFuncL(
- const TTsyReqHandle aTsyReqHandle,
- const TInt aIpc,
- const TDataPackage& aPackage )
- {
- TAny* dataPtr = aPackage.Ptr1();
- TAny* dataPtr2 = aPackage.Ptr2();
-
- TInt ret( KErrNone );
-
- switch ( aIpc )
- {
- // SMS message storage requests
- case EMobilePhoneStoreGetInfo:
- ret = GetInfoL( aTsyReqHandle, aPackage.Des1n() );
- break;
- case EMobilePhoneStoreRead:
- ret = ReadSmsL( aTsyReqHandle, aPackage.Des1n() );
- break;
- case EMobilePhoneStoreWrite:
- ret = WriteSmsL( aTsyReqHandle, aPackage.Des1n() );
- break;
- case EMobilePhoneStoreDelete:
- ret = DeleteSmsL( aTsyReqHandle,
- REINTERPRET_CAST( TInt*, dataPtr ) );
- break;
- case EMobilePhoneStoreDeleteAll:
- ret = DeleteAllSmsL( aTsyReqHandle );
- break;
- case EMobilePhoneStoreNotifyStoreEvent:
- ret = NotifySmsStoreEvent( REINTERPRET_CAST(
- RMobilePhoneStore::TMobileStoreEvent*, dataPtr ),
- REINTERPRET_CAST( TInt*, dataPtr2 ) );
- break;
- case EMobilePhoneStoreReadAllPhase1:
- ret = ReadAllSmsPhase1L( aTsyReqHandle, REINTERPRET_CAST(
- CRetrieveMobilePhoneSmsList::TBatchRequestData*, dataPtr ),
- REINTERPRET_CAST( TInt*, dataPtr2 ) );
- break;
- default:
- ret = KErrNotSupported;
- break;
- }
-
- return ret;
- }
-
-// ---------------------------------------------------------------------------
-// CMmSmsStorageTsy::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 CMmSmsStorageTsy::CancelService(
- const TInt aIpc,
- const TTsyReqHandle aTsyReqHandle )
- {
- TInt ret( KErrNone );
-
- switch ( aIpc )
- {
- case EMobilePhoneStoreGetInfo:
- ret = GetInfoCancel( aTsyReqHandle );
- break;
- case EMobilePhoneStoreRead:
- ret = ReadSmsCancel( aTsyReqHandle );
- break;
- case EMobilePhoneStoreWrite:
- case EMobilePhoneStoreDelete:
- case EMobilePhoneStoreDeleteAll:
- ret = KErrNone;
- break;
- case EMobilePhoneStoreNotifyStoreEvent:
- ret = NotifySmsStoreEventCancel( aTsyReqHandle );
- break;
- case EMobilePhoneStoreReadAllPhase1:
- case EMobilePhoneStoreReadAllPhase2:
- ret = ReadAllSmsCancel( aTsyReqHandle );
- break;
- default:
- ret = KErrGeneral;
- break;
- }
-
- return ret;
- }
-
-// ---------------------------------------------------------------------------
-// CMmSmsStorageTsy::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 CMmSmsStorageTsy::ReqModeL(
- const TInt aIpc )
- {
- CTelObject::TReqMode ret( 0 );
- switch ( aIpc )
- {
- // Non-flow Controlled Services
- case EMobilePhoneStoreGetInfo:
- case EMobilePhoneStoreRead:
- case EMobilePhoneStoreWrite:
- case EMobilePhoneStoreDelete:
- case EMobilePhoneStoreDeleteAll:
- case EMobilePhoneStoreReadAllPhase1:
- case EMobilePhoneStoreReadAllPhase2:
- break;
- // Multiple Completion Services with Immediate Server Repost
- case EMobilePhoneStoreNotifyStoreEvent:
- ret = KReqModeMultipleCompletionEnabled |
- KReqModeRePostImmediately;
- break;
- default:
- User::Leave( KErrNotSupported );
- break;
- }
-
- return ret;
- }
-
-// ---------------------------------------------------------------------------
-// CMmSmsStorageTsy::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 CMmSmsStorageTsy::NumberOfSlotsL(
- const TInt aIpc )
- {
- TInt numberOfSlots( 1 );
-
- switch ( aIpc )
- {
- case EMobilePhoneStoreNotifyStoreEvent:
- numberOfSlots = KMmPhoneStoreNotifyStoreEventSlots;
- break;
- default:
- User::Leave( KErrNotSupported );
- break;
- }
-
- return numberOfSlots;
- }
-
-// ---------------------------------------------------------------------------
-// CMmSmsStorageTsy::OpenNewObjectL
-// This method opens extendable sub-sessions
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-CTelObject* CMmSmsStorageTsy::OpenNewObjectL(
- TDes& /*aName*/ )
- {
- User::Leave( KErrNotSupported );
- //lint -e{527} "unreachable code"
-
- return NULL;
- }
-
-// ---------------------------------------------------------------------------
-// CMmSmsStorageTsy::OpenNewObjectByNameL
-// This method opens extendable sub-sessions
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-CTelObject* CMmSmsStorageTsy::OpenNewObjectByNameL(
- const TDesC& /*aName*/ )
- {
- User::Leave( KErrNotSupported );
- //lint -e{527} "unreachable code"
-
- return NULL;
- }
-
-// ---------------------------------------------------------------------------
-// CMmSmsStorageTsy::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 CMmSmsStorageTsy::RegisterNotification(
- const TInt aIpc )
- {
- TInt ret( KErrNone );
-
- switch ( aIpc )
- {
- case EMobilePhoneStoreNotifyStoreEvent:
- ret = KErrNone;
- break;
- default:
- ret = KErrNotSupported;
- break;
- }
-
- return ret;
- }
-
-// ---------------------------------------------------------------------------
-// CMmSmsStorageTsy::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 CMmSmsStorageTsy::DeregisterNotification(
- const TInt aIpc )
- {
- TInt ret( KErrNotSupported );
-
- switch ( aIpc )
- {
- case EMobilePhoneStoreNotifyStoreEvent:
- ret = KErrNone;
- break;
- default:
- ret = KErrNotSupported;
- break;
- }
-
- return ret;
- }
-
-// ---------------------------------------------------------------------------
-// CMmSmsStorageTsy::GetInfoL
-// This method start getting info prosess from selected store (SIM)
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-TInt CMmSmsStorageTsy::GetInfoL(
- const TTsyReqHandle aTsyReqHandle,
- TDes8* aSmsStoreInfoPckg )
- {
-
- TInt ret = KErrArgument;
-
- if (aSmsStoreInfoPckg)
- {
-
- RMobilePhoneStore::TMobilePhoneStoreInfoV1 temp;
- TPckg<RMobilePhoneStore::TMobilePhoneStoreInfoV1Pckg> tempPckg(temp);
-
- TInt expectedLength = tempPckg.MaxLength();
- TInt paramLength = aSmsStoreInfoPckg->MaxLength();
-
- if (paramLength >= expectedLength)
- {
- TTsyReqHandle getInfoHandle = iMmTsyReqHandleStore->GetTsyReqHandle(
- CMmSmsTsy::EMultimodeSmsGetInfo );
-
- if ( CMmSmsTsy::EMultimodeSmsReqHandleUnknown < getInfoHandle )
- {
- // 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
- {
- iGetInfoInfoPtr = aSmsStoreInfoPckg;
-
- // allow for EMobilePhoneStoreGetInfo immediate completion
-#ifdef REQHANDLE_TIMER
- iMmSmsTsy->SetTypeOfResponse( CMmSmsTsy::EMultimodeSmsGetInfo,
- aTsyReqHandle );
-#else
- // Never comes here. See SetTypeOfResponse.
- iMmTsyReqHandleStore->SetTsyReqHandle(
- CMmSmsTsy::EMultimodeSmsGetInfo, aTsyReqHandle );
-#endif // REQHANDLE_TIMER
-
- // Send request to the Domestic OS layer.
- ret = iMmPhone->MessageManager()->HandleRequestL(
- EMobilePhoneStoreGetInfo );
-
- // dos layer returned with error and didn't complete request
- if ( ret != KErrNone && iMmTsyReqHandleStore->ResetTsyReqHandle(
- CMmSmsTsy::EMultimodeSmsGetInfo) )
- {
- ReqCompleted( aTsyReqHandle, ret );
- }
- }
-
- ret = KErrNone;
- }
- }
-
- return ret;
- }
-
-// ---------------------------------------------------------------------------
-// CMmSmsStorageTsy::GetInfoCancel
-// This method cancel GetInfo request
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-TInt CMmSmsStorageTsy::GetInfoCancel(
- const TTsyReqHandle aTsyReqHandle )
- {
- iMmTsyReqHandleStore->ResetTsyReqHandle(
- CMmSmsTsy::EMultimodeSmsGetInfo );
- ReqCompleted( aTsyReqHandle, KErrCancel );
-
- return KErrNone;
- }
-
-// ---------------------------------------------------------------------------
-// CMmSmsStorageTsy::CompleteGetInfo
-// Complete Clients GetInfo request
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-void CMmSmsStorageTsy::CompleteGetInfo(
- TInt aResult,
- CMmDataPackage* aDataPackage )
- {
- TUint8 totalEntries( 0 );
- TInt usedEntries( 0 );
-
- TTsyReqHandle reqHandle = iMmTsyReqHandleStore->ResetTsyReqHandle(
- CMmSmsTsy::EMultimodeSmsGetInfo );
-
- if ( ( KErrNone == aResult ) || ( KErrNotFound == aResult ) )
- {
- aDataPackage->UnPackData( totalEntries, usedEntries );
- }
- iTotalEntries = totalEntries;
- iUsedEntries = usedEntries;
-
- // set the member variable to aTotalEntries. It Will be used
- // when it writes SMS on SIM card
- iMmSmsTsy->SetSmsNumOfLoc ( totalEntries );
-
- if ( reqHandle )
- {
- // Request was compeleted successfully
- if ( ( KErrNone == aResult ) || ( KErrNotFound == aResult ) )
- {
- aResult = iMmSmsExtInterface->StoreInfo(
- iGetInfoInfoPtr, totalEntries, usedEntries );
- }
- ReqCompleted( reqHandle, aResult );
- }
- }
-
-// ---------------------------------------------------------------------------
-// CMmSmsStorageTsy::ReadSmsL
-// This method start SMS message reading process from selected location
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-TInt CMmSmsStorageTsy::ReadSmsL(
- const TTsyReqHandle aTsyReqHandle,
- TDes8* aSmsPckg )
- {
- TInt ret( KErrArgument );
-
- if ( aSmsPckg )
- {
- TInt paramLength = aSmsPckg->MaxLength();
-
- RMobileSmsStore::TMobileGsmSmsEntryV1 temp;
- RMobileSmsStore::TMobileGsmSmsEntryV1Pckg tempPckg(temp);
-
- TInt expectedLength = tempPckg.MaxLength();
-
- if (paramLength == expectedLength)
- {
-
- TTsyReqHandle readSmsHandle = iMmTsyReqHandleStore->GetTsyReqHandle(
- CMmSmsTsy::EMultimodeSimStSmsReadSms );
-
- if ( CMmSmsTsy::EMultimodeSmsReqHandleUnknown < readSmsHandle )
- {
- // 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
- {
- RMobileSmsStore::TMobileGsmSmsEntryV1Pckg* smsPckg =
- reinterpret_cast< RMobileSmsStore::TMobileGsmSmsEntryV1Pckg* >
- ( aSmsPckg );
- RMobileSmsStore::TMobileGsmSmsEntryV1& smsEntry = ( *smsPckg )();
-
- iReadSmsEntryPtr = aSmsPckg;
-
- CMmDataPackage package;
- package.PackData( &smsEntry.iIndex );
-
-
- // allow for EMobilePhoneStoreRead immediate completion
-#ifdef REQHANDLE_TIMER
- iMmSmsTsy->SetTypeOfResponse( CMmSmsTsy::EMultimodeSimStSmsReadSms,
- aTsyReqHandle );
-#else
- // Never comes here. See SetTypeOfResponse.
- iMmTsyReqHandleStore->SetTsyReqHandle(
- CMmSmsTsy::EMultimodeSimStSmsReadSms, aTsyReqHandle );
-#endif // REQHANDLE_TIMER
-
- // send request to DOS layer
- ret = iMmPhone->MessageManager()->HandleRequestL(
- EMobilePhoneStoreRead, &package );
-
- // DOS layer returned error (without completing request)
- if ( KErrNone != ret && iMmTsyReqHandleStore->ResetTsyReqHandle(
- CMmSmsTsy::EMultimodeSimStSmsReadSms ))
- {
- ReqCompleted( aTsyReqHandle, ret );
- }
- }
- ret = KErrNone;
- }
- }
-
- return ret;
- }
-
-// ---------------------------------------------------------------------------
-// CMmSmsStorageTsy::ReadSmsCancel
-// This method cancels Read request
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-TInt CMmSmsStorageTsy::ReadSmsCancel(
- const TTsyReqHandle aTsyReqHandle )
- {
- iMmTsyReqHandleStore->ResetTsyReqHandle(
- CMmSmsTsy::EMultimodeSimStSmsReadSms );
- ReqCompleted( aTsyReqHandle, KErrCancel );
-
- return KErrNone;
- }
-
-// ---------------------------------------------------------------------------
-// CMmSmsStorageTsy::CompleteReadSms
-// Complete Clients Read Sms request
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-void CMmSmsStorageTsy::CompleteReadSms(
- TInt aResult,
- CMmDataPackage* aDataPackage )
- {
-TFLOGSTRING2("TSY: CMmSmsStorageTsy::CompleteReadSms. Error: %d",aResult);
- TTsyReqHandle reqHandle = iMmTsyReqHandleStore->ResetTsyReqHandle(
- CMmSmsTsy::EMultimodeSimStSmsReadSms );
-
- if ( reqHandle )
- {
- if ( KErrNone == aResult )
- {
- TSmsMsg* smsMsg;
- aDataPackage->UnPackData( &smsMsg );
- aResult = UnpackSmsReadEntryPackage( iReadSmsEntryPtr, smsMsg );
- }
- ReqCompleted( reqHandle, aResult );
- }
- }
-
-// ---------------------------------------------------------------------------
-// CMmSmsStorageTsy::WriteSmsL
-// This method start SMS message writing prosess to the
-// selected location
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-TInt CMmSmsStorageTsy::WriteSmsL(
- const TTsyReqHandle aTsyReqHandle,
- TDesC8* aSmsPckg )
- {
- TTsyReqHandle writeSmsHandle = iMmTsyReqHandleStore->GetTsyReqHandle(
- CMmSmsTsy::EMultimodeSimStSmsWriteSms );
-
- if ( sizeof( RMobilePhoneStore::TMobilePhoneStoreEntryV1 ) > aSmsPckg->Length() )
- {
- TFLOGSTRING ("TSY: CMmSmsStorageTsy::WriteSms bad size argument");
- // Complete the request with appropiate error
- return KErrArgument;
- }
-
- if ( CMmSmsTsy::EMultimodeSmsReqHandleUnknown < writeSmsHandle )
- {
- // 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
- {
- TInt ret (0 );
-
- // typecast for aEntry
- RMobileSmsStore::TMobileGsmSmsEntryV1Pckg* entryPckg =
- reinterpret_cast< RMobileSmsStore::TMobileGsmSmsEntryV1Pckg* >
- ( aSmsPckg );
- RMobileSmsStore::TMobileGsmSmsEntryV1 entry = ( *entryPckg )();
-
- iWriteSmsEntryPtr = aSmsPckg;
-
- // pack data
- CMmDataPackage package;
- package.PackData( &aSmsPckg, &entry.iIndex );
-
- ret = iMmPhone->MessageManager()->HandleRequestL(
- EMobilePhoneStoreWrite, &package );
-
- if ( KErrNone == ret )
- {
- iReqHandleType = CMmSmsTsy::EMultimodeSimStSmsWriteSms;
- }
- else
- {
- // Message construction failed or phonet sender returned error
- ReqCompleted( aTsyReqHandle, ret );
- }
- }
-
- return KErrNone;
- }
-
-// ---------------------------------------------------------------------------
-// CMmSmsStorageTsy::CompleteWriteSms
-// Complete Clients WriteSms request
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-void CMmSmsStorageTsy::CompleteWriteSms(
- TInt aResult,
- CMmDataPackage* aDataPackage )
- {
-TFLOGSTRING2("TSY: CMmSmsStorageTsy::CompleteWriteSms. Error: %d",aResult);
- TTsyReqHandle reqHandle = iMmTsyReqHandleStore->ResetTsyReqHandle(
- CMmSmsTsy::EMultimodeSimStSmsWriteSms );
-
- if ( reqHandle )
- {
- TUint8 location( 0 );
- TBool receivedClass2ToBeResent ( EFalse );
- if( aDataPackage )
- {
- aDataPackage->UnPackData( location, receivedClass2ToBeResent );
- }
- if ( KErrNone == aResult )
- {
- TInt ret = UnpackSmsWriteEntryPackage( iWriteSmsEntryPtr,
- location );
-
- CompleteNotifyStoreEvent( location,
- RMobilePhoneStore::KStoreEntryAdded );
-
- ReqCompleted( reqHandle, ret );
- }
- else
- {
- // SIM full
- if ( KErrDiskFull == aResult )
- {
- CompleteNotifyStoreEvent( -1, RMobilePhoneStore::KStoreFull );
- }
- ReqCompleted( reqHandle, aResult );
- }
-
- if ( receivedClass2ToBeResent )
- {
- // silently IGNORE if call to DOS fails
- TInt trapError = 0;
- TRAP( trapError, iMmPhone->MessageManager()->HandleRequestL(
- EMobileSmsMessagingResumeSmsReception ); );
- }
- }
- }
-
-// ---------------------------------------------------------------------------
-// CMmSmsStorageTsy::DeleteSmsL
-// This method start SMS message deleting prosess on the
-// selected location
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-TInt CMmSmsStorageTsy::DeleteSmsL(
- const TTsyReqHandle aTsyReqHandle,
- TInt* aIndex )
- {
- TTsyReqHandle deleteSmsHandle = iMmTsyReqHandleStore->GetTsyReqHandle(
- CMmSmsTsy::EMultimodeSimStSmsEraseSms );
-
- if ( 0 < deleteSmsHandle )
- {
- // 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
- {
- iDeleteSmsIndex = *aIndex;
-
- CMmDataPackage package;
- package.PackData( aIndex );
-
- TInt ret = iMmPhone->MessageManager()->HandleRequestL(
- EMobilePhoneStoreDelete, &package );
-
- if ( KErrNone == ret )
- {
- iReqHandleType = CMmSmsTsy::EMultimodeSimStSmsEraseSms;
- }
- else
- {
- // Message construction failed or phonet sender returned error
- ReqCompleted( aTsyReqHandle, ret );
- }
- }
-
- return KErrNone;
- }
-
-// ---------------------------------------------------------------------------
-// CMmSmsStorageTsy::CompleteDeleteSms
-// Complete Clients DeleteSms request
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-void CMmSmsStorageTsy::CompleteDeleteSms(
- TInt aResult )
- {
-TFLOGSTRING2("TSY: CMmSmsStorageTsy::CompleteDeleteSms. Error: %d", aResult);
- TTsyReqHandle reqHandle = iMmTsyReqHandleStore->ResetTsyReqHandle(
- CMmSmsTsy::EMultimodeSimStSmsEraseSms );
-
- if ( reqHandle )
- {
- if ( KErrNone == aResult )
- {
- // Notify that one entry was deleted from the store.
- CompleteNotifyStoreEvent( iDeleteSmsIndex,
- RMobilePhoneStore::KStoreEntryDeleted );
- }
- ReqCompleted( reqHandle, aResult );
- }
- }
-
-// ---------------------------------------------------------------------------
-// CMmSmsStorageTsy::DeleteAllSmsL
-// This method start Delete all messages prosess on the selected
-// Store. Method make SimStSms Erase Request where location of
-// slot (KDeleteAllSmsMessagesIndex) is zero. It means that all
-// memory locations are erased
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-TInt CMmSmsStorageTsy::DeleteAllSmsL(
- const TTsyReqHandle aTsyReqHandle )
- {
- TTsyReqHandle deleteAllSmsHandle = iMmTsyReqHandleStore->GetTsyReqHandle(
- CMmSmsTsy::EMultimodeSimStSmsEraseAllSms );
-
- if ( 0 < deleteAllSmsHandle )
- {
- // 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
- {
- // Send request to the Domestic OS layer.
- TInt ret = iMmPhone->MessageManager()->HandleRequestL(
- EMobilePhoneStoreDeleteAll );
-
- if ( KErrNone == ret )
- {
- iReqHandleType = CMmSmsTsy::EMultimodeSimStSmsEraseAllSms;
- }
- else
- {
- // Message construction failed or phonet sender returned error
- ReqCompleted( aTsyReqHandle, ret );
- }
- }
-
- return KErrNone;
- }
-
-// ---------------------------------------------------------------------------
-// CMmSmsStorageTsy::CompleteDeleteAllSms
-// Complete Clients DeleteAllSms request
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-void CMmSmsStorageTsy::CompleteDeleteAllSms(
- TInt aResult )
- {
-TFLOGSTRING2( "TSY: CMmSmsStorageTsy::CompleteDeleteAllSms. Error: %d", aResult );
- TTsyReqHandle reqHandle = iMmTsyReqHandleStore->ResetTsyReqHandle(
- CMmSmsTsy::EMultimodeSimStSmsEraseAllSms );
-
- if ( reqHandle )
- {
- if ( KErrNone == aResult )
- {
- // Notify that all messages were deleted from the store.
- CompleteNotifyStoreEvent( -1, RMobilePhoneStore::KStoreEmpty );
- }
- ReqCompleted( reqHandle, aResult );
- }
- }
-
-// ---------------------------------------------------------------------------
-// CMmSmsStorageTsy::NotifySmsStoreEvent
-// This method activates notifying of SMS store events
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-TInt CMmSmsStorageTsy::NotifySmsStoreEvent(
- RMobilePhoneStore::TMobileStoreEvent* aEvent,
- TInt* aIndex )
- {
- iReqHandleType = CMmSmsTsy::EMultimodeSimSmsNotifyStoreEvent;
- iNotifySmsStoreEventPtr = aEvent;
- iNotifySmsStoreEventIndexPtr = aIndex;
-
- return KErrNone;
- }
-
-// ---------------------------------------------------------------------------
-// CMmSmsStorageTsy::NotifyStoreEventCancel
-// This method cancels NotifyStoreEventCancel request
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-TInt CMmSmsStorageTsy::NotifySmsStoreEventCancel(
- const TTsyReqHandle aTsyReqHandle )
- {
- iMmTsyReqHandleStore->ResetTsyReqHandle(
- CMmSmsTsy::EMultimodeSimSmsNotifyStoreEvent );
- ReqCompleted( aTsyReqHandle, KErrCancel );
-
- return KErrNone;
- }
-
-// ---------------------------------------------------------------------------
-// CMmSmsStorageTsy::CompleteNotifyStoreEvent
-// This method is called when some of SMS store events happen
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-void CMmSmsStorageTsy::CompleteNotifyStoreEvent(
- TInt aLocation,
- TUint32 aEvent )
- {
- TTsyReqHandle reqHandle = iMmTsyReqHandleStore->ResetTsyReqHandle(
- CMmSmsTsy::EMultimodeSimSmsNotifyStoreEvent );
-
- // if new entry has been added to Store, get correct notification
- if ( RMobilePhoneStore::KStoreEntryAdded == aEvent )
- {
- // if store has space, get "StoreAdded" notifications
- iUsedEntries++;
-TFLOGSTRING("TSY: CMmSmsStorageTsy::StoreEntryAdded notifications");
- if ( iUsedEntries == iTotalEntries )
- {
- // if store gets full after class2 message, get "StoreAdded and
- // StoreFull" notifications
-TFLOGSTRING("TSY: CMmSmsStorageTsy::StoreEntryAdded and StoreFull notifications");
- aEvent = ( RMobilePhoneStore::KStoreFull |
- RMobilePhoneStore::KStoreEntryAdded );
- }
- }
- // if one or more entry has been deleted from store, get correct
- // notifications
- if ( RMobilePhoneStore::KStoreEntryDeleted == aEvent )
- {
- // if entry has been deleted from store, get "EntryDeleted"
- // notification
- iUsedEntries--;
-TFLOGSTRING("TSY: CMmSmsStorageTsy::StoreEntryDeleted notifications");
- if ( (iUsedEntries+1) == iTotalEntries )
- {
- // if store has been full, after deleting get notifications
- // "EntryDeleted" and "StoreHasSpace"
-TFLOGSTRING("TSY: CMmSmsStorageTsy::StoreEntryDeleted and StoreHasSpace notifications");
- aEvent = ( RMobilePhoneStore::KStoreHasSpace |
- RMobilePhoneStore::KStoreEntryDeleted );
- }
- if ( 0 == iUsedEntries )
- {
- aEvent = (
- RMobilePhoneStore::KStoreEmpty
- | RMobilePhoneStore::KStoreEntryDeleted );
- }
-
- }
-
- if ( reqHandle )
- {
-
- TUint32* smsStoreEvent = REINTERPRET_CAST( TUint32*,
- iNotifySmsStoreEventPtr );
-
- *smsStoreEvent = aEvent;
- *iNotifySmsStoreEventIndexPtr = aLocation;
-
-TFLOGSTRING3("TSY: CMmSmsStorageTsy::CompleteNotifyStoreEvent:notified client about event=0x%x, location=%d", aEvent, aLocation );
- ReqCompleted( reqHandle, KErrNone );
- }
- }
-
-// ---------------------------------------------------------------------------
-// CMmSmsStorageTsy::ReadAllSmsPhase1L
-// This method starts first phase of SMS messages retrieval. On
-// the first phase method store locations temporarely to the TSY.
-// On the second phase method copy the streamed list to the
-// client
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-TInt CMmSmsStorageTsy::ReadAllSmsPhase1L(
- const TTsyReqHandle aTsyReqHandle,
- CRetrieveMobilePhoneSmsList::TBatchRequestData const* aRequest,
- TInt* aBufSize )
- {
-TFLOGSTRING("TSY: CMmSmsStorageTsy::ReadAllSmsPhase1L");
- TInt ret( KErrNone );
-
- TTsyReqHandle readAllSmsHandle = iMmTsyReqHandleStore->GetTsyReqHandle(
- CMmSmsTsy::EMultimodeSimStSmsReadAllSms );
-
- if ( CMmSmsTsy::EMultimodeSmsReqHandleUnknown < readAllSmsHandle )
- {
- // 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 ( aRequest->iBatchRequest ||
- iMmSmsExtInterface->GetSupportedEntry() != aRequest->iEntryType )
- {
- // Client is asking for batch of SMS store entries or CDMA SMS store
- // entries. This feature is not supported.
- ReqCompleted( aTsyReqHandle, KErrNotSupported );
- }
- else
- {
-TFLOGSTRING("TSY: CMmSmsStorageTsy::ReadAllSmsPhase1. SMS reading starts.");
- // Client is asking for all SMS store entries
- iReadAllBufSizePtr = aBufSize;
- iReadAllId = aRequest->iClient;
-
- // Lets reset the array
- iSmsListArray->Reset();
-
- // SMS storage contains messages
- if ( 0 < iMmSmsTsy->GetSmsNumOfLoc () )
- {
- // allow for EMobilePhoneStoreReadAllPhase1 immediate completion
-#ifdef REQHANDLE_TIMER
- iMmSmsTsy->SetTypeOfResponse(
- CMmSmsTsy::EMultimodeSimStSmsReadAllSms, aTsyReqHandle );
-#else
- iMmTsyReqHandleStore->SetTsyReqHandle(
- CMmSmsTsy::EMultimodeSimStSmsReadAllSms, aTsyReqHandle );
-#endif // REQHANDLE_TIMER
-
- // Lets read first message from store
- // First index is 1
- ret = iMmPhone->MessageManager()->HandleRequestL(
- EMobilePhoneStoreReadAllPhase1 );
-
- if ( KErrNone != ret )
- {
-TFLOGSTRING2("TSY: CMmSmsStorageTsy::ReadAllSmsPhase1L - and the returned value for EMobilePhoneStoreReadAllPhase1:%d", ret);
- (void)iMmTsyReqHandleStore->ResetTsyReqHandle( CMmSmsTsy::EMultimodeSimStSmsReadAllSms );
- // the returned value from ResetTsyReqHandle is not needed.
- }
- }
- // SMS Storage contains 0 messages
- else
- {
- ret = KErrNotFound;
- }
-
- // DOS layer returned with error
- if ( ret != KErrNone )
- {
-TFLOGSTRING3("TSY: CMmSmsStorageTsy::ReadAllSmsPhase1L aTsyReqHandle: %d and ret:%d", aTsyReqHandle, ret);
- ReqCompleted( aTsyReqHandle, ret );
- }
-
- }
-
- return KErrNone;
- }
-
-// ---------------------------------------------------------------------------
-// CMmSmsStorageTsy::ReadAllSmsPhase2
-// This method handle and complete second phase of SMS messages retrieval
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-TInt CMmSmsStorageTsy::ReadAllSmsPhase2(
- const TTsyReqHandle aTsyReqHandle,
- RMobilePhone::TClientId const* aId,
- TDes8* aBuffer )
- {
-TFLOGSTRING("TSY: CMmSmsStorageTsy::ReadAllSmsPhase2");
- CListReadAllAttempt* read = NULL;
-
- // Find the read attempt from this client
- for ( TInt i = 0 ; i < iSmsReadAllArray->Count() ; ++i )
- {
- read = iSmsReadAllArray->At( i );
- if ( ( read->iClient.iSessionHandle == aId->iSessionHandle ) &&
- ( read->iClient.iSubSessionHandle == aId->iSubSessionHandle ) )
- {
- TPtr8 bufPtr( ( read->iListBuf )->Ptr( 0 ) );
- // Copy the streamed list to the client
- aBuffer->Copy( bufPtr );
- delete read;
- iSmsReadAllArray->Delete( i );
- ReqCompleted( aTsyReqHandle, KErrNone );
-
- return KErrNone;
- }
- }
-
- // Doesn't found the matching client from read all phase 1
- iSmsReadAllArray->ResetAndDestroy();
- ReqCompleted( aTsyReqHandle, KErrCorrupt );
-
- return KErrNone;
- }
-
-// ---------------------------------------------------------------------------
-// CMmSmsStorageTsy::ReadAllSmsCancel
-// This method cancels read all SMSes request
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-TInt CMmSmsStorageTsy::ReadAllSmsCancel(
- const TTsyReqHandle aTsyReqHandle )
- {
-TFLOGSTRING("TSY: CMmSmsStorageTsy::ReadAllSmsCancel");
- iMmTsyReqHandleStore->ResetTsyReqHandle(
- CMmSmsTsy::EMultimodeSimStSmsReadAllSms );
-
- iSmsListArray->Reset();
- iSmsReadAllArray->ResetAndDestroy();
-
- ReqCompleted( aTsyReqHandle, KErrCancel );
-
- return KErrNone;
- }
-
-// ---------------------------------------------------------------------------
-// CMmSmsStorageTsy::RetrieveSmsListReadSmsL
-// Complete SimStSmsReadReq request and calls CompleteReadAllSmsPhase1-method
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-void CMmSmsStorageTsy::RetrieveSmsListReadSmsL(
- TInt aResult,
- CMmDataPackage* aDataPackage )
- {
-TFLOGSTRING("TSY: CMmSmsStorageTsy::RetrieveSmsListReadSmsL");
-
- TTsyReqHandle reqHandle = iMmTsyReqHandleStore->GetTsyReqHandle(
- CMmSmsTsy::EMultimodeSimStSmsReadAllSms );
-
- // Flag which wil indicates if Class2 SMS has been received while
- // it was reading the SMS Slots.
- TBool receivedClass2ToBeReSent;
-
- CArrayPtrFlat<TSmsMsg>* tempSmsListArray = NULL;
-
- if ( reqHandle )
- {
- aDataPackage->UnPackData( tempSmsListArray, receivedClass2ToBeReSent );
-
- for ( TInt i = 0; i < tempSmsListArray->Count(); i++ )
- {
- iSmsListArray->AppendL( tempSmsListArray->At( i ) );
- }
-
- tempSmsListArray->Reset();
- tempSmsListArray = NULL;
-
- // if last slot was empty or used
- if ( ( KErrNotFound == aResult ) || ( KErrNone == aResult ) )
- {
- if ( 0 < iSmsListArray->Count() )
- {
- // Store contained SMS messages
- TInt ret = iMmSmsExtInterface->CompleteReadAllSmsPhase1L(
- iSmsListArray, // SMS message list storage array
- iReadAllId, // Read all SMS messages Id
- iSmsReadAllArray, // Read all SMS messages array
- iReadAllBufSizePtr // Read all SMS messages pointer
- );
- CompleteReadAllSmsPhase1( ret, receivedClass2ToBeReSent );
- }
- else
- {
- // Store was empty
- CompleteReadAllSmsPhase1( KErrNotFound,
- receivedClass2ToBeReSent );
- }
- }
- else
- {
- CompleteReadAllSmsPhase1( aResult, receivedClass2ToBeReSent );
- }
- }
- }
-
-// ---------------------------------------------------------------------------
-// CMmSmsStorageTsy::CompleteReadAllSmsPhase1
-// This method completes client's ReadAllSmsPhase1 request
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-void CMmSmsStorageTsy::CompleteReadAllSmsPhase1(
- TInt aResult,
- TBool aReceivedClass2ToBeReSent )
- {
-TFLOGSTRING2("TSY: CMmSmsStorageTsy::CompleteReadAllSmsPhase1. Complete read first phase error: %d", aResult);
- TTsyReqHandle reqHandle = iMmTsyReqHandleStore->ResetTsyReqHandle(
- CMmSmsTsy::EMultimodeSimStSmsReadAllSms );
- if ( reqHandle )
- {
- // Complete first phase of list retrieval
- ReqCompleted( reqHandle, aResult );
- iSmsListArray->Reset();
-
-TFLOGSTRING2("TSY: CMmSmsStorageTsy::CompleteReadAllSmsPhase1 aReceivedClass2ToBeReSent: %d",aReceivedClass2ToBeReSent);
- if ( aReceivedClass2ToBeReSent )
- {
- // silently IGNORE if call to DOS fails
- TInt trapError = 0;
- TRAP( trapError, iMmPhone->MessageManager()->HandleRequestL(
- EMobileSmsMessagingResumeSmsReception ); );
- }
- }
- }
-
-// ---------------------------------------------------------------------------
-// CMmSmsStorageTsy::GetTsyReqHandleStore
-// Get pointer to Tsy request handle store
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-CMmTsyReqHandleStore* CMmSmsStorageTsy::GetTsyReqHandleStore()
- {
- // TAN to be removed before releasing?
- return iMmTsyReqHandleStore;
- }
-
-// ---------------------------------------------------------------------------
-// CMmSmsStorageTsy::ResetVariables
-// Reset all used variables
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-void CMmSmsStorageTsy::ResetVariables()
- {
- // get info variables
- iGetInfoInfoPtr = NULL;
-
- // read sms variables
- iReadSmsEntryPtr = NULL;
-
- // write sms variables
- iWriteSmsEntryPtr = NULL;
-
- // notify SMS store event
- iNotifySmsStoreEventPtr = NULL;
- iNotifySmsStoreEventIndexPtr = NULL;
-
- // read all parameter sets variables
- iReadAllBufSizePtr = NULL;
- iUsedEntries = 0;
- iTotalEntries = 0;
- }
-
-// ---------------------------------------------------------------------------
-// CMmSmsStorageTsy::UnpackSmsReadEntryPackage
-// This method unpack a entry package and set contents of a message to the
-// entry.
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-TInt CMmSmsStorageTsy::UnpackSmsReadEntryPackage(
- TAny* aReadSmsEntryPtr,
- TSmsMsg* aSmsMsg )
- {
- RMobileSmsStore::TMobileGsmSmsEntryV1Pckg* entryPckg =
- REINTERPRET_CAST( RMobileSmsStore::TMobileGsmSmsEntryV1Pckg*,
- aReadSmsEntryPtr );
- RMobileSmsStore::TMobileGsmSmsEntryV1& entry = ( *entryPckg )();
-
- switch( aSmsMsg->iMessageStatus )
- {
- case KSimSmsMoNotSent: //0x07
- entry.iMsgStatus = RMobileSmsStore::EStoredMessageUnsent;
- break;
- case KSimSmsStatusReportReqNotReceived: //0x0D
- case KSimSmsMoSent: //0x05
- entry.iMsgStatus = RMobileSmsStore::EStoredMessageSent;
- break;
- case KSimSmsMtRead: //0x01
- entry.iMsgStatus = RMobileSmsStore::EStoredMessageRead;
- break;
- case KSimSmsMtNotRead: //0x03
- entry.iMsgStatus = RMobileSmsStore::EStoredMessageUnread;
- break;
- case KSimSmsStatusReportReqReceivedNotStored: //0x15
- case KSimSmsStatusReportReqReceivedStored: //0x1D
- entry.iMsgStatus = RMobileSmsStore::EStoredMessageDelivered;
- break;
- default:
- entry.iMsgStatus = RMobileSmsStore::EStoredMessageUnknownStatus;
- break;
- }
-
- // TMobileSmsFixedEntryV1 information
- entry.iMsgData.Copy( aSmsMsg->iSmsMsg );
-
- // Lets handle Service Centre address
- entry.iServiceCentre.iTypeOfNumber = aSmsMsg->iMobileScTON;
- entry.iServiceCentre.iNumberPlan = aSmsMsg->iMobileScNPI;
- entry.iServiceCentre.iTelNumber.Copy( aSmsMsg->iServiceCentre );
-
- return KErrNone;
- }
-
-// ---------------------------------------------------------------------------
-// CMmSmsStorageTsy::UnpackSmsWriteEntryPackage
-// This method unpack a entry package and set location of the slot to the
-// entry.
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-TInt CMmSmsStorageTsy::UnpackSmsWriteEntryPackage(
- TAny* aWriteSmsEntryPtr,
- TInt aLocation )
- {
- RMobileSmsStore::TMobileGsmSmsEntryV1Pckg*
- entryPckg = REINTERPRET_CAST
- ( RMobileSmsStore::TMobileGsmSmsEntryV1Pckg*, aWriteSmsEntryPtr );
- RMobileSmsStore::TMobileGsmSmsEntryV1& entry = ( *entryPckg )();
-
- // Let's copy location index
- entry.iIndex = aLocation;
-
- return KErrNone;
- }
-
-// End of File
+// Copyright (c) 2006-2009 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of "Eclipse Public License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.eclipse.org/legal/epl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+//
+
+
+
+// INCLUDE FILES
+#include <etelmm.h>
+#include "cmmsmsstoragetsy.h"
+#include "cmmphonetsy.h"
+#include "cmmsmstsy.h"
+#include "cmmsmsextinterface.h"
+#include "MmTsy_numberOfSlots.h"
+#include <ctsy/pluginapi/cmmdatapackage.h>
+#include <ctsy/tflogger.h>
+
+// ======== MEMBER FUNCTIONS ========
+
+CMmSmsStorageTsy::CMmSmsStorageTsy():
+ iReqHandleType(CMmSmsTsy::EMultimodeSmsReqHandleUnknown)
+ {
+ }
+
+void CMmSmsStorageTsy::ConstructL()
+ {
+TFLOGSTRING("TSY: CMmSmsStorageTsy::ConstructL\n");
+ ResetVariables();
+
+ iSmsListArray = new ( ELeave ) CArrayPtrFlat<TSmsMsg>( 1 );
+ iSmsReadAllArray = new ( ELeave ) CArrayPtrFlat<CListReadAllAttempt>( 1 );
+
+ // register sms storage tsy in the message manager
+ iMmPhone->MessageManager()->RegisterTsyObject(
+ CMmMessageManagerBase::EPhoneStoreTsy, this );
+ }
+
+CMmSmsStorageTsy* CMmSmsStorageTsy::NewL(
+ CMmSmsTsy* aMmSmsTsy,
+ CMmPhoneTsy* aMmPhone,
+ CMmSmsExtInterface* aMmSmsExtInterface,
+ CMmTsyReqHandleStore* aMmTsyReqHandleStore )
+ {
+ CMmSmsStorageTsy* subsession = new ( ELeave ) CMmSmsStorageTsy();
+ CleanupClosePushL( *subsession );
+ subsession->iMmSmsTsy = aMmSmsTsy;
+ subsession->iMmPhone = aMmPhone;
+ subsession->iMmSmsExtInterface = aMmSmsExtInterface;
+ subsession->iMmTsyReqHandleStore = aMmTsyReqHandleStore;
+ subsession->ConstructL();
+ CleanupStack::Pop(subsession);
+
+ return subsession;
+ }
+
+CMmSmsStorageTsy::~CMmSmsStorageTsy()
+ {
+TFLOGSTRING("TSY: CMmSmsStorageTsy::~CMmSmsStorageTsy");
+ if ( iMmPhone )
+ {
+ // deregister tsy object from message manager
+ iMmPhone->MessageManager()->DeregisterTsyObject(this);
+ }
+
+ if ( iSmsListArray )
+ {
+ delete iSmsListArray;
+ }
+ iSmsListArray = NULL;
+
+ iSmsReadAllArray->ResetAndDestroy();
+ if ( iSmsReadAllArray )
+ {
+ delete iSmsReadAllArray;
+ }
+ iSmsReadAllArray = NULL;
+
+ // Set pointers to NULL
+ iMmTsyReqHandleStore = NULL;
+ iMmPhone = NULL;
+ iMmSmsExtInterface = NULL;
+ iGetInfoInfoPtr = NULL;
+ iNotifySmsStoreEventIndexPtr = NULL;
+ iReadSmsEntryPtr = NULL;
+ iReadAllBufSizePtr = NULL;
+ iWriteSmsEntryPtr = NULL;
+ iNotifySmsStoreEventPtr = NULL;
+
+
+ // Set CMmSmsTsy's SmsStoragePointer to NULL
+ iMmSmsTsy->SetSmsStorageTsy( NULL );
+ iMmSmsTsy = NULL;
+ }
+
+// ---------------------------------------------------------------------------
+// CMmSmsStorageTsy::Init
+// Initialisation method
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+void CMmSmsStorageTsy::Init()
+ {
+TFLOGSTRING("TSY: CMmSmsStorageTsy::Init.");
+ // Send request to the Domestic OS layer.
+ TRAP_IGNORE( iMmPhone->MessageManager()->HandleRequestL(
+ EMobilePhoneStoreGetInfo ); );
+ }
+
+// ---------------------------------------------------------------------------
+// CMmSmsStorageTsy::ExtFunc
+// Handle sms storage related requests that doesn't need
+// trapping or call DoExtFuncL-method
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+TInt CMmSmsStorageTsy::ExtFunc(
+ const TTsyReqHandle aTsyReqHandle,
+ const TInt aIpc,
+ const TDataPackage& aPackage )
+ {
+ TInt ret( KErrNone );
+ TAny* dataPtr = aPackage.Ptr1();
+
+ switch ( aIpc )
+ {
+ // SMS storage requests that doesn't need trapping
+ case EMobilePhoneStoreReadAllPhase2:
+ ret = ReadAllSmsPhase2( aTsyReqHandle,
+ REINTERPRET_CAST( RMobilePhone::TClientId*, dataPtr ),
+ aPackage.Des2n() );
+ break;
+ // SMS storage 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==CMmSmsTsy::EMultimodeSmsReqHandleUnknown, User::Invariant());
+
+ TInt leaveCode( KErrNone );
+ TRAP( leaveCode, ret = DoExtFuncL( aTsyReqHandle, aIpc,
+ aPackage ); );
+
+ if ( KErrNone != leaveCode )
+ {
+ ReqCompleted( aTsyReqHandle, leaveCode );
+ }
+
+ // save request handle
+ if ( CMmSmsTsy::EMultimodeSmsReqHandleUnknown != iReqHandleType )
+ {
+#ifdef REQHANDLE_TIMER
+ iMmSmsTsy->SetTypeOfResponse( iReqHandleType, aTsyReqHandle );
+#else
+ // Never comes here. See SetTypeOfResponse.
+ iMmTsyReqHandleStore->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 = CMmSmsTsy::EMultimodeSmsReqHandleUnknown;
+ }
+ break;
+ }
+
+ return ret;
+ }
+
+// ---------------------------------------------------------------------------
+// CMmSmsStorageTsy::DoExtFunc
+// Handling of sms storage related requests that needs trapping
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+TInt CMmSmsStorageTsy::DoExtFuncL(
+ const TTsyReqHandle aTsyReqHandle,
+ const TInt aIpc,
+ const TDataPackage& aPackage )
+ {
+ TAny* dataPtr = aPackage.Ptr1();
+ TAny* dataPtr2 = aPackage.Ptr2();
+
+ TInt ret( KErrNone );
+
+ switch ( aIpc )
+ {
+ // SMS message storage requests
+ case EMobilePhoneStoreGetInfo:
+ ret = GetInfoL( aTsyReqHandle, aPackage.Des1n() );
+ break;
+ case EMobilePhoneStoreRead:
+ ret = ReadSmsL( aTsyReqHandle, aPackage.Des1n() );
+ break;
+ case EMobilePhoneStoreWrite:
+ ret = WriteSmsL( aTsyReqHandle, aPackage.Des1n() );
+ break;
+ case EMobilePhoneStoreDelete:
+ ret = DeleteSmsL( aTsyReqHandle,
+ REINTERPRET_CAST( TInt*, dataPtr ) );
+ break;
+ case EMobilePhoneStoreDeleteAll:
+ ret = DeleteAllSmsL( aTsyReqHandle );
+ break;
+ case EMobilePhoneStoreNotifyStoreEvent:
+ ret = NotifySmsStoreEvent( REINTERPRET_CAST(
+ RMobilePhoneStore::TMobileStoreEvent*, dataPtr ),
+ REINTERPRET_CAST( TInt*, dataPtr2 ) );
+ break;
+ case EMobilePhoneStoreReadAllPhase1:
+ ret = ReadAllSmsPhase1L( aTsyReqHandle, REINTERPRET_CAST(
+ CRetrieveMobilePhoneSmsList::TBatchRequestData*, dataPtr ),
+ REINTERPRET_CAST( TInt*, dataPtr2 ) );
+ break;
+ default:
+ ret = KErrNotSupported;
+ break;
+ }
+
+ return ret;
+ }
+
+// ---------------------------------------------------------------------------
+// CMmSmsStorageTsy::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 CMmSmsStorageTsy::CancelService(
+ const TInt aIpc,
+ const TTsyReqHandle aTsyReqHandle )
+ {
+ TInt ret( KErrNone );
+
+ switch ( aIpc )
+ {
+ case EMobilePhoneStoreGetInfo:
+ ret = GetInfoCancel( aTsyReqHandle );
+ break;
+ case EMobilePhoneStoreRead:
+ ret = ReadSmsCancel( aTsyReqHandle );
+ break;
+ case EMobilePhoneStoreWrite:
+ case EMobilePhoneStoreDelete:
+ case EMobilePhoneStoreDeleteAll:
+ ret = KErrNone;
+ break;
+ case EMobilePhoneStoreNotifyStoreEvent:
+ ret = NotifySmsStoreEventCancel( aTsyReqHandle );
+ break;
+ case EMobilePhoneStoreReadAllPhase1:
+ case EMobilePhoneStoreReadAllPhase2:
+ ret = ReadAllSmsCancel( aTsyReqHandle );
+ break;
+ default:
+ ret = KErrGeneral;
+ break;
+ }
+
+ return ret;
+ }
+
+// ---------------------------------------------------------------------------
+// CMmSmsStorageTsy::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 CMmSmsStorageTsy::ReqModeL(
+ const TInt aIpc )
+ {
+ CTelObject::TReqMode ret( 0 );
+ switch ( aIpc )
+ {
+ // Non-flow Controlled Services
+ case EMobilePhoneStoreGetInfo:
+ case EMobilePhoneStoreRead:
+ case EMobilePhoneStoreWrite:
+ case EMobilePhoneStoreDelete:
+ case EMobilePhoneStoreDeleteAll:
+ case EMobilePhoneStoreReadAllPhase1:
+ case EMobilePhoneStoreReadAllPhase2:
+ break;
+ // Multiple Completion Services with Immediate Server Repost
+ case EMobilePhoneStoreNotifyStoreEvent:
+ ret = KReqModeMultipleCompletionEnabled |
+ KReqModeRePostImmediately;
+ break;
+ default:
+ User::Leave( KErrNotSupported );
+ break;
+ }
+
+ return ret;
+ }
+
+// ---------------------------------------------------------------------------
+// CMmSmsStorageTsy::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 CMmSmsStorageTsy::NumberOfSlotsL(
+ const TInt aIpc )
+ {
+ TInt numberOfSlots( 1 );
+
+ switch ( aIpc )
+ {
+ case EMobilePhoneStoreNotifyStoreEvent:
+ numberOfSlots = KMmPhoneStoreNotifyStoreEventSlots;
+ break;
+ default:
+ User::Leave( KErrNotSupported );
+ break;
+ }
+
+ return numberOfSlots;
+ }
+
+// ---------------------------------------------------------------------------
+// CMmSmsStorageTsy::OpenNewObjectL
+// This method opens extendable sub-sessions
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+CTelObject* CMmSmsStorageTsy::OpenNewObjectL(
+ TDes& /*aName*/ )
+ {
+ User::Leave( KErrNotSupported );
+ //lint -e{527} "unreachable code"
+
+ return NULL;
+ }
+
+// ---------------------------------------------------------------------------
+// CMmSmsStorageTsy::OpenNewObjectByNameL
+// This method opens extendable sub-sessions
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+CTelObject* CMmSmsStorageTsy::OpenNewObjectByNameL(
+ const TDesC& /*aName*/ )
+ {
+ User::Leave( KErrNotSupported );
+ //lint -e{527} "unreachable code"
+
+ return NULL;
+ }
+
+// ---------------------------------------------------------------------------
+// CMmSmsStorageTsy::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 CMmSmsStorageTsy::RegisterNotification(
+ const TInt aIpc )
+ {
+ TInt ret( KErrNone );
+
+ switch ( aIpc )
+ {
+ case EMobilePhoneStoreNotifyStoreEvent:
+ ret = KErrNone;
+ break;
+ default:
+ ret = KErrNotSupported;
+ break;
+ }
+
+ return ret;
+ }
+
+// ---------------------------------------------------------------------------
+// CMmSmsStorageTsy::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 CMmSmsStorageTsy::DeregisterNotification(
+ const TInt aIpc )
+ {
+ TInt ret( KErrNotSupported );
+
+ switch ( aIpc )
+ {
+ case EMobilePhoneStoreNotifyStoreEvent:
+ ret = KErrNone;
+ break;
+ default:
+ ret = KErrNotSupported;
+ break;
+ }
+
+ return ret;
+ }
+
+// ---------------------------------------------------------------------------
+// CMmSmsStorageTsy::GetInfoL
+// This method start getting info prosess from selected store (SIM)
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+TInt CMmSmsStorageTsy::GetInfoL(
+ const TTsyReqHandle aTsyReqHandle,
+ TDes8* aSmsStoreInfoPckg )
+ {
+
+ TInt ret = KErrArgument;
+
+ if (aSmsStoreInfoPckg)
+ {
+
+ RMobilePhoneStore::TMobilePhoneStoreInfoV1 temp;
+ TPckg<RMobilePhoneStore::TMobilePhoneStoreInfoV1Pckg> tempPckg(temp);
+
+ TInt expectedLength = tempPckg.MaxLength();
+ TInt paramLength = aSmsStoreInfoPckg->MaxLength();
+
+ if (paramLength >= expectedLength)
+ {
+ TTsyReqHandle getInfoHandle = iMmTsyReqHandleStore->GetTsyReqHandle(
+ CMmSmsTsy::EMultimodeSmsGetInfo );
+
+ if ( CMmSmsTsy::EMultimodeSmsReqHandleUnknown < getInfoHandle )
+ {
+ // 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
+ {
+ iGetInfoInfoPtr = aSmsStoreInfoPckg;
+
+ // allow for EMobilePhoneStoreGetInfo immediate completion
+#ifdef REQHANDLE_TIMER
+ iMmSmsTsy->SetTypeOfResponse( CMmSmsTsy::EMultimodeSmsGetInfo,
+ aTsyReqHandle );
+#else
+ // Never comes here. See SetTypeOfResponse.
+ iMmTsyReqHandleStore->SetTsyReqHandle(
+ CMmSmsTsy::EMultimodeSmsGetInfo, aTsyReqHandle );
+#endif // REQHANDLE_TIMER
+
+ // Send request to the Domestic OS layer.
+ ret = iMmPhone->MessageManager()->HandleRequestL(
+ EMobilePhoneStoreGetInfo );
+
+ // dos layer returned with error and didn't complete request
+ if ( ret != KErrNone && iMmTsyReqHandleStore->ResetTsyReqHandle(
+ CMmSmsTsy::EMultimodeSmsGetInfo) )
+ {
+ ReqCompleted( aTsyReqHandle, ret );
+ }
+ }
+
+ ret = KErrNone;
+ }
+ }
+
+ return ret;
+ }
+
+// ---------------------------------------------------------------------------
+// CMmSmsStorageTsy::GetInfoCancel
+// This method cancel GetInfo request
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+TInt CMmSmsStorageTsy::GetInfoCancel(
+ const TTsyReqHandle aTsyReqHandle )
+ {
+ iMmTsyReqHandleStore->ResetTsyReqHandle(
+ CMmSmsTsy::EMultimodeSmsGetInfo );
+ ReqCompleted( aTsyReqHandle, KErrCancel );
+
+ return KErrNone;
+ }
+
+// ---------------------------------------------------------------------------
+// CMmSmsStorageTsy::CompleteGetInfo
+// Complete Clients GetInfo request
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+void CMmSmsStorageTsy::CompleteGetInfo(
+ TInt aResult,
+ CMmDataPackage* aDataPackage )
+ {
+ TUint8 totalEntries( 0 );
+ TInt usedEntries( 0 );
+
+ TTsyReqHandle reqHandle = iMmTsyReqHandleStore->ResetTsyReqHandle(
+ CMmSmsTsy::EMultimodeSmsGetInfo );
+
+ if ( ( KErrNone == aResult ) || ( KErrNotFound == aResult ) )
+ {
+ aDataPackage->UnPackData( totalEntries, usedEntries );
+ }
+ iTotalEntries = totalEntries;
+ iUsedEntries = usedEntries;
+
+ // set the member variable to aTotalEntries. It Will be used
+ // when it writes SMS on SIM card
+ iMmSmsTsy->SetSmsNumOfLoc ( totalEntries );
+
+ if ( reqHandle )
+ {
+ // Request was compeleted successfully
+ if ( ( KErrNone == aResult ) || ( KErrNotFound == aResult ) )
+ {
+ aResult = iMmSmsExtInterface->StoreInfo(
+ iGetInfoInfoPtr, totalEntries, usedEntries );
+ }
+ ReqCompleted( reqHandle, aResult );
+ }
+ }
+
+// ---------------------------------------------------------------------------
+// CMmSmsStorageTsy::ReadSmsL
+// This method start SMS message reading process from selected location
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+TInt CMmSmsStorageTsy::ReadSmsL(
+ const TTsyReqHandle aTsyReqHandle,
+ TDes8* aSmsPckg )
+ {
+ TInt ret( KErrArgument );
+
+ if ( aSmsPckg )
+ {
+ TInt paramLength = aSmsPckg->MaxLength();
+
+ RMobileSmsStore::TMobileGsmSmsEntryV1 temp;
+ RMobileSmsStore::TMobileGsmSmsEntryV1Pckg tempPckg(temp);
+
+ TInt expectedLength = tempPckg.MaxLength();
+
+ if (paramLength == expectedLength)
+ {
+
+ TTsyReqHandle readSmsHandle = iMmTsyReqHandleStore->GetTsyReqHandle(
+ CMmSmsTsy::EMultimodeSimStSmsReadSms );
+
+ if ( CMmSmsTsy::EMultimodeSmsReqHandleUnknown < readSmsHandle )
+ {
+ // 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
+ {
+ RMobileSmsStore::TMobileGsmSmsEntryV1Pckg* smsPckg =
+ reinterpret_cast< RMobileSmsStore::TMobileGsmSmsEntryV1Pckg* >
+ ( aSmsPckg );
+ RMobileSmsStore::TMobileGsmSmsEntryV1& smsEntry = ( *smsPckg )();
+
+ iReadSmsEntryPtr = aSmsPckg;
+
+ CMmDataPackage package;
+ package.PackData( &smsEntry.iIndex );
+
+
+ // allow for EMobilePhoneStoreRead immediate completion
+#ifdef REQHANDLE_TIMER
+ iMmSmsTsy->SetTypeOfResponse( CMmSmsTsy::EMultimodeSimStSmsReadSms,
+ aTsyReqHandle );
+#else
+ // Never comes here. See SetTypeOfResponse.
+ iMmTsyReqHandleStore->SetTsyReqHandle(
+ CMmSmsTsy::EMultimodeSimStSmsReadSms, aTsyReqHandle );
+#endif // REQHANDLE_TIMER
+
+ // send request to DOS layer
+ ret = iMmPhone->MessageManager()->HandleRequestL(
+ EMobilePhoneStoreRead, &package );
+
+ // DOS layer returned error (without completing request)
+ if ( KErrNone != ret && iMmTsyReqHandleStore->ResetTsyReqHandle(
+ CMmSmsTsy::EMultimodeSimStSmsReadSms ))
+ {
+ ReqCompleted( aTsyReqHandle, ret );
+ }
+ }
+ ret = KErrNone;
+ }
+ }
+
+ return ret;
+ }
+
+// ---------------------------------------------------------------------------
+// CMmSmsStorageTsy::ReadSmsCancel
+// This method cancels Read request
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+TInt CMmSmsStorageTsy::ReadSmsCancel(
+ const TTsyReqHandle aTsyReqHandle )
+ {
+ iMmTsyReqHandleStore->ResetTsyReqHandle(
+ CMmSmsTsy::EMultimodeSimStSmsReadSms );
+ ReqCompleted( aTsyReqHandle, KErrCancel );
+
+ return KErrNone;
+ }
+
+// ---------------------------------------------------------------------------
+// CMmSmsStorageTsy::CompleteReadSms
+// Complete Clients Read Sms request
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+void CMmSmsStorageTsy::CompleteReadSms(
+ TInt aResult,
+ CMmDataPackage* aDataPackage )
+ {
+TFLOGSTRING2("TSY: CMmSmsStorageTsy::CompleteReadSms. Error: %d",aResult);
+ TTsyReqHandle reqHandle = iMmTsyReqHandleStore->ResetTsyReqHandle(
+ CMmSmsTsy::EMultimodeSimStSmsReadSms );
+
+ if ( reqHandle )
+ {
+ if ( KErrNone == aResult )
+ {
+ TSmsMsg* smsMsg;
+ aDataPackage->UnPackData( &smsMsg );
+ aResult = UnpackSmsReadEntryPackage( iReadSmsEntryPtr, smsMsg );
+ }
+ ReqCompleted( reqHandle, aResult );
+ }
+ }
+
+// ---------------------------------------------------------------------------
+// CMmSmsStorageTsy::WriteSmsL
+// This method start SMS message writing prosess to the
+// selected location
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+TInt CMmSmsStorageTsy::WriteSmsL(
+ const TTsyReqHandle aTsyReqHandle,
+ TDesC8* aSmsPckg )
+ {
+ TTsyReqHandle writeSmsHandle = iMmTsyReqHandleStore->GetTsyReqHandle(
+ CMmSmsTsy::EMultimodeSimStSmsWriteSms );
+
+ if ( sizeof( RMobilePhoneStore::TMobilePhoneStoreEntryV1 ) > aSmsPckg->Length() )
+ {
+ TFLOGSTRING ("TSY: CMmSmsStorageTsy::WriteSms bad size argument");
+ // Complete the request with appropiate error
+ return KErrArgument;
+ }
+
+ if ( CMmSmsTsy::EMultimodeSmsReqHandleUnknown < writeSmsHandle )
+ {
+ // 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
+ {
+ TInt ret (0 );
+
+ // typecast for aEntry
+ RMobileSmsStore::TMobileGsmSmsEntryV1Pckg* entryPckg =
+ reinterpret_cast< RMobileSmsStore::TMobileGsmSmsEntryV1Pckg* >
+ ( aSmsPckg );
+ RMobileSmsStore::TMobileGsmSmsEntryV1 entry = ( *entryPckg )();
+
+ iWriteSmsEntryPtr = aSmsPckg;
+
+ // pack data
+ CMmDataPackage package;
+ package.PackData( &aSmsPckg, &entry.iIndex );
+
+ ret = iMmPhone->MessageManager()->HandleRequestL(
+ EMobilePhoneStoreWrite, &package );
+
+ if ( KErrNone == ret )
+ {
+ iReqHandleType = CMmSmsTsy::EMultimodeSimStSmsWriteSms;
+ }
+ else
+ {
+ // Message construction failed or phonet sender returned error
+ ReqCompleted( aTsyReqHandle, ret );
+ }
+ }
+
+ return KErrNone;
+ }
+
+// ---------------------------------------------------------------------------
+// CMmSmsStorageTsy::CompleteWriteSms
+// Complete Clients WriteSms request
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+void CMmSmsStorageTsy::CompleteWriteSms(
+ TInt aResult,
+ CMmDataPackage* aDataPackage )
+ {
+TFLOGSTRING2("TSY: CMmSmsStorageTsy::CompleteWriteSms. Error: %d",aResult);
+ TTsyReqHandle reqHandle = iMmTsyReqHandleStore->ResetTsyReqHandle(
+ CMmSmsTsy::EMultimodeSimStSmsWriteSms );
+
+ if ( reqHandle )
+ {
+ TUint8 location( 0 );
+ TBool receivedClass2ToBeResent ( EFalse );
+ if( aDataPackage )
+ {
+ aDataPackage->UnPackData( location, receivedClass2ToBeResent );
+ }
+ if ( KErrNone == aResult )
+ {
+ TInt ret = UnpackSmsWriteEntryPackage( iWriteSmsEntryPtr,
+ location );
+
+ CompleteNotifyStoreEvent( location,
+ RMobilePhoneStore::KStoreEntryAdded );
+
+ ReqCompleted( reqHandle, ret );
+ }
+ else
+ {
+ // SIM full
+ if ( KErrDiskFull == aResult )
+ {
+ CompleteNotifyStoreEvent( -1, RMobilePhoneStore::KStoreFull );
+ }
+ ReqCompleted( reqHandle, aResult );
+ }
+
+ if ( receivedClass2ToBeResent )
+ {
+ // silently IGNORE if call to DOS fails
+ TInt trapError = 0;
+ TRAP( trapError, iMmPhone->MessageManager()->HandleRequestL(
+ EMobileSmsMessagingResumeSmsReception ); );
+ }
+ }
+ }
+
+// ---------------------------------------------------------------------------
+// CMmSmsStorageTsy::DeleteSmsL
+// This method start SMS message deleting prosess on the
+// selected location
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+TInt CMmSmsStorageTsy::DeleteSmsL(
+ const TTsyReqHandle aTsyReqHandle,
+ TInt* aIndex )
+ {
+ TTsyReqHandle deleteSmsHandle = iMmTsyReqHandleStore->GetTsyReqHandle(
+ CMmSmsTsy::EMultimodeSimStSmsEraseSms );
+
+ if ( 0 < deleteSmsHandle )
+ {
+ // 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
+ {
+ iDeleteSmsIndex = *aIndex;
+
+ CMmDataPackage package;
+ package.PackData( aIndex );
+
+ TInt ret = iMmPhone->MessageManager()->HandleRequestL(
+ EMobilePhoneStoreDelete, &package );
+
+ if ( KErrNone == ret )
+ {
+ iReqHandleType = CMmSmsTsy::EMultimodeSimStSmsEraseSms;
+ }
+ else
+ {
+ // Message construction failed or phonet sender returned error
+ ReqCompleted( aTsyReqHandle, ret );
+ }
+ }
+
+ return KErrNone;
+ }
+
+// ---------------------------------------------------------------------------
+// CMmSmsStorageTsy::CompleteDeleteSms
+// Complete Clients DeleteSms request
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+void CMmSmsStorageTsy::CompleteDeleteSms(
+ TInt aResult )
+ {
+TFLOGSTRING2("TSY: CMmSmsStorageTsy::CompleteDeleteSms. Error: %d", aResult);
+ TTsyReqHandle reqHandle = iMmTsyReqHandleStore->ResetTsyReqHandle(
+ CMmSmsTsy::EMultimodeSimStSmsEraseSms );
+
+ if ( reqHandle )
+ {
+ if ( KErrNone == aResult )
+ {
+ // Notify that one entry was deleted from the store.
+ CompleteNotifyStoreEvent( iDeleteSmsIndex,
+ RMobilePhoneStore::KStoreEntryDeleted );
+ }
+ ReqCompleted( reqHandle, aResult );
+ }
+ }
+
+// ---------------------------------------------------------------------------
+// CMmSmsStorageTsy::DeleteAllSmsL
+// This method start Delete all messages prosess on the selected
+// Store. Method make SimStSms Erase Request where location of
+// slot (KDeleteAllSmsMessagesIndex) is zero. It means that all
+// memory locations are erased
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+TInt CMmSmsStorageTsy::DeleteAllSmsL(
+ const TTsyReqHandle aTsyReqHandle )
+ {
+ TTsyReqHandle deleteAllSmsHandle = iMmTsyReqHandleStore->GetTsyReqHandle(
+ CMmSmsTsy::EMultimodeSimStSmsEraseAllSms );
+
+ if ( 0 < deleteAllSmsHandle )
+ {
+ // 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
+ {
+ // Send request to the Domestic OS layer.
+ TInt ret = iMmPhone->MessageManager()->HandleRequestL(
+ EMobilePhoneStoreDeleteAll );
+
+ if ( KErrNone == ret )
+ {
+ iReqHandleType = CMmSmsTsy::EMultimodeSimStSmsEraseAllSms;
+ }
+ else
+ {
+ // Message construction failed or phonet sender returned error
+ ReqCompleted( aTsyReqHandle, ret );
+ }
+ }
+
+ return KErrNone;
+ }
+
+// ---------------------------------------------------------------------------
+// CMmSmsStorageTsy::CompleteDeleteAllSms
+// Complete Clients DeleteAllSms request
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+void CMmSmsStorageTsy::CompleteDeleteAllSms(
+ TInt aResult )
+ {
+TFLOGSTRING2( "TSY: CMmSmsStorageTsy::CompleteDeleteAllSms. Error: %d", aResult );
+ TTsyReqHandle reqHandle = iMmTsyReqHandleStore->ResetTsyReqHandle(
+ CMmSmsTsy::EMultimodeSimStSmsEraseAllSms );
+
+ if ( reqHandle )
+ {
+ if ( KErrNone == aResult )
+ {
+ // Notify that all messages were deleted from the store.
+ CompleteNotifyStoreEvent( -1, RMobilePhoneStore::KStoreEmpty );
+ }
+ ReqCompleted( reqHandle, aResult );
+ }
+ }
+
+// ---------------------------------------------------------------------------
+// CMmSmsStorageTsy::NotifySmsStoreEvent
+// This method activates notifying of SMS store events
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+TInt CMmSmsStorageTsy::NotifySmsStoreEvent(
+ RMobilePhoneStore::TMobileStoreEvent* aEvent,
+ TInt* aIndex )
+ {
+ iReqHandleType = CMmSmsTsy::EMultimodeSimSmsNotifyStoreEvent;
+ iNotifySmsStoreEventPtr = aEvent;
+ iNotifySmsStoreEventIndexPtr = aIndex;
+
+ return KErrNone;
+ }
+
+// ---------------------------------------------------------------------------
+// CMmSmsStorageTsy::NotifyStoreEventCancel
+// This method cancels NotifyStoreEventCancel request
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+TInt CMmSmsStorageTsy::NotifySmsStoreEventCancel(
+ const TTsyReqHandle aTsyReqHandle )
+ {
+ iMmTsyReqHandleStore->ResetTsyReqHandle(
+ CMmSmsTsy::EMultimodeSimSmsNotifyStoreEvent );
+ ReqCompleted( aTsyReqHandle, KErrCancel );
+
+ return KErrNone;
+ }
+
+// ---------------------------------------------------------------------------
+// CMmSmsStorageTsy::CompleteNotifyStoreEvent
+// This method is called when some of SMS store events happen
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+void CMmSmsStorageTsy::CompleteNotifyStoreEvent(
+ TInt aLocation,
+ TUint32 aEvent )
+ {
+ TTsyReqHandle reqHandle = iMmTsyReqHandleStore->ResetTsyReqHandle(
+ CMmSmsTsy::EMultimodeSimSmsNotifyStoreEvent );
+
+ // if new entry has been added to Store, get correct notification
+ if ( RMobilePhoneStore::KStoreEntryAdded == aEvent )
+ {
+ // if store has space, get "StoreAdded" notifications
+ iUsedEntries++;
+TFLOGSTRING("TSY: CMmSmsStorageTsy::StoreEntryAdded notifications");
+ if ( iUsedEntries == iTotalEntries )
+ {
+ // if store gets full after class2 message, get "StoreAdded and
+ // StoreFull" notifications
+TFLOGSTRING("TSY: CMmSmsStorageTsy::StoreEntryAdded and StoreFull notifications");
+ aEvent = ( RMobilePhoneStore::KStoreFull |
+ RMobilePhoneStore::KStoreEntryAdded );
+ }
+ }
+ // if one or more entry has been deleted from store, get correct
+ // notifications
+ if ( RMobilePhoneStore::KStoreEntryDeleted == aEvent )
+ {
+ // if entry has been deleted from store, get "EntryDeleted"
+ // notification
+ iUsedEntries--;
+TFLOGSTRING("TSY: CMmSmsStorageTsy::StoreEntryDeleted notifications");
+ if ( (iUsedEntries+1) == iTotalEntries )
+ {
+ // if store has been full, after deleting get notifications
+ // "EntryDeleted" and "StoreHasSpace"
+TFLOGSTRING("TSY: CMmSmsStorageTsy::StoreEntryDeleted and StoreHasSpace notifications");
+ aEvent = ( RMobilePhoneStore::KStoreHasSpace |
+ RMobilePhoneStore::KStoreEntryDeleted );
+ }
+ if ( 0 == iUsedEntries )
+ {
+ aEvent = (
+ RMobilePhoneStore::KStoreEmpty
+ | RMobilePhoneStore::KStoreEntryDeleted );
+ }
+
+ }
+
+ if ( reqHandle )
+ {
+
+ TUint32* smsStoreEvent = REINTERPRET_CAST( TUint32*,
+ iNotifySmsStoreEventPtr );
+
+ *smsStoreEvent = aEvent;
+ *iNotifySmsStoreEventIndexPtr = aLocation;
+
+TFLOGSTRING3("TSY: CMmSmsStorageTsy::CompleteNotifyStoreEvent:notified client about event=0x%x, location=%d", aEvent, aLocation );
+ ReqCompleted( reqHandle, KErrNone );
+ }
+ }
+
+// ---------------------------------------------------------------------------
+// CMmSmsStorageTsy::ReadAllSmsPhase1L
+// This method starts first phase of SMS messages retrieval. On
+// the first phase method store locations temporarely to the TSY.
+// On the second phase method copy the streamed list to the
+// client
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+TInt CMmSmsStorageTsy::ReadAllSmsPhase1L(
+ const TTsyReqHandle aTsyReqHandle,
+ CRetrieveMobilePhoneSmsList::TBatchRequestData const* aRequest,
+ TInt* aBufSize )
+ {
+TFLOGSTRING("TSY: CMmSmsStorageTsy::ReadAllSmsPhase1L");
+ TInt ret( KErrNone );
+
+ TTsyReqHandle readAllSmsHandle = iMmTsyReqHandleStore->GetTsyReqHandle(
+ CMmSmsTsy::EMultimodeSimStSmsReadAllSms );
+
+ if ( CMmSmsTsy::EMultimodeSmsReqHandleUnknown < readAllSmsHandle )
+ {
+ // 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 ( aRequest->iBatchRequest ||
+ iMmSmsExtInterface->GetSupportedEntry() != aRequest->iEntryType )
+ {
+ // Client is asking for batch of SMS store entries or CDMA SMS store
+ // entries. This feature is not supported.
+ ReqCompleted( aTsyReqHandle, KErrNotSupported );
+ }
+ else
+ {
+TFLOGSTRING("TSY: CMmSmsStorageTsy::ReadAllSmsPhase1. SMS reading starts.");
+ // Client is asking for all SMS store entries
+ iReadAllBufSizePtr = aBufSize;
+ iReadAllId = aRequest->iClient;
+
+ // Lets reset the array
+ iSmsListArray->Reset();
+
+ // SMS storage contains messages
+ if ( 0 < iMmSmsTsy->GetSmsNumOfLoc () )
+ {
+ // allow for EMobilePhoneStoreReadAllPhase1 immediate completion
+#ifdef REQHANDLE_TIMER
+ iMmSmsTsy->SetTypeOfResponse(
+ CMmSmsTsy::EMultimodeSimStSmsReadAllSms, aTsyReqHandle );
+#else
+ iMmTsyReqHandleStore->SetTsyReqHandle(
+ CMmSmsTsy::EMultimodeSimStSmsReadAllSms, aTsyReqHandle );
+#endif // REQHANDLE_TIMER
+
+ // Lets read first message from store
+ // First index is 1
+ ret = iMmPhone->MessageManager()->HandleRequestL(
+ EMobilePhoneStoreReadAllPhase1 );
+
+ if ( KErrNone != ret )
+ {
+TFLOGSTRING2("TSY: CMmSmsStorageTsy::ReadAllSmsPhase1L - and the returned value for EMobilePhoneStoreReadAllPhase1:%d", ret);
+ (void)iMmTsyReqHandleStore->ResetTsyReqHandle( CMmSmsTsy::EMultimodeSimStSmsReadAllSms );
+ // the returned value from ResetTsyReqHandle is not needed.
+ }
+ }
+ // SMS Storage contains 0 messages
+ else
+ {
+ ret = KErrNotFound;
+ }
+
+ // DOS layer returned with error
+ if ( ret != KErrNone )
+ {
+TFLOGSTRING3("TSY: CMmSmsStorageTsy::ReadAllSmsPhase1L aTsyReqHandle: %d and ret:%d", aTsyReqHandle, ret);
+ ReqCompleted( aTsyReqHandle, ret );
+ }
+
+ }
+
+ return KErrNone;
+ }
+
+// ---------------------------------------------------------------------------
+// CMmSmsStorageTsy::ReadAllSmsPhase2
+// This method handle and complete second phase of SMS messages retrieval
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+TInt CMmSmsStorageTsy::ReadAllSmsPhase2(
+ const TTsyReqHandle aTsyReqHandle,
+ RMobilePhone::TClientId const* aId,
+ TDes8* aBuffer )
+ {
+TFLOGSTRING("TSY: CMmSmsStorageTsy::ReadAllSmsPhase2");
+ CListReadAllAttempt* read = NULL;
+
+ // Find the read attempt from this client
+ for ( TInt i = 0 ; i < iSmsReadAllArray->Count() ; ++i )
+ {
+ read = iSmsReadAllArray->At( i );
+ if ( ( read->iClient.iSessionHandle == aId->iSessionHandle ) &&
+ ( read->iClient.iSubSessionHandle == aId->iSubSessionHandle ) )
+ {
+ TPtr8 bufPtr( ( read->iListBuf )->Ptr( 0 ) );
+ // Copy the streamed list to the client
+ aBuffer->Copy( bufPtr );
+ delete read;
+ iSmsReadAllArray->Delete( i );
+ ReqCompleted( aTsyReqHandle, KErrNone );
+
+ return KErrNone;
+ }
+ }
+
+ // Doesn't found the matching client from read all phase 1
+ iSmsReadAllArray->ResetAndDestroy();
+ ReqCompleted( aTsyReqHandle, KErrCorrupt );
+
+ return KErrNone;
+ }
+
+// ---------------------------------------------------------------------------
+// CMmSmsStorageTsy::ReadAllSmsCancel
+// This method cancels read all SMSes request
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+TInt CMmSmsStorageTsy::ReadAllSmsCancel(
+ const TTsyReqHandle aTsyReqHandle )
+ {
+TFLOGSTRING("TSY: CMmSmsStorageTsy::ReadAllSmsCancel");
+ iMmTsyReqHandleStore->ResetTsyReqHandle(
+ CMmSmsTsy::EMultimodeSimStSmsReadAllSms );
+
+ iSmsListArray->Reset();
+ iSmsReadAllArray->ResetAndDestroy();
+
+ ReqCompleted( aTsyReqHandle, KErrCancel );
+
+ return KErrNone;
+ }
+
+// ---------------------------------------------------------------------------
+// CMmSmsStorageTsy::RetrieveSmsListReadSmsL
+// Complete SimStSmsReadReq request and calls CompleteReadAllSmsPhase1-method
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+void CMmSmsStorageTsy::RetrieveSmsListReadSmsL(
+ TInt aResult,
+ CMmDataPackage* aDataPackage )
+ {
+TFLOGSTRING("TSY: CMmSmsStorageTsy::RetrieveSmsListReadSmsL");
+
+ TTsyReqHandle reqHandle = iMmTsyReqHandleStore->GetTsyReqHandle(
+ CMmSmsTsy::EMultimodeSimStSmsReadAllSms );
+
+ // Flag which wil indicates if Class2 SMS has been received while
+ // it was reading the SMS Slots.
+ TBool receivedClass2ToBeReSent;
+
+ CArrayPtrFlat<TSmsMsg>* tempSmsListArray = NULL;
+
+ if ( reqHandle )
+ {
+ aDataPackage->UnPackData( tempSmsListArray, receivedClass2ToBeReSent );
+
+ for ( TInt i = 0; i < tempSmsListArray->Count(); i++ )
+ {
+ iSmsListArray->AppendL( tempSmsListArray->At( i ) );
+ }
+
+ tempSmsListArray->Reset();
+ tempSmsListArray = NULL;
+
+ // if last slot was empty or used
+ if ( ( KErrNotFound == aResult ) || ( KErrNone == aResult ) )
+ {
+ if ( 0 < iSmsListArray->Count() )
+ {
+ // Store contained SMS messages
+ TInt ret = iMmSmsExtInterface->CompleteReadAllSmsPhase1L(
+ iSmsListArray, // SMS message list storage array
+ iReadAllId, // Read all SMS messages Id
+ iSmsReadAllArray, // Read all SMS messages array
+ iReadAllBufSizePtr // Read all SMS messages pointer
+ );
+ CompleteReadAllSmsPhase1( ret, receivedClass2ToBeReSent );
+ }
+ else
+ {
+ // Store was empty
+ CompleteReadAllSmsPhase1( KErrNotFound,
+ receivedClass2ToBeReSent );
+ }
+ }
+ else
+ {
+ CompleteReadAllSmsPhase1( aResult, receivedClass2ToBeReSent );
+ }
+ }
+ }
+
+// ---------------------------------------------------------------------------
+// CMmSmsStorageTsy::CompleteReadAllSmsPhase1
+// This method completes client's ReadAllSmsPhase1 request
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+void CMmSmsStorageTsy::CompleteReadAllSmsPhase1(
+ TInt aResult,
+ TBool aReceivedClass2ToBeReSent )
+ {
+TFLOGSTRING2("TSY: CMmSmsStorageTsy::CompleteReadAllSmsPhase1. Complete read first phase error: %d", aResult);
+ TTsyReqHandle reqHandle = iMmTsyReqHandleStore->ResetTsyReqHandle(
+ CMmSmsTsy::EMultimodeSimStSmsReadAllSms );
+ if ( reqHandle )
+ {
+ // Complete first phase of list retrieval
+ ReqCompleted( reqHandle, aResult );
+ iSmsListArray->Reset();
+
+TFLOGSTRING2("TSY: CMmSmsStorageTsy::CompleteReadAllSmsPhase1 aReceivedClass2ToBeReSent: %d",aReceivedClass2ToBeReSent);
+ if ( aReceivedClass2ToBeReSent )
+ {
+ // silently IGNORE if call to DOS fails
+ TInt trapError = 0;
+ TRAP( trapError, iMmPhone->MessageManager()->HandleRequestL(
+ EMobileSmsMessagingResumeSmsReception ); );
+ }
+ }
+ }
+
+// ---------------------------------------------------------------------------
+// CMmSmsStorageTsy::GetTsyReqHandleStore
+// Get pointer to Tsy request handle store
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+CMmTsyReqHandleStore* CMmSmsStorageTsy::GetTsyReqHandleStore()
+ {
+ // TAN to be removed before releasing?
+ return iMmTsyReqHandleStore;
+ }
+
+// ---------------------------------------------------------------------------
+// CMmSmsStorageTsy::ResetVariables
+// Reset all used variables
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+void CMmSmsStorageTsy::ResetVariables()
+ {
+ // get info variables
+ iGetInfoInfoPtr = NULL;
+
+ // read sms variables
+ iReadSmsEntryPtr = NULL;
+
+ // write sms variables
+ iWriteSmsEntryPtr = NULL;
+
+ // notify SMS store event
+ iNotifySmsStoreEventPtr = NULL;
+ iNotifySmsStoreEventIndexPtr = NULL;
+
+ // read all parameter sets variables
+ iReadAllBufSizePtr = NULL;
+ iUsedEntries = 0;
+ iTotalEntries = 0;
+ }
+
+// ---------------------------------------------------------------------------
+// CMmSmsStorageTsy::UnpackSmsReadEntryPackage
+// This method unpack a entry package and set contents of a message to the
+// entry.
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+TInt CMmSmsStorageTsy::UnpackSmsReadEntryPackage(
+ TAny* aReadSmsEntryPtr,
+ TSmsMsg* aSmsMsg )
+ {
+ RMobileSmsStore::TMobileGsmSmsEntryV1Pckg* entryPckg =
+ REINTERPRET_CAST( RMobileSmsStore::TMobileGsmSmsEntryV1Pckg*,
+ aReadSmsEntryPtr );
+ RMobileSmsStore::TMobileGsmSmsEntryV1& entry = ( *entryPckg )();
+
+ switch( aSmsMsg->iMessageStatus )
+ {
+ case KSimSmsMoNotSent: //0x07
+ entry.iMsgStatus = RMobileSmsStore::EStoredMessageUnsent;
+ break;
+ case KSimSmsStatusReportReqNotReceived: //0x0D
+ case KSimSmsMoSent: //0x05
+ entry.iMsgStatus = RMobileSmsStore::EStoredMessageSent;
+ break;
+ case KSimSmsMtRead: //0x01
+ entry.iMsgStatus = RMobileSmsStore::EStoredMessageRead;
+ break;
+ case KSimSmsMtNotRead: //0x03
+ entry.iMsgStatus = RMobileSmsStore::EStoredMessageUnread;
+ break;
+ case KSimSmsStatusReportReqReceivedNotStored: //0x15
+ case KSimSmsStatusReportReqReceivedStored: //0x1D
+ entry.iMsgStatus = RMobileSmsStore::EStoredMessageDelivered;
+ break;
+ default:
+ entry.iMsgStatus = RMobileSmsStore::EStoredMessageUnknownStatus;
+ break;
+ }
+
+ // TMobileSmsFixedEntryV1 information
+ entry.iMsgData.Copy( aSmsMsg->iSmsMsg );
+
+ // Lets handle Service Centre address
+ entry.iServiceCentre.iTypeOfNumber = aSmsMsg->iMobileScTON;
+ entry.iServiceCentre.iNumberPlan = aSmsMsg->iMobileScNPI;
+ entry.iServiceCentre.iTelNumber.Copy( aSmsMsg->iServiceCentre );
+
+ return KErrNone;
+ }
+
+// ---------------------------------------------------------------------------
+// CMmSmsStorageTsy::UnpackSmsWriteEntryPackage
+// This method unpack a entry package and set location of the slot to the
+// entry.
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+TInt CMmSmsStorageTsy::UnpackSmsWriteEntryPackage(
+ TAny* aWriteSmsEntryPtr,
+ TInt aLocation )
+ {
+ RMobileSmsStore::TMobileGsmSmsEntryV1Pckg*
+ entryPckg = REINTERPRET_CAST
+ ( RMobileSmsStore::TMobileGsmSmsEntryV1Pckg*, aWriteSmsEntryPtr );
+ RMobileSmsStore::TMobileGsmSmsEntryV1& entry = ( *entryPckg )();
+
+ // Let's copy location index
+ entry.iIndex = aLocation;
+
+ return KErrNone;
+ }
+
+// End of File