/*
 * ITypeLib test IDL - we dump it and compare results in typelib.c
 *
 * Copyright 2007 Google (Mikolaj Zalewski)
 * Copyright 2006,2015 Dmitry Timoshkov
 *
 * 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
 */

#pragma makedep ident
#pragma makedep typelib

import "oaidl.idl"; /* needed by widl */

[uuid(8b05fe77-4a6c-4133-b9cd-8f81747af784)]
library Test
{
	importlib("stdole2.tlb");

	typedef [uuid(b14b6bb5-904e-4ff9-b247-bd361f7a0001)]
	struct g { int g1; } g;

	[uuid(b14b6bb5-904e-4ff9-b247-bd361f7a0002)]
	interface test_iface : IUnknown
	{
		HRESULT test([in] g *ptr);
	}

	interface child_iface;
	interface parent_iface;

	[uuid(b14b6bb5-904e-4ff9-b247-bd361f7aa001)]
	interface parent_iface : IUnknown
	{
		HRESULT test1([out,retval] child_iface **iface);
	}
	[uuid(b14b6bb5-904e-4ff9-b247-bd361f7aa002)]
	interface child_iface: parent_iface
	{
		HRESULT test2(void);
	}

	[uuid(016fe2ec-b2c8-45f8-b23b-39e53a753901),restricted]
	struct _n { int n1; };
	[uuid(016fe2ec-b2c8-45f8-b23b-39e53a753902),hidden]
	typedef struct _n n;
	[uuid(016fe2ec-b2c8-45f8-b23b-39e53a753903),version(1.2),helpcontext(3)]
	typedef struct _n nn;

	[uuid(016fe2ec-b2c8-45f8-b23b-39e53a753904),restricted]
	struct _m { int m1; };
	[uuid(016fe2ec-b2c8-45f8-b23b-39e53a753905),hidden,version(1.2)]
	typedef struct _m m;
	[uuid(016fe2ec-b2c8-45f8-b23b-39e53a753906),helpcontext(3)]
	typedef struct _m mm;

	[dual,uuid(b14b6bb5-904e-4ff9-b247-bd361f7aaedd)]
	interface IDualIface : IDispatch
	{
		HRESULT test();
	}

	[uuid(ec5dfcd6-eeb0-4cd6-b51e-8030e1dac009)]
	interface ISimpleIface : IDispatch
	{
		HRESULT test();
	}

	[uuid(4029f190-ca4a-4611-aeb9-673983cb96dd)]
	struct test_struct
	{
		HRESULT hr;
		VARIANT_BOOL b;
		IDispatch *disp;
		BSTR bstr;
	};

        /* identical to 'test_struct', only guid is different */
	[uuid(4029f190-ca4a-4611-aeb9-673983cb96de)]
	struct test_struct2
	{
		HRESULT hr;
		VARIANT_BOOL b;
		IDispatch *disp;
		BSTR bstr;
	};

	typedef [uuid(016fe2ec-b2c8-45f8-b23b-39e53a75396a),restricted]
	int t_INT;

	typedef [public] enum _a { a1, a2 } a;
	typedef [public] enum aa { aa1, aa2 } aa;
	typedef enum _b { b1, b2 } b;
	typedef enum bb { bb1, bb2 } bb;
	typedef [uuid(016fe2ec-b2c8-45f8-b23b-39e53a75396b)] enum _c { c1, c2 } c;
	typedef [uuid(016fe2ec-b2c8-45f8-b23b-39e53a75396c)] enum cc { cc1, cc2 } cc;

	typedef [uuid(016fe2ec-b2c8-45f8-b23b-39e53a75396d),restricted,hidden]
	enum _d { d1, d2 } d;
	typedef [uuid(016fe2ec-b2c8-45f8-b23b-39e53a75396e),restricted,hidden]
	enum dd { dd1, dd2 } dd;

	typedef [uuid(016fe2ec-b2c8-45f8-b23b-39e53a753970),restricted,hidden]
	struct _e { int e1; } e;
	typedef [uuid(016fe2ec-b2c8-45f8-b23b-39e53a753971),restricted,hidden]
	struct ee { int ee1; } ee;

	typedef [uuid(016fe2ec-b2c8-45f8-b23b-39e53a753972),restricted,hidden]
	union _f { int f1; BSTR *f2; } f;
	typedef [uuid(016fe2ec-b2c8-45f8-b23b-39e53a753973),restricted,hidden]
	union ff { int ff1; BSTR *ff2; } ff;

	[uuid(ec5dfcd6-eeb0-4cd6-b51e-8030e1dac00a)]
	interface ITestIface : IDispatch
	{
		HRESULT test1(a value);
		HRESULT test2(b value);
		HRESULT test3(c value);
		HRESULT test4(d value);
		HRESULT test5(e value);
		HRESULT test6(f value);
	}
}
