/*
 *
 * Copyright 2014 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 "unknwn.idl";
import "wtypes.idl";

#ifndef __WIDL__
#define threading(model)
#define progid(str)
#define vi_progid(str)
#endif

cpp_quote("#define NETCFG_E_ALREADY_INITIALIZED  MAKE_HRESULT(SEVERITY_ERROR, FACILITY_ITF, 0xA020)")
cpp_quote("#define NETCFG_E_NO_WRITE_LOCK        MAKE_HRESULT(SEVERITY_ERROR, FACILITY_ITF, 0xA024)")

[
    local,
    object,
    uuid(c0e8ae99-306e-11d1-aacf-00805fc1270e),
    pointer_default(unique)
]
interface INetCfgComponent : IUnknown
{
    typedef enum tagCOMPONENT_CHARACTERISTICS
    {
        NCF_VIRTUAL                     = 0x00000001,
        NCF_SOFTWARE_ENUMERATED         = 0x00000002,
        NCF_PHYSICAL                    = 0x00000004,
        NCF_HIDDEN                      = 0x00000008,
        NCF_NO_SERVICE                  = 0x00000010,
        NCF_NOT_USER_REMOVABLE          = 0x00000020,
        NCF_MULTIPORT_INSTANCED_ADAPTER = 0x00000040,
        NCF_HAS_UI                      = 0x00000080,
        NCF_SINGLE_INSTANCE             = 0x00000100,
        NCF_FILTER                      = 0x00000400,
        NCF_DONTEXPOSELOWER             = 0x00001000,
        NCF_HIDE_BINDING                = 0x00002000,
        NCF_NDIS_PROTOCOL               = 0x00004000,
        NCF_FIXED_BINDING               = 0x00020000,
        NCF_LW_FILTER                   = 0x00040000
    } COMPONENT_CHARACTERISTICS;

    typedef enum tagNCRP_FLAGS
    {
        NCRP_QUERY_PROPERTY_UI          = 0x00000001,
        NCRP_SHOW_PROPERTY_UI           = 0x00000002
    } NCRP_FLAGS;

    HRESULT GetDisplayName ([out] LPWSTR* ppszwDisplayName);
    HRESULT SetDisplayName ([in] LPCWSTR pszwDisplayName);
    HRESULT GetHelpText ([out] LPWSTR* pszwHelpText);
    HRESULT GetId ([out] LPWSTR* ppszwId);
    HRESULT GetCharacteristics ([out] LPDWORD pdwCharacteristics);
    HRESULT GetInstanceGuid ([out] GUID* pGuid);
    HRESULT GetPnpDevNodeId ([out] LPWSTR* ppszwDevNodeId);
    HRESULT GetClassGuid ([out] GUID* pGuid);
    HRESULT GetBindName ([out] LPWSTR* ppszwBindName);
    HRESULT GetDeviceStatus ([out] ULONG* pulStatus);
    HRESULT OpenParamKey ([out] HKEY* phkey);
    HRESULT RaisePropertyUi ([in] HWND hwndParent, [in] DWORD dwFlags, [in] IUnknown* punkContext);
}


[
    local,
    object,
    uuid(c0e8ae92-306e-11d1-aacf-00805fc1270e),
    pointer_default(unique)
]
interface IEnumNetCfgComponent : IUnknown
{
    HRESULT Next ([in] ULONG celt, [out] INetCfgComponent** rgelt, [out] ULONG *pceltFetched);
    HRESULT Skip ([in] ULONG celt);
    HRESULT Reset ();
    HRESULT Clone ([out] IEnumNetCfgComponent** ppenum);
}

[
    local,
    object,
    uuid(c0e8ae9f-306e-11d1-aacf-00805fc1270e),
    pointer_default(unique)
]
interface INetCfgLock : IUnknown
{
    HRESULT AcquireWriteLock ([in] DWORD cmsTimeout, [in]  LPCWSTR pszwClientDescription,
                              [out] LPWSTR* ppszwClientDescription);
    HRESULT ReleaseWriteLock ();
    HRESULT IsWriteLocked ([out] LPWSTR* ppszwClientDescription);
}

[
    local,
    object,
    uuid(c0e8ae93-306e-11d1-aacf-00805fc1270e),
    pointer_default(unique)
]
interface INetCfg : IUnknown
{
    HRESULT Initialize ([in] PVOID pvReserved);
    HRESULT Uninitialize ();
    HRESULT Apply ();
    HRESULT Cancel ();
    HRESULT EnumComponents ([in] const GUID* pguidClass, [out] IEnumNetCfgComponent** ppenumComponent);
    HRESULT FindComponent ([in] LPCWSTR pszwInfId, [out] INetCfgComponent** pComponent);
    HRESULT QueryNetCfgClass ([in] const GUID* pguidClass, [in] REFIID riid,[out] void** ppvObject);
}

[
    helpstring("Network Configuration Component Object"),
    threading(both),
    uuid(5b035261-40f9-11d1-aaec-00805fc1270e)
]
coclass CNetCfg
{
    [default] interface INetCfg;
}
