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