/*
 * Copyright 2018 Alistair Leslie-Hughes
 *
 * 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
 */
import "oaidl.idl";
import "ocidl.idl";

#if !defined(progid) && !defined(__WIDL__)
#define threading(model)
#define progid(str)
#define vi_progid(str)
#endif

[
    object,
    uuid(6F10711F-729B-41E5-93B8-F21D0F818DF1),
    dual,
    pointer_default(unique)
]
interface IStaticPortMapping : IDispatch
{
    [propget, id(1)]
    HRESULT ExternalIPAddress ([out, retval] BSTR *value);

    [propget, id(2)]
    HRESULT ExternalPort([out, retval] long *value);

    [propget, id(3)]
    HRESULT InternalPort([out, retval] long *value);

    [propget, id(4)]
    HRESULT Protocol([out, retval] BSTR *value);

    [propget, id(5)]
    HRESULT InternalClient([out, retval] BSTR *value);

    [propget, id(6)]
    HRESULT Enabled([out, retval] VARIANT_BOOL *value);

    [propget, id(7)]
    HRESULT Description([out, retval] BSTR *value);

    [id(8)]
    HRESULT EditInternalClient ([in] BSTR client);

    [id(9)]
    HRESULT Enable ([in] VARIANT_BOOL enable);

    [id(10)]
    HRESULT EditDescription ([in] BSTR description);

    [id(11)]
    HRESULT EditInternalPort ([in] long port);
};

[
    object,
    uuid(cd1f3e77-66d6-4664-82c7-36dbb641d0f1),
    dual,
    pointer_default(unique)
]
interface IStaticPortMappingCollection : IDispatch
{
    [propget, id(DISPID_NEWENUM), hidden, restricted]
    HRESULT _NewEnum([out, retval] IUnknown **value);

    [propget, id(DISPID_VALUE)]
    HRESULT Item([in] long port, [in] BSTR protocol, [out, retval] IStaticPortMapping **mapping);

    [propget, id(1)]
    HRESULT Count([out, retval] long *value);

    [id(2)]
    HRESULT Remove([in] long port, [in] BSTR protocol);

    [id(3)]
    HRESULT Add([in] long external, [in] BSTR protocol, [in] long internal, [in] BSTR client,
        [in] VARIANT_BOOL enabled, [in] BSTR description, [out, retval] IStaticPortMapping **mapping);
};

[
    object,
    uuid(4FC80282-23B6-4378-9A27-CD8F17C9400C),
    dual,
    pointer_default(unique)
]
interface IDynamicPortMapping : IDispatch
{
    [propget, id(1)]
    HRESULT ExternalIPAddress ([out, retval] BSTR *value);

    [propget, id(2)]
    HRESULT RemoteHost ([out, retval] BSTR *value);

    [propget, id(3)]
    HRESULT ExternalPort([out, retval] long *value);

    [propget, id(4)]
    HRESULT Protocol([out, retval] BSTR *value);

    [propget, id(5)]
    HRESULT InternalPort([out, retval] long *value);

    [propget, id(6)]
    HRESULT InternalClient([out, retval] BSTR *value);

    [propget, id(7)]
    HRESULT Enabled([out, retval] VARIANT_BOOL *value);

    [propget, id(8)]
    HRESULT Description([out, retval] BSTR *value);

    [propget, id(9)]
    HRESULT LeaseDuration([out, retval] long *value);

    [id(10)]
    HRESULT RenewLease([in] long desired, [out, retval] long *duration);

    [id(11)]
    HRESULT EditInternalClient ([in] BSTR client);

    [id(12)]
    HRESULT Enable ([in] VARIANT_BOOL enabled);

    [id(13)]
    HRESULT EditDescription ([in] BSTR description);

    [id(14)]
    HRESULT EditInternalPort ([in] long port);
};

[
    object,
    uuid(b60de00f-156e-4e8d-9ec1-3a2342c10899),
    dual,
    pointer_default(unique)
]
interface IDynamicPortMappingCollection : IDispatch
{
    [propget, id(DISPID_NEWENUM), hidden, restricted]
    HRESULT _NewEnum([out, retval] IUnknown **value);

    [propget, id(DISPID_VALUE)]
    HRESULT Item([in] BSTR host, [in] long port, [in] BSTR orotocol,
        [out, retval] IDynamicPortMapping **mapping);

    [propget, id(1)]
    HRESULT Count([out, retval] long *value);

    [id(2)]
    HRESULT Remove([in] BSTR host, [in] long port, [in] BSTR protocol);

    [id(3)]
    HRESULT Add([in] BSTR host, [in] long port, [in] BSTR protocol, [in] long internal,
        [in] BSTR client, [in] VARIANT_BOOL enabled, [in] BSTR Description,
        [in] long duration, [out, retval] IDynamicPortMapping **mapping);
};

[
    object,
    uuid(624bd588-9060-4109-b0b0-1adbbcac32df),
    dual,
    pointer_default(unique)
]
interface INATEventManager : IDispatch
{
    [id(1), propput]
    HRESULT ExternalIPAddressCallback ([in] IUnknown *unk);

    [id(2), propput]
    HRESULT NumberOfEntriesCallback ([in] IUnknown *unk);
};

[
    object,
    uuid(b171c812-cc76-485a-94d8-b6b3a2794e99),
    dual,
    pointer_default(unique)
]
interface IUPnPNAT : IDispatch
{
    [propget, id(1)]
    HRESULT StaticPortMappingCollection ([out, retval] IStaticPortMappingCollection **collection);

    [propget, id(2)]
    HRESULT DynamicPortMappingCollection ([out, retval] IDynamicPortMappingCollection **collection);

    [propget, id(3)]
    HRESULT NATEventManager ([out, retval] INATEventManager **manager);
};

[
    uuid(1c565858-f302-471e-b409-f180aa4abec6),
    version(1.0)
]
library NATUPNPLib
{
    importlib("stdole2.tlb");

    [
        vi_progid("HNetCfg.NATUPnP"),
        progid("HNetCfg.NATUPnP.1"),
        threading(both),
        uuid(ae1e00aa-3fd5-403c-8a27-2bbdc30cd0e1)
    ]
    coclass UPnPNAT
    {
        [default] interface IUPnPNAT;
    };
};
