////////////////////////////////////////////////////////////////////////////////////////
// Header file for Replication Custom Resolver C/C++ Client Component Object interfaces.
// Copyright 1994-1995 Microsoft Corporation.
/////////////////////////////////////////////////////////////////////////////////////////

#ifndef __SQLRES_H__
#pragma option push -b -a8 -pc -A- /*P_O_Push*/
#define __SQLRES_H__

typedef void FAR * HENV;

typedef enum {
    REPOLEDataSource_Native 	= 0x0000,	// Native SQL Server
    REPOLEDataSource_ODBC 		= 0x0001,	// ODBC DataSource
    REPOLEDataSource_Jet 		= 0x0002,	// Jet DataSource
	REPOLEDataSource_OLEDB		= 0x0003
} REPOLE_DATASOURCE_TYPE;

typedef enum {
	REPOLESecurity_Min 			= 0,				
	REPOLESecurity_Normal 		= 0,
	REPOLESecurity_Integrated 	= 1,
	REPOLESecurity_Mixed 		= 2,
	REPOLESecurity_Max 			= 2,
	REPOLESecurity_Invalid		= -1
} REPOLE_SECURITY_TYPE;

// NOTE:  All publisher action bitmasks are same as correspording
// subscriber bitmask shifted left 16 bytes...  Please don't break this
// convention for existing #defines.

typedef enum {
	REPOLEChange_SubscriberInsert						= 0x00000001,
	REPOLEChange_PublisherInsert						= 0x00010000,

 	REPOLEChange_SubscriberDelete_NoConflict			= 0x00000002,
 	REPOLEChange_PublisherDelete_NoConflict				= 0x00020000,
 	REPOLEChange_SubscriberSystemDelete					= 0x00000004,
 	REPOLEChange_PublisherSystemDelete					= 0x00040000,
 	REPOLEChange_SubscriberDelete_Conflict				= 0x00000008,
 	REPOLEChange_PublisherDelete_Conflict				= 0x00080000,
 	REPOLEChange_SubscriberRemoveFromPartial			= 0x00000010,
 	REPOLEChange_PublisherRemoveFromPartial				= 0x00100000,

 	REPOLEChange_SubscriberUpdate_NoConflict			= 0x00000020,
 	REPOLEChange_PublisherUpdate_NoConflict				= 0x00200000,
 	REPOLEChange_SubscriberUpdate_ConflictWithDelete	= 0x00000040,
 	REPOLEChange_PublisherUpdate_ConflictWithDelete		= 0x00400000,
 	REPOLEChange_SubscriberUpdate_ConflictColTrack		= 0x00000080,
 	REPOLEChange_PublisherUpdate_ConflictColTrack		= 0x00800000,
 	REPOLEChange_SubscriberUpdate_ConflictNoColTrack	= 0x00000100,
 	REPOLEChange_PublisherUpdate_ConflictNoColTrack		= 0x01000000,


 	REPOLEChange_UploadInsertFailed						= 0x00000200,
 	REPOLEChange_DownloadInsertFailed					= 0x02000000,
 	REPOLEChange_UploadDeleteFailed						= 0x00000400,
 	REPOLEChange_DownloadDeleteFailed					= 0x04000000,
 	REPOLEChange_UploadUpdateFailed						= 0x00000800,
 	REPOLEChange_DownloadUpdateFailed					= 0x08000000
	
} REPOLE_CHANGE_TYPE;	

#define REPOLEUpdateConflicts (REPOLEChange_SubscriberUpdate_ConflictColTrack | REPOLEChange_PublisherUpdate_ConflictColTrack \
	| REPOLEChange_SubscriberUpdate_ConflictNoColTrack | REPOLEChange_PublisherUpdate_ConflictNoColTrack)

#define REPOLEAllConflicts (REPOLEChange_SubscriberDelete_Conflict | REPOLEChange_PublisherDelete_Conflict \
	| REPOLEChange_SubscriberUpdate_ConflictWithDelete | REPOLEChange_PublisherUpdate_ConflictWithDelete \
	| REPOLEUpdateConflicts)
	
#define REPOLEAllErrors (REPOLEChange_UploadInsertFailed | REPOLEChange_DownloadInsertFailed \
	| REPOLEChange_UploadDeleteFailed | REPOLEChange_DownloadDeleteFailed \
	| REPOLEChange_UploadUpdateFailed | REPOLEChange_DownloadUpdateFailed)
