/*
 * A typelib to test registration.
 *
 * Copyright 2010 Huw Davies
 *
 * 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(a2cfdbd3-2bbf-4b1c-a414-5a5904e634c9),
    id(3),
    version(1.0)
]
library register_test
{
    importlib("stdole2.tlb");

    [
        uuid(06c1f5f0-ea49-44f9-8e3b-4be00c7a0689)
    ]
    interface Inon_ole : IUnknown
    {
        HRESULT test();
    }

    [
        uuid(06c1f5f1-ea49-44f9-8e3b-4be00c7a0689)
    ]
    interface Inon_ole_from_disp : IDispatch
    {
        HRESULT test();
    }

    [
        uuid(06c1f5f2-ea49-44f9-8e3b-4be00c7a0689),
        oleautomation
    ]
    interface Iole : IUnknown
    {
        HRESULT test();
    }

    [
        uuid(06c1f5f3-ea49-44f9-8e3b-4be00c7a0689),
        oleautomation
    ]
    interface Iole_from_disp : IDispatch
    {
        HRESULT test();
    }

    [
        uuid(06c1f5f4-ea49-44f9-8e3b-4be00c7a0689),
        dual
    ]
    interface Inon_ole_dual : IUnknown
    {
        HRESULT test();
    }

    [
        uuid(06c1f5f5-ea49-44f9-8e3b-4be00c7a0689),
        oleautomation,
        dual
    ]
    interface Iole_dual : IUnknown
    {
        HRESULT test();
    }

    [
        uuid(06c1f5f6-ea49-44f9-8e3b-4be00c7a0689),
        dual
    ]
    interface Inon_ole_dual_from_disp : IDispatch
    {
        HRESULT test();
    }

    [
        uuid(06c1f5f7-ea49-44f9-8e3b-4be00c7a0689),
        oleautomation,
        dual
    ]
    interface Iole_dual_from_disp : IDispatch
    {
        HRESULT test();
    }

    /* oleautomation not allowed with dispinterfaces */
    [
        uuid(06c1f5f8-ea49-44f9-8e3b-4be00c7a0689)
    ]
    dispinterface Idisp
    {
    properties:
        [id(0x0)] BSTR Name;
    methods:
    }

    [
        uuid(06c1f5f9-ea49-44f9-8e3b-4be00c7a0689)
    ]
    dispinterface Idisp_from_non_ole_iface
    {
        interface Inon_ole;
    }

    [
        uuid(06c1f5fa-ea49-44f9-8e3b-4be00c7a0689)
    ]
    dispinterface Idisp_from_ole_from_disp_iface
    {
        interface Iole_from_disp;
    }

    [
        uuid(fed318b2-c2ed-11e7-abc4-cec278b6b50a)
    ]
    interface ICollection : IDispatch
    {
        [id(DISPID_VALUE)]
        HRESULT Item([in] int i, [out, retval] int *p);
    }

    [
        uuid(f1b68c3b-02a3-4110-bc4c-cf9bc7e7f177)
    ]
    interface IInvokeTest : IDispatch
    {
        [propget, id(DISPID_VALUE)]
        LONG test([in] LONG i);
        [propputref, id(1)]
        LONG testprop([in] LONG *i);
        [propputref, id(2)]
        LONG testprop2([in] IUnknown *i);
        [id(3)]
        HRESULT testfunc([in] int i, [out, retval] int *p);
        [propget, id(4)]
        HRESULT testget([out, retval] ICollection **p);
        [propget, id(5)]
        HRESULT testget2([out, retval] int *value);
        [propget, id(6)]
        int testget3();
        [propget, id(7)]
        int testget4([in] int value);
        [propget, id(8)]
        int testget5([out,retval] int *value1, [in] int value2);
        [propget, id(9)]
        int testget6([in] int value1, [in] int value2);
        [propget, id(10)]
        void testget7([in] int value1, [in] int value2);
        [propget, id(11)]
        void testget8([out, retval] int* value);
        [propput, id(11)]
        void testput8([in] int value);
    }

    /* uuid is same as for test_struct2 in test_tlb.idl, fields are different */
    [uuid(4029f190-ca4a-4611-aeb9-673983cb96de)]
    struct test_struct3
    {
        UINT32 field;
        HRESULT hr;
    };

    [
        uuid(f073cd92-a199-11ea-bb37-0242ac130002),
        dllname("test.dll")
    ]
    module TestGetDllEntry
    {
        [propget, entry(1)]
        int test1([out] int *i);

        [propput, entry(2)]
        int test1([in] int i);
    };
}
