diff -r 000000000000 -r ba25891c3a9e ncdengine/provider/server/inc/ncdloadbundlenodeoperationimpl.h --- /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 +#include +#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& aNodes, + TInt aStatus ); + + /** + * @see CNcdBaseOperation::CompleteMessage + */ + virtual TInt CompleteMessage( MCatalogsBaseMessage*& aMessage, + TNcdOperationMessageCompletionId aId, + RPointerArray& 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* 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& 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 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 iSubOps; + RPointerArray iFailedSubOps; + RPointerArray iCompletedSubOps; + + /** + * Content sources are stored here. + */ + CNcdContentSourceMap* iContentSourceMap; + + /** + * Identifier of the bundle node. + */ + CNcdNodeIdentifier* iNodeIdentifier; + + CNcdQuery* iConfQuery; + RPointerArray iSubOpQuerys; + + MNcdParserConfigurationProtocolObserver* iDefaultConfigurationProtocolObserver; + + HBufC* iServerUri; + + CBufFlat* iConfigResponseBuf; + + TBool iNodeDbLocked; + + /** + * Maps of current children and their children for new checking. + */ + RPointerArray iChildEntityMaps; + + MNcdOperationQueue& iOperationQueue; + + TBool iFirstConfRequest; + + }; + +#endif // C_NCDLOADBUNDLENODEOPERATIONIMPL_H