internetradio2.0/dataproviderinc/irlogodownloadengine.h
author Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
Mon, 19 Apr 2010 14:01:53 +0300
changeset 0 09774dfdd46b
child 3 ee64f059b8e1
permissions -rw-r--r--
Revision: 201011 Kit: 201015

/*
* 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:  Header of IRLogoDownloadEngine.cpp
*
*/





#ifndef IRLOGODOWNLOADENGINE_H
#define IRLOGODOWNLOADENGINE_H

#include <mhttpdatasupplier.h>
#include <mhttptransactioncallback.h>
#include <rhttptransaction.h>
#include <rhttpsession.h>
#include <rhttpheaders.h>
#include <http.h>
#include <es_sock.h>

#include <pspresetobserver.h>
#include "irfavoritesdb.h"
#include "irisdspreset.h"
#include "mlogodownloadobserver.h"
#include "ircacheobserver.h"
#include "iractivenetworkobserver.h"

/**
 * Used to specify the maximum header-field value length
 */
const TInt KMAXHEADERLENGTHS = 255;

//Forward Declarations
class RHTTPSession;
class RHTTPTransaction;
class CIRIsdsPreset;
class CIRFavoritesDb;
class CIRNetworkController;
class MLogoDownloadObserver;
class CIRCacheMgmt; //for logo cache mgmt
class CIRHttpResponseData;
class MIRActiveNetworkObserver;//for network up and downs



