//-----------------------------------------------------------------------------
// File:			scpops.idl
//
// Copyright:		Copyright (c) Microsoft Corporation
//
// Contents: 		OLE DB interface definition
//
// Comments:
//
//-----------------------------------------------------------------------------

#include "idlmulti.h"


	REMOTED_INTERFACE(0c733ab0-2a1c-11ce-ade5-00aa0044773d)


interface IScopedOperations : IBindResource
{

	typedef DWORD DBCOPYFLAGS;

	enum DBCOPYFLAGSENUM {
		DBCOPY_ASYNC				= 0x00000100,
		DBCOPY_REPLACE_EXISTING 	= 0x00000200,
		DBCOPY_ALLOW_EMULATION		= 0x00000400,
		DBCOPY_NON_RECURSIVE		= 0x00000800,
		DBCOPY_ATOMIC				= 0x00001000
		};

	typedef DWORD DBMOVEFLAGS;

	enum DBMOVEFLAGSENUM {
		DBMOVE_REPLACE_EXISTING 	= 0x00000001,
		DBMOVE_ASYNC				= 0x00000100,
		DBMOVE_DONT_UPDATE_LINKS	= 0x00000200,
		DBMOVE_ALLOW_EMULATION		= 0x00000400,
		DBMOVE_ATOMIC				= 0x00001000
		};

	typedef DWORD DBDELETEFLAGS;

	enum DBDELETEFLAGSENUM {
		DBDELETE_ASYNC				= 0x00000100,
		DBDELETE_ATOMIC 			= 0x00001000
		};

#ifdef _WIN64  //Use casting by ULONG in attribute size_is under 64-bit environment.

	[local]
	HRESULT Copy(
	[in]								DBCOUNTITEM		cRows,
	[in, size_is((ULONG)cRows), annotation("__in_ecount_opt(cRows)")] LPCOLESTR	rgpwszSourceURLs[],
	[in, size_is((ULONG)cRows), annotation("__in_ecount(cRows)")] LPCOLESTR	rgpwszDestURLs[],
	[in] DWORD dwCopyFlags,
	[in, unique, annotation("__in")] IAuthenticate*	pAuthenticate,
	[in, out, size_is((ULONG)cRows), annotation("__out_ecount(cRows)")] DBSTATUS 	rgdwStatus[],
	[out, size_is((ULONG)cRows), annotation("__inout_ecount_opt(cRows)")] LPOLESTR	rgpwszNewURLs[],
	[out, annotation("__deref_out_z_opt")] OLECHAR **ppStringsBuffer
	);

#ifndef NO_REMOTE

	[call_as(Copy)]
	HRESULT RemoteCopy(
		[in] 							DBCOUNTITEM 	cRows,
		[in, size_is((ULONG)cRows)]		LPCOLESTR * 	rgpwszSourceURLs,
		[in, size_is((ULONG)cRows)]		LPCOLESTR * 	rgpwszDestURLs,
		[in]							DWORD			dwCopyFlags,
		[in]							IAuthenticate * pAuthenticate,
		[out, size_is((ULONG)cRows)]	DBSTATUS * 		rgdwStatus,
		[out, size_is(,(ULONG)cRows)]	DBBYTEOFFSET ** prgulNewURLOffsets,
		[in, out]						ULONG * 		pcbStringsBuffer,
		[in, out, unique, size_is(,*pcbStringsBuffer)] OLECHAR ** ppStringsBuffer
	);

#endif

	[local]
	HRESULT Move(
	[in]									DBCOUNTITEM 	cRows,
	[in, size_is((ULONG)cRows), annotation("__in_ecount_opt(cRows)")] LPCOLESTR		rgpwszSourceURLs[],
	[in, size_is((ULONG)cRows), annotation("__in_ecount(cRows)")] LPCOLESTR		rgpwszDestURLs[],
	[in]DWORD	dwMoveFlags,
	[in, unique, annotation("__in")]	IAuthenticate*	pAuthenticate,
	[in, out, size_is((ULONG)cRows), annotation("__out_ecount(cRows)")]	DBSTATUS 		rgdwStatus[],
	[out, size_is((ULONG)cRows), annotation("__inout_ecount_opt(cRows)")] LPOLESTR		rgpwszNewURLs[],
	[out, annotation("__deref_out_z_opt")]	OLECHAR		**ppStringsBuffer
	);

#ifndef NO_REMOTE

	[call_as(Move)]
	HRESULT RemoteMove(
		[in] DBCOUNTITEM cRows,
		[in, size_is((ULONG)cRows)]		LPCOLESTR *			rgpwszSourceURLs,
		[in, size_is((ULONG)cRows)]		LPCOLESTR *			rgpwszDestURLs,
		[in] 							DWORD 				dwMoveFlags,
		[in] 							IAuthenticate *		pAuthenticate,
		[out, size_is((ULONG)cRows)]	DBSTATUS * 			rgdwStatus,
		[out, size_is(,(ULONG)cRows)]	DBBYTEOFFSET **		prgulNewURLOffsets,
		[in, out]						ULONG * 			pcbStringsBuffer,
		[in, out, unique, size_is(,*pcbStringsBuffer)] OLECHAR ** ppStringsBuffer
	);

#endif

	[local]
	HRESULT Delete (
	[in] DBCOUNTITEM 	cRows,
	[in, size_is((ULONG)cRows), annotation("__in_ecount(cRows)")] LPCOLESTR		rgpwszURLs[],
	[in] DWORD			dwDeleteFlags,
	[in, out, size_is((ULONG)cRows), annotation("__out_ecount(cRows)")] DBSTATUS		rgdwStatus[]
	);

#ifndef NO_REMOTE