#define REPOLEAllNonConflicts (REPOLEChange_SubscriberInsert | REPOLEChange_PublisherInsert \
	| REPOLEChange_SubscriberDelete_NoConflict | REPOLEChange_PublisherDelete_NoConflict \
	| REPOLEChange_SubscriberSystemDelete | REPOLEChange_PublisherSystemDelete \
	| REPOLEChange_SubscriberRemoveFromPartial | REPOLEChange_SubscriberUpdate_NoConflict \
	| REPOLEChange_PublisherUpdate_NoConflict)
#define REPOLEAllChanges (REPOLEAllConflicts | REPOLEAllErrors | REPOLEAllNonConflicts)

typedef enum {
	REPOLEConflict_Min						= 1,
	REPOLEConflict_UpdateConflict			= 1,
	REPOLEConflict_ColumnUpdateConflict		= 2,
	REPOLEConflict_UpdateDeleteWinsConflict	= 3,
	REPOLEConflict_UpdateWinsDeleteConflict	= 4,
 	REPOLEConflict_UploadInsertFailed		= 5,
 	REPOLEConflict_DownloadInsertFailed		= 6,
 	REPOLEConflict_UploadDeleteFailed		= 7,
 	REPOLEConflict_DownloadDeleteFailed		= 8,
 	REPOLEConflict_UploadUpdateFailed		= 9,
 	REPOLEConflict_DownloadUpdateFailed		= 10,
	REPOLEConflict_Max						= 10
} REPOLE_CONFLICT_TYPE;

typedef enum {
	REPOLEColumn_NotUpdated			 		= 0x0001,	// No updates to column or data values match
	REPOLEColumn_UpdatedNoConflict			= 0x0002,	// Column updated at src, no column level conflict
	REPOLEColumn_UpdatedWithConflict		= 0x0003,	// Column updated at src, conflicts with change at destination
	REPOLEColumn_DifferNoTrack				= 0x0004	// No column tracking info, data values are different
} REPOLE_COLSTATUS_TYPE;	

typedef enum {
	REPOLEPriority_Source		= 0x0001,	// The source has the higher priority
	REPOLEPriority_Destination 	= 0x0002,	// The destination has the higher priority
	REPOLEPriority_Equal		= 0x0003	// Source and destination have equal priority
} REPOLE_PRIORITY_TYPE;	


