diff -r 000000000000 -r 09774dfdd46b internetradio2.0/dataprovidersrc/irlogodownloadengine.cpp --- /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 + +#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(KPresetsArrayMaxLength); + iObserverArray = new (ELeave) CArrayPtrFlat(KPresetsArrayMaxLength); + iReqFromArray = new (ELeave) CArrayFixFlat(KPresetsArrayMaxLength); + iCachePresetArray = new (ELeave) CArrayPtrFlat(KPresetsArrayMaxLength); + iCacheObserverArray = new (ELeave) CArrayPtrFlat(KPresetsArrayMaxLength); + iCacheReqFromArray = new (ELeave) CArrayFixFlat(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*/) + { + + } +