/*
 * Copyright (C) 2021 Alistair Leslie-Hughes
 * Copyright (C) 2023 Mohamad Al-Jaf
 *
 * 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
 */

#ifdef __WIDL__
#pragma winrt ns_prefix
#endif

import "inspectable.idl";
import "asyncinfo.idl";
import "eventtoken.idl";
import "windowscontracts.idl";
import "windows.foundation.idl";
import "windows.networking.idl";
import "windows.storage.streams.idl";

namespace Windows.Foundation
{
    interface IClosable;

    runtimeclass Uri;
}

namespace Windows.Networking
{
    typedef enum DomainNameType DomainNameType;
    typedef enum HostNameSortOptions HostNameSortOptions;

    runtimeclass EndpointPair;
    runtimeclass HostName;
}

namespace Windows.Networking.Connectivity
{
    runtimeclass ConnectionCost;
    runtimeclass ConnectionProfile;
    runtimeclass DataPlanStatus;
    runtimeclass DataPlanUsage;
    runtimeclass DataUsage;
    runtimeclass IPInformation;
    runtimeclass LanIdentifier;
    runtimeclass LanIdentifierData;
    runtimeclass NetworkAdapter;
    runtimeclass NetworkInformation;
    runtimeclass NetworkItem;
    runtimeclass NetworkSecuritySettings;
    runtimeclass ProxyConfiguration;

    typedef enum NetworkAuthenticationType NetworkAuthenticationType;
    typedef enum NetworkConnectivityLevel NetworkConnectivityLevel;
    typedef enum NetworkCostType NetworkCostType;
    typedef enum NetworkEncryptionType NetworkEncryptionType;
    typedef enum NetworkTypes NetworkTypes;
    typedef enum RoamingStates RoamingStates;

    declare
    {
        interface Windows.Foundation.AsyncOperationCompletedHandler<Windows.Networking.Connectivity.ConnectionProfile *>;
        interface Windows.Foundation.AsyncOperationCompletedHandler<Windows.Networking.Connectivity.ProxyConfiguration *>;
        interface Windows.Foundation.IAsyncOperation<Windows.Networking.Connectivity.ConnectionProfile *>;
        interface Windows.Foundation.IAsyncOperation<Windows.Networking.Connectivity.ProxyConfiguration *>;
        interface Windows.Foundation.Collections.IIterable<Windows.Networking.EndpointPair *>;
        interface Windows.Foundation.Collections.IVectorView<Windows.Networking.Connectivity.ConnectionProfile *>;
        interface Windows.Foundation.Collections.IVectorView<Windows.Networking.Connectivity.LanIdentifier *>;
        interface Windows.Foundation.Collections.IVectorView<Windows.Networking.HostName *>;
        interface Windows.Foundation.Collections.IVectorView<Windows.Networking.EndpointPair *>;
    }

    [
        contract(Windows.Foundation.UniversalApiContract, 1.0),
    ]
    enum NetworkAuthenticationType
    {
        None            = 0,
        Unknown         = 1,
        Open80211       = 2,
        SharedKey80211  = 3,
        Wpa             = 4,
        WpaPsk          = 5,
        WpaNone         = 6,
        Rsna            = 7,
        RsnaPsk         = 8,
        Ihv             = 9,
    };

    [
        contract(Windows.Foundation.UniversalApiContract, 1.0),
    ]
    enum NetworkConnectivityLevel
    {
        None                        = 0,
        LocalAccess                 = 1,
        ConstrainedInternetAccess   = 2,
        InternetAccess              = 3,
    };

    [
        contract(Windows.Foundation.UniversalApiContract, 1.0),
    ]
    enum NetworkCostType
    {
        Unknown         = 0,
        Unrestricted    = 1,
        Fixed           = 2,
        Variable        = 3,
    };

