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