diff -r 000000000000 -r dd21522fd290 codhandler/codeng/inc/HttpLoader.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/codhandler/codeng/inc/HttpLoader.h Mon Mar 30 12:54:55 2009 +0300 @@ -0,0 +1,558 @@ +/* +* Copyright (c) 2002 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of the License "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: +* Declaration of class CHttpLoader. +* +* +*/ + + +#ifndef HTTP_LOADER_H +#define HTTP_LOADER_H + +// INCLUDES + +#include +#include +#include +#include +#include "CodLoadObserver.h" +#include "HttpSessionBase.h" +#include "RFeatMgr.h" + +// FORWARD DECLARATION + +class MCodSaverFactory; +class CCodSaver; +class CConnection; +class CTimeout; +class TCodProgress; +class CCodEngBase; +class CHeaderField; + +// CLASS DECLARATION + +/** +* HTTP Loader. +*/ +NONSHARABLE_CLASS( CHttpLoader ) +: public CActive, + public MHTTPTransactionCallback, + public MHTTPDataSupplier, + public MHTTPAuthenticationCallback + { + public: // Constructors and destructor + + /** + * Two phased constructor. Leaves on failure. + * @param aConnection Connection. + * @param aCodLoadObserver Observer or NULL. + * @param aProgress Progress or NULL. + * @return The created loader. + */ + static CHttpLoader* NewL + ( + CConnection& aConnection, + MCodLoadObserver* aCodLoadObserver, + TCodProgress* aProgress, + CCodEngBase* aCodEngBase + ); + + /** + * Destructor. + */ + virtual ~CHttpLoader(); + + public: // new methods + + /** + * Issue load. + * @param aUrl Request URL. + * @param aSaverFactory Saver factory. Ownership not taken. + * @param aStatus Completes when done. + */ + void LoadL + ( + const TDesC8& aUrl, + MCodSaverFactory& aSaverFactory, + TRequestStatus* aStatus + ); + + /** + * Send status notification. + * @param aUrl Request URL. + * @param aNotifyBody Notify body to be sent. + * @param aStatus Completes when done. + */ + void NotifyL + ( + const TDesC8& aUrl, + const TDesC8& aNotifyBody, + TRequestStatus* aStatus + ); + + /** + * Set or unset observer. + * @param aCodLoadObserver Observer to set (pass NULL to unset). + */ + inline void SetObserver( MCodLoadObserver* aCodLoadObserver ); + + /** + * Load headers from info file + * @param info file handle + * @Added in OMA pause-resume feature. + */ + void LoadHeadersL( RFile& aFile ); + + /** + * Pause the HTTP transaction + */ + void Pause(); + + /** + * Get Response Headers + */ + CArrayPtrFlat* ResponseHeaders(); + + protected: // from CActive + + /** + * Cancel protocol implementation. + */ + virtual void DoCancel(); + + /** + * Outstanding request completed. + */ + virtual void RunL(); + + /** + * Handle error. + * @param aError Error code. + * @return KErrNone. + */ + virtual TInt RunError( TInt aError ); + + protected: // from MHTTPTransactionCallback + + /** + * Handle transaction event. + * @param aTransaction The transaction that the event has occurred on. + * @param aEvent The event that has occurred. + */ + virtual void MHFRunL + ( RHTTPTransaction aTransaction, const THTTPEvent& aEvent ); + + /** + * Handle errors occured in MHFRunL(). + * @param aError The leave code that MHFRunL left with. + * @param aTransaction The transaction that was being processed. + * @param aEvent The Event that was being processed. + * @return KErrNone. + */ + virtual TInt MHFRunError + ( + TInt aError, + RHTTPTransaction aTransaction, + const THTTPEvent& aEvent + ); + + protected: // from MHTTPDataSupplier + + /** + * Obtain a data part. The data is guaranteed + * to survive until a call is made to ReleaseData(). + * @param aDataPart The data part. + * @return ETrue if this is the last part. EFalse otherwise. + */ + virtual TBool GetNextDataPart( TPtrC8& aDataPart ); + + /** + * Release the current data part being held. + */ + virtual void ReleaseData(); + + /** + * Obtain the overall size of the data being supplied. + * @return Data size in bytes. + */ + virtual TInt OverallDataSize(); + + /** + * Reset the data supplier. + * @return KErrNone. + */ + virtual TInt Reset(); + + protected: // from MHTTPAuthenticationCallback + + /** Get credentials. + * @param aURI The URI being requested. + * @param aRealm The realm being requested. + * @param aAuthenticationType The type of authentication (basic or digest). + * @param aUsername The username is returned here. The caller will close + * the returned string. + * @param aPassword The password is returned here. The caller will close + * the returned string. + * @return True if credentials have been obtained. + */ + virtual TBool GetCredentialsL + ( + const TUriC8& aURI, + RString aRealm, + RStringF aAuthenticationType, + RString& aUsername, + RString& aPassword + ); + + private: // types + + enum TState ///< State. + { + EInit, ///< Initial state. + EStart, ///< Starting operation. + EOpen, ///< Opening session. + ERequest ///< HTTP request. + }; + + private: // Constructors and destructor + + /** + * Constructor. + * @param aConnection Connection. + * @param aCodLoadObserver Observer or NULL. + * @param aProgress Progress or NULL. + */ + CHttpLoader + ( + CConnection& aConnection, + MCodLoadObserver* aCodLoadObserver, + TCodProgress* aProgress , + CCodEngBase* aCodEng + ); + + /** + * Second phase constructor. Leaves on failure. + */ + void ConstructL(); + + protected: // state machine parts + + /** + * Open session. + */ + void OpenSessionL(); + + /** + * Make the HTTP request. + */ + void RequestL(); + + /** + * Clean up and notify parent. + */ + void Done(); + + /** + * Invoke next state asynchronously (via RunL()). + * @param aNextState Next state. + */ + void Continue( TState aNextState ); + + /** + * Complete own request status (if not already completed). + * @param aError Error code to complete with. + */ + void SelfComplete( TInt aError ); + + /** + * Create transaction, set request headers (and body for POST request). + */ + void CreateTransactionL(); + + /** + * Submit the transaction (make the HTTP request). + */ + void SubmitTransactionL(); + + /** + * Close the transaction and complete with aError. + */ + void CompleteTransaction( TInt aError ); + + + /** + * Close the transaction and complete with aError. + */ + void RestartTransaction(); + + /** + * Handle response from server. + * @param aResponse Response from server. + */ + void HandleResponseHeadersL( RHTTPResponse aResponse ); + + /** + * HTTP Version Not Supported. Resubmit transaction using HTTP/1.0. + * @return ETrue if transaction was resubmitted, EFalse if not (i.e + * we already use HTTP/1.0). + */ + TBool VersionRetryL(); + + /** + * 305 Use Proxy. Set proxy address and resubmit transaction - this is + * a redirect case which the redirect filter cannot do for us. + * Proxy is set only if currently no proxy is used. + * @return ETrue if transaction was resubmitted, EFalse if not. + */ + TBool UseProxyL(); + + /** + * Setup the session (session properties, filters). + */ + void SetupSessionL(); + + /** + * Start/restart timeout timer. + */ + void StartTimeout(); + + /** + * Handle timeout (fail or retry request). + */ + void Timeout(); + + /** + * Handle install-notify "timeout": checks if network is still available. + * if still available, assume that install-notify POST was submitted by + * network layer and make downloaded content available to user. + */ + void INTimeout(); + + /** + * Increment progress. + * @param aBytes Bytes received. + */ + void IncProgressL( TInt aBytes ); + + /** + * Checks if accept range is supported. + * @Added in OMA pause-resume feature + */ + TBool AcceptRangesSupported(); + + private: // helpers + + /** + * Helper function to set a header. + * @param aHeaders Set the header to this header set. + * @param aHdrField Header field name. + * @param aHdrValue Header value. + */ + void SetHeaderL + ( + RHTTPHeaders aHeaders, + HTTP::TStrings aHdrField, + const TDesC8& aHdrValue + ); + + /** + * Helper function to set a header. + * @param aHeaders Set the header to this header set. + * @param aHdrField Header field name. + * @param aHdrValue Header value. + */ + void SetHeaderL + ( + RHTTPHeaders aHeaders, + HTTP::TStrings aHdrField, + HTTP::TStrings aHdrValue + ); + + /** + * Helper function to set a header. + * @param aHeaders Set the header to this header set. + * @param aHdrField Header field name. + * @param aHdrValue Header value. + */ + void SetHeaderL + ( + RHTTPHeaders aHeaders, + HTTP::TStrings aHdrField, + const RStringF aHdrValue + ); + + /** + * Helper function to get the Content-Type header value. + * @param aHeaders HTTP header set. + * @return Content-Type header value. + */ + const TDesC8& GetContentTypeL( RHTTPHeaders aHeaders ); + + /** + * Returns content type list. + * @Added in OMA pause-resume feature + */ + const TDesC8& GetContentTypeL(); + + /** + * Helper function to get the source URI of a transaction. + * @param aTransaction Transaction. + * @return Source URI. + */ + const TDesC8& GetSourceUriL( RHTTPTransaction aTransaction ); + + /** + * Get a shared string from the session stringpool. + * @param aId Id of string. + * @return Shared string from HTTP string table. No need to close. + */ + inline RStringF StringF( HTTP::TStrings aId ); + + /** + * Static wrapper around the timeout function. + * @param aPtr This object as TAny* + * @return EFalse. + */ + static TInt StaticTimeout( TAny* aPtr ); + + /** + * Static wrapper around the install-notify timeout function. + * @param aPtr This object as TAny* + * @return EFalse. + */ + static TInt INStaticTimeout( TAny* aPtr ); + + /** + * Check status of HTTP network session and Access Point + * @return ETrue if network available, or EFalse if not. + */ + TBool IsConnectionActive(); + + /** + * Store entire response header with raw data in iHeaders array + * @since Series 60 v2.8 + * @return none. Leaves of error + */ + void StoreResponseHeaderL(); + + /** + * Appends the header finr to a buffer + * @return none. Leaves of error + * @Added in OMA pause-resume feature + */ + void AppendHeadersL( TPtr8& aBuf, + CArrayPtrFlat* aHeaders ); + /** + * Sets the range field in request headers + * @return none. Leaves of error + * @Added in OMA pause-resume feature + */ + void SetRangeFieldL( RStringPool& aStringPool, + RHTTPHeaders& aHeaders ); + + /** + * Searches for a given header in header list + * @return KErrNotFound if not found, header index otherwise + * @Added in OMA pause-resume feature + */ + TInt FindHeaderField( CArrayPtrFlat* aHeaders, + const TDesC8& aFieldName ) const; + + + /** + * Checks if the content is DRM content + * @return none + * @Added in OMA pause-resume feature + */ + void CheckRealDRMContentTypeL(); + + /** + * Update the pausability of download + * @return none + * @Added in OMA pause-resume feature + */ + void UpdatePausableL(); + + /** + * Sets the specified request header + * @return none + * @Added in OMA pause-resume feature + */ + void SetRequestHeaderL( RStringPool& aStringPool, RHTTPHeaders& aHeaders); + + /** + * Handles permanent redirection event + * @param aNewUrl new URL after redirection + * @return None. Leaves on error. + */ + void RedirectedPermanentlyL( const TDesC8& aNewUrl ); + + /** + * Handles temporary redirection event + * @param aNewUrl new URL after redirection + * @return None. Leaves on error. + */ + void RedirectedTemporaryL( const TDesC8& aNewUrl ); + + private: // debug utilities + + /** + * In debug build, log headers. In release build, do nothing. + * @param aHeaders Headers to log. + */ + void LogHeaders( RHTTPHeaders aHeaders ); + + private: // data + + HBufC8* iUri; ///< Request URI or NULL. Owned. + HTTP::TStrings iMethod; ///< Request method. + HTTP::TStrings iHttpVersion; ///< HTTP version. + HBufC8* iNotifyBody; ///< Notify body or NULL. Owned. + CHttpSessionBase* iSess; ///< HTTP session. Owned. + RHTTPTransaction iTrans; ///< Transaction. Owned. + CConnection& iConn; ///< Connection. Not owned. + + MCodSaverFactory* iSaverFactory; ///< Saver factory. Not owned. + CCodSaver* iSaver; ///< Saver. Not owned. + CTimeout* iTimeout; ///< Timeout timer. Owned. + MCodLoadObserver* iCodLoadObserver; ///< Observer or NULL. + TRequestStatus* iParentStatus; ///< Parent status. + TState iState; ///< Current state. + TInt iResult; ///< Resulting error code. + TBool iSuppressErrors; ///< Suppress errors. + TBool iProxySet; ///< ETrue if we have set a proxy. + RFeatMgr iFeatMgr; ///< Feature Manager. + TCodProgress* iProgress; ///< Progress or NULL. + TInt iRetry; ///< Retry count (incl. first). + CTimeout* iINTimeout; ///< Timeout timer for sending install-notify. Owned. + CCodEngBase* iCodEng; + HBufC8* iDownloadInfo; // contains download info + TBuf iFolderBuf; //Folder for cod download + CArrayPtrFlat* iResponseHeaders; // Response header + TDateTime iDate; + TDateTime iExpires; + TTimeIntervalSeconds iMaxAge; + + // Set to ETrue if KDRMOldContentType is found in response header. + TBool iPausableDRM; + TBool iDrmContentLengthValid; + + // Redirection + TBool iRedirect; + }; + +#include "HttpLoader.inl" + +#endif /*def HTTP_LOADER_H */