/*
* Copyright (c) 2006-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: 
*
*/


/**
 @file
 @publishedAll
 @released
*/

#include <e32panic.h>
#include <testexecutelog.h>
#include <cntfldst.h>
#include "viewdefbase.h"


//Number of contacts
CViewDefBase::CViewDefBase(const TInt aContacts):CCntBaseStep(aContacts)
	{
	}

/**More items to be initilized within the uheap macro pair*/	
void CViewDefBase::InitializeL()
	{
	
	CCntBaseStep::InitializeL();
	
	iViewII = CContactItemViewDef::NewL(CContactItemViewDef::EIncludeFields,
	CContactItemViewDef::EIncludeHiddenFields);
	
	iViewIM = CContactItemViewDef::NewL(CContactItemViewDef::EIncludeFields,
	CContactItemViewDef::EMaskHiddenFields);
	
	iViewMI = CContactItemViewDef::NewL(CContactItemViewDef::EMaskFields,
	CContactItemViewDef::EIncludeHiddenFields);
	
	iViewMM = CContactItemViewDef::NewL(CContactItemViewDef::EMaskFields,
	CContactItemViewDef::EMaskHiddenFields);
	
	iDefView=CContactItemViewDef::NewL(CContactItemViewDef::EIncludeFields,
	CContactItemViewDef::EMaskHiddenFields);
	iDefView->AddL(KUidContactFieldMatchAll);
	
	}

/**More items to be cleaned up within the uheap macro pair*/		
void CViewDefBase::Cleanup()
	{
	CCntBaseStep::Cleanup();
	
	delete iViewII;
	iViewII = NULL;
	delete iViewIM;
	iViewIM = NULL;
	delete iViewMI;
	iViewMI = NULL;
	delete iViewMM;
	iViewMM = NULL;
	delete iDefView;
	iDefView = NULL;
	}

/**returns the number of nonhidden, hidden and empty fields,
that match aView for the current contact item*/	
void CViewDefBase::FieldsInView(const CContactItemViewDef &aView, TInt &aRetNormal, 
								TInt &aRetHidden, const TBool aHasEmpty)
	{
	TInt length = 0;
	length = iFields->Count();
	
	for(TInt i = 0; i < length; )
		{
		if( !( (*iFields)[i].Storage()->IsFull() ) )
			{
			if(aHasEmpty)
				{
				++i;
				continue;
				}
			else
				{
				_LIT(KUnfullView,"FieldsInView field is not full");
				User::Panic(KUnfullView, EInvariantFalse);
				}
			}
		if( ( i = FindInFieldSet(aView, i) ) != KErrNotFound )
			{
			if( (*iFields)[i].IsHidden() )
				{
				++aRetHidden;
				}
			else
				{
				++aRetNormal;
				}
			++i;
			}
		else
			{
			break;
			}
		}
	
	}

/**returns the position of the next field that matches aView for the current contact item,
returns KErrNotFound when it reaches end of fieldset or if it doesnt find a match*/		
TInt CViewDefBase::FindInFieldSet(const CContactItemViewDef &aView, const TInt &aFrom)
	{
	const TInt length = iFields->Count();
	const TInt viewLength = aView.Count();
	CContentType * ctype = NULL;
	TUid tuidback = KUidContactFieldNone;
	TBool allUids = EFalse;
	
	for(TInt i = aFrom; i < length; i++ )
		{
		ctype = CONST_CAST( CContentType *, &((*iFields)[i].ContentType()) );
		tuidback = ctype->Mapping();
		ctype->SetMapping(KUidContactFieldNone);//contain now should ignore mapping
		allUids = EFalse;
		
		for(TInt k = 0; k < viewLength; ++k)
			{	
			if( ctype->ContainsFieldType( aView[k] ) )
				{
				allUids = ETrue;
				break;
				}
			}
		ctype->SetMapping(tuidback);
		if(allUids)
			{
			return i;
			}
		}
	return KErrNotFound;
	}

/**adds a pair of existing uids, in every possible combination, to aView, 
aView is reset before the pair are added to aview.if aMany is greater than one, more than a pair
of uids are added but not in every possible combination*/		
void CViewDefBase::AddMultipleUidsL( CContactItemViewDef &aView, TInt &aPos, const TInt &aMany )
	{
	
	static TInt lastPlace = 0;
	const static TInt count = iExistingUidsArray->Count();	
	aView.Reset();
	aView.AddL( TUid::Uid( (*iExistingUidsArray)[aPos] ) );
	
	for(TInt i = 0; (lastPlace < count) && (i < aMany); ++lastPlace, ++i)
		{
		if(lastPlace == aPos || ((*iExistingUidsArray)[lastPlace] == 0) )
			{
			--i;
			continue;
			}
		aView.AddL( TUid::Uid( (*iExistingUidsArray)[lastPlace] ) );
		}
	if( lastPlace == count )
		{
		lastPlace = 0;
		++aPos;//this should never equal count
		_LIT(KNext,"next %d");
		INFO_PRINTF2(KNext, aPos);
		if( (aPos < count) && ((*iExistingUidsArray)[aPos] == 0) )
			{
			++aPos;
			}
		}
		
	}


