/*
 * 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),
    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(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);
    }

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