ncdengine/provider/server/inc/ncdcontentdownloadoperation.h
changeset 0 ba25891c3a9e
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/ncdengine/provider/server/inc/ncdcontentdownloadoperation.h	Thu Dec 17 08:51:10 2009 +0200
@@ -0,0 +1,362 @@
+/*
+* 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_NCDCONTENTDOWNLOADOPERATION_H
+#define C_NCDCONTENTDOWNLOADOPERATION_H
+
+#include "ncdbaseoperation.h"
+#include "ncdoperationdatatypes.h"
+#include "ncddownloadoperationstates.h"
+#include "ncdoperationobserver.h"
+#include "ncdstoragedataitem.h"
+#include "ncddownloadreportobserver.h"
+#include "catalogshttpincludes.h"
+
+class MCatalogsHttpSession;
+class CNcdNodeManager;
+class MNcdStorageClient;
+class CNcdNodeIdentifier;
+class MNcdSessionHandler;
+class MNcdConfigurationManager;
+class MCatalogsContext;
+class MNcdOperationRemoveHandler;
+class MCatalogsHttpHeaders;
+class MNcdDatabaseStorage;
+class MCatalogsAccessPointManager;
+class CNcdNode;
+class CNcdNodeDownload;
+class CNcdDownloadSubOperation;
+class CNcdDescriptorDownloadSubOperation;
+class CNcdContentDescriptor;
+class CNcdSendNotificationSubOperation;
+class CNcdPurchaseDetails;
+class CNcdGeneralManager;
+
+/** 
+ * Content download operation
+ * 
+ */
+class CNcdContentDownloadOperation : public CNcdBaseOperation,
+    public MNcdStorageDataItem
+    {
+public:
+    
+    /**
+     * NewL
+     *
+     * @param aHttpSession HTTP session used for creating download operations
+     *
+     * @note Preferably the HTTP session has suitable defaults but if not then
+     * Config() can be used to retrieve and change the settings for the 
+     * download.
+     * @note At least the target directory and access point must be set to the 
+     * configuration.
+     */
+    static CNcdContentDownloadOperation* NewL( 
+        MNcdOperationRemoveHandler& aRemoveHandler,
+        const CNcdNodeIdentifier& aNodeId,
+        CNcdGeneralManager& aGeneralManager,
+        MCatalogsHttpSession& aHttpSession,
+        MNcdDownloadReportObserver& aReportObserver,
+        MNcdSessionHandler* aSessionHandler,
+        MNcdDatabaseStorage& aDownloadStorage,
+        MCatalogsSession& aSession,
+        TInt aDownloadIndex );
+
+    /**
+     * NewL
+     *
+     * Internalizes the download from the stream
+     */     
+    static CNcdContentDownloadOperation* NewLC( 
+        MNcdOperationRemoveHandler& aRemoveHandler,
+        CNcdGeneralManager& aGeneralManager,
+        MCatalogsHttpSession& aHttpSession,
+        MNcdDownloadReportObserver& aReportObserver,
+        MNcdDatabaseStorage& aDownloadStorage,
+        MCatalogsSession& aSession );
+
+    
+    /**
+     * Destructor
+     */
+    ~CNcdContentDownloadOperation();
+        
+    
+public: // From CNcdBaseOperation
+
+    /**
+     * @see CNcdBaseOperation::Cancel()
+     */
+    void Cancel();    
+    
+    
+    /**
+     * @see CNcdBaseOperation::ReceiveMessage()
+     */
+    void ReceiveMessage( 
+        MCatalogsBaseMessage* aMessage,
+        TInt aFunctionNumber );    
+
+
+    /**
+     * @see CNcdBaseOperation::CounterPartLost()
+     */
+    void CounterPartLost( const MCatalogsSession& aSession );
+
+public: // From MNcdStorageDataItem
+
+    /**
+     * @see MNcdStorageDataItem::ExternalizeL()
+     */
+    void ExternalizeL( RWriteStream& aStream );
+
+
+    /**
+     * @see MNcdStorageDataItem::InternalizeL()
+     */
+    void InternalizeL( RReadStream& aStream );
+
+
+public: // New methods
+
+    TBool MatchDownload( const CNcdNodeIdentifier& aId, 
+        TNcdDownloadDataType& aType, TInt aIndex ) const;
+
+
+    /**
+     * Node id getter
+     *
+     * @return Node id of the node used by the operation
+     */
+    const CNcdNodeIdentifier& NodeId() const;
+    
+    /**
+     * Metadata id getter
+     *
+     * @return Metadata id of the node used by the operation
+     */     
+    const CNcdNodeIdentifier& MetadataId() const;
+    
+    /**     
+     */
+    TBool IsOk() const;
+    
+    TInt CurrentDownload() const;
+    
+
+protected: // From MNcdOperationObserver
+
+    /**
+     * @see MNcdOperationObserver::Progress()
+     */
+    void Progress( CNcdBaseOperation& aOperation );
+    
+    /**
+     * @see MNcdOperationObserver::QueryReceived()
+     */
+    void QueryReceived( CNcdBaseOperation& aOperation,
+                                CNcdQuery* aQuery );
+
+    /**
+     * @see MNcdOperationObserver::OperationComplete()
+     */
+    void OperationComplete( CNcdBaseOperation* aOperation,
+                                    TInt aError );
+
+
+protected: // From CNcdBaseOperation
+
+    /**
+     * @see CNcdBaseOperation::RunOperation()
+     */
+    TInt RunOperation();        
+    
+
+    /**
+     * @see CNcdBaseOperation::Initialize()
+     */    
+    TInt Initialize();
+    
+
+protected:
+   
+
+    // Constructor
+    CNcdContentDownloadOperation( 
+        MNcdOperationRemoveHandler& aRemoveHandler,
+        CNcdGeneralManager& aGeneralManager, 
+        MCatalogsHttpSession& aHttpSession, 
+        MNcdDownloadReportObserver& aReportObserver,
+        MNcdSessionHandler* aSessionHandler,
+        MCatalogsSession& aSession,
+        MNcdDatabaseStorage& aDownloadStorage );
+        
+    void ConstructL( const CNcdNodeIdentifier& aNodeId, 
+        TInt aDownloadIndex );
+
+    void ConstructL();
+
+private: // enumerations
+
+    enum TContentDownloadState
+        {
+        ENoDownload,
+        ERightsDownload,
+        EEmbeddedDescriptor,        
+        EDescriptorDownload,
+        EContentDownload,          
+        EDownloadDone    
+        };
+        
+    enum TDescriptorType
+        {
+        EDescriptorUnknown,
+        EDescriptorDd,
+        EDescriptorJad
+        };
+    
+private:
+
+    // Does the actual operation initialization
+    void DoInitializationL();
+
+    void FinishDescriptorDownloadL();
+
+    /** Initializes the download in the given index (or in the next
+     *  index that needs to be downloaded)
+     *  @throw KNoDownloads if there are no downloads that need to be 
+     *  downloaded
+     */
+    void InitializeDownloadL( TInt aIndex );
+    
+    void StartDownloadL();
+
+    TBool FinishDownloadL();
+
+    void UpdatePurchaseHistoryL( 
+        const TDesC& aDownloadedFile );
+
+    // Updates skipped downloads to purchase history
+    void UpdateSkippedDownloadToPurchaseHistoryL( TInt aIndex );
+
+
+    // Update the download request headers
+    void UpdateHeadersL( MCatalogsHttpHeaders& aHeaders );
+    
+    
+    void ReleaseDownload( CNcdBaseOperation* aOperation );
+
+
+    void HandleDescriptorL( 
+        const TDesC& aDescriptorType, const TDesC8& aDescriptor );
+
+    // Checks if the download is a dependency/upgrade and whether
+    // it is currently installed or not
+    TBool IsFileInstalledL( TInt aIndex, TBool aCheckOnly );
+    
+    TBool SkipInstalledFilesL();
+    
+    TInt CalculateMissingFilesL();
+    
+    void SaveStateL();
+    
+    void GenerateStorageUidL();
+    
+    void RemoveTempInfoL();
+    
+    TDescriptorType MatchDescriptor( const TDesC& aMimeType ) const;
+    
+    CNcdPurchaseDetails* GetPurchaseDetailsLC();
+    
+    void UpdateAccessPointsL( 
+        const CNcdNodeIdentifier& aNodeId );
+
+    void ReportStatusL( 
+        const TNcdReportStatusInfo& aStatus,
+        TBool aSendable = ETrue );
+    
+    void SendOmaNotificationL( const TNcdReportStatusInfo& aStatus );
+    
+    // Updates dependencies from CNcdNodeDependency to purchase history
+    // so that they are up-to-date
+    void UpdateDependenciesL();
+        
+    void GetPausableStateL( MCatalogsBaseMessage& aMessage );
+
+    // Registers a download to report manager for download reporting
+    void RegisterDownloadL(
+        const TDesC& aUri,
+        const CNcdNodeIdentifier& aIdentifier );
+    
+private:
+
+    MCatalogsHttpSession& iHttpSession;
+    MNcdDownloadReportObserver& iReportObserver;
+    MNcdSessionHandler* iSessionHandler;
+    MNcdConfigurationManager& iConfigurationManager;
+    MCatalogsAccessPointManager& iAccessPointManager;
+    MNcdDatabaseStorage& iStorage;
+    CNcdNode* iNode;
+    
+    const MCatalogsContext& iContext;
+    
+    TNcdDownloadState iDownloadState;    
+    HBufC* iSessionId;
+    
+
+    CNcdDownloadSubOperation* iDownload;
+    CNcdDescriptorDownloadSubOperation* iDescriptorDownload;
+    
+    CNcdNodeDownload* iNodeDownload;
+    
+    // Access point used for content downloads
+    TCatalogsConnectionMethod iApId;
+    TCatalogsConnectionMethod iReportAp;
+    
+    TInt iDownloadIndex;   
+    
+    HBufC* iMimeType;
+    TBool iMimeUpdated;
+    
+    TBool iStartNextFile;
+    TContentDownloadState iContentDownloadState;
+    HBufC8* iDescriptor;
+    TBool iDeleting;
+    CNcdContentDescriptor* iContentDescriptor;
+    
+    TPtrC iContentUri;    
+    TPtrC iContentMime;
+    HBufC* iContentFilename;
+    TPtrC iNotificationUri;
+   
+    TDescriptorType iDownloadType;
+    
+    // ETrue if the operation was created successfully
+    // This is used to circumvent the cumbersome 
+    // storage error handling
+    TBool iIsOk; 
+    TBool iUnhandledEvent;
+    HBufC* iStorageUid;
+    TNcdReportId iReportId;
+    TBool iDependenciesUpdated;
+    TInt iTotalFileCount;
+    TInt iCurrentFile;
+    };
+
+#endif // C_NCDCONTENTDOWNLOADOPERATION_H