/*
 * 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 */

midl_pragma warning ( disable : 2368 )

[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);
	}
}
