internetradio2.0/isdsclientsrc/irisdsclient.cpp
author Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
Mon, 19 Apr 2010 14:01:53 +0300
changeset 0 09774dfdd46b
permissions -rw-r--r--
Revision: 201011 Kit: 201015

/*
* 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 <escapeutils.h>
#include <tinternetdate.h>
#include <utf.h>

#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<KMaxLength> 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<KChannelidMaxLength> 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<KChannelidMaxLength> 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<KUrlPassMaxLength> urlPass(iSettings->GetISDSBaseUrlL());
	urlPass.Append(KPresetFetchUrl);
	
	TBuf<KChidMaxLength> 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<TInt>& 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<multiSelectedCount;i++)
			{
			ASSERT( aIndexArray[i] >= 0 && aIndexArray[i] < iCache->iPtrChannel->Count() ); 
			TInt channelID = iCache->iPtrChannel->At(aIndexArray[i])->iChannelID;
			if(i!=0)
				{
				channelIdPtr.Append(KSeparator);
				}
			TBuf8<KChannelidMaxLength> 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<multiSelectedCount;i++)
			{
			ASSERT( aIndexArray[i] >= 0 && aIndexArray[i] < iXmlReader->iPtrChannel->Count() );
			TInt channelID = iXmlReader->iPtrChannel->At(aIndexArray[i])->iChannelID;
			if(i!=0)
				{
				channelIdPtr.Append(KSeparator);
				}
			TBuf8<KChannelidMaxLength> 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<KCopyOfTimeMaxLength> 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" );
    }