PECengine/StorageManager2/ServerSrc/CPEngStorageFolder.h
changeset 0 094583676ce7
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/PECengine/StorageManager2/ServerSrc/CPEngStorageFolder.h	Thu Dec 17 08:41:52 2009 +0200
@@ -0,0 +1,427 @@
+/*
+* Copyright (c) 2002 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:  One Storage folder management
+*
+*/
+
+
+
+#ifndef __CPENGSTORAGEFOLDER_H__
+#define __CPENGSTORAGEFOLDER_H__
+
+//  INCLUDES
+#include <e32base.h>
+#include <bamdesca.h>
+#include "MPEngStorageFolder.h"
+#include "TPEngStorageServerBTreeKeys.h"
+#include "TPEngStorageServerMessages.h"
+
+// FORWARD DECLARATIONS
+class CPEngRequestHandler;
+class RPEngMessage;
+class RFs;
+class CPEngSessionSlotState;
+class CPEngSessionSlotEvent;
+
+/**
+ *  One Storage folder management
+ *  Manages data in one storage folder
+ *
+ *  @since 3.0
+ */
+class CPEngStorageFolder : public CObject,
+            public MPEngStorageFolder
+    {
+    public:  // Constructors and destructor
+
+        /**
+         * Two-phased constructor.
+         */
+        static CPEngStorageFolder* NewL( RFs& aFs,
+                                         const TDesC& aTempFolder,
+                                         RBuf16& aCommBuff );
+
+        /**
+         * Two-phased constructor.
+         */
+        static CPEngStorageFolder* NewLC( RFs& aFs,
+                                          const TDesC& aTempFolder,
+                                          RBuf16& aCommBuff );
+
+        /**
+         * Destructor.
+         */
+        virtual ~CPEngStorageFolder();
+
+    public:	// Overwritten virtual functions of the CObject
+
+        /**
+         *	Close reference to this reference counted object
+         *	if state of folder is active, do not delete it
+         *
+         *  @since 3.0
+         */
+        void Close ();
+
+    public: // new from MPEngStorageFolder
+
+        /**
+         * Get data entry
+         * @see MPEngStorageFolder
+         */
+        CPEngDataEntry* DataEntryL( const TDesC& aSId );
+
+
+    public:	// New functions used by the Server
+
+        /**
+         *	Session slot state
+         *
+         *  @since 3.0
+         *  @return returns session slot state
+         */
+        CPEngSessionSlotState& SessionSlotState();
+
+        /**
+         *	Set Session slot state
+         *	Ownership of the parameter is transfered
+         *
+         *  @since 3.0
+         *  @param	aState state of session, ownership is transfered
+         */
+        void SetSessionSlotState( CPEngSessionSlotState& aState );
+
+        /**
+         *	Set Session Slot base folder
+         *	Ownership of the parameter is transfered
+         *
+         *  @since 3.0
+         *  @param	aFolder des buffer with the base folder
+         *			ownership is transfered
+         */
+        void SetSessionFolder( HBufC& aFolder );
+
+        /**
+         *	Commited folder session state update
+         *	It does necessary cleaning of the folder
+         *
+         *  @since 3.0
+         */
+        void CommiteStateUpdate();
+
+
+    public: // New Functions of Storage Engine
+
+        /**
+          *	Store store entry into the store
+          *
+         *	@since 3.0
+         *	@param aMessage message from client, which carries
+         *		Store ID, store type and buffer of store entry
+         *	@param aNotifyActive flag if notification is active
+         *		if ETrue, change if notified to listeners
+         *	@return data entry which was stored
+         */
+        const CPEngDataEntry* WriteStoreEntryL(
+            const RPEngMessage& aMessage,
+            TBool aNotifyActive,
+            TUint32 aSessionId,
+            TInt aSubSessionId );
+
+        /**
+          *	Read store entry from the store
+          *
+         *	@since 3.0
+         *	@param aMessage message from client, which carries
+         *		Store ID, store type and buffer of store entry
+         */
+        void ReadStoreEntryL( const RPEngMessage& aMessage );
+
+        /**
+         *	Get store entry length
+         *
+         *	@since 3.0
+         *	@param aMessage message from client, which carries
+         *		Store ID, store type
+         */
+        void GetStoreEntryLengthL( const RPEngMessage& aMessage );
+
+        /**
+         *	Remove store entry from the store
+         *
+         *	@since 3.0
+         *	@param aMessage message from client, which carries
+         *		Store ID, store type
+         */
+        void RemoveStoreEntryL( const RPEngMessage& aMessage );
+
+        /**
+         *	Lock store entry in the store
+         *
+         *	@since 3.0
+         *	@param aMessage message from client, which carries
+         *		Store ID, store type
+         */
+        void LockStoreEntryL( const RPEngMessage& aMessage,
+                              TUint32 aSessionId,
+                              TInt aSubSessionId );
+
+        /**
+         *	Un Lock store entry in the store
+         *
+         *	@since 3.0
+         *	@param aMessage message from client, which carries
+         *		Store ID, store type
+         */
+        const CPEngDataEntry* UnlockStoreEntryL(
+            const RPEngMessage& aMessage,
+            TBool aNotifyActive,
+            TUint32 aSessionId,
+            TInt aSubSessionId );
+
+        /**
+         *	Un Lock store entry in the store
+         *
+         *	@since 3.0
+         *	@param aMessage message from client, which carries
+         *		Store ID, store type
+         */
+        void IsStoreEntryLockedL( const RPEngMessage& aMessage );
+
+    public: // New Functions of Notification Engine
+
+        /**
+         *	Start listening of defined Storage IDs
+         *
+         *	@since 3.0
+         *	@param aMessage message with request details
+         *	@param aSessionId Session ID
+         *	@param aSubSessionId Sub Session ID
+         */
+        void ListenSIDsChangesL( const RPEngMessage& aMessage,
+                                 TUint32 aSessionId,
+                                 TInt aSubSessionId );
+
+        /**
+          *	Update Listen Storage IDs Request handler with new SIDs
+         *
+         *	@since 3.0
+         *	@param aMessage message with request details
+         *	@param aSessionId Session ID
+         *	@param aSubSessionId Sub Session ID
+         */
+        void UpdateListenSIDsScoutL( const RPEngMessage& aMessage,
+                                     TUint32 aSessionId,
+                                     TInt aSubSessionId );
+
+        /**
+         *	Fetch Changed Storage IDs Indexes
+         *
+         *	@since 3.0
+         *	@param aMessage message with request details
+         *	@param aSessionId Session ID
+         *	@param aSubSessionId Sub Session ID
+         */
+        void FetchChangedIdsIndexesL( const RPEngMessage& aMessage,
+                                      TUint32 aSessionId,
+                                      TInt aSubSessionId );
+
+        /**
+          *	Reload Asynchronou request with new Message( TRequestStatus)
+          *
+         *	@since 3.0
+         *	@param aMessage message with request details
+         *	@param aSessionId Session ID
+         *	@param aSubSessionId Sub Session ID
+         */
+        void ReloadAsyncScoutL( const RPEngMessage& aMessage,
+                                TUint32 aSessionId,
+                                TInt aSubSessionId );
+
+
+        /**
+         *
+         *
+         *	@since 3.0
+         *	@param aSessionId Session ID
+         *	@param aSubSessionId Sub Session ID
+         */
+        void CancelSubSessionRequests( TUint32  aSessionId,
+                                       TInt aSubSessionId );
+
+        /**
+         *	Cancel defined pending asynchronous request
+         *
+         *	@since 3.0
+         *	@param aSessionId session ID
+         *	@param aSubSessionId sub-session ID
+         *	@param aRequest request to be canceled
+         */
+        void CancelRequest( const RPEngMessage& aMessage,
+                            TUint32  aSessionId,
+                            TInt aSubSessionId );
+
+        /**
+         *	Notify about change of the Storage ID, except the
+         *	session from which request came
+         *
+         *	@since 3.0
+         *	@param aMessage message with request details
+         *	@param aNotifyActive flag if notification is active
+         *		   if ETrue, change if notified to listeners
+         *	@return data entry which was stored
+         */
+        const CPEngDataEntry* NotifyChangedStorageIdL( const RPEngMessage& aMessage,
+                                                       TBool aNotifyActive );
+
+
+        /**
+         *	Notify changed SIDs to the listening clients
+         *
+         *	@since 3.0
+         *	@param aEntries
+         *	@param aSessionId
+         */
+        void NotifySIDChanges( const RPointerArray<CPEngDataEntry>& aEntries );
+
+    private: // New Private Functions of the class
+
+        /**
+          *	Find Request Handler
+          *
+          *	@since 3.0
+          * 	@param aSessionId Session ID
+          *	@param aSubSessionId Sub Session ID
+          *	@param aFunction request function
+          *	@return pointer to Request Handler it it exists or NULL
+          */
+        CPEngRequestHandler* FindRequestHandler(
+            TUint32 aSessionId,
+            TInt aSubSessionId,
+            TPEngStorageServerMessages aFunction );
+
+        /**
+         *	Get Store Entry instance
+         *	If request store Entry does not exists, it will be created
+         *
+         *	@since 3.0
+         *	@param aMessage clients message with Store ID and store type
+         *	@param aCreateIfNotPressent flag if store entry shall be
+         *			created if it does not exists ( ETrue = Yes )
+         *	@return pointer to the Data entry
+         */
+        CPEngDataEntry* GetStoreEntryL( const RPEngMessage& aMessage,
+                                        TBool aCreateIfNotPressent,
+                                        TBtreePos& aPos,
+                                        TBool aTrueSearch = EFalse );
+
+        /**
+         *	Load Store entry and add it to the tree
+         *	If store entry does not exists in the store, created it
+         *	if flag is switched on
+         *
+         *	@since 3.0
+         *	@param aKey key of the Storage Entry
+         *	@param aCreateIfNotPressent flag if store entry shall be
+         *			created if it does not exists ( ETrue = Yes )
+         * 	@return pointer to the Data entry
+         */
+        CPEngDataEntry* LoadStoreEntryL( TDesC& aKey,
+                                         TBool aCreateIfNotPressent,
+                                         TBtreePos& aPos,
+                                         const RPEngMessage& aMessage );
+
+        /**
+         * Notify observer that all observer SIds changed
+         *
+         * @since 3.0
+         */
+        void NofifyAllAboutAll();
+
+        /**
+         * Look in buffered data entries
+         *
+         */
+        CPEngDataEntry* CheckBufferedDataEntries( const TDesC& aKey );
+
+        /**
+         * Add buffered data entry pointer
+         */
+        void AddBufferedDataEntry( CPEngDataEntry* aDataEntry );
+
+    private:  // New private Functions of the class
+        /**
+         *	Clean B tree from all entries
+         *	It will remove all entries from the B tree
+         *
+         *	@since 3.0
+         */
+        void CleanTreeFromAllEntriesL();
+
+    private:
+
+        /**
+         * C++ default constructor.
+         */
+        CPEngStorageFolder( RFs& aFs,
+                            const TDesC& aTempFolder,
+                            RBuf16& aCommBuff );
+
+        /**
+         * Symbian 2nd phase constructor
+         */
+        void ConstructL();
+
+    private:    // Data
+
+        /// REF: File server, owned by the server class
+        RFs&											iFs;
+
+        /// REF: Temp folder of the Storage
+        const TDesC&									iTempFolder;
+
+        /// REF: buffer used for communication, to minimize
+        RBuf16&											iBuffer;
+
+
+        /// OWN: Folder name, Hashed
+        HBufC*											iSessionFolder;
+
+        /// OWN: Session slot state, also has session Identification
+        CPEngSessionSlotState*							iSessionState;
+
+        /// OWN: B-tree with cached entries
+        TBtreeFix<CPEngDataEntry*, TDesC*>				iDataEntryTree;
+
+        /// OWN: Key for ordering of B-tree of cached entries
+        TPEngDataEntryKey								iDataEntryTreeKey;
+
+        /// OWN: Handles memory management for B-Tree
+        CMemPagePool*									iPool;
+
+        /// OWN: Flag if B-tree is connected
+        TBool											iTreeConnected;
+
+        /// OWN: Container with the Observers, owned and also members are owned
+        CObjectCon*										iObservers;
+
+        /// REF: Last used data entries
+        CPEngDataEntry*									iBuffDataEntry0;
+        CPEngDataEntry*									iBuffDataEntry1;
+        CPEngDataEntry*									iBuffDataEntry2;
+    };
+
+#endif      // __CPENGSTORAGEFOLDER_H__
+
+// End of File