ncdengine/engine/transport/inc/catalogshttpdownload.h
changeset 4 32704c33136d
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/ncdengine/engine/transport/inc/catalogshttpdownload.h	Tue Jan 26 12:06:03 2010 +0200
@@ -0,0 +1,561 @@
+/*
+* Copyright (c) 2006-2007 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_CATALOGSHTTPDOWNLOAD_H
+#define C_CATALOGSHTTPDOWNLOAD_H
+
+#include <downloadmgrclient.h>
+
+#include <s32file.h>
+
+#include "catalogshttpoperation.h"
+#include "catalogstransportoperationid.h"
+#include "catalogshttpconfigobserver.h"
+#include "catalogshttpobserver.h"
+
+class MCatalogsHttpConfig;
+class CCatalogsHttpConfig;
+class CCatalogsHttpHeaders;
+class CCatalogsKeyValuePair;
+class CCatalogsHttpDownloadManager;
+
+/**
+* HTTP file download implementation
+*
+* @note Due to insufficient access to HTTP response headers through the 
+* Download manager, Download uses CCatalogsHttpTransaction with HTTP HEAD
+* to get the response headers if the target filename cannot be figured out
+* from the given URL
+* @note Getting all of the response headers can be forced through SetHeaderMode()
+* 
+*/
+class CCatalogsHttpDownload : public CBase,
+    public MCatalogsHttpOperation, 
+    public MCatalogsHttpConfigObserver,
+    public MCatalogsHttpObserver
+    {
+public:
+
+    enum TDownloadDeleteState
+        {
+        /**
+         * RHttpDownload object can be deleted if necessary
+         */
+        EDownloadCanBeDeleted = 0,
+        
+        /**
+         * Download was paused by the client and RHttpDownload must
+         * not be deleted
+         */
+        EDownloadPaused
+        };
+        
+public: // Constructors & destructor    
+
+
+    /**
+    * Creator
+    * 
+    * @param aDownload Platform download
+    * @param aConfig Configuration
+    * @return A new HTTP download
+    */
+    static CCatalogsHttpDownload* NewLC( 
+        CCatalogsHttpDownloadManager& aOwner, 
+        RHttpDownload* aDownload,
+        const CCatalogsHttpConfig& aConfig );
+
+
+    /**
+    * Destructor
+    */
+    ~CCatalogsHttpDownload();
+
+
+public: // MCatalogsTransportOperation
+          
+    TInt AddRef();		
+    
+    TInt Release();
+            
+    TInt RefCount() const;    
+    
+    TInt Cancel();
+
+    TCatalogsTransportProgress Progress() const;		
+
+
+public: // MCatalogsHttpOperation
+
+    /**
+    * @see MCatalogsHttpOperation::Start()
+    */
+    TInt Start( TResumeStartInformation aResumeOrigin = EResumeFromUser );
+    
+    
+    /**
+    * @see MCatalogsHttpOperation::Pause()
+    */
+    TInt Pause();
+
+
+    /**
+    * @see MCatalogsHttpOperation::NotifyCancel()
+    */
+    virtual void NotifyCancel();
+
+
+    // Body and headers
+    
+    /**
+    * @see MCatalogsHttpOperation::SetBodyL( const TDesC8& )
+    * @note Downloads do not support this
+    */
+    void SetBodyL( const TDesC8& aBody );
+
+
+    /**
+    * @see MCatalogsHttpOperation::SetBodyL( const TDesC16&	)    
+    */
+    void SetBodyL( const TDesC16& aBody );
+    
+    
+    /**	    
+    * @see MCatalogsHttpOperation::Body()
+    * @note For downloads, this always returns an empty descriptor.
+    */
+    const TDesC8& Body() const;
+
+
+    /**
+    * @see MCatalogsHttpOperation::SetUriL()
+    */
+    void SetUriL( const TDesC8& aUri );
+    
+    
+    /**
+    * @see MCatalogsHttpOperation::SetUriL()
+    */
+    void SetUriL( const TDesC16& aUri );
+
+    /**
+    * @see MCatalogsHttpOperation::Uri()
+    */
+    const TDesC8& Uri() const;
+
+
+    /**
+    * Returns the current configuration for the download
+    *
+    * The changes to the configuration must be made before
+    * the download is started. Changes in priority can be made even
+    * if the download is running but they have effect only if the download
+    * is paused.        
+    *
+    * @return Download configuration
+    * @see MCatalogsHttpOperation::Config()
+    */
+    MCatalogsHttpConfig& Config() const;
+
+
+    /**
+    * @see MCatalogsHttpOperation::RequestHeadersL()
+    */
+    MCatalogsHttpHeaders& RequestHeadersL() const;
+    
+    /**
+    * @see MCatalogsHttpOperation::ResponseHeadersL()
+    */
+    const MCatalogsHttpHeaders& ResponseHeadersL() const;
+    	    	    
+    	    
+    /**
+    * @see MCatalogsHttpOperation::OperationType()
+    */
+    TCatalogsHttpOperationType OperationType() const;
+
+    
+    /**
+    * @see MCatalogsHttpOperation::OperationId()
+    */
+    const TCatalogsTransportOperationId& OperationId() const;
+
+    /**
+    * @see MCatalogsHttpOperation::SetContentType( const TDesC8&)
+    * @note Downloads do not support this
+    */
+    void SetContentTypeL( const TDesC8& aContentType );        
+
+    /**
+    * @see MCatalogsHttpOperation::SetContentType( const TDesC16&)
+    * @note Downloads do not support this
+    */
+    void SetContentTypeL( const TDesC16& aContentType );
+
+
+    /**
+    * @see MCatalogsHttpOperation::ContentType()
+    */
+    const TDesC8& ContentType() const;
+
+
+    /**
+    * @see MCatalogsHttpOperation::ContentSize()
+    */
+    TInt32 ContentSize() const;
+    
+    
+    /**
+    * @see MCatalogsHttpOperation::TransferredSize()
+    */
+    TInt32 TransferredSize() const;
+    
+    
+    /**
+    * @see MCatalogsHttpOperation::IsPausable()
+    */
+    TBool IsPausable() const;
+    
+
+    /**
+     * Not supported
+     * @see MCatalogsHttpOperation::StatusCode()
+     */
+    TInt StatusCode() const;        
+    
+    
+    /**
+     * Not supported
+     * @see MCatalogsHttpOperation::StatusText()
+     */
+    const TDesC8& StatusText() const;
+       
+
+
+    /** 
+     * @see MCatalogsHttpOperation::SetConnection()
+     */
+    void SetConnection( CCatalogsConnection& aConnection );
+    
+    
+    /** 
+     * @see MCatalogsHttpOperation::ReportConnectionError()
+     */
+    void ReportConnectionError( TInt aError );
+    
+    
+    /** 
+     * @see MCatalogsHttpOperation::ConnectionManager()
+     */
+    CCatalogsHttpConnectionManager& ConnectionManager();
+    
+    void ExternalizeL( RWriteStream& aStream ) const;
+    void InternalizeL( RReadStream& aStream );
+    
+    TCatalogsHttpOperationState State() const;    
+
+    
+public: // From MCatalogsHttpConfigObserver
+
+    TInt HandleHttpConfigEvent( MCatalogsHttpConfig* aConfig,
+        const TCatalogsHttpConfigEvent& aEvent );
+
+public: // From MCatalogsHttpObserver
+
+    void HandleHttpEventL( MCatalogsHttpOperation& aOperation,
+        TCatalogsHttpEvent aEvent );
+        
+    TBool HandleHttpError( MCatalogsHttpOperation& aOperation, 
+        TCatalogsHttpError aError );
+            
+public:     
+
+    /**
+    * Handles events from Download Manager
+    *
+    * @param aEvent Download Manager event
+    */
+    void HandleEventL( THttpDownloadEvent aEvent );
+    
+    
+    /**
+     * Set file server session
+     *
+     * @param aFs File server session
+     */
+    void SetFileServerSession( RFs& aFs );
+    
+    
+#ifdef __SERIES60_31__
+    TBool IsCancelled() const;
+#endif    
+       
+public:
+
+    /**
+    * Sets the header mode
+    * @param aMode Mode
+    */
+    void SetHeaderMode( TCatalogsHttpHeaderMode aMode );
+
+        
+protected:  
+    
+    /**
+    * Constructor
+    */
+    CCatalogsHttpDownload( 
+        CCatalogsHttpDownloadManager& aOwner, 
+        RHttpDownload* aDownload );
+    
+    /**
+    * 2nd phase constructor
+    */
+    void ConstructL( const CCatalogsHttpConfig* aConfig );
+
+protected:
+
+    /**
+    * Updates the content type for the download
+    */
+    void UpdateContentType();
+    
+    TInt GetDeleteState( TDownloadDeleteState& aStatus );
+
+    TInt SetDeleteState( const TDownloadDeleteState aStatus );    
+
+private: // New methods
+
+    /**
+    * Handles event progress
+    * @param aEvent The event that has progressed
+    */            
+    void HandleEventProgressL( const THttpDownloadEvent& aEvent );
+
+    
+    /**
+    * Updates the target filename from Content-Disposition -header
+    * @throw KErrNotFound if the header doesn't exist
+    */
+    void UpdateFilenameFromContentDispositionL();
+
+    /**
+    * Updates the target filename from DL manager
+    */
+    void UpdateFilenameL();
+
+
+    /** 
+    * Updates the platform download to match the current configuration
+    */
+    void UpdateDownloadConfigurationL();    
+
+
+    /**
+    * Updates the iUri to match the currently used uri 
+    */
+    void UpdateUriL();
+
+    
+    /**
+    * Updates the request headers to the platform DL manager
+    */
+    void UpdateRequestHeadersL();
+    
+    
+    /**
+    * Update the response headers from DL manager to the download
+    */        
+    void UpdateResponseHeadersL();
+
+
+    /**
+   * Update the response headers from the transaction to the download
+    */        
+    void UpdateResponseHeadersL( MCatalogsHttpOperation& aOperation );
+
+
+    /** 
+    * Checks if the given header matches any of the request headers that have
+    * an predefined enumeration in the platform DL manager
+    *
+    * @param aHeader Header
+    * @return Header enumeration
+    */        
+    TUint MatchWithPredefinedRequestHeader( 
+        const TDesC8& aHeader ) const;
+
+
+    /** 
+    * Checks if the given header matches any of the general headers that have
+    * an predefined enumeration in the platform DL manager
+    *
+    * @param aHeader Header
+    * @return Header enumeration
+    */        
+    TUint MatchWithPredefinedGeneralHeader( 
+        const TDesC8& aHeader ) const;
+
+    
+    /** 
+    * Checks if the given header matches any of the entity headers that have
+    * an predefined enumeration in the platform DL manager
+    *
+    * @param aHeader Header
+    * @return Header enumeration
+    */
+    TUint MatchWithPredefinedEntityHeader( 
+        const TDesC8& aHeader ) const;
+
+    
+    /**
+    * Adds the header from the pair to the target in the format used by
+    * platform's DL manager
+    *
+    * @param aTarget Target descriptor. Allocated/resized if necessary
+    * @param aPair Key-value -pair holding the header key and value
+    */
+    void AddRequestHeaderL( HBufC8*& aTarget, 
+        const CCatalogsKeyValuePair& aPair );
+    
+    /**
+     * Updates transferring flag if the state changes. Also notifies
+     * owner of the change
+     */
+    void SetTransferring( TBool aTransferring );
+    
+    TInt StartDownload();
+    
+    /**
+     * Starts a OMA DD download if necessary
+     * 
+     * @return ETrue if a DD download was started
+     */
+    TBool StartDescriptorDownloadL();
+    
+    /**
+     * Deletes downloaded files
+     * 
+     * Errors are ignored
+     */
+    void DeleteFiles();
+    
+    /**
+     * Moves/renames the temp file as the target file
+     */
+    void MoveFileL();
+    
+    /**
+     * Tries to parse the filename from the URI
+     * 
+     * @note Filename from this kind of an URI "http://www.doh.com/dl=bigfile"
+     * is "dl" so beware
+     */ 
+    void ParseFilenameFromUriL();
+    
+    /**
+     * Returns ETrue if aDes != NULL and aDes->Length() > 0
+     */
+    TBool ContainsData( const HBufC* aDes ) const;
+    
+    /**
+     * Gets the correct extension for iTempFilename by using dochandler
+     * and ContentType() and sets it to iConfig
+     */
+    void UpdateExtensionL();
+    
+    /**
+     * Checks the preset content-type and forces HEAD request if
+     * content is OMA DD, JAD or some DRM file
+     */
+    void UpdateHeadRequirement();
+    
+    void InitializeDownloadL();
+    
+    void DeletePlatformDownload();
+    
+    /**
+     * Updates the secondary id from platform download
+     * Doesn't check if the download exists
+     */
+    void UpdateSecondaryIdL();
+    
+    void EncodeUriL();
+    
+    const TDesC8& EncodedUri() const;
+    
+    
+private:
+
+    CCatalogsHttpDownloadManager& iOwner;
+    TCatalogsTransportOperationId iId;  // Operation id
+    RHttpDownload* iDownload;           // Platform download
+    CCatalogsHttpConfig* iConfig;       // Configuration
+    MCatalogsHttpObserver* iObserver;   // Observer        
+    TCatalogsHttpEvent iState;          // State of the download
+    HBufC8* iUri;                       // Current URI
+    HBufC8* iEncodedUri;                // Current URI as encoded
+    CCatalogsHttpHeaders* iResponseHeaders; // Headers from HTTP response
+    
+    // added request headers not supported by DL man
+    HBufC8* iAddedRequestHeaders;       
+    TInt iRefCount;        
+    TBool iNormalDelete;
+    TBuf8<KMaxContentTypeLength> iContentType;
+        
+    // Transaction for retrieving all of the response headers
+    MCatalogsHttpOperation* iTransaction;
+    TCatalogsHttpHeaderMode iMode;    
+        
+    TBool iDdDownload;  // True if downloading a DD        
+    RFile iDdFile;      // Target file for DD
+    RFs iFs;
+    TInt iReconnectCount;  // number of reconnect attempts
+   
+    TBool iPaused;
+      
+    TBool iReconnectWhenFail;
+    
+    TBool iTransferring;
+    
+    CCatalogsConnection* iConnection; // not owned    
+    TBool iFileIsSet;
+    HBufC* iTempFilename;
+    
+    // mutable because this is only used as an optimization and is
+    // updated in ContentSize() const
+    mutable TInt32 iContentSize; 
+    
+    TInt32 iTransferredSize; 
+
+#ifdef __SERIES60_31__
+    TBool iCancelled;
+#endif    
+    
+    // For managing async pause with dlmgr.
+    TBool iPausePending;
+    TBool iQueuedResume;
+    
+protected:
+
+    // Grant access to UpdateContentType
+    friend class CCatalogsHttpDownloadManager;
+    
+    };
+
+#endif // C_CATALOGSHTTPDOWNLOAD_H