smsprotocols/smsstack/smsprot/Inc/smsprot.h
changeset 0 3553901f7fa8
child 14 7ef16719d8cb
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/smsprotocols/smsstack/smsprot/Inc/smsprot.h	Tue Feb 02 01:41:59 2010 +0200
@@ -0,0 +1,370 @@
+// Copyright (c) 1999-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:
+// Declares the CSmsProtocol, CSmsProtocolFamily, CSmsProvider and
+// other classes used internally by them.
+// Conditional includes
+// 
+//
+
+/**
+ @file
+ @internalAll
+*/
+
+#ifndef SMSPROT_H
+#define SMSPROT_H
+
+#include <es_sock.h>
+#include <es_prot.h>
+#include <etelmm.h>
+#include <es_ini.h>
+#include <mmlist.h>
+#include <cdblen.h>
+
+#include "smsuset.h"
+#include "smsuaddr.H"
+#include "smspcomm.h"
+#include "smspproc.h"
+#include "nbbackuprestoreint.h"
+
+class CSmsProvider;
+class CFacadeSmsReassemblyStore;
+class CSmsSegmentationStore;
+class CLogWrapper;
+class CSmsModemNotification;
+class CSmsPDURead;
+class CSmsPhoneEnumeration;
+class CSmsMessageWrite;
+class CSmsPDUDelete;
+class CSmsReadParams;
+class CSmsWriteParams;
+class CSmspWriteQueue;
+class CQueuedSmsMessage;
+class CSmspDeleteQueue;
+class CSmspSendQueue;
+class CSmsPhoneInitialization;
+class CSmsProtocolBootTimer;
+class CBackupAndRestore;
+class CSmspSetBearer;
+
+/**
+ *  CProtocolFamilyBase derived class which identifies the protocols
+ *  we can create, and provides an overidden factory method for
+ *  creating them.
+ *  @internalComponent
+ */
+class CSmsProtocolFamily : public CProtocolFamilyBase
+    {
+public:
+    static CSmsProtocolFamily * NewL();
+    TInt Install();
+    TInt Remove();
+    CProtocolBase * NewProtocolL(TUint aSockType,TUint aProtocol);
+    TUint ProtocolList(TServerProtocolDesc *& aProtocolList);
+private:
+    CSmsProtocolFamily();
+    };
+
+/**
+ *  @internalComponent
+ */
+IMPORT_C CProtocolFamilyBase* InstallSMS();	// Force export
+
+/**
+ *  The main class for this protocol which handles requests
+ *  from clients contending for services from the phone.
+ *  @internalComponent
+ */
+class CSmsProtocol : public CProtocolBase,
+                     public MSmsComm, 
+                     public MNBBackupAndRestoreObserver
+	{
+friend class CSmsProvider;
+
+public:
+    static CSmsProtocol *NewL();
+    virtual ~CSmsProtocol();
+
+// Calls from the socket server which we implement
+    CServProviderBase *NewSAPL(TUint aSocketType);
+    void InitL(TDesC& aTag);
+    void StartL(void);
+    void Identify(TServerProtocolDesc *)const;
+    
+// Calls from the socket server which we don't implement
+    virtual CHostResolvProvdBase *NewHostResolverL();
+    virtual CServiceResolvProvdBase *NewServiceResolverL();
+    virtual CNetDBProvdBase* NewNetDatabaseL();
+
+// Calls from the socket server and other protocols which we just panic
+    void BindL(CProtocolBase *aProtocol, TUint aId);
+    virtual void BindToL(CProtocolBase *aProtocol);
+    TInt Send(TDes8& aDes, TSockAddr *aTo,TSockAddr *aFrom,CProtocolBase* aSourceProtocol);
+    void Process(TDes8& aDes,TSockAddr *aFrom,TSockAddr *to,CProtocolBase* aSourceProtocol);
+    TInt GetOption(TUint aLevel,TUint aName,TDes8 &aOption,CProtocolBase* aSourceProtocol);
+    TInt SetOption(TUint aLevel,TUint aName,const TDesC8& aOption,CProtocolBase* aSourceProtocol);
+    void Error(TInt aError,CProtocolBase* aSourceProtocol);
+
+// Functions called for WAP binding or for SAP creation
+    virtual void AddSmsMessageObserverL(MSmsMessageObserver& aObserver);
+    virtual TInt BindSmsMessageObserver(MSmsMessageObserver& aObserver,const TSmsAddr& aSmsAddr);
+    virtual void RemoveSmsMessageObserver(const MSmsMessageObserver& aObserver);
+    virtual TBool SmsAddrIsAlreadyUsed(const MSmsMessageObserver* aObserver,const TSmsAddr& aSmsAddr)const;
+
+// Functions called by SAPs (e.g. WAPPROT)
+    virtual void SendSmsMessage(CSmsMessage* aSmsMessage,MSmsMessageObserver& aObserver,TUint aOptions);
+    virtual void CancelSendSmsMessage(MSmsMessageObserver& aObserver,TBool aCancelInternally=ETrue);
+    virtual void EnumeratePhone(MSmsMessageObserver& aObserver);
+    virtual void CancelEnumeratePhone(MSmsMessageObserver& aObserver);
+    
+    void WriteSmsMessage(CSmsMessage* aSmsMessage,MSmsMessageObserver& aObserver);
+    void CancelWriteSmsMessage(MSmsMessageObserver& aObserver);
+    
+    virtual void DeleteSmsMessage(CSmsMessage* aSmsMessage,MSmsMessageObserver& aObserver);
+    virtual void CancelDeleteSmsMessage(MSmsMessageObserver& aObserver);
+    virtual void ReadSmsParameters(MSmsMessageObserver& aObserver);
+    virtual void CancelReadSmsParams();
+    virtual void WriteSmsParameters(CMobilePhoneSmspList* aMobilePhoneSmspList, MSmsMessageObserver& aObserver);
+    virtual void CancelWriteSmsParams();
+
+// MSmsComm Notifications used by active objects
+    TInt ProcessMessageL(const CSmsMessage& aSmsMessage,const TSmsAddr* aOriginalSmsAddr,const CSmsMessage* aOriginalSmsMessage,TDes& aDes);
+    void DeletePDUs(const CArrayFix<TGsmSmsSlotEntry>& aSlotArray, MSmsMessageObserver* aObserver);
+    void ModemNotificationCompleted(TInt aStatus,RPhone::TModemDetection aNewState);
+    void DiskSpaceMonitorStateChange(TSmsDiskSpaceMonitorStatus aStatus);
+    void MessageSendCompleted(TInt aStatus);
+    void PhoneEnumerationCompleted(TInt aStatus);
+
+	inline RFs& FileSession();
+	inline virtual TBool ObserverIsPresent(const MSmsMessageObserver& aObserver) const;
+	const RMobilePhone::TMobilePhoneNetworkInfoV1& NetworkInfo() const;
+    TBool NetworkInfoAvailable() const;
+    // new function which deletes msg from the reassemblystore
+    // by passing them the smsmessage class
+    void DeleteSMSFromReaStoreL(const CSmsMessage& aSmsMessage);
+    void MessageReadedSuccessfully();
+    TBool AllocateLocalAddress(TSmsAddr& aAddr);
+    TInt ExternalizeEnumeratedMessagesL(CSmsProvider& aProvider,TInt& aCount);
+    static TBool IsAppPortSMS(const CSmsMessage& aSmsMessage);
+
+protected:
+    void CloseNow();
+
+private:
+    CSmsProtocol();
+    
+    TInt ObserverIndex(const MSmsMessageObserver& aObserver) const;
+    void OrderSmsMessageObserver(const MSmsMessageObserver& aObserver);
+    
+    MSmsMessageObserver* MatchSmsAddressToObserver(const TSmsAddr& aAddr);
+    MSmsMessageObserver* MatchSmsMessageToObserver(const CSmsMessage& aSmsMessage);
+    static TBool IsMatch(const TSmsAddr& aSmsAddr, const CSmsMessage& aSmsMessage);
+    static TBool MatchInformationElement(const CSmsMessage& aSmsMessage, CSmsInformationElement::TSmsInformationElementIdentifier aIeVal);
+    void MatchCompleteSmsMessagesToObserverL(MSmsMessageObserver& aObserver,CArrayFix<TInt>& aIndexArray);
+    static TBool MatchApplicationPort(const CSmsMessage& aSmsMessage,TUint aPort,TBool a16Bit);
+    
+    void NotifyMessageObservers(TInt aStatus);
+
+ 	// TODO - flag
+	TBool IsWapSMS(const CSmsMessage& smsmessage );
+
+    inline TBool ClosingDown() const;
+    inline void SetClosingDown(TBool aClosingDown);
+    void CloseNowWrap();
+    
+    void PowerUp();			// Handles modem turning on or backup finishing
+    void DoPowerUpL();
+    void PowerDown();		// Handles modem turning off or backup starting
+    void ProcessCompleteSmsMessagesL();
+    TInt CheckPoweredUp() const;
+    virtual void HandleBackupOrRestoreStartingL();
+    virtual void HandleBackupOrRestoreCompleteL();
+    void ReadConfigurableSettingsL(); // from smswap.sms.esk -> [customTimeoutSettings]
+
+private:
+    ///< Enumerated flag values for states of the protocol
+    enum TSmsProtocolFlags
+        {
+        ESmsProtocolClosingDown=0x01			///< In the process of shutting down
+        };
+    enum
+        {
+        KNumSARStoreAccessesBeforePurging=8	///< Number of accesses to the segmentation & reassembly stores before purging
+        };
+    
+    enum TSmsProtocolState
+        {
+        EPoweredDown,	///< SmsProt is not initialised and the phone is not swiched on
+        EPoweredUp		///< SmsProt is powered up, phone switched on, ready for action
+        } iState;
+
+private:
+    CArrayPtrFlat<MSmsMessageObserver> iSmsMessageObserverList;	///< List of current observers
+
+    RTelServer iTelServer;                              ///< A session with the telephony server
+    TBuf<KCommsDbSvrMaxFieldLength> iGsmTsyName;        ///< Name of the TSY
+    RMobilePhone iGsmPhone;                             ///< ETEL phone subsession for intialisation and detection events
+    RMobilePhone iEnumerationPhone;                     ///< ETEL phone subsession for enumerating the phone
+    RMobilePhone iWritePhone;                           ///< ETEL phone subsession for writing messages
+    RMobileSmsMessaging iSmsMessaging;                  ///< ETEL phone subsession for advanced messaging services
+
+    TSmsSettings iSmsSettings;                          ///< Global SMS Protocol settings
+    RMobileSmsMessaging::TMobileSmsCapsV1 iMobileSmsCaps;   // SMS messaging capabilities of the phone
+    
+    TInt iFlags;										///< Flags indicating current state of the protocol
+    
+    RFs iFs;                                            ///< A session with the file server
+    CFacadeSmsReassemblyStore* iReassemblyStore;        ///< Pointer to the reassembly store
+    TInt iNumReassemblyStoreAccesses;                   ///< Counter for number of accesses to the reassembly store
+    CSmsSegmentationStore* iSegmentationStore;          ///< Pointer to the segmentation store
+    TInt iNumSegmentationStoreAccesses;                 ///< Counter for number of accesses to the segmentation store
+    CSmsModemNotification* iSmsModemNotification;		///< Pointer to object for handling modem detection events
+    RPhone::TModemDetection iModemDetection;			///< The current modem detection state
+    
+
+    CSmsPDURead* iSmsPDURead;                           ///< Pointer to object for receiving SMS PDUs from ETEL
+
+    CSmsMonitorDiskSpace* iSmsMonitorDiskSpace;         ///< Pointer to object for monitoring of disk space
+    
+    MSmsMessageObserver*    iPhoneEnumerationObserver;  ///< Pointer to the observer of any current enumeration
+    CSmsPhoneEnumeration*   iSmsPhoneEnumeration;       ///< Pointer to object for enumerating messages on the phone
+    
+    CSmspSendQueue*     iSendQueue;                     ///< Queue of messages to send
+    CSmspWriteQueue*    iWriteQueue;                    ///< Pointer to object for writing messages to the phone
+    CSmspDeleteQueue*   iDeleteQueue;                   ///< Queue of PDUs to delete
+    
+    CSmsReadParams*    iSmsReadParams;                  ///< Pointer to object for reading SMS parameters
+    CSmsWriteParams*   iSmsWriteParams;                 ///< Pointer to object for writing SMS parameters
+    
+    CSmsPhoneInitialization*   iSmsPhoneInitialization;
+    CBackupAndRestore*         iBackupRestoreSession;
+    CSmspSetBearer*            iSetBearer;              ///< Pointer to bearer object, used by message sender but cancelled from protocol
+    CSmspReceiveMode*          iReceiveMode;            ///< Pointer to receive mode object, used by PDU reader but cancelled from protocol
+    
+    TInt iNext8BitPort;
+    TInt iNext16BitPort;
+    CSmsProtocolBootTimer*  iBootTimer;                 ///< Pointer to the CSmsProtocolBootTimer object
+    };
+
+/**
+ *  A CServProviderBase derived class providing service access points to the
+ *  SMS Protocol.
+ *  @internalComponent
+ */
+class CSmsProvider : public CServProviderBase, public MSmsMessageObserver
+	{
+public:
+    static CSmsProvider* NewL(CSmsProtocol& aProtocol);
+    virtual ~CSmsProvider();
+public:
+// pure virtuals from CServProviderBase
+    void Start();
+    void LocalName(TSockAddr& aAddr) const;
+    TInt SetLocalName(TSockAddr& aAddr);
+    void RemName(TSockAddr& aAddr) const;
+    TInt SetRemName(TSockAddr& aAddr);
+    TInt GetOption(TUint aLevel,TUint aName,TDes8& aOption) const;
+    void Ioctl(TUint aLevel,TUint aName,TDes8* aOption);
+    void CancelIoctl(TUint aLevel,TUint aName);
+    TInt SetOption(TUint aLevel,TUint aName,const TDesC8 &aOption);
+    TInt Write(RMBufChain& aBufChain, TUint aOptions, TSockAddr* aAddr=NULL);
+    TInt GetData(RMBufChain& aBufChain, TUint aLength, TUint aOptions, TSockAddr* aAddr=NULL);
+    void ActiveOpen();
+    void ActiveOpen(const TDesC8& aConnectionData);
+    TInt PassiveOpen(TUint aQueSize);
+    TInt PassiveOpen(TUint aQueSize,const TDesC8& aConnectionData);
+    void Shutdown(TCloseType aOption);
+    void Shutdown(TCloseType aOption,const TDesC8& aDisconnectionData);
+    void AutoBind();
+
+//  From MSmsMessageObserver
+    const TSmsAddr& GetLocalAddress() const;
+    void SetLocalAddress(const TSmsAddr& aSmsAddr);
+    void ModemNotificationCompleted(TInt aStatus);
+    void MessageSendCompleted(TInt aStatus);  //  aStatus is EPOC error or -(KFailureCauseOffset+failurecause)
+    TInt MessageReceived(const CSmsMessage& aSmsMessage,TDes& aDes);  //  must return EPOC error or -(KFailureCauseOffset+failurecause)
+    void EnumeratePhoneCompleted(TInt aStatus);
+    void MessageWriteCompleted(TInt aStatus, const CSmsMessage* aSmsMessage = NULL);
+    void MessageDeleteCompleted(TInt aStatus);
+    void ReadSmsParamsCompleted(TInt aStatus,CMobilePhoneSmspList* aSmspList);
+    void WriteSmsParamsCompleted(TInt aStatus);
+    virtual TBool ClientConfirmsMessage()const;
+    virtual TBool SmsAddrIsDuplicate(const MSmsMessageObserver* aObserver,const TSmsAddr& aAddr)const;
+    TInt ExternalizeEnumeratedMessagesL(TInt& aCount);
+    TInt ExternalizeMessageL(const CSmsMessage& aSmsMessage,TBool aAppend);
+
+protected:
+    CSmsProvider(CSmsProtocol& aProtocol);
+    virtual TInt SecurityCheck(MProvdSecurityChecker* aSecurityChecker);
+    void ConstructL();
+
+private:
+    TInt DoMessageReceivedL(const CSmsMessage& aSmsMessage);
+    inline static TInt NumSegments(TInt aSize);
+    void DoWriteL(const TDesC8& aData,TUint aOptions);
+    TInt ExternalizeEnumeratedMesagesL(TInt& aCount);
+    CSmsMessage* InternalizeMessageL();
+    TInt ExternalizeParametersL(const CMobilePhoneSmspList& aMobilePhoneSmspList);
+    CMobilePhoneSmspList* InternalizeParametersL();
+    
+    inline TBool ObserverAddedToProtocol() const;
+    inline void SetObserverAddedToProtocol(TBool aAdded);
+    inline TBool IoctlOutstanding() const;
+    inline void SetIoctlOutstanding(TBool aOutstanding);
+    CSmsMessage* InternalizeMessageL(	CBufSeg* aBufSeg);
+    void PopulateBufferWithPDUSlotsL(const CSmsMessage& aSmsMessage);
+    
+private:
+    ///< Enumerated flag values for current of the provider
+    enum TSmsProviderFlags
+        {
+        ESmsProviderObserverAddedToProtocol=0x01,   ///< Registered as observer of the protocol
+        ESmsProviderIoctlOutstanding=0x02           ///< Special SMS ioctl is outstanding
+        };
+
+private:
+    CSmsProtocol& iProtocol;                    ///< Reference to the SMS Protocol object
+    TSmsAddr iLocalAddress;                     ///< The local address of the access point
+    TInt iFlags;                                ///< Flags indicating current state of the provider
+    CArrayPtr<CBufSeg>* iRecvBufSegArray;       ///< Array of serialized SMS messages to be read from the socket
+    TInt iSegmentIndex;                         ///< Index of next segment of current SMS message to read
+    CBufSeg* iSendBufSeg;                       ///< SMS message segments written to the socket
+    TUint iName;                                ///< The integer "name" of the current ioctl request
+    TBool iEnumSocket;                          ///< this is enumeration client
+    TInt iNumOfEnumeratedMessages;              ///< number of enumerated segments
+    MProvdSecurityChecker* iSecurityChecker;    ///< ESOCK security checker object
+    };
+
+#include "smsprot.inl"
+
+/**
+ *  @internalComponent
+ */
+class CSmsProtocolBootTimer : public CTimer
+	{
+public:
+    static CSmsProtocolBootTimer* NewL(CSmsProtocol& aSmsProtocol);
+    virtual ~CSmsProtocolBootTimer();
+
+    void Start(const TTimeIntervalMicroSeconds32& aTimeIntervalMicroSeconds32);
+
+private:
+    CSmsProtocolBootTimer(CSmsProtocol& aSmsProtocol);
+    virtual void RunL();
+
+protected:
+    CSmsProtocol& iSmsProtocol;         ///< reference to owner CSmsProtocol object
+    };
+
+#endif // SMSPROT_H