// Copyright (c) 2008-2009 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:
//

#include <e32math.h>
#include "msvsearchsortcacheentry.h"
#include "msvsearchsortcachemanager.h"

/******************************
 * CreateQueryEntryL()
 * @param const TMsvSearchSortQuery& : a Client request Query , const TBool :Mark the Query 
 * @return :CMsvSearchSortCacheEntry* : a handle to a new search sort cache entry. 
 ******************************/ 
 CMsvSearchSortCacheEntry* CMsvSearchSortCacheEntry::CreateQueryEntryL(const CMsvSearchSortQuery* aQuery, const TBool aMarkQuery,TInt aiteratorCount)
	{
	CMsvSearchSortCacheEntry* self = new(ELeave) CMsvSearchSortCacheEntry(aQuery,aMarkQuery,aiteratorCount);
	CleanupStack::PushL(self);
	self->ConstructQueryNodeL(aQuery);
	CleanupStack::Pop(self);
	return self;
	}
 
/********************************
 * Default Constructor :CMsvSearchSortCacheEntry()
 * @param None.
 * @return None.
 ********************************/
/*CMsvSearchSortCacheEntry::CMsvSearchSortCacheEntry()
	{
	}*/

/********************************
 * Default Constructor :CMsvSearchSortCacheEntry()
 * @param None.
 * @return None.
 ********************************/
CMsvSearchSortCacheEntry::CMsvSearchSortCacheEntry(const CMsvSearchSortQuery* aQuery,const TBool aMarkQuery, TInt aiteratorCount)
	{
	iQueryLevel	= aQuery->iQueryCount;
	iSubFolderOption = aQuery->iSubFolderSearch;
	iteratorCount = aiteratorCount;
	iSortOnHeader = EFalse;
	iParentId = aQuery->iParentId;
	iResultType = aQuery->iSearchSortResultType; //Setting the Result Type
	iMarkQuery = aMarkQuery;  //Mark the Query.
	iQueryID = 0;
	iQueryOptions = 0;
	iMsgQuery.Reset();
	}

/*******************************
 * Destructor : ~CMsvCacheEntry()
 * @param None.
 * @return None.
 * ******************************/
CMsvSearchSortCacheEntry::~CMsvSearchSortCacheEntry()
	{
	iMsgQuery.Close();
	}
	
/*******************************
 * ConstructQueryNodeL() : Create a Search Sort Cache Entry.
 * @param const TMsvSearchSortQuery& : a Client request Query , const TBool :Mark the Query 
 * @return None
 ********************************/
void CMsvSearchSortCacheEntry::ConstructQueryNodeL(const CMsvSearchSortQuery* aQuery)
	{
	iMsgQuery.Reset();
	if(!aQuery->iIsSearchQuery)
		{
		DoSortQuery();//Set Search or Sort Query .
		iMsgExplicitSortPart = aQuery->iSortOnMessagePart;
		}
	if(aQuery->iCaseSensitive)
		{
		DoCaseSensetive();//Case Sensitive  bit is set.
		}
	if(aQuery->iWholeWord)
		{
		DoWholeWord();//Whole Word bit is set.
		}
	if(aQuery->iWildCardCharacter)
		{
		DoWildCharacter();//set Wild Character option.
		}
	if(aQuery->iIsSearchQuery)
		{
		//SearchQuery And Explicit Sort is required.
		//Explicit sort leds thier will be no  default sort based on date and time.
		if(aQuery->iExplicitSort)
			{
			DoExplicitSortReq(); // Set the flag for Explicit sorting .
			iMsgExplicitSortPart = aQuery->iSortOnMessagePart;
			}
		else 
			{
			iMsgExplicitSortPart = aQuery->iSortOnMessagePart;
			}
		}
	if(aQuery->iSortOrder == EMsvSortAscending)
		{
		DoAscendingSort();//Ascending or Descending Sort option bit is set. 
		}
	//Query data Appening to a RArray. 
	for (TInt qCount = 0; qCount < aQuery->iQueryCount; qCount++)
		{
		iQueryData.iMessagePart = aQuery->iQueryTable[qCount].iMessagePart;
		iQueryData.iRelationOp = aQuery->iQueryTable[qCount].iRelationOp;
		iQueryData.iQueryString.Copy(aQuery->iQueryTable[qCount].iQueryString);
		iMsgQuery.Append(iQueryData);	 
		}
	
		CMSvSearchSortCacheManager::Instance()->GenerateQueryId(*this);
	}