    [
        contract(Windows.Foundation.UniversalApiContract, 1.0),
    ]
    enum NetworkEncryptionType
    {
        None        = 0,
        Unknown     = 1,
        Wep         = 2,
        Wep40       = 3,
        Wep104      = 4,
        Tkip        = 5,
        Ccmp        = 6,
        WpaUseGroup = 7,
        RsnUseGroup = 8,
        Ihv         = 9,
    };

    [
        contract(Windows.Foundation.UniversalApiContract, 1.0),
        flags,
    ]
    enum NetworkTypes
    {
        None            = 0x0,
        Internet        = 0x1,
        PrivateNetwork  = 0x2,
    };

    [
        contract(Windows.Foundation.UniversalApiContract, 1.0),
        flags,
    ]
    enum RoamingStates
    {
        None        = 0x0,
        NotRoaming  = 0x1,
        Roaming     = 0x2,
    };

    [
        contract(Windows.Foundation.UniversalApiContract, 1.0),
        uuid(71ba143f-598e-49d0-84eb-8febaedcc195),
    ]
    delegate HRESULT NetworkStatusChangedEventHandler([in] IInspectable *sender);

    [
        contract(Windows.Foundation.UniversalApiContract, 1.0),
        exclusiveto(Windows.Networking.Connectivity.ConnectionCost),
        uuid(bad7d829-3416-4b10-a202-bac0b075bdae),
    ]
    interface IConnectionCost : IInspectable
    {
        [propget] HRESULT NetworkCostType([out, retval] Windows.Networking.Connectivity.NetworkCostType *value);
        [propget] HRESULT Roaming([out, retval] boolean *value);
        [propget] HRESULT OverDataLimit([out, retval] boolean *value);
        [propget] HRESULT ApproachingDataLimit([out, retval] boolean *value);
    }

    [
        contract(Windows.Foundation.UniversalApiContract, 1.0),
        exclusiveto(Windows.Networking.Connectivity.ConnectionProfile),
        uuid(71ba143c-598e-49d0-84eb-8febaedcc195),
    ]
    interface IConnectionProfile : IInspectable
    {
        [propget] HRESULT ProfileName([out, retval] HSTRING *value);
        HRESULT GetNetworkConnectivityLevel([out, retval] Windows.Networking.Connectivity.NetworkConnectivityLevel *value);
        HRESULT GetNetworkNames([out, retval] Windows.Foundation.Collections.IVectorView<HSTRING> **value);
        HRESULT GetConnectionCost([out, retval] Windows.Networking.Connectivity.ConnectionCost **value);
        HRESULT GetDataPlanStatus([out, retval] Windows.Networking.Connectivity.DataPlanStatus **value);
        [propget] HRESULT NetworkAdapter([out, retval] Windows.Networking.Connectivity.NetworkAdapter **value);
        HRESULT GetLocalUsage([in] Windows.Foundation.DateTime start, [in] Windows.Foundation.DateTime end,
                [out, retval] Windows.Networking.Connectivity.DataUsage **value);
        HRESULT GetLocalUsagePerRoamingStates([in] Windows.Foundation.DateTime start,
                [in] Windows.Foundation.DateTime end, [in] Windows.Networking.Connectivity.RoamingStates states,
                [out, retval] Windows.Networking.Connectivity.DataUsage **value);
        [propget] HRESULT NetworkSecuritySettings([out, retval] Windows.Networking.Connectivity.NetworkSecuritySettings **value);
    }

