internetradio2.0/dataprovidersrc/irlogodownloadengine.cpp
changeset 0 09774dfdd46b
child 3 ee64f059b8e1
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/internetradio2.0/dataprovidersrc/irlogodownloadengine.cpp	Mon Apr 19 14:01:53 2010 +0300
@@ -0,0 +1,1685 @@
+/*
+* 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:  Engine to fetch the logos 
+*
+*/
+
+
+#include <aknnotewrappers.h> 
+
+#include "irlogodownloadengine.h"
+#include "irnetworkcontroller.h"
+#include "ircachemgmt.h"
+#include "irhttprequestdata.h"
+#include "irpreset.h"
+#include "irdebug.h"
+#include "irdataproviderconstants.h"
+#include "iractivenetworkobserver.h"
+
+
+
+_LIT(KLogoX, "?x=");
+_LIT(KLogoY, "&y=");
+const TInt KPresetsArrayMaxLength = 50;
+const TInt KLogoSize = 59;
+const TInt KParameterSize = 12;
+const TInt KTen = 10;
+const TInt KCacheAvailable = 4;
+const TInt KLogo = 4;
+const TInt KStatusOK = 200;
+const TInt KStatusMultipleChoices = 300;
+const TInt KStatusNotModified = 304;
+const TInt KStatusGatewayTimeout = 504;
+
+
+// ---------------------------------------------------------------------------
+// CIRLogoDownloadEngine::NewL()
+// Creates instance of CIRLogoDownloadEngine.
+// ---------------------------------------------------------------------------
+//
+EXPORT_C CIRLogoDownloadEngine* CIRLogoDownloadEngine::NewL()
+	{
+	IRLOG_DEBUG( "CIRLogoDownloadEngine::NewL - Entering" );
+    CIRLogoDownloadEngine* self = new(ELeave) CIRLogoDownloadEngine();
+    CleanupStack::PushL(self);
+    self->ConstructL();
+    CleanupStack::Pop(self);
+    IRLOG_DEBUG( "CIRLogoDownloadEngine::NewL - Exiting" );
+    return self;
+	}
+
+// ---------------------------------------------------------------------------
+// CIRLogoDownloadEngine::CIRLogoDownloadEngine()
+// Standard C++ constructor
+// ---------------------------------------------------------------------------
+//
+CIRLogoDownloadEngine::CIRLogoDownloadEngine()
+	{
+	IRLOG_DEBUG( "CIRLogoDownloadEngine::CIRLogoDownloadEngine " );
+	//code here, if needed
+	}
+	
+	
+	
+// ---------------------------------------------------------------------------
+// CIRLogoDownloadEngine::~CIRLogoDownloadEngine()
+// Destructs instance of CIRLogoDownloadEngine.
+// ---------------------------------------------------------------------------
+//
+EXPORT_C CIRLogoDownloadEngine::~CIRLogoDownloadEngine()
+	{
+	IRLOG_DEBUG( "CIRLogoDownloadEngine::~CIRLogoDownloadEngine - Entering" );
+    if(iReqBody)
+    	{
+    	delete iReqBody;
+    	iReqBody = NULL;
+    	}
+    if(iRespBody)
+    	{
+    	delete iRespBody;
+    	iRespBody = NULL;
+    	}
+	CancelTransaction();
+	iLogoSession.Close();
+	
+	if(iCopyPreset)
+		{
+		delete iCopyPreset;
+		}
+	if(iCacheTempPreset)
+		{
+		delete iCacheTempPreset;			
+		}
+	if(iTempPreset)
+		{
+		delete iTempPreset;			
+		}
+	if(iPresetArray)
+		{
+		iPresetArray->ResetAndDestroy();
+		}
+	delete iPresetArray;
+	if(iObserverArray)
+		{
+		delete iObserverArray;
+		iObserverArray = NULL;
+		}
+	if(iReqFromArray)
+		{
+		delete iReqFromArray;
+		iReqFromArray = NULL;
+		}
+	if(iCachePresetArray)
+		{
+		iCachePresetArray->ResetAndDestroy();
+		}
+	delete iCachePresetArray;
+	if(iCacheObserverArray)
+		{
+		delete iCacheObserverArray;
+		iCacheObserverArray = NULL;
+		}
+	if(iCacheReqFromArray)
+		{
+		delete iCacheReqFromArray;
+		iCacheReqFromArray = NULL;
+		}
+	if(iIRNetworkControllerHandle)
+    	{
+    	iIRNetworkControllerHandle->DeleteActiveNetworkObserver(*this);
+    	iIRNetworkControllerHandle->Close();
+        }		
+    if (iCache)
+	    {
+	    iCache->RemoveObserver(this);
+	    iCache->Close();
+	    }
+	if( iResponseHeaders )
+		{
+        delete iResponseHeaders;
+		}
+	IRLOG_DEBUG( "CIRLogoDownloadEngine::~CIRLogoDownloadEngine - Exiting" );
+	}
+
+
+
+// ---------------------------------------------------------------------------
+// CIRLogoDownloadEngine::ConstructL()
+// 2nd phase construction
+// ---------------------------------------------------------------------------
+//
+void CIRLogoDownloadEngine::ConstructL()
+	{
+	IRLOG_DEBUG( "CIRLogoDownloadEngine::ConstructL - Entering" );
+	iPresetArray = new (ELeave) CArrayPtrFlat<CIRIsdsPreset>(KPresetsArrayMaxLength);
+	iObserverArray = new (ELeave) CArrayPtrFlat<MLogoDownloadObserver>(KPresetsArrayMaxLength);
+	iReqFromArray = new (ELeave) CArrayFixFlat<TInt>(KPresetsArrayMaxLength);
+	iCachePresetArray = new (ELeave) CArrayPtrFlat<CIRIsdsPreset>(KPresetsArrayMaxLength);
+	iCacheObserverArray = new (ELeave) CArrayPtrFlat<MLogoDownloadObserver>(KPresetsArrayMaxLength);
+	iCacheReqFromArray = new (ELeave) CArrayFixFlat<TInt>(KPresetsArrayMaxLength);
+	
+	iPresetArrayPos = 0;
+	iReqFromArrayPos = 0;
+	iObserverArrayPos = 0;
+	iCachePresetArrayPos = 0;
+	iCacheReqFromArrayPos = 0;
+	iCacheObserverArrayPos = 0;
+	iImageIndex = 0; //using temporarily till the isds provides urls
+
+	iPresetModifiedStatus = EFalse;
+	iFirstTime = ETrue;
+	iIRNetworkControllerHandle = CIRNetworkController::OpenL();
+	iIRNetworkControllerHandle->RegisterActiveNetworkObserverL(*this);
+	iCache = CIRCacheMgmt::OpenL(*this);
+	iCache->AddObserverL(this);
+	iResponseHeaders = new ( ELeave ) CIRHttpResponseData;
+
+	//change to use the new session for logo downloading
+	TRAPD( LeaveValue, iLogoSession.OpenL() );
+    if ( LeaveValue != KErrNone )
+        {
+        // Most common error; no access point configured, and session creation
+        // leaves with KErrNotFound.
+        // Load a string from the resource file and add the error code to string
+        User::Leave( LeaveValue );
+        }
+    IRLOG_DEBUG( "CIRLogoDownloadEngine::ConstructL - Exiting" );
+	}
+
+
+// ---------------------------------------------------------------------------
+// CIRLogoDownloadEngine::IsRunning()
+// To know the status of downloading logo
+// ---------------------------------------------------------------------------
+//
+EXPORT_C TBool CIRLogoDownloadEngine::IsRunning() const
+	{
+	IRLOG_DEBUG( "CIRLogoDownloadEngine::IsRunning" );
+    return iRunning;
+	}
+
+
+// ---------------------------------------------------------------------------
+// CIRLogoDownloadEngine::SetHeaderL(RHTTPHeaders aHeaders, TInt aHdrField,
+//                              const TDesC8& aHdrValue)
+// to set the headers of the http transaction
+// ---------------------------------------------------------------------------
+//
+void CIRLogoDownloadEngine::SetHeaderL(RHTTPHeaders aHeaders, TInt aHdrField,
+					 const TDesC8& aHdrValue) const
+	{
+	IRLOG_DEBUG( "CIRLogoDownloadEngine::SetHeaderL - Entering" );
+	RStringF valStr = iLogoSession.StringPool().OpenFStringL(aHdrValue);
+	CleanupClosePushL(valStr);
+	THTTPHdrVal val(valStr);
+	aHeaders.SetFieldL(iLogoSession.StringPool().StringF(aHdrField, RHTTPSession::GetTable()), val);
+	CleanupStack::PopAndDestroy(&valStr); // valStr
+	IRLOG_DEBUG( "CIRLogoDownloadEngine::SetHeaderL - Exiting" );
+	}
+
+// ---------------------------------------------------------------------------
+// CIRLogoDownloadEngine::SetFavDbInstance(CIRFavoritesDb* aFavDb)
+// To set the favorites db instance
+// ---------------------------------------------------------------------------
+//
+EXPORT_C void CIRLogoDownloadEngine::SetFavDbInstance(CIRFavoritesDb* aFavDb)
+	{
+	IRLOG_DEBUG( "CIRLogoDownloadEngine::SetFavDbInstance - Entering" );
+	iFavDb = aFavDb;
+	iFavDb->AddObserver( *this );
+	IRLOG_DEBUG( "CIRLogoDownloadEngine::SetFavDbInstance - Exiting" );
+	}
+
+
+// ----------------------------------------------------------------------------------
+// CIRLogoDownloadEngine::SendRequestL(CIRIsdsPreset* aPreset,TInt aXValue,TInt aYValue)
+// API is called from the SearchResultsView for to download logo while doing Add to Favorites
+// ----------------------------------------------------------------------------------
+//
+EXPORT_C void CIRLogoDownloadEngine::SendRequestL(CIRIsdsPreset* aPreset,TInt aXValue,TInt aYValue)
+	{
+	IRLOG_DEBUG( "CIRLogoDownloadEngine::SendRequestL - Entering" );
+	if(!iCheckingCache)
+		{
+		++iImageIndex;
+		iCheckingCache = ETrue;
+		iCacheReqFrom = 0;
+		if(iCacheTempPreset)
+			{
+			delete iCacheTempPreset;				
+			}
+		iCacheTempPreset = NULL;
+		iCacheTempPreset = CIRIsdsPreset::NewL();
+		*iCacheTempPreset = *aPreset;
+
+		if(iCacheTempPreset->GetImgUrl().Length() != 0)
+			{
+			if((aXValue > 0)&&(aYValue > 0))
+				{
+				//Append the parameters(width,height) of the logo size to imgUrl
+				TInt size = iCacheTempPreset->GetImgUrl().Length() + KParameterSize;
+				RBuf urlWithSize;
+				urlWithSize.Create(size);
+				urlWithSize.Copy(iCacheTempPreset->GetImgUrl());
+				urlWithSize.Append(KLogoX);
+				urlWithSize.AppendNum(aXValue);
+				urlWithSize.Append(KLogoY);
+				urlWithSize.AppendNum(aYValue);
+				
+				//set the imgUrl with parameters to the preset
+				iCacheTempPreset->SetImgUrl(urlWithSize);
+				urlWithSize.Close();
+				}
+			//This method checks whether the logo is available
+ 			// for the request made
+			iForceGet = EFalse; 			
+			CheckCacheForLogoL(0);
+			}
+		else
+			{
+			//imgUrl doesnt exist in the Preset
+		    iCheckingCache = EFalse;
+			return;			
+			}
+
+		iCheckingCache = EFalse;
+		if(!iLogoCached)	
+			{
+			FetchLogoDataL(iCacheTempPreset);				
+			}
+		}
+	else
+		{
+		CIRIsdsPreset* tempPreset;
+		tempPreset = CIRIsdsPreset::NewL();
+		*tempPreset = *aPreset;
+		if(tempPreset->GetImgUrl().Length() != 0)
+			{
+			if((aXValue > 0)&&(aYValue > 0))
+				{
+				//Append the parameters(width,height) of the logo size to imgUrl
+				TInt size = tempPreset->GetImgUrl().Length() + KParameterSize;
+				RBuf urlWithSize;
+				urlWithSize.Create(size);
+				urlWithSize.Copy(tempPreset->GetImgUrl());
+				urlWithSize.Append(KLogoX);
+				urlWithSize.AppendNum(aXValue);
+				urlWithSize.Append(KLogoY);
+				urlWithSize.AppendNum(aYValue);
+				
+				//set the imgUrl with parameters to the preset
+				tempPreset->SetImgUrl(urlWithSize);
+				urlWithSize.Close();				
+				}
+			}
+		iCachePresetArray->AppendL(tempPreset);
+ 		iCacheReqFromArray->AppendL(0);	
+		}	
+	IRLOG_DEBUG( "CIRLogoDownloadEngine::SendRequestL - Exiting" );
+	}
+
+
+EXPORT_C TBool CIRLogoDownloadEngine::isLogoCachedL(CIRIsdsPreset* aPreset, TInt aXValue, TInt aYValue)
+{
+    TInt cached = 0;
+    
+    if(iCacheTempPreset)
+    {
+        delete iCacheTempPreset;
+        iCacheTempPreset = NULL;
+    }
+    
+    iCacheTempPreset = CIRIsdsPreset::NewL();
+    *iCacheTempPreset = *aPreset;
+    iCacheReqMade = EFalse;
+    
+    if (iCacheTempPreset->GetImgUrl().Length() != 0)
+    {
+        if ((aXValue > 0) && (aYValue > 0))
+        {
+            //Append the parameters(width,height) of the logo size to imgUrl
+            TInt size = iCacheTempPreset->GetImgUrl().Length() + KParameterSize;
+            RBuf urlWithSize;
+            urlWithSize.Create(size);
+            urlWithSize.Copy(iCacheTempPreset->GetImgUrl());
+            urlWithSize.Append(KLogoX);
+            urlWithSize.AppendNum(aXValue);
+            urlWithSize.Append(KLogoY);
+            urlWithSize.AppendNum(aYValue);
+
+            //set the imgUrl with parameters to the preset
+            iCacheTempPreset->SetImgUrl(urlWithSize);
+            urlWithSize.Close();
+        }
+    }
+    
+    iCache->CheckCacheL(KLogo,iCacheTempPreset->GetImgUrl(),EFalse,cached);
+    
+    return (CIRCacheMgmt::ECacheUseable == cached)?ETrue:EFalse;     
+}
+// ----------------------------------------------------------------------------------------------
+// CIRLogoDownloadEngine::SendRequestL(CIRIsdsPreset* aPreset,MLogoDownloadObserver* aLogoHandle,
+//													TInt aNPVReq,TInt aXValue,TInt aYValue)
+// API is called from several views for to download logo 
+// ----------------------------------------------------------------------------------------------
+//
+EXPORT_C void CIRLogoDownloadEngine::SendRequestL(CIRIsdsPreset* aPreset,
+			MLogoDownloadObserver* aLogoHandle,TInt aNPVReq,TInt aXValue,TInt aYValue)
+	{
+	IRLOG_DEBUG( "CIRLogoDownloadEngine::SendRequestL - Entering" );
+	if(aPreset->GetChannelType()==0)
+		{
+		aLogoHandle->PresetLogoDownloadedL(aPreset);
+		}
+	else if(!iCheckingCache)
+		{
+		++iImageIndex;
+		iCheckingCache = ETrue;
+		if(aNPVReq==2)
+			{
+			iCacheReqFrom=2;			
+			}
+		else
+			{
+			iCacheReqFrom=1;			
+			}
+
+		if(iCacheTempPreset)
+			{
+			delete iCacheTempPreset;
+			iCacheTempPreset = NULL;				
+			}
+		iCacheTempPreset = CIRIsdsPreset::NewL();
+		*iCacheTempPreset = *aPreset;
+		iCacheTempLogoHandle = aLogoHandle;
+		
+		if(iCacheTempPreset->GetImgUrl().Length() != 0)
+			{
+			if((aXValue > 0)&&(aYValue > 0))
+				{
+				//Append the parameters(width,height) of the logo size to imgUrl
+				TInt size = iCacheTempPreset->GetImgUrl().Length() + KParameterSize;
+				RBuf urlWithSize;
+				urlWithSize.Create(size);
+				urlWithSize.Copy(iCacheTempPreset->GetImgUrl());
+				urlWithSize.Append(KLogoX);
+				urlWithSize.AppendNum(aXValue);
+				urlWithSize.Append(KLogoY);
+				urlWithSize.AppendNum(aYValue);
+				
+				//set the imgUrl with parameters to the preset
+				iCacheTempPreset->SetImgUrl(urlWithSize);
+				urlWithSize.Close();
+				}
+			if(iCacheReqFrom==1 || iCacheReqFrom==2)
+				{
+				//This method checks whether the logo is available
+		 		// for the request made
+				iForceGet = EFalse;		 		
+				CheckCacheForLogoL(0);	
+				}
+/*			else if(iCacheReqFrom==2)
+				{
+				//the request has come from NowPlayingView(NPV)
+				//dont check for logo availability in cache
+				//download the logo freshly
+				iLogoCached=EFalse;								
+				}
+*/			}
+		else
+			{
+			//imgUrl doesnt exist in the Preset
+		    iCheckingCache = EFalse;
+			return;			
+			}
+		
+		iCheckingCache = EFalse;
+		if(!iLogoCached)	
+			{
+			FetchLogoDataL(iCacheTempPreset,aLogoHandle,iCacheReqFrom);				
+			}
+		}
+	else
+		{
+		CIRIsdsPreset* tempPreset;
+		tempPreset = CIRIsdsPreset::NewL();
+		*tempPreset = *aPreset;
+		if(tempPreset->GetImgUrl().Length() != 0)
+			{
+			if((aXValue > 0)&&(aYValue > 0))
+				{
+				//Append the parameters(width,height) of the logo size to imgUrl
+				TInt size = tempPreset->GetImgUrl().Length() + KParameterSize;
+				RBuf urlWithSize;
+				urlWithSize.Create(size);
+				urlWithSize.Copy(tempPreset->GetImgUrl());
+				urlWithSize.Append(KLogoX);
+				urlWithSize.AppendNum(aXValue);
+				urlWithSize.Append(KLogoY);
+				urlWithSize.AppendNum(aYValue);
+				
+				//set the imgUrl with parameters to the preset
+				tempPreset->SetImgUrl(urlWithSize);
+				urlWithSize.Close();				
+				}
+			}
+		iCachePresetArray->AppendL(tempPreset);
+ 		iCacheObserverArray->AppendL(aLogoHandle);
+ 		if(aNPVReq == 2)
+	 		{
+	 		iCacheReqFromArray->AppendL(2);		
+	 		}
+ 		else
+	 		{
+	 		iCacheReqFromArray->AppendL(1);		
+	 		}
+		}
+	IRLOG_DEBUG( "CIRLogoDownloadEngine::SendRequestL - Exiting" );
+	}
+
+
+
+// ----------------------------------------------------------------------------------
+// CIRLogoDownloadEngine::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
+// ----------------------------------------------------------------------------------
+//
+EXPORT_C void CIRLogoDownloadEngine::GetCacheLogoL(const TDesC& aUrl,TInt& aStatus)
+	{
+	IRLOG_DEBUG( "CIRLogoDownloadEngine::GetCacheLogoL - Entering" );
+	iSendingLogo=2;
+	iResult = 0;
+	iForceGet = EFalse;
+	//2 means, this API is called for the search results view
+	iCacheReqMade = ETrue;
+	iCache->CheckCacheL(KLogo,aUrl,iForceGet,iResult);		
+	aStatus = iResult;
+	IRLOG_DEBUG( "CIRLogoDownloadEngine::GetCacheLogoL - Exiting" );
+
+	}
+	
+	
+// ----------------------------------------------------------------------------------
+// CIRLogoDownloadEngine::SendCacheLogo()
+// sends the logo which is cached
+// ----------------------------------------------------------------------------------
+//
+EXPORT_C TDesC8& CIRLogoDownloadEngine::SendCacheLogo()
+	{
+	IRLOG_DEBUG( "CIRLogoDownloadEngine::SendCacheLogo" );
+	return iCache->iLogoData;
+	}
+
+
+
+
+// ------------------------------------------------------------------------
+// CIRLogoDownloadEngine::FetchLogoDataL(CIRIsdsPreset* aPreset)
+// API is used to download logo from isds/internet
+// called in the API SendRequestL(CIRIsdsPreset* aPreset)
+// ------------------------------------------------------------------------
+//
+void CIRLogoDownloadEngine::FetchLogoDataL(CIRIsdsPreset* aPreset)
+	{
+	IRLOG_DEBUG( "CIRLogoDownloadEngine::FetchLogoDataL - Entering" );
+ 	if(!iRunning)
+	 	{
+
+	  	iTempReqFrom = 0;//which means the request came from SearchView while doing Add to Favorite
+	 	if( iReqBody )
+		 	{
+		 	delete iReqBody;
+		    iReqBody = NULL;
+		 	}
+	    if( iRespBody )
+		    {
+		    delete iRespBody;
+		    iRespBody = NULL;
+		    }
+		if(iTempPreset)
+			{
+			delete iTempPreset;
+			iTempPreset = NULL;				
+			}
+		iTempPreset = CIRIsdsPreset::NewL();
+	    *iTempPreset = *aPreset;
+   	    if(iTempPreset->GetImgUrl().Length() != 0)
+		    {
+	    	IssueLogoDownloadRequestL();
+		   	}
+	    else /*ImgUrl doesnt exist in the iTempPreset*/
+		    {
+	    	//simply ignore it
+		    }
+	    }
+ 	else
+	 	{
+	 	CIRIsdsPreset* tempPreset;
+	 	tempPreset = CIRIsdsPreset::NewL();
+	 	CleanupStack::PushL(tempPreset);
+	 	*tempPreset = *aPreset;
+	 	iPresetArray->AppendL(tempPreset);
+	 	CleanupStack::Pop(tempPreset);
+ 		iReqFromArray->AppendL(0);
+	 	}
+ 	IRLOG_DEBUG( "CIRLogoDownloadEngine::FetchLogoDataL - Exiting" );
+	}
+
+
+// -------------------------------------------------------------------------------------------------
+// CIRLogoDownloadEngine::FetchLogoDataL(CIRIsdsPreset* aPreset,MLogoDownloadObserver* aLogoHandle)
+// API is used to download logo from isds/internet
+// called in the API SendRequestL(CIRIsdsPreset* aPreset,MLogoDownloadObserver* aLogoHandle)
+// -------------------------------------------------------------------------------------------------
+//
+void CIRLogoDownloadEngine::FetchLogoDataL(CIRIsdsPreset* aPreset,
+				MLogoDownloadObserver* aLogoHandle,TInt aNPVReq)
+	{
+	IRLOG_DEBUG( "CIRLogoDownloadEngine::FetchLogoDataL - Entering" );
+	if(!iRunning)
+	 	{
+	 	if(aNPVReq==2)
+		 	{
+		 	iTempReqFrom = 2;//which means the request came from NowPlayingView	 		
+		 	}
+	 	else
+		 	{
+		 	iTempReqFrom = 1;//which means the request came from other than NowPlayingView	 		
+		 	}
+
+		iTempLogoHandle = aLogoHandle;
+		if( iReqBody )
+		 	{
+		 	delete iReqBody;
+		    iReqBody = NULL;
+		 	}
+	    if( iRespBody )
+		    {
+		    delete iRespBody;
+		    iRespBody = NULL;
+		    }
+		if(iTempPreset)
+			{
+			delete iTempPreset;
+			iTempPreset = NULL;				
+			}
+		iTempPreset = CIRIsdsPreset::NewL();
+	    *iTempPreset = *aPreset;
+	    if(iTempPreset->GetImgUrl().Length() != 0)
+		    {
+	    	IssueLogoDownloadRequestL();
+			}
+	    else /*ImgUrl doesnt exist in the iTempPreset*/
+		    {
+	    	//simply ignore it
+		    }
+	    }
+ 	else
+	 	{
+	 	CIRIsdsPreset* tempPreset;
+	 	tempPreset = CIRIsdsPreset::NewL();
+	 	CleanupStack::PushL(tempPreset);
+	 	*tempPreset = *aPreset;
+	 	iPresetArray->AppendL(tempPreset);
+	 	CleanupStack::Pop(tempPreset);
+		iObserverArray->AppendL(aLogoHandle);
+		if(aNPVReq==2)
+			{
+	 		iReqFromArray->AppendL(2);
+			}
+		else
+			{
+	 		iReqFromArray->AppendL(1);
+			}
+	 	}
+	IRLOG_DEBUG( "CIRLogoDownloadEngine::FetchLogoDataL - Exiting" );
+	}
+
+
+// ----------------------------------------------------------------------------------
+// CIRLogoDownloadEngine::CheckCacheForLogoL(TInt aValue)
+// Checks the cache whether the logo is available or not
+// ----------------------------------------------------------------------------------
+//
+void CIRLogoDownloadEngine::CheckCacheForLogoL(TInt aValue)
+	{
+	IRLOG_DEBUG( "CIRLogoDownloadEngine::CheckCacheForLogoL - Entering" );
+	iSendingLogo=aValue;
+	iResult = 0;
+	if(iSendingLogo==0)//0 means, this API is called for the usecase of checking cache
+		{
+		iCacheReqMade = ETrue;
+		iCache->CheckCacheL(KLogo,iCacheTempPreset->GetImgUrl(),iForceGet,iResult);		
+		}
+	else if(iSendingLogo==1)//1 means, this API is called for the usecase of downloading logo
+		{
+		iCacheReqMade = ETrue;
+		iCache->CheckCacheL(KLogo,iTempPreset->GetImgUrl(),iForceGet,iResult);		
+		}
+	if((iResult == 0))//not available in the cache
+		{
+		iLogoCached = EFalse;
+		iIsConditionalGET = EFalse;
+		}
+	else if(iResult == -1)//cache is stale/not useable
+		{
+		iLogoCached = EFalse;
+		iIsConditionalGET = ETrue;			
+		}
+	else if(iResult == 1)//cache is useable
+		{
+		iLogoCached = ETrue;	
+		}
+	IRLOG_DEBUG( "CIRLogoDownloadEngine::CheckCacheForLogoL - Exiting" );
+	}
+
+
+// ----------------------------------------------------------------------------------
+// CIRLogoDownloadEngine::IssueLogoDownloadRequest()
+// submits the transaction for to download the logo
+// ----------------------------------------------------------------------------------
+//
+void CIRLogoDownloadEngine::IssueLogoDownloadRequestL()
+	{
+	IRLOG_DEBUG( "CIRLogoDownloadEngine::IssueLogoDownloadRequestL - Entering" );
+	///////////////////////////////////////////////////////////////////////////////////
+	//This piece of code is for selecting the access point which is already
+	//set at the begining of the application.  To download the logo the same
+	//accesse point will be used.
+	
+	
+	
+		
+	
+	if(!iIRNetworkControllerHandle->GetNetworkStatus())
+		{
+		iIRNetworkControllerHandle->ChooseAccessPointL();
+		iLogoRequestPending = ETrue;
+		}
+	
+	else
+		{
+		if( iFirstTime )
+			{
+			iLogoSession.Close();
+			TRAPD( LeaveValue, iLogoSession.OpenL() );
+	    	if ( LeaveValue != KErrNone )
+	        {
+	        // Most common error; no access point configured, and session creation
+	        // leaves with KErrNotFound.
+	        // Load a string from the resource file and add the error code to string
+	        User::Leave( LeaveValue );
+	        }
+			// Set the HTTP connection properties
+		    RStringPool strP = iLogoSession.StringPool();
+		    RHTTPConnectionInfo connInfo = iLogoSession.ConnectionInfo();
+		    // RSocketServ Handle
+		    connInfo.SetPropertyL( strP.StringF( HTTP::EHttpSocketServ,
+				RHTTPSession::GetTable() ),
+				THTTPHdrVal( iIRNetworkControllerHandle->GetIRSocketServer().Handle() ) );
+
+		    // RConnection Handle
+		    TInt connPtr = REINTERPRET_CAST( TInt,
+				&( iIRNetworkControllerHandle->GetIRConnection() ) );
+		    connInfo.SetPropertyL( strP.StringF( HTTP::EHttpSocketConnection,
+				RHTTPSession::GetTable() ), THTTPHdrVal( connPtr ) );
+
+		    // HTTP Version ( Specify that i am using HTTP/1.1
+			connInfo.SetPropertyL( strP.StringF( HTTP::EVersion,
+				RHTTPSession::GetTable() ),
+				THTTPHdrVal( strP.StringF( HTTP::EHttp11, RHTTPSession::GetTable() ) ) );
+
+			// Set RHttpSession into NetworkController for logo byte counter
+			iIRNetworkControllerHandle->RegisterLogoDataTransferTrackerL( iLogoSession );
+
+			iFirstTime = EFalse;
+			}
+
+
+		HBufC8* buffertmp = HBufC8::NewLC( iTempPreset->GetImgUrl().Length() + 1 );
+		TPtr8 buffertmpPtr( buffertmp->Des() );
+		buffertmpPtr.Copy( iTempPreset->GetImgUrl() );
+
+		TUriParser8 uri;
+		uri.Parse(buffertmpPtr);
+		RStringF method = iLogoSession.StringPool().StringF(HTTP::EGET,RHTTPSession::GetTable());
+		iTransaction = iLogoSession.OpenTransactionL(uri, *this, method);
+		RHTTPHeaders hdr = iTransaction.Request().GetHeaderCollection();
+	    // Set the User-Agent header to UAProf string
+	    SetHeaderL( hdr, HTTP::EUserAgent,
+			   iIRNetworkControllerHandle->GetUAProfString()->Des() );
+
+		_LIT8(KAccept,"image/jpeg,image/png,image/gif");
+		SetHeaderL(hdr, HTTP::EAccept, KAccept);
+		SetHeaderL( hdr, HTTP::EAcceptLanguage, KAcceptLanguage );
+		
+		if(iIsConditionalGET)
+			{
+			RStringF valStr = iLogoSession.StringPool().OpenFStringL(iETag);
+			CleanupClosePushL(valStr);
+			THTTPHdrVal val(valStr);
+			hdr.SetFieldL(iLogoSession.StringPool().StringF(
+						HTTP::EIfNoneMatch, RHTTPSession::GetTable()), val);
+			CleanupStack::PopAndDestroy(&valStr); // valStr
+			}
+		CleanupStack::PopAndDestroy(buffertmp); // buffertmp
+		
+		//setting the member variable to zero
+		iRespBodySize = 0;
+		iTransaction.SubmitL();
+
+		iRunning = ETrue;
+		iLogoRequestPending = ETrue;
+		iState = ESendingEvent;
+		}
+	IRLOG_DEBUG( "CIRLogoDownloadEngine::IssueLogoDownloadRequestL - Exiting" );
+	}
+
+
+// ----------------------------------------------------------------------------------
+// CIRLogoDownloadEngine::CancelTransaction()
+// cancels the current transaction
+// ----------------------------------------------------------------------------------
+//
+EXPORT_C void CIRLogoDownloadEngine::CancelTransaction()
+	{
+	IRLOG_DEBUG( "CIRLogoDownloadEngine::CancelTransaction - Entering" );
+	if(!iRunning)
+	    {
+		return;
+	    }
+	iTransaction.Close();
+	iRunning = EFalse;
+	IRLOG_DEBUG( "CIRLogoDownloadEngine::CancelTransaction - Exiting" );
+	}
+
+
+// ----------------------------------------------------------------------------------
+// CIRLogoDownloadEngine::SendPresetWithLogoL()
+// sends the preset with logo to the requestors
+// ----------------------------------------------------------------------------------
+//
+EXPORT_C void CIRLogoDownloadEngine::SendPresetWithLogoL()
+	{
+	IRLOG_DEBUG( "CIRLogoDownloadEngine::SendPresetWithLogoL - Entering" );
+	//Logo has downloaded, so update the status of the variable iLogoRequestPending
+	iLogoRequestPending = EFalse;
+	//Remove the imgUrl with parameters from the Preset
+	//now set imgUrl without parameters in to the Preset
+	TInt sizeImgUrlWithPar = iTempPreset->GetImgUrl().Length();
+	TBool hasParameters = EFalse;
+	RBuf urlWithPar;
+	urlWithPar.Create(sizeImgUrlWithPar);
+	urlWithPar.Copy(iTempPreset->GetImgUrl());
+	RBuf tempBuf;
+	tempBuf.Create(sizeImgUrlWithPar);
+
+	TLex urlLex(urlWithPar);
+	for(;!urlLex.Eos();)
+		{
+		tempBuf.Zero();
+		while(urlLex.Peek() != '?' && !urlLex.Eos())		
+			{
+			tempBuf.Append(urlLex.Get());
+			}
+		if(urlLex.Peek() == '?')
+			{
+			hasParameters = ETrue;			
+			}
+		urlLex.Inc();	
+		}
+	
+	RBuf imgUrl;		
+	if(hasParameters)		
+		{
+		//let say urlWithPar has the value http://www.logos.com/images/test.pngx=100&y=100
+		//now the tempBuf contains the value  x=100&y=100
+		TInt sizeUrlParameters = tempBuf.Length();
+		sizeUrlParameters++; // now this integer contains the size of x=100&y=100 
+		TInt sizeImgUrl = sizeImgUrlWithPar - sizeUrlParameters;
+		
+		//Create a buffer to store the imgUrl without parameters
+		imgUrl.Create(sizeImgUrl);
+		imgUrl.Copy(urlWithPar.Left(sizeImgUrl));
+		iTempPreset->SetImgUrl(imgUrl);
+		}
+	else
+		{
+		//nothing to be done
+		//the imgUrl present in the preset is correct, no need to change anything
+		}
+
+	//set the downloaded logo to the preset with the API SetLogoData()
+	iTempPreset->SetLogoData(*iRespBody);
+	if(iTempReqFrom == 0)//which means the request came from SearchView while doing Add to Favorite
+		{
+		iFavDb->ReplacePresetL(*iTempPreset);
+		iPresetModifiedStatus = ETrue;
+		}
+	else if(iTempReqFrom == 1)//which menas the request came from a view other than NowPlayingView
+		{
+		iTempLogoHandle->PresetLogoDownloadedL(iTempPreset);
+		}
+	else if(iTempReqFrom == 2)//which menas the request came from NowPlayingView
+		{
+		//(1)logo has downloaded freshly
+		//(2)send the logo to the NPV through PresetLogoDownloadedL
+		//(3)check whether the preset exists in favdb; if so replace that with new logo
+		iTempLogoHandle->PresetLogoDownloadedL(iTempPreset);
+		//iFavDb->ReplacePresetL(*iTempPreset)
+		}
+		
+    
+	iTempPreset->SetImgUrl(urlWithPar);	
+	//Cache the newly downloaded logo
+	iCache->CacheLogoL(*iRespBody,iTempPreset->GetImgUrl(),*iResponseHeaders);
+
+	//close all the buffers
+	imgUrl.Close();
+	tempBuf.Close();
+	urlWithPar.Close();
+	
+	iRunning = EFalse;
+	iState = EIdle;
+	IRLOG_DEBUG( "CIRLogoDownloadEngine::SendPresetWithLogoL - Exiting" );
+	}
+
+
+
+// ---------------------------------------------------------------------------------------
+// CIRLogoDownloadEngine::MHFRunL(RHTTPTransaction aTransaction, const THTTPEvent& aEvent)
+// callback API from MHTTPTransactionCallback
+// ---------------------------------------------------------------------------------------
+//
+void CIRLogoDownloadEngine::MHFRunL(RHTTPTransaction aTransaction, const THTTPEvent& aEvent)
+	{
+	IRLOG_DEBUG( "CIRLogoDownloadEngine::MHFRunL - Entering" );
+	switch (aEvent.iStatus)
+		{
+		case THTTPEvent::EGotResponseHeaders:
+			{
+		    RHTTPResponse resp = aTransaction.Response();
+		    TInt status = resp.StatusCode();
+		    iRespCode = status;
+            ExtractResponseHeadersL(aTransaction);
+	        if(status >= KStatusOK &&  status < KStatusMultipleChoices)
+		    {
+	            THTTPHdrVal headerValue(0);
+	            RHTTPHeaders headers = resp.GetHeaderCollection();
+	            TInt error = headers.GetField(iLogoSession.StringPool().StringF(HTTP::EContentLength,
+	            				 RHTTPSession::GetTable()), 0, headerValue);
+	            iRespBodySize = 0;
+	            if (KErrNone == error)
+	            {
+	                iRespBodySize = headerValue.Int();
+	            }
+                iRespBody = HBufC8::NewL(iRespBodySize+1);
+		    }
+			else if( status == KStatusNotModified )//304 means, the content has not modified
+			    {
+			    if(iIsConditionalGET)
+				    {
+				    iIsConditionalGET = EFalse;
+				    iRunning = EFalse;
+				    //update the trust period 
+					//no problem if it leaves
+					TRAP_IGNORE(iCache->UpdateTrustPeriodL(KLogo,iTempPreset->GetImgUrl(),
+												*iResponseHeaders))
+					//do a forced get because the data is notmodifed in isds and 
+					//trustable
+					iForceGet = ETrue;
+					CheckCacheForLogoL(1);
+				    }
+		        }
+	        else if( status == KStatusGatewayTimeout )
+		        {
+				//implementation, if needed
+				CancelTransaction();
+				if(iTempReqFrom == 0)
+					{
+					//do nothing	
+					}
+				else
+					{
+					iTempLogoHandle->PresetLogoDownloadError(iTempPreset);					
+					}
+				ManagePresetArrayIndexL();
+				}
+
+			}
+			break;
+
+		case THTTPEvent::EGotResponseBodyData:
+			{
+			MHTTPDataSupplier* body = aTransaction.Response().Body();
+			TPtrC8 dataChunk;
+			body->GetNextDataPart(dataChunk);
+			if(iRespBodySize > 0)
+				{
+	            iRespBody->Des().Append((const TDesC8&)dataChunk);
+				}
+			else if(iRespBody)
+				{
+				//which means the body of the response has come
+				//but in the response headers Content-Length is missing
+				//for this usecase realloc the iRespBody with the data received					
+				HBufC8* buffertmp = HBufC8::NewLC( dataChunk.Length() + 1 );
+        		TPtr8 buffertmpPtr( buffertmp->Des() );
+        		buffertmpPtr.Copy( (const TDesC8&)dataChunk );
+        		
+   				TInt tempSize;
+				tempSize = iRespBody->Length() + dataChunk.Length();
+				
+				iRespBody = iRespBody->ReAllocL( tempSize );
+				TPtr8 ibufferPtr( iRespBody->Des() );
+				ibufferPtr.Append(buffertmpPtr);
+
+
+        		
+				CleanupStack::PopAndDestroy(buffertmp); // buffertmp        		
+				}
+			body->ReleaseData();
+			}
+			break;
+
+		case THTTPEvent::EResponseComplete:
+			{
+			//No implementation
+			}
+			break;
+
+		case THTTPEvent::ESucceeded:
+	        {
+			iTransaction.Close();
+			if(iIsConditionalGET)
+				{
+				iIsConditionalGET = EFalse;					
+				}
+		 
+			iRunning = EFalse;
+			//set the downloaded logo in the preset and send it back to the requestor
+			SendPresetWithLogoL();
+			ManagePresetArrayIndexL();
+	        }
+			break;
+
+		case THTTPEvent::EFailed:
+			{
+			aTransaction.Close();
+			iRunning = EFalse;
+			iState = EIdle;
+			if( iRespCode == KStatusNotModified )//304 means, the content has not modified
+				{
+				//do nothing;					
+				}
+			else
+				{
+				if(iTempReqFrom == 0)
+					{
+					//do nothing
+					}
+				else
+					{
+					iTempLogoHandle->PresetLogoDownloadError(iTempPreset);					
+					}
+				}
+			ManagePresetArrayIndexL();
+			}
+	        break;
+
+		default:
+
+			if (aEvent.iStatus < 0)
+				{
+				aTransaction.Close();
+				iRunning = EFalse;
+				iState = EIdle;
+				if(iTempReqFrom == 0)
+					{
+					//do nothing
+					}
+				else
+					{
+					iTempLogoHandle->PresetLogoDownloadError(iTempPreset);					
+					}
+				ManagePresetArrayIndexL();
+		        }
+			break;
+		}
+	IRLOG_DEBUG( "CIRLogoDownloadEngine::MHFRunL - Exiting" );
+	}
+
+
+// ------------------------------------------------------------------------------------------------------------------
+// CIRLogoDownloadEngine::MHFRunError(TInt /*aError*/, RHTTPTransaction aTransaction, const THTTPEvent& /*aEvent*/)
+// callback API from MHTTPTransactionCallback
+// ------------------------------------------------------------------------------------------------------------------
+//
+TInt CIRLogoDownloadEngine::MHFRunError(TInt /*aError*/, RHTTPTransaction aTransaction, const THTTPEvent& /*aEvent*/)
+	{
+	IRLOG_DEBUG( "CIRLogoDownloadEngine::MHFRunError - Entering" );
+	aTransaction.Close();
+	iRunning = EFalse;
+	iState = EIdle;
+	if(iIsConditionalGET)
+		{
+		iIsConditionalGET = EFalse;	
+		}
+	if(iTempReqFrom == 0)
+		{
+		//do nothing	
+		}
+	else
+		{
+		iTempLogoHandle->PresetLogoDownloadError(iTempPreset);		
+		}
+	TRAP_IGNORE(ManagePresetArrayIndexL())
+	IRLOG_DEBUG( "CIRLogoDownloadEngine::MHFRunError - Exiting" );
+	return KErrNone;
+	}
+
+// --------------------------------------------------------------------
+// CIRLogoDownloadEngine::GetNextDataPart(TPtrC8& aDataPart)
+// callback API from MHTTPDataSupplier
+// --------------------------------------------------------------------
+TBool CIRLogoDownloadEngine::GetNextDataPart(TPtrC8& aDataPart)
+	{
+	IRLOG_DEBUG( "CIRLogoDownloadEngine::GetNextDataPart - Entering" );
+    aDataPart.Length();
+    iReqBody->Length();
+    aDataPart.Set(*iReqBody);
+	IRLOG_DEBUG( "CIRLogoDownloadEngine::GetNextDataPart - Exiting" );
+	return ETrue;
+	}
+
+// --------------------------------------------------------------------
+// CIRLogoDownloadEngine::ReleaseData()
+// callback API from MHTTPDataSupplier
+// --------------------------------------------------------------------
+void CIRLogoDownloadEngine::ReleaseData()
+	{
+	IRLOG_DEBUG( "CIRLogoDownloadEngine::ReleaseData" );
+   //No implementaion
+	}
+
+
+// --------------------------------------------------------------------
+// CIRLogoDownloadEngine::Reset()
+// callback API from MHTTPDataSupplier
+// --------------------------------------------------------------------
+TInt CIRLogoDownloadEngine::Reset()
+	{
+	IRLOG_DEBUG( "CIRLogoDownloadEngine::Reset" );
+	return KErrNone;
+	}
+
+
+// --------------------------------------------------------------------
+// CIRLogoDownloadEngine::OverallDataSize()
+// callback API from MHTTPDataSupplier
+// --------------------------------------------------------------------
+TInt CIRLogoDownloadEngine::OverallDataSize()
+	{
+	IRLOG_DEBUG( "CIRLogoDownloadEngine::OverallDataSize" );
+	return iReqBody->Length();
+	}
+
+// ---------------------------------------------------------------------------
+// CIRLogoDownloadEngine::ExtractResponseHeadersL( RHTTPTransaction aTransaction )
+// Used to Extract the response headers.
+// ---------------------------------------------------------------------------
+//
+
+void CIRLogoDownloadEngine::ExtractResponseHeadersL(const RHTTPTransaction&
+	aTransaction )
+    {
+    IRLOG_DEBUG( "CIRHttpDataProvider::ExtractResponseHeadersL - Entering" );
+    RHTTPResponse response = aTransaction.Response();
+    RHTTPHeaders respHeader = response.GetHeaderCollection();
+    THTTPHdrFieldIter iterator = respHeader.Fields();
+    RStringPool httpStringPool = aTransaction.Session().StringPool();
+    iterator.First();
+    HBufC8 *headerField = HBufC8::NewLC( KMaxHeaderNameLength +
+		KMaxHeaderValueLength );
+    HBufC8 *fieldValBuf = HBufC8::NewLC( KMaxHeaderValueLength );
+    while ( iterator.AtEnd() == EFalse )
+        {
+        RStringTokenF fieldName = iterator();
+        RStringF fieldNameStr = httpStringPool.StringF( fieldName );
+        THTTPHdrVal fieldVal;
+        if ( respHeader.GetField( fieldNameStr, 0, fieldVal ) == KErrNone )
+            {
+            const TDesC8 &fieldNameDesC = fieldNameStr.DesC();
+            headerField->Des().Copy( fieldNameDesC.Left(
+				KMaxHeaderNameLength ) );
+            fieldValBuf->Des().Zero();
+            switch ( fieldVal.Type() )
+                {
+                // the value is an integer
+                //lint restore -e747:Significant prototype
+                //coercion (arg. no. 1) int to long long  :
+                case THTTPHdrVal::KTIntVal: fieldValBuf->Des().Num(
+					fieldVal.Int() );
+                break;
+                // the value is a case-insensitive string
+                case THTTPHdrVal::KStrFVal:
+                    {
+                    RStringF fieldValStr = httpStringPool.StringF(
+						fieldVal.StrF() );
+                    const TDesC8 &fieldValDesC = fieldValStr.DesC();
+                    fieldValBuf->Des().Copy( fieldValDesC.Left(
+						KMaxHeaderValueLength ) );
+                    }
+                break;
+                // the value is a case-sensitive string
+                case THTTPHdrVal::KStrVal:
+                    {
+                    RString fieldValStr = httpStringPool.String(
+						fieldVal.Str() );
+                    const TDesC8 &fieldValDesC = fieldValStr.DesC();
+                    fieldValBuf->Des().Copy( fieldValDesC.Left(
+						KMaxHeaderValueLength ) );
+                    }
+                break;
+                // the value is a date/time
+                case THTTPHdrVal::KDateVal:
+                    {
+                    TDateTime date = fieldVal.DateTime();
+                    TTime t( date );
+//                    if ( iSetNonUAProfUserAgent )
+//       					{
+       		            HttpDateHeaderReceived( *headerField ,t );
+//       					}
+                    }
+                break;
+                // the value is type is unknown
+                default:
+                    break;
+                }
+            // Display HTTP header field name and value
+            headerField->Des().Append( KDPColon );
+            headerField->Des().Append( *fieldValBuf );
+            HttpHeaderReceived( *headerField );
+            }
+        ++iterator;
+        }
+    
+    CleanupStack::PopAndDestroy( fieldValBuf );
+    CleanupStack::PopAndDestroy( headerField );
+    IRLOG_DEBUG( "CIRLogoDownloadEngine::ExtractResponseHeadersL - Exiting." );
+    }
+
+
+
+// ---------------------------------------------------------------------------
+//  CIRLogoDownloadEngine::HttpHeaderReceived( const TDesC8& aHeaderData )
+//  indicate that an HTTP header is received.
+// ---------------------------------------------------------------------------
+//
+void CIRLogoDownloadEngine::HttpHeaderReceived( const TDesC8& aHeaderData )
+    {
+    IRLOG_DEBUG( "CIRLogoDownloadEngine::HttpHeaderReceived - Entering." );
+	_LIT8(KDelim,":");
+	_LIT8(KContentType,"Content-Type");
+	ExtractHeaderValue(aHeaderData,KContentType,KDelim,iResponseHeaders->
+		iContentType);
+	_LIT8(KMaxAge,"max-age");
+	_LIT8(KDelimEqual,"=");
+	ExtractHeaderValue(aHeaderData,KMaxAge,KDelimEqual,iResponseHeaders->
+		iMaxAge);
+	_LIT8(KContentLength,"Content-Length");
+	ExtractHeaderValue(aHeaderData,KContentLength,KDelim,iResponseHeaders->
+		iContentLength);
+	_LIT8(KExpires,"Expires");
+	ExtractHeaderValue(aHeaderData,KExpires,KDelim,iResponseHeaders->iExpires);
+	_LIT8(KETag,"ETag");
+	ExtractHeaderValue(aHeaderData,KETag,KDelim,iResponseHeaders->iETag);
+	IRLOG_DEBUG( "CIRLogoDownloadEngine::HttpHeaderReceived - Exiting." );
+    }
+
+// ---------------------------------------------------------------------------
+//  CIRLogoDownloadEngine::ExtractHeaderValue(const TDesC8& aHeaderData,const
+//	TDesC8& aHeaderName,const TDesC8& aDelimeter,TDes8& aHolder) const
+//  Used to build the CIRHttpResponseData
+// ---------------------------------------------------------------------------
+//
+void CIRLogoDownloadEngine::ExtractHeaderValue(const TDesC8& aHeaderData,const
+	TDesC8& aHeaderName,const TDesC8& aDelimeter,TDes8& aHolder) const
+	{
+	IRLOG_DEBUG( "CIRLogoDownloadEngine::ExtractHeaderValue - Entering" );
+	TInt position = aHeaderData.Find(aHeaderName);
+	if( position >= 0)
+		{
+		TPtrC8 headerValue = aHeaderData.Mid(position);
+		TInt delimeterPosition = headerValue.Find(aDelimeter);
+		if( delimeterPosition != KErrNotFound )
+			{
+			delimeterPosition++;
+			TPtrC8 value = headerValue.Mid(delimeterPosition);
+			aHolder.Copy(value);
+			aHolder.TrimAll();
+			}
+		}
+	IRLOG_DEBUG( "CIRLogoDownloadEngine::ExtractHeaderValue - Exiting." );
+	}
+
+// ---------------------------------------------------------------------------
+//  CIRLogoDownloadEngine::HttpDateHeaderReceived(const TDesC8 &aHeader,
+//	const TTime& aTime )
+//  Used to build the CIRHttpResponseData members
+// ---------------------------------------------------------------------------
+//
+void CIRLogoDownloadEngine::HttpDateHeaderReceived(const TDesC8 &aHeader,
+	const TTime& aTime )
+	{
+	IRLOG_DEBUG( "CIRLogoDownloadEngine::HttpDateHeaderReceived - Entering." );
+	_LIT8(KDate,"Date");
+	_LIT8(KLastModified,"Last-Modified");
+	TInt position = aHeader.Find(KDate);
+	if( position != KErrNotFound )
+		{
+		iResponseHeaders->iDate = aTime;
+		return ;
+		}
+	position = aHeader.Find(KLastModified);
+	if( position != KErrNotFound )
+		{
+		iResponseHeaders->iLastModified = aTime;
+		}
+	IRLOG_DEBUG( "CIRLogoDownloadEngine::HttpDateHeaderReceived - Exiting." );
+	}
+
+
+
+
+
+// --------------------------------------------------------------------
+// CIRLogoDownloadEngine::ManagePresetArrayIndexL()
+// To make another download request if exists in the queue
+// To update the iPresetArray current index
+// --------------------------------------------------------------------
+void CIRLogoDownloadEngine::ManagePresetArrayIndexL()
+	{
+	IRLOG_DEBUG( "CIRLogoDownloadEngine::ManagePresetArrayIndexL - Entering" );
+	TInt PresetArrayLength = iPresetArray->Count();
+	if((PresetArrayLength>0) && (iPresetArrayPos < PresetArrayLength))
+		{
+		CIRIsdsPreset* tempPreset = CIRIsdsPreset::NewL();
+		CleanupStack::PushL(tempPreset);
+    	*tempPreset = *(iPresetArray->At(iPresetArrayPos));
+    		if(iReqFromArrayPos < iReqFromArray->Count()  &&  iReqFromArray->At(iReqFromArrayPos) == 0 )
+        		{
+    			FetchLogoDataL(tempPreset);
+        		}
+        	else if(iObserverArrayPos < iObserverArray->Count())
+    	    	{
+    			FetchLogoDataL(tempPreset,iObserverArray->At(iObserverArrayPos),
+    							iReqFromArray->At(iReqFromArrayPos));
+    			++iObserverArrayPos;
+    	    	}
+		++iPresetArrayPos;
+		++iReqFromArrayPos;
+//		delete tempPreset;
+		CleanupStack::PopAndDestroy(tempPreset);
+		}
+	IRLOG_DEBUG( "CIRLogoDownloadEngine::ManagePresetArrayIndexL - Exiting" );
+	}
+
+
+// --------------------------------------------------------------------
+// CIRLogoDownloadEngine::ManageCachePresetArrayIndexL()
+// To make another download request if exists in the queue
+// To update the iCachePresetArray current index
+// --------------------------------------------------------------------
+void CIRLogoDownloadEngine::ManageCachePresetArrayIndexL()
+	{
+	IRLOG_DEBUG( "CIRLogoDownloadEngine::ManageCachePresetArrayIndexL - Exiting" );
+ 	TInt CachePresetArrayLength = iCachePresetArray->Count();
+	if((CachePresetArrayLength>0) && (iCachePresetArrayPos < CachePresetArrayLength))
+		{
+		CIRIsdsPreset* tempPreset;
+		tempPreset = CIRIsdsPreset::NewL();
+		CleanupStack::PushL(tempPreset);
+		*tempPreset = *(iCachePresetArray->At(iCachePresetArrayPos));
+		
+		if(iCacheReqFromArrayPos < iCacheReqFromArray->Count()  &&
+					 iCacheReqFromArray->At(iCacheReqFromArrayPos) == 0 )
+    		{
+			SendRequestL(tempPreset,KLogoSize,KLogoSize);
+    		}
+    	else if(iCacheObserverArrayPos < iCacheObserverArray->Count())
+	    	{
+			SendRequestL(tempPreset,iCacheObserverArray->At(iCacheObserverArrayPos),
+					iCacheReqFromArray->At(iCacheReqFromArrayPos));
+			++iCacheObserverArrayPos;
+	    	}
+		++iCachePresetArrayPos;
+		++iCacheReqFromArrayPos;
+//		delete tempPreset;
+		CleanupStack::PopAndDestroy(tempPreset);
+ 		}
+	IRLOG_DEBUG( "CIRLogoDownloadEngine::ManageCachePresetArrayIndexL - Exiting" );
+	}
+
+// -----------------------------------------------------
+// CIRLogoDownloadEngine::CacheError()
+// Called from cachemgmt in case of an error
+// callback API from MIRCacheObserver
+// -----------------------------------------------------
+void CIRLogoDownloadEngine::CacheError()
+ 	{
+	IRLOG_DEBUG( "CIRLogoDownloadEngine::CacheError" );
+
+ 	//code here, if needed
+ 	}
+
+// -----------------------------------------------------
+// CIRLogoDownloadEngine::CacheFailed()
+// Called from cachemgmt in case of cache failure
+// callback API from MIRCacheObserver
+// -----------------------------------------------------
+void CIRLogoDownloadEngine::CacheFailed()
+ 	{
+ 	IRLOG_DEBUG( "CIRLogoDownloadEngine::CacheFailed" );
+ 	//code here, if needed
+ 	}
+
+// -----------------------------------------------------
+// CIRLogoDownloadEngine::CacheInvalid()
+// Called from cachemgmt in case cache is invalid
+// callback API from MIRCacheObserver
+// -----------------------------------------------------
+void CIRLogoDownloadEngine::CacheInvalid()
+	{
+	IRLOG_DEBUG( "CIRLogoDownloadEngine::CacheInvalid - Entering" );
+	iETag = iCache->iETag;
+	IRLOG_DEBUG( "CIRLogoDownloadEngine::CacheInvalid - Exiting" );
+	}
+
+// -----------------------------------------------------
+// CIRLogoDownloadEngine::CachedStructureL(TInt aChoice)
+// Called from cachemgmt data retrival is successful
+// callback API from MIRCacheObserver
+// -----------------------------------------------------
+void CIRLogoDownloadEngine::CachedStructureL(TInt aChoice)
+ 	{
+ 	IRLOG_DEBUG( "CIRLogoDownloadEngine::CachedStructureL - Entering" );
+	if(iCacheReqMade)
+		{
+		iCacheReqMade = EFalse;
+		if(aChoice == KCacheAvailable)
+			{
+			
+		 	TInt sizeImgUrlWithPmts = 0;
+		 	//Remove the imgUrl with parameters from the Preset
+			//now set imgUrl without parameters in to the Preset
+			if(iSendingLogo==0)
+				{
+				sizeImgUrlWithPmts = iCacheTempPreset->GetImgUrl().Length();		
+				}
+			else if(iSendingLogo==1)
+				{
+				sizeImgUrlWithPmts = iTempPreset->GetImgUrl().Length();		
+				}
+			else if(iSendingLogo==2)
+				{
+				sizeImgUrlWithPmts = KTen;			
+				}
+			TBool hasParameters = EFalse;
+			RBuf urlWithPar;
+			urlWithPar.Create(sizeImgUrlWithPmts);
+			if(iSendingLogo==0)
+				{
+				urlWithPar.Copy(iCacheTempPreset->GetImgUrl());
+				}
+			else if(iSendingLogo==1)
+				{
+				urlWithPar.Copy(iTempPreset->GetImgUrl());
+				}
+			else if(iSendingLogo==2)
+				{
+				_LIT(KNone,"");
+				urlWithPar.Copy(KNone);
+				}
+				
+			RBuf tempBuf;
+			tempBuf.Create(sizeImgUrlWithPmts);
+
+			TLex urlLex(urlWithPar);
+			for(;!urlLex.Eos();)
+				{
+				tempBuf.Zero();
+				while(urlLex.Peek() != '?' && !urlLex.Eos())		
+					{
+					tempBuf.Append(urlLex.Get());
+					}
+				if(urlLex.Peek() == '?')
+					{
+					hasParameters = ETrue;			
+					}
+				urlLex.Inc();	
+				}
+			
+			RBuf imgUrl;		
+			if(hasParameters)		
+				{
+				//let say urlWithPar has the value http://www.logos.com/images/test.pngx=100&y=100
+				//now the tempBuf contains the value  x=100&y=100
+				TInt sizeUrlParameters = tempBuf.Length();
+				sizeUrlParameters++; // now this integer contains the size of x=100&y=100 
+				TInt sizeImgUrl = sizeImgUrlWithPmts - sizeUrlParameters;
+				
+				//Create a buffer to store the imgUrl without parameters
+				imgUrl.Create(sizeImgUrl);
+				imgUrl.Copy(urlWithPar.Left(sizeImgUrl));
+				if(iSendingLogo==0)
+					{
+					iCacheTempPreset->SetImgUrl(imgUrl);			
+					}
+				else if(iSendingLogo==1)
+					{
+					iTempPreset->SetImgUrl(imgUrl);			
+					}
+				}
+			else
+				{
+				//nothing to be done
+				//the imgUrl present in the preset is correct, no need to change anything
+				}
+			
+			
+			
+			if(iSendingLogo==0)
+			 	{
+			 	if(aChoice == KCacheAvailable)//logo is available in the cache
+				 	{
+					iCacheTempPreset->SetLogoData(iCache->iLogoData);	 		
+				 	}
+				if(iCacheReqFrom == 0)
+					{
+					iFavDb->ReplacePresetL(*iCacheTempPreset);
+					iPresetModifiedStatus = ETrue;
+					}
+				else
+					{
+					iCacheTempLogoHandle->PresetLogoDownloadedL(iCacheTempPreset);
+					}	
+				
+				
+				ManageCachePresetArrayIndexL(); 	
+			 	}
+			else if(iSendingLogo==1)	
+				{
+			 	if(aChoice == KCacheAvailable)//logo is available in the cache
+				 	{
+					iTempPreset->SetLogoData(iCache->iLogoData);	 		
+				 	}
+				if(iTempReqFrom == 0)
+					{
+					iFavDb->ReplacePresetL(*iTempPreset);
+					iPresetModifiedStatus = ETrue;
+					}
+				else
+					{
+					iTempLogoHandle->PresetLogoDownloadedL(iTempPreset);
+					}		 	
+					
+			 	ManagePresetArrayIndexL();
+			 	}
+			else if(iSendingLogo==2)//logo request from the search results (while displaying logo)
+				{
+				//code here, if needed			
+				}
+
+			//close all the buffers
+			imgUrl.Close();
+			tempBuf.Close();
+			urlWithPar.Close();
+			}
+			
+		}
+ 	IRLOG_DEBUG( "CIRLogoDownloadEngine::CachedStructureL - Exiting" );
+ 	}
+ 	
+// -----------------------------------------------------
+// CIRLogoDownloadEngine::ReleaseResources()
+// Releases the resources held by logo download engine
+// Used to close the Http Session if already open
+// -----------------------------------------------------
+void CIRLogoDownloadEngine::ReleaseResources()
+	{
+ 	IRLOG_DEBUG( "CIRLogoDownloadEngine::ReleaseResources - Entering" );
+	CancelTransaction();
+	iLogoSession.Close();
+    iFirstTime = ETrue;
+ 	IRLOG_DEBUG( "CIRLogoDownloadEngine::ReleaseResources - Exiting" );
+	} 	
+
+
+// ---------------------------------------------------------------------------
+// CIRLogoDownloadEngine::HandlePresetChangedL( TInt aId, TUid aDataHandler, MPSPresetObserver::TPSReason aType )
+// This is called by CIRFavoritesDb when values of presets stations has been changed	
+// ---------------------------------------------------------------------------
+//	
+void CIRLogoDownloadEngine::HandlePresetChangedL( TInt aId, TUid aDataHandler,
+					 MPSPresetObserver::TPSReason aReason )
+	{
+ 	IRLOG_DEBUG( "CIRLogoDownloadEngine::HandlePresetChangedL - Entering" );
+    if ( aDataHandler ==  KIRPreset  )
+        {
+        switch ( aReason )
+            {
+            case 0:  //MPSPresetObserver::EPSCreated
+                {
+/*d				CIRPreset* preset = NULL;
+                preset = iFavDb->PresetById( aId );
+                delete iCopyPreset;
+                iCopyPreset = NULL;
+                iCopyPreset = CIRIsdsPreset::NewL();
+                preset->CopyPresetData(*iCopyPreset);
+                if(iCopyPreset->GetChannelType()==1)
+	                {
+	                if(iCopyPreset->GetImgUrl().Length() != 0)
+		                {
+		                if(iCopyPreset->GetLogoData().Length() == 0)
+			                {
+			                SendRequestL(iCopyPreset);		                	
+			                }
+		                }
+					else
+						{
+						//do nothing;
+						}
+	                }
+d*/                }
+            	break;
+            case 1:  //MPSPresetObserver::EPSDeleted:
+            	break;
+            case 2:  //MPSPresetObserver::EPSModified:
+	            {
+	            if(!iFavDb->GetMoveStatus())
+			        {
+		            if(iPresetModifiedStatus)
+			            {
+						iPresetModifiedStatus = EFalse;		            	
+			            }
+		            else
+			            {
+						CIRPreset* preset = NULL;
+		                preset = iFavDb->PresetById( aId );
+		                delete iCopyPreset;
+		                iCopyPreset = NULL;
+		                iCopyPreset = CIRIsdsPreset::NewL();
+		                preset->CopyPresetData(*iCopyPreset);
+		                if(iCopyPreset->GetChannelType()==1)
+			                {
+			                if(iCopyPreset->GetImgUrl().Length() != 0)
+				                {
+				                SendRequestL(iCopyPreset,KLogoSize,KLogoSize);		                	
+				                }
+							else
+								{
+								//do nothing;
+								}
+			                }
+			            }
+			        }
+	            }
+            	break;
+            default:
+            	break;
+            }
+        }
+ 	IRLOG_DEBUG( "CIRLogoDownloadEngine::HandlePresetChangedL - Exiting" );
+	}
+
+
+// -----------------------------------------------------------------------------
+// Notified by network controller when network is active, to reissue the request  
+// NotifyActiveNetworkObserversL()
+// -----------------------------------------------------------------------------
+
+void CIRLogoDownloadEngine::NotifyActiveNetworkObserversL(TIRNetworkEvent aEvent)
+	{
+	IRLOG_DEBUG( "CIRLogoDownloadEngine::NotifyActiveNetworkObserversL - Entering" );
+	switch(aEvent)
+		{
+		case ENetworkConnectionDisconnected:
+			{
+			ReleaseResources();
+			}
+			break;
+		case ENetworkConnectionEstablished:
+			{
+			if( iLogoRequestPending )
+				{
+				IssueLogoDownloadRequestL();
+				}
+			}
+		}
+	IRLOG_DEBUG( "CIRLogoDownloadEngine::NotifyActiveNetworkObserversL - Exiting" );
+	}
+
+ 	
+// -----------------------------------------------------------------------------
+// Notified by network controller when user cancels network connection, to reset 
+// the pending requests  
+// ResetPendingRequests()
+// -----------------------------------------------------------------------------
+void CIRLogoDownloadEngine::ResetPendingRequests(TBool /*aValue*/)
+	{
+		
+	}
+