/*
 * Copyright 2007 Robert Shearman for CodeWeavers
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 2.1 of the License, or (at your option) any later version.
 *
 * This library is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with this library; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
 */

import "wtypes.idl";

cpp_quote("#define IROT_PROTSEQ {'n','c','a','l','r','p','c',0}")
cpp_quote("#define IROT_ENDPOINT {'i','r','o','t',0}")

typedef struct tagMonikerComparisonData {
	ULONG ulCntData;
	[size_is(ulCntData)] BYTE abData[];
} MonikerComparisonData;

[
    uuid(7a98c254-6808-11cf-b73b-00aa00b677a8),
    version(0.2),
    strict_context_handle
]
interface Irot
{
	typedef struct tagInterfaceData
	{
		ULONG ulCntData;
		[size_is(ulCntData)] BYTE abData[];
	} InterfaceData;

	typedef [unique] InterfaceData *PInterfaceData;

	typedef struct tagInterfaceList
	{
		ULONG size;
		[size_is(size)] PInterfaceData interfaces[];
	} InterfaceList;

	typedef [unique] InterfaceList *PInterfaceList;

	typedef DWORD IrotCookie;

	typedef handle_t IrotHandle;
	typedef [context_handle] void *IrotContextHandle;

	HRESULT IrotRegister(
		[in]  IrotHandle h,
		[in]  const MonikerComparisonData *moniker_data,
		[in]  const InterfaceData *object,
		[in]  const InterfaceData *moniker,
		[in]  const FILETIME *time,
		[in]  DWORD grfFlags,
		[out] IrotCookie *cookie,
		[out] IrotContextHandle *ctxt_handle);

	HRESULT IrotRevoke(
		[in]  IrotHandle h,
		[in]  IrotCookie cookie,
		[in, out] IrotContextHandle *ctxt_handle,
		[out] PInterfaceData *object,
		[out] PInterfaceData *moniker);

	HRESULT IrotIsRunning(
		[in]  IrotHandle h,
		[in]  const MonikerComparisonData *moniker_data);

	HRESULT IrotGetObject(
		[in]  IrotHandle h,
		[in]  const MonikerComparisonData *moniker_data,
		[out] PInterfaceData *obj,
		[out] IrotCookie *cookie);

	HRESULT IrotNoteChangeTime(
		[in]  IrotHandle h,
		[in]  IrotCookie cookie,
		[in]  const FILETIME *time);

	HRESULT IrotGetTimeOfLastChange(
		[in]  IrotHandle h,
		[in]  const MonikerComparisonData *moniker_data,
		[out] FILETIME *time);

	HRESULT IrotEnumRunning(
		[in]  IrotHandle h,
		[out] PInterfaceList *list);
}