	[call_as(Delete)]
	HRESULT RemoteDelete(
		[in] DBCOUNTITEM cRows,
		[in, size_is((ULONG)cRows)] LPCOLESTR * rgpwszURLs,
		[in] DWORD dwDeleteFlags,
		[out, size_is((ULONG)cRows)] DBSTATUS * rgdwStatus
		);

#endif

#else  //No casting by ULONG for 32-bit.

	[local]
	HRESULT Copy(
	[in] DBCOUNTITEM		cRows,
	[in, size_is(cRows), annotation("__in_ecount_opt(cRows)")] LPCOLESTR		rgpwszSourceURLs[],
	[in, size_is(cRows), annotation("__in_ecount(cRows)")] LPCOLESTR		rgpwszDestURLs[],
	[in]								DWORD			dwCopyFlags,
	[in, unique, annotation("__in_opt")]						IAuthenticate*	pAuthenticate,
	[in, out, size_is(cRows), annotation("__out_ecount(cRows)")]	DBSTATUS 		rgdwStatus[],
	[out, size_is(cRows), annotation("__inout_ecount_opt(cRows)")] LPOLESTR		rgpwszNewURLs[],
	[out, annotation("__deref_out_z_opt")] OLECHAR			**ppStringsBuffer
	);

#ifndef NO_REMOTE

	[call_as(Copy)]
	HRESULT RemoteCopy(
		[in] 							DBCOUNTITEM 	cRows,
		[in, size_is(cRows)]		LPCOLESTR * 	rgpwszSourceURLs,
		[in, size_is(cRows)]		LPCOLESTR * 	rgpwszDestURLs,
		[in]							DWORD			dwCopyFlags,
		[in]							IAuthenticate * pAuthenticate,
		[out, size_is(cRows)]	DBSTATUS * 		rgdwStatus,
		[out, size_is(,cRows)]	DBBYTEOFFSET ** prgulNewURLOffsets,
		[in, out]						ULONG * 		pcbStringsBuffer,
		[in, out, unique, size_is(,*pcbStringsBuffer)] OLECHAR ** ppStringsBuffer
	);

#endif

	[local]
	HRESULT Move(
	[in]									DBCOUNTITEM 	cRows,
	[in, size_is(cRows), annotation("__in_ecount_opt(cRows)")]		LPCOLESTR		rgpwszSourceURLs[],
	[in, size_is(cRows), annotation("__in_ecount(cRows)")]		LPCOLESTR		rgpwszDestURLs[],
	[in] DWORD	dwMoveFlags,
	[in, unique, annotation("__in_opt")]	IAuthenticate*	pAuthenticate,
	[in, out, size_is(cRows), annotation("__out_ecount(cRows)")]		DBSTATUS 		rgdwStatus[],
	[out, size_is(cRows), annotation("__inout_ecount_opt(cRows)")]	LPOLESTR		rgpwszNewURLs[],
	[out, annotation("__deref_out_z_opt")]	OLECHAR			**ppStringsBuffer
	);

#ifndef NO_REMOTE

	[call_as(Move)]
	HRESULT RemoteMove(
		[in] DBCOUNTITEM cRows,
		[in, size_is(cRows)]		LPCOLESTR *			rgpwszSourceURLs,
		[in, size_is(cRows)]		LPCOLESTR *			rgpwszDestURLs,
		[in] 							DWORD 				dwMoveFlags,
		[in] 							IAuthenticate *		pAuthenticate,
		[out, size_is(cRows)]	DBSTATUS * 			rgdwStatus,
		[out, size_is(,cRows)]	DBBYTEOFFSET **		prgulNewURLOffsets,
		[in, out]						ULONG * 			pcbStringsBuffer,
		[in, out, unique, size_is(,*pcbStringsBuffer)] OLECHAR ** ppStringsBuffer
	);

#endif

	[local]
	HRESULT Delete (
	[in] DBCOUNTITEM 	cRows,
	[in, size_is(cRows), annotation("__in_ecount(cRows)")]	LPCOLESTR	rgpwszURLs[],
	[in] DWORD			dwDeleteFlags,
	[in, out, size_is(cRows), annotation("__out_ecount(cRows)")] DBSTATUS	rgdwStatus[]
	);

#ifndef NO_REMOTE

	[call_as(Delete)]
	HRESULT RemoteDelete(
		[in] DBCOUNTITEM cRows,
		[in, size_is(cRows)] LPCOLESTR * rgpwszURLs,
		[in] DWORD dwDeleteFlags,
		[out, size_is(cRows)] DBSTATUS * rgdwStatus
		);

#endif

#endif

	[local]
	HRESULT OpenRowset(
	[in, annotation("__in_opt")]	IUnknown		*pUnkOuter,
	[in, unique, annotation("__in_opt")]	DBID			*pTableID,
	[in, unique, annotation("__in_opt")]	DBID			*pIndexID,
	[in] REFIID	riid,
	[in] ULONG	cPropertySets,
	[in, out, size_is(cPropertySets), annotation("__inout_ecount(cPropertySets)")] DBPROPSET		rgPropertySets[],
	[out, iid_is(riid), annotation("__deref_opt_inout")]				IUnknown		**ppRowset
	);

#ifndef NO_REMOTE

	[call_as(OpenRowset)]
	HRESULT RemoteOpenRowset(
		[in] IUnknown * pUnkOuter,
		[in, unique] DBID * pTableID,
		[in, unique] DBID * pIndexID,
		[in] REFIID riid,
		[in] ULONG cPropertySets,
		[in, unique, size_is(cPropertySets)] DBPROPSET * rgPropertySets,
		[in, out, unique, iid_is(riid)] IUnknown ** ppRowset,
		[in] ULONG cTotalProps,
		[out, size_is(cTotalProps)] DBPROPSTATUS * rgPropStatus
	);
#endif

};
