//****************************************************************************
//
//  Copyright (c) Microsoft Corporation. All rights reserved.
//
//  File:       syncmgr.idl
//
//  Contents:   Interfaces for Synchronization Manager
//
//****************************************************************************

#ifndef DO_NO_IMPORTS
import "objidl.idl";
import "oleidl.idl";
import "mstask.idl";
#endif

interface ISyncMgrSynchronize;
interface ISyncMgrSynchronizeCallback;
interface ISyncMgrEnumItems;
interface ISyncMgrSynchronizeInvoke;
interface ISyncMgrRegister;
interface ISyncScheduleMgr;
interface IEnumSyncSchedules;
interface ISyncSchedule;
interface IEnumSyncItems;

typedef GUID SYNCMGRITEMID;
typedef REFGUID REFSYNCMGRITEMID;
typedef GUID SYNCMGRERRORID;
typedef REFGUID REFSYNCMGRERRORID;
typedef GUID SYNCSCHEDULECOOKIE;


// {6295DF27-35EE-11d1-8707-00C04FD93327}
cpp_quote("DEFINE_GUID(CLSID_SyncMgr,0x6295df27, 0x35ee, 0x11d1, 0x87, 0x7, 0x0, 0xc0, 0x4f, 0xd9, 0x33, 0x27);")

// {6295DF29-35EE-11d1-8707-00C04FD93327}
cpp_quote("DEFINE_GUID(IID_ISyncMgrSynchronize,0x6295df28, 0x35ee, 0x11d1, 0x87, 0x7, 0x0, 0xc0, 0x4f, 0xd9, 0x33, 0x27);")

// {6295DF28-35EE-11d1-8707-00C04FD93327}
cpp_quote("DEFINE_GUID(IID_ISyncMgrSynchronizeCallback,0x6295df29, 0x35ee, 0x11d1, 0x87, 0x7, 0x0, 0xc0, 0x4f, 0xd9, 0x33, 0x27);")

// {6295DF2A-35EE-11d1-8707-00C04FD93327}
cpp_quote("DEFINE_GUID(IID_ISyncMgrEnumItems,0x6295df2a, 0x35ee, 0x11d1, 0x87, 0x7, 0x0, 0xc0, 0x4f, 0xd9, 0x33, 0x27);")

// {6295DF2C-35EE-11d1-8707-00C04FD93327} 
cpp_quote("DEFINE_GUID(IID_ISyncMgrSynchronizeInvoke,0x6295df2c, 0x35ee, 0x11d1, 0x87, 0x7, 0x0, 0xc0, 0x4f, 0xd9, 0x33, 0x27);")

// {894D8C55-BDDF-11d1-B85D-00C04FB93981}
cpp_quote("DEFINE_GUID(IID_ISyncMgrRegister,0x894d8c55, 0xbddf, 0x11d1, 0xb8, 0x5d, 0x0, 0xc0, 0x4f, 0xb9, 0x39, 0x81);")

// {F0E15897-A700-11d1-9831-00C04FD910DD}
cpp_quote("DEFINE_GUID(IID_ISyncScheduleMgr,0xf0e15897, 0xa700, 0x11d1, 0x98, 0x31, 0x0, 0xc0, 0x4f, 0xd9, 0x10, 0xdd);")

// {F0E15898-A700-11d1-9831-00C04FD910DD}
cpp_quote("DEFINE_GUID(IID_IEnumSyncSchedules,0xf0e15898, 0xa700, 0x11d1, 0x98, 0x31, 0x0, 0xc0, 0x4f, 0xd9, 0x10, 0xdd);")

// {F0E15899-A700-11d1-9831-00C04FD910DD}
cpp_quote("DEFINE_GUID(IID_ISyncSchedule,0xf0e15899, 0xa700, 0x11d1, 0x98, 0x31, 0x0, 0xc0, 0x4f, 0xd9, 0x10, 0xdd);")

