--- /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*/)
+ {
+
+ }
+