diff -r 6b1d113cdff3 -r 6638e7f4bd8f telephonyserver/etelmultimode/CETEL/mm_messaging.cpp --- a/telephonyserver/etelmultimode/CETEL/mm_messaging.cpp Mon May 03 13:37:20 2010 +0300 +++ b/telephonyserver/etelmultimode/CETEL/mm_messaging.cpp Thu May 06 15:10:38 2010 +0100 @@ -1,1188 +1,1248 @@ -// Copyright (c) 2000-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: -// This file contains the method definitions for all EtelMM subsessions that -// provide messaging functionality. -// -// - -/** - @file -*/ - -// From core API -#include -#include - -// Multimode header files -#include -#include -#include - -#include "mm_hold.h" - - -/************************************************************************/ -// -// RMobileSmsMessaging -// -/************************************************************************/ - -EXPORT_C RMobileSmsMessaging::RMobileSmsMessaging() : - iSmsMessagingPtrHolder(NULL) -/** - Standard constructor. - This member is internal and not intended for public use. -*/ - { - } - -EXPORT_C TInt RMobileSmsMessaging::Open(RMobilePhone& aPhone) - -/** - This member function opens a SMS Messaging object. The name of the sub-session - opened in the TSY will equal the string defined by the KETelSmsMessaging LIT - definition. - - @param aPhone An existing RMobilePhone session. - @return KErrNone if successful. - -@capability None -*/ - { - RSessionBase* session=&aPhone.SessionHandle(); - __ASSERT_ALWAYS(session!=NULL,PanicClient(EEtelPanicNullHandle)); - TInt subSessionHandle=aPhone.SubSessionHandle(); - __ASSERT_ALWAYS(subSessionHandle!=NULL,PanicClient(EEtelPanicNullHandle)); - - TRAPD(ret,ConstructL()); - if (ret) - return ret; - TPtrC name(KETelSmsMessaging); - SetSessionHandle(*session); - TIpcArgs args(&name,TIpcArgs::ENothing,subSessionHandle); - ret = CreateSubSession(*session,EEtelOpenFromSubSession,args); - if (ret) - Destruct(); - return ret; - } - -EXPORT_C void RMobileSmsMessaging::Close() -/** - This method closes a RMobileSmsMessaging subsession - -@capability None -*/ - { - CloseSubSession(EEtelClose); - Destruct(); - } - -EXPORT_C void RMobileSmsMessaging::ConstructL() -/** Constructor. */ - { - __ASSERT_ALWAYS(iSmsMessagingPtrHolder==NULL,PanicClient(EEtelPanicHandleNotClosed)); - iSmsMessagingPtrHolder = CSmsMessagingPtrHolder::NewL(CSmsMessagingPtrHolder::EMaxNumberSmsPtrSlots,CSmsMessagingPtrHolder::EMaxNumberSmsPtrCSlots); - } - -EXPORT_C void RMobileSmsMessaging::Destruct() -/** Destructor. */ - { - delete iSmsMessagingPtrHolder; - iSmsMessagingPtrHolder = NULL; - ResetSessionHandle(); - } - -RMobileSmsMessaging::TMobileSmsAttributesV1::TMobileSmsAttributesV1() -: iFlags(0), - iDataFormat(EFormatUnspecified), - iCdmaTeleservice(0), - iCdmaServiceCategory(0) -/** Constructor. */ - { - } - -EXPORT_C RMobileSmsMessaging::TMobileSmsReceiveAttributesV1::TMobileSmsReceiveAttributesV1() -: iStatus(EMtMessageUnknownStatus), - iStoreIndex(0) -/** Constructor. */ - { - iExtensionId=KETelMobileSmsReceiveAttributesV1; - } - -EXPORT_C RMobileSmsMessaging::TMobileSmsSendAttributesV1::TMobileSmsSendAttributesV1() -: iMsgRef(0), - iMore(EFalse) -/** Constructor. */ - { - iExtensionId=KETelMobileSmsSendAttributesV1; - } - -EXPORT_C RMobileSmsMessaging::TMobileSmsCdmaSendAttributesV4::TMobileSmsCdmaSendAttributesV4() -: iMsgRef(0), - iMore(EFalse), - iAddressAuthentication(0) -/** Constructor. */ - { - iExtensionId=KETelMobileSmsCdmaSendAttributesV4; - } - -EXPORT_C RMobileSmsMessaging::TMobileSmsCapsV1::TMobileSmsCapsV1() -: iSmsMode(0), - iSmsControl(0) -/** Constructor. */ - { - iExtensionId=KETelExtMultimodeV1; - } - -EXPORT_C TInt RMobileSmsMessaging::GetCaps(TDes8& aCaps) const -/** - This member function gets a class that reflects the SMS messaging capabilities - of the phone. - - @param aCaps On return, a TMobileSmsCapsV1Pckg with the SMS messaging capabilities - of the phone. - @return KErrNone if successful. - @see TMobileSmsCapsV1 - -@capability None -*/ - { - return Get(EMobileSmsMessagingGetCaps, aCaps); - } - -EXPORT_C TInt RMobileSmsMessaging::GetReceiveMode(TMobileSmsReceiveMode& aReceiveMode) const -/** - This member function retrieves the current setting of the TSY-phone incoming - SMS receive mode. This setting dictates how the phone will handle incoming - SMS messages before passing them on to TSY. - - @param aReceiveMode On return, the current receive mode. - @return KErrNone if successful. - -@capability None -*/ - { - TPckg ptr1(aReceiveMode); - return Get(EMobileSmsMessagingGetReceiveMode, ptr1); - } - -EXPORT_C void RMobileSmsMessaging::SetReceiveMode(TRequestStatus& aReqStatus, TMobileSmsReceiveMode aReceiveMode) const - -/** - This member function sets the setting of the TSY-phone incoming SMS receive - mode. This setting dictates how the phone will handle incoming SMS messages - before passing them on to TSY. - - Use RTelSubSessionBase::CancelAsyncRequest(EMobileSmsMessagingSetReceiveMode) - to cancel a previously placed asynchronous SetReceiveMode() request. - - @param aReqStatus On return, KErrNone if successful. - @param aReceiveMode The receive mode to set. - -@capability WriteDeviceData -*/ - { - __ASSERT_ALWAYS(iSmsMessagingPtrHolder!=NULL,PanicClient(EEtelPanicNullHandle)); - iSmsMessagingPtrHolder->iReceiveMode = aReceiveMode; - TPtrC8& ptr1=iSmsMessagingPtrHolder->SetC(CSmsMessagingPtrHolder::ESlot1SetReceiveMode,iSmsMessagingPtrHolder->iReceiveMode); - - Set(EMobileSmsMessagingSetReceiveMode, aReqStatus, ptr1); - } - -EXPORT_C void RMobileSmsMessaging::NotifyReceiveModeChange(TRequestStatus& aReqStatus, TMobileSmsReceiveMode& aReceiveMode) -/** - This member function is used to notify the client if there is a change to the - setting of the TSY-Phone receive mode. - - Use RTelSubSessionBase::CancelAsyncRequest(EMobileSmsMessagingNotifyReceiveModeChange) - to cancel a previously placed asynchronous NotifyReceiveModeChange() request. - - @param aReqStatus On return, KErrNone if successful - @param aReceiveMode On return, the new SMS receive mode. - -@capability None -*/ - { - __ASSERT_ALWAYS(iSmsMessagingPtrHolder!=NULL,PanicClient(EEtelPanicNullHandle)); - - TPtr8& ptr1=iSmsMessagingPtrHolder->Set(CSmsMessagingPtrHolder::ESlot1NotifyReceiveModeChange,aReceiveMode); - - Get(EMobileSmsMessagingNotifyReceiveModeChange, aReqStatus, ptr1); - } - -EXPORT_C void RMobileSmsMessaging::ReceiveMessage(TRequestStatus& aReqStatus, TDes8& aMsgData, TDes8& aMsgAttributes) const -/** - This member function will be used to wait for the next incoming SMS message. - Once this member function completes, the client should immediately repost - it if they want to receive the next incoming SMS message. - - Use RTelSubSessionBase::CancelAsyncRequest(EMobileSmsMessagingReceiveMessage) - to cancel a previously placed asynchronous ReceiveMessage() request. - - @param aReqStatus On return, KErrNone if successful. - @param aMsgData On completion, the message data. - @param aMsgAttributes On completion, a TMobileSmsReceiveAttributesV1Pckg containing - the message attributes. - @see TMobileSmsReceiveAttributesV1 - -@capability NetworkServices -@capability ReadUserData -*/ - { - Get(EMobileSmsMessagingReceiveMessage, aReqStatus, aMsgData, aMsgAttributes); - } - -EXPORT_C void RMobileSmsMessaging::AckSmsStored(TRequestStatus& aReqStatus, const TDesC8& aMsgData, TBool aFull) const -/** - When the client receives an unstored SMS, it will use this member function - to return a positive acknowledgment if it manages to successfully decode and - store that SMS. If the client wishes to send a SMS-DELIVER-REPORT in response - to the received SMS-DELIVER , than the aMsgData parameter will be used to - hold the TPDU defined for a SMS-DELIVER-REPORT (for RP-ACK) in GSM 03.40. - - Use RTelSubSessionBase::CancelAsyncRequest(EMobileSmsMessagingAckSmsStored) - to cancel a previously placed asynchronous AckSmsStored() request. - - @param aReqStatus On return, KErrNone if successful. - @param aMsgData Holds the TPDU defined for a SMS-DELIVER-REPORT (for RP-ACK) - in GSM 03.40. - @param aFull Indicates whether, after storing the acknowledged message, the - client-side message store is now full or not. If client sets it to ETrue then - it is informing the TSY that the store is full (or almost full) and that it - does not want to receive any more messages until it calls ResumeSmsReception(). - -@capability NetworkServices -@capability NetworkControl -*/ - { - __ASSERT_ALWAYS(iSmsMessagingPtrHolder!=NULL,PanicClient(EEtelPanicNullHandle)); - - iSmsMessagingPtrHolder->iAckSmsStoredFull = aFull; - TPtrC8& ptr1=iSmsMessagingPtrHolder->SetC(CSmsMessagingPtrHolder::ESlot1AckSmsStored,iSmsMessagingPtrHolder->iAckSmsStoredFull); - - Set(EMobileSmsMessagingAckSmsStored, aReqStatus, aMsgData ,ptr1); - } - -EXPORT_C void RMobileSmsMessaging::NackSmsStored(TRequestStatus& aReqStatus, const TDesC8& aMsg, TInt aRpCause) const -/** When the client receives an unstored SMS, it will use this member function - to return a negative acknowledgment if it fails to decode and/or store that - SMS. - - This TPDU will contain the TP error cause that prevents the client from acknowledging - the SMS. The client should also provide the RP error cause by placing it in - the aRpCause parameter. - - In GSM mode, once a client has rejected a received SMS due to storage full, - the network will keep this message for later and suspend the forwarding of - any further received SMS to this MS. - - In CDMA mode, the network will save the message but it will repeat sending - of the message to the MS until either the MS eventually accepts it or the - retry limit is reached. - - If retry limit is reached the network will tell the originator of the message - that the transmission failed. In either case, when client-side memory is freed-up, - the client must call ResumeSmsReception() in order to tell the phone and possibly - the network that SMS can be received again. - - Use RTelSubSessionBase::CancelAsyncRequest(EMobileSmsMessagingNackSmsStored) - to cancel a previously placed asynchronous NackSmsStored() request. - - @param aReqStatus On return, KErrNone if successful. - @param aMsg Holds the TPDU defined for a SMS-DELIVER-REPORT (for RP-ERROR) - in GSM 03.40. - @param aRpCause Contain one of the MS related extended error codes. - -@capability NetworkServices -@capability NetworkControl -*/ - { - __ASSERT_ALWAYS(iSmsMessagingPtrHolder!=NULL,PanicClient(EEtelPanicNullHandle)); - iSmsMessagingPtrHolder->iNackSmsStoredCause = aRpCause; - TPtrC8& ptr1=iSmsMessagingPtrHolder->SetC(CSmsMessagingPtrHolder::ESlot1NackSmsStored,iSmsMessagingPtrHolder->iNackSmsStoredCause); - - Set(EMobileSmsMessagingNackSmsStored, aReqStatus, aMsg, ptr1); - } - -EXPORT_C void RMobileSmsMessaging::ResumeSmsReception(TRequestStatus& aReqStatus) const -/** - This member functions resumes the reception of SMS messages. - - SMS reception can become suspended because SMS storage is full. Therefore - if client-side storage is full, the client must stop receiving unstored messages. - However, if the user deletes some client-side stored SMS messages, the client - must use this member function to tell the TSY to inform a GSM network that - messages can be received again or the phone that CDMA messages can be accepted - again. - - Use RTelSubSessionBase::CancelAsyncRequest(EMobileSmsMessagingResumeSmsReception) - to cancel a previously placed asynchronous ResumeSmsReception() request. - - @param aReqStatus On return, KErrNone if successful. - -@capability NetworkServices -@capability NetworkControl -*/ - { - Blank(EMobileSmsMessagingResumeSmsReception, aReqStatus); - } - -EXPORT_C void RMobileSmsMessaging::SendMessage(TRequestStatus& aReqStatus, const TDesC8& aMsgData, TDes8& aMsgAttributes) const -/** - This member function sends an SMS message to the network. - - Use RTelSubSessionBase::CancelAsyncRequest(EMobileSmsMessagingSendMessage) - to cancel a previously placed asynchronous SendMessage() request. - - @param aReqStatus On return, KErrNone if successful, KErrNotSupported if the - phone does not support outgoing SMS, KErrMMEtelFormatNotSupported if the phone - does not support the client's chosen message data format, any of the KErrGsmSms… - extended errors if the phone is in GSM mode and this is the error returned - by the GSM network/service centre, Any of the KErrCdmaSms… extended errors - if the phone is in CDMA mode and this is the error returned by the CDMA network/service - centre. Please note that the last three examples are "extended" errors and - will only be returned to those clients that request them. Clients that only - understand core Symbian OS and ETel errors will receive KErrGeneral for any - error cases that the TSY can not interpret. - @param aMsgData The message data - @param aMsgAttributes A TMobileSmsSendAttributesV1Pckg with the message attributes. - The fields required will probably be message data format, destination and - possibly a new service centre address. On return, for either successful or - failed transmission, the message reference number assigned to this sent message - will be placed by the TSY in the iMsgRef field. Also, if the SMS was sent - during GSM or WCDMA mode, then the SMS-SUBMIT-REPORT will be placed by the - TSY in the iSubmitReport field. - @see TMobileSmsSendAttributesV1 - -@capability NetworkServices -@capability WriteUserData -*/ - { - SetAndGet(EMobileSmsMessagingSendMessage, aReqStatus,aMsgData,aMsgAttributes); - } - -EXPORT_C void RMobileSmsMessaging::SendMessageNoFdnCheck(TRequestStatus& aReqStatus, const TDesC8& aMsgData, TDes8& aMsgAttributes) const -/** - 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 - -@capability NetworkServices -@capability NetworkControl -*/ - { - SetAndGet(EMobileSmsMessagingSendMessageNoFdnCheck, aReqStatus,aMsgData,aMsgAttributes); - } - -EXPORT_C void RMobileSmsMessaging::SetMoSmsBearer(TRequestStatus& aReqStatus, TMobileSmsBearer aBearer) const -/** - This member function sets the bearer type (GSM or GPRS) for sending SMS messages. - - Use RTelSubSessionBase::CancelAsyncRequest(EMobileSmsMessagingSetMoSmsBearer) - to cancel a previously placed asynchronous SetMoSmsBearer() request. - - @param aReqStatus On return, KErrNone if successful. - @param aBearer The bearer type to set. - -@capability WriteDeviceData -*/ - { - __ASSERT_ALWAYS(iSmsMessagingPtrHolder!=NULL,PanicClient(EEtelPanicNullHandle)); - iSmsMessagingPtrHolder->iSmsBearer = aBearer; - TPtrC8& ptr1=iSmsMessagingPtrHolder->SetC(CSmsMessagingPtrHolder::ESlot1SetMoSmsBearer,iSmsMessagingPtrHolder->iSmsBearer); - - Set(EMobileSmsMessagingSetMoSmsBearer, aReqStatus, ptr1); - } - -EXPORT_C TInt RMobileSmsMessaging::GetMoSmsBearer(TMobileSmsBearer& aBearer) const -/** - This member function is used to retrieve the current setting for the bearer - type (GSM or GPRS) used for sending SMS messages. - - @param aBearer On return, the current bearer type. - @return KErrNone if successful. - -@capability None -*/ - { - TPckg ptr1(aBearer); - return Get(EMobileSmsMessagingGetMoSmsBearer, ptr1); - } - -EXPORT_C void RMobileSmsMessaging::NotifyMoSmsBearerChange(TRequestStatus& aReqStatus, TMobileSmsBearer& aBearer) -/** - This member function is used t notify the client if there is a change to the - setting for the bearer type used for sending SMS messages. - - Use RTelSubSessionBase::CancelAsyncRequest(EMobileSmsMessagingNotifyMoSmsBearerChange) - to cancel a previously placed asynchronous NotifyMoSmsBearerChange() request. - - @param aReqStatus On return, KErrNone if successful. - @param aBearer On completion, the new bearer. - -@capability None -*/ - { - __ASSERT_ALWAYS(iSmsMessagingPtrHolder!=NULL,PanicClient(EEtelPanicNullHandle)); - - TPtr8& ptr1=iSmsMessagingPtrHolder->Set(CSmsMessagingPtrHolder::ESlot1NotifyMoSmsBearerChange,aBearer); - - Get(EMobileSmsMessagingNotifyMoSmsBearerChange, aReqStatus, ptr1); - } - -// -// SMS related storage -// - -EXPORT_C TInt RMobileSmsMessaging::EnumerateMessageStores(TInt& aCount) const - -/** - This request gets the number of phone-side SMS message stores supported by - the phone in the aCount parameter. - - @param aCount On return, the number of phone-side SMS message stores. - @return KErrNone if successful. - -@capability None -*/ - { - TPckg ptr1(aCount); - return Get(EMobileSmsMessagingEnumerateMessageStores, ptr1); - } - -EXPORT_C void RMobileSmsMessaging::GetMessageStoreInfo(TRequestStatus& aReqStatus, TInt aIndex, TDes8& aInfo) const -/** - This request gets information about the SMS message store. - - Use RTelSubSessionBase::CancelAsyncRequest(EMobileSmsMessagingGetMessageStoreInfo) - to cancel a previously placed asynchronous GetMessageStoreInfo() request. - - @param aReqStatus On return, KErrNone if successful - @param aIndex The index of the store, valid values are between 0 and (n-1), - where n is given by the EnumerateMessageStores() request. - @param aInfo On comletion, a RMobilePhoneStore::TMobilePhoneStoreInfoV1Pckg - holding the SMS message store info. - @see RMobilePhoneStore::TMobilePhoneStoreInfoV1 - -@capability None -*/ - { - __ASSERT_ALWAYS(iSmsMessagingPtrHolder!=NULL,PanicClient(EEtelPanicNullHandle)); - - iSmsMessagingPtrHolder->iGetMessageStoreInfoIndex = aIndex; - TPtrC8& ptr1=iSmsMessagingPtrHolder->SetC(CSmsMessagingPtrHolder::ESlot1GetMessageStoreInfo,iSmsMessagingPtrHolder->iGetMessageStoreInfoIndex); - - SetAndGet(EMobileSmsMessagingGetMessageStoreInfo, aReqStatus, ptr1, aInfo); - } - -// -// SMS Parameter Storage -// - -EXPORT_C RMobileSmsMessaging::TMobileSmspEntryV1::TMobileSmspEntryV1() -: iValidParams(0), - iProtocolId(0), - iDcs(0), - iValidityPeriod(0), - iReservedFiller(0) - { - iExtensionId=KETelExtMultimodeV1; - } - -void RMobileSmsMessaging::TMobileSmspEntryV1::InternalizeL(RReadStream& aStream) -/** - This method internalizes the SMS parameter entry from a stream - - @param aStream The read stream containing the SMS parameter entry - */ - { - TMultimodeType::InternalizeL(aStream); - iIndex = aStream.ReadInt32L(); - aStream >> iText; - iValidParams = aStream.ReadUint32L(); - aStream >> iDestination; - aStream >> iServiceCentre; - iProtocolId = aStream.ReadUint8L(); - iDcs = aStream.ReadUint8L(); - iValidityPeriod = aStream.ReadUint8L(); - } - -void RMobileSmsMessaging::TMobileSmspEntryV1::ExternalizeL(RWriteStream& aStream) const -/** - This method externalizes the SMS parameter entry into a stream - @param aStream The write stream that will contain the SMS parameter entry - */ - { - TMultimodeType::ExternalizeL(aStream); - aStream.WriteInt32L(iIndex); - aStream << iText; - aStream.WriteUint32L(iValidParams); - aStream << iDestination; - aStream << iServiceCentre; - aStream.WriteUint8L(iProtocolId); - aStream.WriteUint8L(iDcs); - aStream.WriteUint8L(iValidityPeriod); - } - - -EXPORT_C void RMobileSmsMessaging::StoreSmspListL(TRequestStatus& aReqStatus, CMobilePhoneSmspList* aSmspList) const -/** - This member function may be used to store a new version of the entire list - of SMSP entries. It will overwrite the current contents of the storage and - may cause other clients to be notified of the change in SMSP list. - - Use RTelSubSessionBase::CancelAsyncRequest(EMobileSmsMessagingStoreSmspList) - to cancel a previously placed asynchronous StoreSmspListL() request. - - @leave k Will leave if the CBufFlat to hold the streamed contents can not be allocated - @param aReqStatus On return, KErrNone if successful. - @param aSmspList The list of SMSP entries to store, should not contain more - entries than can be stored phone-side. - -@capability WriteDeviceData -*/ - { - __ASSERT_ALWAYS(aSmspList!=NULL,PanicClient(EEtelPanicNullHandle)); - __ASSERT_ALWAYS(iSmsMessagingPtrHolder!=NULL,PanicClient(EEtelPanicNullHandle)); - - delete iSmsMessagingPtrHolder->iSmspBuf; - iSmsMessagingPtrHolder->iSmspBuf = NULL; - - iSmsMessagingPtrHolder->iSmspBuf=aSmspList->StoreLC(); - CleanupStack::Pop(); - - (iSmsMessagingPtrHolder->iSmspPtr).Set((iSmsMessagingPtrHolder->iSmspBuf)->Ptr(0)); - - Set(EMobileSmsMessagingStoreSmspList,aReqStatus,iSmsMessagingPtrHolder->iSmspPtr); - - } - -EXPORT_C void RMobileSmsMessaging::NotifySmspListChange(TRequestStatus& aReqStatus) const -/** - This member function allows a client to be notified that changes have been - made to the SMSP list. When it completes, it does not return the new version - of the list so the client will have to retrieve the list again if it is interested - in the new list. - - Use RTelSubSessionBase::CancelAsyncRequest(EMobileSmsMessagingNotifySmspListChange) - to cancel a previously placed asynchronous NotifySmspListChange() request. - - @param aReqStatus On return, KErrNone if successful. - -@capability None -*/ - { - Blank(EMobileSmsMessagingNotifySmspListChange,aReqStatus); - } - - -/************************************************************************/ -// -// RMobileBroadcastMessaging -// -/************************************************************************/ - -EXPORT_C RMobileBroadcastMessaging::RMobileBroadcastMessaging() : - iCbsMessagingPtrHolder(NULL) -/** Standard constructor. */ - { - } - -EXPORT_C TInt RMobileBroadcastMessaging::Open(RMobilePhone& aPhone) -/** - This function member opens a Broadcast Messaging object. The name of the sub-session - opened in the TSY will equal the string defined by the KETelBroadcastMessaging - LIT definition. - - @param aPhone The existing RMobilePhone session. - @return KErrNone if successful, a system wide error code if not. - -@capability None -*/ - { - RSessionBase* session=&aPhone.SessionHandle(); - __ASSERT_ALWAYS(session!=NULL,PanicClient(EEtelPanicNullHandle)); - TInt subSessionHandle=aPhone.SubSessionHandle(); - __ASSERT_ALWAYS(subSessionHandle!=NULL,PanicClient(EEtelPanicNullHandle)); - - TRAPD(ret,ConstructL()); - if (ret) - return ret; - TPtrC name(KETelBroadcastMessaging); - SetSessionHandle(*session); - TIpcArgs args(&name,TIpcArgs::ENothing,subSessionHandle); - ret = CreateSubSession(*session,EEtelOpenFromSubSession,args); - if (ret) - Destruct(); - return ret; - } - -EXPORT_C void RMobileBroadcastMessaging::Close() -/** This function member closes a RMobileBroadcastMessaging object. -@capability None -*/ - { - CloseSubSession(EEtelClose); - Destruct(); - } - -EXPORT_C void RMobileBroadcastMessaging::ConstructL() - { - __ASSERT_ALWAYS(iCbsMessagingPtrHolder==NULL,PanicClient(EEtelPanicHandleNotClosed)); - iCbsMessagingPtrHolder = CCbsMessagingPtrHolder::NewL(CCbsMessagingPtrHolder::EMaxNumberBroadcastPtrSlots,CCbsMessagingPtrHolder::EMaxNumberBroadcastPtrCSlots); - } - -EXPORT_C void RMobileBroadcastMessaging::Destruct() -/** Destructor. Deletes any dynamically allocated memory. */ - { - delete iCbsMessagingPtrHolder; - iCbsMessagingPtrHolder = NULL; - ResetSessionHandle(); - } - -EXPORT_C RMobileBroadcastMessaging::TMobileBroadcastCapsV1::TMobileBroadcastCapsV1() : - iModeCaps(0), - iFilterCaps(0) - { - iExtensionId=KETelExtMultimodeV1; - } - -EXPORT_C TInt RMobileBroadcastMessaging::GetCaps(TDes8& aCaps) const -/** - This function member gets a class that reflects the broadcast messaging capabilities - of the phone. - - @param aCaps On completion, a TMobileBroadcastCapsV1Pckg with the broadcast - messaging capabilities. - @return KErrNone if successful, a system wide error code if not. - @see TMobileBroadcastCapsV1 - -@capability None -*/ - { - return Get(EMobileBroadcastMessagingGetCaps, aCaps); - } - -EXPORT_C RMobileBroadcastMessaging::TMobileBroadcastAttributesV1::TMobileBroadcastAttributesV1() : - iFlags(0), - iFormat(EFormatUnspecified), - iServiceCategory(0) - { - iExtensionId=KETelExtMultimodeV1; - } - -/** - This is the initialization of the TMobileBroadcastAttributesV2 structured type - -*/ -EXPORT_C RMobileBroadcastMessaging::TMobileBroadcastAttributesV2::TMobileBroadcastAttributesV2() : - TMobileBroadcastAttributesV1(), - iNumberOfPages(0), - iMessageType(0), - iMessageId(0), - iSerialNum(0), - iDCS(0) - /** Default constructor. All internal data is set to 0 and the extension ID to - KETelExtMultimodeV2. */ - { - iExtensionId=KETelExtMultimodeV2; - } - - -/** - This function member enables the client to receive the next - incoming broadcast message from the network. - - The request will be completed when a new message arrives. The - client will pass a descriptor of size KBroadcastPageSize bytes, - provided by the typedef TBroadcastPageData, to hold the returned - broadcast message data into the aMsgData parameter. - - This buffer size should be used for all types of messages: - GSM, CDMA and WCDMA. - - The function explicity checks that the aMsgData parameter is of - size KBroadcastPageSize. If the buffer size does not equal - KBroadcastPageSize, the client request will be completed with - KErrArgument. - - A TSY should handle ReceiveMessage() requests by making them repost - immediately (to ensure none are missed) and possibly multiple - completion enabled. When a new message arrives the TSY will copy the - broadcast message contents into its stored pointer to the broadcast - message data, fill in the broadcast message attributes and then - complete the request. - - @param aReqStatus On return, KErrNone if successful, KErrArgument if the aMsgData buffer size does not equal KBroadcastPageSize, otherwise a system wide error code. - @param aMsgData On completion, the message data. - @param aMsgAttributes On completion, the broadcast message attributes, in an instance of the TMobileBroadcastAttributesV1Pckg class. - @see TMobileBroadcastAttributesV1 - -@capability None -*/ -EXPORT_C void RMobileBroadcastMessaging::ReceiveMessage(TRequestStatus& aReqStatus, TDes8& aMsgData, TDes8& aMsgAttributes) const - { - if (aMsgData.MaxLength() != KBroadcastPageSize) - { - TRequestStatus* status=&aReqStatus; - User::RequestComplete(status,KErrArgument); - return; - } - Get(EMobileBroadcastMessagingReceiveMessage, aReqStatus, aMsgData, aMsgAttributes); - } - -EXPORT_C TInt RMobileBroadcastMessaging::GetFilterSetting(TMobilePhoneBroadcastFilter& aSetting) const -/** - This function member gets the current setting for the receipt of broadcast - messages. - - This setting will indicate whether all or no messages are being accepted or - whether only those messages specified by the filters are going to be accepted - or rejected. - - If the returned setting, aSetting, equals EBroadcastAcceptFilter then the - phone will accept messages whose identifier is included within the identifier - list AND whose language is included within the language filter. If the returned - setting, aSetting, equals EBroadcastRejectFilter then the phone will reject - messages whose identifier is included within the identifier list OR whose - language is included within the language filter. - - N.B. If the phone supports both GSM/WCDMA and CDMA mode then it will probably - need two identifier lists - one to contain a list of CBMI (for GSM/WCDMA mode) - and the other to contain a list of Service Categories (for CDMA mode) This - function member is synchronous because it is expected that this will be a - TSY specific setting whose current value the TSY has previously determined. - - @param aSetting On completion, the current filter settings. - @return KErrNone if successful, or KErrNotSupported if the phone does not support - a filter setting. - -@capability ReadUserData -*/ - { - TPckg ptr1(aSetting); - return Get(EMobileBroadcastMessagingGetFilterSetting, ptr1); - } - -EXPORT_C void RMobileBroadcastMessaging::SetFilterSetting(TRequestStatus& aReqStatus, TMobilePhoneBroadcastFilter aSetting) const -/** - This function member sets a new setting for the receipt of broadcast messages. - - This setting will specify whether all or no messages are being accepted or - whether only those messages specified by the filters are going to be accepted - or rejected. - - Use RTelSubSessionBase::CancelAsyncRequest(EMobileBroadcastMessagingSetFilterSetting) - to cancel a previously placed asynchronous SetFilterSetting() request. - - @param aReqStatus On return, the KErrNone if successful, KErrNotSupported - if the phone does not support a filter setting. - @param aSetting On completion, the new filter setting of the phone. - -@capability WriteUserData -*/ - { - __ASSERT_ALWAYS(iCbsMessagingPtrHolder!=NULL,PanicClient(EEtelPanicNullHandle)); - - iCbsMessagingPtrHolder->iSetFilterSetting=aSetting; - - TPtrC8& ptr1=iCbsMessagingPtrHolder->SetC(CCbsMessagingPtrHolder::ESlot1SetFilterSetting, iCbsMessagingPtrHolder->iSetFilterSetting); - - Set(EMobileBroadcastMessagingSetFilterSetting, aReqStatus, ptr1); - } - -EXPORT_C void RMobileBroadcastMessaging::NotifyFilterSettingChange(TRequestStatus& aReqStatus, TMobilePhoneBroadcastFilter& aSetting) const -/** - This function member allows a client to be notified if there is a change in - the setting for the receipt of broadcast messages. - - Use RTelSubSessionBase::CancelAsyncRequest(EMobileBroadcastMessagingNotifyFilterSettingChange) - to cancel a previously placed asynchronous NotifyFilterSetting() request. - - @param aReqStatus On return, KErrNone if successful, KErrNotSupported if the - phone does not support a filter setting. - @param aSetting On completion, the changed filter setting. - -@capability ReadUserData -*/ - { - __ASSERT_ALWAYS(iCbsMessagingPtrHolder!=NULL,PanicClient(EEtelPanicNullHandle)); - - TPtr8& ptr1=iCbsMessagingPtrHolder->Set(CCbsMessagingPtrHolder::ESlot1NotifyFilterSettingChange,aSetting); - - Get(EMobileBroadcastMessagingNotifyFilterSettingChange, aReqStatus, ptr1); - } - -EXPORT_C void RMobileBroadcastMessaging::GetLanguageFilter(TRequestStatus& aReqStatus, TDes16& aLangFilter) const -/** - This function member allows a client to retrieve the current contents of the - broadcast message language filter. - - Use RTelSubSessionBase::CancelAsyncRequest(EMobileBroadcastMessagingGetLanguageFilter) - to cancel a previously placed asynchronous GetLanguageFilter() request. - - @param aReqStatus On return KErrNone if successful, KErrNotFound if there - is no language filter in place, and KErrNotSupported if the phone does not - support a language filter. - @param aLangFilter On completion, contain as many languages (each coded on - 16-bits) as can fit in the descriptor supplied by the client. This filter - defines which are the desired (or undesired) language(s) of incoming broadcast - messages. A language is defined either within one byte by its Cell Broadcast - Data Coding Scheme (as defined in GSM 03.38) or within two bytes by its ISO - 639 alphanumeric pair. Even if a language is represented by an 8-bit value - it will be returned as a 16-bit value with the language in the least significant - 8-bits. - -@capability ReadUserData -*/ - { - Get(EMobileBroadcastMessagingGetLanguageFilter,aReqStatus,aLangFilter); - } - -EXPORT_C void RMobileBroadcastMessaging::SetLanguageFilter(TRequestStatus& aReqStatus, const TDesC16& aLangFilter) const -/** - This function member allows a client to store new contents for the broadcast - message language filter. - - Use RTelSubSessionBase::CancelAsyncRequest(EMobileBroadcastMessagingSetLanguageFilter) - to cancel a previously placed asynchronous SetLanguageFilter() request. - - @param aReqStatus On return, KErrNone, if successful, KErrNotSupported if - the phone does not support a language filter. - @param aLangFilter Each element in this descriptor will define a language. - This filter will define which are the desired (or undesired) language(s) of - incoming broadcast messages. - -@capability WriteUserData -*/ - { - Set(EMobileBroadcastMessagingSetLanguageFilter,aReqStatus,aLangFilter); - } - -EXPORT_C void RMobileBroadcastMessaging::NotifyLanguageFilterChange(TRequestStatus& aReqStatus, TDes16& aLangFilter) const -/** - This function member allows a client to be notified if there is a change in - the contents of the language filter. - - Use RTelSubSessionBase::CancelAsyncRequest(EMobileBroadcastMessagingNotifyLanguageFilterChange) - to cancel a previously placed asynchronous NotifyLanguageFilterChange() request. - - @param aReqStatus On return, KErrNone, if successful, KErrNotSupported if - the phone does not support a language filter. - @param aLangFilter On completion, the new language filter. - -@capability ReadUserData -*/ - { - Get(EMobileBroadcastMessagingNotifyLanguageFilterChange,aReqStatus,aLangFilter); - } - -EXPORT_C RMobileBroadcastMessaging::TMobileBroadcastIdEntryV1::TMobileBroadcastIdEntryV1() : - iId(0) - { - iExtensionId=KETelExtMultimodeV1; - } - -void RMobileBroadcastMessaging::TMobileBroadcastIdEntryV1::InternalizeL(RReadStream& aStream) -/** Internalizes the CBMI entry from a stream. - - @param aStream The read stream containing the CBMI entry. - */ - { - TMultimodeType::InternalizeL(aStream); - iId = aStream.ReadUint16L(); - } - -void RMobileBroadcastMessaging::TMobileBroadcastIdEntryV1::ExternalizeL(RWriteStream& aStream) const -/** Externalizes the CBMI entry into a stream. - - @param aStream The write stream that will contain the CBMI entry. - */ - { - TMultimodeType::ExternalizeL(aStream); - aStream.WriteInt16L(iId); - } - -EXPORT_C void RMobileBroadcastMessaging::StoreBroadcastIdListL(TRequestStatus& aReqStatus, CMobilePhoneBroadcastIdList* aBroadcastIdList, TMobileBroadcastIdType aIdType) -/** - This function member may be used to store a new version of the entire BroadcastId list - of identifier entries. - - The list, should not contain more entries than can be stored phone-side. This - function member will store all the identifier list entries into the phone-side - storage. It will overwrite the current contents of the storage and may cause - other clients to be notified of the change in identifier list. - - Due to the probable time taken to store a list, there is only an asynchronous - version of this function member. This function member will leave if an out - of memory error occurs during allocation of a client-side buffer in which - to store the streamed list contents. - - Use RTelSubSessionBase::CancelAsyncRequest(EMobileBroadcastMessagingStoreIdList) - to cancel a previously placed asynchronous StoreBroadcastIdListL() request. - Will leave if the CBufFlat to hold the streamed contents can not be allocated - - @param aReqStatus On return, KErrNone if successful, a system wide error code - if not. - @param aBroadcastIdList The list of BroadcastId identifier entries to be stored. - @param aIdType Specifies whether the list is to be stored as a GSM/WCDMA list - of CBMI entries or a CDMA list of Service Category entries. - -@capability WriteUserData -*/ - { - __ASSERT_ALWAYS(aBroadcastIdList!=NULL,PanicClient(EEtelPanicNullHandle)); - __ASSERT_ALWAYS(iCbsMessagingPtrHolder!=NULL,PanicClient(EEtelPanicNullHandle)); - - delete iCbsMessagingPtrHolder->iBroadcastIdBuf; - iCbsMessagingPtrHolder->iBroadcastIdBuf = NULL; - - iCbsMessagingPtrHolder->iBroadcastIdBuf=aBroadcastIdList->StoreLC(); - CleanupStack::Pop(); - - (iCbsMessagingPtrHolder->iBroadcastIdPtr).Set((iCbsMessagingPtrHolder->iBroadcastIdBuf)->Ptr(0)); - - iCbsMessagingPtrHolder->iIdType = aIdType; - TPtrC8& ptr2=iCbsMessagingPtrHolder->SetC(CCbsMessagingPtrHolder::ESlot1StoreBroadcastIdListL,iCbsMessagingPtrHolder); - - Set(EMobileBroadcastMessagingStoreIdList,aReqStatus,iCbsMessagingPtrHolder->iBroadcastIdPtr, ptr2); - } - -EXPORT_C void RMobileBroadcastMessaging::NotifyBroadcastIdListChange(TRequestStatus& aReqStatus) const -/** - This function member allows a client to be notified that changes have been - made to the BroadcastId filter identifier list. - - When it completes, it does not return the new version of the list so the client - will have to retrieve the list using CRetrieveMobilePhoneBroadcastIdL again if it is interested in the new list. - - Use RTelSubSessionBase::CancelAsyncRequest(EMobileBroadcastMessagingNotifyIdListChange) - to cancel a previously placed asynchronous NotifyBroadcastIdListChange() request. - - @param aReqStatus On return, KErrNone if successful, a system wide error code - if not. - -@capability None -*/ - { - Blank(EMobileBroadcastMessagingNotifyIdListChange,aReqStatus); - } - -/************************************************************************/ -// -// RMobileUssdMessaging -// -/************************************************************************/ - -EXPORT_C RMobileUssdMessaging::RMobileUssdMessaging() -: iUssdMessagingPtrHolder(NULL) -/** Constructor. */ - { - } - -EXPORT_C TInt RMobileUssdMessaging::Open(RMobilePhone& aPhone) -/** - This member function opens a USSD messaging sub-session. The name of the sub-session - opened in the TSY will equal the string defined by the KETelUssdMessaging - LIT definition. - - @param aPhone An existing RMobilePhone session. - @return KErrNone if successful. - -@capability None -*/ - { - RSessionBase* session=&aPhone.SessionHandle(); - __ASSERT_ALWAYS(session!=NULL,PanicClient(EEtelPanicNullHandle)); - TInt subSessionHandle=aPhone.SubSessionHandle(); - __ASSERT_ALWAYS(subSessionHandle!=NULL,PanicClient(EEtelPanicNullHandle)); - - TRAPD(ret,ConstructL()); - if (ret) - return ret; - TPtrC name(KETelUssdMessaging); - SetSessionHandle(*session); - TIpcArgs args(&name,TIpcArgs::ENothing,subSessionHandle); - ret = CreateSubSession(*session,EEtelOpenFromSubSession,args); - if (ret) - Destruct(); - return ret; - } - -EXPORT_C void RMobileUssdMessaging::Close() -/** This member function closes a USSD Messaging object. -@capability None -*/ - { - CloseSubSession(EEtelClose); - Destruct(); - } - -EXPORT_C void RMobileUssdMessaging::ConstructL() - { - } - -EXPORT_C void RMobileUssdMessaging::Destruct() -/** Destructor. */ - { - } - -EXPORT_C RMobileUssdMessaging::TMobileUssdCapsV1::TMobileUssdCapsV1() : - iUssdFormat(0), - iUssdTypes(0) - { - iExtensionId=KETelExtMultimodeV1; - } - -EXPORT_C TInt RMobileUssdMessaging::GetCaps(TDes8& aCaps) const -/** - This member function returns a class that reflects the USSD messaging capabilities - of the phone. - - @param aCaps On completion, a TMobileUssdCapsV1Pckg with the current USSD - messaging capabilities. - @return KErrNone if successful. - @see TMobileUssdCapsV1 - -@capability None -*/ - { - return Get(EMobileUssdMessagingGetCaps, aCaps); - } - -EXPORT_C RMobileUssdMessaging::TMobileUssdAttributesV1::TMobileUssdAttributesV1() : - iFlags(0), - iFormat(EFormatUnspecified), - iType(EUssdUnknown), - iDcs(0) - { - iExtensionId=KETelExtMultimodeV1; - } - -EXPORT_C void RMobileUssdMessaging::ReceiveMessage(TRequestStatus& aReqStatus, TDes8& aMsgData, TDes8& aMsgAttributes) const -/** - This member function enables the client to receive the next incoming USSD message - from the network. The request will be completed when a new message arrives. - - Use RTelSubSessionBase::CancelAsyncRequest(EMobileUssdMessagingReceiveMessage) - to cancel a previously placed asynchronous ReceiveMessage() request. - - @param aReqStatus On return, KErrNone if successful. - @param aMsgData A descriptor large enough to hold the returned USSD message - data. For GSM/ WCDMA USSD messages this will be a buffer of 160 bytes and - the clients are provided with a typedef called RMobileUssdMessaging::TGsmUssdMessageData. - @param aMsgAttributes On completion, the TMobileUssdAttributesV1Pckg with the - message attributes. - - @see TMobileUssdAttributesV1 - -@capability ReadDeviceData -@capability NetworkControl -*/ - { - Get(EMobileUssdMessagingReceiveMessage, aReqStatus, aMsgData, aMsgAttributes); - } - -EXPORT_C void RMobileUssdMessaging::SendMessage(TRequestStatus& aReqStatus, const TDesC8& aMsgData, const TDesC8& aMsgAttributes) const -/** - This member function sends a USSD message to the network. - - See 3GPP spec. 04.90 for more details on expected responses from - the network. - - Use RTelSubSessionBase::CancelAsyncRequest(EMobileUssdMessagingSendMessage) - to cancel a previously placed asynchronous SendMessage() request. - - @param aReqStatus On return, KErrNone if successful. - @param aMsgData The message data. - @param aMsgAttributes The TMobileUssdAttributesV1Pckg with the message attributes. - - @see TMobileUssdAttributesV1 - -@capability NetworkServices -@capability WriteDeviceData -@capability NetworkControl -*/ - { - Set(EMobileUssdMessagingSendMessage, aReqStatus, aMsgData, aMsgAttributes); - } - -EXPORT_C void RMobileUssdMessaging::SendMessageNoFdnCheck(TRequestStatus& aReqStatus, const TDesC8& aMsgData, const TDesC8& aMsgAttributes) const -/** - Sends an outgoing USSD 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 USSD message data to send - @param aMsgAttributes Supplies the attributes of the outgoing USSD - -@capability NetworkServices -@capability NetworkControl -@capability WriteDeviceData -*/ - { - Set(EMobileUssdMessagingSendMessageNoFdnCheck, aReqStatus, aMsgData, aMsgAttributes); - } - -EXPORT_C void RMobileUssdMessaging::SendRelease(TRequestStatus& aReqStatus, TDes8& aReturnResult) const -/** - Sends a USSD release message to the network. This request can terminate an ongoing "dialogue" (send-receive) at any time. - - @param aReqStatus Returns the result code after the asynchronous call completes. - @param aReturnResult A packaged instance of the RMobilePhone::TMobilePhoneSendSSRequestV3 class containing the result of the release. - -@capability NetworkServices -@capability NetworkControl -*/ - { - Get(EMobileUssdMessagingSendRelease, aReqStatus, aReturnResult); - } - -EXPORT_C void RMobileUssdMessaging::NotifyNetworkRelease(TRequestStatus& aReqStatus, TDes8& aReturnResult) const -/** - Notifies the client of a MT USSD release message to the mobile device. The notification completes when a release - message to terminate the session has been received and successfully acknowledged. - NB: This fucntion has been deprecated and it is not recommended for future development work. - - @param aReqStatus Returns the result code after the asynchronous call completes. - @param aReturnResult A packaged instance of the RMobilePhone::TMobilePhoneSendSSRequestV3 class containing the result of the release. - -@capability None -*/ - { - Get(EMobileUssdMessagingNotifyNetworkRelease, aReqStatus, aReturnResult); - } - -EXPORT_C void RMobileUssdMessaging::NotifyNetworkRelease(TRequestStatus& aReqStatus, TDes8& aMsgData, TDes8& aMsgAttributes) const -/** - Notifies the client of a MT USSD release message to the mobile device. The notification completes when a release - message to terminate the session has been received and successfully acknowledged. - - @param aReqStatus Returns the result code after the asynchronous call completes. - @param aMsgData A packaged instance of the RMobilePhone::TMobilePhoneSendSSRequestV3 class containing the result of the release. - @param aMsgAttributes A packaged instance of the TMobileUssdAttributesV1Pckg class containing the message attributes. - - @see TMobileUssdAttributesV1 - -@capability None -*/ - { - Get(EMobileUssdMessagingNotifyNetworkRelease, aReqStatus, aMsgData, aMsgAttributes); - } - +// Copyright (c) 2000-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: +// This file contains the method definitions for all EtelMM subsessions that +// provide messaging functionality. +// +// + +/** + @file +*/ + +// From core API +#include +#include + +// Multimode header files +#include +#include +#include + +#include "mm_hold.h" + + +/************************************************************************/ +// +// RMobileSmsMessaging +// +/************************************************************************/ + +EXPORT_C RMobileSmsMessaging::RMobileSmsMessaging() : + iSmsMessagingPtrHolder(NULL) +/** + Standard constructor. + This member is internal and not intended for public use. +*/ + { + } + +EXPORT_C TInt RMobileSmsMessaging::Open(RMobilePhone& aPhone) + +/** + This member function opens a SMS Messaging object. The name of the sub-session + opened in the TSY will equal the string defined by the KETelSmsMessaging LIT + definition. + + @param aPhone An existing RMobilePhone session. + @return KErrNone if successful. + +@capability None +*/ + { + RSessionBase* session=&aPhone.SessionHandle(); + __ASSERT_ALWAYS(session!=NULL,PanicClient(EEtelPanicNullHandle)); + TInt subSessionHandle=aPhone.SubSessionHandle(); + __ASSERT_ALWAYS(subSessionHandle!=NULL,PanicClient(EEtelPanicNullHandle)); + + TRAPD(ret,ConstructL()); + if (ret) + return ret; + TPtrC name(KETelSmsMessaging); + SetSessionHandle(*session); + TIpcArgs args(&name,TIpcArgs::ENothing,subSessionHandle); + ret = CreateSubSession(*session,EEtelOpenFromSubSession,args); + if (ret) + Destruct(); + return ret; + } + +EXPORT_C void RMobileSmsMessaging::Close() +/** + This method closes a RMobileSmsMessaging subsession + +@capability None +*/ + { + CloseSubSession(EEtelClose); + Destruct(); + } + +EXPORT_C void RMobileSmsMessaging::ConstructL() +/** Constructor. */ + { + __ASSERT_ALWAYS(iSmsMessagingPtrHolder==NULL,PanicClient(EEtelPanicHandleNotClosed)); + iSmsMessagingPtrHolder = CSmsMessagingPtrHolder::NewL(CSmsMessagingPtrHolder::EMaxNumberSmsPtrSlots,CSmsMessagingPtrHolder::EMaxNumberSmsPtrCSlots); + } + +EXPORT_C void RMobileSmsMessaging::Destruct() +/** Destructor. */ + { + delete iSmsMessagingPtrHolder; + iSmsMessagingPtrHolder = NULL; + ResetSessionHandle(); + } + +RMobileSmsMessaging::TMobileSmsAttributesV1::TMobileSmsAttributesV1() +: iFlags(0), + iDataFormat(EFormatUnspecified), + iCdmaTeleservice(0), + iCdmaServiceCategory(0) +/** Constructor. */ + { + } + +EXPORT_C RMobileSmsMessaging::TMobileSmsReceiveAttributesV1::TMobileSmsReceiveAttributesV1() +: iStatus(EMtMessageUnknownStatus), + iStoreIndex(0) +/** Constructor. */ + { + iExtensionId=KETelMobileSmsReceiveAttributesV1; + } + +EXPORT_C RMobileSmsMessaging::TMobileSmsSendAttributesV1::TMobileSmsSendAttributesV1() +: iMsgRef(0), + iMore(EFalse) +/** Constructor. */ + { + iExtensionId=KETelMobileSmsSendAttributesV1; + } + +EXPORT_C RMobileSmsMessaging::TMobileSmsCdmaSendAttributesV4::TMobileSmsCdmaSendAttributesV4() +: iMsgRef(0), + iMore(EFalse), + iAddressAuthentication(0) +/** Constructor. */ + { + iExtensionId=KETelMobileSmsCdmaSendAttributesV4; + } + +EXPORT_C RMobileSmsMessaging::TMobileSmsCapsV1::TMobileSmsCapsV1() +: iSmsMode(0), + iSmsControl(0) +/** Constructor. */ + { + iExtensionId=KETelExtMultimodeV1; + } + +EXPORT_C TInt RMobileSmsMessaging::GetCaps(TDes8& aCaps) const +/** + This member function gets a class that reflects the SMS messaging capabilities + of the phone. + + @param aCaps On return, a TMobileSmsCapsV1Pckg with the SMS messaging capabilities + of the phone. + @return KErrNone if successful. + @see TMobileSmsCapsV1 + +@capability None +*/ + { + return Get(EMobileSmsMessagingGetCaps, aCaps); + } + +EXPORT_C TInt RMobileSmsMessaging::GetReceiveMode(TMobileSmsReceiveMode& aReceiveMode) const +/** + This member function retrieves the current setting of the TSY-phone incoming + SMS receive mode. This setting dictates how the phone will handle incoming + SMS messages before passing them on to TSY. + + @param aReceiveMode On return, the current receive mode. + @return KErrNone if successful. + +@capability None +*/ + { + TPckg ptr1(aReceiveMode); + return Get(EMobileSmsMessagingGetReceiveMode, ptr1); + } + +EXPORT_C void RMobileSmsMessaging::SetReceiveMode(TRequestStatus& aReqStatus, TMobileSmsReceiveMode aReceiveMode) const + +/** + This member function sets the setting of the TSY-phone incoming SMS receive + mode. This setting dictates how the phone will handle incoming SMS messages + before passing them on to TSY. + + Use RTelSubSessionBase::CancelAsyncRequest(EMobileSmsMessagingSetReceiveMode) + to cancel a previously placed asynchronous SetReceiveMode() request. + + @param aReqStatus On return, KErrNone if successful. + @param aReceiveMode The receive mode to set. + +@capability WriteDeviceData +*/ + { + __ASSERT_ALWAYS(iSmsMessagingPtrHolder!=NULL,PanicClient(EEtelPanicNullHandle)); + iSmsMessagingPtrHolder->iReceiveMode = aReceiveMode; + TPtrC8& ptr1=iSmsMessagingPtrHolder->SetC(CSmsMessagingPtrHolder::ESlot1SetReceiveMode,iSmsMessagingPtrHolder->iReceiveMode); + + Set(EMobileSmsMessagingSetReceiveMode, aReqStatus, ptr1); + } + +EXPORT_C void RMobileSmsMessaging::NotifyReceiveModeChange(TRequestStatus& aReqStatus, TMobileSmsReceiveMode& aReceiveMode) +/** + This member function is used to notify the client if there is a change to the + setting of the TSY-Phone receive mode. + + Use RTelSubSessionBase::CancelAsyncRequest(EMobileSmsMessagingNotifyReceiveModeChange) + to cancel a previously placed asynchronous NotifyReceiveModeChange() request. + + @param aReqStatus On return, KErrNone if successful + @param aReceiveMode On return, the new SMS receive mode. + +@capability None +*/ + { + __ASSERT_ALWAYS(iSmsMessagingPtrHolder!=NULL,PanicClient(EEtelPanicNullHandle)); + + TPtr8& ptr1=iSmsMessagingPtrHolder->Set(CSmsMessagingPtrHolder::ESlot1NotifyReceiveModeChange,aReceiveMode); + + Get(EMobileSmsMessagingNotifyReceiveModeChange, aReqStatus, ptr1); + } + +EXPORT_C void RMobileSmsMessaging::ReceiveMessage(TRequestStatus& aReqStatus, TDes8& aMsgData, TDes8& aMsgAttributes) const +/** + This member function will be used to wait for the next incoming SMS message. + Once this member function completes, the client should immediately repost + it if they want to receive the next incoming SMS message. + + Use RTelSubSessionBase::CancelAsyncRequest(EMobileSmsMessagingReceiveMessage) + to cancel a previously placed asynchronous ReceiveMessage() request. + + @param aReqStatus On return, KErrNone if successful. + @param aMsgData On completion, the message data. + @param aMsgAttributes On completion, a TMobileSmsReceiveAttributesV1Pckg containing + the message attributes. + @see TMobileSmsReceiveAttributesV1 + +@capability NetworkServices +@capability ReadUserData +*/ + { + Get(EMobileSmsMessagingReceiveMessage, aReqStatus, aMsgData, aMsgAttributes); + } + +EXPORT_C void RMobileSmsMessaging::AckSmsStored(TRequestStatus& aReqStatus, const TDesC8& aMsgData, TBool aFull) const +/** + When the client receives an unstored SMS, it will use this member function + to return a positive acknowledgment if it manages to successfully decode and + store that SMS. If the client wishes to send a SMS-DELIVER-REPORT in response + to the received SMS-DELIVER , than the aMsgData parameter will be used to + hold the TPDU defined for a SMS-DELIVER-REPORT (for RP-ACK) in GSM 03.40. + + Use RTelSubSessionBase::CancelAsyncRequest(EMobileSmsMessagingAckSmsStored) + to cancel a previously placed asynchronous AckSmsStored() request. + + @param aReqStatus On return, KErrNone if successful. + @param aMsgData Holds the TPDU defined for a SMS-DELIVER-REPORT (for RP-ACK) + in GSM 03.40. + @param aFull Indicates whether, after storing the acknowledged message, the + client-side message store is now full or not. If client sets it to ETrue then + it is informing the TSY that the store is full (or almost full) and that it + does not want to receive any more messages until it calls ResumeSmsReception(). + +@capability NetworkServices +@capability NetworkControl +*/ + { + __ASSERT_ALWAYS(iSmsMessagingPtrHolder!=NULL,PanicClient(EEtelPanicNullHandle)); + + iSmsMessagingPtrHolder->iAckSmsStoredFull = aFull; + TPtrC8& ptr1=iSmsMessagingPtrHolder->SetC(CSmsMessagingPtrHolder::ESlot1AckSmsStored,iSmsMessagingPtrHolder->iAckSmsStoredFull); + + Set(EMobileSmsMessagingAckSmsStored, aReqStatus, aMsgData ,ptr1); + } + +EXPORT_C void RMobileSmsMessaging::NackSmsStored(TRequestStatus& aReqStatus, const TDesC8& aMsg, TInt aRpCause) const +/** When the client receives an unstored SMS, it will use this member function + to return a negative acknowledgment if it fails to decode and/or store that + SMS. + + This TPDU will contain the TP error cause that prevents the client from acknowledging + the SMS. The client should also provide the RP error cause by placing it in + the aRpCause parameter. + + In GSM mode, once a client has rejected a received SMS due to storage full, + the network will keep this message for later and suspend the forwarding of + any further received SMS to this MS. + + In CDMA mode, the network will save the message but it will repeat sending + of the message to the MS until either the MS eventually accepts it or the + retry limit is reached. + + If retry limit is reached the network will tell the originator of the message + that the transmission failed. In either case, when client-side memory is freed-up, + the client must call ResumeSmsReception() in order to tell the phone and possibly + the network that SMS can be received again. + + Use RTelSubSessionBase::CancelAsyncRequest(EMobileSmsMessagingNackSmsStored) + to cancel a previously placed asynchronous NackSmsStored() request. + + @param aReqStatus On return, KErrNone if successful. + @param aMsg Holds the TPDU defined for a SMS-DELIVER-REPORT (for RP-ERROR) + in GSM 03.40. + @param aRpCause Contain one of the MS related extended error codes. + +@capability NetworkServices +@capability NetworkControl +*/ + { + __ASSERT_ALWAYS(iSmsMessagingPtrHolder!=NULL,PanicClient(EEtelPanicNullHandle)); + iSmsMessagingPtrHolder->iNackSmsStoredCause = aRpCause; + TPtrC8& ptr1=iSmsMessagingPtrHolder->SetC(CSmsMessagingPtrHolder::ESlot1NackSmsStored,iSmsMessagingPtrHolder->iNackSmsStoredCause); + + Set(EMobileSmsMessagingNackSmsStored, aReqStatus, aMsg, ptr1); + } + +EXPORT_C void RMobileSmsMessaging::ResumeSmsReception(TRequestStatus& aReqStatus) const +/** + This member functions resumes the reception of SMS messages. + + SMS reception can become suspended because SMS storage is full. Therefore + if client-side storage is full, the client must stop receiving unstored messages. + However, if the user deletes some client-side stored SMS messages, the client + must use this member function to tell the TSY to inform a GSM network that + messages can be received again or the phone that CDMA messages can be accepted + again. + + Use RTelSubSessionBase::CancelAsyncRequest(EMobileSmsMessagingResumeSmsReception) + to cancel a previously placed asynchronous ResumeSmsReception() request. + + @param aReqStatus On return, KErrNone if successful. + +@capability NetworkServices +@capability NetworkControl +*/ + { + Blank(EMobileSmsMessagingResumeSmsReception, aReqStatus); + } + +EXPORT_C void RMobileSmsMessaging::SendMessage(TRequestStatus& aReqStatus, const TDesC8& aMsgData, TDes8& aMsgAttributes) const +/** + This member function sends an SMS message to the network. + + Use RTelSubSessionBase::CancelAsyncRequest(EMobileSmsMessagingSendMessage) + to cancel a previously placed asynchronous SendMessage() request. + + @param aReqStatus On return, KErrNone if successful, KErrNotSupported if the + phone does not support outgoing SMS, KErrMMEtelFormatNotSupported if the phone + does not support the client's chosen message data format, any of the KErrGsmSms… + extended errors if the phone is in GSM mode and this is the error returned + by the GSM network/service centre, Any of the KErrCdmaSms… extended errors + if the phone is in CDMA mode and this is the error returned by the CDMA network/service + centre. Please note that the last three examples are "extended" errors and + will only be returned to those clients that request them. Clients that only + understand core Symbian OS and ETel errors will receive KErrGeneral for any + error cases that the TSY can not interpret. + @param aMsgData The message data + @param aMsgAttributes A TMobileSmsSendAttributesV1Pckg with the message attributes. + The fields required will probably be message data format, destination and + possibly a new service centre address. On return, for either successful or + failed transmission, the message reference number assigned to this sent message + will be placed by the TSY in the iMsgRef field. Also, if the SMS was sent + during GSM or WCDMA mode, then the SMS-SUBMIT-REPORT will be placed by the + TSY in the iSubmitReport field. + @see TMobileSmsSendAttributesV1 + +@capability NetworkServices +@capability WriteUserData +*/ + { + SetAndGet(EMobileSmsMessagingSendMessage, aReqStatus,aMsgData,aMsgAttributes); + } + +EXPORT_C void RMobileSmsMessaging::SendMessageNoFdnCheck(TRequestStatus& aReqStatus, const TDesC8& aMsgData, TDes8& aMsgAttributes) const +/** + 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 + +@capability NetworkServices +@capability NetworkControl +*/ + { + SetAndGet(EMobileSmsMessagingSendMessageNoFdnCheck, aReqStatus,aMsgData,aMsgAttributes); + } + +EXPORT_C void RMobileSmsMessaging::SetMoSmsBearer(TRequestStatus& aReqStatus, TMobileSmsBearer aBearer) const +/** + This member function sets the bearer type (GSM or GPRS) for sending SMS messages. + + Use RTelSubSessionBase::CancelAsyncRequest(EMobileSmsMessagingSetMoSmsBearer) + to cancel a previously placed asynchronous SetMoSmsBearer() request. + + @param aReqStatus On return, KErrNone if successful. + @param aBearer The bearer type to set. + +@capability WriteDeviceData +*/ + { + __ASSERT_ALWAYS(iSmsMessagingPtrHolder!=NULL,PanicClient(EEtelPanicNullHandle)); + iSmsMessagingPtrHolder->iSmsBearer = aBearer; + TPtrC8& ptr1=iSmsMessagingPtrHolder->SetC(CSmsMessagingPtrHolder::ESlot1SetMoSmsBearer,iSmsMessagingPtrHolder->iSmsBearer); + + Set(EMobileSmsMessagingSetMoSmsBearer, aReqStatus, ptr1); + } + +EXPORT_C TInt RMobileSmsMessaging::GetMoSmsBearer(TMobileSmsBearer& aBearer) const +/** + This member function is used to retrieve the current setting for the bearer + type (GSM or GPRS) used for sending SMS messages. + + @param aBearer On return, the current bearer type. + @return KErrNone if successful. + +@capability None +*/ + { + TPckg ptr1(aBearer); + return Get(EMobileSmsMessagingGetMoSmsBearer, ptr1); + } + +EXPORT_C void RMobileSmsMessaging::NotifyMoSmsBearerChange(TRequestStatus& aReqStatus, TMobileSmsBearer& aBearer) +/** + This member function is used t notify the client if there is a change to the + setting for the bearer type used for sending SMS messages. + + Use RTelSubSessionBase::CancelAsyncRequest(EMobileSmsMessagingNotifyMoSmsBearerChange) + to cancel a previously placed asynchronous NotifyMoSmsBearerChange() request. + + @param aReqStatus On return, KErrNone if successful. + @param aBearer On completion, the new bearer. + +@capability None +*/ + { + __ASSERT_ALWAYS(iSmsMessagingPtrHolder!=NULL,PanicClient(EEtelPanicNullHandle)); + + TPtr8& ptr1=iSmsMessagingPtrHolder->Set(CSmsMessagingPtrHolder::ESlot1NotifyMoSmsBearerChange,aBearer); + + Get(EMobileSmsMessagingNotifyMoSmsBearerChange, aReqStatus, ptr1); + } + +// +// SMS related storage +// + +EXPORT_C TInt RMobileSmsMessaging::EnumerateMessageStores(TInt& aCount) const + +/** + This request gets the number of phone-side SMS message stores supported by + the phone in the aCount parameter. + + @param aCount On return, the number of phone-side SMS message stores. + @return KErrNone if successful. + +@capability None +*/ + { + TPckg ptr1(aCount); + return Get(EMobileSmsMessagingEnumerateMessageStores, ptr1); + } + +EXPORT_C void RMobileSmsMessaging::GetMessageStoreInfo(TRequestStatus& aReqStatus, TInt aIndex, TDes8& aInfo) const +/** + This request gets information about the SMS message store. + + Use RTelSubSessionBase::CancelAsyncRequest(EMobileSmsMessagingGetMessageStoreInfo) + to cancel a previously placed asynchronous GetMessageStoreInfo() request. + + @param aReqStatus On return, KErrNone if successful + @param aIndex The index of the store, valid values are between 0 and (n-1), + where n is given by the EnumerateMessageStores() request. + @param aInfo On comletion, a RMobilePhoneStore::TMobilePhoneStoreInfoV1Pckg + holding the SMS message store info. + @see RMobilePhoneStore::TMobilePhoneStoreInfoV1 + +@capability None +*/ + { + __ASSERT_ALWAYS(iSmsMessagingPtrHolder!=NULL,PanicClient(EEtelPanicNullHandle)); + + iSmsMessagingPtrHolder->iGetMessageStoreInfoIndex = aIndex; + TPtrC8& ptr1=iSmsMessagingPtrHolder->SetC(CSmsMessagingPtrHolder::ESlot1GetMessageStoreInfo,iSmsMessagingPtrHolder->iGetMessageStoreInfoIndex); + + SetAndGet(EMobileSmsMessagingGetMessageStoreInfo, aReqStatus, ptr1, aInfo); + } + +// +// SMS Parameter Storage +// + +EXPORT_C RMobileSmsMessaging::TMobileSmspEntryV1::TMobileSmspEntryV1() +: iValidParams(0), + iProtocolId(0), + iDcs(0), + iValidityPeriod(0), + iReservedFiller(0) + { + iExtensionId=KETelExtMultimodeV1; + } + +void RMobileSmsMessaging::TMobileSmspEntryV1::InternalizeL(RReadStream& aStream) +/** + This method internalizes the SMS parameter entry from a stream + + @param aStream The read stream containing the SMS parameter entry + */ + { + TMultimodeType::InternalizeL(aStream); + iIndex = aStream.ReadInt32L(); + aStream >> iText; + iValidParams = aStream.ReadUint32L(); + aStream >> iDestination; + aStream >> iServiceCentre; + iProtocolId = aStream.ReadUint8L(); + iDcs = aStream.ReadUint8L(); + iValidityPeriod = aStream.ReadUint8L(); + } + +void RMobileSmsMessaging::TMobileSmspEntryV1::ExternalizeL(RWriteStream& aStream) const +/** + This method externalizes the SMS parameter entry into a stream + @param aStream The write stream that will contain the SMS parameter entry + */ + { + TMultimodeType::ExternalizeL(aStream); + aStream.WriteInt32L(iIndex); + aStream << iText; + aStream.WriteUint32L(iValidParams); + aStream << iDestination; + aStream << iServiceCentre; + aStream.WriteUint8L(iProtocolId); + aStream.WriteUint8L(iDcs); + aStream.WriteUint8L(iValidityPeriod); + } + + +EXPORT_C void RMobileSmsMessaging::StoreSmspListL(TRequestStatus& aReqStatus, CMobilePhoneSmspList* aSmspList) const +/** + This member function may be used to store a new version of the entire list + of SMSP entries. It will overwrite the current contents of the storage and + may cause other clients to be notified of the change in SMSP list. + + Use RTelSubSessionBase::CancelAsyncRequest(EMobileSmsMessagingStoreSmspList) + to cancel a previously placed asynchronous StoreSmspListL() request. + + @leave k Will leave if the CBufFlat to hold the streamed contents can not be allocated + @param aReqStatus On return, KErrNone if successful. + @param aSmspList The list of SMSP entries to store, should not contain more + entries than can be stored phone-side. + +@capability WriteDeviceData +*/ + { + __ASSERT_ALWAYS(aSmspList!=NULL,PanicClient(EEtelPanicNullHandle)); + __ASSERT_ALWAYS(iSmsMessagingPtrHolder!=NULL,PanicClient(EEtelPanicNullHandle)); + + delete iSmsMessagingPtrHolder->iSmspBuf; + iSmsMessagingPtrHolder->iSmspBuf = NULL; + + iSmsMessagingPtrHolder->iSmspBuf=aSmspList->StoreLC(); + CleanupStack::Pop(); + + (iSmsMessagingPtrHolder->iSmspPtr).Set((iSmsMessagingPtrHolder->iSmspBuf)->Ptr(0)); + + Set(EMobileSmsMessagingStoreSmspList,aReqStatus,iSmsMessagingPtrHolder->iSmspPtr); + + } + +EXPORT_C void RMobileSmsMessaging::NotifySmspListChange(TRequestStatus& aReqStatus) const +/** + This member function allows a client to be notified that changes have been + made to the SMSP list. When it completes, it does not return the new version + of the list so the client will have to retrieve the list again if it is interested + in the new list. + + Use RTelSubSessionBase::CancelAsyncRequest(EMobileSmsMessagingNotifySmspListChange) + to cancel a previously placed asynchronous NotifySmspListChange() request. + + @param aReqStatus On return, KErrNone if successful. + +@capability None +*/ + { + Blank(EMobileSmsMessagingNotifySmspListChange,aReqStatus); + } + + +/************************************************************************/ +// +// RMobileBroadcastMessaging +// +/************************************************************************/ + +EXPORT_C RMobileBroadcastMessaging::RMobileBroadcastMessaging() : + iCbsMessagingPtrHolder(NULL) +/** Standard constructor. */ + { + } + +EXPORT_C TInt RMobileBroadcastMessaging::Open(RMobilePhone& aPhone) +/** + This function member opens a Broadcast Messaging object. The name of the sub-session + opened in the TSY will equal the string defined by the KETelBroadcastMessaging + LIT definition. + + @param aPhone The existing RMobilePhone session. + @return KErrNone if successful, a system wide error code if not. + +@capability None +*/ + { + RSessionBase* session=&aPhone.SessionHandle(); + __ASSERT_ALWAYS(session!=NULL,PanicClient(EEtelPanicNullHandle)); + TInt subSessionHandle=aPhone.SubSessionHandle(); + __ASSERT_ALWAYS(subSessionHandle!=NULL,PanicClient(EEtelPanicNullHandle)); + + TRAPD(ret,ConstructL()); + if (ret) + return ret; + TPtrC name(KETelBroadcastMessaging); + SetSessionHandle(*session); + TIpcArgs args(&name,TIpcArgs::ENothing,subSessionHandle); + ret = CreateSubSession(*session,EEtelOpenFromSubSession,args); + if (ret) + Destruct(); + return ret; + } + +EXPORT_C void RMobileBroadcastMessaging::Close() +/** This function member closes a RMobileBroadcastMessaging object. +@capability None +*/ + { + CloseSubSession(EEtelClose); + Destruct(); + } + +EXPORT_C void RMobileBroadcastMessaging::ConstructL() + { + __ASSERT_ALWAYS(iCbsMessagingPtrHolder==NULL,PanicClient(EEtelPanicHandleNotClosed)); + iCbsMessagingPtrHolder = CCbsMessagingPtrHolder::NewL(CCbsMessagingPtrHolder::EMaxNumberBroadcastPtrSlots,CCbsMessagingPtrHolder::EMaxNumberBroadcastPtrCSlots); + } + +EXPORT_C void RMobileBroadcastMessaging::Destruct() +/** Destructor. Deletes any dynamically allocated memory. */ + { + delete iCbsMessagingPtrHolder; + iCbsMessagingPtrHolder = NULL; + ResetSessionHandle(); + } + +EXPORT_C RMobileBroadcastMessaging::TMobileBroadcastCapsV1::TMobileBroadcastCapsV1() : + iModeCaps(0), + iFilterCaps(0) + { + iExtensionId=KETelExtMultimodeV1; + } + +EXPORT_C TInt RMobileBroadcastMessaging::GetCaps(TDes8& aCaps) const +/** + This function member gets a class that reflects the broadcast messaging capabilities + of the phone. + + @param aCaps On completion, a TMobileBroadcastCapsV1Pckg with the broadcast + messaging capabilities. + @return KErrNone if successful, a system wide error code if not. + @see TMobileBroadcastCapsV1 + +@capability None +*/ + { + return Get(EMobileBroadcastMessagingGetCaps, aCaps); + } + +EXPORT_C RMobileBroadcastMessaging::TMobileBroadcastAttributesV1::TMobileBroadcastAttributesV1() : + iFlags(0), + iFormat(EFormatUnspecified), + iServiceCategory(0) + { + iExtensionId=KETelExtMultimodeV1; + } + +/** + This is the initialization of the TMobileBroadcastAttributesV2 structured type + +*/ +EXPORT_C RMobileBroadcastMessaging::TMobileBroadcastAttributesV2::TMobileBroadcastAttributesV2() : + TMobileBroadcastAttributesV1(), + iNumberOfPages(0), + iMessageType(0), + iMessageId(0), + iSerialNum(0), + iDCS(0) + /** Default constructor. All internal data is set to 0 and the extension ID to + KETelExtMultimodeV2. */ + { + iExtensionId=KETelExtMultimodeV2; + } + + +/** + This function member enables the client to receive the next + incoming broadcast message from the network. + + The request will be completed when a new message arrives. The + client will pass a descriptor of size KBroadcastPageSize bytes, + provided by the typedef TBroadcastPageData, to hold the returned + broadcast message data into the aMsgData parameter. + + This buffer size should be used for all types of messages: + GSM, CDMA and WCDMA. + + The function explicity checks that the aMsgData parameter is of + size KBroadcastPageSize. If the buffer size does not equal + KBroadcastPageSize, the client request will be completed with + KErrArgument. + + A TSY should handle ReceiveMessage() requests by making them repost + immediately (to ensure none are missed) and possibly multiple + completion enabled. When a new message arrives the TSY will copy the + broadcast message contents into its stored pointer to the broadcast + message data, fill in the broadcast message attributes and then + complete the request. + + @param aReqStatus On return, KErrNone if successful, KErrArgument if the aMsgData buffer size does not equal KBroadcastPageSize, otherwise a system wide error code. + @param aMsgData On completion, the message data. + @param aMsgAttributes On completion, the broadcast message attributes, in an instance of the TMobileBroadcastAttributesV1Pckg class. + @see TMobileBroadcastAttributesV1 + +@capability None +*/ +EXPORT_C void RMobileBroadcastMessaging::ReceiveMessage(TRequestStatus& aReqStatus, TDes8& aMsgData, TDes8& aMsgAttributes) const + { + if (aMsgData.MaxLength() != KBroadcastPageSize) + { + TRequestStatus* status=&aReqStatus; + User::RequestComplete(status,KErrArgument); + return; + } + Get(EMobileBroadcastMessagingReceiveMessage, aReqStatus, aMsgData, aMsgAttributes); + } + +EXPORT_C TInt RMobileBroadcastMessaging::GetFilterSetting(TMobilePhoneBroadcastFilter& aSetting) const +/** + This function member gets the current setting for the receipt of broadcast + messages. + + This setting will indicate whether all or no messages are being accepted or + whether only those messages specified by the filters are going to be accepted + or rejected. + + If the returned setting, aSetting, equals EBroadcastAcceptFilter then the + phone will accept messages whose identifier is included within the identifier + list AND whose language is included within the language filter. If the returned + setting, aSetting, equals EBroadcastRejectFilter then the phone will reject + messages whose identifier is included within the identifier list OR whose + language is included within the language filter. + + N.B. If the phone supports both GSM/WCDMA and CDMA mode then it will probably + need two identifier lists - one to contain a list of CBMI (for GSM/WCDMA mode) + and the other to contain a list of Service Categories (for CDMA mode) This + function member is synchronous because it is expected that this will be a + TSY specific setting whose current value the TSY has previously determined. + + @param aSetting On completion, the current filter settings. + @return KErrNone if successful, or KErrNotSupported if the phone does not support + a filter setting. + +@capability ReadUserData +*/ + { + TPckg ptr1(aSetting); + return Get(EMobileBroadcastMessagingGetFilterSetting, ptr1); + } + +EXPORT_C void RMobileBroadcastMessaging::SetFilterSetting(TRequestStatus& aReqStatus, TMobilePhoneBroadcastFilter aSetting) const +/** + This function member sets a new setting for the receipt of broadcast messages. + + This setting will specify whether all or no messages are being accepted or + whether only those messages specified by the filters are going to be accepted + or rejected. + + Use RTelSubSessionBase::CancelAsyncRequest(EMobileBroadcastMessagingSetFilterSetting) + to cancel a previously placed asynchronous SetFilterSetting() request. + + @param aReqStatus On return, the KErrNone if successful, KErrNotSupported + if the phone does not support a filter setting. + @param aSetting On completion, the new filter setting of the phone. + +@capability WriteUserData +*/ + { + __ASSERT_ALWAYS(iCbsMessagingPtrHolder!=NULL,PanicClient(EEtelPanicNullHandle)); + + iCbsMessagingPtrHolder->iSetFilterSetting=aSetting; + + TPtrC8& ptr1=iCbsMessagingPtrHolder->SetC(CCbsMessagingPtrHolder::ESlot1SetFilterSetting, iCbsMessagingPtrHolder->iSetFilterSetting); + + Set(EMobileBroadcastMessagingSetFilterSetting, aReqStatus, ptr1); + } + +EXPORT_C void RMobileBroadcastMessaging::NotifyFilterSettingChange(TRequestStatus& aReqStatus, TMobilePhoneBroadcastFilter& aSetting) const +/** + This function member allows a client to be notified if there is a change in + the setting for the receipt of broadcast messages. + + Use RTelSubSessionBase::CancelAsyncRequest(EMobileBroadcastMessagingNotifyFilterSettingChange) + to cancel a previously placed asynchronous NotifyFilterSetting() request. + + @param aReqStatus On return, KErrNone if successful, KErrNotSupported if the + phone does not support a filter setting. + @param aSetting On completion, the changed filter setting. + +@capability ReadUserData +*/ + { + __ASSERT_ALWAYS(iCbsMessagingPtrHolder!=NULL,PanicClient(EEtelPanicNullHandle)); + + TPtr8& ptr1=iCbsMessagingPtrHolder->Set(CCbsMessagingPtrHolder::ESlot1NotifyFilterSettingChange,aSetting); + + Get(EMobileBroadcastMessagingNotifyFilterSettingChange, aReqStatus, ptr1); + } + +EXPORT_C void RMobileBroadcastMessaging::GetLanguageFilter(TRequestStatus& aReqStatus, TDes16& aLangFilter) const +/** + This function member allows a client to retrieve the current contents of the + broadcast message language filter. + + Use RTelSubSessionBase::CancelAsyncRequest(EMobileBroadcastMessagingGetLanguageFilter) + to cancel a previously placed asynchronous GetLanguageFilter() request. + + @param aReqStatus On return KErrNone if successful, KErrNotFound if there + is no language filter in place, and KErrNotSupported if the phone does not + support a language filter. + @param aLangFilter On completion, contain as many languages (each coded on + 16-bits) as can fit in the descriptor supplied by the client. This filter + defines which are the desired (or undesired) language(s) of incoming broadcast + messages. A language is defined either within one byte by its Cell Broadcast + Data Coding Scheme (as defined in GSM 03.38) or within two bytes by its ISO + 639 alphanumeric pair. Even if a language is represented by an 8-bit value + it will be returned as a 16-bit value with the language in the least significant + 8-bits. + +@capability ReadUserData +*/ + { + Get(EMobileBroadcastMessagingGetLanguageFilter,aReqStatus,aLangFilter); + } + +EXPORT_C void RMobileBroadcastMessaging::SetLanguageFilter(TRequestStatus& aReqStatus, const TDesC16& aLangFilter) const +/** + This function member allows a client to store new contents for the broadcast + message language filter. + + Use RTelSubSessionBase::CancelAsyncRequest(EMobileBroadcastMessagingSetLanguageFilter) + to cancel a previously placed asynchronous SetLanguageFilter() request. + + @param aReqStatus On return, KErrNone, if successful, KErrNotSupported if + the phone does not support a language filter. + @param aLangFilter Each element in this descriptor will define a language. + This filter will define which are the desired (or undesired) language(s) of + incoming broadcast messages. + +@capability WriteUserData +*/ + { + Set(EMobileBroadcastMessagingSetLanguageFilter,aReqStatus,aLangFilter); + } + +EXPORT_C void RMobileBroadcastMessaging::NotifyLanguageFilterChange(TRequestStatus& aReqStatus, TDes16& aLangFilter) const +/** + This function member allows a client to be notified if there is a change in + the contents of the language filter. + + Use RTelSubSessionBase::CancelAsyncRequest(EMobileBroadcastMessagingNotifyLanguageFilterChange) + to cancel a previously placed asynchronous NotifyLanguageFilterChange() request. + + @param aReqStatus On return, KErrNone, if successful, KErrNotSupported if + the phone does not support a language filter. + @param aLangFilter On completion, the new language filter. + +@capability ReadUserData +*/ + { + Get(EMobileBroadcastMessagingNotifyLanguageFilterChange,aReqStatus,aLangFilter); + } + +EXPORT_C RMobileBroadcastMessaging::TMobileBroadcastIdEntryV1::TMobileBroadcastIdEntryV1() : + iId(0) + { + iExtensionId=KETelExtMultimodeV1; + } + +void RMobileBroadcastMessaging::TMobileBroadcastIdEntryV1::InternalizeL(RReadStream& aStream) +/** Internalizes the CBMI entry from a stream. + + @param aStream The read stream containing the CBMI entry. + */ + { + TMultimodeType::InternalizeL(aStream); + iId = aStream.ReadUint16L(); + } + +void RMobileBroadcastMessaging::TMobileBroadcastIdEntryV1::ExternalizeL(RWriteStream& aStream) const +/** Externalizes the CBMI entry into a stream. + + @param aStream The write stream that will contain the CBMI entry. + */ + { + TMultimodeType::ExternalizeL(aStream); + aStream.WriteInt16L(iId); + } + +EXPORT_C void RMobileBroadcastMessaging::StoreBroadcastIdListL(TRequestStatus& aReqStatus, CMobilePhoneBroadcastIdList* aBroadcastIdList, TMobileBroadcastIdType aIdType) +/** + This function member may be used to store a new version of the entire BroadcastId list + of identifier entries. + + The list, should not contain more entries than can be stored phone-side. This + function member will store all the identifier list entries into the phone-side + storage. It will overwrite the current contents of the storage and may cause + other clients to be notified of the change in identifier list. + + Due to the probable time taken to store a list, there is only an asynchronous + version of this function member. This function member will leave if an out + of memory error occurs during allocation of a client-side buffer in which + to store the streamed list contents. + + Use RTelSubSessionBase::CancelAsyncRequest(EMobileBroadcastMessagingStoreIdList) + to cancel a previously placed asynchronous StoreBroadcastIdListL() request. + Will leave if the CBufFlat to hold the streamed contents can not be allocated + + @param aReqStatus On return, KErrNone if successful, a system wide error code + if not. + @param aBroadcastIdList The list of BroadcastId identifier entries to be stored. + @param aIdType Specifies whether the list is to be stored as a GSM/WCDMA list + of CBMI entries or a CDMA list of Service Category entries. + +@capability WriteUserData +*/ + { + __ASSERT_ALWAYS(aBroadcastIdList!=NULL,PanicClient(EEtelPanicNullHandle)); + __ASSERT_ALWAYS(iCbsMessagingPtrHolder!=NULL,PanicClient(EEtelPanicNullHandle)); + + delete iCbsMessagingPtrHolder->iBroadcastIdBuf; + iCbsMessagingPtrHolder->iBroadcastIdBuf = NULL; + + iCbsMessagingPtrHolder->iBroadcastIdBuf=aBroadcastIdList->StoreLC(); + CleanupStack::Pop(); + + (iCbsMessagingPtrHolder->iBroadcastIdPtr).Set((iCbsMessagingPtrHolder->iBroadcastIdBuf)->Ptr(0)); + + iCbsMessagingPtrHolder->iIdType = aIdType; + TPtrC8& ptr2=iCbsMessagingPtrHolder->SetC(CCbsMessagingPtrHolder::ESlot1StoreBroadcastIdListL,iCbsMessagingPtrHolder); + + Set(EMobileBroadcastMessagingStoreIdList,aReqStatus,iCbsMessagingPtrHolder->iBroadcastIdPtr, ptr2); + } + +EXPORT_C void RMobileBroadcastMessaging::NotifyBroadcastIdListChange(TRequestStatus& aReqStatus) const +/** + This function member allows a client to be notified that changes have been + made to the BroadcastId filter identifier list. + + When it completes, it does not return the new version of the list so the client + will have to retrieve the list using CRetrieveMobilePhoneBroadcastIdL again if it is interested in the new list. + + Use RTelSubSessionBase::CancelAsyncRequest(EMobileBroadcastMessagingNotifyIdListChange) + to cancel a previously placed asynchronous NotifyBroadcastIdListChange() request. + + @param aReqStatus On return, KErrNone if successful, a system wide error code + if not. + +@capability None +*/ + { + Blank(EMobileBroadcastMessagingNotifyIdListChange,aReqStatus); + } + +/************************************************************************/ +// +// RMobileUssdMessaging +// +/************************************************************************/ + +EXPORT_C RMobileUssdMessaging::RMobileUssdMessaging() +: iUssdMessagingPtrHolder(NULL) +/** Constructor. */ + { + } + +EXPORT_C TInt RMobileUssdMessaging::Open(RMobilePhone& aPhone) +/** + This member function opens a USSD messaging sub-session. The name of the sub-session + opened in the TSY will equal the string defined by the KETelUssdMessaging + LIT definition. + + @param aPhone An existing RMobilePhone session. + @return KErrNone if successful. + +@capability None +*/ + { + RSessionBase* session=&aPhone.SessionHandle(); + __ASSERT_ALWAYS(session!=NULL,PanicClient(EEtelPanicNullHandle)); + TInt subSessionHandle=aPhone.SubSessionHandle(); + __ASSERT_ALWAYS(subSessionHandle!=NULL,PanicClient(EEtelPanicNullHandle)); + + TRAPD(ret,ConstructL()); + if (ret) + return ret; + TPtrC name(KETelUssdMessaging); + SetSessionHandle(*session); + TIpcArgs args(&name,TIpcArgs::ENothing,subSessionHandle); + ret = CreateSubSession(*session,EEtelOpenFromSubSession,args); + if (ret) + Destruct(); + return ret; + } + +EXPORT_C void RMobileUssdMessaging::Close() +/** This member function closes a USSD Messaging object. +@capability None +*/ + { + CloseSubSession(EEtelClose); + Destruct(); + } + +EXPORT_C void RMobileUssdMessaging::ConstructL() + { + } + +EXPORT_C void RMobileUssdMessaging::Destruct() +/** Destructor. */ + { + } + +EXPORT_C RMobileUssdMessaging::TMobileUssdCapsV1::TMobileUssdCapsV1() : + iUssdFormat(0), + iUssdTypes(0) + { + iExtensionId=KETelExtMultimodeV1; + } + +EXPORT_C TInt RMobileUssdMessaging::GetCaps(TDes8& aCaps) const +/** + This member function returns a class that reflects the USSD messaging capabilities + of the phone. + + @param aCaps On completion, a TMobileUssdCapsV1Pckg with the current USSD + messaging capabilities. + @return KErrNone if successful. + @see TMobileUssdCapsV1 + +@capability None +*/ + { + return Get(EMobileUssdMessagingGetCaps, aCaps); + } + +EXPORT_C RMobileUssdMessaging::TMobileUssdAttributesV1::TMobileUssdAttributesV1() : + iFlags(0), + iFormat(EFormatUnspecified), + iType(EUssdUnknown), + iDcs(0) + { + iExtensionId=KETelExtMultimodeV1; + } + +EXPORT_C void RMobileUssdMessaging::ReceiveMessage(TRequestStatus& aReqStatus, TDes8& aMsgData, TDes8& aMsgAttributes) const +/** + This member function enables the client to declare an interest in receiving the next + incoming USSD message from the network. The request will be completed when the message is + offered to the client. The client must then decide to either accept or reject the USSD + session/dialogue. + + Use RTelSubSessionBase::CancelAsyncRequest(EMobileUssdMessagingReceiveMessage) + to cancel a previously placed asynchronous ReceiveMessage() request. + + @param aReqStatus On return, KErrNone if successful. + @param aMsgData A descriptor large enough to hold the returned USSD message + data. For GSM/ WCDMA USSD messages this will be a buffer of 160 bytes and + the clients are provided with a typedef called RMobileUssdMessaging::TGsmUssdMessageData. + @param aMsgAttributes On completion, the TMobileUssdAttributesV1Pckg with the + message attributes. + + @see TMobileUssdAttributesV1 + @see AcceptIncomingDialogue RejectIncomingDialogue + +@capability ReadDeviceData +@capability NetworkControl +*/ + { + Get(EMobileUssdMessagingReceiveMessage, aReqStatus, aMsgData, aMsgAttributes); + } + +EXPORT_C TInt RMobileUssdMessaging::AcceptIncomingDialogue() const +/** + This member function enables the client to accept an incoming USSD message + and thereby the rest of the session/dialogue with the network. + + It would be called when ReceiveMessage has completed and the client is not + currently in a dialogue/session. The alternative would be to call RejectIncomingDialogue + if the client was not interested in the dialogue (after examining the message data) + + If the client calls this function within the time limit allowed + further network USSD messages will be sent to this client only. And + the client can use SendMessage to send USSD messages. This will continue until the session + is terminated or there is a session timeout. + + @return KErrTimedOut if exceeded allocated time period fir accepting/rejecting. Else KErrNone. + + @see ReceiveMessage + @see RejectIncomingDialogue + +@capability ReadUserData +@capability NetworkControl +*/ + { + TPckgC accept(ETrue); + TPckgC type(RTelServer::EUssdType); + return Set(EEtelServerAcceptIncoming, type); + } + +EXPORT_C TInt RMobileUssdMessaging::RejectIncomingDialogue() const +/** + This member function enables the client to to reject an incoming USSD message. + This indicates the client (having examined the data) is not interested in + receiving further messages in this dialogue/session. + + It would be called when ReceiveMessage has completed and the client is not + currently in a dialogue/session. The alternative would be to call AcceptIncomingDialogue + if the client was interested in the dialogue (after examining the message data) + + If the client calls this function within the time limit allowed + further network USSD messages will be sent to this client only and + the client can use SendMessage to send USSD messages. + This will continue until the session is terminated or there is a session timeout. + + @return KErrTimedOut if exceeded allocated time period for accepting/rejecting. Else KErrNone. + + @see ReceiveMessage + @see RejectIncomingDialogue + +@capability ReadUserData +@capability NetworkControl +*/ + { + TPckgC accept(ETrue); + TPckgC type(RTelServer::EUssdType); + return Set(EEtelServerRejectIncoming, type); + } + +EXPORT_C void RMobileUssdMessaging::SendMessage(TRequestStatus& aReqStatus, const TDesC8& aMsgData, const TDesC8& aMsgAttributes) const +/** + This member function sends a USSD message to the network. + + See 3GPP spec. 04.90 for more details on expected responses from + the network. + + Use RTelSubSessionBase::CancelAsyncRequest(EMobileUssdMessagingSendMessage) + to cancel a previously placed asynchronous SendMessage() request. + + @param aReqStatus On return, KErrNone if successful. + @param aMsgData The message data. + @param aMsgAttributes The TMobileUssdAttributesV1Pckg with the message attributes. + + @see TMobileUssdAttributesV1 + +@capability NetworkServices +@capability WriteDeviceData +@capability NetworkControl +*/ + { + Set(EMobileUssdMessagingSendMessage, aReqStatus, aMsgData, aMsgAttributes); + } + +EXPORT_C void RMobileUssdMessaging::SendMessageNoFdnCheck(TRequestStatus& aReqStatus, const TDesC8& aMsgData, const TDesC8& aMsgAttributes) const +/** + Sends an outgoing USSD 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 USSD message data to send + @param aMsgAttributes Supplies the attributes of the outgoing USSD + +@capability NetworkServices +@capability NetworkControl +@capability WriteDeviceData +*/ + { + Set(EMobileUssdMessagingSendMessageNoFdnCheck, aReqStatus, aMsgData, aMsgAttributes); + } + +EXPORT_C void RMobileUssdMessaging::SendRelease(TRequestStatus& aReqStatus, TDes8& aReturnResult) const +/** + Sends a USSD release message to the network. This request can terminate an ongoing "dialogue" (send-receive) at any time. + + @param aReqStatus Returns the result code after the asynchronous call completes. + @param aReturnResult A packaged instance of the RMobilePhone::TMobilePhoneSendSSRequestV3 class containing the result of the release. + +@capability NetworkServices +@capability NetworkControl +*/ + { + Get(EMobileUssdMessagingSendRelease, aReqStatus, aReturnResult); + } + +EXPORT_C void RMobileUssdMessaging::NotifyNetworkRelease(TRequestStatus& aReqStatus, TDes8& aReturnResult) const +/** + Notifies the client of a MT USSD release message to the mobile device. The notification completes when a release + message to terminate the session has been received and successfully acknowledged. + NB: This fucntion has been deprecated and it is not recommended for future development work. + + @param aReqStatus Returns the result code after the asynchronous call completes. + @param aReturnResult A packaged instance of the RMobilePhone::TMobilePhoneSendSSRequestV3 class containing the result of the release. + +@capability None +*/ + { + Get(EMobileUssdMessagingNotifyNetworkRelease, aReqStatus, aReturnResult); + } + +EXPORT_C void RMobileUssdMessaging::NotifyNetworkRelease(TRequestStatus& aReqStatus, TDes8& aMsgData, TDes8& aMsgAttributes) const +/** + Notifies the client of a MT USSD release message to the mobile device. The notification completes when a release + message to terminate the session has been received and successfully acknowledged. + + @param aReqStatus Returns the result code after the asynchronous call completes. + @param aMsgData A packaged instance of the RMobilePhone::TMobilePhoneSendSSRequestV3 class containing the result of the release. + @param aMsgAttributes A packaged instance of the TMobileUssdAttributesV1Pckg class containing the message attributes. + + @see TMobileUssdAttributesV1 + +@capability None +*/ + { + Get(EMobileUssdMessagingNotifyNetworkRelease, aReqStatus, aMsgData, aMsgAttributes); + } +