ncdengine/provider/server/inc/ncdloadbundlenodeoperationimpl.h
changeset 0 ba25891c3a9e
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/ncdengine/provider/server/inc/ncdloadbundlenodeoperationimpl.h	Thu Dec 17 08:51:10 2009 +0200
@@ -0,0 +1,411 @@
+/*
+* 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_NCDLOADBUNDLENODEOPERATIONIMPL_H
+#define C_NCDLOADBUNDLENODEOPERATIONIMPL_H
+
+#include <e32base.h>
+#include <badesca.h>
+#include "ncdbaseoperation.h"
+#include "ncdconfigurationobserver.h"
+
+class MCatalogsAccessPointManager;
+class MNcdProtocol;
+class MNcdConfigurationManager;
+class CNcdContentSource;
+class CNcdNodeIdentifier;
+class CNcdLoadNodeOperationImpl;
+class CNcdContentSourceMap;
+class CNcdChildEntityMap;
+class MNcdOperationQueue;
+class CNcdNodeMetaData;
+
+/**
+ *  Load node operation implementation.
+ *
+ *  Handles the "loading of root node" i.e. creates
+ *  a root node from a conf protocol response.
+ *
+ *  @lib ?library
+ *  @since S60 ?S60_version *** for example, S60 v3.0
+ */
+class CNcdLoadBundleNodeOperation : public CNcdBaseOperation,
+                                    public MNcdParserObserver,
+                                    public MCatalogsHttpObserver,
+                                    public MNcdParserConfigurationProtocolObserver,
+                                    public MNcdConfigurationObserver
+    {
+    
+public:
+
+    /** Sub states of bundle node operation */
+    enum TBundleNodeState
+        {
+        EConfRequest,      // create and send a conf request
+        EReceiveConf,      // receive and parse conf data
+        EConfQuery,        // respond to conf query
+        EBrowseRequest,    // create sub-operations 
+        EReceiveBrowse,    // wait for sub-operations to complete
+        EComplete,         // everything done
+        EFailed            // operation failed
+        };
+    
+    
+    static CNcdLoadBundleNodeOperation* NewL(
+        const CNcdNodeIdentifier& aNodeIdentifier,
+        CNcdGeneralManager& aGeneralManager,
+        MCatalogsHttpSession& aHttpSession,
+        MNcdOperationRemoveHandler* aRemoveHandler,
+        MNcdOperationQueue& aOperationQueue,
+        MCatalogsSession& aSession );
+
+    static CNcdLoadBundleNodeOperation* NewLC(
+        const CNcdNodeIdentifier& aNodeIdentifier,
+        CNcdGeneralManager& aGeneralManager,
+        MCatalogsHttpSession& aHttpSession,
+        MNcdOperationRemoveHandler* aRemoveHandler,
+        MNcdOperationQueue& aOperationQueue,
+        MCatalogsSession& aSession );
+
+    virtual ~CNcdLoadBundleNodeOperation();
+    
+    /**
+     * Returns the identifier of the parent node this operation is loading.
+     *
+     * @return Identifier of the parent node.
+     */
+    const CNcdNodeIdentifier& NodeIdentifier() const;
+
+    
+public: //from CNcdBaseOperation
+
+    /**
+     * Starts the operation.
+     */
+    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 );
+    
+    
+public: // from 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 MNcdParserConfigurationProtocolObserver
+
+    virtual void ConfigurationBeginL( const TDesC& aVersion, 
+                                      TInt aExpirationDelta );
+    virtual void ConfigurationQueryL( MNcdConfigurationProtocolQuery* aQuery );
+
+    virtual void ClientConfigurationL(
+        MNcdConfigurationProtocolClientConfiguration* aConfiguration );
+    virtual void ConfigurationDetailsL( 
+        CArrayPtr<MNcdConfigurationProtocolDetail>* aDetails );
+    virtual void ConfigurationActionRequestL(
+        MNcdConfigurationProtocolActionRequest* aActionRequest );
+    virtual void ConfigurationErrorL( MNcdConfigurationProtocolError* aError );
+    virtual void ConfigurationServerDetailsL( MNcdConfigurationProtocolServerDetails* aServerDetails );
+    virtual void ConfigurationEndL();
+
+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 MNcdConfigurationObserver
+
+    virtual void ConfigurationChangedL();                                   
+                                    
+public: // from CCatalogsCommunicable
+    
+    /**
+     * @see CCatalogsCommunicable
+     */
+    virtual void ReceiveMessage( 
+        MCatalogsBaseMessage* aMessage,
+        TInt aFunctionNumber );
+        
+public: // from MNcdParserErrorObserver
+
+    virtual void ErrorL( MNcdPreminetProtocolError* aData );
+                                    
+
+protected:
+
+    CNcdLoadBundleNodeOperation(
+        CNcdGeneralManager& aGeneralManager,
+        MCatalogsHttpSession& aHttpSession,
+        MNcdOperationRemoveHandler* aRemoveHandler,
+        MNcdOperationQueue& aOperationQueue,
+        MCatalogsSession& aSession );
+    
+    void ConstructL( const CNcdNodeIdentifier& aNodeIdentifier );
+    
+    HBufC8* CreateConfRequestLC( CNcdQuery* aQuery = NULL );
+
+    /**
+     * Reverts the nodes which could not be retrieved due to broken content
+     * source from NodeManager's temp cache to main RAM cache.
+     */
+    void RevertNodesOfBrokenSourcesToCacheL();
+    
+    /**
+     * Reverts the given node belonging to given content source from
+     * NodeManager's temp cache to the main cache.
+     */
+    void RevertNodeL(
+        const CNcdNodeIdentifier& aNodeIdentifier,
+        const CNcdContentSource& aContentSource );
+    /**
+     * Removes the nodes that were removed from content sources.
+     */
+    void RemoveOldNodesL();
+    
+    /**
+     * Adds the bundle node identifier to iLoadedNodes.
+     */
+    void AddBundleToLoadedNodesL();
+    
+    /**
+     * Updates the root node's content source map according to the new
+     * content sources of the loaded bundle.
+     */
+    void UpdateCsMapToRootNodeL();
+    
+    /**
+     * Sets always visible flags to the metadata of the nodes that belong to
+     * content sources defined as always visible in client configuration.
+     */
+    void SetAlwaysVisibleFlagsL();
+    
+    void ParseCatalogBundleL( const MNcdConfigurationProtocolDetail& aDetail );
+    
+    /**
+     * 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 );    
+    
+    static TBool ContainsNode(
+        const RPointerArray<CNcdNodeIdentifier>& aNodes,
+        const CNcdNodeIdentifier& aNode);
+    
+    void HandleBundleDisclaimerL(
+        CNcdNodeMetaData& aMetadata, 
+        const TDesC& aDisclaimer );
+    
+
+protected:
+
+    void HandleConfigurationDataRequestMessage( MCatalogsBaseMessage& aMessage );
+    
+    
+protected: // from CNcdBaseOperation
+
+    /**
+     * @see CNcdBaseOperation::RunOperation
+     */
+    virtual TInt RunOperation();
+    
+    void DoRunOperationL();
+    
+    /**
+     * @see CNcdBaseOperation::RunOperation
+     */
+    virtual void ChangeToPreviousStateL();
+    
+    virtual TBool QueryCompletedL( CNcdQuery* aQuery );
+    
+private: // type declarations
+    
+    /** Sub states of master server redirection process */
+    enum TMasterServerRedirectionState 
+        {
+        EBegin, // Start state.
+        ERedirecting, // Redirecting.
+        EReverted // Returned to use previous master server address.
+        };
+
+private: // data
+    /**
+     * A sub-state of this operation's execution.
+     */
+    TBundleNodeState iBundleNodeState;
+    
+    /**
+     * A sub-state of master server redirection.
+     */
+    TMasterServerRedirectionState iMasterServerRedirectionState;
+    
+    /**
+     * 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;
+        
+    /**
+     * This flag is set to indicate that progress info should be sent
+     * when the next message is received.
+     */
+    TBool iSendProgress;    
+        
+    /**
+     * Access point manager for creating access points.
+     */
+    MCatalogsAccessPointManager& iAccessPointManager;
+    
+
+    /**
+     * Http session for sending requests and receiving responses.
+     * Not own.
+     */
+    MCatalogsHttpSession& iHttpSession;
+
+    MNcdProtocol& iProtocol;
+    
+    /**
+     * Configuration manager for getting the Master Server Address
+     */
+    MNcdConfigurationManager& iConfigManager;
+        
+    /**
+     * Http operation for current transaction.
+     * Not own.
+     */
+    MCatalogsHttpOperation* iTransaction;
+        
+    /**
+     * Sub-operations for browse requests.
+     */
+    RPointerArray<CNcdLoadNodeOperationImpl> iSubOps;
+    RPointerArray<CNcdLoadNodeOperationImpl> iFailedSubOps;
+    RPointerArray<CNcdLoadNodeOperationImpl> iCompletedSubOps;
+        
+    /**
+     * Content sources are stored here.
+     */
+    CNcdContentSourceMap* iContentSourceMap;
+    
+    /**
+     * Identifier of the bundle node.
+     */
+    CNcdNodeIdentifier* iNodeIdentifier;
+    
+    CNcdQuery* iConfQuery;
+    RPointerArray<CNcdQuery> iSubOpQuerys;
+       
+    MNcdParserConfigurationProtocolObserver*	iDefaultConfigurationProtocolObserver;
+    
+    HBufC* iServerUri;
+    
+    CBufFlat* iConfigResponseBuf;
+        
+    TBool iNodeDbLocked;
+        
+    /**
+     * Maps of current children and their children for new checking.
+     */
+    RPointerArray<CNcdChildEntityMap> iChildEntityMaps;
+    
+    MNcdOperationQueue& iOperationQueue;
+    
+    TBool iFirstConfRequest;
+
+    };
+
+#endif // C_NCDLOADBUNDLENODEOPERATIONIMPL_H