/**** Implemented by the Reconciler ***/
#undef  INTERFACE
#define INTERFACE IConnectionInfo
DECLARE_INTERFACE_(IConnectionInfo, IUnknown)
{
   	//*** IUnknown methods
   	STDMETHOD(QueryInterface) (THIS_ REFIID riid, LPVOID *ppvObj) PURE;
   	STDMETHOD_(ULONG,AddRef) (THIS)  PURE;
   	STDMETHOD_(ULONG,Release) (THIS) PURE;

   	/* IConnectionInfo Get methods */
    STDMETHOD(GetConnectName)(THIS_ LPTSTR ConnectName, DWORD cbConnectName) PURE;
    STDMETHOD(GetServerName)(THIS_ LPTSTR ServerName, DWORD cbServerName) PURE;
    STDMETHOD(GetHostName)(THIS_ LPTSTR HostName, DWORD cbHostName) PURE;
	STDMETHOD(GetServerRole)(THIS_ LPTSTR ServerRole, DWORD cbServerRole) PURE;
    STDMETHOD(GetInternetAddress)(THIS_ LPTSTR InternetAddress, DWORD cbInternetAddress) PURE;
    STDMETHOD(GetInternetNetwork)(THIS_ LPTSTR InternetNetwork, DWORD cbInternetNetwork) PURE;
    STDMETHOD(GetDatabase)(THIS_ LPTSTR Database, DWORD cbDatabase) PURE;
	STDMETHOD(GetDatabaseStatus)(THIS_ LONG *plDatabaseStatus) PURE;
    STDMETHOD(GetDatasourcePath)(THIS_ LPTSTR DatasourcePath, DWORD cbDatasourcePath) PURE;
    STDMETHOD(GetDataSourceType)(THIS_ REPOLE_DATASOURCE_TYPE FAR * pRetValue) PURE;
    STDMETHOD(GetSecurityMode)(THIS_ REPOLE_SECURITY_TYPE FAR * pRetValue) PURE;
    STDMETHOD(GetLogin)(THIS_ LPTSTR Login, DWORD cbLogin) PURE;
    STDMETHOD(GetPassword)(THIS_ LPTSTR Password, DWORD cbPassword) PURE;
    STDMETHOD(GetODBCEnvironmentHandle)(THIS_ HENV * phenv) PURE;
    STDMETHOD(GetLoginTimeout)(THIS_ LONG * plLoginTimeout) PURE;
    STDMETHOD(GetQueryTimeout)(THIS_ LONG * plQueryTimeout) PURE;
    STDMETHOD(GetPacketSize)(THIS_ unsigned long * pusPacketSize) PURE;
    STDMETHOD(GetApplicationName)(THIS_ LPTSTR ApplicationName, DWORD cbApplicationName) PURE;
	STDMETHOD(GetProviderName)(THIS_ LPTSTR ProviderName, DWORD cbProviderName) PURE;
	STDMETHOD(GetDatasource)(THIS_ LPTSTR Datasource, DWORD cbDatasource) PURE;
	STDMETHOD(GetLocation)(THIS_ LPTSTR Location, DWORD cbLocation) PURE;
	STDMETHOD(GetProviderString)(THIS_ LPTSTR ProviderString, DWORD cbProviderString) PURE;
	STDMETHOD(GetCatalog)(THIS_ LPTSTR Catalog, DWORD cbCatalog) PURE;
	STDMETHOD(GetDBCreatedThisSession)(THIS_ BOOL *pbDBCreatedThisSession) PURE;

   	/* IConnectionInfo Set methods (not accessible to third part resolver) */
    STDMETHOD(SetConnectName)(THIS_ LPCTSTR ConnectName) PURE;
    STDMETHOD(SetServerName)(THIS_ LPCTSTR ServerName) PURE;
    STDMETHOD(SetHostName)(THIS_ LPCTSTR HostName) PURE;
	STDMETHOD(SetServerRole)(THIS_ LPCTSTR ServerRole) PURE;
    STDMETHOD(SetInternetAddress)(THIS_ LPCTSTR InternetAddress) PURE;
    STDMETHOD(SetInternetNetwork)(THIS_ LPCTSTR InternetNetwork) PURE;
    STDMETHOD(SetDatabase)(THIS_ LPCTSTR Database) PURE;
	STDMETHOD(SetDatabaseStatus)(THIS_ LONG lDatabaseStatus) PURE;
    STDMETHOD(SetDatasourcePath)(THIS_ LPCTSTR DatasourcePath) PURE;
    STDMETHOD(SetDataSourceType)(THIS_ REPOLE_DATASOURCE_TYPE DataSourceType) PURE;
    STDMETHOD(SetSecurityMode)(THIS_ REPOLE_SECURITY_TYPE SecurityMode) PURE;
    STDMETHOD(SetLogin)(THIS_ LPCTSTR Login) PURE;
    STDMETHOD(SetPassword)(THIS_ LPCTSTR Password) PURE;
    STDMETHOD(SetODBCEnvironmentHandle)(THIS_ HENV henv) PURE;
    STDMETHOD(SetLoginTimeout)(THIS_ LONG lLoginTimeout) PURE;
    STDMETHOD(SetQueryTimeout)(THIS_ LONG lQueryTimeout) PURE;
    STDMETHOD(SetPacketSize)(THIS_ unsigned long usPacketSize) PURE;
    STDMETHOD(SetApplicationName)(THIS_ LPCTSTR ApplicationName) PURE;
	STDMETHOD(SetProviderName)(THIS_ LPCTSTR ProviderName) PURE;
	STDMETHOD(SetDatasource)(THIS_ LPCTSTR Datasource) PURE;
	STDMETHOD(SetLocation)(THIS_ LPCTSTR Location) PURE;
	STDMETHOD(SetProviderString)(THIS_ LPCTSTR ProviderString) PURE;
	STDMETHOD(SetCatalog)(THIS_ LPCTSTR Catalog) PURE;
	STDMETHOD(SetDBCreatedThisSession)(THIS_ BOOL bDBCreatedThisSession) PURE;
    STDMETHOD(SetBcpBatchSize)(THIS_ LONG lBcpBatchSize) PURE;
    STDMETHOD(GetBcpBatchSize)(THIS_ LONG * plBcpBatchSize) PURE;
};


