--- /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