This section describes an ECom plug-in called Class 0 plug-in for the messaging subsystem which handles Class 0 SMS.
Class 0 SMS is a type of SMS message that is displayed on the mobile screen without being saved in the message store or on the SIM card; unless explicitly saved by the mobile user. The Class 0 plug-in handles and displays Class 0 SMS.
Using this plug-in, the Symbian Messaging subsystem does not store Class 0 SMS in the message store (SMS service Inbox), but immediately displays them on the mobile screen; even if there is no memory available on the SIM or device. For more detailed information on how Class 0 messages are handled by the Symbian Messaging subsystem, see the Architecture section.
SMS stack configuration
The SMS stack must be configured to handle Class 0 SMS. This is done in accordance with the SMS stack licence. If the SMS stack is not configured to handle Class 0 messages they will be treated as non Class 0 SMS. They will be stored in the message store and are notified to the UI framework. For more information on configuration of the SMS stack to handle Class 0 messages, see Configuring SMS Stack To Handle Class 0 Messages.
Symbian provides a default plug-in as part of the Symbian Messaging subsystem. However, licensees can override it by writing a new ECom plug-in using the CSmsClass0Base class. For more information on CSmsClass0Base, see Writing a new plug-in using CSmsClass0Base class.
The Class 0 plug-in is loaded by the Narrow Band Socket (NBS) watcher when it starts. The NBS watcher looks for the Class 0 plug-in ROM only. When the NBS watcher receives an SMS message from the SMS stack, it checks for the type of SMS message. If it is a Class 0 SMS message, the NBS watcher passes the message to the Class 0 plug-in. The Class 0 plug-in immediately notifies a UI notifier plug-in which displays the content of the Class 0 SMS message on the UI without storing it in the message store (SMS service Inbox).
The Symbian Messaging subsystem includes a default implementation of the CSmsClass0Base plug-in which can be found in the class0sms.dll file.
However, licensees can override it by writing a new ECom plug-in using the CSmsClass0Base exported class. For instructions on writing a new ECom plug-in, see the ECom guide.
void CClass0Sms::DisplayMessageHandler(TDesC8& aSmsMessage, TBool aIsCompleteMsg)
Derived from the CSmsClass0Base class |
|
CClass0Sms::DisplayMessageHandler() |
This method calls StartNotifier() or UpdateNotifier() according to the value set in the aIsCompleteMsg flag. |
TDesC8 & aSmsMessage |
Contains the following data:
The data needs be extracted at the client side in same order; that is, TInt aStartPos, TInt endPos, TBool aIsLastMessage, and TPtr aSmsData. |
TBool aIsCompleteMsg |
Indicates whether the message is a complete or partial message. |
This class calls RNotifier::StartNotifier or RNotifier::UpdateNotifier according to the aIsCompleteMsg flag setting as illustrated in the following code example:
void CClass0Sms::DisplayMessageHandler(TDesC8& aSmsMessage, TBool aIsCompleteMsg) { TPckgBuf<TInt> response; if(aIsCompleteMsg) { //The UID of KUidClass0SmsNotifier should to be used in UI Notifier. iNotifier.StartNotifier(KUidClass0SmsNotifier, aSmsMessage); } else { //The UID of KUidClass0SmsNotifier should to be used in UI Notifier. iNotifier.UpdateNotifier(KUidClass0SmsNotifier, aSmsMessage, response); } }
For more details on writing a UI Notifier, see Example.
The SMS stack can send a complete or partial messages to the Messaging client. When it sends a partial message to the Messaging client, such as in an out-of-disk condition, it provides additional information about the partial message.
The following are the type of Class 0 SMS message displayed on the UI framework.
Type of Class 0 SMS message |
Displayed on the UI framework |
Complete |
If the received message is complete, it contains the Class 0 SMS data and the remaining fields are set to zero (0). StartPos:0EndPos:0IsCompleteMsg: EFalse |
Partial |
If the received message is incomplete, it contains information about the starting and ending PDU positions of the decoded message, and the isCompleteMessageFlag flag is set to EFalse. StartPos: StartingPDUpositionEndPos: EndingPDUpositionisLastMessage: ETrue If it is the last part of the partial message, then IsCompleteMessageFlag will be set to EFalse. |
The Symbian Messaging subsystem passes the serial buffer, which contains starting and ending PDU, and the Class 0 SMS message in the TDesC8 descriptor to the UI. The TDesC8 descriptor must be read at the UI side in the same order; that is, TInt aStartPos, TInt endPos, TBool aIsLastMessage, and TPtr aSmsData.
The following example code shows how to write a UI notifier and extract the Class 0 SMS message:
class0smsUInotifier.h
// class0smsUInotifier.h // // Copyright ©) Symbian Software Ltd 2007. All rights reserved. // #ifndef __CLASS0SMSUINOTIFIER_H__ #define __CLASS0SMSUINOTIFIER_H__ #include <eiknotapi.h> #include <ecom.h> class CClass0SmsUINotifier : public MEikSrvNotifierBase2 { public: // Construction static CClass0SmsUINotifier* NewL(); ~CClass0SmsUINotifier(); private: CClass0SmsUINotifier(); void ConstructL(); // from MEikSrvNotifierBase2 virtual void Release(); virtual TNotifierInfo RegisterL(); virtual TNotifierInfo Info() const; virtual TPtrC8 StartL(const TDesC8& aBuffer); virtual void Cancel(); virtual TPtrC8 UpdateL(const TDesC8& aBuffer); void ExtractClass0SMSData(const TDesC8& aBuffer); private: TNotifierInfo iInfo; }; #endif // __CLASS0SMSUINOTIFIER_H__
class0smsUInotifier.cpp
// class0smsUInotifier.cpp // // Copyright ©) Symbian Software Ltd 2007. All rights reserved. // #include <ecom.h> #include <tmsvpackednotifierrequest.h> #include <implementationproxy.h> #include <gsmubuf.h> #include <s32mem.h> #include <e32base.h> #include "class0smsUInotifier.h" // The UID identifying the notifier, // this UID is used in RNotifier::StartNotifier/RNotifier::UpdateNotifier to send the class 0 SMS message from messaging application. const TUid KUidClass0SmsNotifier = {0x2000C382}; const TUid KClass0SmsNotifierOutput = {0x2000C382}; EXPORT_C CArrayPtr<MEikSrvNotifierBase2>* NotifierArray() { CArrayPtrFlat<MEikSrvNotifierBase2>* subjects=NULL; TRAPD( err, subjects=new (ELeave)CArrayPtrFlat<MEikSrvNotifierBase2>(1) ); if( err == KErrNone ) { TRAP( err, subjects->AppendL( CClass0SmsUINotifier::NewL() ) ); return(subjects); } else { return NULL; } } // Allocates and constructs a CClass0SmsUINotifier object CClass0SmsUINotifier* CClass0SmsUINotifier::NewL() { CClass0SmsUINotifier* self=new (ELeave) CClass0SmsUINotifier(); CleanupStack::PushL(self); self->ConstructL(); CleanupStack::Pop(self); return self; } void CClass0SmsUINotifier::ConstructL() { } // destructor CClass0SmsUINotifier::~CClass0SmsUINotifier() { REComSession::FinalClose(); } // constructor CClass0SmsUINotifier::CClass0SmsUINotifier() { //The UID identifying the notifier. iInfo.iUid = KUidClass0SmsNotifier; iInfo.iChannel = KClass0SmsNotifierOutput; iInfo.iPriority = ENotifierPriorityHigh; } // Frees all resources owned by CClass0SmsUINotifier notifier void CClass0SmsUINotifier::Release() { delete this; } // Called when a notifier is first loaded to allow any initial construction that is required. CClass0SmsUINotifier::TNotifierInfo CClass0SmsUINotifier::RegisterL() { return iInfo; } // To get the notifier parameters CClass0SmsUINotifier::TNotifierInfo CClass0SmsUINotifier::Info() const { return iInfo; } // The notifier has been deactivated so resources can be freed and outstanding messages completed. void CClass0SmsUINotifier::Cancel() { } // Class0SMS PDU will be received here. TPtrC8 CClass0SmsUINotifier::StartL(const TDesC8& aBuffer) { ExtractClass0SMSData(aBuffer); return KNullDesC8(); } // Update a currently active notifier with data aBuffer. TPtrC8 CClass0SmsUINotifier::UpdateL(const TDesC8& aBuffer) { ExtractClass0SMSData(aBuffer); return KNullDesC8(); } //Adding ECOM SUPPORT const TImplementationProxy ImplementationTable[] = { IMPLEMENTATION_PROXY_ENTRY(0x2000C612, NotifierArray) }; EXPORT_C const TImplementationProxy* ImplementationGroupProxy(TInt& aTableCount) { aTableCount = sizeof(ImplementationTable) / sizeof(TImplementationProxy); return ImplementationTable; } // Extract class 0 SMS Message and Display on UI void CClass0SmsUINotifier::ExtractClass0SMSData(const TDesC8& aBuff) { // to extract Starting PDU position of decoded message TInt startPos=0; // to extract Ending PDU position of decoded message TINT endPos=0; // Is it Last message TBool isLastMessage = EFalse; RDesReadStream readStream(aBuff); CleanupClosePushL (readStream); startPos = readStream.ReadInt32L(); endPos = readStream.ReadInt32L(); isLastMessage = readStream.ReadInt32L(); // Buffer to extract SMS data TBuf<1000> smsMsg; readStream >> smsMsg; // function to display SMS Message on UI, this needs to be implemented.. DisplayClass0SMSDataOnUI(smsMsg); }
Copyright ©2010 Nokia Corporation and/or its subsidiary(-ies).
All rights
reserved. Unless otherwise stated, these materials are provided under the terms of the Eclipse Public License
v1.0.