ncdengine/provider/server/inc/ncdnodefolder.h
changeset 0 ba25891c3a9e
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/ncdengine/provider/server/inc/ncdnodefolder.h	Thu Dec 17 08:51:10 2009 +0200
@@ -0,0 +1,343 @@
+/*
+* Copyright (c) 2006 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:   Contains CNcdNodeFolder class
+*
+*/
+
+
+#ifndef NCD_NODE_FOLDER_H
+#define NCD_NODE_FOLDER_H
+
+
+#include <e32cmn.h>
+
+#include "ncdnodeimpl.h"
+
+class CNcdNodeIdentifier;
+class CNcdChildEntity;
+class CNcdNodeFolderLink;
+class CNcdNodeSeenFolder;
+
+
+/**
+ *  ?one_line_short_description
+ *
+ *  ?more_complete_description
+ *
+ *  @lib ?library
+ *  @since S60 ?S60_version *** for example, S60 v3.0
+ */
+class CNcdNodeFolder : public CNcdNode
+    {
+    
+public:
+
+    /**
+     * NewL
+     *
+     * @return CNcdNodeFolder* Pointer to the created object 
+     * of this class.
+     */
+    static CNcdNodeFolder* NewL( CNcdNodeManager& aNodeManager,
+                                 const CNcdNodeIdentifier& aIdentifier );
+    
+    /**
+     * NewLC
+     *
+     * @return CNcdNodeFolder* Pointer to the created object 
+     * of this class.
+     */
+    static CNcdNodeFolder* NewLC( CNcdNodeManager& aNodeManager,
+                                  const CNcdNodeIdentifier& aIdentifier );
+
+
+    /**
+     * Destructor
+     */
+    virtual ~CNcdNodeFolder();
+
+
+    /** 
+     * Getter for child count.
+     * 
+     * @note This is the count of children in the child array, not the expected
+     * child count that comes from server!
+     */
+    virtual TInt ChildCount() const;
+
+    /**
+     * Returns the child node by the given index.
+     *
+     * @note Returns the available children, can be indexed against ChildCount
+     */
+    virtual const CNcdNodeIdentifier& ChildL( TInt aIndex ) const;
+    
+    /**
+     * Returns the whole child array.
+     */
+    const RPointerArray<CNcdChildEntity>& ChildArray() const;
+    
+    /** 
+     * Getter for server child count.
+     * 
+     * Uses CNcdNodeFolderLink::ExpectedChildrenCount
+     *
+     * @exception KErrNotFound if link not set.
+     */
+    virtual TInt ServerChildCountL() const;
+    
+    /** 
+     * Getter for child identifier by server child index.
+     *
+     * Indexed against ServerChildCountL. Some children may be unavailable
+     * because of paging, so this function should be used with care.
+     *
+     * @param aIndex The index of the child (i.e. index on server).
+     * @return Child identifier for the given index.
+     * @exception KErrNotFound if the child entity is not found.
+     */
+    virtual const CNcdNodeIdentifier& ChildByServerIndexL( TInt aIndex ) const;
+    
+    /** 
+     * Getter for child entity by server child index.
+     *
+     * Indexed against ServerChildCountL. Some children may be unavailable
+     * because of paging, so this function should be used with care.
+     *
+     * @param aIndex The index of the child (i.e. index on server).
+     * @return Child entity for the given index.
+     * @exception KErrNotFound if the child entity is not found.
+     */
+    virtual const CNcdChildEntity& ChildEntityByServerIndexL( TInt aIndex ) const;
+    
+    
+    
+    /**
+     * Adds a child to this folder if not present already.
+     *
+     * @param aNodeIdentifier Identifier of the node.
+     * @param aIndex Index of the child node (i.e. index of the actual node on server)
+     * @param aTransparent Defines whether this child is transparent.
+     * @param aNodeType Type of the child node (folder, item etc.).
+     * @return ETrue if the child was added. Else EFalse (children
+     * are inserted only once).
+     */
+    virtual TBool ReplaceChildL( 
+        const CNcdNodeIdentifier& aNodeIdentifier,
+        TInt aIndex,
+        TBool aTransparent,
+        CNcdNodeFactory::TNcdNodeType aNodeType );
+    
+    virtual TBool InsertChildL( 
+        const CNcdNodeIdentifier& aNodeIdentifier,
+        TInt aIndex,
+        TBool aTransparent,
+        CNcdNodeFactory::TNcdNodeType aNodeType );
+        
+    virtual TBool AppendChildL( 
+        const CNcdNodeIdentifier& aNodeIdentifier,
+        TBool aTransparent,
+        CNcdNodeFactory::TNcdNodeType aNodeType );
+        
+    CNcdNodeFolderLink& FolderLinkL() const;
+
+    CNcdNodeSeenFolder& NodeSeenFolder() const;
+
+    void RemoveChild( const CNcdNodeIdentifier& aNodeIdentifier );
+    
+    /**
+     * Removes children from the child list and database
+     */
+    void RemoveChildrenL();
+    
+    /**
+     * Removes children only from the child list
+     */
+    void RemoveChildren();
+    
+    /**
+     * Stores current children to previous child list and sets the
+     * previous child count.
+     */
+    void StoreChildrenToPreviousListL();
+    
+    /**
+     * Stores the given child list as previous child list and sets the
+     * previous child count.
+     *
+     * @param aPreviousChildren The previous children.
+     * @param aPreviousChildCount.
+     */
+    void StoreChildrenToPreviousListL(
+        const RPointerArray<CNcdChildEntity>& aPreviousChildren,
+        TInt aPreviousChildCount );
+    
+    /**
+     * Checks that have this folder's children been loaded previously.
+     * This is needed to differentiate first time loading of the folder from
+     * consequent loads.
+     *
+     * @note Does not indicate that the children are in cache or
+     * anything else other than what is described above.
+     *
+     * @return ETrue if children have been loaded previously, EFalse otherwise.
+     */
+    TBool ChildrenPreviouslyLoaded();
+    
+    /**
+     * Setter for the children previously loaded flag.
+     *
+     * @param aChildrenPreviouslyLoaded Default value is ETrue.
+     * @note This flag should be unset only in special occaisions
+     * such as unsetting for root node on cache clear.
+     */
+    void SetChildrenPreviouslyLoaded( TBool aChildrenPreviouslyLoaded = ETrue );
+    
+    /**
+     * Getter for previous child count.
+     *
+     * @note Not persistently stored to db.
+     * @return The previous child count or KErrNotFound if not set.
+     */
+    TInt PreviousChildCount();
+    
+    /**
+     * Getter for previous child array.
+     *
+     * @note The array is not persistently stored to db.
+     * @return An array containing previous children.
+     */
+    const RPointerArray<CNcdChildEntity>& PreviousChildArray();
+    
+    
+    /**
+     * Sets folder's children as expired and removes them from the child array
+     * and deletes their metadatas from disk cache
+     */
+    void ExpireAndRemoveChildrenL();
+    
+
+public: // CNcdNode
+
+    /**
+     * @see CNcdNode::ReceiveMessage
+     */
+    virtual void ReceiveMessage( MCatalogsBaseMessage* aMessage,
+                                 TInt aFunctionNumber );
+
+
+    /**
+     * @see CNcdNode::ExternalizeL
+     */
+    virtual void ExternalizeL( RWriteStream& aStream );
+
+
+    /**
+     * @see CNcdNode::InternalizeL
+     */
+    virtual void InternalizeL( RReadStream& aStream );
+
+
+
+protected:
+
+    /**
+     * @see CNcdNode::CNcdNode
+     */
+    CNcdNodeFolder( CNcdNodeManager& aNodeManager,
+        NcdNodeClassIds::TNcdNodeClassId aNodeClassId = NcdNodeClassIds::ENcdFolderNodeClassId, 
+        NcdNodeClassIds::TNcdNodeClassId aAcceptedLinkClassId = NcdNodeClassIds::ENcdFolderNodeLinkClassId,
+        NcdNodeClassIds::TNcdNodeClassId aAcceptedMetaDataClassId = NcdNodeClassIds::ENcdFolderNodeMetaDataClassId );
+    
+    /**
+     * @see CNcdNode::ConstructL
+     */
+    virtual void ConstructL( const CNcdNodeIdentifier& aIdentifier );
+
+
+    /**
+     * @see CNcdNode::CreateLinkL
+     */
+    virtual CNcdNodeLink* CreateLinkL();
+
+
+    /** 
+     * @see CNcdNode::ExternalizeDataForRequestL
+     */
+    virtual void ExternalizeDataForRequestL( RWriteStream& aStream ) const;    
+
+
+    /**
+     * @param aStream that will contain the child array data.
+     */
+    void ExternalizeChildArrayL( RWriteStream& aStream ) const;
+
+    /**
+     * This function is required because the proxy may require different
+     * child identifiers into its array. The child classes of this class
+     * may provide its own implementation to create child arrays for proxy.
+     * This implementation uses ExternalizeChildArrayL.
+     *
+     * @param aStream that will contain the child array data.
+     */
+    virtual void ExternalizeChildArrayForRequestL( RWriteStream& aStream ) const;
+    
+    void NodeSeenFolderHandleRequestL( MCatalogsBaseMessage& aMessage ) const;  
+    
+    
+private:
+    
+    // Prevent these two if they are not implemented
+    CNcdNodeFolder( const CNcdNodeFolder& aObject );
+    CNcdNodeFolder& operator =( const CNcdNodeFolder& aObject );
+
+
+private: // data
+
+    // This array contains the identifying info of child nodes.
+    // The information can be used to get the actual node from
+    // the node manager. The identityinfo is used here instead of
+    // actual references to the nodes because the manager will
+    // handle the destruction of the nodes. Now, there is not
+    // danger for NULL pointer errors.
+    RPointerArray<CNcdChildEntity> iChildren;
+    
+    // Determines whether the previous child list has been populated.
+    // NOTE: This is not stored to db currently.
+    //TBool iPreviousChildrenStored;
+    
+    // Previous child list is stored here when refreshing folder.
+    // Nodes not found from this list are considered new.
+    // NOTE: This array is not stored to db currently.
+    RPointerArray<CNcdChildEntity> iPreviousChildren;
+    
+    // Previous child count (i.e. the server child count)
+    // KErrNotFound if not set;
+    // NOTE: This is not stored to db currently. 
+    TInt iPreviousChildCount;
+    
+    // Defines whether children of this folder have been loaded previously.
+    // This is needed to differentiate first time loading of the folder from
+    // consequent loads. This flag is persistently stored to db.
+    // NOTE: This flag does not indicate that the children are in cache or
+    // anything else other than what is described above.
+    TBool iChildrenPreviouslyLoaded;
+    
+    // Implements the seen interface of folders.
+    CNcdNodeSeenFolder* iNodeSeenFolder;
+    
+    };
+
+
+#endif // NCD_NODE_FOLDER_H