/*
* Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies).
* Contact: http://www.qt-project.org/legal
* 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: 
*
*/


#ifndef CNTSYNCCHECKER_H
#define CNTSYNCCHECKER_H

#include <e32base.h>
#include <cntsync.h>
#include <cntdb.h>

/*
const TUid KUidIccGlobalAdnPhonebook	= { 0x10001111 };
const TUid KUidIccGlobalSdnPhonebook	= { 0x10002222 };
const TUid KUidIccGlobalLdnPhonebook	= { 0x10003333 };
const TUid KUidUsimAppAdnPhonebook		= { 0x10004444 };
*/

const TUid KPropertyCategory = { 0x1020384e };

const TUid KUidIccPhonebookNotFound		= {-0x00000001 };

class TLookupPhonebookEntry
	{
	public:
		TLookupPhonebookEntry(TUid aPhonebookUid,TInt aPhonebookTemplateId,TInt aPhonebookGroupId);
	public:
		TUid iPhonebookUid;
		TInt iPhonebookTemplateId;
		TInt iPhonebookGroupId;
	};

namespace SyncNotification
    {
    const TUid KPropertyCategory = { 0x1020384E };

    enum TPropertyKeys
        {
        ESyncChangeNotification
        };    
    }

/** 
 Simulated Phonebook Synchronisation - to test the MContactSynchroniser interface is called correctly.

 Steps:
 1. Choose which ICC phonebooks should be present
	TInt SetGsmPhonebookL();
	TInt SetUsimPhonebookL();
	TInt SetPhonebookListL(const RArray<TUid> aNewPhonebookList);
 
 2. Define zero or more contacts in the phonebook(s)
	TInt AddContactToPhonebookL(TUid aPhonebookUid, const TDesC& aName, const TDesC& aNumber);
 
 3. Perform the synchronisation, optionally one phonebook at a time, optionally with an error code
	TInt SynchroniseIccPhonebookL(CContactDatabase& aDb, TUid aPhonebookUid, TInt aCompletionError, TInt aSyncError=KErrNone);
	TInt SynchroniseIccAllPhonebooksL(CContactDatabase& aDb, TInt aCompletionError, TInt aSyncError=KErrNone);

	These methods simulate a real phonebook synchronisation taking place,
	(though without ICC read delays):
	+ completing all queued notifications for the phonebook.
	+ creating a template & group for each phonebook, if none exists,
	  or finds the current template & group id so that the ICCtemplateIdL() &
	  GroupIdL() methods work
 
 4. Reset for next test
	TInt ResetSyncIccPhonebookL(TUid aPhonebookUid);
	TInt ResetSyncIccAllPhonebooksL();

 5. At any time set or change the response to ICC Validate requests
	TInt ValidateResponseL(MContactSynchroniser::TValidateOperation aOp);
	TInt ValidateWriteResponseL();
	TInt DeleteContactResponseL();

 6. At any time track the number of calls to MContactSynchroniser interface
	void ResetMethodCallCount();
	TInt MethodCallCount();
  
 */
class CContactSyncChecker : public CBase
	{
public:
	IMPORT_C static CContactSyncChecker* NewL();
	IMPORT_C ~CContactSyncChecker();

	IMPORT_C static TInt ValidateResponseL(MContactSynchroniser::TValidateOperation aOp);
	IMPORT_C static TInt ValidateWriteResponseL();
	IMPORT_C static TInt DeleteContactResponseL();
	IMPORT_C static TContactItemId ICCTemplateIdL(TUid aPhonebookUid);
	IMPORT_C static TContactItemId GroupIdL(TUid aPhonebookUid);
	IMPORT_C static TUid PhonebookUidL(TContactItemId aTemplateId);

	IMPORT_C static void SetValidateResponseL(MContactSynchroniser::TValidateOperation aOp, TInt aError);
	IMPORT_C static void SetValidateWriteResponseL(TInt aError);
	IMPORT_C static void SetDeleteContactResponseL(TInt aError);
	
	
	IMPORT_C static TInt UpdatePhonebookTemplateIdL(TUid aPhonebookUid, TInt aPhonebookTemplateId);
	IMPORT_C static TInt UpdatePhonebookGroupIdL(TUid aPhonebookUid, TInt aPhonebookGroupId);
	
	//SetPhonebookEntryL does not exist
	IMPORT_C static void SetPhonebookEntryL(TUid aPhonebookUid,TInt aPhonebookTemplateId,TInt aPhonebookGroupId);
	IMPORT_C static TInt UpdatePhonebookEntryL(TUid aPhonebookUid,TInt aPhonebookTemplateId,TInt aPhonebookGroupId);

	IMPORT_C static TInt SynchroniseIccPhonebookL(CContactDatabase& aDb, TUid aPhonebookUid, TInt aCompletionError, TInt aSyncError);
	IMPORT_C static TInt SynchroniseIccAllPhonebooksL(CContactDatabase& aDb, TInt aCompletionError, TInt aSyncError);
	IMPORT_C static TInt AddContactToPhonebookL(TUid aPhonebookUid, const TDesC& aName, const TDesC& aNumber);


	IMPORT_C static void EnableVerboseLoggingL();
	IMPORT_C static TBool VerboseLoggingEnabledL();


	IMPORT_C TInt ResetSyncIccPhonebookL(TUid aPhonebookUid, TBool aResetTemplateAndGroupIds);
	IMPORT_C TInt ResetSyncIccAllPhonebooksL(TBool aResetTemplateAndGroupIds);


	/*
	Reset Synchronisation state for all phonebooks, reset plug-in call count and set all validate 
	responses to KErrNotFound.
	*/

	// count the phbksync plug-in method calls
	IMPORT_C static void ValidateMethodCalledL();
	IMPORT_C static void SyncMethodCalledL();
	IMPORT_C static void PluginLoadedL();
	IMPORT_C static void PluginUnloadedL();
	IMPORT_C static void ResetMethodCallCountsL();
	IMPORT_C static TInt ValidateMethodCallCountL();
	IMPORT_C static TInt SyncMethodCallCountL();
	IMPORT_C static TInt PluginLoadedCountL();
	
	IMPORT_C static void ResetL();
	IMPORT_C static void ResetEverythingL();
	IMPORT_C static TInt TotalNotificationPendingCountL();
	IMPORT_C static TInt FetchNotificationErrorL(TUid aPhoneBookUid);
	IMPORT_C static void SetSynchronisedL(TBool aIsSynchronised, TUid aPhonebookUid); 
	IMPORT_C static void StoreNotificationRequestL(TRequestStatus& aStatus, TUid aPhonebookUid);
	IMPORT_C TBool IsSynchronisedL(TUid aPhonebookUid);
	IMPORT_C static void CompleteNotificationRequestL(TInt aError, TUid aPhonebookUid); 
	IMPORT_C static void SetSynchronisedLeaveCodeL(TInt aLeave, TUid aPhonebookUid); 
 	IMPORT_C static TInt NotificationPendingCountL(TUid aPhonebookUid); 

	/*
	Configure simulation for GSM Phonebook.
	*/
	IMPORT_C static TInt SetGsmPhonebookL();

	/*
	Configure simulation for USIM (UMTS/WCDMA) Phonebook.
	*/
	IMPORT_C static TInt SetUsimPhonebookL();

	/*
	Configure custom Phonebook simulation.
	*/
	IMPORT_C static TInt SetPhonebookListL(const RArray<TUid> aNewPhonebookList);
	/*
	Get phonebook list
	*/
	IMPORT_C static TInt PhonebookListL(RArray<TUid>& aPhonebookList);

 	
	};

#endif
