mpx/collectionframework/collectionengine/inc/mpxcollectioncache.h
changeset 0 a2952bb97e68
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mpx/collectionframework/collectionengine/inc/mpxcollectioncache.h	Thu Dec 17 08:55:47 2009 +0200
@@ -0,0 +1,184 @@
+/*
+* Copyright (c) 2007 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:  Generic collection cache
+*
+*/
+
+
+#ifndef MPXCOLLECTIONCACHE_H
+#define MPXCOLLECTIONCACHE_H
+
+// INCLUDES
+#include <e32std.h>
+#include <e32base.h>
+#include <mpxitemid.h>
+
+// CLASS FORWARDS
+class CMPXMedia;
+class CMPXCollectionPath;
+class TMPXAttribute;
+class CMPXCollectionCacheNode;
+
+/**
+*  The collection cache stores information already retrieved by clients so it can be
+*  returned immediately if requested again. The information is stored in a tree
+*  structure, where each tree node corresponds to a path node. When information is
+*  requested, the path is mapped against the tree and if a corresponding node exists the
+*  results are returned from cache.
+*
+*  The cache can be limited in size, if the client defines a maximum size, lower priority
+*  nodes are discarded to make room for new information. The criteria considered when
+*  discarding nodes include: priority value (specified by the client), path level and
+*  time of addition.
+*
+*  @lib mpxcollectionengine.lib (not exported)
+*/
+NONSHARABLE_CLASS(CMPXCollectionCache) :
+    public CBase
+    {
+public:
+    /**
+    *  Two-phased constructor.
+    *  @param aMaximumSizeRatio maximum cache size in percentage ratio
+    *         If not specified the cache does not have a limit
+    *  @return Constructed object
+    */
+    static CMPXCollectionCache* NewL(TInt aMaximumSizeRatio = -1);
+
+    /**
+    *  Destructor
+    */
+    virtual ~CMPXCollectionCache();
+
+public:
+    /**
+    *  Cache entry priority values. Entries with lower priority will be discarded
+    *  sooner than the ones with higher priority.
+    */
+    enum TCachePriority
+        {
+        EPriorityLow,
+        EPriorityNormal,
+        EPriorityHigh
+        };
+
+public:
+    /**
+    *  Adds a result set to the cache.
+    *  @param aPath path defining the context of the results.
+    *  @param aAttrs attributes requested by the client application and included in
+    *         the result set.
+    *  @param aResults result set corresponding to the path.  Not owned.
+    *  @param aNotCacheableAttrs attributes that are not cacheable
+    *  @param aMediaFromOpenL whether or not this media was from an OpenL
+    *  @param aPriority result set priority
+    *  @return CMPXMedia object in the cache or the original object if add failed
+    */
+    CMPXMedia* AddL(
+        const CMPXCollectionPath& aPath, 
+        const TArray<TMPXAttribute>& aAttrs,
+        CMPXMedia& aResults, 
+        TBool aMediaFromOpenL = EFalse,
+        TCachePriority aPriority = EPriorityNormal );
+
+    /**
+    *  Returns the information corresponding to the specified path and attribute set
+    *  if available in the cache.
+    *  @param aPath path defining the information context.
+    *  @param aAttrs attribute set requested by the client.
+    *  @return Valid results or NULL if the path/attribute set specified cannot be
+    *          found in the cache.
+    */
+    CMPXMedia* GetL(
+        const CMPXCollectionPath& aPath,
+        const TArray<TMPXAttribute>& aAttrs,
+        TBool aMediaFromOpenL = EFalse );
+
+    /**
+    *  Removes the specified path and all its children from the cache.
+    *  @param aPath path defining the context to be removed.
+    */
+    void RemoveL(const CMPXCollectionPath& aPath);
+
+    /**
+    * Resets cache and removes all nodes
+    */
+    void Reset();
+
+    /**
+    * Handle some change from the collection
+    * @param aCollectionId collectoin that the change is comming from
+    * @param aChangeItemId item ID of the changed event
+    */
+    void HandleChangeL( TUid aCollectionId, TMPXItemId aChangeItemId );
+    
+private:
+
+    /**
+    *  C++ constructor
+    *  @param aMaximumSizeKb maximum cache size in percentage ratio.
+    */
+    CMPXCollectionCache(TInt aMaximumSizeRatio);
+
+    /**
+    *  2nd phase contructor
+    */
+    void ConstructL();
+
+    /**
+    *  Returns the cache node corresponding to the specified path.
+    *  @param aPath path to be looked up in the cache.
+    *  @param aCreateNodes if ETrue all the missing nodes for the specified
+    *         path will be created if they do not already exist. If EFalse
+    *         the method returns NULL if corresponding node is not found.
+    *  @return valid cache node if found or created, NULL if not found.
+    */
+    CMPXCollectionCacheNode* NodeFromPathL(const CMPXCollectionPath& aPath,
+        TBool aCreateNodes = EFalse);
+        
+    /**
+    *  Removes a specified node and all its children from the cache.
+    *  @param aNode node to be removed.  Ownership is transferred.
+    */
+    void RemoveNode(CMPXCollectionCacheNode* aNode);
+    
+    /**
+    *  Checks the memory condition and clears cache to free some memory
+    *  maximum percentage ratio specified in the constructor is used to detect
+    *  low memory condition
+    *  @return EFalse if low memory condition detected, ETrue otherwise 
+    */
+    TBool ManageCacheSizeL();
+
+#ifdef _DEBUG
+    /**
+    *  Prints the cache tree.
+    */
+    void PrintTree( TBool aPrintAtts = EFalse );
+#endif
+    
+private:
+    /**
+    *  Root node for the cache tree, created when the cache is created.
+    */
+    CMPXCollectionCacheNode* iRoot;
+
+    /**
+    *  Maximum size of the cache in percentage ratio, specified by the client.
+    */
+    TInt iMaximumSizeRatio;
+    };
+
+#endif // MPXCOLLECTIONCACHE_H
+