// {F0E1589A-A700-11d1-9831-00C04FD910DD}
cpp_quote("DEFINE_GUID(IID_IEnumSyncItems,0xf0e1589a, 0xa700, 0x11d1, 0x98, 0x31, 0x0, 0xc0, 0x4f, 0xd9, 0x10, 0xdd);")


// Success codes specific to SyncMgr interfaces
cpp_quote("#define S_SYNCMGR_MISSINGITEMS	MAKE_SCODE(SEVERITY_SUCCESS,FACILITY_ITF,0x0201)")
cpp_quote("#define S_SYNCMGR_RETRYSYNC		MAKE_SCODE(SEVERITY_SUCCESS,FACILITY_ITF,0x0202)")
cpp_quote("#define S_SYNCMGR_CANCELITEM		MAKE_SCODE(SEVERITY_SUCCESS,FACILITY_ITF,0x0203)")
cpp_quote("#define S_SYNCMGR_CANCELALL		MAKE_SCODE(SEVERITY_SUCCESS,FACILITY_ITF,0x0204)")

// Error codes specific to SyncMgr interfaces
cpp_quote("#define SYNCMGR_E_NAME_IN_USE	MAKE_SCODE(SEVERITY_ERROR,FACILITY_ITF,0x0201)")
cpp_quote("#define SYNCMGR_E_ITEM_UNREGISTERED	MAKE_SCODE(SEVERITY_ERROR,FACILITY_ITF,0x0202)")

[
    local,
    object,
    uuid(6295DF28-35EE-11d1-8707-00C04FD93327)  // IID_ISyncMgrSynchronize
]
interface ISyncMgrSynchronize: IUnknown
{
    typedef [unique] ISyncMgrSynchronize *LPSYNCMGRSYNCHRONIZE;

	typedef enum _tagSYNCMGRFLAG { 	// flags for Synchronization Event
		SYNCMGRFLAG_CONNECT				=	0x0001,	// Sync was invoked by a network connect
		SYNCMGRFLAG_PENDINGDISCONNECT	=	0x0002,	// Sync was invoked by a pending network disconnect
		SYNCMGRFLAG_MANUAL				=	0x0003,	// Sync was invoked manually
		SYNCMGRFLAG_IDLE				=	0x0004,	// Sync was programmatically invokd
		SYNCMGRFLAG_INVOKE				=	0x0005,	// Sync was programmatically invokd
		SYNCMGRFLAG_SCHEDULED			=	0x0006,	// Sync was invoked by a scheduled update
		SYNCMGRFLAG_EVENTMASK			=	0x00FF,	

		SYNCMGRFLAG_SETTINGS			=	0x0100,	// Sync was invoked for configuration only
		SYNCMGRFLAG_MAYBOTHERUSER		=	0x0200,	// Interaction with the user is permitted
	} SYNCMGRFLAG;


	const USHORT MAX_SYNCMGRHANDLERNAME = 32;

	typedef enum _tagSYNCMGRHANDLERFLAGS {   // flags that apply to this handler.
	    SYNCMGRHANDLER_HASPROPERTIES	=	0x01,	// have a properties dialog for this handler
	} SYNCMGRHANDLERFLAGS;

    typedef struct _tagSYNCMGRHANDLERINFO {
	   DWORD	    cbSize;
	   HICON	    hIcon;
	   DWORD 	    SyncMgrHandlerFlags;
	   WCHAR	    wszHandlerName[MAX_SYNCMGRHANDLERNAME];
    } SYNCMGRHANDLERINFO, *LPSYNCMGRHANDLERINFO;

	cpp_quote("#define   SYNCMGRITEMSTATE_UNCHECKED    0x0000")
	cpp_quote("#define   SYNCMGRITEMSTATE_CHECKED      0x0001")
	cpp_quote("")

