/*
 * Copyright 2014 Hans Leidekker for CodeWeavers
 *
 * 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 "objidl.idl";

#ifndef __WIDL__
#define threading(model)
#endif

interface IEnumNetworks;
interface IEnumNetworkConnections;
interface INetwork;
interface INetworkConnection;
interface INetworkCostManager;
interface INetworkListManager;
interface INetworkListManagerEvents;

typedef [v1_enum] enum NLM_CONNECTIVITY
{
    NLM_CONNECTIVITY_DISCONNECTED      = 0x0000,
    NLM_CONNECTIVITY_IPV4_NOTRAFFIC    = 0x0001,
    NLM_CONNECTIVITY_IPV6_NOTRAFFIC    = 0x0002,
    NLM_CONNECTIVITY_IPV4_SUBNET       = 0x0010,
    NLM_CONNECTIVITY_IPV4_LOCALNETWORK = 0x0020,
    NLM_CONNECTIVITY_IPV4_INTERNET     = 0x0040,
    NLM_CONNECTIVITY_IPV6_SUBNET       = 0x0100,
    NLM_CONNECTIVITY_IPV6_LOCALNETWORK = 0x0200,
    NLM_CONNECTIVITY_IPV6_INTERNET     = 0x0400
} NLM_CONNECTIVITY;

typedef [v1_enum] enum NLM_DOMAIN_TYPE
{
    NLM_DOMAIN_TYPE_NON_DOMAIN_NETWORK   = 0x00,
    NLM_DOMAIN_TYPE_DOMAIN_NETWORK       = 0x01,
    NLM_DOMAIN_TYPE_DOMAIN_AUTHENTICATED = 0x02
} NLM_DOMAIN_TYPE;

typedef [v1_enum] enum NLM_ENUM_NETWORK
{
    NLM_ENUM_NETWORK_CONNECTED    = 0x01,
    NLM_ENUM_NETWORK_DISCONNECTED = 0x02,
    NLM_ENUM_NETWORK_ALL          = 0x03
} NLM_ENUM_NETWORK;

typedef [v1_enum] enum NLM_CONNECTION_COST
{
    NLM_CONNECTION_COST_UNKNOWN              = 0x0,
    NLM_CONNECTION_COST_UNRESTRICTED         = 0x1,
    NLM_CONNECTION_COST_FIXED                = 0x2,
    NLM_CONNECTION_COST_VARIABLE             = 0x4,
    NLM_CONNECTION_COST_OVERDATALIMIT        = 0x10000,
    NLM_CONNECTION_COST_CONGESTED            = 0x20000,
    NLM_CONNECTION_COST_ROAMING              = 0x40000,
    NLM_CONNECTION_COST_APPROACHINGDATALIMIT = 0x80000
} NLM_CONNECTION_COST;

typedef struct NLM_SOCKADDR
{
    BYTE data[128];
} NLM_SOCKADDR;

const UINT32 NLM_UNKNOWN_DATAPLAN_STATUS = 0xffffffff;

typedef struct NLM_USAGE_DATA
{
    DWORD    UsageInMegabytes;
    FILETIME LastSyncTime;
} NLM_USAGE_DATA;

typedef struct NLM_DATAPLAN_STATUS
{
    GUID           InterfaceGuid;
    NLM_USAGE_DATA UsageData;
    DWORD          DataLimitInMegabytes;
    DWORD          InboundBandwidthInKbps;
    DWORD          OutboundBandwidthInKbps;
    FILETIME       NextBillingCycle;
    DWORD          MaxTransferSizeInMegabytes;
    DWORD          Reserved;
} NLM_DATAPLAN_STATUS;

[
    object,
    pointer_default(unique),
    uuid(dcb00008-570f-4a9b-8d69-199fdba5723b)
]
interface INetworkCostManager : IUnknown
{
    HRESULT GetCost(
        [out] DWORD *pCost,
        [in, unique] NLM_SOCKADDR *pDestIPAddr);

    HRESULT GetDataPlanStatus(
        [out] NLM_DATAPLAN_STATUS *pDataPlanStatus,
        [in, unique] NLM_SOCKADDR *pDestIPAddr);

    HRESULT SetDestinationAddresses(
        [in] UINT32 length,
        [in, unique, size_is(length)] NLM_SOCKADDR *pDestIPAddrList,
        [in] VARIANT_BOOL bAppend);
}

[
    object,
    pointer_default(unique),
    uuid(dcb0000a-570f-4a9b-8d69-199fdba5723b)
]
interface INetworkConnectionCost : IUnknown
{
    HRESULT GetCost(
        [out] DWORD *pCost);

    HRESULT GetDataPlanStatus(
        [out] NLM_DATAPLAN_STATUS *pDataPlanStatus);
}

[
    object,
    pointer_default(unique),
    uuid(dcb00009-570f-4a9b-8d69-199fdba5723b)
]
interface INetworkCostManagerEvents : IUnknown
{
    HRESULT CostChanged(
        [in] DWORD newCost,
        [in, unique] NLM_SOCKADDR *pDestAddr);

    HRESULT DataPlanStatusChanged(
        [in, unique] NLM_SOCKADDR *pDestAddr);
}

[
    object,
    oleautomation,
    pointer_default(unique),
    dual,
    uuid(dcb00003-570f-4a9b-8d69-199fdba5723b)
]
interface IEnumNetworks : IDispatch
{
    [id(DISPID_NEWENUM), propget, hidden, restricted]
    HRESULT _NewEnum(
        [out, retval] IEnumVARIANT **ppEnumVar);

    [id(1)]
    HRESULT Next(
        [in] ULONG celt,
        [out, size_is(celt), length_is(*pceltFetched)] INetwork **rgelt,
        [in, out] ULONG *pceltFetched);

    [id(2)]
    HRESULT Skip(
        [in] ULONG celt);

    [id(3)]
    HRESULT Reset();

    [id(4)]
    HRESULT Clone(
        [out, retval] IEnumNetworks **ppEnumNetwork);
}

[
    object,
    oleautomation,
    pointer_default(unique),
    dual,
    uuid(dcb00006-570f-4a9b-8d69-199fdba5723b)
]
interface IEnumNetworkConnections : IDispatch
{
    [id(DISPID_NEWENUM), propget, hidden, restricted]
    HRESULT _NewEnum(
        [out, retval] IEnumVARIANT **ppEnumVar);

    [id(1)]
    HRESULT Next(
        [in] ULONG celt,
        [out, size_is(celt), length_is(*pceltFetched)] INetworkConnection **rgelt,
        [in, out] ULONG *pceltFetched);

    [id(2)]
    HRESULT Skip(
        [in] ULONG celt);

    [id(3)]
    HRESULT Reset();

    [id(4)]
    HRESULT Clone(
        [out, retval] IEnumNetworkConnections **ppEnumNetwork);
}

[
    dual,
    object,
    oleautomation,
    pointer_default(unique),
    uuid(dcb00000-570f-4a9b-8d69-199fdba5723b)
]
interface INetworkListManager : IDispatch
{
    HRESULT GetNetworks(
        [in] NLM_ENUM_NETWORK Flags,
        [out, retval] IEnumNetworks **ppEnumNetwork);

    HRESULT GetNetwork(
        [in] GUID gdNetworkId,
        [out, retval] INetwork **ppNetwork);

    HRESULT GetNetworkConnections(
        [out, retval] IEnumNetworkConnections **ppEnum);

    HRESULT GetNetworkConnection(
        [in] GUID gdNetworkConnectionId,
        [out, retval] INetworkConnection **ppNetworkConnection);

    HRESULT IsConnectedToInternet(
        [out, retval] VARIANT_BOOL *pbIsConnected);

    HRESULT IsConnected(
        [out, retval] VARIANT_BOOL *pbIsConnected);

    HRESULT GetConnectivity(
        [out, retval] NLM_CONNECTIVITY *pConnectivity);
}

[
    threading(both),
    uuid(dcb00c01-570f-4a9b-8d69-199fdba5723b)
]
coclass NetworkListManager { interface INetworkListManager; }

[
    object,
    oleautomation,
    pointer_default(unique),
    uuid(DCB00001-570F-4A9B-8D69-199FDBA5723B)
]
interface INetworkListManagerEvents : IUnknown
{
    HRESULT ConnectivityChanged(
        [in] NLM_CONNECTIVITY newConnectivity);
}

[
    object,
    oleautomation,
    pointer_default(unique),
    uuid(dcb00007-570f-4a9b-8d69-199fdba5723b)
]
interface INetworkConnectionEvents : IUnknown
{
    typedef enum NLM_CONNECTION_PROPERTY_CHANGE
    {
        NLM_CONNECTION_PROPERTY_CHANGE_AUTHENTICATION = 1
    } NLM_CONNECTION_PROPERTY_CHANGE;

    HRESULT NetworkConnectionConnectivityChanged(
        [in] GUID connectionId,
        [in] NLM_CONNECTIVITY newConnectivity);

    HRESULT NetworkConnectionPropertyChanged(
        [in] GUID connectionId,
        [in] NLM_CONNECTION_PROPERTY_CHANGE flags);
}

[
    object,
    oleautomation,
    pointer_default(unique),
    dual,
    uuid(dcb00005-570f-4a9b-8d69-199fdba5723b)
]
interface INetworkConnection : IDispatch
{
    [id(1)]
    HRESULT GetNetwork(
        [out, retval] INetwork **ppNetwork);

    [propget, id(2)]
    HRESULT IsConnectedToInternet(
        [out, retval] VARIANT_BOOL *pbIsConnected);

    [propget, id(3)]
    HRESULT IsConnected(
        [out, retval] VARIANT_BOOL *pbIsConnected);

    [id(4)]
    HRESULT GetConnectivity(
        [out, retval] NLM_CONNECTIVITY *pConnectivity);

    [id(5)]
    HRESULT GetConnectionId(
        [out, retval] GUID *pgdConnectionId);

    [id(6)]
    HRESULT GetAdapterId(
        [out, retval] GUID *pgdAdapterId);

    [id(7)]
    HRESULT GetDomainType(
        [out, retval] NLM_DOMAIN_TYPE *pDomainType);
}

[
    object,
    oleautomation,
    pointer_default(unique),
    dual,
    uuid(dcb00002-570f-4a9b-8d69-199fdba5723b)
]
interface INetwork : IDispatch
{
    typedef enum NLM_NETWORK_CATEGORY
    {
        NLM_NETWORK_CATEGORY_PUBLIC               = 0x00,
        NLM_NETWORK_CATEGORY_PRIVATE              = 0x01,
        NLM_NETWORK_CATEGORY_DOMAIN_AUTHENTICATED = 0x02
    } NLM_NETWORK_CATEGORY;

    [id(1)]
    HRESULT GetName(
        [out, string, retval] BSTR *pszNetworkName);

    [id(2)]
    HRESULT SetName(
        [in, string] BSTR szNetworkNewName);

    [id(3)]
    HRESULT GetDescription(
        [out, string, retval] BSTR *pszDescription);

    [id(4)]
    HRESULT SetDescription(
        [in, string] BSTR szDescription);

    [id(5)]
    HRESULT GetNetworkId(
        [out, retval] GUID *pgdGuidNetworkId);

    [id(6)]
    HRESULT GetDomainType(
        [out, retval] NLM_DOMAIN_TYPE *pNetworkType);

    [id(7)]
    HRESULT GetNetworkConnections(
        [out, retval] IEnumNetworkConnections **ppEnumNetworkConnection);

    [id(8)]
    HRESULT GetTimeCreatedAndConnected(
        [out] DWORD *pdwLowDateTimeCreated,
        [out] DWORD *pdwHighDateTimeCreated,
        [out] DWORD *pdwLowDateTimeConnected,
        [out] DWORD *pdwHighDateTimeConnected);

    [propget, id(9)]
    HRESULT IsConnectedToInternet(
        [out, retval] VARIANT_BOOL *pbIsConnected);

    [propget, id(10)]
    HRESULT IsConnected(
        [out, retval] VARIANT_BOOL *pbIsConnected);

    [id(11)]
    HRESULT GetConnectivity(
        [out, retval] NLM_CONNECTIVITY *pConnectivity);

    [id(12)]
    HRESULT GetCategory(
        [out, retval] NLM_NETWORK_CATEGORY *pCategory);

    [id(13)]
    HRESULT SetCategory(
        [in] NLM_NETWORK_CATEGORY NewCategory);
}