/**
* class CIRLogoDownlaodEngine
*/
class CIRLogoDownloadEngine : public CBase,	public MHTTPTransactionCallback,
                              public MHTTPDataSupplier,public MIRCacheObserver,
                              public MPSPresetObserver,
                              public MIRActiveNetworkObserver
{
public:
	/**
	* enum TState
	* status of the transaction
	*/
   	enum TState
    {   
    EIdle,
    ESendingEvent
    };
    
    /**
	* CIRLogoDownloadEngine* NewL()
	* Creates instance of CIRLogoDownloadEngine.
	*/
	IMPORT_C static CIRLogoDownloadEngine* NewL();
	
	/**
	* void SetFavDbInstance(CIRFavoritesDb* aFavDb)
	* To set the favorites db instance
	*/
    IMPORT_C void SetFavDbInstance(CIRFavoritesDb* aFavDb);
    
    /**
	* SendRequestL(CIRIsdsPreset* aPreset)
	* API is called from the SearchResultsView for to download logo
	*/
    IMPORT_C void SendRequestL(CIRIsdsPreset* aPreset,TInt aXValue=0,TInt aYValue=0);
    
    /**
	* SendRequestL(CIRIsdsPreset* aPreset,MLogoDownloadObserver* aLogoHandle
	*										,TInt aNPVReq,TInt aXValue,TInt aYValue)
	* API is called from the NowPlayingView for to download logo 
	*/
    IMPORT_C void SendRequestL(CIRIsdsPreset* aPreset,MLogoDownloadObserver* aLogoHandle,
    				TInt aNPVReq=1,TInt aXValue=0,TInt aYValue=0);
    
    IMPORT_C TBool isLogoCachedL(CIRIsdsPreset* aPreset, TInt aXValue=0, TInt aYValue=0);
    
    /**
	* CancelTransaction()
	* cancels the current transaction
	*/
    IMPORT_C void CancelTransaction();
    
    /**
	* TBool IsRunning() const
	* To know the status of downloading logo
	*/
    IMPORT_C TBool IsRunning() const;
    
    /**
	* ~CIRLogoDownloadEngine()
	* Destructs instance of CIRLogoDownloadEngine
	*/
    IMPORT_C ~CIRLogoDownloadEngine();
    
    /**
	* void SendPresetWithLogoL()
	* sends the preset with logo to the requestors
	*/
    IMPORT_C void SendPresetWithLogoL();
    
    /**
    * GetCacheLogoL(TDesC& aUrl,TInt& aStatus)
    * takes the url as a parameter and returns the logo data which is in cache
    * this API is called form the search results for to display logo on the view
    */
    IMPORT_C void GetCacheLogoL(const TDesC& aUrl,TInt& aStatus);
	
	/**
	* TDesC8& SendCacheLogo()
    * sends the logo which is cached
    */
	IMPORT_C TDesC8& SendCacheLogo();

    
    
    /**
	* void FetchLogoDataL(CIRIsdsPreset* aPreset)
	* API is used to download logo from isds/internet
	* called in the API SendRequestL(CIRIsdsPreset* aPreset)
	*/
    void FetchLogoDataL(CIRIsdsPreset* aPreset);
    
    /**
	* void FetchLogoDataL(CIRIsdsPreset* aPreset,MLogoDownloadObserver* aLogoHandle,TInt aNPVReq)
	* API is used to download logo from isds/internet
	* called in the API SendRequestL(CIRIsdsPreset* aPreset,MLogoDownloadObserver* aLogoHandle)
	*/
	void FetchLogoDataL(CIRIsdsPreset* aPreset,MLogoDownloadObserver* aLogoHandle,TInt aNPVReq);
	
	/**
	* void ManagePresetArrayIndexL()
	* To update the iPresetArray current index
	*/
	void ManagePresetArrayIndexL();
	
	/**
	* void ManageCachePresetArrayIndexL()
	* To update the iCachePresetArray current index
	*/
	void ManageCachePresetArrayIndexL();

    /**
	* void CacheError()
	* Called from cachemgmt in case of an error
	* callback API from MIRCacheObserver
	*/   
    void CacheError();
    
	/**
	* void CacheFailed()
	* Called from cachemgmt in case of cache failure
	* callback API from MIRCacheObserver
	*/ 
    void CacheFailed();
    
	/**
	* void CacheInvalid()
	* Called from cachemgmt in case cache is invalid
	* callback API from MIRCacheObserver
	*/ 
    void CacheInvalid();
    
	/**
	* void CachedStructureL()
	* Called from cachemgmt data retrival is successful
	*@param aChoice,it gives the data type of the cache
	* callback API from MIRCacheObserver
	*/ 
    void CachedStructureL(TInt aChoice);
    
    /**
     *  ReleaseResources();
     *  Releases the resources held by logo download engine
     */
    void ReleaseResources();
	
	/**
	 * HandlePresetChangedL
	 * whenever their is any change in preset
	 * the function will get invoked.
	 * callback API from MPSPresetObserver
	 */
	void HandlePresetChangedL( TInt aId, TUid aDataHandler, MPSPresetObserver::TPSReason aReason );
	
	//from MIRActiveNetworkObserver
	/**
	 * Notified by network controller when network is active
	 * to reissue the request  
	 * NotifyActiveNetworkObserversL()
	 */	
	 void NotifyActiveNetworkObserversL(TIRNetworkEvent aEvent);

		 
	 /**
	 * Notifies all observers whose network request is active
	 * to reset the pending request status  
	 * ResetPendingRequests()
	 */	
	 void ResetPendingRequests(TBool aValue);

	
private:
	/**
	* void ConstructL()
	* 2nd phase construction
	*/
	void ConstructL();
	
	/**
	* CIRLogoDownloadEngine()
	* Standard C++ constructor
	*/
    CIRLogoDownloadEngine();        
    
    /**
	* void SetHeaderL(RHTTPHeaders aHeaders, TInt aHdrField, const TDesC8& aHdrValue) const
	* to set the headers of the http transaction
	*/
    void SetHeaderL(RHTTPHeaders aHeaders, TInt aHdrField, const TDesC8& aHdrValue) const;
    
    /**
	* void IssueLogoDownloadRequest()
	* submits the transaction for to download the logo
	*/
	void IssueLogoDownloadRequestL();	    
	
	/**
	* void CheckCacheForLogoL(TInt aValue)
	* checks the logo in the cache
	*/
	void CheckCacheForLogoL(TInt aValue);
	
	/**
	* void MHFRunL(RHTTPTransaction aTransaction, const THTTPEvent& aEvent)
	* from MHTTPTransactionCallback
	*/
	void MHFRunL(RHTTPTransaction aTransaction, const THTTPEvent& aEvent);
    
    /**
	* TInt MHFRunError(TInt aError, RHTTPTransaction aTransaction, const THTTPEvent& aEvent)
	* //from MHTTPTransactionCallback
	*/
    TInt MHFRunError(TInt aError, RHTTPTransaction aTransaction, const THTTPEvent& aEvent);
    
    /**
	* void ReleaseData()
	* from MHTTPDataSupplier
	*/
	void ReleaseData();
    
    /**
	* TBool GetNextDataPart(TPtrC8& aDataPart)
	* from MHTTPDataSupplier
	*/
    TBool GetNextDataPart(TPtrC8& aDataPart);
    
    /**
	* TInt Reset()
	* from MHTTPDataSupplier
	*/
    TInt Reset();
    
    /**
	* TInt OverallDataSize()
	* from MHTTPDataSupplier
	*/
    TInt OverallDataSize();
    
     /**
     *  CIRLogoDownloadEngine::ExtractResponseHeadersL(
	 *  RHTTPTransaction aTransaction )
     *  Used to Extract the response headers.
     *  @param aTransaction HTTP Transaction object
     */
    void ExtractResponseHeadersL( const RHTTPTransaction& aTransaction );
    
    /**
     *  CIRLogoDownloadEngine::HttpHeaderReceived( const TDesC8& aHeaderData )
     *  indicate that an HTTP header is received.
     *  @param aHeaderData Reference to the Header Info
     */
    virtual void HttpHeaderReceived( const TDesC8 &aHeaderData );
    
    /**
     * CIRLogoDownloadEngine::ExtractHeaderValue(const TDesC8& aHeaderData,
     *	       const TDesC8& aHeaderName,const TDesC8& aDelimeter,
     *	       TDes8& aHolder) const
     * Used to build the CIRHttpResponseData
     */
    void ExtractHeaderValue(const TDesC8& aHeaderData,
    	const TDesC8& aHeaderName,const TDesC8& aDelimeter,
    	TDes8& aHolder) const;

    /**
     * CIRLogoDownloadEngine::HttpDateHeaderReceived(const TDesC8 &aHeader,const TTime& aTime )
     * Used to build the CIRHttpResponseData members
     */
	void HttpDateHeaderReceived(const TDesC8 &aHeader,const TTime& aTime );
    	
	
private:
    /**
    * pointer to the logo observer object
    */	
	MLogoDownloadObserver* iLogoHandle;
	
	/**
    * pointer to the logo observer object
    */
	MLogoDownloadObserver* iTempLogoHandle;
	
	/**
    * pointer to the logo observer object
    */
	MLogoDownloadObserver* iCacheTempLogoHandle;
	
	/**
    * pointer to the favorites db object
    */
	CIRFavoritesDb* iFavDb;
	
	/**
    * pointer to the preset object
    * temporary preset in the logo downloading usecase
    */
	CIRIsdsPreset* iTempPreset;
	
	/**
    * pointer to the preset object
    * temporary preset in the cache checking usecase
    */
	CIRIsdsPreset* iCacheTempPreset;
	
	/**
    * pointer to the preset object
    * preset used to conver CIRPreset to CIRIsdsPreset
    */
	CIRIsdsPreset* iCopyPreset;

    /**
    * Network controller handle pointer
    */
    CIRNetworkController *iIRNetworkControllerHandle;
    
    /**
    * Preset Array for downloading logo
    */
    CArrayPtrFlat<CIRIsdsPreset>*  iPresetArray;
    
    /**
    * Preset Array for checking cache
    */
    CArrayPtrFlat<CIRIsdsPreset>*  iCachePresetArray;
    
    /**
    * MLogoDownloadObserver array for downloading logo
    */
    CArrayPtrFlat<MLogoDownloadObserver>*   iObserverArray;
    
    /**
    * MLogoDownloadObserver array for checking cache
    */
    CArrayPtrFlat<MLogoDownloadObserver>*   iCacheObserverArray;
    
    /**
    * To keep track whether the req came for Favorites or NPV(downloading logo)
    */
    CArrayFixFlat<TInt>*    iReqFromArray;
    
    /**
    * To keep track whether the req came for Favorites or NPV(checking cache)
    */
    CArrayFixFlat<TInt>*    iCacheReqFromArray;
    
    /**
    * Separate session for the logo downloading
    */
    RHTTPSession    iLogoSession;
    
    /**
    * http transaction
    */
    RHTTPTransaction		iTransaction;
    
    /**
    * for the transactions with cache mgmt
    */
	CIRCacheMgmt *iCache;
	
	/**
    * Pointer to Response header data
    */
	CIRHttpResponseData* iResponseHeaders;
	
	/**
    * boolean for to know the status of the downloading logo
    */
    TBool	iRunning;	
    
    /**
    * body of the transaction request
    */
    TDesC8* iReqBody;
    
    /**
    * body of the transaction response
    */
    HBufC8* iRespBody;
    
    /**
    * size of the response body
    */
    TInt    iRespBodySize;
    
    /**
    * state of the transaction
    */
    TState  iState;
    
    /**
    * status, from which the preset has modified
    */
    TBool iPresetModifiedStatus;
    
    
    /**
    * iPresetArray position
    */
	TInt    iPresetArrayPos;
	
	/**
    * position of the iReqFromArray
    */
	TInt    iReqFromArrayPos;
	
	/**
    * position of the iObserverArray
    */
	TInt    iObserverArrayPos;
	
	/**
    * position of the iCachePresetArray
    */
	TInt    iCachePresetArrayPos;
	
	/**
    * position of the iCacheReqFromArray
    */
	TInt    iCacheReqFromArrayPos;
	
	/**
    * position of the iCacheObserverArray
    */
	TInt    iCacheObserverArrayPos;
	
	/**
    * status of cache request
    */
	TInt    iCacheReqFrom;
	
	/**
    * temporary variable for the status of request
    */
	TInt    iTempReqFrom;
	
	/**
    * boolean to verify first time or not
    */
	TBool	iFirstTime;
	
	/**
    * ETrue if logo is available in cache
    */
	TBool   iLogoCached; 
	
	/**
    * boolean for forcibly getting the logo from cache
    */
	TBool   iForceGet;
	
	/**
    * boolean for to track whether the cache request has made or not
    */
	TBool   iCacheReqMade;
	
	/**
    * response from the cache for the availability of logo(CacheNotValid,NotCached,CacheUseable)
    */
	TInt 	iResult;
	
	/**
    * status on cache checking
    */
	TBool 	iCheckingCache;
	
	/**
    * integer for the status of sending the logo
    */
	TInt 	iSendingLogo;
	
	/**
    * Using for temporarily till the isds provides urls
    */
	TInt 	iImageIndex;
	
	/**
	* this is used while making a conditional GET request
	*/
	TTime iLastModifiedTime;
	
	/**
	* this is used while making a conditional GET request
	*/
	TBuf8 < KMAXHEADERLENGTHS > iETag;
	
	/**
	* this is used to track whether the request is conditional GET or non-conditional GET
	*/
	TBool iIsConditionalGET;
	
	/**
	* Status of the logo download in the network up and down scenarios
	*/
	TBool iLogoRequestPending;
	
	/**
	* status of the response code
	*/
	TInt iRespCode;
	
};

#endif // IRLOGODOWNLOADENGINE_H