    [
        contract(Windows.Foundation.UniversalApiContract, 1.0),
        exclusiveto(Windows.Networking.Connectivity.DataPlanStatus),
        uuid(977a8b8c-3885-40f3-8851-42cd2bd568bb),
    ]
    interface IDataPlanStatus : IInspectable
    {
        [propget] HRESULT DataPlanUsage([out, retval] Windows.Networking.Connectivity.DataPlanUsage **value);
        [propget] HRESULT DataLimitInMegabytes([out, retval] Windows.Foundation.IReference<UINT32> **value);
        [propget] HRESULT InboundBitsPerSecond([out, retval] Windows.Foundation.IReference<UINT64> **value);
        [propget] HRESULT OutboundBitsPerSecond([out, retval] Windows.Foundation.IReference<UINT64> **value);
        [propget] HRESULT NextBillingCycle([out, retval] Windows.Foundation.IReference<Windows.Foundation.DateTime> **value);
        [propget] HRESULT MaxTransferSizeInMegabytes([out, retval] Windows.Foundation.IReference<UINT32> **value);
    }

    [
        contract(Windows.Foundation.UniversalApiContract, 1.0),
        exclusiveto(Windows.Networking.Connectivity.DataPlanUsage),
        uuid(b921492d-3b44-47ff-b361-be59e69ed1b0),
    ]
    interface IDataPlanUsage : IInspectable
    {
        [propget] HRESULT MegabytesUsed([out, retval] UINT32 *value);
        [propget] HRESULT LastSyncTime([out, retval] Windows.Foundation.DateTime *value);
    }

    [
        contract(Windows.Foundation.UniversalApiContract, 1.0),
        exclusiveto(Windows.Networking.Connectivity.DataUsage),
        uuid(c1431dd3-b146-4d39-b959-0c69b096c512),
    ]
    interface IDataUsage : IInspectable
    {
        [propget] HRESULT BytesSent([out, retval] UINT64 *value);
        [propget] HRESULT BytesReceived([out, retval] UINT64 *value);
    }

    [
        contract(Windows.Foundation.UniversalApiContract, 1.0),
        exclusiveto(Windows.Networking.Connectivity.IPInformation),
        uuid(d85145e0-138f-47d7-9b3a-36bb488cef33),
    ]
    interface IIPInformation : IInspectable
    {
        [propget] HRESULT NetworkAdapter([out, retval] Windows.Networking.Connectivity.NetworkAdapter **value);
        [propget] HRESULT PrefixLength([out, retval] Windows.Foundation.IReference<BYTE> **value);
    }

    [
        contract(Windows.Foundation.UniversalApiContract, 1.0),
        exclusiveto(Windows.Networking.Connectivity.LanIdentifier),
        uuid(48aa53aa-1108-4546-a6cb-9a74da4b7ba0),
    ]
    interface ILanIdentifier : IInspectable
    {
        [propget] HRESULT InfrastructureId([out, retval] Windows.Networking.Connectivity.LanIdentifierData **value);
        [propget] HRESULT PortId([out, retval] Windows.Networking.Connectivity.LanIdentifierData **value);
        [propget] HRESULT NetworkAdapterId([out, retval] GUID *value);
    }

    [
        contract(Windows.Foundation.UniversalApiContract, 1.0),
        exclusiveto(Windows.Networking.Connectivity.LanIdentifierData),
        uuid(a74e83c3-d639-45be-a36a-c4e4aeaf6d9b),
    ]
    interface ILanIdentifierData : IInspectable
    {
        [propget] HRESULT Type([out, retval] UINT32 *value);
        [propget] HRESULT Value([out,retval] Windows.Foundation.Collections.IVectorView<BYTE> **value);
    }

    [
        contract(Windows.Foundation.UniversalApiContract, 1.0),
        exclusiveto(Windows.Networking.Connectivity.NetworkAdapter),
        uuid(3b542e03-5388-496c-a8a3-affd39aec2e6),
    ]
    interface INetworkAdapter : IInspectable
    {
        [propget] HRESULT OutboundMaxBitsPerSecond([out, retval] UINT64 *value);
        [propget] HRESULT InboundMaxBitsPerSecond([out, retval] UINT64 *value);
        [propget] HRESULT IanaInterfaceType([out, retval] UINT32 *value);
        [propget] HRESULT NetworkItem([out, retval] Windows.Networking.Connectivity.NetworkItem **value);
        [propget] HRESULT NetworkAdapterId([out, retval] GUID *value);
        HRESULT GetConnectedProfileAsync([out, retval] Windows.Foundation.IAsyncOperation<Windows.Networking.Connectivity.ConnectionProfile *> **value);
    }