    typedef enum _tagSYNCMGRSTATUS {
		SYNCMGRSTATUS_STOPPED		=   0x0000,
		SYNCMGRSTATUS_SKIPPED		=   0x0001,
		SYNCMGRSTATUS_PENDING		=   0x0002,
		SYNCMGRSTATUS_UPDATING		=   0x0003,
		SYNCMGRSTATUS_SUCCEEDED		=   0x0004,
		SYNCMGRSTATUS_FAILED		=   0x0005,
		SYNCMGRSTATUS_PAUSED		=   0x0006,
		SYNCMGRSTATUS_RESUMING		=   0x0007,
    } SYNCMGRSTATUS;


	HRESULT Initialize(
		[in] DWORD dwReserved,
		[in] DWORD dwSyncMgrFlags,
		[in] DWORD cbCookie,
		[in] BYTE const*lpCookie);

	HRESULT GetHandlerInfo(
		[out] LPSYNCMGRHANDLERINFO *ppSyncMgrHandlerInfo);

	HRESULT EnumSyncMgrItems(
		[out] ISyncMgrEnumItems **ppSyncMgrEnumItems);


	HRESULT GetItemObject(
		[in] REFSYNCMGRITEMID ItemID,
		[in] REFIID riid,
		[out] void** ppv);

	HRESULT ShowProperties(
		[in] HWND hWndParent,
		[in] REFSYNCMGRITEMID ItemID);

	HRESULT SetProgressCallback(
		[in] ISyncMgrSynchronizeCallback *lpCallBack);

	HRESULT PrepareForSync(
		[in] ULONG cbNumItems,
		[in] SYNCMGRITEMID* pItemIDs,
		[in] HWND hWndParent,
		[in] DWORD dwReserved);

	HRESULT Synchronize(
		[in] HWND hWndParent);

	HRESULT SetItemStatus(
		[in] REFSYNCMGRITEMID pItemID,
		[in] DWORD dwSyncMgrStatus);
		 
	HRESULT ShowError(
		[in] HWND hWndParent,
		[in] REFSYNCMGRERRORID ErrorID,
		[out] ULONG *pcbNumItems,
		[out] SYNCMGRITEMID **ppItemIDs);

}

[
    local,
    object,
    uuid(6295DF29-35EE-11d1-8707-00C04FD93327)  // IID_ISyncMgrSynchronizeCallback
]
interface ISyncMgrSynchronizeCallback: IUnknown
{
    typedef [unique] ISyncMgrSynchronizeCallback *LPSYNCMGRSYNCHRONIZECALLBACK;

    cpp_quote("#define   SYNCMGRPROGRESSITEM_STATUSTEXT		0x0001")
    cpp_quote("#define   SYNCMGRPROGRESSITEM_STATUSTYPE		0x0002")
    cpp_quote("#define   SYNCMGRPROGRESSITEM_PROGVALUE	    0x0004")
    cpp_quote("#define   SYNCMGRPROGRESSITEM_MAXVALUE	    0x0008")
    cpp_quote("")

    typedef struct _tagSYNCMGRPROGRESSITEM {
		DWORD	    cbSize;
		UINT		mask;
		const WCHAR* 		lpcStatusText;
		DWORD		dwStatusType;
		INT 		iProgValue;
		INT 		iMaxValue;
    } SYNCMGRPROGRESSITEM, *LPSYNCMGRPROGRESSITEM;

    typedef enum _tagSYNCMGRLOGLEVEL {
		SYNCMGRLOGLEVEL_INFORMATION		=   0x0001,  
		SYNCMGRLOGLEVEL_WARNING			=   0x0002,  
		SYNCMGRLOGLEVEL_ERROR			=   0x0003, 
    } SYNCMGRLOGLEVEL;


    cpp_quote("#define   SYNCMGRLOGERROR_ERRORFLAGS			0x0001")
    cpp_quote("#define   SYNCMGRLOGERROR_ERRORID			0x0002")
    cpp_quote("#define   SYNCMGRLOGERROR_ITEMID				0x0004")
	cpp_quote("")

