internetradio2.0/irdataprovider/src/irlogodownloadengine.cpp
changeset 14 896e9dbc5f19
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/internetradio2.0/irdataprovider/src/irlogodownloadengine.cpp	Wed Aug 18 09:40:26 2010 +0300
@@ -0,0 +1,1590 @@
+/*
+* 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 "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();
+    // remove E32USER-CBase-66
+#ifdef _DEBUG
+    TRAP_IGNORE( iLogoSession.Close() );
+#else
+    iLogoSession.Close();
+#endif
+    
+    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()
+// 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::SendRequestL()
+// 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;
+                CleanupClosePushL(urlWithSize);
+                urlWithSize.CreateL( 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->SetImgUrlL( urlWithSize );
+                CleanupStack::PopAndDestroy();
+                }
+            //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();
+        CleanupStack::PushL(tempPreset);
+        *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;
+                CleanupClosePushL(urlWithSize);
+                urlWithSize.CreateL( 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->SetImgUrlL( urlWithSize );
+                CleanupStack::PopAndDestroy();
+                }
+            }
+        iCachePresetArray->AppendL( tempPreset );
+        iCacheReqFromArray->AppendL( 0 );
+        CleanupStack::PopAndDestroy();
+        }
+    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;
+            CleanupClosePushL(urlWithSize);
+            urlWithSize.CreateL(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->SetImgUrlL(urlWithSize);
+            CleanupStack::PopAndDestroy();
+        }
+    }
+    
+    iCache->CheckCacheL(KLogo,iCacheTempPreset->GetImgUrl(),EFalse,cached);
+    
+    return (CIRCacheMgmt::ECacheUseable == cached)?ETrue:EFalse;     
+}
+// ---------------------------------------------------------------------------
+// CIRLogoDownloadEngine::SendRequestL()
+// 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;
+                CleanupClosePushL(urlWithSize);
+                urlWithSize.CreateL( 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->SetImgUrlL( urlWithSize );
+                CleanupStack::PopAndDestroy();
+                }
+            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();
+        CleanupStack::PushL(tempPreset);
+        *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;
+                CleanupClosePushL(urlWithSize);
+                urlWithSize.CreateL( 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->SetImgUrlL( urlWithSize );
+                CleanupStack::PopAndDestroy();
+                }
+            }
+        iCachePresetArray->AppendL( tempPreset );
+        iCacheObserverArray->AppendL( aLogoHandle );
+        if ( aNPVReq == 2 )
+            {
+            iCacheReqFromArray->AppendL( 2 );
+            }
+        else
+            {
+            iCacheReqFromArray->AppendL( 1 );
+            }
+        CleanupStack::PopAndDestroy();
+        }
+    IRLOG_DEBUG( "CIRLogoDownloadEngine::SendRequestL - Exiting" );
+    }
+
+// ---------------------------------------------------------------------------
+// CIRLogoDownloadEngine::GetCacheLogoL()
+// 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()
+// 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 )
+        {
+        //which means the request came from SearchView 
+        // while doing Add to Favorite
+        iTempReqFrom = 0;
+        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()
+// API is used to download logo from isds/internet
+// called in the API SendRequestL())
+// ---------------------------------------------------------------------------
+//
+void CIRLogoDownloadEngine::FetchLogoDataL( CIRIsdsPreset* aPreset,
+                            MLogoDownloadObserver* aLogoHandle, TInt aNPVReq )
+    {
+    IRLOG_DEBUG( "CIRLogoDownloadEngine::FetchLogoDataL - Entering" );
+    if ( !iRunning )
+        {
+        if ( aNPVReq == 2 )
+            {
+            //which means the request came from NowPlayingView
+            iTempReqFrom = 2;
+            }
+        else
+            {
+            //which means the request came from other than NowPlayingView
+            iTempReqFrom = 1;
+            }
+
+        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()
+// Checks the cache whether the logo is available or not
+// ---------------------------------------------------------------------------
+//
+void CIRLogoDownloadEngine::CheckCacheForLogoL( TInt aValue )
+    {
+    IRLOG_DEBUG( "CIRLogoDownloadEngine::CheckCacheForLogoL - Entering" );
+    iSendingLogo = aValue;
+    iResult = 0;
+    //0 means, this API is called for the usecase of checking cache
+    if ( iSendingLogo == 0 )
+        {
+        iCacheReqMade = ETrue;
+        iCache->CheckCacheL( KLogo, iCacheTempPreset->GetImgUrl(), iForceGet,
+                        iResult );
+        }
+    //1 means, this API is called for the usecase of downloading logo
+    else if ( iSendingLogo == 1 )
+        {
+        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() );
+        // If KAccept include "image/jpeg", we can't get correct content of 
+		// png file from server 
+        _LIT8(KAccept,"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;
+    CleanupClosePushL(urlWithPar);
+    urlWithPar.CreateL( sizeImgUrlWithPar );
+    urlWithPar.Copy( iTempPreset->GetImgUrl() );
+    RBuf tempBuf;
+    CleanupClosePushL(tempBuf);
+    tempBuf.CreateL( 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;
+    CleanupClosePushL(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.CreateL( sizeImgUrl );
+        imgUrl.Copy( urlWithPar.Left( sizeImgUrl ) );
+        iTempPreset->SetImgUrlL( 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->SetLogoDataL( *iRespBody );
+    //which means the request came from SearchView while doing Add to Favorite
+    if ( iTempReqFrom == 0 )
+        {
+        iPresetModifiedStatus = ETrue;
+        }
+    //which menas the request came from a view other than NowPlayingView
+    else if ( iTempReqFrom == 1 )
+        {
+        iTempLogoHandle->PresetLogoDownloadedL( iTempPreset );
+        }
+    //which menas the request came from NowPlayingView
+    else if ( iTempReqFrom == 2 )
+        {
+        //(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->SetImgUrlL( urlWithPar );
+    //Cache the newly downloaded logo
+    iCache->CacheLogoL( *iRespBody, iTempPreset->GetImgUrl(),
+                    *iResponseHeaders );
+
+    CleanupStack::PopAndDestroy(3);
+
+    iRunning = EFalse;
+    iState = EIdle;
+    IRLOG_DEBUG( "CIRLogoDownloadEngine::SendPresetWithLogoL - Exiting" );
+    }
+
+// ---------------------------------------------------------------------------
+// CIRLogoDownloadEngine::MHFRunL())
+// 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 );
+                }
+            //304 means, the content has not modified
+            else if ( status == KStatusNotModified )
+                {
+                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;
+            //304 means, the content has not modified
+            if ( iRespCode == KStatusNotModified )
+                {
+                //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()
+// 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()
+// 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()
+//  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()
+//  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()
+//  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;
+            CleanupClosePushL(urlWithPar);
+            urlWithPar.CreateL( 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;
+            CleanupClosePushL(tempBuf);
+            tempBuf.CreateL( 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;
+            CleanupClosePushL(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.CreateL( sizeImgUrl );
+                imgUrl.Copy( urlWithPar.Left( sizeImgUrl ) );
+                if ( iSendingLogo == 0 )
+                    {
+                    iCacheTempPreset->SetImgUrlL( imgUrl );
+                    }
+                else if ( iSendingLogo == 1 )
+                    {
+                    iTempPreset->SetImgUrlL( imgUrl );
+                    }
+                }
+            else
+                {
+                //nothing to be done
+                //the imgUrl present in the preset is correct, no need to change anything
+                }
+
+            if ( iSendingLogo == 0 )
+                {
+                //logo is available in the cache
+                if ( aChoice == KCacheAvailable )
+                    {
+                    iCacheTempPreset->SetLogoDataL( iCache->iLogoData );
+                    }
+                if ( iCacheReqFrom == 0 )
+                    {
+                    iPresetModifiedStatus = ETrue;
+                    }
+                else
+                    {
+                    iCacheTempLogoHandle->PresetLogoDownloadedL(
+                                    iCacheTempPreset );
+                    }
+
+                ManageCachePresetArrayIndexL();
+                }
+            else if ( iSendingLogo == 1 )
+                {
+                //logo is available in the cache
+                if ( aChoice == KCacheAvailable )
+                    {
+                    iTempPreset->SetLogoDataL( iCache->iLogoData );
+                    }
+                if ( iTempReqFrom == 0 )
+                    {
+                    iPresetModifiedStatus = ETrue;
+                    }
+                else
+                    {
+                    iTempLogoHandle->PresetLogoDownloadedL( iTempPreset );
+                    }
+
+                ManagePresetArrayIndexL();
+                }
+            //logo request from the search results (while displaying logo)
+            else if ( iSendingLogo == 2 )
+                {
+                //code here, if needed
+                }
+            //close all the buffers
+            CleanupStack::PopAndDestroy(3);
+            }
+        }
+    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" );
+    }
+
+// -----------------------------------------------------------------------------
+// ---------------------------------------------------------------------------
+// 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*/)
+    {
+    // nothing to do
+    }