--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/telephonyserver/etelmultimode/DTsy/mmtsymessaging.cpp Tue Feb 02 01:41:59 2010 +0200
@@ -0,0 +1,1914 @@
+// Copyright (c) 1997-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 "mmtsy.h"
+#include "testdef.h"
+#include "ETELMM.H"
+#include <et_clsvr.h>
+#include "Dmmlog.h"
+
+/**************************************************************************/
+//
+// CSmsMessagingDMmTsy
+//
+/**************************************************************************/
+
+CSmsMessagingDMmTsy* CSmsMessagingDMmTsy::NewL(CPhoneDMmTsy *aPhone, CPhoneFactoryDummyBase* aFac, const TDesC& aName)
+ {
+ CSmsMessagingDMmTsy* subsession=new(ELeave) CSmsMessagingDMmTsy(aPhone, aFac,aName);
+ CleanupStack::PushL(subsession);
+ subsession->ConstructL();
+ CleanupStack::Pop();
+ return subsession;
+ }
+
+void CSmsMessagingDMmTsy::Init()
+ {}
+
+CSmsMessagingDMmTsy::CSmsMessagingDMmTsy(CPhoneDMmTsy *aPhone, CPhoneFactoryDummyBase* aFac, const TDesC& aName)
+ :CSubSessionExtDummyBase(aFac), iPhone(aPhone)
+ {
+ iMessagingName=aName;
+ }
+
+void CSmsMessagingDMmTsy::ConstructL()
+ {
+ LOGTEXT(_L8("CSmsMessagingDMmTsy created"));
+ iSmspReadAll = new (ELeave) CArrayPtrFlat<CListReadAllAttempt>(1);
+ }
+
+CSmsMessagingDMmTsy::~CSmsMessagingDMmTsy()
+ {
+ LOGTEXT(_L8("CSmsMessagingDMmTsy destroyed"));
+ if (iSmspReadAll)
+ iSmspReadAll->ResetAndDestroy();
+ delete iSmspReadAll;
+ }
+
+CTelObject* CSmsMessagingDMmTsy::OpenNewObjectByNameL(const TDesC& aName)
+ {
+ // SMS related stores can be opened from an SMS messaging sub-session
+ // Clients must supply the name of the store they wish to open
+
+ if (aName.Compare(KETelMeSmsStore)==KErrNone)
+ return REINTERPRET_CAST(CTelObject*, CSmsStoreDMmTsy::NewL(iPhone,FacPtr(),aName));
+
+ if (aName.Compare(KETelIccSmsStore)==KErrNone)
+ return REINTERPRET_CAST(CTelObject*, CSmsStoreDMmTsy::NewL(iPhone,FacPtr(),aName));
+
+ return NULL;
+ }
+
+CTelObject* CSmsMessagingDMmTsy::OpenNewObjectL(TDes&)
+ {
+ // Open objects without a name is not supported
+ User::Leave(KErrNotSupported);
+ return NULL;
+ }
+
+CTelObject::TReqMode CSmsMessagingDMmTsy::ReqModeL(const TInt aIpc)
+ {
+ // ReqModeL is called from the server's CTelObject::ReqAnalyserL
+ // in order to check the type of request it has
+
+ // The following are example request types for this dummy TSY
+ // All TSYs do not have to have these request types but they have been given
+ // "sensible" values in this test code
+
+ CTelObject::TReqMode ret=0;
+ switch (aIpc)
+ {
+
+//
+// Non-flow Controlled Services
+//
+ case EMobileSmsMessagingGetCaps:
+ case EMobileSmsMessagingGetReceiveMode:
+ case EMobileSmsMessagingGetMoSmsBearer:
+ case EMobileSmsMessagingEnumerateMessageStores:
+ case EMobileSmsMessagingGetMessageStoreInfo:
+ case EMobileSmsMessagingResumeSmsReception:
+ case EMobileSmsMessagingGetSmspListPhase2:
+ break;
+
+//
+// Flow Controlled Services
+//
+ case EMobileSmsMessagingSetReceiveMode:
+ case EMobileSmsMessagingSetMoSmsBearer:
+ case EMobileSmsMessagingAckSmsStored:
+ case EMobileSmsMessagingNackSmsStored:
+ case EMobileSmsMessagingSendMessage:
+ case EMobileSmsMessagingSendMessageNoFdnCheck:
+ case EMobileSmsMessagingGetSmspListPhase1:
+ case EMobileSmsMessagingStoreSmspList:
+ ret=KReqModeFlowControlObeyed;
+ break;
+
+//
+// Immediate server repost of request
+//
+ case EMobileSmsMessagingReceiveMessage:
+ ret=KReqModeRePostImmediately;
+ break;
+//
+// Multiple Completion Services with Immediate Server Repost
+// (Usually Notifications)
+//
+ case EMobileSmsMessagingNotifyReceiveModeChange:
+ case EMobileSmsMessagingNotifyMoSmsBearerChange:
+ case EMobileSmsMessagingNotifySmspListChange:
+ ret=KReqModeMultipleCompletionEnabled | KReqModeRePostImmediately;
+ break;
+
+//
+// Cancel Requests
+//
+ case EMobileSmsMessagingSetReceiveModeCancel:
+ case EMobileSmsMessagingNotifyReceiveModeChangeCancel:
+ case EMobileSmsMessagingNotifyMoSmsBearerChangeCancel:
+ case EMobileSmsMessagingAckSmsStoredCancel:
+ case EMobileSmsMessagingNackSmsStoredCancel:
+ case EMobileSmsMessagingSendMessageCancel:
+ case EMobileSmsMessagingSendMessageNoFdnCheckCancel:
+ case EMobileSmsMessagingGetMessageStoreInfoCancel:
+ case EMobileSmsMessagingGetSmspListCancel:
+ case EMobileSmsMessagingStoreSmspListCancel:
+ case EMobileSmsMessagingNotifySmspListChangeCancel:
+ default:
+ User::Leave(KErrNotSupported);
+ break;
+ }
+
+ return ret;
+ }
+
+TInt CSmsMessagingDMmTsy::RegisterNotification(const TInt aIpc)
+ {
+ // RegisterNotification is called when the server recognises that this notification
+ // is being posted for the first time on this sub-session object.
+
+ // It enables the TSY to "turn on" any regular notification messages that it may
+ // receive from the phone
+
+ switch (aIpc)
+ {
+ case EMobileSmsMessagingNotifySmspListChange:
+ LOGTEXT(_L8("CSmsMessagingDMmTsy: RegisterNotification - SMSP List Change"));
+ return KErrNone;
+ case EMobileSmsMessagingNotifyReceiveModeChange:
+ LOGTEXT(_L8("CSmsMessagingDMmTsy: RegisterNotification - SMS Receive Mode Change"));
+ return KErrNone;
+ case EMobileSmsMessagingNotifyMoSmsBearerChange:
+ LOGTEXT(_L8("CSmsMessagingDMmTsy: RegisterNotification - SMS Bearer Change"));
+ return KErrNone;
+ case EMobileSmsMessagingReceiveMessage:
+ LOGTEXT(_L8("CSmsMessagingDMmTsy: RegisterNotification - Receive Message"));
+ return KErrNone;
+ default:
+ // Unknown or invalid IPC
+ LOGTEXT(_L8("CSmsMessagingDMmTsy: Register error, unknown IPC"));
+ return KErrNotSupported;
+ }
+ }
+
+TInt CSmsMessagingDMmTsy::DeregisterNotification(const TInt aIpc)
+ {
+ // DeregisterNotification is called when the server recognises that this notification
+ // will not be posted again because the last client to have a handle on this sub-session
+ // object has just closed the handle.
+
+ // It enables the TSY to "turn off" any regular notification messages that it may
+ // receive from the phone
+
+ switch (aIpc)
+ {
+ case EMobileSmsMessagingNotifySmspListChange:
+ LOGTEXT(_L8("CSmsMessagingDMmTsy: DeregisterNotification - SMSP List Change"));
+ return KErrNone;
+ case EMobileSmsMessagingNotifyReceiveModeChange:
+ LOGTEXT(_L8("CSmsMessagingDMmTsy: DeregisterNotification - SMS Receive Mode Change"));
+ return KErrNone;
+ case EMobileSmsMessagingNotifyMoSmsBearerChange:
+ LOGTEXT(_L8("CSmsMessagingDMmTsy: DeregisterNotification - SMS Bearer Change"));
+ return KErrNone;
+ case EMobileSmsMessagingReceiveMessage:
+ LOGTEXT(_L8("CSmsMessagingDMmTsy: DeregisterNotification - Receive Message"));
+ return KErrNone;
+ default:
+ // Unknown or invalid IPC
+ LOGTEXT(_L8("CSmsMessagingDMmTsy: Deregister error, unknown IPC"));
+ return KErrNotSupported;
+ }
+ }
+
+TInt CSmsMessagingDMmTsy::NumberOfSlotsL(const TInt aIpc)
+ {
+ // NumberOfSlotsL is called by the server when it is registering a new notification
+ // It enables the TSY to tell the server how many buffer slots to allocate for
+ // "repost immediately" notifications that may trigger before clients collect them
+
+ TInt numberOfSlots=1;
+ switch (aIpc)
+ {
+ case EMobileSmsMessagingNotifySmspListChange:
+ case EMobileSmsMessagingNotifyReceiveModeChange:
+ case EMobileSmsMessagingNotifyMoSmsBearerChange:
+ case EMobileSmsMessagingReceiveMessage:
+ LOGTEXT(_L8("CSmsMessagingDMmTsy: Registered with 2 slot"));
+ numberOfSlots=2;
+ break;
+ default:
+ // Unknown or invalid Phone IPC
+ LOGTEXT(_L8("CSmsMessagingDMmTsy: Number of Slots error, unknown IPC"));
+ User::Leave(KErrNotSupported);
+ break;
+ }
+ return numberOfSlots;
+ }
+
+
+TInt CSmsMessagingDMmTsy::ExtFunc(const TTsyReqHandle aTsyReqHandle,const TInt aIpc,
+ const TDataPackage& aPackage)
+ {
+ // 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
+
+ TAny* dataPtr=aPackage.Ptr1();
+ TAny* dataPtr2=aPackage.Ptr2();
+
+ switch (aIpc)
+ {
+ case EMobileSmsMessagingGetCaps:
+ return GetCaps(aTsyReqHandle, aPackage.Des1n());
+
+ case EMobileSmsMessagingEnumerateMessageStores:
+ return EnumerateMessageStores(aTsyReqHandle,
+ REINTERPRET_CAST(TInt*, dataPtr));
+
+ case EMobileSmsMessagingGetMessageStoreInfo:
+ return GetMessageStoreInfo(aTsyReqHandle,
+ REINTERPRET_CAST(TInt*, dataPtr),
+ aPackage.Des2n());
+
+ case EMobileSmsMessagingReceiveMessage:
+ return ReceiveMessage(aTsyReqHandle, aPackage.Des1n(), aPackage.Des2n());
+
+ case EMobileSmsMessagingAckSmsStored:
+ return AckSmsStored(aTsyReqHandle, aPackage.Des1n(),
+ REINTERPRET_CAST(TBool*, dataPtr2));
+
+ case EMobileSmsMessagingNackSmsStored:
+ return NackSmsStored(aTsyReqHandle, aPackage.Des1n(),
+ REINTERPRET_CAST(TInt*, dataPtr2));
+
+ case EMobileSmsMessagingResumeSmsReception:
+ return ResumeSmsReception(aTsyReqHandle);
+
+ case EMobileSmsMessagingSendMessage:
+ return SendMessage(aTsyReqHandle, aPackage.Des1n(), aPackage.Des2n());
+
+ case EMobileSmsMessagingSendMessageNoFdnCheck:
+ return SendMessageNoFdnCheck(aTsyReqHandle, aPackage.Des1n(), aPackage.Des2n());
+
+ case EMobileSmsMessagingGetSmspListPhase1:
+ return ReadSmspListPhase1(aTsyReqHandle,
+ REINTERPRET_CAST(RMobilePhone::TClientId*,dataPtr),
+ REINTERPRET_CAST(TInt*,dataPtr2));
+
+ case EMobileSmsMessagingGetSmspListPhase2:
+ return ReadSmspListPhase2(aTsyReqHandle,
+ REINTERPRET_CAST(RMobilePhone::TClientId*,dataPtr), aPackage.Des2n());
+
+ case EMobileSmsMessagingStoreSmspList:
+ return StoreSmspList(aTsyReqHandle, aPackage.Des1n());
+
+ case EMobileSmsMessagingNotifySmspListChange:
+ return NotifySmspListChange(aTsyReqHandle);
+
+ case EMobileSmsMessagingGetReceiveMode:
+ return GetReceiveMode(aTsyReqHandle,
+ REINTERPRET_CAST(RMobileSmsMessaging::TMobileSmsReceiveMode*, dataPtr));
+
+ case EMobileSmsMessagingSetReceiveMode:
+ return SetReceiveMode(aTsyReqHandle,
+ REINTERPRET_CAST(RMobileSmsMessaging::TMobileSmsReceiveMode*, dataPtr));
+
+ case EMobileSmsMessagingNotifyReceiveModeChange:
+ return NotifyReceiveModeChange(aTsyReqHandle,
+ REINTERPRET_CAST(RMobileSmsMessaging::TMobileSmsReceiveMode*, dataPtr));
+
+ case EMobileSmsMessagingGetMoSmsBearer:
+ return GetMoSmsBearer(aTsyReqHandle,
+ REINTERPRET_CAST(RMobileSmsMessaging::TMobileSmsBearer*, dataPtr));
+
+ case EMobileSmsMessagingSetMoSmsBearer:
+ return SetMoSmsBearer(aTsyReqHandle,
+ REINTERPRET_CAST(RMobileSmsMessaging::TMobileSmsBearer*, dataPtr));
+
+ case EMobileSmsMessagingNotifyMoSmsBearerChange:
+ return NotifyMoSmsBearerChange(aTsyReqHandle,
+ REINTERPRET_CAST(RMobileSmsMessaging::TMobileSmsBearer*, dataPtr));
+
+ default:
+ return KErrNotSupported;
+ }
+ }
+
+TInt CSmsMessagingDMmTsy::CancelService(const TInt aIpc,const TTsyReqHandle aTsyReqHandle)
+ {
+ // 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.
+
+ LOGTEXT(_L8("CSmsMessagingDMmTsy: - CancelService called"));
+ switch (aIpc)
+ {
+ case EMobileSmsMessagingReceiveMessage:
+ return ReceiveMessageCancel(aTsyReqHandle);
+ case EMobileSmsMessagingAckSmsStored:
+ return AckSmsStoredCancel(aTsyReqHandle);
+ case EMobileSmsMessagingNackSmsStored:
+ return NackSmsStoredCancel(aTsyReqHandle);
+ case EMobileSmsMessagingSendMessage:
+ return SendMessageCancel(aTsyReqHandle);
+ case EMobileSmsMessagingSendMessageNoFdnCheck:
+ return SendMessageNoFdnCheckCancel(aTsyReqHandle);
+ case EMobileSmsMessagingGetMessageStoreInfo:
+ return GetMessageStoreInfoCancel(aTsyReqHandle);
+ case EMobileSmsMessagingGetSmspListPhase1:
+ case EMobileSmsMessagingGetSmspListPhase2:
+ return ReadSmspListCancel(aTsyReqHandle);
+ case EMobileSmsMessagingStoreSmspList:
+ return StoreSmspListCancel(aTsyReqHandle);
+ case EMobileSmsMessagingNotifySmspListChange:
+ return NotifySmspListChangeCancel(aTsyReqHandle);
+ case EMobileSmsMessagingSetReceiveMode:
+ return SetReceiveModeCancel(aTsyReqHandle);
+ case EMobileSmsMessagingNotifyReceiveModeChange:
+ return NotifyReceiveModeChangeCancel(aTsyReqHandle);
+ case EMobileSmsMessagingSetMoSmsBearer:
+ return SetMoSmsBearerCancel(aTsyReqHandle);
+ case EMobileSmsMessagingNotifyMoSmsBearerChange:
+ return NotifyMoSmsBearerChangeCancel(aTsyReqHandle);
+ default:
+ return KErrGeneral;
+ }
+ }
+
+
+/***********************************************************************************/
+//
+// The following methods are called from ExtFunc and/or CancelService.
+// Each of these will process a TSY request or cancel a TSY request
+// Here, example values are returned or checked within this dummy TSY in order to ensure
+// that the integrity of the data passed to/from client is maintained
+//
+/***********************************************************************************/
+
+
+TInt CSmsMessagingDMmTsy::GetCaps(const TTsyReqHandle aTsyReqHandle, TDes8* aCaps)
+ {
+ LOGTEXT(_L8("CSmsMessagingDMmTsy::GetCaps called"));
+ RMobileSmsMessaging::TMobileSmsCapsV1Pckg* smsCapsPckg = (RMobileSmsMessaging::TMobileSmsCapsV1Pckg*)aCaps;
+ RMobileSmsMessaging::TMobileSmsCapsV1& smsCaps = (*smsCapsPckg)();
+
+ smsCaps.iSmsMode=DMMTSY_SMS_MESSAGING_MODE_CAPS;
+ smsCaps.iSmsControl=DMMTSY_SMS_MESSAGING_CONTROL_CAPS;
+
+ ReqCompleted(aTsyReqHandle,KErrNone);
+ return KErrNone;
+ }
+
+TInt CSmsMessagingDMmTsy::ReceiveMessage(const TTsyReqHandle aTsyReqHandle, TDes8* aMsg, TDes8* aMsgAttributes)
+ {
+ if (!iReceiveMessage++)
+ {
+ LOGTEXT(_L8("CSmsMessagingDMmTsy::ReceiveMessage called"));
+
+ RMobileSmsMessaging::TMobileSmsReceiveAttributesV1Pckg* attsPckg = REINTERPRET_CAST(RMobileSmsMessaging::TMobileSmsReceiveAttributesV1Pckg*, aMsgAttributes);
+ RMobileSmsMessaging::TMobileSmsReceiveAttributesV1& atts = (*attsPckg)();
+
+ atts.iFlags=DMMTSY_SMS_MESSAGE_FLAGS1;
+ atts.iDataFormat=DMMTSY_SMS_MESSAGE_FORMAT1;
+ atts.iGsmServiceCentre.iTelNumber=DMMTSY_SMS_MESSAGE_SC1;
+ atts.iOriginator.iTelNumber=DMMTSY_SMS_MESSAGE_REMOTEPARTYNUMBER1;
+ atts.iStatus=DMMTSY_SMS_MESSAGE_STATUS1;
+ atts.iStore=DMMTSY_MESSAGE_STORE_NAME;
+ atts.iStoreIndex=DMMTSY_SMS_STORE_INDEX1;
+
+ aMsg->Copy(DMMTSY_SMS_MESSAGE_PDU1);
+ iPhone->AddDelayedReq(aTsyReqHandle,this);
+ }
+ return KErrNone;
+ }
+
+TInt CSmsMessagingDMmTsy::ReceiveMessageCancel(const TTsyReqHandle aTsyReqHandle)
+ {
+ LOGTEXT(_L8("CSmsMessagingDMmTsy::ReceiveMessageCancel called"));
+ iPhone->RemoveDelayedReq(aTsyReqHandle);
+ ReqCompleted(aTsyReqHandle,KErrCancel);
+ return KErrNone;
+ }
+
+TInt CSmsMessagingDMmTsy::AckSmsStored(const TTsyReqHandle aTsyReqHandle, TDesC8* aMsg, TBool* aFull)
+ {
+ LOGTEXT(_L8("CSmsMessagingDMmTsy::AckSmsStored called"));
+
+ if (((aMsg->Length()!=0) && (aMsg->Compare(DMMTSY_SMS_MESSAGE_PDU1)!=0)) ||
+ (*aFull != DMMTSY_SMS_MESSAGE_FULL))
+ ReqCompleted(aTsyReqHandle,KErrCorrupt);
+ else
+ iPhone->AddDelayedReq(aTsyReqHandle,this);
+ return KErrNone;
+ }
+
+TInt CSmsMessagingDMmTsy::AckSmsStoredCancel(const TTsyReqHandle aTsyReqHandle)
+ {
+ LOGTEXT(_L8("CSmsMessagingDMmTsy::AckSmsStoredCancel called"));
+ iPhone->RemoveDelayedReq(aTsyReqHandle);
+ ReqCompleted(aTsyReqHandle,KErrCancel);
+ return KErrNone;
+ }
+
+TInt CSmsMessagingDMmTsy::NackSmsStored(const TTsyReqHandle aTsyReqHandle, TDesC8* aMsgData, TInt* aRpCause)
+ {
+ LOGTEXT(_L8("CSmsMessagingDMmTsy::NackSmsStored called"));
+ if ((aMsgData->Compare(DMMTSY_SMS_MESSAGE_PDU1) != 0 ) || *aRpCause != DMMTSY_SMS_MESSAGE_NACK_CAUSE)
+ ReqCompleted(aTsyReqHandle,KErrCorrupt);
+ else
+ iPhone->AddDelayedReq(aTsyReqHandle,this);
+ return KErrNone;
+ }
+
+TInt CSmsMessagingDMmTsy::NackSmsStoredCancel(const TTsyReqHandle aTsyReqHandle)
+ {
+ LOGTEXT(_L8("CSmsMessagingDMmTsy::NackSmsStoredCancel called"));
+ iPhone->RemoveDelayedReq(aTsyReqHandle);
+ ReqCompleted(aTsyReqHandle,KErrCancel);
+ return KErrNone;
+ }
+
+TInt CSmsMessagingDMmTsy::ResumeSmsReception(const TTsyReqHandle aTsyReqHandle)
+ {
+ LOGTEXT(_L8("CSmsMessagingDMmTsy::ResumeSmsReception called"));
+ ReqCompleted(aTsyReqHandle,KErrNone);
+ return KErrNone;
+ }
+
+TInt CSmsMessagingDMmTsy::SendMessage(const TTsyReqHandle aTsyReqHandle, TDesC8* aMsg, TDes8* aMsgAttributes)
+ {
+ LOGTEXT(_L8("CSmsMessagingDMmTsy::SendMessage called"));
+
+ RMobileSmsMessaging::TMobileSmsAttributesV1Pckg* attsPckg = REINTERPRET_CAST(RMobileSmsMessaging::TMobileSmsAttributesV1Pckg*, aMsgAttributes);
+ RMobileSmsMessaging::TMobileSmsAttributesV1& atts = (*attsPckg)();
+
+ if (atts.ExtensionId() == RMobileSmsMessaging::KETelMobileSmsSendAttributesV1)
+ {
+ RMobileSmsMessaging::TMobileSmsSendAttributesV1Pckg* attsV1Pckg = REINTERPRET_CAST(RMobileSmsMessaging::TMobileSmsSendAttributesV1Pckg*, aMsgAttributes);
+ RMobileSmsMessaging::TMobileSmsSendAttributesV1& attsV1 = (*attsV1Pckg)();
+
+ if ((attsV1.iFlags != DMMTSY_SMS_MESSAGE_FLAGS2) ||
+ (attsV1.iDataFormat != DMMTSY_SMS_MESSAGE_FORMAT1) ||
+ (attsV1.iDestination.iTelNumber != DMMTSY_PHONE_TEL_NUMBER) ||
+ (attsV1.iMore != DMMTSY_SMS_MESSAGE_MORE) ||
+ (aMsg->Compare(DMMTSY_SMS_MESSAGE_PDU1) != 0))
+ {
+ ReqCompleted(aTsyReqHandle, KErrCorrupt);
+ }
+ else
+ {
+ attsV1.iMsgRef = DMMTSY_SMS_MESSAGE_MSGREF;
+ attsV1.iSubmitReport = DMMTSY_SMS_MESSAGE_PDU2;
+ iPhone->AddDelayedReq(aTsyReqHandle, this);
+ }
+ }
+ else if (atts.ExtensionId() == RMobileSmsMessaging::KETelMobileSmsCdmaSendAttributesV4)
+ {
+ RMobileSmsMessaging::TMobileSmsCdmaSendAttributesV4Pckg* attsV4Pckg = REINTERPRET_CAST(RMobileSmsMessaging::TMobileSmsCdmaSendAttributesV4Pckg*, aMsgAttributes);
+ RMobileSmsMessaging::TMobileSmsCdmaSendAttributesV4& attsV4 = (*attsV4Pckg)();
+
+ if ((attsV4.iFlags != DMMTSY_SMS_MESSAGE_CDMA_FLAGS) ||
+ (attsV4.iDataFormat != DMMTSY_SMS_MESSAGE_CDMA_FORMAT) ||
+ (attsV4.iCdmaTeleservice != DMMTSY_SMS_MESSAGE_CDMA_TELESERVICE) ||
+ (attsV4.iCdmaServiceCategory != DMMTSY_SMS_MESSAGE_CDMA_SERVICE_CATEGORY) ||
+ (attsV4.iMore != DMMTSY_SMS_MESSAGE_MORE) ||
+ (attsV4.iDestination.iTypeOfNumber != DMMTSY_SMS_MESSAGE_TON) ||
+ (attsV4.iDestination.iNumberPlan != DMMTSY_SMS_MESSAGE_NP) ||
+ (attsV4.iDestination.iTelNumber != DMMTSY_PHONE_TEL_NUMBER) ||
+ (attsV4.iAddressAuthentication != DMMTSY_SMS_MESSAGE_ADDRESS_AUTHENTICATION) ||
+ (aMsg->Compare(DMMTSY_SMS_MESSAGE_PDU1) != 0))
+ {
+ ReqCompleted(aTsyReqHandle, KErrCorrupt);
+ }
+ else
+ {
+ attsV4.iMsgRef = DMMTSY_SMS_MESSAGE_MSGREF;
+ attsV4.iTLAck = DMMTSY_SMS_MESSAGE_TLACK;
+ iPhone->AddDelayedReq(aTsyReqHandle, this);
+ }
+ }
+ else
+ {
+ ReqCompleted(aTsyReqHandle, KErrCorrupt);
+ }
+ return KErrNone;
+ }
+
+TInt CSmsMessagingDMmTsy::SendMessageCancel(const TTsyReqHandle aTsyReqHandle)
+ {
+ LOGTEXT(_L8("CSmsMessagingDMmTsy::SendMessageCancel called"));
+ iPhone->RemoveDelayedReq(aTsyReqHandle);
+ ReqCompleted(aTsyReqHandle,KErrCancel);
+ return KErrNone;
+ }
+
+TInt CSmsMessagingDMmTsy::SendMessageNoFdnCheck(const TTsyReqHandle aTsyReqHandle, TDesC8* aMsg, TDes8* aMsgAttributes)
+ /**
+ * This method sends an outgoing SMS to the network. The number used for sending the SMS
+ * is not checked against those in the Fixed Dialling Number list even if the FDN service is enabled
+ *
+ * @param aMsg Supplies the TPDU to send
+ * @param aMsgAttributes Supplies the attributes of the outgoing message
+ */
+ {
+ LOGTEXT(_L8("CSmsMessagingDMmTsy::SendMessageNoFdnCheck called"));
+
+ RMobileSmsMessaging::TMobileSmsSendAttributesV1Pckg* attsPckg = REINTERPRET_CAST(RMobileSmsMessaging::TMobileSmsSendAttributesV1Pckg*, aMsgAttributes);
+ RMobileSmsMessaging::TMobileSmsSendAttributesV1& atts = (*attsPckg)();
+
+ if ((atts.iFlags != DMMTSY_SMS_MESSAGE_FLAGS2) ||
+ (atts.iDataFormat != DMMTSY_SMS_MESSAGE_FORMAT1) ||
+ (atts.iDestination.iTelNumber.Compare(DMMTSY_PHONE_TEL_NUMBER) != 0) ||
+ (atts.iMore != DMMTSY_SMS_MESSAGE_MORE) ||
+ (aMsg->Compare(DMMTSY_SMS_MESSAGE_PDU1) != 0))
+ ReqCompleted(aTsyReqHandle,KErrCorrupt);
+ else
+ {
+ atts.iMsgRef=DMMTSY_SMS_MESSAGE_MSGREF;
+ atts.iSubmitReport=DMMTSY_SMS_MESSAGE_PDU2;
+ iPhone->AddDelayedReq(aTsyReqHandle,this);
+ }
+ return KErrNone;
+ }
+
+TInt CSmsMessagingDMmTsy::SendMessageNoFdnCheckCancel(const TTsyReqHandle aTsyReqHandle)
+ /**
+ * This method cancels the sending of an outgoing SMS to the network. The number used for sending the SMS
+ * is not checked against those in the Fixed Dialling Number list even if the FDN service is enabled
+ *
+ */
+ {
+ LOGTEXT(_L8("CSmsMessagingDMmTsy::SendMessageNoFdnCheckCancel called"));
+ iPhone->RemoveDelayedReq(aTsyReqHandle);
+ ReqCompleted(aTsyReqHandle,KErrCancel);
+ return KErrNone;
+ }
+
+TInt CSmsMessagingDMmTsy::EnumerateMessageStores(const TTsyReqHandle aTsyReqHandle, TInt* aCount)
+ {
+ LOGTEXT(_L8("CSmsMessagingDMmTsy::EnumerateMessageStores called"));
+ *aCount=DMMTSY_PHONE_MESSAGE_STORE_COUNT;
+ ReqCompleted(aTsyReqHandle,KErrNone);
+ return KErrNone;
+ }
+
+TInt CSmsMessagingDMmTsy::GetMessageStoreInfo(const TTsyReqHandle aTsyReqHandle, TInt *aIndex, TDes8* aInfo)
+ {
+ LOGTEXT(_L8("CSmsMessagingDMmTsy::GetMessageStoreInfo called"));
+
+ if (*aIndex != DMMTSY_SMS_STORE_INDEX1)
+ ReqCompleted(aTsyReqHandle,KErrCorrupt);
+ else
+ {
+ RMobilePhoneStore::TMobilePhoneStoreInfoV1Pckg* infoPckg = REINTERPRET_CAST(RMobilePhoneStore::TMobilePhoneStoreInfoV1Pckg*, aInfo);
+ RMobilePhoneStore::TMobilePhoneStoreInfoV1& info = (*infoPckg)();
+
+ info.iName=DMMTSY_MESSAGE_STORE_NAME;
+ info.iType=DMMTSY_MESSAGE_STORE_TYPE;
+ info.iTotalEntries=DMMTSY_MESSAGE_STORE_TOTAL_ENTRIES;
+ info.iUsedEntries=DMMTSY_MESSAGE_STORE_USED_ENTRIES;
+ info.iCaps=DMMTSY_MESSAGE_STORE_CAPS;
+ iPhone->AddDelayedReq(aTsyReqHandle,this);
+ }
+ return KErrNone;
+ }
+
+TInt CSmsMessagingDMmTsy::GetMessageStoreInfoCancel(const TTsyReqHandle aTsyReqHandle)
+ {
+ LOGTEXT(_L8("CSmsMessagingDMmTsy::GetMessageStoreInfoCancel called"));
+ iPhone->RemoveDelayedReq(aTsyReqHandle);
+ ReqCompleted(aTsyReqHandle,KErrCancel);
+ return KErrNone;
+ }
+
+TInt CSmsMessagingDMmTsy::ValidateSmspEntry(const RMobileSmsMessaging::TMobileSmspEntryV1& aEntry)
+ {
+ if ((aEntry.iText != DMMTSY_SMSP_STORE_TEXT1) ||
+ (aEntry.iValidParams != DMMTSY_SMSP_STORE_VALID_PARAMS1) ||
+ (aEntry.iDestination.iTelNumber.Compare(DMMTSY_PHONE_TEL_NUMBER) != 0) ||
+ (aEntry.iValidityPeriod != DMMTSY_SMSP_STORE_VALIDITY1) ||
+ (aEntry.iServiceCentre.iTelNumber.Compare(DMMTSY_SMSP_STORE_SCA) != 0) ||
+ (aEntry.iProtocolId != DMMTSY_SMSP_STORE_PID1) ||
+ (aEntry.iDcs != DMMTSY_SMSP_STORE_DCS1))
+ return KErrCorrupt;
+ else
+ return KErrNone;
+ }
+
+void CSmsMessagingDMmTsy::InitSmspEntry(RMobileSmsMessaging::TMobileSmspEntryV1& aEntry)
+ {
+ aEntry.iText = DMMTSY_SMSP_STORE_TEXT1;
+ aEntry.iValidParams = DMMTSY_SMSP_STORE_VALID_PARAMS1;
+ aEntry.iDestination.iTelNumber = DMMTSY_PHONE_TEL_NUMBER;
+ aEntry.iValidityPeriod = DMMTSY_SMSP_STORE_VALIDITY1;
+ aEntry.iServiceCentre.iTelNumber = DMMTSY_SMSP_STORE_SCA;
+ aEntry.iProtocolId = DMMTSY_SMSP_STORE_PID1;
+ aEntry.iDcs = DMMTSY_SMSP_STORE_DCS1;
+ }
+
+
+TInt CSmsMessagingDMmTsy::ReadSmspListPhase1(const TTsyReqHandle aTsyReqHandle, RMobilePhone::TClientId* aId, TInt* aBufSize)
+ {
+ LOGTEXT(_L8("CSmsMessagingDMmTsy::ReadSmspListPhase1 called"));
+ TInt ret=KErrNone;
+ TInt leaveCode=KErrNone;
+ TRAP(leaveCode, ret=ProcessReadSmspListPhase1L(aTsyReqHandle, aId, aBufSize););
+ if (leaveCode != KErrNone)
+ ReqCompleted(aTsyReqHandle,leaveCode);
+ return ret;
+ };
+
+TInt CSmsMessagingDMmTsy::ProcessReadSmspListPhase1L(const TTsyReqHandle aTsyReqHandle,
+ RMobilePhone::TClientId* aId,
+ TInt* aBufSize)
+ {
+ // read the list, store its content and then return size of this buffer to client
+ CMobilePhoneSmspList* list=CMobilePhoneSmspList::NewL();
+ CleanupStack::PushL(list);
+
+ RMobileSmsMessaging::TMobileSmspEntryV1 entry;
+
+ // fill up an example list
+ for (TInt index=0; index < DMMTSY_SMSP_STORE_COUNT; index++)
+ {
+ switch (index)
+ {
+ case 0:
+ InitSmspEntry(entry);
+
+ entry.iIndex=DMMTSY_SMSP_STORE_INDEX1;
+ break;
+ case 1:
+ InitSmspEntry(entry);
+
+ entry.iIndex=DMMTSY_SMSP_STORE_INDEX2;
+ default:
+ break;
+ }
+ // Add the entry into the list, at the next empty location
+ list->AddEntryL(entry);
+ }
+
+ // Store the streamed list and the client ID
+ CListReadAllAttempt* read=CListReadAllAttempt::NewL(aId,aTsyReqHandle);
+ CleanupStack::PushL(read);
+
+ read->iListBuf = list->StoreLC();
+ CleanupStack::Pop(); // pop the CBufFlat allocated by StoreLC
+
+ iSmspReadAll->AppendL(read);
+ CleanupStack::Pop(); // pop the CListReadAllAttempt
+
+ // return the CBufFlat’s size to client
+ *aBufSize=(read->iListBuf)->Size();
+
+ // Complete first phase of list retrieval
+ iPhone->AddDelayedReq(aTsyReqHandle,this);
+ CleanupStack::PopAndDestroy(); // pop&destroy list
+ return KErrNone;
+ }
+
+
+TInt CSmsMessagingDMmTsy::ReadSmspListPhase2(TTsyReqHandle aTsyReqHandle, RMobilePhone::TClientId* aId, TDes8* aBuffer)
+ {
+ LOGTEXT(_L8("CSmsMessagingDMmTsy::ReadSmspListPhase2 called"));
+ CListReadAllAttempt* read=NULL;
+ // Find the read attempt from this client
+ for (TInt i=0; i<iSmspReadAll->Count(); ++i)
+ {
+ read = iSmspReadAll->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;
+ iSmspReadAll->Delete(i);
+ ReqCompleted(aTsyReqHandle,KErrNone);
+ return KErrNone;
+ }
+ }
+ // Should handle error case of not finding the matching client from read all phase 1
+ return KErrNotFound;
+ }
+
+
+TInt CSmsMessagingDMmTsy::ReadSmspListCancel(const TTsyReqHandle aTsyReqHandle)
+ {
+ LOGTEXT(_L8("CSmsMessagingDMmTsy::ReadSmspListCancel called"));
+ iPhone->RemoveDelayedReq(aTsyReqHandle);
+
+ // Remove the read all attempt from iSmspReadAll
+ CListReadAllAttempt* read=NULL;
+ for (TInt i=0; i<iSmspReadAll->Count(); ++i)
+ {
+ read = iSmspReadAll->At(i);
+ if (read->iReqHandle == aTsyReqHandle)
+ {
+ delete read;
+ iSmspReadAll->Delete(i);
+ break;
+ }
+ }
+
+ ReqCompleted(aTsyReqHandle,KErrCancel);
+ return KErrNone;
+ }
+
+TInt CSmsMessagingDMmTsy::StoreSmspList(const TTsyReqHandle aTsyReqHandle, TDes8* aBuffer)
+ {
+ LOGTEXT(_L8("CSmsMessagingDMmTsy::StoreSmspList called"));
+ TInt ret=KErrNone;
+ TInt leaveCode=KErrNone;
+ TRAP(leaveCode, ret=ProcessStoreSmspListL(aTsyReqHandle, aBuffer););
+ if (leaveCode != KErrNone)
+ ReqCompleted(aTsyReqHandle,leaveCode);
+ return ret;
+ };
+
+TInt CSmsMessagingDMmTsy::ProcessStoreSmspListL(TTsyReqHandle aTsyReqHandle, TDes8* aBuffer)
+ {
+ CMobilePhoneSmspList* aSmspList=CMobilePhoneSmspList::NewL();
+ CleanupStack::PushL(aSmspList);
+
+ aSmspList->RestoreL(*aBuffer);
+
+ RMobileSmsMessaging::TMobileSmspEntryV1 entry;
+
+ if (aSmspList->Enumerate() != DMMTSY_SMSP_STORE_COUNT)
+ {
+ ReqCompleted(aTsyReqHandle,KErrCorrupt);
+ return KErrNone;
+ }
+
+ entry=aSmspList->GetEntryL(0);
+
+ if ((entry.iIndex != DMMTSY_SMSP_STORE_INDEX1) ||
+ (ValidateSmspEntry(entry) != KErrNone))
+ {
+ ReqCompleted(aTsyReqHandle,KErrCorrupt);
+ return KErrNone;
+ }
+
+ entry=aSmspList->GetEntryL(1);
+
+ if ((entry.iIndex != DMMTSY_SMSP_STORE_INDEX2) ||
+ (ValidateSmspEntry(entry) != KErrNone))
+ {
+ ReqCompleted(aTsyReqHandle,KErrCorrupt);
+ return KErrNone;
+ }
+
+ iPhone->AddDelayedReq(aTsyReqHandle,this);
+ CleanupStack::PopAndDestroy(); // aSmspList
+ return KErrNone;
+ }
+
+TInt CSmsMessagingDMmTsy::StoreSmspListCancel(TTsyReqHandle aTsyReqHandle)
+ {
+ LOGTEXT(_L8("CSmspStoreDMmTsy::StoreSmspListCancel called"));
+ iPhone->RemoveDelayedReq(aTsyReqHandle);
+ ReqCompleted(aTsyReqHandle,KErrCancel);
+ return KErrNone;
+ }
+
+TInt CSmsMessagingDMmTsy::NotifySmspListChange(const TTsyReqHandle aTsyReqHandle)
+ {
+ if (!iNotifySmspListChange++)
+ {
+ LOGTEXT(_L8("CSmsMessagingDMmTsy::NotifySmspListChange called"));
+ iPhone->AddDelayedReq(aTsyReqHandle,this);
+ }
+ return KErrNone;
+ }
+
+TInt CSmsMessagingDMmTsy::NotifySmspListChangeCancel(const TTsyReqHandle aTsyReqHandle)
+ {
+ LOGTEXT(_L8("CSmsMessagingDMmTsy::NotifySmspListChangeCancel called"));
+ iPhone->RemoveDelayedReq(aTsyReqHandle);
+ ReqCompleted(aTsyReqHandle,KErrCancel);
+ return KErrNone;
+ }
+
+
+TInt CSmsMessagingDMmTsy::GetReceiveMode(const TTsyReqHandle aTsyReqHandle, RMobileSmsMessaging::TMobileSmsReceiveMode* aReceiveMode)
+ {
+ LOGTEXT(_L8("CSmsMessagingDMmTsy::GetReceiveMode called"));
+ *aReceiveMode=DMMTSY_SMS_MESSAGING_RECEIVE_MODE1;
+ ReqCompleted(aTsyReqHandle,KErrNone);
+ return KErrNone;
+ }
+
+TInt CSmsMessagingDMmTsy::SetReceiveMode(const TTsyReqHandle aTsyReqHandle, RMobileSmsMessaging::TMobileSmsReceiveMode* aReceiveMode)
+ {
+ LOGTEXT(_L8("CSmsMessagingDMmTsy::SetReceiveMode called"));
+ if ( *aReceiveMode != DMMTSY_SMS_MESSAGING_RECEIVE_MODE1 )
+ ReqCompleted(aTsyReqHandle,KErrCorrupt);
+ else
+ {
+ iPhone->AddDelayedReq(aTsyReqHandle,this);
+ }
+ return KErrNone;
+ }
+
+TInt CSmsMessagingDMmTsy::SetReceiveModeCancel(const TTsyReqHandle aTsyReqHandle)
+ {
+ LOGTEXT(_L8("CSmsMessagingDMmTsy::SetReceiveModeCancel called"));
+ iPhone->RemoveDelayedReq(aTsyReqHandle);
+ ReqCompleted(aTsyReqHandle,KErrCancel);
+ return KErrNone;
+ }
+
+TInt CSmsMessagingDMmTsy::NotifyReceiveModeChange(const TTsyReqHandle aTsyReqHandle, RMobileSmsMessaging::TMobileSmsReceiveMode* aReceiveMode)
+ {
+ if (!iNotifyReceiveModeChange++)
+ {
+ LOGTEXT(_L8("CSmsMessagingDMmTsy::NotifyReceiveModeChange called"));
+ *aReceiveMode=DMMTSY_SMS_MESSAGING_RECEIVE_MODE2;
+ iPhone->AddDelayedReq(aTsyReqHandle,this);
+ }
+ return KErrNone;
+ }
+
+TInt CSmsMessagingDMmTsy::NotifyReceiveModeChangeCancel(const TTsyReqHandle aTsyReqHandle)
+ {
+ LOGTEXT(_L8("CSmsMessagingDMmTsy::NotifyReceiveModeChangeCancel called"));
+ iPhone->RemoveDelayedReq(aTsyReqHandle);
+ ReqCompleted(aTsyReqHandle,KErrCancel);
+ return KErrNone;
+ }
+
+TInt CSmsMessagingDMmTsy::GetMoSmsBearer(const TTsyReqHandle aTsyReqHandle, RMobileSmsMessaging::TMobileSmsBearer* aBearer)
+ {
+ LOGTEXT(_L8("CSmsMessagingDMmTsy::GetMoSmsBearer called"));
+ *aBearer=DMMTSY_SMS_MESSAGING_BEARER1;
+ ReqCompleted(aTsyReqHandle,KErrNone);
+ return KErrNone;
+ }
+
+TInt CSmsMessagingDMmTsy::SetMoSmsBearer(const TTsyReqHandle aTsyReqHandle, RMobileSmsMessaging::TMobileSmsBearer* aBearer)
+ {
+ LOGTEXT(_L8("CSmsMessagingDMmTsy::SetMoSmsBearer called"));
+ if ( *aBearer != DMMTSY_SMS_MESSAGING_BEARER1 )
+ ReqCompleted(aTsyReqHandle,KErrCorrupt);
+ else
+ {
+ iPhone->AddDelayedReq(aTsyReqHandle,this);
+ }
+ return KErrNone;
+ }
+
+TInt CSmsMessagingDMmTsy::SetMoSmsBearerCancel(const TTsyReqHandle aTsyReqHandle)
+ {
+ LOGTEXT(_L8("CSmsMessagingDMmTsy::SetMoSmsBearerCancel called"));
+ iPhone->RemoveDelayedReq(aTsyReqHandle);
+ ReqCompleted(aTsyReqHandle,KErrCancel);
+ return KErrNone;
+ }
+
+TInt CSmsMessagingDMmTsy::NotifyMoSmsBearerChange(const TTsyReqHandle aTsyReqHandle, RMobileSmsMessaging::TMobileSmsBearer* aBearer)
+ {
+ if (!iNotifyMoSmsBearerChange++)
+ {
+ LOGTEXT(_L8("CSmsMessagingDMmTsy::NotifyMoSmsBearerChange called"));
+ *aBearer=DMMTSY_SMS_MESSAGING_BEARER2;
+ iPhone->AddDelayedReq(aTsyReqHandle,this);
+ }
+ return KErrNone;
+ }
+
+TInt CSmsMessagingDMmTsy::NotifyMoSmsBearerChangeCancel(const TTsyReqHandle aTsyReqHandle)
+ {
+ LOGTEXT(_L8("CSmsMessagingDMmTsy::NotifyMoSmsBearerChangeCancel called"));
+ iPhone->RemoveDelayedReq(aTsyReqHandle);
+ ReqCompleted(aTsyReqHandle,KErrCancel);
+ return KErrNone;
+ }
+
+/**************************************************************************/
+//
+// CBroadcastMessagingDMmTsy
+//
+/**************************************************************************/
+
+CBroadcastMessagingDMmTsy* CBroadcastMessagingDMmTsy::NewL(CPhoneDMmTsy *aPhone, CPhoneFactoryDummyBase* aFac, const TDesC& aName)
+ {
+ CBroadcastMessagingDMmTsy* subsession=new(ELeave) CBroadcastMessagingDMmTsy(aPhone,aFac,aName);
+ CleanupStack::PushL(subsession);
+ subsession->ConstructL();
+ CleanupStack::Pop();
+ return subsession;
+ }
+
+void CBroadcastMessagingDMmTsy::Init()
+ {}
+
+CBroadcastMessagingDMmTsy::CBroadcastMessagingDMmTsy(CPhoneDMmTsy *aPhone, CPhoneFactoryDummyBase* aFac, const TDesC& aName)
+ :CSubSessionExtDummyBase(aFac), iPhone(aPhone), iCbmiListRequests(NULL)
+ {
+ iMessagingName=aName;
+ }
+
+void CBroadcastMessagingDMmTsy::ConstructL()
+ {
+ LOGTEXT(_L8("CBroadcastMessagingDMmTsy created"));
+ iCbmiListRequests = new (ELeave) CArrayPtrFlat<CListReadAllAttempt>(16);
+ }
+
+CBroadcastMessagingDMmTsy::~CBroadcastMessagingDMmTsy()
+ {
+ LOGTEXT(_L8("CBroadcastMessagingDMmTsy destroyed"));
+ iCbmiListRequests->ResetAndDestroy();
+ delete iCbmiListRequests;
+ }
+
+CTelObject* CBroadcastMessagingDMmTsy::OpenNewObjectByNameL(const TDesC& /*aName*/)
+ {
+ // Broadcast related stores can be opened from a Broadcast messaging sub-session
+
+
+ return NULL;
+ }
+
+CTelObject* CBroadcastMessagingDMmTsy::OpenNewObjectL(TDes&)
+ {
+ User::Leave(KErrNotSupported);
+ return NULL;
+ }
+
+CTelObject::TReqMode CBroadcastMessagingDMmTsy::ReqModeL(const TInt aIpc)
+ {
+ CTelObject::TReqMode ret=0;
+ switch (aIpc)
+ {
+//
+// Non-Flow Controlled Services
+//
+ case EMobileBroadcastMessagingGetFilterSetting:
+ case EMobileBroadcastMessagingGetCaps:
+ case EMobileBroadcastMessagingGetLanguageFilter:
+ case EMobileBroadcastMessagingSetLanguageFilter:
+ case EMobileBroadcastMessagingGetIdListPhase1:
+ case EMobileBroadcastMessagingGetIdListPhase2:
+ case EMobileBroadcastMessagingStoreIdList:
+ break;
+
+//
+// Flow Controlled Services
+//
+ case EMobileBroadcastMessagingSetFilterSetting:
+ ret=KReqModeFlowControlObeyed;
+ break;
+
+//
+// Multiple Completion Services with Immediate Server Repost
+// (Usually Notifications)
+//
+ case EMobileBroadcastMessagingReceiveMessage:
+ case EMobileBroadcastMessagingNotifyFilterSettingChange:
+ case EMobileBroadcastMessagingNotifyLanguageFilterChange:
+ case EMobileBroadcastMessagingNotifyIdListChange:
+ ret=KReqModeMultipleCompletionEnabled | KReqModeRePostImmediately;
+ break;
+//
+// Cancel Requests
+//
+ case EMobileBroadcastMessagingReceiveMessageCancel:
+ case EMobileBroadcastMessagingNotifyFilterSettingChangeCancel:
+ case EMobileBroadcastMessagingSetFilterSettingCancel:
+ case EMobileBroadcastMessagingGetLanguageFilterCancel:
+ case EMobileBroadcastMessagingSetLanguageFilterCancel:
+ case EMobileBroadcastMessagingNotifyLanguageFilterChangeCancel:
+ case EMobileBroadcastMessagingGetIdListCancel:
+ case EMobileBroadcastMessagingStoreIdListCancel:
+ case EMobileBroadcastMessagingNotifyIdListChangeCancel:
+ default:
+ User::Leave(KErrNotSupported);
+ break;
+ }
+
+ return ret;
+ }
+
+TInt CBroadcastMessagingDMmTsy::RegisterNotification(const TInt aIpc)
+ {
+ switch (aIpc)
+ {
+ case EMobileBroadcastMessagingReceiveMessage:
+ LOGTEXT(_L8("CBroadcastMessagingDMmTsy: RegisterNotification - Receive Message"));
+ return KErrNone;
+ case EMobileBroadcastMessagingNotifyFilterSettingChange:
+ LOGTEXT(_L8("CBroadcastMessagingDMmTsy: RegisterNotification - Receive setting Change "));
+ return KErrNone;
+ case EMobileBroadcastMessagingNotifyLanguageFilterChange:
+ LOGTEXT(_L8("CBroadcastMessagingDMmTsy: RegisterNotification - Language Filter Change "));
+ return KErrNone;
+ case EMobileBroadcastMessagingNotifyIdListChange:
+ LOGTEXT(_L8("CSmsMessagingDMmTsy: RegisterNotification - Notify BroadcastId List Change"));
+ return KErrNone;
+ default:
+ // Unknown or invalid IPC
+ LOGTEXT(_L8("CBroadcastMessagingDMmTsy: Register error, unknown IPC"));
+ return KErrNotSupported;
+ }
+ }
+
+TInt CBroadcastMessagingDMmTsy::DeregisterNotification(const TInt aIpc)
+ {
+ switch (aIpc)
+ {
+ case EMobileBroadcastMessagingReceiveMessage:
+ LOGTEXT(_L8("CBroadcastMessagingDMmTsy: DeregisterNotification - Receive Message"));
+ return KErrNone;
+ case EMobileBroadcastMessagingNotifyFilterSettingChange:
+ LOGTEXT(_L8("CBroadcastMessagingDMmTsy: DeregisterNotification - Receive setting Change "));
+ return KErrNone;
+ case EMobileBroadcastMessagingNotifyLanguageFilterChange:
+ LOGTEXT(_L8("CBroadcastMessagingDMmTsy: DeregisterNotification - Language Filter Change "));
+ return KErrNone;
+ case EMobileBroadcastMessagingNotifyIdListChange:
+ LOGTEXT(_L8("CSmsMessagingDMmTsy: DeregisterNotification - Notify BroadcastId List Change"));
+ return KErrNone;
+ default:
+ // Unknown or invalid IPC
+ LOGTEXT(_L8("CBroadcastMessagingDMmTsy: Deregister error, unknown IPC"));
+ return KErrNotSupported;
+ }
+ }
+
+TInt CBroadcastMessagingDMmTsy::NumberOfSlotsL(const TInt aIpc)
+ {
+ TInt numberOfSlots=1;
+ switch (aIpc)
+ {
+ case EMobileBroadcastMessagingReceiveMessage:
+ LOGTEXT(_L8("CBroadcastMessagingDMmTsy: Registered with 10 slots"));
+ numberOfSlots=10;
+ break;
+ case EMobileBroadcastMessagingNotifyFilterSettingChange:
+ case EMobileBroadcastMessagingNotifyLanguageFilterChange:
+ case EMobileBroadcastMessagingNotifyIdListChange:
+ LOGTEXT(_L8("CBroadcastMessagingDMmTsy: Registered with 2 slots"));
+ numberOfSlots=2;
+ break;
+ default:
+ // Unknown or invalid Phone IPC
+ LOGTEXT(_L8("CBroadcastMessagingDMmTsy: Number of Slots error, unknown IPC"));
+ User::Leave(KErrNotSupported);
+ break;
+ }
+ return numberOfSlots;
+ }
+
+
+TInt CBroadcastMessagingDMmTsy::ExtFunc(const TTsyReqHandle aTsyReqHandle,const TInt aIpc,
+ const TDataPackage& aPackage)
+ {
+ TInt err;
+ TAny* dataPtr=aPackage.Ptr1();
+ TAny* dataPtr2=aPackage.Ptr2();
+
+ switch (aIpc)
+ {
+ case EMobileBroadcastMessagingGetCaps:
+ return GetCaps(aTsyReqHandle, aPackage.Des1n());
+
+ case EMobileBroadcastMessagingGetFilterSetting:
+ return GetFilterSetting(aTsyReqHandle,
+ REINTERPRET_CAST(RMobileBroadcastMessaging::TMobilePhoneBroadcastFilter*, dataPtr));
+
+ case EMobileBroadcastMessagingSetFilterSetting:
+ return SetFilterSetting(aTsyReqHandle,
+ REINTERPRET_CAST(RMobileBroadcastMessaging::TMobilePhoneBroadcastFilter*, dataPtr));
+
+ case EMobileBroadcastMessagingNotifyFilterSettingChange:
+ return NotifyFilterSettingChange(aTsyReqHandle,
+ REINTERPRET_CAST(RMobileBroadcastMessaging::TMobilePhoneBroadcastFilter*, dataPtr));
+
+ case EMobileBroadcastMessagingReceiveMessage:
+ return ReceiveMessage(aTsyReqHandle, aPackage.Des1n(), aPackage.Des2n());
+
+ case EMobileBroadcastMessagingGetLanguageFilter:
+ return GetLanguageFilter(aTsyReqHandle, aPackage.Des1u());
+
+ case EMobileBroadcastMessagingNotifyLanguageFilterChange:
+ return NotifyLanguageFilterChange(aTsyReqHandle, aPackage.Des1u());
+
+ case EMobileBroadcastMessagingSetLanguageFilter:
+ return SetLanguageFilter(aTsyReqHandle, aPackage.Des1u());
+
+ case EMobileBroadcastMessagingReceiveMessageCancel:
+ return ReceiveMessageCancel(aTsyReqHandle);
+ case EMobileBroadcastMessagingNotifyFilterSettingChangeCancel:
+ return NotifyFilterSettingChangeCancel(aTsyReqHandle);
+ case EMobileBroadcastMessagingSetFilterSettingCancel:
+ return SetFilterSettingCancel(aTsyReqHandle);
+
+ case EMobileBroadcastMessagingGetIdListPhase1:
+ return GetBroadcastIdListPhase1(aTsyReqHandle,
+ REINTERPRET_CAST(CRetrieveMobilePhoneBroadcastIdList::TGetBroadcastIdRequest*, dataPtr),
+ REINTERPRET_CAST(TInt*, dataPtr2));
+ case EMobileBroadcastMessagingGetIdListPhase2:
+ return GetBroadcastIdListPhase2(aTsyReqHandle,
+ REINTERPRET_CAST(RMobilePhone::TClientId*, dataPtr),
+ aPackage.Des2n());
+ case EMobileBroadcastMessagingStoreIdList:
+ {
+ TRAP(err,StoreBroadcastIdListL(aTsyReqHandle,aPackage.Des1n()));
+ if (err != KErrNone)
+ ReqCompleted(aTsyReqHandle,err);
+ return KErrNone;
+ }
+ case EMobileBroadcastMessagingNotifyIdListChange:
+ return NotifyBroadcastIdListChange(aTsyReqHandle);
+ default:
+ return KErrNotSupported;
+ }
+ }
+
+TInt CBroadcastMessagingDMmTsy::CancelService(const TInt aIpc,const TTsyReqHandle aTsyReqHandle)
+ {
+ LOGTEXT(_L8("CBroadcastMessagingDMmTsy: - CancelService called"));
+ switch (aIpc)
+ {
+ case EMobileBroadcastMessagingReceiveMessage:
+ return ReceiveMessageCancel(aTsyReqHandle);
+ case EMobileBroadcastMessagingNotifyFilterSettingChange:
+ return NotifyFilterSettingChangeCancel(aTsyReqHandle);
+ case EMobileBroadcastMessagingSetFilterSetting:
+ return SetFilterSettingCancel(aTsyReqHandle);
+ case EMobileBroadcastMessagingGetLanguageFilter:
+ return GetLanguageFilterCancel(aTsyReqHandle);
+ case EMobileBroadcastMessagingSetLanguageFilter:
+ return SetLanguageFilterCancel(aTsyReqHandle);
+ case EMobileBroadcastMessagingNotifyLanguageFilterChange:
+ return NotifyLanguageFilterChangeCancel(aTsyReqHandle);
+ case EMobileBroadcastMessagingGetIdListPhase1:
+ case EMobileBroadcastMessagingGetIdListPhase2:
+ return GetBroadcastIdListCancel(aTsyReqHandle);
+ case EMobileBroadcastMessagingStoreIdList:
+ return StoreBroadcastIdListCancel(aTsyReqHandle);
+ case EMobileBroadcastMessagingNotifyIdListChange:
+ return NotifyBroadcastIdListChangeCancel(aTsyReqHandle);
+ default:
+ return KErrGeneral;
+ }
+ }
+
+
+TInt CBroadcastMessagingDMmTsy::GetCaps(const TTsyReqHandle aTsyReqHandle, TDes8* aCaps)
+ {
+ LOGTEXT(_L8("CBroadcastMessagingDMmTsy::GetCaps called"));
+ RMobileBroadcastMessaging::TMobileBroadcastCapsV1Pckg* cbsCapsPckg = (RMobileBroadcastMessaging::TMobileBroadcastCapsV1Pckg*)aCaps;
+ RMobileBroadcastMessaging::TMobileBroadcastCapsV1& cbsCaps = (*cbsCapsPckg)();
+
+ cbsCaps.iModeCaps=DMMTSY_BROADCAST_MESSAGING_MODE_CAPS;
+ cbsCaps.iFilterCaps=DMMTSY_BROADCAST_MESSAGING_FILTER_CAPS;
+
+ ReqCompleted(aTsyReqHandle,KErrNone);
+ return KErrNone;
+ }
+
+TInt CBroadcastMessagingDMmTsy::ReceiveMessage(const TTsyReqHandle aTsyReqHandle, TDes8* aMsgData, TDes8* aMsgAtts)
+ {
+ LOGTEXT(_L8("CBroadcastMessagingDMmTsy::ReceiveMessage called"));
+
+ RMobileBroadcastMessaging::TMobileBroadcastAttributesV1Pckg* attsPckg = REINTERPRET_CAST(RMobileBroadcastMessaging::TMobileBroadcastAttributesV1Pckg*, aMsgAtts);
+ RMobileBroadcastMessaging::TMobileBroadcastAttributesV1 &atts = (*attsPckg)();
+
+ if(atts.ExtensionId()==KETelExtMultimodeV2)
+ {
+ LOGTEXT(_L8("CBroadcastMessagingDMmTsy::ReceiveMessage is using V2 attributes"));
+
+ RMobileBroadcastMessaging::TMobileBroadcastAttributesV2Pckg* attsV2Pckg = REINTERPRET_CAST(RMobileBroadcastMessaging::TMobileBroadcastAttributesV2Pckg*, aMsgAtts);
+ RMobileBroadcastMessaging::TMobileBroadcastAttributesV2 &attsV2 = (*attsV2Pckg)();
+
+ attsV2.iFormat = DMMTSY_CBS_MESSAGE_PDU_FORMAT;
+ attsV2.iFlags = DMMTSY_BROADCAST_MESSAGING_ATT_FLAGS;
+ attsV2.iDCS = DMMTSY_BROADCAST_MESSAGING_ATT_DCS;
+ attsV2.iMessageId = DMMTSY_BROADCAST_MESSAGING_ATT_MSGID;
+ attsV2.iMessageType =DMMTSY_BROADCAST_MESSAGING_ATT_MSGTYPE;
+ attsV2.iNumberOfPages = DMMTSY_BROADCAST_MESSAGING_ATT_NUMOFPAGES;
+ attsV2.iSerialNum = DMMTSY_BROADCAST_MESSAGING_ATT_SERIAL;
+
+ *aMsgData = DMMTSY_CBS_MESSAGE_PDU;
+ }
+ else if(atts.ExtensionId()==KETelExtMultimodeV1)
+ {
+ LOGTEXT(_L8("CBroadcastMessagingDMmTsy::ReceiveMessage is using V1 attributes"));
+
+ atts.iFormat = DMMTSY_CBS_MESSAGE_PDU_FORMAT;
+ atts.iFlags = DMMTSY_BROADCAST_MESSAGING_ATT_FLAGS;
+ *aMsgData = DMMTSY_CBS_MESSAGE_PDU;
+ }
+ iPhone->AddDelayedReq(aTsyReqHandle,this);
+ return KErrNone;
+ }
+
+TInt CBroadcastMessagingDMmTsy::ReceiveMessageCancel(const TTsyReqHandle aTsyReqHandle)
+ {
+ LOGTEXT(_L8("CBroadcastMessagingDMmTsy::ReceiveMessageCancel called"));
+ iPhone->RemoveDelayedReq(aTsyReqHandle);
+ ReqCompleted(aTsyReqHandle,KErrCancel);
+ return KErrNone;
+ }
+
+TInt CBroadcastMessagingDMmTsy::GetFilterSetting(const TTsyReqHandle aTsyReqHandle, RMobileBroadcastMessaging::TMobilePhoneBroadcastFilter* aSetting)
+ {
+ LOGTEXT(_L8("CBroadcastMessagingDMmTsy::GetFilterSetting called"));
+ *aSetting=DMMTSY_BROADCAST_RECEIVE_SETTING1;
+ ReqCompleted(aTsyReqHandle,KErrNone);
+ return KErrNone;
+ }
+
+TInt CBroadcastMessagingDMmTsy::SetFilterSetting(const TTsyReqHandle aTsyReqHandle, RMobileBroadcastMessaging::TMobilePhoneBroadcastFilter* aSetting)
+ {
+ LOGTEXT(_L8("CBroadcastMessagingDMmTsy::SetFilterSetting called"));
+ if ( *aSetting != DMMTSY_BROADCAST_RECEIVE_SETTING2 )
+ ReqCompleted(aTsyReqHandle,KErrCorrupt);
+ else
+ {
+ iPhone->AddDelayedReq(aTsyReqHandle,this);
+ }
+ return KErrNone;
+ }
+
+TInt CBroadcastMessagingDMmTsy::SetFilterSettingCancel(const TTsyReqHandle aTsyReqHandle)
+ {
+ LOGTEXT(_L8("CBroadcastMessagingDMmTsy::SetFilterSettingCancel called"));
+ iPhone->RemoveDelayedReq(aTsyReqHandle);
+ ReqCompleted(aTsyReqHandle,KErrCancel);
+ return KErrNone;
+ }
+
+TInt CBroadcastMessagingDMmTsy::NotifyFilterSettingChange(const TTsyReqHandle aTsyReqHandle, RMobileBroadcastMessaging::TMobilePhoneBroadcastFilter* aSetting)
+ {
+ if (!iNotifyFilterSettingChange++)
+ {
+ LOGTEXT(_L8("CBroadcastMessagingDMmTsy::NotifyFilterSettingChange called"));
+ *aSetting=DMMTSY_BROADCAST_RECEIVE_SETTING2;
+ iPhone->AddDelayedReq(aTsyReqHandle,this);
+ }
+ return KErrNone;
+ }
+
+TInt CBroadcastMessagingDMmTsy::NotifyFilterSettingChangeCancel(const TTsyReqHandle aTsyReqHandle)
+ {
+ LOGTEXT(_L8("CBroadcastMessagingDMmTsy::NotifyFilterSettingChangeCancel called"));
+ iPhone->RemoveDelayedReq(aTsyReqHandle);
+ ReqCompleted(aTsyReqHandle,KErrCancel);
+ return KErrNone;
+ }
+
+TInt CBroadcastMessagingDMmTsy::GetLanguageFilter(const TTsyReqHandle aTsyReqHandle, TDes16* aLangFilter)
+ {
+ LOGTEXT(_L8("CBroadcastMessagingDMmTsy::GetLanguageFilter called"));
+ *aLangFilter = DMMTSY_CBS_MESSAGE_LANGUAGE_FILTER;
+ iPhone->AddDelayedReq(aTsyReqHandle,this);
+ return KErrNone;
+ }
+
+TInt CBroadcastMessagingDMmTsy::GetLanguageFilterCancel(const TTsyReqHandle aTsyReqHandle)
+ {
+ LOGTEXT(_L8("CBroadcastMessagingDMmTsy::GetLanguageFilterCancel called"));
+ iPhone->RemoveDelayedReq(aTsyReqHandle);
+ ReqCompleted(aTsyReqHandle,KErrCancel);
+ return KErrNone;
+ }
+
+TInt CBroadcastMessagingDMmTsy::SetLanguageFilter(const TTsyReqHandle aTsyReqHandle, TDesC16* aLangFilter)
+ {
+ LOGTEXT(_L8("CBroadcastMessagingDMmTsy::SetLanguageFilter called"));
+ if (aLangFilter->Compare(DMMTSY_CBS_MESSAGE_LANGUAGE_FILTER) != 0)
+ ReqCompleted(aTsyReqHandle,KErrCorrupt);
+ else
+ iPhone->AddDelayedReq(aTsyReqHandle,this);
+ return KErrNone;
+ }
+
+TInt CBroadcastMessagingDMmTsy::SetLanguageFilterCancel(const TTsyReqHandle aTsyReqHandle)
+ {
+ LOGTEXT(_L8("CBroadcastMessagingDMmTsy::SetLanguageFilterCancel called"));
+ iPhone->RemoveDelayedReq(aTsyReqHandle);
+ ReqCompleted(aTsyReqHandle,KErrCancel);
+ return KErrNone;
+ }
+
+TInt CBroadcastMessagingDMmTsy::NotifyLanguageFilterChange(const TTsyReqHandle aTsyReqHandle, TDes16* aLangFilter)
+ {
+ if (!iNotifyLanguageFilterChange++)
+ {
+ LOGTEXT(_L8("CBroadcastMessagingDMmTsy::NotifyLanguageFilterChange called"));
+ *aLangFilter = DMMTSY_CBS_MESSAGE_LANGUAGE_FILTER;
+ iPhone->AddDelayedReq(aTsyReqHandle,this);
+ }
+ return KErrNone;
+ }
+
+TInt CBroadcastMessagingDMmTsy::NotifyLanguageFilterChangeCancel(const TTsyReqHandle aTsyReqHandle)
+ {
+ LOGTEXT(_L8("CBroadcastMessagingDMmTsy::NotifyLanguageFilterChangeCancel called"));
+ iPhone->RemoveDelayedReq(aTsyReqHandle);
+ ReqCompleted(aTsyReqHandle,KErrCancel);
+ return KErrNone;
+ }
+
+TInt CBroadcastMessagingDMmTsy::GetBroadcastIdListPhase1(const TTsyReqHandle aTsyReqHandle, CRetrieveMobilePhoneBroadcastIdList::TGetBroadcastIdRequest* aReqData, TInt* aBufSize)
+ {
+ LOGTEXT(_L8("CBroadcastMessagingDMmTsy::GetBroadcastIdListPhase1 called"));
+ TInt ret=KErrNone;
+ TInt leaveCode=KErrNone;
+
+ if (aReqData->iIdType != DMMTSY_BROADCAST_ID_TYPE)
+ leaveCode = KErrCorrupt;
+
+ if (!leaveCode)
+ TRAP(leaveCode, ret=ProcessGetBroadcastIdListPhase1L(aTsyReqHandle, &aReqData->iClient, aBufSize););
+
+ if (leaveCode != KErrNone)
+ ReqCompleted(aTsyReqHandle,leaveCode);
+ return ret;
+ }
+
+TInt CBroadcastMessagingDMmTsy::ProcessGetBroadcastIdListPhase1L(const TTsyReqHandle aTsyReqHandle, RMobilePhone::TClientId* aClient, TInt* aBufSize)
+ {
+ CMobilePhoneBroadcastIdList* list=CMobilePhoneBroadcastIdList::NewL();
+ CleanupStack::PushL(list);
+
+ RMobileBroadcastMessaging::TMobileBroadcastIdEntryV1 entry;
+
+ // fill up an example list
+ for (TInt index=0; index < DMMTSY_CBMI_STORE_COUNT; index++)
+ {
+ switch (index)
+ {
+ case 0:
+ entry.iId=DMMTSY_CBMI_ID1;
+ break;
+ case 1:
+ entry.iId=DMMTSY_CBMI_ID2;
+ break;
+ case 2:
+ entry.iId=DMMTSY_CBMI_ID3;
+ break;
+ }
+ // Add the entry into the list, at the next empty location
+ list->AddEntryL(entry);
+ }
+
+ list->SetMaxNumberEntries(DMMTSY_CBMI_MAX_ENTRIES);
+
+ // Store the streamed list and the client ID
+ CListReadAllAttempt* read=CListReadAllAttempt::NewL(aClient,aTsyReqHandle);
+ CleanupStack::PushL(read);
+
+ read->iListBuf = list->StoreLC();
+ CleanupStack::Pop(); // pop the CBufFlat allocated by StoreLC
+
+ iCbmiListRequests->AppendL(read);
+ CleanupStack::Pop(); // pop the CListReadAllAttempt
+
+ // return the CBufFlat’s size to client
+ *aBufSize=(read->iListBuf)->Size();
+
+ // Complete first phase of list retrieval
+ iPhone->AddDelayedReq(aTsyReqHandle,this);
+ CleanupStack::PopAndDestroy(); // pop&destroy list
+ return KErrNone;
+ }
+
+TInt CBroadcastMessagingDMmTsy::GetBroadcastIdListPhase2(const TTsyReqHandle aTsyReqHandle, RMobilePhone::TClientId* aClient, TDes8* aBuf)
+ {
+ LOGTEXT(_L8("CBroadcastMessagingDMmTsy::GetBroadcastIdListPhase2 called"));
+ CListReadAllAttempt* read=NULL;
+ // Find the read attempt from this client
+ for (TInt i=0; i<iCbmiListRequests->Count(); ++i)
+ {
+ read = iCbmiListRequests->At(i);
+ if ((read->iClient.iSessionHandle==aClient->iSessionHandle) &&
+ (read->iClient.iSubSessionHandle==aClient->iSubSessionHandle))
+ {
+ TPtr8 bufPtr((read->iListBuf)->Ptr(0));
+ // Copy the streamed list to the client
+ aBuf->Copy(bufPtr);
+ delete read;
+ iCbmiListRequests->Delete(i);
+ ReqCompleted(aTsyReqHandle,KErrNone);
+ return KErrNone;
+ }
+ }
+
+ return KErrNotFound;
+ }
+
+TInt CBroadcastMessagingDMmTsy::GetBroadcastIdListCancel(const TTsyReqHandle aTsyReqHandle)
+ {
+ LOGTEXT(_L8("CBroadcastMessagingDMmTsy::GetBroadcastIdListCancel called"));
+ iPhone->RemoveDelayedReq(aTsyReqHandle);
+
+ // Remove the read all attempt from iCbmiListRequests
+ CListReadAllAttempt* read=NULL;
+ for (TInt i=0; i<iCbmiListRequests->Count(); ++i)
+ {
+ read = iCbmiListRequests->At(i);
+ if (read->iReqHandle == aTsyReqHandle)
+ {
+ delete read;
+ iCbmiListRequests->Delete(i);
+ break;
+ }
+ }
+
+ ReqCompleted(aTsyReqHandle,KErrCancel);
+ return KErrNone;
+ }
+
+void CBroadcastMessagingDMmTsy::StoreBroadcastIdListL(const TTsyReqHandle aTsyReqHandle, TDes8* aList)
+ {
+ LOGTEXT(_L8("CBroadcastMessagingDMmTsy::StoreBroadcastIdListL called"));
+
+ TInt i;
+ CMobilePhoneBroadcastIdList* list=CMobilePhoneBroadcastIdList::NewL();
+ CleanupStack::PushL(list);
+ list->RestoreL(*aList);
+ if (list->Enumerate() != DMMTSY_CBMI_STORE_COUNT)
+ User::Leave(KErrCorrupt);
+
+ for (i = 0; i < list->Enumerate() && list->GetEntryL(i).iId == DMMTSY_CBMI_ID1; i++)
+ {
+ }
+ if (i != list->Enumerate())
+ User::Leave(KErrCorrupt);
+
+ iPhone->AddDelayedReq(aTsyReqHandle,this);
+
+ CleanupStack::PopAndDestroy(); // list
+ }
+
+TInt CBroadcastMessagingDMmTsy::StoreBroadcastIdListCancel(const TTsyReqHandle aTsyReqHandle)
+ {
+ LOGTEXT(_L8("CBroadcastMessagingDMmTsy::StoreBroadcastIdListCancel called"));
+ iPhone->RemoveDelayedReq(aTsyReqHandle);
+ ReqCompleted(aTsyReqHandle,KErrCancel);
+ return KErrNone;
+ }
+
+TInt CBroadcastMessagingDMmTsy::NotifyBroadcastIdListChange(const TTsyReqHandle aTsyReqHandle)
+ {
+ if (!iNotifyBroadcastIdListChange++)
+ {
+ LOGTEXT(_L8("CBroadcastMessagingDMmTsy::NotifyBroadcastIdListChange called"));
+ iPhone->AddDelayedReq(aTsyReqHandle,this);
+ }
+ return KErrNone;
+ }
+
+TInt CBroadcastMessagingDMmTsy::NotifyBroadcastIdListChangeCancel(const TTsyReqHandle aTsyReqHandle)
+ {
+ LOGTEXT(_L8("CBroadcastMessagingDMmTsy::NotifyBroadcastIdListChangeCancel called"));
+ iPhone->RemoveDelayedReq(aTsyReqHandle);
+ ReqCompleted(aTsyReqHandle,KErrCancel);
+ return KErrNone;
+ }
+
+
+
+/**************************************************************************/
+//
+// CUssdMessagingDMmTsy
+//
+/**************************************************************************/
+
+CUssdMessagingDMmTsy* CUssdMessagingDMmTsy::NewL(CPhoneDMmTsy *aPhone, CPhoneFactoryDummyBase* aFac, const TDesC& aName)
+ {
+ CUssdMessagingDMmTsy* subsession=new(ELeave) CUssdMessagingDMmTsy(aPhone,aFac,aName);
+ CleanupStack::PushL(subsession);
+ subsession->ConstructL();
+ CleanupStack::Pop();
+ return subsession;
+ }
+
+void CUssdMessagingDMmTsy::Init()
+ {}
+
+CUssdMessagingDMmTsy::CUssdMessagingDMmTsy(CPhoneDMmTsy *aPhone, CPhoneFactoryDummyBase* aFac, const TDesC& aName)
+ :CSubSessionExtDummyBase(aFac), iPhone(aPhone)
+ {
+ iMessagingName=aName;
+ }
+
+void CUssdMessagingDMmTsy::ConstructL()
+ {
+ LOGTEXT(_L8("CUssdMessagingDMmTsy created"));
+ }
+
+CUssdMessagingDMmTsy::~CUssdMessagingDMmTsy()
+ {
+ LOGTEXT(_L8("CUssdMessagingDMmTsy destroyed"));
+ }
+
+CTelObject* CUssdMessagingDMmTsy::OpenNewObjectByNameL(const TDesC& /*aName*/)
+ {
+ User::Leave(KErrNotSupported);
+ return NULL;
+ }
+
+CTelObject* CUssdMessagingDMmTsy::OpenNewObjectL(TDes&)
+ {
+ User::Leave(KErrNotSupported);
+ return NULL;
+ }
+
+CTelObject::TReqMode CUssdMessagingDMmTsy::ReqModeL(const TInt aIpc)
+ {
+ CTelObject::TReqMode ret=0;
+ switch (aIpc)
+ {
+//
+// Non-Flow Controlled Services
+//
+ case EMobileUssdMessagingGetCaps:
+ break;
+//
+// Flow Controlled Services
+//
+ case EMobileUssdMessagingSendMessage:
+ case EMobileUssdMessagingSendMessageNoFdnCheck:
+ case EMobileUssdMessagingSendRelease:
+ ret=KReqModeFlowControlObeyed;
+ break;
+
+//
+// Immediate Server Repost
+//
+ case EMobileUssdMessagingReceiveMessage:
+ case EMobileUssdMessagingNotifyNetworkRelease:
+ ret=KReqModeRePostImmediately;
+ break;
+//
+// Cancel Requests
+//
+ case EMobileUssdMessagingReceiveMessageCancel:
+ case EMobileUssdMessagingSendMessageCancel:
+ case EMobileUssdMessagingSendMessageNoFdnCheckCancel:
+ case EMobileUssdMessagingSendReleaseCancel:
+ case EMobileUssdMessagingNotifyNetworkReleaseCancel:
+ default:
+ User::Leave(KErrNotSupported);
+ break;
+ }
+
+ return ret;
+ }
+
+TInt CUssdMessagingDMmTsy::RegisterNotification(const TInt aIpc)
+ {
+ switch (aIpc)
+ {
+ case EMobileUssdMessagingReceiveMessage:
+ LOGTEXT(_L8("CUssdMessagingDMmTsy: RegisterNotification - Receive USSD"));
+ return KErrNone;
+ case EMobileUssdMessagingNotifyNetworkRelease:
+ LOGTEXT(_L8("CUssdMessagingDMmTsy: RegisterNotification - Notify Network Release"));
+ return KErrNone;
+ default:
+ // Unknown or invalid IPC
+ LOGTEXT(_L8("CUssdMessagingDMmTsy: Register error, unknown IPC"));
+ return KErrNotSupported;
+ }
+ }
+
+TInt CUssdMessagingDMmTsy::DeregisterNotification(const TInt aIpc)
+ {
+ switch (aIpc)
+ {
+ case EMobileUssdMessagingReceiveMessage:
+ LOGTEXT(_L8("CUssdMessagingDMmTsy: DeregisterNotification - Receive USSD"));
+ return KErrNone;
+ case EMobileUssdMessagingNotifyNetworkRelease:
+ LOGTEXT(_L8("CUssdMessagingDMmTsy: DeregisterNotification - Notify Network Release"));
+ return KErrNone;
+ default:
+ // Unknown or invalid IPC
+ LOGTEXT(_L8("CUssdMessagingDMmTsy: Deregister error, unknown IPC"));
+ return KErrNotSupported;
+ }
+ }
+
+TInt CUssdMessagingDMmTsy::NumberOfSlotsL(const TInt aIpc)
+ {
+ TInt numberOfSlots=1;
+ switch (aIpc)
+ {
+ case EMobileUssdMessagingReceiveMessage:
+ case EMobileUssdMessagingNotifyNetworkRelease:
+ LOGTEXT(_L8("CUssdMessagingDMmTsy: Registered with 2 slot"));
+ numberOfSlots=2;
+ break;
+ default:
+ // Unknown or invalid Phone IPC
+ LOGTEXT(_L8("CUssdMessagingDMmTsy: Number of Slots error, unknown IPC"));
+ User::Leave(KErrNotSupported);
+ break;
+ }
+ return numberOfSlots;
+ }
+
+
+TInt CUssdMessagingDMmTsy::ExtFunc(const TTsyReqHandle aTsyReqHandle,const TInt aIpc,
+ const TDataPackage& aPackage)
+ {
+ switch (aIpc)
+ {
+
+ case EMobileUssdMessagingGetCaps:
+ return GetCaps(aTsyReqHandle, aPackage.Des1n());
+
+ case EMobileUssdMessagingSendMessage:
+ return SendMessage(aTsyReqHandle, aPackage.Des1n(), aPackage.Des2n());
+
+ case EMobileUssdMessagingSendMessageNoFdnCheck:
+ return SendMessageNoFdnCheck(aTsyReqHandle, aPackage.Des1n(), aPackage.Des2n());
+
+ case EMobileUssdMessagingReceiveMessage:
+ return ReceiveMessage(aTsyReqHandle, aPackage.Des1n(), aPackage.Des2n());
+ case EMobileUssdMessagingSendRelease:
+ return SendRelease(aTsyReqHandle, aPackage.Des1n());
+ case EMobileUssdMessagingNotifyNetworkRelease:
+ switch(aPackage.Type())
+ {
+ // Switch between the alternative implementations of GetPhoneStoreInfo
+ case TDataPackage::EPackage1n:
+ return NotifyNetworkRelease(aTsyReqHandle, aPackage.Des1n());
+ case TDataPackage::EPackage1n2n:
+ return NotifyNetworkRelease(aTsyReqHandle, aPackage.Des1n(),aPackage.Des2n());
+ default:
+ return KErrCorrupt;
+ }
+
+//
+// Cancel Requests
+//
+ case EMobileUssdMessagingReceiveMessageCancel:
+ return ReceiveMessageCancel(aTsyReqHandle);
+ case EMobileUssdMessagingSendMessageCancel:
+ return SendMessageCancel(aTsyReqHandle);
+ case EMobileUssdMessagingSendMessageNoFdnCheckCancel:
+ return SendMessageNoFdnCheckCancel(aTsyReqHandle);
+ case EMobileUssdMessagingSendReleaseCancel:
+ return SendReleaseCancel(aTsyReqHandle);
+ case EMobileUssdMessagingNotifyNetworkReleaseCancel:
+ return NotifyNetworkReleaseCancel(aTsyReqHandle);
+
+ default:
+ return KErrNotSupported;
+ }
+ }
+
+TInt CUssdMessagingDMmTsy::CancelService(const TInt aIpc,const TTsyReqHandle aTsyReqHandle)
+ {
+ LOGTEXT(_L8("CUssdMessagingDMmTsy: - CancelService called"));
+ switch (aIpc)
+ {
+ case EMobileUssdMessagingReceiveMessage:
+ return ReceiveMessageCancel(aTsyReqHandle);
+ case EMobileUssdMessagingSendMessage:
+ return SendMessageCancel(aTsyReqHandle);
+ case EMobileUssdMessagingSendMessageNoFdnCheck:
+ return SendMessageNoFdnCheckCancel(aTsyReqHandle);
+ case EMobileUssdMessagingSendRelease:
+ return SendReleaseCancel(aTsyReqHandle);
+ case EMobileUssdMessagingNotifyNetworkRelease:
+ return NotifyNetworkReleaseCancel(aTsyReqHandle);
+ default:
+ return KErrGeneral;
+ }
+ }
+
+TInt CUssdMessagingDMmTsy::GetCaps(const TTsyReqHandle aTsyReqHandle, TDes8* aCaps)
+ {
+ LOGTEXT(_L8("CUssdMessagingDMmTsy::GetCaps called"));
+ RMobileUssdMessaging::TMobileUssdCapsV1Pckg* ussdCapsPckg = (RMobileUssdMessaging::TMobileUssdCapsV1Pckg*)aCaps;
+ RMobileUssdMessaging::TMobileUssdCapsV1& ussdCaps = (*ussdCapsPckg)();
+
+ ussdCaps.iUssdTypes=DMMTSY_USSD_MESSAGING_TYPE_CAPS;
+
+ ReqCompleted(aTsyReqHandle,KErrNone);
+ return KErrNone;
+ }
+
+TInt CUssdMessagingDMmTsy::ReceiveMessage(const TTsyReqHandle aTsyReqHandle, TDes8* aMsgData, TDes8* aMsgAttributes)
+ {
+ if (!iReceiveMessage++)
+ {
+ LOGTEXT(_L8("CUssdMessagingDMmTsy::ReceiveMessage called"));
+ RMobileUssdMessaging::TMobileUssdAttributesV1Pckg* attsPckg = REINTERPRET_CAST(RMobileUssdMessaging::TMobileUssdAttributesV1Pckg*,aMsgAttributes);
+ RMobileUssdMessaging::TMobileUssdAttributesV1& atts = (*attsPckg)();
+
+ *aMsgData = DMMTSY_USSD_MESSAGE_PDU;
+
+ atts.iFlags = DMMTSY_USSD_ATTRIBUTE_FLAGS;
+ atts.iFormat = DMMTSY_USSD_ATTRIBUTE_FORMAT;
+ atts.iType = DMMTSY_USSD_ATTRIBUTE_TYPE;
+ atts.iDcs = DMMTSY_USSD_ATTRIBUTE_DCS;
+
+ iPhone->AddDelayedReq(aTsyReqHandle,this);
+ }
+ return KErrNone;
+ }
+
+TInt CUssdMessagingDMmTsy::ReceiveMessageCancel(const TTsyReqHandle aTsyReqHandle)
+ {
+ LOGTEXT(_L8("CUssdMessagingDMmTsy::ReceiveMessageCancel called"));
+ iPhone->RemoveDelayedReq(aTsyReqHandle);
+ ReqCompleted(aTsyReqHandle,KErrCancel);
+ return KErrNone;
+ }
+
+TInt CUssdMessagingDMmTsy::SendMessage(const TTsyReqHandle aTsyReqHandle, TDesC8* aMsgData, TDesC8* aMsgAttributes)
+ {
+ LOGTEXT(_L8("CUssdMessagingDMmTsy::SendMessage called"));
+ RMobileUssdMessaging::TMobileUssdAttributesV1Pckg* attsPckg = REINTERPRET_CAST(RMobileUssdMessaging::TMobileUssdAttributesV1Pckg*,aMsgAttributes);
+ RMobileUssdMessaging::TMobileUssdAttributesV1& atts = (*attsPckg)();
+ if ((aMsgData->Compare(DMMTSY_USSD_MESSAGE_PDU) != 0) ||
+ atts.iFlags != DMMTSY_USSD_ATTRIBUTE_FLAGS ||
+ atts.iFormat != DMMTSY_USSD_ATTRIBUTE_FORMAT ||
+ atts.iType != DMMTSY_USSD_ATTRIBUTE_TYPE ||
+ atts.iDcs != DMMTSY_USSD_ATTRIBUTE_DCS)
+ ReqCompleted(aTsyReqHandle,KErrCorrupt);
+ else
+ iPhone->AddDelayedReq(aTsyReqHandle,this);
+ return KErrNone;
+ }
+
+TInt CUssdMessagingDMmTsy::SendMessageCancel(const TTsyReqHandle aTsyReqHandle)
+ {
+ LOGTEXT(_L8("CUssdMessagingDMmTsy::SendMessageCancel called"));
+ iPhone->RemoveDelayedReq(aTsyReqHandle);
+ ReqCompleted(aTsyReqHandle,KErrCancel);
+ return KErrNone;
+ }
+
+TInt CUssdMessagingDMmTsy::SendMessageNoFdnCheck(const TTsyReqHandle aTsyReqHandle, TDesC8* aMsgData, TDesC8* aMsgAttributes)
+ /**
+ * This method sends an outgoing SMS to the network. The number used for sending the SMS
+ * is not checked against those in the Fixed Dialling Number list even if the FDN service is enabled
+ *
+ * @param aMsgData Supplies the TPDU to send
+ * @param aMsgAttributes Supplies the attributes of the outgoing message
+ */
+ {
+ LOGTEXT(_L8("CUssdMessagingDMmTsy::SendMessageNoFdnCheck called"));
+ RMobileUssdMessaging::TMobileUssdAttributesV1Pckg* attsPckg = REINTERPRET_CAST(RMobileUssdMessaging::TMobileUssdAttributesV1Pckg*,aMsgAttributes);
+ RMobileUssdMessaging::TMobileUssdAttributesV1& atts = (*attsPckg)();
+ if ((aMsgData->Compare(DMMTSY_USSD_MESSAGE_PDU) != 0) ||
+ atts.iFlags != DMMTSY_USSD_ATTRIBUTE_FLAGS ||
+ atts.iFormat != DMMTSY_USSD_ATTRIBUTE_FORMAT ||
+ atts.iType != DMMTSY_USSD_ATTRIBUTE_TYPE ||
+ atts.iDcs != DMMTSY_USSD_ATTRIBUTE_DCS)
+ ReqCompleted(aTsyReqHandle,KErrCorrupt);
+ else
+ iPhone->AddDelayedReq(aTsyReqHandle,this);
+ return KErrNone;
+ }
+
+TInt CUssdMessagingDMmTsy::SendMessageNoFdnCheckCancel(const TTsyReqHandle aTsyReqHandle)
+ /**
+ * This method cancels the sending of an outgoing SMS to the network. The number used for sending the SMS
+ * is not checked against those in the Fixed Dialling Number list even if the FDN service is enabled
+ *
+ */
+ {
+ LOGTEXT(_L8("CUssdMessagingDMmTsy::SendMessageNoFdnCheckCancel called"));
+ iPhone->RemoveDelayedReq(aTsyReqHandle);
+ ReqCompleted(aTsyReqHandle,KErrCancel);
+ return KErrNone;
+ }
+
+TInt CUssdMessagingDMmTsy::SendRelease(const TTsyReqHandle aTsyReqHandle, TDes8* aReturnResult)
+ {
+ LOGTEXT(_L8("CUssdMessagingDMmTsy::SendRelease called"));
+ if (!iSendRelease++)
+ {
+ RMobilePhone::TMobilePhoneSendSSRequestV3Pckg* ssRequestPckg = REINTERPRET_CAST(RMobilePhone::TMobilePhoneSendSSRequestV3Pckg*,aReturnResult);
+ RMobilePhone::TMobilePhoneSendSSRequestV3& ssRequest = (*ssRequestPckg)();
+
+ if(ssRequest.ExtensionId()!=KETelExtMultimodeV3)
+ ReqCompleted(aTsyReqHandle,KErrCorrupt);
+ else
+ {
+ ssRequest.iOpCode = DMMTSY_PHONE_NOTIFY_OPCODE;
+ ssRequest.iAdditionalInfo = DMMTSY_PHONE_NOTIFY_ADDINFO;
+ ReqCompleted(aTsyReqHandle,KErrNone);
+ }
+ }
+ return KErrNone;
+ }
+
+TInt CUssdMessagingDMmTsy::SendReleaseCancel(const TTsyReqHandle aTsyReqHandle)
+ {
+ LOGTEXT(_L8("CUssdMessagingDMmTsy::SendReleaseCancel called"));
+ iPhone->RemoveDelayedReq(aTsyReqHandle);
+ ReqCompleted(aTsyReqHandle,KErrCancel);
+ return KErrNone;
+ }
+
+TInt CUssdMessagingDMmTsy::NotifyNetworkRelease(const TTsyReqHandle aTsyReqHandle, TDes8* aReturnResult)
+ {
+ LOGTEXT(_L8("CUssdMessagingDMmTsy::NotifyNetworkRelease (deprecated version) called"));
+ if (!iNetworkRelease++)
+ {
+ RMobilePhone::TMobilePhoneSendSSRequestV3Pckg* ssRequestPckg = REINTERPRET_CAST(RMobilePhone::TMobilePhoneSendSSRequestV3Pckg*,aReturnResult);
+ RMobilePhone::TMobilePhoneSendSSRequestV3& ssRequest = (*ssRequestPckg)();
+
+ if(ssRequest.ExtensionId()!=KETelExtMultimodeV3)
+ ReqCompleted(aTsyReqHandle,KErrCorrupt);
+ else
+ {
+ ssRequest.iOpCode = DMMTSY_PHONE_NOTIFY_OPCODE;
+ ssRequest.iAdditionalInfo = DMMTSY_PHONE_NOTIFY_ADDINFO;
+ ReqCompleted(aTsyReqHandle,KErrNone);
+ }
+ }
+ return KErrNone;
+ }
+
+TInt CUssdMessagingDMmTsy::NotifyNetworkReleaseCancel(const TTsyReqHandle aTsyReqHandle)
+ {
+ LOGTEXT(_L8("CUssdMessagingDMmTsy::NotifyNetworkReleaseCancel called"));
+ iPhone->RemoveDelayedReq(aTsyReqHandle);
+ ReqCompleted(aTsyReqHandle,KErrCancel);
+ return KErrNone;
+ }
+
+TInt CUssdMessagingDMmTsy::NotifyNetworkRelease(const TTsyReqHandle aTsyReqHandle, TDes8* aReturnResult, TDes8* aMsgAttributes)
+ {
+ LOGTEXT(_L8("CUssdMessagingDMmTsy::NotifyNetworkRelease called"));
+ if (iNetworkRelease >= 2)
+ {
+ iNetworkRelease = 0;
+ }
+
+ if (!iNetworkRelease++)
+ {
+ RMobilePhone::TMobilePhoneSendSSRequestV3Pckg* ssRequestPckg = REINTERPRET_CAST(RMobilePhone::TMobilePhoneSendSSRequestV3Pckg*,aReturnResult);
+ RMobilePhone::TMobilePhoneSendSSRequestV3& ssRequest = (*ssRequestPckg)();
+
+ RMobileUssdMessaging::TMobileUssdAttributesV1Pckg* ssMsgAttributesPckg = REINTERPRET_CAST(RMobileUssdMessaging::TMobileUssdAttributesV1Pckg*,aMsgAttributes);
+ RMobileUssdMessaging::TMobileUssdAttributesV1& ssMsgAttributesReq = (*ssMsgAttributesPckg)();
+
+ if ((ssRequest.ExtensionId()!=KETelExtMultimodeV3) || (ssMsgAttributesReq.ExtensionId()!=KETelExtMultimodeV1))
+ {
+ ReqCompleted(aTsyReqHandle,KErrCorrupt);
+ }
+ else
+ {
+ ssRequest.iOpCode = DMMTSY_PHONE_NOTIFY_OPCODE;
+ ssRequest.iAdditionalInfo = DMMTSY_PHONE_NOTIFY_ADDINFO;
+
+ ssMsgAttributesReq.iFlags = DMMTSY_USSD_ATTRIBUTE_FLAGS;
+ ssMsgAttributesReq.iFormat = DMMTSY_USSD_ATTRIBUTE_FORMAT;
+ ssMsgAttributesReq.iType = DMMTSY_USSD_ATTRIBUTE_TYPE;
+ ssMsgAttributesReq.iDcs = DMMTSY_USSD_ATTRIBUTE_DCS;
+
+ ReqCompleted(aTsyReqHandle,KErrNone);
+ }
+ }
+ return KErrNone;
+ }