/*
 * Copyright (C) 2005 Robert Shearman
 *
 * 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
 *
 */

#include "tmarshal_dispids.h"
import "ocidl.idl";

[
  uuid(d96d8a3e-78b6-4c8d-8f27-059db959be8a),
  version(1.0),
  helpstring("Test Typelib")
]
library TestTypelib
{
    importlib("stdole2.tlb");

    typedef enum tagSTATE
    {
        STATE_UNWIDGETIFIED = 1,
        STATE_WIDGETIFIED
    } STATE;

    typedef struct tagMYSTRUCT
    {
        INT field1;
        ULONGLONG field2;
    } MYSTRUCT;

    coclass ApplicationObject2;

    [
        odl,
        uuid(12345678-1234-4321-1234-121212121212)
    ]
    interface ISomethingFromDispatch : IDispatch
    {
        HRESULT anotherfn(void);
    }

    [
        odl,
        oleautomation,
        dual,
        uuid(3f7e06fe-0bce-46f0-8b7d-3a68393c7967)
    ]
    interface ItestDual : IDispatch
    {
        HRESULT test();
    }

    [
        odl,
        uuid(a1f8cae3-c947-4c5f-b57d-c87b9b5f3586),
        oleautomation,
        dual
    ]
    interface IWidget : IDispatch
    {
        [propput, id(DISPID_TM_NAME)]
        HRESULT Name([in] BSTR name);
        [propget, id(DISPID_TM_NAME)]
        HRESULT Name([out, retval] BSTR *name);

        [id(DISPID_TM_DOSOMETHING)]
        HRESULT DoSomething([in] double number, [out] BSTR *str1, [in, defaultvalue("")] BSTR str2, [in, optional] VARIANT *opt);

        [propget, id(DISPID_TM_STATE)]
        HRESULT State([out, retval] STATE *state);
        [propput, id(DISPID_TM_STATE)]
        HRESULT State([in] STATE state);

        [id(DISPID_TM_MAP)]
        HRESULT Map([in] BSTR bstrId, [out, retval] BSTR *sValue);

        [id(DISPID_TM_SETOLECOLOR)]
        HRESULT SetOleColor([in] OLE_COLOR val);

        [id(DISPID_TM_GETOLECOLOR)]
        HRESULT GetOleColor([out, retval] OLE_COLOR *pVal);

        [propget, id(DISPID_TM_CLONE)]
        HRESULT Clone([out, retval] IWidget **ppVal);

        [propget, id(DISPID_TM_CLONEDISPATCH)]
        HRESULT CloneDispatch([out, retval] IDispatch **ppVal);

        [propget, id(DISPID_TM_CLONECOCLASS)]
        HRESULT CloneCoclass([out, retval] ApplicationObject2 **ppVal);

        [propget, id(DISPID_VALUE)]
        HRESULT Value([in] VARIANT *value, [out, retval] VARIANT *retval);

        [id(DISPID_TM_ARRAY)]
        HRESULT Array([in] SAFEARRAY(BSTR) values);

        [id(DISPID_TM_VARARRAYPTR)]
        HRESULT VariantArrayPtr([in] SAFEARRAY(VARIANT) *values);

        [id(DISPID_TM_VARIANT)]
        HRESULT Variant([in] VARIANT var);

        [vararg, id(DISPID_TM_VARARG)]
        HRESULT VarArg([in] int numexpect, [in] SAFEARRAY(VARIANT) values);

        [id(DISPID_TM_STRUCTARGS)]
        HRESULT StructArgs([in] MYSTRUCT byval, [in] MYSTRUCT *byptr, [in] MYSTRUCT arr[5]);

        [id(DISPID_TM_ERROR)]
        HRESULT Error();

        [propget, id(DISPID_TM_CLONEINTERFACE)]
        HRESULT CloneInterface([out, retval] ISomethingFromDispatch **ppVal);

        [id(DISPID_TM_PROP_WITH_LCID), propput]
        HRESULT prop_with_lcid([in,lcid] long lcid, [in] INT i);

        [id(DISPID_TM_PROP_WITH_LCID), propget]
        HRESULT prop_with_lcid([in,lcid] long lcid, [out,retval] INT *i);

        [id(DISPID_TM_PROP_INT), propget]
        HRESULT prop_int([out,retval] INT *i);

        [id(DISPID_TM_PROP_UINT), propget]
        HRESULT prop_uint([out,retval] UINT *i);

        [id(DISPID_TM_BYREF_UINT)]
        HRESULT ByRefUInt([in, out] UINT *i);
    }

    [
        odl,
        uuid(a1f8cae3-c947-3c5f-a57c-c88b9b6f3586),
        oleautomation,
        dual
    ]
    interface IStaticWidget : IDispatch
    {
        [id(DISPID_TM_TESTDUAL)]
        HRESULT TestDual([in] ItestDual *p);
    }

    [
        odl,
        uuid(a028db05-30f0-4b93-b17a-41c72f831d84),
#if 0 /* FIXME: commented out as causes widl to generate incorrect typelib */
        dual,
#endif
        oleautomation
    ]
    interface IKindaEnumWidget : IUnknown
    {
        HRESULT Next(
                     [out] IWidget **widget);

        HRESULT Count(
                      [out] unsigned long *count);

        HRESULT Reset();

        HRESULT Clone(
                      [out] IKindaEnumWidget **ppenum);
    }

    [
        odl,
        uuid(a028db06-30f0-4b93-b17a-41c72f831d84),
    ]
    interface INonOleAutomation : IUnknown
    {
        [id(DISPID_NOA_BSTRRET)]
        BSTR BstrRet();
    }


    [
        dllname("comm.drv"),
        uuid(d377f60b-8639-4261-8ee7-75c8340d2cc9),
    ]
    module BadModule
    {
        [
            entry("Foo"),
        ]
        HRESULT BadModuleFoo();
    };

    [
        dllname("oleaut32.dll"),
        uuid(d377f60c-8639-4261-8ee7-75c8340d2cc9),
    ]
    module BadEntry
    {
        [
            entry("Foo"),
        ]
        HRESULT BadEntryFoo();
    };

    [
        uuid(bb171948-10ec-407a-9a57-2f85f797ff1a),
        appobject,
    ]
    coclass ApplicationObject2
    {
        interface IWidget;
        [source] interface IWidget;
    };

    [
        odl,
        uuid(375f8a9d-33d0-44f3-b972-61f8407899e0)
    ]
        interface ItestIF1 : IUnknown
    {
        HRESULT fn1([in] int x);
        HRESULT fn2([out,retval] int *x);
    }

    [
        odl,
        uuid(094056a3-666f-4956-be12-1859668310b8)
    ]
    interface ItestIF2 : ItestIF1
    {
        HRESULT fn3([in] int y);
    }

    [
        odl,
        uuid(33baba09-2e68-43ab-81fe-d84b403df2e5)
    ]
    dispinterface ItestIF3
    {
        interface ItestIF2;
    }

    [
        odl,
        uuid(a01005c7-7491-42eb-94f3-668e37ce60a6)
    ]
    dispinterface ItestIF4
    {
        properties:
        methods:
        [id(0x1c)] HRESULT fn([in] int z);
    }

    [
        odl,
        uuid(4ab61e25-c09f-4239-8f7f-7a018ea0199f),
        dual
    ]
    interface ItestIF5 : ItestIF2
    {
        [id(0x1234)] HRESULT fn4([in] int a);
        [id(0x1235)] HRESULT fn5([in] int a);
    }

    [
        odl,
        uuid(ec236d8e-2cc7-44f2-b394-36c86ff3da74)
    ]
    interface ItestIF6 : IDispatch
    {
        [id(0x1234)] HRESULT fn4([in] int a);
        [id(0x1235)] HRESULT fn5([in] int a);
    }

    [
        odl,
        uuid(f711b105-554d-4751-818c-46fcc5d7c0d5),
        dual
    ]
    interface ItestIF7 : ItestIF6
    {
        [id(0x1236)] HRESULT fn6([in] GUID a);
    }

    [
        odl,
        uuid(bdfa260b-ef40-43d3-b071-cddec919f132)
    ]
        interface ItestIF8
    {
        HRESULT fn1([in] int x);
        HRESULT fn2([out,retval] int *x);
    }

    [
        odl,
        uuid(51033a23-dc37-4f19-aa34-4d8a670458a0)

    ]
    interface ItestIF9 : ItestIF8
    {
        HRESULT fn3([in] int y);
    }

    [
        odl,
        uuid(2e8f14fe-0bce-42f0-8b7d-3af8393c7967)
    ]
    dispinterface ItestIF10
    {
        interface ItestIF9;
    }

    [
        odl,
        uuid(7d9e9371-482e-4944-9b19-511fc705236f)
    ]
    dispinterface ItestIF11
    {
        interface ItestIF7;
    }

};
