// 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 "ViewObserver.h"

CViewObserver* CViewObserver::NewLC(const CContactViewTest &aTest, 
									void (CContactViewTest::*aFunc)())
	{
	CViewObserver *self = new(ELeave) CViewObserver(aTest, aFunc);
	CleanupStack::PushL(self);
	return self;
	}
	
CViewObserver::~CViewObserver()
	{
	CleanView();
	}

CViewObserver::CViewObserver( 	const CContactViewTest &aTest,
								void (CContactViewTest::*aFunc)()) : 
														CActive(EPriorityStandard),
														iMainFunc( aFunc ), 
														iTest( const_cast<CContactViewTest &>(aTest) )
	{
	CActiveScheduler::Add(this);
	}
	
	
void CViewObserver::RunL()
	{
	
	if(iMainFunc)
		{
		(iTest.*iMainFunc)();
		}
	else
		{
		(iTest.*iDoFunc)(*iLocalView);
		}
		
	if( !iDoFunc && !iMainFunc )
		{
		CActiveScheduler::Stop();
		}
	}
	
void CViewObserver::DoCancel()
	{
	}

TInt CViewObserver::RunError(TInt aError)
	{
	_LIT(KViewError,"ViewObserver:: Error in doTest runL: %d");
	iTest.ERR_PRINTF2(KViewError , aError );
	return aError;
	}

void CViewObserver::Activate()
	{
    if (!IsActive())
        {
    	TRequestStatus *pS=&iStatus;
    	User::RequestComplete(pS,KErrNone);
        SetActive();
        }
	}
	
	
void CViewObserver::HandleContactViewEvent(	const CContactViewBase& aView, 
											const TContactViewEvent& aEvent)
	{
	if (&aView==iLocalView)
		{
		switch(aEvent.iEventType)
			{
			case TContactViewEvent::EReady:
				{				
				Activate();
				break;
				}
			case TContactViewEvent::EItemAdded:
			case TContactViewEvent::EItemRemoved:
			case TContactViewEvent::EGroupChanged:
			case TContactViewEvent::ESortOrderChanged:
			case TContactViewEvent::EUnavailable:
				{
				break;
				}
			default:
				{
				_LIT(KViewError,"CViewObserver::HandleContactViewEvent, non ready event: %d and error: %d");
				iTest.ERR_PRINTF3(KViewError , aEvent.iEventType, aEvent.iInt );
				RDebug::Print(KViewError , aEvent.iEventType, aEvent.iInt  );
				iEvent = TContactViewEvent(aEvent.iEventType, aEvent.iInt, aEvent.iContactId);
				Activate();
				break;
				}
			}
		}
	}
	
void CViewObserver::CleanView()
	{
	if(iLocalView)
		{
		iLocalView->Close(*this);
		iLocalView = NULL;
		}
	}
	
void CViewObserver::SetView(const CContactViewBase *aLocalView)
	{
	CleanView();
	iLocalView = const_cast<CContactViewBase *>(aLocalView);
	}