	typedef enum _tagSYNCMGRERRORFLAGS {   // flags that apply to the error.
	    SYNCMGRERRORFLAG_ENABLEJUMPTEXT	=	0x01,	// ShowErrors should be called on this item.
	} SYNCMGRERRORFLAGS;


    typedef struct _tagSYNCMGRLOGERRORINFO {
		DWORD			cbSize;
		DWORD			mask;
		DWORD			dwSyncMgrErrorFlags;
		SYNCMGRERRORID	ErrorID;
		SYNCMGRITEMID 	ItemID;
    } SYNCMGRLOGERRORINFO, *LPSYNCMGRLOGERRORINFO;


    HRESULT Progress(
	    [in] REFSYNCMGRITEMID pItemID,
	    [in] LPSYNCMGRPROGRESSITEM lpSyncProgressItem);

	HRESULT PrepareForSyncCompleted(HRESULT hr);

	HRESULT SynchronizeCompleted(HRESULT hr);

    HRESULT  EnableModeless( 
	    [in] BOOL fEnable); 

    HRESULT  LogError( 
	    [in] DWORD dwErrorLevel,
	    [in] const WCHAR *lpcErrorText,
	    [in] LPSYNCMGRLOGERRORINFO lpSyncLogError);

	HRESULT DeleteLogError(
		[in] REFSYNCMGRERRORID ErrorID,
		[in] DWORD dwReserved);

}

[
    local,
    object,
    uuid(6295DF2A-35EE-11d1-8707-00C04FD93327), // IID_ISyncMgrEnumItems
    pointer_default(unique)
]
interface ISyncMgrEnumItems : IUnknown
{
    typedef [unique] ISyncMgrEnumItems *LPSYNCMGRENUMITEMS;

	const USHORT MAX_SYNCMGRITEMNAME = 128;
	const USHORT MAX_SYNCMGRITEMSTATUS = 128;

	typedef enum _tagSYNCMGRITEMFLAGS {   // flags for this SyncMgr Item
	    SYNCMGRITEM_HASPROPERTIES		=	0x01,	// have a properties dialog for this item
	    SYNCMGRITEM_TEMPORARY		=	0x02,	// remove any stored preferences for this item
	    SYNCMGRITEM_ROAMINGUSER		=	0x04,	// This item should roam with the User
	} SYNCMGRITEMFLAGS;


    typedef struct _tagSYNCMGRITEM {
	   DWORD	    cbSize;
	   DWORD	    dwFlags;
	   SYNCMGRITEMID  ItemID;
	   DWORD	    dwItemState;	
	   HICON	    hIcon;
	   WCHAR	    wszItemName[MAX_SYNCMGRITEMNAME];
	   WCHAR	    wszStatus[MAX_SYNCMGRITEMSTATUS];
    } SYNCMGRITEM, *LPSYNCMGRITEM;

    HRESULT Next(
        [in] ULONG celt,
        [out, size_is(celt), length_is(*pceltFetched)]
        LPSYNCMGRITEM rgelt,
        [out] ULONG *pceltFetched);

    HRESULT Skip(
        [in] ULONG celt);

    HRESULT Reset();

    HRESULT Clone(
        [out] ISyncMgrEnumItems **ppenum);
}



[
    local,
    object,
    uuid(6295DF2C-35EE-11d1-8707-00C04FD93327), // IID_ISyncMgrSynchronizeInvoke
    pointer_default(unique)
]
interface ISyncMgrSynchronizeInvoke : IUnknown
{

    typedef [unique] ISyncMgrSynchronizeInvoke *LPSYNCMGRSYNCHRONIZEINVOKE;

    typedef enum _tagSYNCMGRINVOKEFLAGS {   // flags for how SyncMgr should be invoked.
	    SYNCMGRINVOKE_STARTSYNC =	0x02,	// Immediately start the sync without displaying choices
	    SYNCMGRINVOKE_MINIMIZED =	0x04,	// Dialog should be minimized by default
    } SYNCMGRINVOKEFLAGS;