/**** Implemented by the Reconciler ***/
#undef  INTERFACE
#define INTERFACE IReplRowChange
DECLARE_INTERFACE_(IReplRowChange, IUnknown)
{
   	//*** IUnknown methods
   	STDMETHOD(QueryInterface) (THIS_ REFIID riid, LPVOID *ppvObj) PURE;
   	STDMETHOD_(ULONG,AddRef) (THIS)  PURE;
   	STDMETHOD_(ULONG,Release) (THIS) PURE;

   	/* IReplRowChange methods */
    STDMETHOD(GetTableName)(THIS_ LPTSTR pTableName, DWORD cbTableName) PURE;
    STDMETHOD(GetRowIdentifier)(THIS_ LPGUID pRowGuid) PURE;
	STDMETHOD(GetResolverProcedureName)(LPTSTR pResolverProcedureName, DWORD cbResolverProcedureName) PURE;
    STDMETHOD(GetNumColumns)(THIS_ LPDWORD pdwColumnCount) PURE;
    STDMETHOD(GetChangeType)(THIS_ REPOLE_CHANGE_TYPE * pChangeType) PURE;
    STDMETHOD(GetColumnStatus)(THIS_ DWORD ColumnId, REPOLE_COLSTATUS_TYPE FAR *pColStatus) PURE;
    STDMETHOD(GetColumnName)(THIS_ DWORD ColumnId, LPTSTR pColumnName, DWORD cbColumnName) PURE;
	STDMETHOD(GetColumnDatatype)(DWORD ColumnId, LPLONG plDataType) PURE;
	STDMETHOD(GetSourceColumnValue)(THIS_ DWORD ColumnId, LPVOID pvBuffer, DWORD cbBufferMax, LPDWORD pcbBufferActual) PURE;
	STDMETHOD(GetDestinationColumnValue)(DWORD ColumnId, LPVOID pvBuffer, DWORD cbBufferMax, LPDWORD pcbBufferActual) PURE;
    STDMETHOD(GetPriorityWinner)(THIS_ REPOLE_PRIORITY_TYPE FAR * pPriorityWinner) PURE;
    STDMETHOD(GetSourceConnectionInfo)(THIS_ IConnectionInfo ** ppSourceConnectionInfo, LPBOOL pfIsPublisher) PURE;
    STDMETHOD(GetDestinationConnectionInfo)(THIS_ IConnectionInfo ** ppDestinationConnectionInfo, LPBOOL pfIsPublisher) PURE;
    STDMETHOD(DeleteRow)(THIS) PURE;
    STDMETHOD(CopyRowFromSource)(THIS) PURE;
    STDMETHOD(CopyColumnFromSource)(THIS_ DWORD ColumnId) PURE;
    STDMETHOD(SetColumn)(THIS_ DWORD ColumnId, LPVOID pvBuffer, DWORD cbBuffer) PURE;
    STDMETHOD(UpdateRow)(THIS) PURE;
    STDMETHOD(InsertRow)(THIS) PURE;
    STDMETHOD(LogConflict)(THIS_ BOOL bLogSourceConflict, REPOLE_CONFLICT_TYPE ConflictType, BOOL bOnlyLogIfUpdater, LPTSTR pszConflictMessage = NULL) PURE;
    STDMETHOD(LogError)(THIS_ REPOLE_CHANGE_TYPE ChangeType, LPTSTR pszErrorMessage = NULL) PURE;
    STDMETHOD(GetErrorInfo)(THIS_ DWORD *pErrCode, LPTSTR pErrText) PURE;
    STDMETHOD(DoDummyUpdate)(THIS_ BOOL fUpLineage, BOOL fAtPublisher) PURE;
    STDMETHOD(GetTableOwnerName)(THIS_ LPTSTR pOwnerName, DWORD cbOwnerName) PURE;
    STDMETHOD(GetRowGuidColName)(THIS_ LPTSTR pRowGuidColName, DWORD cbRowGuidColName) PURE;
};



/**** Default implemention by the Reconciler, can be provided by the ISV ***/
#undef  INTERFACE
#define INTERFACE ICustomResolver
DECLARE_INTERFACE_(ICustomResolver, IUnknown)
{
   	//*** IUnknown methods
   	STDMETHOD(QueryInterface) (THIS_ REFIID riid, LPVOID *ppvObj) PURE;
   	STDMETHOD_(ULONG,AddRef) (THIS)  PURE;
   	STDMETHOD_(ULONG,Release) (THIS) PURE;

   	/* ICustomResolver methods */
    STDMETHOD(Reconcile)(THIS_
                        IReplRowChange *pRowChange,
                        DWORD dwFlags,
                        PVOID pvReserved) PURE;
    STDMETHOD(GetHandledStates) (THIS_
    					DWORD	*pResolverBm) PURE;
};

#pragma option pop /*P_O_Pop*/
#endif   /* ! __SQLRES_H__ */

