diff -r 666f914201fb -r 2fe1408b6811 epoc32/include/gsmustor.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/epoc32/include/gsmustor.h Tue Mar 16 16:12:26 2010 +0000 @@ -0,0 +1,525 @@ +// 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 the License "Symbian Foundation License v1.0" to Symbian Foundation members and "Symbian Foundation End User License Agreement v1.0" to non-members +// which accompanies this distribution, and is available +// at the URL "http://www.symbianfoundation.org/legal/licencesv10.html". +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// Declares the classes TSAREntry and CSARStore +// Abbreviations: +// PDU - Packet Data Unit +// SAR - Segmentation and Reassembly Store +// SR - Status Report +// +// + + + +/** + @file +*/ + +#ifndef GSMUSTOR_H__ +#define GSMUSTOR_H__ + +#include +#include +#include +#include +#include + +/** + * Filestore second UID for SAR stores. + * @publishedAll + * @released + */ +const TUid KSARStoreUid={0x1000089d}; + +// +// forward declarations +// +class RReadStream; +class RWriteStream; + +/** + * Provides generic information useful for the segmentation and reassembly of + * SMS messages and reassembly of WAP datagrams. + * + * The constituent parts of both concatenated SMS messages and concatenated 7-bit + * WAP datagrams contain a reference, the total number of parts and the index + * of the part in the complete message or datagram. + * + * Field for the segmentation store are: + * + * Reference - concatenation reference + * Total - total number of PDUs in SMS message + * Count - number of PDUs sent + * Data1 - total PDUs delivered<<16 and failed + * Data2 - log server id + * Data3 - validity period + * Data4 - type and min and max message reference + * Description1 - first 32 characters from buffer + * Description2 - original address + * Time - time on SMS message + * + * Abstracts an entry which is stored in the CSARStore + * + * The data stored in Data1-4 has a different meaning depending on if it is used + * by the Reassembly store or the Segmentation store. The lists below detail + * the uses: + * + * Reassembly store: + * + * Data1: byte 3: bits7to4; byte 1: identifier1; byte 0: identifier2. + * + * Data2: Log server ID. + * + * Data3: byte 0: PDU type. + * + * Data4: SMS message storage . + * + * Segmentation store: + * + * Data1: bytes 3, 2: N delivered; byte 1,0 N failed. + * + * Data2: Log server ID. + * + * Data3: SMS submit validity period. + * + * Data4: byte 3,2 message PDU type; byte 1: reference1; byte 0: reference2. + * + * WAP reassembly store: + * + * Data1: to port. + * + * Data2: not used . + * + * Data3: not used. + * + * Data4: not used. + * + *
+ *  
+ *  The data stored in Data1-4 has a different meaning depending on if it is used
+ *  by the Reassembly store or the Segmentation store. The tables below detail
+ *  the uses:
+ *  
+ *  Reassembly Store:
+ *  
+ *  -----------------------------------------------------------------
+ *  |  member |    3      |      2      |      1      |      0      |
+ *  -----------------------------------------------------------------
+ *  | iData1  |    bits7to4             | identifier1 | identifier2 |
+ *  | iData2  |                   Log server ID                     |
+ *  | iData3  |                                       | PDU type    |
+ *  | iData4  |                 SMS message storage                 |
+ *  -----------------------------------------------------------------
+ *  
+ *  Segmentation Store:
+ *  
+ *  -----------------------------------------------------------------
+ *  |  member |    3      |      2      |      1      |      0      |
+ *  -----------------------------------------------------------------
+ *  | iData1  |    N delivered          |         N failed          |
+ *  | iData2  |                   Log server ID                     |
+ *  | iData3  |              SMS submit validity period             |
+ *  | iData4  |   message PDU type      | reference1  | reference2  |
+ *  -----------------------------------------------------------------
+ *  
+ *  WAP Reassembly Store:
+ *  
+ *  -----------------------------------------------------------------
+ *  |  member |    3      |      2      |      1      |      0      |
+ *  -----------------------------------------------------------------
+ *  | iData1  |                    to port                          |
+ *  | iData2  |                   not used                          |
+ *  | iData3  |                   not used                          |
+ *  | iData4  |                   not used                          |
+ *  -----------------------------------------------------------------
+ *  
+ *  
+ * + * @publishedAll + * @released + * + */ +class TSAREntry + { +public: + enum + { + ESmsSAREntryDescriptionLength=32 + }; +public: + IMPORT_C TSAREntry(); + inline TInt Reference() const; + inline void SetReference(TInt aReference); + inline TInt Total() const; + inline void SetTotal(TInt aTotal); + inline TInt Count() const; + inline void SetCount(TInt aCount); + inline TBool IsComplete() const; + + /** + * Gets the Log server ID field. + * + * @return Log server ID field + */ + inline TInt LogServerId() const {return iData2;} + /** + * Sets the Log server ID field. + * + * @param aId Log server ID field + */ + inline void SetLogServerId(TInt aId) {iData2 = aId;} + + inline TPtrC Description1() const; + inline void SetDescription1(const TDesC& aDescription); + inline TPtrC Description2() const; + inline void SetDescription2(const TDesC& aDescription); + + inline TInt Data3() const; + inline void SetData3(TInt aData); + + inline const TTime& Time() const; + inline void SetTime(const TTime& aTime); + + inline TStreamId DataStreamId() const; + inline void SetDataStreamId(TStreamId aStreamId); + + IMPORT_C void InternalizeL(RReadStream& aStream); + IMPORT_C void ExternalizeL(RWriteStream& aStream) const; + +private: + inline TBool IsDeleted() const; + inline void SetIsDeleted(TBool aIsDeleted); + inline TBool IsAdded() const; + inline void SetIsAdded(TBool aIsAdded); + +private: + enum TSAREntryFlags + { + ESAREntryIsDeleted=0x01, ///< indicates that this entry is deleted + ESAREntryIsAdded=0x02 ///< indicated that this entry is added + }; +private: + TInt iReference; ///< concatenation reference + TInt iTotal; ///< total number of PDUs in this SMS message + TInt iCount; ///< number of PDUs sent/received for this SMS message +protected: + TInt iData1; /// TODO should be TUint32 + TInt iData2; ///< Log server ID + TInt iData3; + TInt iData4; +private: + TBuf iDescription1; ///< first 32 characters from buffer + TBuf iDescription2; ///< original address + TTime iTime; ///< time when message was sent/received + TStreamId iDataStreamId; + TInt iFlags; // Not externalized + friend class CSARStore; + friend class CSmsPermanentFileStore; + friend class CPreallocatedFile; + }; + + +/** + * Abstraction of an SMS reassembly store entry for incoming SMS messages. + * + * This class should reflect parts of a complete SMS message to be stored in + * the reassembly store. + * @publishedAll + * @released + */ +class TSmsReassemblyEntry : public TSAREntry + { +private: + enum + { + KMarkedAsPassedToClientFlag = 0x80000000, + KPduTypeMask = 0xFF, + KReassemblyEntryClear = 0x00 + }; + +public: + // iData1 + /** + * Gets bits 7 to 4 from Data1 field. + * + * @return Bits 7 to 4 of Data 1 + */ + inline TInt Bits7to4() const {return (iData1 >> 16) & 0xffff;} + /** + * Gets Identifier1 from Data1 field. + * + * @return Identifier1 + */ + inline TInt Identifier1() const {return (iData1 >> 8) & 0xff;} + /** + * Gets Identifier2 from Data1 field. + * + * @return Identifier2 + */ + inline TInt Identifier2() const {return (iData1 >> 0) & 0xff;} + inline void SetBits7to4andIdentifiers(TInt aBits7to4, TInt aId1, TInt aId2) + /** + * Sets bits 7 to 4, Identifier1, and Identifier2, in Data1 field. + * + * @param aBits7to4 Bits 7 to 4 + * @param aId1 Identifier1 + * @param aId2 Identifier2 + */ + {iData1 = (TInt)((aBits7to4 << 16) | ((aId1 & 0xff)<< 8) | (aId2 & 0xff)); } + + // iData3 + /** + * Gets PDU type. + * + * @return PDU type + */ + inline CSmsPDU::TSmsPDUType PduType() const {return (CSmsPDU::TSmsPDUType)(iData3 & 0xff);} // 8 bits + /** + * Sets PDU type. + * + * @param aPduType PDU type + */ + inline void SetPduType(CSmsPDU::TSmsPDUType aPduType) {iData3 = (iData3 & ~KPduTypeMask) | (TInt)(aPduType & KPduTypeMask);} + + /** + * Tests if Passed To Client flag is set. + * + * @return True if Passed To Client flag is set. + */ + inline TBool PassedToClient() const {return (iData3 & KMarkedAsPassedToClientFlag) ? ETrue:EFalse;} + /** + * Sets Passed To Client flag. + * + * @param aPassed True if Passed To Client flag is set. + */ + inline void SetPassedToClient(TBool aPassed) {iData3 = (iData3 & ~KMarkedAsPassedToClientFlag) | (aPassed ? KMarkedAsPassedToClientFlag : KReassemblyEntryClear);} + + // iData4 + /** + * Gets storage information. + * + * @return Storage information + */ + inline CSmsMessage::TMobileSmsStorage Storage() const {return (CSmsMessage::TMobileSmsStorage)(iData4 & 0xff);} + /** + * Sets storage information. + * + * @param aStorage Storage information + */ + inline void SetStorage(CSmsMessage::TMobileSmsStorage aStorage) {iData4 = (CSmsMessage::TMobileSmsStorage)aStorage;} + }; + + +/** + * Abstraction of an SMS segmentation store entry for outgoing SMS messages. + * + * This class should reflect parts of a complete SMS message to be stored in + * the segmentation store. + * @publishedAll + * @released + */ +class TSmsSegmentationEntry : public TSAREntry + { +public: + // iData1 + /** + * Gets number of delivered PDUs. + * + * @return Number of delivered PDUs + */ + inline TInt Delivered() const {return (iData1 >> 16);} + /** + * Gets number of permanently failed PDUs. + * + * @return Number of permanently failed PDUs + */ + inline TInt Failed() const {return (iData1 & 0xffff);} + inline void SetDeliveredAndFailed(TInt aDelivered, TInt aFailed) + /** + * Sets the number of delivered and failed PDUs. + * + * @param aDelivered Number of delivered PDUs + * @param aFailed Number of permanently failed PDUs + */ + {iData1 = ((aDelivered << 16) | (aFailed & 0xffff));} + + // iData3 + /** + * Gets the Validity Period. + * + * @return Validity Period + */ + inline TInt ValidityPeriod() const {return (iData3); } + /** + * Sets the Validity Period. + * + * @param aValPer Validity Period + */ + inline void SetValidityPeriod(TInt aValPer) {iData3 = aValPer; } + + // iData4 + /** + * Tests if a status report is expected. + * + * @return True if a status report is expected + */ + inline TBool ExpectStatusReport() const {return (((iData4 >> 24) & 0x01) == 0x01); } + /** + * Gets the type of the PDU. + * + * @return Type of the PDU + */ + inline CSmsPDU::TSmsPDUType PduType() const {return (CSmsPDU::TSmsPDUType)((iData4 >> 16) & 0xff); } + /** + * Gets the message reference (low byte). + * + * @return Message reference (low byte) + */ + inline TInt Reference1() const {return ((iData4 >> 8) & 0xff); } + /** + * Gets the message reference (high byte). + * + * @return Message reference (high byte) + */ + inline TInt Reference2() const {return ((iData4 >> 0) & 0xff); } + inline void SetPduTypeAndRefs(TBool aSR, TInt aPduType, TInt aRef1, TInt aRef2) + /** + * Sets status report flag, PDU type, and message references. + * + * @param aSR True if a status report is expected + * @param aPduType Type of the PDU + * @param aRef1 Message reference (low byte) + * @param aRef2 Message reference (high byte) + */ + {iData4 = (((aSR & 0x01) << 24) | (aPduType << 16) | ((aRef1 & 0xff ) << 8) | (aRef2 & 0xff));} + }; + + +/** + * Abstraction of a WAP reassembly store entry. + * This class should reflect a complete WAP message. + * @publishedAll + * @released + */ +class TWapReassemblyEntry : public TSAREntry + { +public: + /** + * Gets the destination port number. + * + * @return Destination port number + */ + inline TInt ToPort() const {return iData1;} + /** + * Sets the destination port number. + * + * @param aToPort Destination port number + */ + inline void SetToPort(TInt aToPort){iData1 = aToPort;} + }; + +/** + * Controls the segmentation and reassembly (SAR) store, used for SMS segmentation + * and reassembly, and WAP reassembly. + * @publishedAll + * @released + */ +class CSARStore : public CBase + { +public: + IMPORT_C void OpenL(const TDesC& aFullName,const TUid& aThirdUid); + IMPORT_C void Close(); + IMPORT_C void CompactL(); + + IMPORT_C const CArrayFix& Entries() const; + IMPORT_C void PurgeL(const TTimeIntervalMinutes& aTimeIntervalMinutes,TBool aPurgeIncompleteOnly); + IMPORT_C void PurgeL(TInt aKSegmentationLifetimeMultiplier,TBool aPurgeIncompleteOnly); + IMPORT_C void DeleteEntryL(TInt aIndex); + + IMPORT_C void BeginTransactionLC(); + IMPORT_C void CommitTransactionL(); //Pops this off this cleanup stack and commits iFileStore + void Revert(); + + inline RFs& FileSession() const; + inline TBool InTransaction()const; + IMPORT_C void DoOpenL(); + IMPORT_C void PrivatePath(TDes& aPath); + + +protected: + IMPORT_C CSARStore(RFs& aFs); + IMPORT_C ~CSARStore(); + + IMPORT_C CFileStore& FileStore(); + IMPORT_C const CFileStore& FileStore() const; + + IMPORT_C void AddEntryL(const TSAREntry& aEntry); + IMPORT_C void ChangeEntryL(TInt aIndex,const TSAREntry& aNewEntry); + + IMPORT_C TStreamId ExtraStreamId() const; + IMPORT_C void SetExtraStreamIdL(const TStreamId& aExtraStreamId); + +private: + void DoDeleteEntryL(TInt aIndex); // Deletes stream but doesn't call iFileStore->CommitL() + void InternalizeEntryArrayL(); + void ExternalizeEntryArrayL(); + void DoCommitAndCompactL(); + void RemoveDeletedEntries(); + void ReinstateDeletedEntries(); + +private: + enum + { + KNumStoreCommitsBeforeCompaction=16 + }; + +protected: + RFs& iFs; ///< File server handle. +private: + + CFileStore* iFileStore; ///< pointer to the file store + CArrayFixFlat iEntryArray; ///< array of SAR entries + TStreamId iExtraStreamId; ///< used for any other data that needs persisting + TInt iCommitCount; ///< counts number of Commit's - used for CompactL + TPtrC iFullName; ///< holds the name of the File Store + TUid iThirdUid; + TBool iInTransaction; ///< For debugging purposes to ensure only one transaction at a time + }; + +/** + * Closes all SAR stores if a backup event starts. + * + * This is internal and not intended for use. + * @publishedAll + * @released + */ +class CGsmuBackupObserver : public CBase, MBackupOperationObserver + { + public: + IMPORT_C static CGsmuBackupObserver* NewL(); + IMPORT_C ~CGsmuBackupObserver(); + IMPORT_C void AddSARStoreL(CSARStore& aSARStore); + IMPORT_C void RemoveSARStore(const CSARStore& aSARStore); + + private: + CGsmuBackupObserver(); + void ConstructL(); + void HandleBackupOperationEventL(const TBackupOperationAttributes& aBackupOperationAttributes); + + CBaBackupSessionWrapper* iBackup; + RPointerArray iSARStores; + }; + +#include "gsmustor.inl" + +#endif // !defined GSMUSTOR_H__