    HRESULT UpdateItems(
		[in] DWORD dwInvokeFlags,
		[in] REFCLSID rclsid,
		[in] DWORD cbCookie,
		[in, unique, size_is(cbCookie)] const BYTE *lpCookie);

    HRESULT UpdateAll();
}	


[
    local,
    object,
    uuid(894D8C55-BDDF-11d1-B85D-00C04FB93981), // IID_ISyncMgrSynchronizeRegister
    pointer_default(unique)
]
interface ISyncMgrRegister : IUnknown
{

    typedef [unique] ISyncMgrRegister *LPSYNCMGRREGISTER;


    HRESULT RegisterSyncMgrHandler(
		[in] REFCLSID rclsidHandler,
		[in] DWORD dwReserved);

    HRESULT UnregisterSyncMgrHandler(
		[in] REFCLSID rclsidHandler,
		[in] DWORD dwReserved);
}	

[
uuid(6295DF27-35EE-11d1-8707-00C04FD93327),
helpstring("Common Synchronization UI service")
]
coclass SyncMgr
{
    [default, source]   interface ISyncMgrSynchronizeInvoke;
};


cpp_quote("#define   SYNCSCHEDINFO_FLAGS_MASK		 0x0FFF")
cpp_quote("#define   SYNCSCHEDINFO_FLAGS_READONLY	 0x0001")
cpp_quote("#define   SYNCSCHEDINFO_FLAGS_AUTOCONNECT	 0x0002")
cpp_quote("#define   SYNCSCHEDINFO_FLAGS_HIDDEN		 0x0004")

cpp_quote("#define   SYNCSCHEDWIZARD_SHOWALLHANDLERITEMS 0x1000")
cpp_quote("")


[
    local,
    object,
    uuid(F0E15897-A700-11d1-9831-00C04FD910DD), // IID_ISyncScheduleMgr
    pointer_default(unique)
]
interface ISyncScheduleMgr : IUnknown
{
    typedef [unique] ISyncScheduleMgr *LPSYNCSCHEDULEMGR;

	HRESULT CreateSchedule(
		[in]	 LPCWSTR pwszScheduleName,
		[in]	 DWORD dwFlags,
		[in,out] SYNCSCHEDULECOOKIE *pSyncSchedCookie,		
		[out]	 ISyncSchedule **ppSyncSchedule);

	HRESULT LaunchScheduleWizard(
		[in]	  HWND hParent,
		[in]	  DWORD dwFlags,
		[in, out] SYNCSCHEDULECOOKIE *pSyncSchedCookie,		
		[out]	  ISyncSchedule   ** ppSyncSchedule);

	HRESULT OpenSchedule(
		[in]	SYNCSCHEDULECOOKIE *pSyncSchedCookie,		
		[in]	DWORD dwFlags,
		[out]	ISyncSchedule **ppSyncSchedule);

	HRESULT RemoveSchedule( 
		[in]	SYNCSCHEDULECOOKIE *pSyncSchedCookie);

	HRESULT EnumSyncSchedules(
		[out]	IEnumSyncSchedules **ppEnumSyncSchedules);

}

cpp_quote("#define   SYNCSCHEDINFO_FLAGS_CONNECTION_LAN  0x0000")
cpp_quote("#define   SYNCSCHEDINFO_FLAGS_CONNECTION_WAN  0x0001")

[
    local,
    object,
    uuid(F0E15898-A700-11d1-9831-00C04FD910DD), // IID_IEnumSyncSchedules
    pointer_default(unique)
]
interface IEnumSyncSchedules : IUnknown
{
	HRESULT Next(
		[in]	ULONG celt, 
		[out, size_is(celt), length_is(*pceltFetched)]
		SYNCSCHEDULECOOKIE *pSyncSchedCookie,
		[out]	ULONG *pceltFetched);

	HRESULT Skip(
		[in]	ULONG celt);

	HRESULT Reset(void);

