/*
* Copyright (c) 2005-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
 @internalComponent
 @released
*/


#ifndef __CNTPHBKSYNCWATCHER_H__
#define __CNTPHBKSYNCWATCHER_H__


#include <cntsync.h>


class CSinglePhbkWatcher;


/**
Types of ICC Phonebook synchronisation tht Contact Views care about events.
*/
enum TPhonebookState 
	{
	/**
	Initial state, or ICC card has 'gone away' (e.g. ICC is resetting).
	*/
	EIccPhbkNotSynchronised,
	/**
	ICC Phonebook has completed synchronisation.
	*/
	EIccPhbkSynchronised,
	/**
	Sync failed due to ICC either being locked or not ready.
	*/
	EIccWaitForPhbkToBeReady,
	/**
	ICC Sync with Phonebook Server failed.
	*/
	EIccPhbkSyncError,
	};
	

/**	
An observer class for Contacts Views to track the status of ICC Phonebook
Synchronisation.
*/
class MContactPhbkSyncObserver
	{
public:
	virtual void ContactPhbkSyncEventHandler(TPhonebookState aPhbkState) = 0;
	};


/**
A watcher class for Contacts Views to track the status of ICC Phonebook
Synchronisation.
	
If created with a NULL pointer to the Phonebook Sync plugin implements default
behaviour of notifications (e.g. no Phonebook Synchroniser plugin present or
non-default database).
*/
NONSHARABLE_CLASS(CContactPhbkSyncWatcher) : public CBase
	{
public:
	static CContactPhbkSyncWatcher* NewL(MContactSynchroniser& aSyncPlugin);
	~CContactPhbkSyncWatcher();

	/**
	Add the object that sorts a contact view to the PhbkSync observer list.
	*/
	void AddPhbkObserverL(MContactPhbkSyncObserver& aPhbkObserver);

	/**
	Add the object that sorts a contact view to the PhbkSync observer list.
	*/
	void RemovePhbkObserver(MContactPhbkSyncObserver& aPhbkObserver);

	TInt PhonebooksReady();
	TInt PhonebooksWaiting();
	TInt PhonebookSyncError();
	
	TInt ObserverCount();

private:
	CContactPhbkSyncWatcher(MContactSynchroniser& aSyncPlugin);
	void ConstructL();

	friend class CSinglePhbkWatcher;
	MContactSynchroniser& SyncPlugin();
	void SendWatcherEvent(TPhonebookState aNewState, TPhonebookState aOldState, TInt aError=KErrNone);

private:
	MContactSynchroniser&				iSyncPlugin;
	RArray<MContactPhbkSyncObserver*>	iObservers;
	RPointerArray<CSinglePhbkWatcher>	iWatchers;
	TInt								iPhonebooksReady;
	TInt								iPhonebooksWaiting;
	TInt								iPhonebookErrors;
	TInt								iSyncError;
	};
	

NONSHARABLE_CLASS(CSinglePhbkWatcher) : public CActive
	{
public:
	static CSinglePhbkWatcher* NewLC(CContactPhbkSyncWatcher& aSyncWatcher, TUid& aPhonebookUid);
	~CSinglePhbkWatcher();
	TBool IsAcceptableError(TInt aSyncError);

private:
	CSinglePhbkWatcher(CContactPhbkSyncWatcher& aSyncWatcher, TUid& aPhonebookUid);

	void ConstructL();
	void Start();

	// From CActive.
	void DoCancel();
	void RunL();
	TInt RunError(TInt aError);

private:
	CContactPhbkSyncWatcher& 	iSyncWatcher;
	TUid						iPhonebookUid;
	TPhonebookState				iPhbkState;
	};


#endif // __CNTPHBKSYNCWATCHER_H__