    [
        contract(Windows.Foundation.UniversalApiContract, 1.0),
        exclusiveto(Windows.Networking.Connectivity.NetworkInformation),
        uuid(5074f851-950d-4165-9c15-365619481eea),
    ]
    interface INetworkInformationStatics : IInspectable
    {
        HRESULT GetConnectionProfiles([out, retval] Windows.Foundation.Collections.IVectorView<Windows.Networking.Connectivity.ConnectionProfile *> **value);
        HRESULT GetInternetConnectionProfile([out, retval] Windows.Networking.Connectivity.ConnectionProfile **value);
        HRESULT GetLanIdentifiers([out, retval] Windows.Foundation.Collections.IVectorView<Windows.Networking.Connectivity.LanIdentifier *> **value);
        HRESULT GetHostNames([out, retval] Windows.Foundation.Collections.IVectorView<Windows.Networking.HostName *> **value);
        HRESULT GetProxyConfigurationAsync([in] Windows.Foundation.Uri *uri,
                [out, retval] Windows.Foundation.IAsyncOperation<Windows.Networking.Connectivity.ProxyConfiguration *> **value);
        HRESULT GetSortedEndpointPairs([in] Windows.Foundation.Collections.IIterable<Windows.Networking.EndpointPair *> *endpoint,
                [in] Windows.Networking.HostNameSortOptions options,
                [out, retval] Windows.Foundation.Collections.IVectorView<Windows.Networking.EndpointPair *> **value);
        [eventadd] HRESULT NetworkStatusChanged([in] Windows.Networking.Connectivity.NetworkStatusChangedEventHandler *handler,
                        [out, retval] EventRegistrationToken *cookie);
        [eventremove] HRESULT NetworkStatusChanged([in] EventRegistrationToken cookie);
    }

    [
        contract(Windows.Foundation.UniversalApiContract, 1.0),
        exclusiveto(Windows.Networking.Connectivity.NetworkInformation),
        uuid(01bc4d39-f5e0-4567-a28c-42080c831b2b),
    ]
    interface INetworkItem : IInspectable
    {
        [propget] HRESULT NetworkId([out, retval] GUID *value);
        HRESULT GetNetworkTypes([out, retval] NetworkTypes *value);
    }

    [
        contract(Windows.Foundation.UniversalApiContract, 1.0),
        exclusiveto(Windows.Networking.Connectivity.NetworkSecuritySettings),
        uuid(7ca07e8d-917b-4b5f-b84d-28f7a5ac5402),
    ]
    interface INetworkSecuritySettings : IInspectable
    {
        [propget] HRESULT NetworkAuthenticationType([out, retval] Windows.Networking.Connectivity.NetworkAuthenticationType *value);
        [propget] HRESULT NetworkEncryptionType([out, retval] Windows.Networking.Connectivity.NetworkEncryptionType *value);
    }

    [
        contract(Windows.Foundation.UniversalApiContract, 1.0),
        exclusiveto(Windows.Networking.Connectivity.NetworkSecuritySettings),
        uuid(ef3a60b4-9004-4dd6-b7d8-b3e502f4aad0),
    ]
    interface IProxyConfiguration : IInspectable
    {
        [propget] HRESULT ProxyUris([out, retval] Windows.Foundation.Collections.IVectorView<Windows.Foundation.Uri *> **value);
        [propget] HRESULT CanConnectDirectly([out, retval] boolean *value);
    }

