diff -r 000000000000 -r 09774dfdd46b internetradio2.0/isdsclientsrc/irisdsclient.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/internetradio2.0/isdsclientsrc/irisdsclient.cpp Mon Apr 19 14:01:53 2010 +0300 @@ -0,0 +1,1715 @@ +/* +* 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: ?Description +* +*/ + + +#include +#include +#include + +#include "irbrowsecatagoryitems.h" +#include "irbrowsechannelitems.h" +#include "ircachemgmt.h" +#include "irdataprovider.h" +#include "irdataproviderconstants.h" +#include "irdebug.h" +#include "irhttprequestdata.h" +#include "irotaupdate.h" +#include "irsessionlogger.h" +#include "irsettings.h" +#include "irxmlcontenthandler.h" +#include "isdsclientdll.h" +#include "misdsresponseobserver.h" + +#include "irisdspreset.h" + +const TInt KChannelidMaxLength = 25; +const TInt KTwo = 2; +/*const TInt KDays = 7; +const TInt KHour = 24; +const TInt KMinute = 60; +const TInt KSecond = 60;*/ +const TInt KUrlPassMaxLength = 124; +const TInt KChidMaxLength = 6; +const TInt KCopyOfTimeMaxLength = 32; +const TInt KMaxLength = 256; +const TInt KFour = 4; + +_LIT(KBrowseUrl,"/do/directory/browse?type="); +_LIT(KChannelnSearchUrl,"/do/directory/browse?type=channels&searchText="); + +_LIT(KGetIRIDUrl,"/do/service/getIrid"); +_LIT(KGenres,"genres"); +_LIT(KLanguages,"languages"); +_LIT(KCountries,"countries"); +_LIT(KHotpicks,"hotpicks"); +_LIT(KOtaUpdateUrl,"/do/service/otaUpdate?irid="); +_LIT(KLogUsageUrl,"/do/service/logUsage"); +_LIT(KSearchUrl,"&start=1&size=50"); +_LIT(KMultiSearchUrl, "/do/directory/browse?type=channels&genreID=%S&countryID=%S&languageID=%S&searchText="); + + +// --------------------------------------------------------------------------- +// CIRIsdsClient::NewL(MIsdsResponseObserver& aobserver) +// Used by UI to create instance of CIRIsdsClient. +// --------------------------------------------------------------------------- +// +EXPORT_C CIRIsdsClient* CIRIsdsClient::NewL(MIsdsResponseObserver& aobserver, + const TDesC& aISDSBaseUrl) + { + IRLOG_DEBUG( "CIRIsdsClient::NewL - Entering" ); + CIRIsdsClient* self = CIRIsdsClient::NewLC(aobserver,aISDSBaseUrl); + + CleanupStack::Pop( self ); + IRLOG_DEBUG( "CIRIsdsClient::NewL - Exiting." ); + return self; + } + + +// --------------------------------------------------------------------------- +// CIRIsdsClient::NewLC(MIsdsResponseObserver& aobserver) +// Creates instance of CIRIsdsClient. +// --------------------------------------------------------------------------- +// +CIRIsdsClient* CIRIsdsClient::NewLC(MIsdsResponseObserver& aobserver, + const TDesC& aISDSBaseUrl) + { + IRLOG_DEBUG( "CIRIsdsClient::NewLC - Entering" ); + CIRIsdsClient* self = new ( ELeave ) CIRIsdsClient(aobserver); + CleanupStack::PushL( self ); + self->ConstructL(aISDSBaseUrl); + IRLOG_DEBUG( "CIRIsdsClient::NewLC - Exiting." ); + return self; + } + + +// --------------------------------------------------------------------------- +// CIRIsdsClient::ConstructL() +// Symbian two phased constructor +// --------------------------------------------------------------------------- +// +void CIRIsdsClient::ConstructL(const TDesC& aISDSBaseUrl) + { + //! Construsting the DataproviderDLL instance + IRLOG_DEBUG( "IRIsdsClient::ConstructL - Entering" ); + iSettings=CIRSettings::OpenL(); + iISDSBaseUrl=aISDSBaseUrl.AllocL(); +//Base URL required to browse through the category + iCatgoryURL.Zero(); + iCatgoryURL.Copy(*iISDSBaseUrl); + iCatgoryURL.Append(KBrowseUrl); + //Base URL required to search isds + iSearchURL.Zero(); + iSearchURL.Copy(*iISDSBaseUrl); + iSearchURL.Append(KChannelnSearchUrl); + //Base URL required to get IRID + iGetIridUrl.Zero(); + iGetIridUrl.Copy(*iISDSBaseUrl); + iGetIridUrl.Append(KGetIRIDUrl); + //creates DataProvider + iDataProvider=CIRDataProvider::NewL(*this); + //creates XML Parser + iXmlReader=CIRXMLContentHandler::NewL(*this,*this); + //creates Cache manager + iCache=CIRCacheMgmt::OpenL(*this); + iCache->AddObserverL(this); + //Session Log + iBrowseReport = CIRReportGenerator::OpenL(); + // Retrive the current language and set it as an Accept Language + TLanguage currentLanguage = User::Language(); + iShortLanguageCode = IRLanguageMapper::MapLanguage(currentLanguage); + + IRLOG_DEBUG( "IRIsdsClient::ConstructL - Exiting." ); + + } + + +// --------------------------------------------------------------------------- +// CIRIsdsClient::CIRIsdsClient(MIsdsResponseObserver& aobserver) +// Default constructor +// --------------------------------------------------------------------------- +// +CIRIsdsClient::CIRIsdsClient(MIsdsResponseObserver& aobserver): + iIsdsResponseObserver(aobserver) + { + IRLOG_DEBUG( "CIRIsdsClient::CIRIsdsClient" ); + //No implementation + } + +// --------------------------------------------------------------------------- +// CIRIsdsClient::~CIRIsdsClient() +// Destructor +// --------------------------------------------------------------------------- +// +CIRIsdsClient::~CIRIsdsClient() + { + IRLOG_DEBUG( "CIRIsdsClient::~CIRIsdsClient - Entering" ); + delete iDataProvider; + delete iXmlReader; + if(iSendPreset) + { + iSendPreset->ResetAndDestroy(); + } + delete iSendPreset; + + if (iCache) + { + iCache->RemoveObserver(this); + iCache->Close(); + } + + if(iSettings) + { + iSettings->Close(); + } + delete iISDSBaseUrl; + if(iBrowseReport) + { + iBrowseReport->Close(); + } + if(iTempRequestObject) + { + delete iTempRequestObject; + iTempRequestObject = NULL; + } + + IRLOG_DEBUG( "CIRIsdsClient::~CIRIsdsClient - Exiting." ); + } + + +EXPORT_C TBool CIRIsdsClient::IRIsdsIsCategoryCachedL( + TIRIsdsclientInterfaceIDs aISDSClientRequest) +{ + iForceGet=EFalse; + TInt res = 0; + iCacheReqMade = EFalse; + switch(aISDSClientRequest) + { + //When genre data is requested by user + case EGenre: + { + //set the request type for subsiquent Use + + iCachePath.Zero(); + iCachePath.Copy(KGenres); + iCache->CheckCacheL(0,KGenres,iForceGet,res); + } + + break; + //When Language data is requested by user + case ELanguages: + { + + iCachePath.Zero(); + iCachePath.Copy(KLanguages); + iCache->CheckCacheL(0,KLanguages,iForceGet,res); + + } + break; + //When Country data is requested by user + case ECountries: + { + + iCachePath.Zero(); + iCachePath.Copy(KCountries); + iCache->CheckCacheL(0,KCountries,iForceGet,res); + } + break; + + //When hotpics data is requested by user + case Ehotpicks: + { + //set the request type for subsiquent Use + iCachePath.Zero(); + iCachePath.Copy(KHotpicks); + iCache->CheckCacheL(1,KHotpicks,iForceGet,res); + + } + break; + default: + break; + } + + if (res == CIRCacheMgmt::ECacheUseable) + { + return ETrue; + } + + + return EFalse; +} +// --------------------------------------------------------------------------- +// void CIRIsdsClientInteface(TIRIsdsclientInterfaceIDs aISDSClientRequest) +// Called by UI to make request to ISDS for catogories +// @param :ENUM value depending on catogory which user wants to explore +// --------------------------------------------------------------------------- +// + +EXPORT_C TBool CIRIsdsClient::IRIsdsClientIntefaceL(TIRIsdsclientInterfaceIDs + aISDSClientRequest) + { + //cancels any pending request + IRLOG_DEBUG( "CIRIsdsClient::IRIsdsClientIntefaceL - Entering" ); + CIRHttpRequestData * requestData= new(ELeave) CIRHttpRequestData; + CleanupStack::PushL(requestData); + requestData->iAcceptLanguage.Copy( iShortLanguageCode ); + //Sets the Htpp method to GET + requestData->iMethod = EIRHttpGET; + //check for valid cache + iForceGet=EFalse; + + TInt res=0; + + switch(aISDSClientRequest) + { + //When genre data is requested by user + case EGenre: + { + //set the request type for subsiquent Use + iRequestType=0; + iDataFrom=EFalse; + iCachePath.Zero(); + iCachePath.Copy(KGenres); + iCacheReqMade = ETrue; + iCache->CheckCacheL(0,KGenres,iForceGet,res); + if(res==0)//if cache is not available + { + requestData->iUri.Copy(iCatgoryURL); + requestData->iUri.Append(KGenres); + iConditonalGet=EFalse; + //issues request for Genre data + IRHttpIssueRequestL(*requestData); + iBrowseUrl.Zero(); + iBrowseUrl.Copy(requestData->iUri); + iBrowseReport->BrowseUrl(iBrowseUrl,0); + iDataFrom=ETrue; + } + if(res ==-1)//i cache is stale + { + iConditonalGet=ETrue; + requestData->iIfModifiedSince = iLastModifiedTime.DateTime(); + requestData->isIfModifiedSet = ETrue; + requestData->iUri.Copy(iCatgoryURL); + requestData->iUri.Append(KGenres); + IRHttpIssueRequestL(*requestData); + iBrowseUrl.Zero(); + iBrowseUrl.Copy(requestData->iUri); + iBrowseReport->BrowseUrl(iBrowseUrl,0); + iDataFrom=ETrue; + } + if (res == 1) + { + requestData->iUri.Copy(iCatgoryURL); + requestData->iUri.Append(KGenres); + iBrowseUrl.Zero(); + iBrowseUrl.Copy(requestData->iUri); + iBrowseReport->BrowseUrl(iBrowseUrl,0); + } + } + break; + //When Language data is requested by user + case ELanguages: + { + //set the request type for subsiquent Use + iRequestType=0; + iDataFrom=EFalse; + + iCachePath.Zero(); + iCachePath.Copy(KLanguages); + iCacheReqMade = ETrue; + iCache->CheckCacheL(0,KLanguages,iForceGet,res); + + if(res==0)//if cache is not available + { + requestData->iUri.Copy(iCatgoryURL); + requestData->iUri.Append(KLanguages); + //Isuues request for language data + IRHttpIssueRequestL(*requestData); + iConditonalGet=EFalse; + iBrowseUrl.Zero(); + iBrowseUrl.Copy(requestData->iUri); + iBrowseReport->BrowseUrl(iBrowseUrl,0); + iDataFrom=ETrue; + } + if(res ==-1)//i cache is stale + { + iConditonalGet=ETrue; + requestData->iIfModifiedSince = iLastModifiedTime.DateTime(); + requestData->isIfModifiedSet=ETrue; + requestData->iUri.Copy(iCatgoryURL); + requestData->iUri.Append(KLanguages); + //Isuues request for language data if cache isnt valid + IRHttpIssueRequestL(*requestData); + iBrowseUrl.Zero(); + iBrowseUrl.Copy(requestData->iUri); + iBrowseReport->BrowseUrl(iBrowseUrl,0); + iDataFrom=ETrue; + } + if (res == 1) + { + requestData->iUri.Copy(iCatgoryURL); + requestData->iUri.Append(KLanguages); + iBrowseUrl.Zero(); + iBrowseUrl.Copy(requestData->iUri); + iBrowseReport->BrowseUrl(iBrowseUrl,0); + } + } + break; + //When Country data is requested by user + case ECountries: + { + //set the request type for subsiquent Use + iRequestType=0; + iDataFrom=EFalse; + + iCachePath.Zero(); + iCachePath.Copy(KCountries); + iCacheReqMade = ETrue; + iCache->CheckCacheL(0,KCountries,iForceGet,res); + if(res==0)//if cache is not available + { + requestData->iUri.Copy(iCatgoryURL); + requestData->iUri.Append(KCountries); + //Isuues request for country data + IRHttpIssueRequestL(*requestData); + iConditonalGet=EFalse; + iBrowseUrl.Zero(); + iBrowseUrl.Copy(requestData->iUri); + iBrowseReport->BrowseUrl(iBrowseUrl,0); + iDataFrom=ETrue; + } + if(res ==-1)//i cache is stale + { + iConditonalGet=ETrue; + requestData->iIfModifiedSince = iLastModifiedTime.DateTime(); + requestData->isIfModifiedSet = ETrue; + requestData->iUri.Copy(iCatgoryURL); + requestData->iUri.Append(KCountries); + //Isuues request for country data if cache isnt valid + IRHttpIssueRequestL(*requestData); + iBrowseUrl.Zero(); + iBrowseUrl.Copy(requestData->iUri); + iBrowseReport->BrowseUrl(iBrowseUrl,0); + iDataFrom=ETrue; + } + if (res == 1) + { + requestData->iUri.Copy(iCatgoryURL); + requestData->iUri.Append(KCountries); + iBrowseUrl.Zero(); + iBrowseUrl.Copy(requestData->iUri); + iBrowseReport->BrowseUrl(iBrowseUrl,0); + } + + } + break; + + //When hotpics data is requested by user + case Ehotpicks: + { + //set the request type for subsiquent Use + iRequestType=1; + iCacheReqMade = ETrue; + iCache->CheckCacheL(1,KHotpicks,iForceGet,res); + iCachePath.Zero(); + iCachePath.Copy(KHotpicks); + iDataFrom=EFalse; + + if(res==0)//if cache is not available + { + requestData->iUri.Copy(iCatgoryURL); + requestData->iUri.Append(KHotpicks); + //Isuues request for hotpics data + IRHttpIssueRequestL(*requestData); + iConditonalGet=EFalse; + iBrowseUrl.Zero(); + iBrowseUrl.Copy(requestData->iUri); + iBrowseReport->BrowseUrl(iBrowseUrl,0); + iDataFrom=ETrue; + } + if(res ==-1)//i cache is stale + { + iConditonalGet=ETrue; + requestData->iIfModifiedSince = iLastModifiedTime.DateTime(); + requestData->isIfModifiedSet=ETrue; + requestData->iUri.Copy(iCatgoryURL); + requestData->iUri.Append(KHotpicks); + //Isuues request for hotpics data if cache isnt valid + IRHttpIssueRequestL(*requestData); + iBrowseUrl.Zero(); + iBrowseUrl.Copy(requestData->iUri); + iBrowseReport->BrowseUrl(iBrowseUrl,0); + iDataFrom=ETrue; + } + if (res == 1) + { + requestData->iUri.Copy(iCatgoryURL); + requestData->iUri.Append(KHotpicks); + iBrowseUrl.Zero(); + iBrowseUrl.Copy(requestData->iUri); + iBrowseReport->BrowseUrl(iBrowseUrl,0); + } + } + break; + + } + CleanupStack::PopAndDestroy(requestData); + IRLOG_DEBUG( "CIRIsdsClient::IRIsdsClientIntefaceL - Exiting." ); + return iDataFrom; + }//end of function + + +EXPORT_C CIRDataProvider* CIRIsdsClient::GetDataProvider() +{ + IRLOG_DEBUG( "CIRIsdsClient::GetDataProvider" ); + return iDataProvider; +} + + + + + +// --------------------------------------------------------------------------- +// void IRHttpContentNotChanged() +// this is call back funtion called by Dataprovider in case +// HTTP content isnt changed by ISDS +// --------------------------------------------------------------------------- +// +void CIRIsdsClient::IRHttpResponseCodeReceived( TInt aResponseCode, + CIRHttpResponseData& aResponseHeaders ) + { + IRLOG_INFO2( "CIRIsdsClient::IRHttpResponseCodeReceived (%d)", aResponseCode ); + TInt res = KErrNotFound; + switch (aResponseCode) + { + case KNotFound://404 + { + //make channel user defined. + if(iSyncRequest) + { + iSyncRequest = EFalse; + //make the preset user-defined + TRAP_IGNORE(iIsdsResponseObserver.IsdsPresetRemovedL( + iPresetToBeSynced)) + } + + /*if(iOtaReqFrom) + { + TRAP_IGNORE(PurgeOtaInfoL()) + }*/ + + } + break; + case KNotModified://304 + { + if(iConditonalGet) + { + //update the trust period + //no problem if it leaves + TRAP_IGNORE(iCache->UpdateTrustPeriodL(iRequestType,iCachePath, + aResponseHeaders)) + //do a forced get because the data is notmodifed in isds and + //trustable + iForceGet=ETrue; + iCacheReqMade = ETrue; + TRAP_IGNORE(iCache->CheckCacheL(iRequestType,iCachePath, + iForceGet,res)) + } + /*if(iOtaReqFrom) + { + TRAP_IGNORE(PurgeOtaInfoL()) + }*/ + } + break; + default: + { + + } + break; + } + IRLOG_DEBUG( "CIRIsdsClient::IRHttpResponseCodeReceived - Exiting." ); + } + + +// --------------------------------------------------------------------------- +// void RHttpGeneralError(TInt aErrorCode) +// It is a call back function called by the data provider +// to return error code in case of some error. +// --------------------------------------------------------------------------- +// +void CIRIsdsClient::IRHttpGeneralError(TInt aErrorCode) + { + IRLOG_ERROR2( "CIRIsdsClient::IRHttpGeneralError (%d)", aErrorCode ); + IRRDEBUG2("CIRISDSCLIENT::IRHTTPGENERALERROR",KNullDesC); + if(iSyncRequest) + { + IRRDEBUG2("CIRISDSCLIENT::IRHTTPGENERALERROR--IF ISYNC",KNullDesC); + iSyncRequest=EFalse; + if(aErrorCode == KNotModified || aErrorCode == KServiceUnavailable) + { + TRAP_IGNORE(iIsdsResponseObserver.IsdsPresetNoChangeL()) + return; + } + IRLOG_DEBUG( "CIRIsdsClient::IRHttpGeneralError - Exiting (1)." ); + } + + /*if(iOtaReqFrom) + { + //if internal service request + //reset the flag + iOtaReqFrom = EFalse + IRLOG_DEBUG( "CIRIsdsClient::IRHttpGeneralError - Exiting (2)." ) + return + }*/ + if(iConditonalGet) + { + IRLOG_DEBUG( "CIRIsdsClient::IRHttpGeneralError - Exiting (3). "); + iConditonalGet = EFalse; + if(aErrorCode==KNotModified) + { + return; + } + } + if(iPostResponsePending) + { + IRLOG_DEBUG( "CIRIsdsClient::IRHttpGeneralError - Exiting (4). "); + IRRDEBUG2("CIRISDSCLIENT::ISDSGENERALERROR--POSTPENDING",KNullDesC); + iPostResponsePending = EFalse; + //no action required + //session log is backed up before sending; + return; + } + if(iIRIDPending) + { + IRRDEBUG2("CIRISDSCLIENT::IRHTTPGENERALERROR--IF IRID",KNullDesC); + IRLOG_DEBUG( "CIRIsdsClient::IRHttpGeneralError - Exiting (7). "); + iIRIDPending = EFalse; +//d TRAP_IGNORE( IRGetIRIDL() ) + } + IRRDEBUG2("CIRISDSCLIENT::IRHTTPGENERALERROR--BEFORE TRAPD",KNullDesC); + TRAPD(errd,iIsdsResponseObserver.IsdsErrorL(aErrorCode)); + if(errd) + { + IRRDEBUG2("CIRISDSCLIENT::IRHTTPGENERALERROR--IF ERRD",KNullDesC); + IRLOG_DEBUG( "CIRIsdsClient::IRHttpGeneralError - Exiting (5)." ); + return; + } + IRLOG_DEBUG( "CIRIsdsClient::IRHttpGeneralError - Exiting (6)." ); + } + + +// --------------------------------------------------------------------------- +// void IRHttpDataReceived(TDesC& aXmlPath) +// It is a call back function called by the data provider +// once it recieves the XML data +// --------------------------------------------------------------------------- +// +void CIRIsdsClient::IRHttpDataReceived( const TDesC& aXmlPath, + const CIRHttpResponseData& aResponseHeaders) + { + IRLOG_DEBUG( "CIRIsdsClient::IRHttpDataReceived - Entering" ); + TBuf xmlPath; + xmlPath.Copy(aXmlPath); + + //!Calls XML parser with file path to XML file recieved + TRAPD(xmlErr,iXmlReader->ParseXmlL(xmlPath,iCachePath,aResponseHeaders)) + if(xmlErr!=KErrNone) + { + IRLOG_DEBUG( "CIRIsdsClient::IRHttpDataReceived - Exiting (1)." ); + return; + } + + if(iIRIDPending) + { + iIRIDPending = EFalse; + //if any request is pending by the time IRID response comes + if(iReqPending) + { + //issue the pending request + TRAP_IGNORE(IRHttpIssueRequestL(*iTempRequestObject)) + } + } + + IRLOG_DEBUG( "CIRIsdsClient::IRHttpDataReceived - Exiting (2)." ); + } + +EXPORT_C TBool CIRIsdsClient::IRIsdsIsChannelCachedL(TUint aSelectedOption) +{ + TInt res = 0; + iCacheReqMade = EFalse; + iForceGet=EFalse; + + //previous data from cache + if (iCatDataFrom) + { + if (aSelectedOption >= iCache->iPtrCategory->Count()) + { + User::Leave(KErrArgument); + } + + if (iCache->iPtrCategory->Count()) + { + iCachePath.Zero(); + iCachePath.Copy( + (*(iCache->iPtrCategory))[aSelectedOption]->iCatId->Des()); + + iCache->CheckCacheL(1, + iCachePath, + iForceGet, res); + } + } + //previous data from xml + else + { + if (aSelectedOption >= iXmlReader->iPtrCategory->Count()) + { + User::Leave(KErrArgument); + } + + if (iXmlReader->iPtrCategory->Count()) + { + iCachePath.Zero(); + iCachePath.Copy( + (*(iXmlReader-> iPtrCategory))[aSelectedOption]->iCatId->Des()); + iCache->CheckCacheL( + 1, + iCachePath, + iForceGet, res); + } + } + + + if( CIRCacheMgmt::ECacheUseable == res ) + return ETrue; + + return EFalse; +} + +// --------------------------------------------------------------------------- +// void CIRIsdsClientInteface(TUint aSelectedOption,TIRIsdsClientInterfaces aChoice) +// This API is used by the UI to make request for isds listed channels +// --------------------------------------------------------------------------- +// +EXPORT_C TBool CIRIsdsClient::IRIsdsClientIntefaceL(TUint aSelectedOption, + TIRIsdsClientInterfaces aChoice,TInt aHistoryBool) + { + IRLOG_DEBUG( "CIRIsdsClient::IRIsdsClientIntefaceL - Entering" ); + iForceGet=EFalse; + CIRHttpRequestData * requestData= new(ELeave) CIRHttpRequestData; + CleanupStack::PushL(requestData); + requestData->iMethod = EIRHttpGET; + requestData->iAcceptLanguage.Copy( iShortLanguageCode ); + requestData->iUri.Copy( *iISDSBaseUrl ); + + TBool isAdvPresent = EFalse; + + + TInt res; + if(aChoice==ECatagory) + { + //set the request type for subsiquent Use + iRequestType=1; + //previous data from cache + if(iCatDataFrom) + { + TInt categoryCacheIndex; + + if (( *(iCache->iPtrCategory))[0]->iCatGetOperation) + { + isAdvPresent = EFalse; + } + else + { + isAdvPresent = ETrue; + } + if (!isAdvPresent) + { + categoryCacheIndex = 0; + } + else + { + categoryCacheIndex = 1; + } + + if( aSelectedOption >= iCache->iPtrCategory->Count()) + { + User::Leave(KErrArgument); + } + + if(iCache->iPtrCategory->Count()) + { + iCachePath.Zero(); + iCachePath.Copy((*(iCache->iPtrCategory))[aSelectedOption]->iCatId->Des()); + iCacheReqMade = ETrue; + iCache->CheckCacheL(1,(*(iCache->iPtrCategory))[aSelectedOption]-> + iCatId->Des(),iForceGet,res); + iDataFrom=EFalse; + if(res == 0) + { + requestData->iUri.Append( (*(iCache-> + iPtrCategory))[categoryCacheIndex]->iCatGetOperation->Des()); + requestData->iUri.Append( (*(iCache-> + iPtrCategory))[aSelectedOption]->iCatId->Des()); + IRHttpIssueRequestL(*requestData); + iConditonalGet=EFalse; + iBrowseUrl.Copy(requestData->iUri); + iBrowseReport->BrowseUrl(iBrowseUrl,0); + iDataFrom=ETrue; + } + if(res == -1) + { + iConditonalGet=ETrue; + requestData->iIfModifiedSince = iLastModifiedTime.DateTime(); + requestData->isIfModifiedSet = ETrue; + requestData->iUri.Append( (*(iCache-> + iPtrCategory))[categoryCacheIndex]->iCatGetOperation->Des()); //0 + requestData->iUri.Append( (*(iCache-> + iPtrCategory))[aSelectedOption]->iCatId->Des()); + IRHttpIssueRequestL(*requestData); + iBrowseUrl.Copy(requestData->iUri); + iBrowseReport->BrowseUrl(iBrowseUrl,0); + iDataFrom=ETrue; + } + } + } + //previous data from xml + else + { + TInt categoryXmlIndex; + if (( *(iXmlReader->iPtrCategory))[0]->iCatGetOperation) + { + isAdvPresent = EFalse; + } + else + { + isAdvPresent = ETrue; + } + if (!isAdvPresent) + { + categoryXmlIndex = 0; + } + else + { + categoryXmlIndex = 1; + } + + if (aSelectedOption >= iXmlReader->iPtrCategory->Count()) + { + User::Leave(KErrArgument); + } + + if(iXmlReader->iPtrCategory->Count()) + { + iCachePath.Zero(); + iCachePath.Copy((*(iXmlReader-> + iPtrCategory))[aSelectedOption]->iCatId->Des()); + iCacheReqMade = ETrue; + iCache->CheckCacheL(1,(*(iXmlReader-> + iPtrCategory))[aSelectedOption]->iCatId->Des(),iForceGet,res); + iDataFrom=EFalse; + if( res==0 ) + { + requestData->iUri.Append( (*(iXmlReader-> + iPtrCategory))[categoryXmlIndex]->iCatGetOperation->Des()); + requestData->iUri.Append( (*(iXmlReader-> + iPtrCategory))[aSelectedOption]->iCatId->Des()); + IRHttpIssueRequestL(*requestData); + iConditonalGet=EFalse; + iBrowseUrl.Copy(requestData->iUri); + iBrowseReport->BrowseUrl(iBrowseUrl,0); + iDataFrom=ETrue; + } + if( res==-1 ) + { + iConditonalGet=ETrue; + requestData->iIfModifiedSince = iLastModifiedTime.DateTime(); + requestData->isIfModifiedSet = ETrue; + requestData->iUri.Append( (*(iXmlReader-> + iPtrCategory))[categoryXmlIndex]->iCatGetOperation->Des()); + requestData->iUri.Append( (*(iXmlReader-> + iPtrCategory))[aSelectedOption]->iCatId->Des()); + IRHttpIssueRequestL(*requestData); + iBrowseUrl.Copy(requestData->iUri); + iBrowseReport->BrowseUrl(iBrowseUrl,0); + iDataFrom=ETrue; + } + } + } + } + else if(aChoice==EChannels) + { + + TBuf channelid; + //set the request type for subsiquent Use + iRequestType=KTwo; + _LIT(KFormat,"%d"); + if(aHistoryBool) + { + _LIT(KPresetFetchUrl,"/do/directory/getPreset?channelid="); + requestData->iUri.Append(KPresetFetchUrl); + TBuf channelid; + _LIT(KFormat,"%d"); + channelid.Format(KFormat,aSelectedOption); + requestData->iUri.Append(channelid); + IRHttpIssueRequestL(*requestData); + iConditonalGet=EFalse; + //Session Log + iBrowseUrl.Zero(); + iBrowseUrl.Copy(requestData->iUri); + iBrowseReport->BrowseUrl(iBrowseUrl,1); + iDataFrom=ETrue; + CleanupStack::PopAndDestroy(requestData); + return iDataFrom; + } + + //previous data from cache + if( iChannelDataFrom) + { + TInt channelCacheIndex; + if (( *(iCache->iPtrChannel))[0]->iChannelGetOperation) + { + isAdvPresent = EFalse; + } + else + { + isAdvPresent = ETrue; + } + if (!isAdvPresent) + { + channelCacheIndex = 0; + } + else + { + channelCacheIndex = 1; + } + + + if( aSelectedOption >= iCache->iPtrChannel->Count()) + { + User::Leave(KErrArgument); + } + + if(iCache->iPtrChannel->Count()) + { + channelid.Format(KFormat,(*(iCache-> + iPtrChannel))[aSelectedOption]->iChannelID); + iCachePath.Zero(); + iCachePath.Copy(channelid); + iCacheReqMade = ETrue; + iCache->CheckCacheL(KTwo,channelid,iForceGet,res); + iDataFrom=EFalse; + if( res == 0 || res==-1) + { + requestData->iUri.Append( (*(iCache-> + iPtrChannel))[channelCacheIndex]->iChannelGetOperation->Des()); + requestData->iUri.Append(channelid); + IRHttpIssueRequestL(*requestData); + iConditonalGet=EFalse; + //Session Log + iBrowseUrl.Copy(requestData->iUri); + iBrowseReport->BrowseUrl(iBrowseUrl,1); + iDataFrom=ETrue; + } + } + } + //previous data from xml + else + { + TInt channelXmlIndex; + if( 0 == ( *(iXmlReader->iPtrChannel)).Count() ) + { + CleanupStack::PopAndDestroy(requestData); + IRLOG_DEBUG( "CIRIsdsClient::IRIsdsClientIntefaceL - Error!" ); + return iDataFrom; + } + + if (( *(iXmlReader->iPtrChannel))[0]->iChannelGetOperation) + { + isAdvPresent = EFalse; + } + else + { + isAdvPresent = ETrue; + } + if (!isAdvPresent) + { + channelXmlIndex = 0; + } + else + { + channelXmlIndex = 1; + } + + if( aSelectedOption >= iXmlReader->iPtrChannel->Count()) + { + User::Leave(KErrArgument); + } + + if(iXmlReader->iPtrChannel->Count()) + { + channelid.Format(KFormat,(*(iXmlReader-> + iPtrChannel))[aSelectedOption]->iChannelID); + iCachePath.Zero(); + iCachePath.Copy(channelid); + iCacheReqMade = ETrue; + iCache->CheckCacheL(KTwo,channelid,iForceGet,res); + iDataFrom=EFalse; + if(res == 0 || res==-1) + { + requestData->iUri.Append( (*(iXmlReader-> + iPtrChannel))[channelXmlIndex]->iChannelGetOperation->Des()); + requestData->iUri.Append(channelid); + IRHttpIssueRequestL(*requestData); + iConditonalGet=EFalse; + //Session Log + iBrowseUrl.Copy(requestData->iUri); + iBrowseReport->BrowseUrl(iBrowseUrl,1); + iDataFrom=ETrue; + } + } + } + } + else + { + + } + CleanupStack::PopAndDestroy(requestData); + IRLOG_DEBUG( "CIRIsdsClient::IRIsdsClientIntefaceL - Exiting" ); + return iDataFrom; + } + + + +// --------------------------------------------------------------------------- +// void CIRGetIRID() +// This API is used by the UI to get IR ID from +// isds if it doesnt have one +// --------------------------------------------------------------------------- +// +EXPORT_C void CIRIsdsClient::IRGetIRIDL() + { + IRLOG_DEBUG( "CIRIsdsClient::IRGetIRIDL - Entering" ); + //if irid is not available fetch it + if(iSettings->GetIRIDL().Length()==0) + { + iReqFromGetIRIDFunc = ETrue; + iIRIDPending = EFalse; + CIRHttpRequestData *requestData= new(ELeave) CIRHttpRequestData(); + CleanupStack::PushL(requestData); + requestData->iMethod = EIRHttpGET; + requestData->iAcceptLanguage.Copy( iShortLanguageCode ); + requestData->iUri.Copy(iGetIridUrl); + IRHttpIssueRequestL(*requestData); + CleanupStack::PopAndDestroy(requestData); + iIRIDPending = ETrue; + IRLOG_DEBUG( "CIRIsdsClient::IRGetIRIDL - Exiting (1)." ); + return; + } + IRLOG_DEBUG( "CIRIsdsClient::IRGetIRIDL - Exiting (2)." ); + } +// --------------------------------------------------------------------------- +// void GetOtaStatus() +// This API is used by the UI to query for ota update +// --------------------------------------------------------------------------- +// +EXPORT_C void CIRIsdsClient::GetOtaStatusL(TBool& aDataFrom) + { + IRLOG_DEBUG( "CIRIsdsClient::GetOtaStatusL - Entering" ); + + CIRHttpRequestData *requestData= new(ELeave) CIRHttpRequestData(); + + CleanupStack::PushL(requestData); + + requestData->iMethod = EIRHttpGET; + requestData->iAcceptLanguage.Copy(iShortLanguageCode); + iGetOtaStatus.Zero(); + iGetOtaStatus.Copy(*iISDSBaseUrl); + iGetOtaStatus.Append(KOtaUpdateUrl); + iGetOtaStatus.Append( iSettings->GetIRIDL()); + + //set the request type for subsiquent Use + iRequestType = EOtaInfo; + iDataFrom=EFalse; + iCachePath.Zero(); + iCachePath.Copy(KOtaUpdateUrl); + TInt res = 0; + //check cache if it is a genral service request + //not initiated by the user. + if(iOtaReqFrom) + { + iCacheReqMade = ETrue; + iCache->CheckCacheL(EOtaInfo,KOtaUpdateUrl,iForceGet,res); + } + if(res == 1) + { + aDataFrom = EFalse; + } + //if cache is not available or stale(dont use the trust period val) + if(res == 0 || res == -1) + { + requestData->iUri.Copy(iGetOtaStatus); + iConditonalGet=EFalse; + //issues request for ota data + iDataProvider->IRHttpIssueRequestL(*requestData); + iDataFrom=ETrue; + aDataFrom = ETrue; + } + CleanupStack::PopAndDestroy(requestData); + + IRLOG_DEBUG( "CIRIsdsClient::GetOtaStatusL - Exiting." ); + } + +// --------------------------------------------------------------------------- +// CIRIsdsClient::IRISDSPostL() +// This API is used to Post Irapp usage report to isds +// --------------------------------------------------------------------------- +// +EXPORT_C void CIRIsdsClient::IRISDSPostL(TFileName &/*aFileName*/) + { + IRLOG_DEBUG( "CIRIsdsClient::IRISDSPostL - Entering" ); + IRRDEBUG2("CIRISDSCLIENT::ISDSPOSTL",KNullDesC); + //Cancels any pending requests + IRISDSCancelRequest(); + CIRHttpRequestData * requestData= new(ELeave) CIRHttpRequestData; + CleanupStack::PushL(requestData); + //Sets the Http Method to POST + requestData->iMethod = EIRHttpPOST; + requestData->iAcceptLanguage.Copy(iShortLanguageCode); + requestData->iUri.Copy(*iISDSBaseUrl); + requestData->iUri.Append(KLogUsageUrl); + //issues request to post the log usage report to isds + iPostResponsePending = ETrue; + IRHttpIssueRequestL(*requestData); + CleanupStack::PopAndDestroy(requestData); + IRLOG_DEBUG( "CIRIsdsClient::IRISDSPostL - Exiting" ); + } + +// --------------------------------------------------------------------------- +// void CIRISDSCancelRequest() +// This API is used by the UI to cancel a request made. +// --------------------------------------------------------------------------- +// +EXPORT_C void CIRIsdsClient::IRISDSCancelRequest() + { + IRLOG_DEBUG( "CIRIsdsClient::IRISDSCancelRequest - Entering" ); + iSyncRequest = EFalse; + iReqFromSync = EFalse; + iOtaReqFrom = EFalse; + iConditonalGet = EFalse; + iPostResponsePending = EFalse; + iIRIDPending = EFalse; + iDataProvider->IRHttpCancelRequest(); + IRLOG_DEBUG( "CIRIsdsClient::IRISDSCancelRequest - Exiting" ); + } + +EXPORT_C void CIRIsdsClient::IRISDSMultiSearchL(const TDesC& aGenreID, const TDesC& aCountryID, const TDesC& aLanguageID, const TDesC& aSearchText) +{ + IRLOG_DEBUG( "CIRIsdsClient::IRISDSMultiSearch - Entering" ); + CIRHttpRequestData * requestData= new(ELeave) CIRHttpRequestData(); + iCachePath.Zero(); + CleanupStack::PushL(requestData); + + requestData->iMethod = EIRHttpGET; + requestData->iAcceptLanguage.Copy( iShortLanguageCode ); + + HBufC8* utfEncodedSearchText = CnvUtfConverter::ConvertFromUnicodeToUtf8L( aSearchText ); + CleanupStack::PushL( utfEncodedSearchText ); + + + HBufC8 *encodedQuery = NULL; + encodedQuery = EscapeUtils::EscapeEncodeL(*utfEncodedSearchText, EscapeUtils::EEscapeQuery); + + HBufC* searchURL = HBufC::NewLC(iISDSBaseUrl->Length() + KMultiSearchUrl().Length() + aGenreID.Length() + aLanguageID.Length() + aCountryID.Length() + + KSearchUrl().Length() + utfEncodedSearchText->Size()/2+1); + HBufC* searchPartURL = HBufC::NewLC(KMultiSearchUrl().Length() + aGenreID.Length() + aLanguageID.Length() + aCountryID.Length()); + searchPartURL->Des().Format(KMultiSearchUrl, &aGenreID, &aCountryID, &aLanguageID); + + HBufC* searchText = HBufC::NewLC(utfEncodedSearchText->Size()/2+1); + TPtr searchTextPtr(searchText->Des()); + searchTextPtr.Copy(*utfEncodedSearchText); + + TPtr uriPtr( searchURL->Des()); + uriPtr.Append(*iISDSBaseUrl); + uriPtr.Append(*searchPartURL); + uriPtr.Append(searchTextPtr); + uriPtr.Append(KSearchUrl); + + if (encodedQuery) + { + delete encodedQuery; + } + + requestData->iUri.Copy( searchURL->Left( requestData->iUri.MaxLength() ) ); + IRHttpIssueRequestL(*requestData); + CleanupStack::PopAndDestroy(searchText); + CleanupStack::PopAndDestroy(searchPartURL); + CleanupStack::PopAndDestroy(searchURL); + CleanupStack::PopAndDestroy(utfEncodedSearchText); + + + iBrowseUrl.Zero(); + iBrowseUrl.Copy(requestData->iUri); + EncodeUrlL(iBrowseUrl); + iBrowseReport->BrowseUrl(iBrowseUrl,1); + CleanupStack::PopAndDestroy(requestData); + + IRLOG_DEBUG( "CIRIsdsClient::IRISDSMultiSearch - Exiting." ); +} +// --------------------------------------------------------------------------- +// void CIRISDSSearch(TDesC& aSearchString) +// This API is used by the UI to search channels from isds +// --------------------------------------------------------------------------- +// +EXPORT_C void CIRIsdsClient::IRISDSSearchL(const TDesC& aSearchString) + { + IRLOG_DEBUG( "CIRIsdsClient::IRISDSSearchL - Entering" ); + CIRHttpRequestData * requestData= new(ELeave) CIRHttpRequestData(); + iCachePath.Zero(); + CleanupStack::PushL(requestData); + //Sets the Http method to GET + requestData->iMethod = EIRHttpGET; + requestData->iAcceptLanguage.Copy( iShortLanguageCode ); + + // This is a blatant hack to circumvent the fact that the application has hard-coded + // 256 to be the maximum length of the URI everywhere. Due to time-restraints it is + // not feasible to fix the actual issue here, so every search query that would exceed + // the said limit is truncated to fit it. + // + // The practical impacts of this hack is that should the maximum length be exceeded, + // a connection timed out query is most often displayed. + // + // The scope of this quick hack is to enable users to perform search with UTF-8 characters + // with no possibility of application panics due to descriptor overflows, not to fix + // the actual problem with the hard-coded TBufs in the application. + + HBufC8* utfEncoded = CnvUtfConverter::ConvertFromUnicodeToUtf8L( aSearchString ); + CleanupStack::PushL( utfEncoded ); + HBufC8* uri = HBufC8::NewL( iSearchURL.Size() + utfEncoded->Size() + KSearchUrl().Size() ); + TPtr8 uriPtr( uri->Des() ); + uriPtr.Copy( iSearchURL ); + + HBufC8 *encodedQuery = NULL; + encodedQuery = EscapeUtils::EscapeEncodeL(*utfEncoded,EscapeUtils::EEscapeQuery); + uriPtr.Append( *encodedQuery ); + uriPtr.Append( KSearchUrl ); + if(encodedQuery) + { + delete encodedQuery ; + } + CleanupStack::PopAndDestroy( utfEncoded ); + requestData->iUri.Copy( uri->Left( requestData->iUri.MaxLength() ) ); + delete uri; + + IRHttpIssueRequestL(*requestData); + iBrowseUrl.Zero(); + iBrowseUrl.Copy(requestData->iUri); + EncodeUrlL(iBrowseUrl); + iBrowseReport->BrowseUrl(iBrowseUrl,1); + CleanupStack::PopAndDestroy(requestData); + IRLOG_DEBUG( "CIRIsdsClient::IRISDSSearchL - Exiting." ); + } + + +// --------------------------------------------------------------------------- +//void ParsedStructure(TInt aChoice) +//Call back funtion called by XML parser after parsing is over +// --------------------------------------------------------------------------- +// +void CIRIsdsClient::ParsedStructureL(TInt aChoice) +{ + IRLOG_DEBUG( "CIRIsdsClient::ParsedStructureL - Entering" ); + //if catogory info is recieved + if(aChoice==ECategoryInfoRecieved) + { + iCatDataFrom=EFalse; + iIsdsResponseObserver.IsdsCatogoryDataReceivedL(*(iXmlReader-> + iPtrCategory)); + } + // if channels list is recieved + else if(aChoice==EChannelListRecieved) + { + iChannelDataFrom=EFalse; + iIsdsResponseObserver.IsdsChannelDataReceivedL(*(iXmlReader->iPtrChannel)); + } + + //if preset data is recieved + else if(aChoice==EPresetDataRecieved) + { + if(iSyncRequest) + { + iSyncRequest = EFalse; + //update the preset(replace it) + iIsdsResponseObserver.IsdsPresetChangedL(*iXmlReader->iPtrPreset->At(0)); + } + else + { + iIsdsResponseObserver.IsdsPresetDataReceivedL(*(iXmlReader-> + iPtrPreset)); + } + } + /*else if(aChoice==EOtaInfoRecieved) + { + if(!iOtaReqFrom) + { + iIsdsResponseObserver.IsdsOtaInfoRecieved(*iXmlReader->iOTA) + } + else + { + iOtaReqFrom=EFalse; + //update settings + if(iXmlReader->iOTA->iUpdateInterval!=0) + { + iSettings->SetSilencePeriodL(iXmlReader->iOTA->iUpdateInterval) + } + else + { + iSettings->SetSilencePeriodL(KDays*KHour*KMinute*KSecond) + } + } + }*/ + else if(aChoice==EIridRecieved) + { + iSettings->SetIRIDL(iXmlReader->iRID); + } + else if( aChoice == ESessionLogRecieved ) + { + //session log is recieved in ISDS + iPostResponsePending = EFalse; + iBrowseReport->ReponseFromISDSObtained(); + } + + else + { + TRAPD(errd,iIsdsResponseObserver.IsdsErrorL(KDataProviderTimeout)); + if(errd) + { + IRLOG_DEBUG( "CIRIsdsClient::ParsedStructureL - Exiting ." ); + return; + } + } + IRLOG_DEBUG( "CIRIsdsClient::ParsedStructureL - Exiting." ); + } + +// --------------------------------------------------------------------------- +// void ParseError() +// Call back funtion called by XML parser in case of parsing error +// --------------------------------------------------------------------------- +// +void CIRIsdsClient::ParseError( TInt aErrorCode ) + { + IRLOG_ERROR( "CIRIsdsClient::ParseError - Entering" ); + + IRHttpGeneralError( aErrorCode ); + IRLOG_DEBUG( "CIRIsdsClient::ParseError - Exiting." ); + } + + + void CIRIsdsClient::CacheError() + { + IRLOG_ERROR( "CIRIsdsClient::CacheError" ); + } + + void CIRIsdsClient::CacheFailed() + { + IRLOG_WARNING( "CIRIsdsClient::CacheFailed" ); + } + +// --------------------------------------------------------------------------- +// cache is present but Stale. +// called by cache mgmt as a callback. +// after copying the lastmodified time into its variable +// here it is copied into the variable ilastModifiedTime +// --------------------------------------------------------------------------- +// +void CIRIsdsClient::CacheInvalid() + { + IRLOG_DEBUG( "CIRIsdsClient::CacheInvalid - Entering" ); + iLastModifiedTime = iCache->iLastModified; + IRLOG_DEBUG( "CIRIsdsClient::CacheInvalid - Exiting" ); + } + + void CIRIsdsClient::CachedStructureL(TInt aChoice) + { + IRLOG_DEBUG( "CIRIsdsClient::CachedStructureL - Entering" ); + if(iCacheReqMade) + { + iCacheReqMade = EFalse; + //if catogory info is recieved + if(aChoice==ECategoryInfoRecieved) + { + iCatDataFrom=ETrue; + iIsdsResponseObserver.IsdsCatogoryDataReceivedL(*(iCache->iPtrCategory)); + } + + // if channels list is recieved + else if(aChoice==EChannelListRecieved) + { + iChannelDataFrom=ETrue; + iIsdsResponseObserver.IsdsChannelDataReceivedL(*(iCache->iPtrChannel)); + } + + //if preset data is recieved + else if(aChoice==EPresetDataRecieved) + { + //multiple presets can be presented to the UI. + iIsdsResponseObserver.IsdsPresetDataReceivedL(*(iCache->iPtrPreset)); + } + + //if ota data is recieved + /*else if(aChoice==EOtaInfoRecieved) + { + if(!iOtaReqFrom) + { + iIsdsResponseObserver.IsdsOtaInfoRecieved(*iCache->iOTA) + } + else + { + iOtaReqFrom=EFalse; + //update settings + if(iCache->iOTA->iUpdateInterval!=0) + { + iSettings->SetSilencePeriodL(iCache->iOTA->iUpdateInterval) + } + else + { + iSettings->SetSilencePeriodL(KDays*KHour*KMinute*KSecond) + } + } + }*/ + //if logo data is recieved + else if(aChoice==KFour) + { + //No implementation + } + else + { + TRAPD(errd,iIsdsResponseObserver.IsdsErrorL(KDataProviderTimeout)); + if(errd) + { + IRLOG_DEBUG( "CIRIsdsClient::CachedStructureL- Exiting ." ); + return; + } + } + + } + IRLOG_DEBUG( "CIRIsdsClient::CachedStructureL - Exiting." ); + } + +// --------------------------------------------------------------------------- +// void CIRIsdsClient::SyncPresetL() +// Used to syncronize presets +// --------------------------------------------------------------------------- +// +EXPORT_C TInt CIRIsdsClient::SyncPresetL(TInt aPresetId,const TDesC& + aIfModifiedSince) + { + IRLOG_DEBUG( "CIRIsdsClient::SyncPresetL - Entering" ); + IRRDEBUG2("CIRISDCLIENT::SYNCPRESETL",KNullDesC); + iReqFromSync = ETrue; + iPresetToBeSynced=aPresetId; + CIRHttpRequestData * requestData= new(ELeave) CIRHttpRequestData; + CleanupStack::PushL(requestData); + requestData->iMethod = EIRHttpGET; + + requestData->iAcceptLanguage.Copy(iShortLanguageCode); + TDateTime lastModified; + ConvertToTimeDate(aIfModifiedSince,lastModified); + requestData->isIfModifiedSet=ETrue; + requestData->iIfModifiedSince.Set(lastModified.Year(),lastModified.Month(), + lastModified.Day(),lastModified.Hour(),lastModified.Minute(), + lastModified.Second(),lastModified.MicroSecond()); + _LIT(KPresetFetchUrl,"/do/directory/getPreset?channelid="); + + TBuf urlPass(iSettings->GetISDSBaseUrlL()); + urlPass.Append(KPresetFetchUrl); + + TBuf chid; + _LIT(KFormat,"%d"); + chid.Format(KFormat,aPresetId); + urlPass.Append(chid); + requestData->iUri.Copy(urlPass); + + IRHttpIssueRequestL(*requestData); + CleanupStack::PopAndDestroy(requestData); + IRLOG_DEBUG( "CIRIsdsClient::SyncPresetL - Exiting." ); + return 1; + } + +// --------------------------------------------------------------------------- +// void ReleaseResources() +// +// --------------------------------------------------------------------------- +// +EXPORT_C void CIRIsdsClient::ReleaseResources() + { + IRLOG_DEBUG( "CIRIsdsClient::ReleaseResources - Entering" ); + iDataProvider->ReleaseResources(); + IRLOG_DEBUG( "CIRIsdsClient::ReleaseResources - Exiting" ); + } + +//--------------------------------------------------------------------------- +//CIRIsdsClient::GetMultiplePresetsL +//for multiple selected presets to be saved +// +//--------------------------------------------------------------------------- +// + +EXPORT_C void CIRIsdsClient::GetMultiplePresetsL(const RArray& aIndexArray,TBool& aDataFrom) + { + IRLOG_DEBUG( "CIRIsdsClient::GetMultiplePresetsL - Entering" ); + _LIT(KSeparator,","); + //get the count of the no of requested presets + TInt multiSelectedCount = aIndexArray.Count(); + //allocate space for the request url + HBufC8* channelIds = HBufC8::NewLC(multiSelectedCount*KDefaultRealWidth + + multiSelectedCount); + //http request data + CIRHttpRequestData* requestData= new(ELeave) CIRHttpRequestData; + requestData->iUri.Copy(*iISDSBaseUrl); + CleanupStack::PushL(requestData); + requestData->iAcceptLanguage.Copy(iShortLanguageCode); + //create a tptr to modify it + TPtr8 channelIdPtr = channelIds->Des(); + //set the request type + iRequestType=EPresets; + //result + TInt res; + _LIT8(KFormat,"%d"); + //if from cache + if( iChannelDataFrom) + { + for(TInt i=0;i= 0 && aIndexArray[i] < iCache->iPtrChannel->Count() ); + TInt channelID = iCache->iPtrChannel->At(aIndexArray[i])->iChannelID; + if(i!=0) + { + channelIdPtr.Append(KSeparator); + } + TBuf8 channelIdBuf; + channelIdBuf.Format(KFormat,channelID); + channelIdPtr.Append(channelIdBuf); + } + iCachePath.Zero(); + iCachePath.Copy(*channelIds); + //check if cache is available + iCacheReqMade = ETrue; + iCache->CheckCacheL(EPresets,iCachePath,iForceGet,res); + aDataFrom=EFalse; + if( res == KErrNone ) + { + requestData->iUri.Append( (*(iCache-> + iPtrChannel))[0]->iChannelGetOperation->Des()); + requestData->iUri.Append(*channelIds); + IRHttpIssueRequestL(*requestData); + iConditonalGet=EFalse; + //Session Log + iBrowseUrl.Copy(requestData->iUri); + iBrowseReport->BrowseUrl(iBrowseUrl,1); + aDataFrom=ETrue; + } + if(res == KErrNotFound) + { + iConditonalGet=ETrue; + requestData->iIfModifiedSince = iLastModifiedTime.DateTime(); + requestData->isIfModifiedSet = ETrue; + requestData->iUri.Append( (*(iCache-> + iPtrChannel))[0]->iChannelGetOperation->Des()); + requestData->iUri.Append(*channelIds); + IRHttpIssueRequestL(*requestData); + iBrowseUrl.Copy(requestData->iUri); + iBrowseReport->BrowseUrl(iBrowseUrl,1); + aDataFrom=ETrue; + } + } + //if from xml file + else + { + for(TInt i=0;i= 0 && aIndexArray[i] < iXmlReader->iPtrChannel->Count() ); + TInt channelID = iXmlReader->iPtrChannel->At(aIndexArray[i])->iChannelID; + if(i!=0) + { + channelIdPtr.Append(KSeparator); + } + TBuf8 channelIdBuf; + channelIdBuf.Format(KFormat,channelID); + channelIdPtr.Append(channelIdBuf); + } + iCachePath.Zero(); + iCachePath.Copy(*channelIds); + iCacheReqMade = ETrue; + iCache->CheckCacheL(EPresets,iCachePath,iForceGet,res); + aDataFrom=EFalse; + if( res == KErrNone ) + { + requestData->iUri.Append( (*(iXmlReader-> + iPtrChannel))[0]->iChannelGetOperation->Des()); + requestData->iUri.Append(*channelIds); + IRHttpIssueRequestL(*requestData); + iConditonalGet=EFalse; + //Session Log + iBrowseUrl.Copy(requestData->iUri); + iBrowseReport->BrowseUrl(iBrowseUrl,1); + aDataFrom=ETrue; + } + if(res == KErrNotFound) + { + iConditonalGet=ETrue; + requestData->iIfModifiedSince = iLastModifiedTime.DateTime(); + requestData->isIfModifiedSet = ETrue; + requestData->iUri.Append( (*(iXmlReader-> + iPtrChannel))[0]->iChannelGetOperation->Des()); + requestData->iUri.Append(*channelIds); + IRHttpIssueRequestL(*requestData); + //Session Log + iBrowseUrl.Copy(requestData->iUri); + iBrowseReport->BrowseUrl(iBrowseUrl,1); + aDataFrom=ETrue; + } + } + CleanupStack::PopAndDestroy(requestData); + CleanupStack::PopAndDestroy(channelIds); + IRLOG_DEBUG( "CIRIsdsClient::GetMultiplePresetsL - Exiting" ); + } +//--------------------------------------------------------------------------- +//CIRIsdsClient::ConvertToTimeDate +//converts the date-time stamp (last modified) to Symbian DateTime format +//--------------------------------------------------------------------------- + +void CIRIsdsClient::ConvertToTimeDate(const TDesC& aTime, + TDateTime& aDateTime) const + { + IRLOG_DEBUG( "CIRIsdsClient::ConvertToTimeDate - Entering" ); + TBuf8 copyOfTime; + copyOfTime.Copy(aTime); + TInternetDate time; + TRAPD(error,time.SetDateL(copyOfTime)); + if(!error) + { + aDateTime = time.DateTime(); + } + + IRLOG_DEBUG( "CIRIsdsClient::ConvertToTimeDate - Exiting." ); + } + +//--------------------------------------------------------------------------- +//CIRIsdsClient::IRHttpIssueRequestL +//Issues Http Request to DataProvider to get data from URL in Request object +//The Request URL is also encoded here +//--------------------------------------------------------------------------- +// +void CIRIsdsClient::IRHttpIssueRequestL( CIRHttpRequestData &aRequestObject ) + { + IRLOG_DEBUG( "CIRIsdsClient::IRHttpIssueRequestL - Entering" ); + IRRDEBUG2("CIRISDSCLIENT::IRHTTPISSUEREQUESTL",KNullDesC); + if(iIRIDPending) + { + //if IRID reqeust is pending then queue the reuest + //till IRID response comes + iReqPending = ETrue; + //temporary request object + iTempRequestObject= new(ELeave) CIRHttpRequestData; + iTempRequestObject->iMethod = aRequestObject.iMethod; + iTempRequestObject->iIfModifiedSince = aRequestObject.iIfModifiedSince; + iTempRequestObject->isIfModifiedSet = aRequestObject.isIfModifiedSet; + iTempRequestObject->iAcceptLanguage = aRequestObject.iAcceptLanguage; + iTempRequestObject->iContentType = aRequestObject.iContentType; + iTempRequestObject->iUri = aRequestObject.iUri; + } + else + { + if(iSettings->GetIRIDL().Length()==0) + { + if(iReqFromGetIRIDFunc) + { + iReqFromGetIRIDFunc = EFalse; + iDataProvider->IRHttpIssueRequestL(aRequestObject); + } + else + { + //When the user cancels the http req,irid is not present. + //On next request,automatically first irid req is made. + //save the actual request + //get irid from isds + //once irid is received send the saved request to isds + iReqPending = ETrue; + //temporary request object + iTempRequestObject= new(ELeave) CIRHttpRequestData; + iTempRequestObject->iMethod = aRequestObject.iMethod; + iTempRequestObject->iIfModifiedSince = aRequestObject.iIfModifiedSince; + iTempRequestObject->isIfModifiedSet = aRequestObject.isIfModifiedSet; + iTempRequestObject->iAcceptLanguage = aRequestObject.iAcceptLanguage; + iTempRequestObject->iContentType = aRequestObject.iContentType; + iTempRequestObject->iUri = aRequestObject.iUri; + IRGetIRIDL(); + } + } + else + { + iReqPending = EFalse; + if(iReqFromSync) + { + iReqFromSync = EFalse; + iSyncRequest = ETrue; + } + iDataProvider->IRHttpIssueRequestL(aRequestObject); + } + } + IRLOG_DEBUG( "CIRIsdsClient::IRHttpIssueRequestL - Exiting." ); + } + +//--------------------------------------------------------------------------- +//CIRIsdsClient::EncodeUrlL +//This url encoding is for session log +//--------------------------------------------------------------------------- +// +void CIRIsdsClient::EncodeUrlL( TDes &aQuery ) + { + IRLOG_DEBUG( "CIRIsdsClient::EncodeUrlL - Entering" ); + //Encodes the URL inside the request object + HBufC *encodedurl = NULL; + encodedurl = EscapeUtils::EscapeEncodeL(aQuery, + EscapeUtils::EEscapeUrlEncoded); + aQuery.Copy(encodedurl->Left(aQuery.MaxLength())); + //encoded url is released + if( encodedurl ) + { + delete encodedurl; + } + IRLOG_DEBUG( "CIRIsdsClient::EncodeUrlL - Exiting." ); + } + +//--------------------------------------------------------------------------- +//CIRIsdsClient::PurgeOtaInfoL +//delete all the data cached wrt OTA +//--------------------------------------------------------------------------- +// +EXPORT_C void CIRIsdsClient::PurgeOtaInfoL() + { + IRLOG_DEBUG( "CIRIsdsClient::PurgeOtaInfoL - Entering" ); + //reset update available flag to 0 + iSettings->ReSetUpdateAvailableL(); + //reset silence period to 0 + iSettings->SetSilencePeriodL(0); + //reset silence period start time to a zero string + iSettings->SetSilencePeriodStartL(KNullDesC); + //clear the cache info if any + TRAP_IGNORE(iCache->RemoveOtaInfoL()) + IRLOG_DEBUG( "CIRIsdsClient::PurgeOtaInfoL - Exiting" ); + } +