	HRESULT Clone(
		[out]	IEnumSyncSchedules **ppEnumSyncSchedules);

}
typedef struct _tagSYNC_HANDLER_ITEM_INFO
{
	GUID 		handlerID;
	SYNCMGRITEMID 	itemID;
   	HICON	    	hIcon;
	WCHAR	    	wszItemName[MAX_SYNCMGRITEMNAME];
	DWORD 		dwCheckState;
} SYNC_HANDLER_ITEM_INFO, *LPSYNC_HANDLER_ITEM_INFO;

[
    local,
    object,
    uuid(F0E15899-A700-11d1-9831-00C04FD910DD), // IID_ISyncSchedule
    pointer_default(unique)
]
interface ISyncSchedule : IUnknown
{

	HRESULT GetFlags(
		[out] DWORD *pdwFlags);

	HRESULT SetFlags(
		[in] DWORD dwFlags);

	HRESULT GetConnection(
		[in, out] DWORD *pcbSize,
		[out] LPWSTR pwszConnectionName,
		[out] DWORD *pdwConnType);

	HRESULT SetConnection(
 		[in] LPCWSTR pwszConnectionName,
		[in] DWORD dwConnType);

	HRESULT GetScheduleName(
		[in, out] DWORD *pcbSize,
		[out] LPWSTR pwszScheduleName);

	HRESULT SetScheduleName(
 		[in] LPCWSTR pwszScheduleName);

	HRESULT GetScheduleCookie(
		[out] SYNCSCHEDULECOOKIE *pSyncSchedCookie);

	HRESULT SetAccountInformation(
		[in] LPCWSTR pwszAccountName,
		[in] LPCWSTR pwszPassword);

	HRESULT GetAccountInformation(
		[in, out] DWORD *pcbSize,
		[out] LPWSTR pwszAccountName);

	HRESULT GetTrigger(
 		[out] ITaskTrigger ** ppTrigger);

	HRESULT GetNextRunTime(
		[out] SYSTEMTIME * pstNextRun);

	HRESULT GetMostRecentRunTime(
		[out] SYSTEMTIME * pstRecentRun);

	HRESULT EditSyncSchedule(
	    [in] HWND  hParent,
		[in] DWORD dwReserved);

	HRESULT AddItem(
        	[in] LPSYNC_HANDLER_ITEM_INFO pHandlerItemInfo);

	HRESULT RegisterItems(
		[in]	REFCLSID pHandlerID,
		[in]	SYNCMGRITEMID *pItemID);

	HRESULT UnregisterItems(
		[in]	REFCLSID pHandlerID,
		[in]	SYNCMGRITEMID *pItemID);

	HRESULT SetItemCheck(
		[in] 	REFCLSID pHandlerID,
		[in]    SYNCMGRITEMID *pItemID, 
		[in] 	DWORD dwCheckState);

	HRESULT GetItemCheck(
		[in]	REFCLSID pHandlerID,
		[in]	SYNCMGRITEMID *pItemID, 
		[out] 	DWORD *pdwCheckState);

	HRESULT EnumItems(
		[in] REFCLSID pHandlerID,
		[in] IEnumSyncItems  **ppEnumItems);

	HRESULT Save();

	HRESULT GetITask(
 		[out] ITask ** ppITask);
}


[
    local,
    object,
    uuid(F0E1589A-A700-11d1-9831-00C04FD910DD), // IID_IEnumSyncItems
    pointer_default(unique)
]
interface IEnumSyncItems : IUnknown
{

	HRESULT Next(
		[in]	ULONG celt,
        	[out, size_is(celt), length_is(*pceltFetched)]
		LPSYNC_HANDLER_ITEM_INFO rgelt,
		[out]	ULONG * pceltFetched);

	HRESULT Skip(
		[in]	ULONG celt);

	HRESULT Reset(void);

	HRESULT Clone(
	    [out]	IEnumSyncItems ** ppEnumSyncItems);

}