/*
 * 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;
    runtimeclass WwanConnectionProfileDetails;
    runtimeclass WlanConnectionProfileDetails;
    runtimeclass NetworkUsage;
    runtimeclass ConnectivityInterval;

    typedef enum NetworkAuthenticationType NetworkAuthenticationType;
    typedef enum NetworkConnectivityLevel NetworkConnectivityLevel;
    typedef enum NetworkCostType NetworkCostType;
    typedef enum NetworkEncryptionType NetworkEncryptionType;
    typedef enum NetworkTypes NetworkTypes;
    typedef enum RoamingStates RoamingStates;
    typedef enum DomainConnectivityLevel DomainConnectivityLevel;
    typedef enum DataUsageGranularity DataUsageGranularity;
    typedef enum TriStates TriStates;
    typedef enum WwanNetworkRegistrationState WwanNetworkRegistrationState;
    typedef enum WwanDataClass WwanDataClass;

    typedef struct NetworkUsageStates NetworkUsageStates;

    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 *>;
        interface Windows.Foundation.Collections.IVectorView<Windows.Networking.Connectivity.NetworkUsage*>;
        interface Windows.Foundation.IAsyncOperation<Windows.Foundation.Collections.IVectorView<Windows.Networking.Connectivity.NetworkUsage*>*>;
        interface Windows.Foundation.Collections.IVectorView<Windows.Networking.Connectivity.ConnectivityInterval*>;
        interface Windows.Foundation.IAsyncOperation<Windows.Foundation.Collections.IVectorView<Windows.Networking.Connectivity.ConnectivityInterval*>*>;
        interface Windows.Foundation.AsyncOperationCompletedHandler<Windows.Foundation.Collections.IVectorView<Windows.Networking.Connectivity.ConnectivityInterval*>*>;
        interface Windows.Foundation.AsyncOperationCompletedHandler<Windows.Foundation.Collections.IVectorView<Windows.Networking.Connectivity.NetworkUsage*>*>;
    }

    [
        contractversion(2.0),
    ]
    apicontract WwanContract
    {
    }

    [
        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),
    ]
    enum DomainConnectivityLevel
    {
        None            = 0,
        Unauthenticated = 1,
        Authenticated   = 2
    };

    [
        contract(Windows.Foundation.UniversalApiContract, 1.0),
    ]
    enum DataUsageGranularity
    {
        PerMinute = 0,
        PerHour   = 1,
        PerDay    = 2,
        Total     = 3
    };

    [
        contract(Windows.Foundation.UniversalApiContract, 1.0),
    ]
    enum TriStates
    {
        DoNotCare = 0,
        No        = 1,
        Yes       = 2
    };

    [
        contract(Windows.Networking.Connectivity.WwanContract, 1.0),
    ]
    enum WwanNetworkRegistrationState
    {
        None         = 0,
        Deregistered = 1,
        Searching    = 2,
        Home         = 3,
        Roaming      = 4,
        Partner      = 5,
        Denied       = 6
    };

    [
        contract(Windows.Networking.Connectivity.WwanContract, 1.0),
        flags,
    ]
    enum WwanDataClass
    {
        None           = 0x0,
        Gprs           = 0x1,
        Edge           = 0x2,
        Umts           = 0x4,
        Hsdpa          = 0x8,
        Hsupa          = 0x10,
        LteAdvanced    = 0x20,
        Cdma1xRtt      = 0x10000,
        Cdma1xEvdo     = 0x20000,
        Cdma1xEvdoRevA = 0x40000,
        Cdma1xEvdv     = 0x80000,
        Cdma3xRtt      = 0x100000,
        Cdma1xEvdoRevB = 0x200000,
        CdmaUmb        = 0x400000,
        Custom         = 0x80000000
    };

    [
        contract(Windows.Foundation.UniversalApiContract, 1.0),
    ]
    struct NetworkUsageStates
    {
        Windows.Networking.Connectivity.TriStates Roaming;
        Windows.Networking.Connectivity.TriStates Shared;
    };

    [
        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.ConnectionProfile),
        uuid(e2045145-4c9f-400c-9150-7ec7d6e2888a),
    ]
    interface IConnectionProfile2 : IInspectable
    {
        [propget] HRESULT IsWwanConnectionProfile([out, retval] boolean *value);
        [propget] HRESULT IsWlanConnectionProfile([out, retval] boolean *value);
        [propget] HRESULT WwanConnectionProfileDetails([out, retval] Windows.Networking.Connectivity.WwanConnectionProfileDetails **value);
        [propget] HRESULT WlanConnectionProfileDetails([out, retval] Windows.Networking.Connectivity.WlanConnectionProfileDetails **value);
        [propget] HRESULT ServiceProviderGuid([out, retval] Windows.Foundation.IReference<GUID> **value);
        HRESULT GetSignalBars([out, retval] Windows.Foundation.IReference<BYTE> **value);
        HRESULT GetDomainConnectivityLevel([out, retval] Windows.Networking.Connectivity.DomainConnectivityLevel *value);
        HRESULT GetNetworkUsageAsync([in] Windows.Foundation.DateTime time_start, [in] Windows.Foundation.DateTime time_end,
                [in] Windows.Networking.Connectivity.DataUsageGranularity granularity, [in] Windows.Networking.Connectivity.NetworkUsageStates states,
                [out, retval] Windows.Foundation.IAsyncOperation<Windows.Foundation.Collections.IVectorView<Windows.Networking.Connectivity.NetworkUsage*>*> **value);
        HRESULT GetConnectivityIntervalsAsync([in] Windows.Foundation.DateTime time_start, [in] Windows.Foundation.DateTime time_end,
                [in] Windows.Networking.Connectivity.NetworkUsageStates states,
                [out, retval] Windows.Foundation.IAsyncOperation<Windows.Foundation.Collections.IVectorView<Windows.Networking.Connectivity.ConnectivityInterval*>*> **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.NetworkItem),
        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.ProxyConfiguration),
        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),
        exclusiveto(Windows.Networking.Connectivity.NetworkUsage),
        uuid(49da8fce-9985-4927-bf5b-072b5c65f8d9),
    ]
    interface INetworkUsage : IInspectable
    {
        [propget] HRESULT BytesSent([out, retval] UINT64 *value);
        [propget] HRESULT BytesReceived([out, retval] UINT64 *value);
        [propget] HRESULT ConnectionDuration([out, retval] Windows.Foundation.TimeSpan *duration);
    }

    [
        contract(Windows.Foundation.UniversalApiContract, 1.0),
        exclusiveto(Windows.Networking.Connectivity.ConnectivityInterval),
        uuid(4faa3fff-6746-4824-a964-eed8e87f8709),
    ]
    interface IConnectivityInterval : IInspectable
    {
        [propget] HRESULT StartTime([out, retval] Windows.Foundation.DateTime *time_start);
        [propget] HRESULT ConnectionDuration([out, retval] Windows.Foundation.TimeSpan *duration);
    }

    [
        contract(Windows.Networking.Connectivity.WwanContract, 1.0),
        exclusiveto(Windows.Networking.Connectivity.WwanConnectionProfileDetails),
        uuid(0e4da8fe-835f-4df3-82fd-df556ebc09ef),
    ]
    interface IWwanConnectionProfileDetails : IInspectable
    {
        [propget] HRESULT HomeProviderId([out, retval] HSTRING *value);
        [propget] HRESULT AccessPointName([out, retval] HSTRING *value);
        HRESULT GetNetworkRegistrationState([out, retval] Windows.Networking.Connectivity.WwanNetworkRegistrationState *value);
        HRESULT GetCurrentDataClass([out, retval] Windows.Networking.Connectivity.WwanDataClass *value);
    }

    [
        contract(Windows.Foundation.UniversalApiContract, 1.0),
        exclusiveto(Windows.Networking.Connectivity.WlanConnectionProfileDetails),
        uuid(562098cb-b35a-4bf1-a884-b7557e88ff86),
    ]
    interface IWlanConnectionProfileDetails : IInspectable
    {
        HRESULT GetConnectedSsid([out] [retval] HSTRING *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;
    }

    [
        contract(Windows.Networking.Connectivity.WwanContract, 1.0),
        marshaling_behavior(agile),
    ]
    runtimeclass WwanConnectionProfileDetails
    {
        [default] interface Windows.Networking.Connectivity.IWwanConnectionProfileDetails;
        [contract(Windows.Networking.Connectivity.WwanContract, 2.0)] interface Windows.Networking.Connectivity.IWwanConnectionProfileDetails2;
    }

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

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

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