    [
        contract(Windows.Foundation.UniversalApiContract, 1.0),
        marshaling_behavior(agile),
    ]
    runtimeclass ConnectionCost
    {
        [default] interface Windows.Networking.Connectivity.IConnectionCost;
        [contract(Windows.Foundation.UniversalApiContract, 1.0)] interface Windows.Networking.Connectivity.IConnectionCost2;
    }

    [
        contract(Windows.Foundation.UniversalApiContract, 1.0),
        marshaling_behavior(agile),
    ]
    runtimeclass ConnectionProfile
    {
        [default] interface Windows.Networking.Connectivity.IConnectionProfile;
        [contract(Windows.Foundation.UniversalApiContract, 1.0)] interface Windows.Networking.Connectivity.IConnectionProfile2;
        [contract(Windows.Foundation.UniversalApiContract, 1.0)] interface Windows.Networking.Connectivity.IConnectionProfile3;
        [contract(Windows.Foundation.UniversalApiContract, 5.0)] interface Windows.Networking.Connectivity.IConnectionProfile4;
        [contract(Windows.Foundation.UniversalApiContract, 7.0)] interface Windows.Networking.Connectivity.IConnectionProfile5;
    }

    [
        contract(Windows.Foundation.UniversalApiContract, 1.0),
        marshaling_behavior(agile),
    ]
    runtimeclass DataPlanStatus
    {
        [default] interface Windows.Networking.Connectivity.IDataPlanStatus;
    }

    [
        contract(Windows.Foundation.UniversalApiContract, 1.0),
        marshaling_behavior(agile),
    ]
    runtimeclass DataPlanUsage
    {
        [default] interface Windows.Networking.Connectivity.IDataPlanUsage;
    }

    [
        contract(Windows.Foundation.UniversalApiContract, 1.0),
        marshaling_behavior(agile),
    ]
    runtimeclass DataUsage
    {
        [default] interface Windows.Networking.Connectivity.IDataUsage;
    }

    [
        contract(Windows.Foundation.UniversalApiContract, 1.0),
        marshaling_behavior(agile),
    ]
    runtimeclass IPInformation
    {
        [default] interface Windows.Networking.Connectivity.IIPInformation;
    }

    [
        contract(Windows.Foundation.UniversalApiContract, 1.0),
        marshaling_behavior(agile),
    ]
    runtimeclass LanIdentifier
    {
        [default] interface Windows.Networking.Connectivity.ILanIdentifier;
    }

    [
        contract(Windows.Foundation.UniversalApiContract, 1.0),
        marshaling_behavior(agile),
    ]
    runtimeclass LanIdentifierData
    {
        [default] interface Windows.Networking.Connectivity.ILanIdentifierData;
    }

    [
        contract(Windows.Foundation.UniversalApiContract, 1.0),
        marshaling_behavior(agile),
    ]
    runtimeclass NetworkAdapter
    {
        [default] interface Windows.Networking.Connectivity.INetworkAdapter;
    }

    [
        contract(Windows.Foundation.UniversalApiContract, 1.0),
        marshaling_behavior(agile),
        static(Windows.Networking.Connectivity.INetworkInformationStatics, Windows.Foundation.UniversalApiContract, 1.0),
    ]
    runtimeclass NetworkInformation
    {
    }

    [
        contract(Windows.Foundation.UniversalApiContract, 1.0),
        marshaling_behavior(agile),
    ]
    runtimeclass NetworkItem
    {
        [default] interface Windows.Networking.Connectivity.INetworkItem;
    }

    [
        contract(Windows.Foundation.UniversalApiContract, 1.0),
        marshaling_behavior(agile),
    ]
    runtimeclass NetworkSecuritySettings
    {
        [default] interface Windows.Networking.Connectivity.INetworkSecuritySettings;
    }

    [
        contract(Windows.Foundation.UniversalApiContract, 1.0),
        marshaling_behavior(agile),
    ]
    runtimeclass ProxyConfiguration
    {
        [default] interface Windows.Networking.Connectivity.IProxyConfiguration;
    }
}
