ncdengine/provider/server/inc/ncdloadnodeoperationimpl.h
changeset 0 ba25891c3a9e
child 41 0410b3201a77
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/ncdengine/provider/server/inc/ncdloadnodeoperationimpl.h	Thu Dec 17 08:51:10 2009 +0200
@@ -0,0 +1,640 @@
+/*
+* 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:  
+*
+*/
+
+
+#ifndef C_NCDLOADNODEOPERATIONIMPL_H
+#define C_NCDLOADNODEOPERATIONIMPL_H
+
+#include <e32base.h>
+
+#include "ncdbaseoperation.h"
+#include "ncdparserobserver.h"
+#include "catalogshttpobserver.h"
+#include "catalogshttptypes.h"
+#include "catalogshttpsession.h"
+#include "ncdoperationobserver.h"
+#include "ncdchildloadmode.h"
+#include "ncdnodefactory.h"
+// move content source to it's own header and include it
+// instead of root op's header
+#include "ncdloadrootnodeoperationimpl.h"
+
+//Constants.
+const TInt KNcdStructPageSize(48);
+
+
+class CDesC16Array;
+class CDesC16ArrayFlat;
+class CDesC8ArrayFlat;
+class MNcdParser;
+class CNcdNodeManager;
+class MNcdProtocol;
+class CNcdNodeIdentifier;
+class MCatalogsContext;
+class MNcdPreminetProtocolEntityRef;
+class MNcdPreminetProtocolDataEntity;
+class CNcdQuery;
+class MNcdOperationRemoveHandler;
+class MCatalogsAccessPointManager;
+class MNcdOperationQueue;
+
+
+class TNcdResponseFilterParams
+    {
+public:
+    TNcdResponseFilterParams()
+        {
+        iPageSize = 0;
+        iPageStart = 0;
+        iStructureDepth = 0;
+        iMetadataDepth = 0;
+        iMetadataPerLevel = 0;
+        }
+public:
+    TInt iPageSize;
+    TInt iPageStart;
+    TInt iStructureDepth;
+    TInt iMetadataDepth;
+    TInt iMetadataPerLevel;
+    };
+
+const TInt KNcdLoadNodeErrNothingToDo(-1000000);
+const TInt KNcdLoadNodeErrRemoteOnly(-1000001);
+
+/**
+ *  Load node operation implementation.
+ *
+ *  Handles loading nodes from server.
+ *
+ *  @lib ?library
+ *  @since S60 ?S60_version *** for example, S60 v3.0
+ */
+class CNcdLoadNodeOperationImpl : public CNcdBaseOperation,
+                                  public MNcdParserObserver,
+                                  public MNcdParserEntityObserver,
+                                  public MCatalogsHttpObserver,
+                                  public MNcdParserDataBlocksObserver
+    {
+class CNcdNodeIconMap;    
+public:
+
+    /** Sub states of load node operation */
+    enum TLoadNodeOperationState
+        {
+        ESendRequest,      // create and send a browse request
+        EReceive,          // receive and parse node data
+        //EQuery,            // a query is pending
+        ERemote,           // create sub operations for remote folders
+        EReceiveRemote,    // wait completion of sub operations
+        EComplete,         // everything done
+        EFailed            // operation failed
+        };
+        
+    enum TLoadMode
+        {
+        EContentSource,
+        ESingleNode,
+        EChildren,
+        };
+    
+    
+    /**
+     * @param aCreateParent Creates the parent node with the given purpose
+     * if it does not exist yet.
+     */
+    static CNcdLoadNodeOperationImpl* NewL(
+        const CNcdNodeIdentifier& aNodeIdentifier,
+        const CNcdNodeIdentifier& aParentIdentifier,
+        CNcdNodeFactory::TNcdNodePurpose aParentNodePurpose,
+        TNcdResponseFilterParams aFilterParams,
+        CNcdGeneralManager& aGeneralManager,
+        MCatalogsHttpSession& aHttpSession,
+        MNcdOperationRemoveHandler* aRemoveHandler,
+        MNcdOperationQueue* aOperationQueue,
+        MCatalogsSession& aSession,
+        TBool aLoadChildren = EFalse,
+        TNcdChildLoadMode aMode = ELoadStructure,
+        TBool aIsSubOperation = EFalse,
+        TBool aCreateParent = ETrue );
+
+    /**
+     * @param aCreateParent Creates the parent node with the given purpose
+     * if it does not exist yet.
+     */
+    static CNcdLoadNodeOperationImpl* NewLC(
+        const CNcdNodeIdentifier& aNodeIdentifier,
+        const CNcdNodeIdentifier& aParentIdentifier,
+        CNcdNodeFactory::TNcdNodePurpose aParentNodePurpose,
+        TNcdResponseFilterParams aFilterParams,        
+        CNcdGeneralManager& aGeneralManager,
+        MCatalogsHttpSession& aHttpSession,
+        MNcdOperationRemoveHandler* aRemoveHandler,
+        MNcdOperationQueue* aOperationQueue,
+        MCatalogsSession& aSession,
+        TBool aLoadChildren = EFalse,
+        TNcdChildLoadMode aMode = ELoadStructure,
+        TBool aIsSubOperation = EFalse,
+        TBool aCreateParent = ETrue );
+        
+    /**
+     * Overloaded constructor for loading from a content source.
+     * Sets iIsSubOperation to ETrue.
+     */
+    static CNcdLoadNodeOperationImpl* NewLC(
+        CNcdContentSource& aContentSource,
+        CNcdContentSourceMap* aContentSourceMap,
+        const CNcdNodeIdentifier& aParentIdentifier,        
+        CNcdGeneralManager& aGeneralManager,
+        MCatalogsHttpSession& aHttpSession,
+        MNcdOperationRemoveHandler* aRemoveHandler,        
+        MCatalogsSession& aSession );
+        
+    virtual ~CNcdLoadNodeOperationImpl();
+    
+    TLoadNodeOperationState State();
+    
+    /**
+     * Getter for loaded nodes.
+     * Intended for parent op use during a progress callback.
+     * The array contents will be removed after the progress calback.
+     *
+     * @return An array of nodes that have been loaded by this op.
+     */        
+    const RPointerArray<CNcdNodeIdentifier>& LoadedNodes();
+    
+    /**
+     * Returns the identifier of the parent node this operation is loading,
+     * if available.
+     *
+     * @return Identifier of the parent node or NULL.
+     */
+    const CNcdNodeIdentifier* NodeIdentifier() const;
+
+public: // from CNcdBaseOperation
+
+    /**
+     * @see CNcdBaseOperation::Start
+     */
+    virtual TInt Start();
+
+    /**
+     * @see CNcdBaseOperation::Cancel
+     */
+    virtual void Cancel();
+    
+    /**
+     * @see CNcdBaseOperation::HandleCancelMessage
+     */
+    virtual void HandleCancelMessage( MCatalogsBaseMessage* aMessage );
+    
+    /**
+     * @see CNcdBaseOperation::CompleteMessage         
+     */
+    virtual TInt CompleteMessage( MCatalogsBaseMessage* & aMessage,
+        TNcdOperationMessageCompletionId aId,
+        const MNcdSendable& aSendableObject,
+        TInt aStatus );
+        
+    /**
+     * @see CNcdBaseOperation::CompleteMessage         
+     */
+    virtual TInt CompleteMessage( MCatalogsBaseMessage* & aMessage,
+        TNcdOperationMessageCompletionId aId,
+        TInt aStatus );
+        
+    /**
+     * @see CNcdBaseOperation::CompleteMessage         
+     */
+    virtual TInt CompleteMessage( MCatalogsBaseMessage*& aMessage,
+        TNcdOperationMessageCompletionId aId,
+        const MNcdSendable& aSendableObject,
+        RPointerArray<CNcdNodeIdentifier>& aNodes,
+        TInt aStatus );
+        
+    /**
+     * @see CNcdBaseOperation::CompleteMessage         
+     */
+    virtual TInt CompleteMessage( MCatalogsBaseMessage*& aMessage,
+        TNcdOperationMessageCompletionId aId,
+        RPointerArray<CNcdExpiredNode>& aExpiredNodes,
+        TInt aStatus );
+        
+
+// from base class MCatalogsHttpObserver
+
+    /**     
+     * @see MCatalogsHttpObserver::HandleHttpEventL
+     */
+    virtual void HandleHttpEventL( 
+        MCatalogsHttpOperation& aOperation, 
+        TCatalogsHttpEvent aEvent );
+        
+    /**
+     * @see MCatalogsHttpObserver::HandleHttpError()
+     */
+    TBool HandleHttpError(
+        MCatalogsHttpOperation& aOperation,
+        TCatalogsHttpError aError );
+        
+public: // from MNcdParserObserver
+
+    /**
+     * @see MNcdParserObserver
+     */
+    virtual void ParseError( TInt aErrorCode );
+
+    /**
+     * @see MNcdParserObserver
+     */
+    virtual void ParseCompleteL( TInt aError );
+
+public: // from  MNcdParserEntityObserver
+
+    /**
+     * @see MNcdParserEntityObserver
+     */
+    virtual void FolderRefL( MNcdPreminetProtocolFolderRef* aData );
+    
+    /**
+     * @see MNcdParserEntityObserver
+     */
+    virtual void FolderDataL( MNcdPreminetProtocolDataEntity* aData );
+    
+    /**
+     * @see MNcdParserEntityObserver
+     */
+    virtual void ItemRefL( MNcdPreminetProtocolItemRef* aData );
+    
+    /**
+     * @see MNcdParserEntityObserver
+     */
+    virtual void ItemDataL( MNcdPreminetProtocolDataEntity* aData );
+    
+public: // from MNcdOperationObserver
+    
+    /**
+     * @see MNcdOperationObserver
+     */
+    virtual void Progress( CNcdBaseOperation& aOperation );
+    
+    /**
+     * @see MNcdOperationObserver
+     */
+    virtual void QueryReceived( CNcdBaseOperation& aOperation,
+                                CNcdQuery* aQuery );
+
+    /**
+     * @see MNcdOperationObserver
+     */
+    virtual void OperationComplete( CNcdBaseOperation* aOperation,
+                                    TInt aError );
+
+public: // from MNcdParserDataBlocksObserver
+
+    /**
+     * @see MNcdDataBlocksObserver
+     */
+    virtual void DataBlocksL( 
+        CArrayPtr<MNcdPreminetProtocolDataBlock>* aData );
+
+public: // from CNcdBaseOperation
+
+    /**
+     * @see CNcdBaseOperation
+     */
+    virtual TBool QueryCompletedL( CNcdQuery* aQuery );
+    
+public: // from MNcdParserErrorObserver
+
+    virtual void ErrorL( MNcdPreminetProtocolError* aData );
+
+    
+protected:
+
+    CNcdLoadNodeOperationImpl( 
+        CNcdNodeFactory::TNcdNodePurpose aParentNodePurpose,
+        TNcdResponseFilterParams aFilterParams,
+        TNcdChildLoadMode aMode,
+        TBool aLoadChildren,
+        CNcdGeneralManager& aGeneralManager,
+        MCatalogsHttpSession& aHttpSession,
+        MNcdOperationRemoveHandler* aRemoveHandler,
+        MNcdOperationQueue* aOperationQueue,
+        MCatalogsSession& aSession,
+        TBool aIsSubOperation,
+        TBool aCreateParent );
+        
+    CNcdLoadNodeOperationImpl( 
+        CNcdGeneralManager& aGeneralManager,
+        MCatalogsHttpSession& aHttpSession,
+        MNcdOperationRemoveHandler* aRemoveHandler,
+        MCatalogsSession& aSession  );
+    
+    void ConstructL( const CNcdNodeIdentifier& aNodeIdentifier,
+        const CNcdNodeIdentifier& aParentIdentifier );
+        
+    void ConstructL( CNcdContentSource& aContentSource,
+        CNcdContentSourceMap* aContentSourceMap,
+        const CNcdNodeIdentifier& aParentIdentifier );
+        
+    
+    
+    virtual HBufC8* CreateRequestLC( CNcdNodeIdentifier* aNodeIdentifier,
+        TNcdResponseFilterParams aFilterParams,
+        const TDesC& aUri );
+
+    /**
+     * Maps the icon ID for data block ID if the icon data is in a separate
+     * data block.
+     *
+     * @param aIconId The icon Id.
+     * @param aDataBlockId The data block Id containing the icon data.
+     * @param aNodeIdenfier The node which has the icon.
+     */
+    void MapIconIdForDataBlockL(
+        const TDesC& aIconId, const TDesC& aDataBlockId,
+        const CNcdNodeIdentifier& aNodeIdentifier);
+        
+    /**
+     * Used to request the ID of the icon of which data is in the given
+     * data block.
+     *
+     * @note The responsibility of closing the returned array is in the caller.
+     * @param aDataBlockId ID of the data block
+     * @param aNodeIdentifier On return the node which has the icon is
+     *                        assigned to this pointer.
+     * @return The icon ID or NULL of icon id was not found.
+     */
+    RPointerArray<CNcdLoadNodeOperationImpl::CNcdNodeIconMap> IconsForDataBlockL(
+        const TDesC& aDataBlockId);
+    
+    /**
+     * Creates sub load-operations for remote folders.
+     *
+     */    
+    virtual void CreateSubOperationsL();
+    
+    /**
+     * Checks whether loading is really necessary.
+     * This method is used to determine whether to complete
+     * the op early on before doing anything else. 
+     * There are many cases where it's impossible or unwise to complete
+     * the operation normally e.g. load started for search root.
+     */    
+    virtual TBool IsLoadingNecessaryL();
+    
+    /**
+     * Checks whether a folder's children should be cleared
+     */
+    virtual TBool IsChildClearingNecessaryL();
+     
+
+    /**
+     * Determines the type of the parent node
+     */
+    void DetermineParentTypeL( const TUid& aUid );
+    
+    /**
+     * Removes the session of current namespace & server uri.
+     */
+    void RemoveServerSessionL();
+     
+    /**
+     * Sets the children loaded flag for the folder (or folders)
+     * that were loaded (the flags intention is to differentiate first time
+     * load from subsequent ones). 
+     *
+     * @see CNcdNodeFolder::SetChildrenPreviouslyLoaded
+     */
+    void SetChildrenLoadedFlagL();
+    
+    /**
+     * Refreshesh seen status if needed.
+     *
+     * @see CNcdNodeSeenInfo::RefreshFolderSeenStatusL
+     */
+    void RefreshSeenStatusL();
+    
+    /**
+     * Calculates the correct structure page size for the given page
+     * of the given folder.
+     *
+     * @param aPageStart Start index of the page.
+     * @param aPageSize Original page size.
+     * @param aNodeFolder The folder.
+     * @param aChildLoadMode Load mode.
+     */
+    TInt CalculateStructPageSize(
+        TInt aPageStart,
+        TInt aPageSize,
+        CNcdNodeFolder& aNodeFolder,
+        TNcdChildLoadMode aChildLoadMode );
+        
+    
+    /**
+     * Returns the amount of remote folders that need to be loaded
+     * separately as sub-operations.
+     *
+     * @return Remote folder count.
+     */
+    
+    virtual TInt RemoteFolderCount() const;
+    
+    /**
+     * Removes folder's children
+     */
+    virtual void RemoveChildrenL( CNcdNodeFolder& aFolder );
+    
+    /**
+     * Notifies the operation manager about completion of a queued operation,
+     * if the given completion id indicates that the operation is really completed.
+     *
+     * @param aId The completion id.
+     */
+    void NotifyCompletionOfQueuedOperation( TNcdOperationMessageCompletionId aId );    
+    
+    
+public: // from CNcdBaseOperation
+
+    /**
+     * @see CNcdBaseOperation::RunOperation
+     */
+    virtual TInt RunOperation();
+    
+    /**
+     * @see CNcdBaseOperation::RunOperation
+     */
+    virtual void ChangeToPreviousStateL();
+    
+protected:
+
+    void DoRunOperationL();    
+    
+protected: // data
+    
+    /**
+     * A sub-state of this operation's execution.
+     */
+    TLoadNodeOperationState iLoadNodeState;
+    
+    /**
+     * Nodes that have been loaded. This is used to store loaded
+     * nodes identifiers before they can be sent to the proxy in a message.
+     */
+    RPointerArray<CNcdNodeIdentifier> iLoadedNodes;
+        
+    /**
+     * Parent node identifier.
+     */
+    CNcdNodeIdentifier* iParentIdentifier;
+    
+    /**
+     * Identifier of the node this op is loading.
+     */
+    CNcdNodeIdentifier* iNodeIdentifier;
+    
+    /**
+     * Reference to access point manager.
+     * Not owned by this.
+     */
+    MCatalogsAccessPointManager& iAccessPointManager;
+    
+    MNcdProtocol& iProtocol;
+    
+    /**
+     * Http session for sending requests and receiving responses.
+     * Not own.
+     */
+    MCatalogsHttpSession& iHttpSession;
+    
+    /**
+     * Http operation for current transaction.
+     * Not own.
+     */
+    MCatalogsHttpOperation* iTransaction;
+        
+    TNcdResponseFilterParams iFilterParams;
+    
+    CNcdQuery* iLoadNodeQuery;
+    
+    /**
+     * Sub-operations for browse requests.
+     */
+    RPointerArray<CNcdLoadNodeOperationImpl> iSubOps;
+    RPointerArray<CNcdLoadNodeOperationImpl> iFailedSubOps;
+    RPointerArray<CNcdLoadNodeOperationImpl> iCompletedSubOps;
+    
+    HBufC* iServerUri;
+    
+    RPointerArray<CNcdQuery> iSubOpQuerys;
+    
+    /**
+     * Remote folders encountered during the operation are stored here.
+     * Load operations will be started for these nodes.
+     */
+    RPointerArray<CNcdNodeIdentifier> iRemoteFolders;
+    
+    /**
+     * Child folders of transparent folders encountered during the
+     * operation are stored here. Load operations will be started
+     * from these nodes.
+     */
+    RPointerArray<CNcdNodeIdentifier> iTransparentChildFolders;
+    
+    /**
+     * Child items of transparent folders.
+     */
+    RPointerArray<CNcdNodeIdentifier> iTransparentChildItems;
+    
+    TNcdChildLoadMode iChildLoadMode;
+    TLoadMode iLoadMode;
+    
+    /**
+     * Not own.
+     */     
+    CNcdContentSource* iContentSource;
+    
+    /**
+     * Not own.
+     */
+    CNcdContentSourceMap* iContentSourceMap;
+    
+    TUid iClientUid;
+    
+    /**
+     * Node index, this is used to put a child node to the
+     * correct place in the parent node.
+     */
+    TInt iNodeIndex;
+    
+    /**
+     * These are used if icon data is in separate data block.
+     */
+    RPointerArray<CNcdNodeIconMap> iNodeIconMaps;
+    
+    /**
+     * Type of the parent node: root or folder
+     */
+    CNcdNodeFactory::TNcdNodeType iParentType;
+    
+    /** 
+     * Purpose of the parent node.
+     */
+    CNcdNodeFactory::TNcdNodePurpose iParentPurpose;
+    
+    /**
+     * Indicates whether the parent node must be created.
+     */
+    TBool iCreateParent;
+    
+    /**
+     * Operation queue, not own.
+     */
+    MNcdOperationQueue* iOperationQueue;    
+    
+    /**
+     * ETrue if node updates are held until the entire response
+     * has been handled.
+     *
+     * This is used to ensure that datablocks have been received
+     * before nodes are updated to the proxy-side
+     */
+    TBool iHoldNodeUpdates;
+    
+    class CNcdNodeIconMap : public CBase
+        {
+    public:
+        static CNcdNodeIconMap* NewLC(
+            const CNcdNodeIdentifier& aMetadataId,
+            const TDesC& aIconId,
+            const TDesC& aDataBlockId );
+        ~CNcdNodeIconMap();
+
+        HBufC* iDataBlockId;
+        HBufC* iIconId;
+        CNcdNodeIdentifier* iMetadataId;
+        
+    private:
+        void ConstructL(
+            const CNcdNodeIdentifier& aMetadataId,
+            const TDesC& aIconId,
+            const TDesC& aDataBlockId );
+        CNcdNodeIconMap();                        
+        };
+    };
+
+#endif // C_NCDLOADNODEOPERATIONIMPL_H