// Licensed under the Apache License, Version 2.0
// <LICENSE-APACHE or http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your option.
// All files in the project carrying such notice may not be copied, modified, or distributed
// except according to those terms.
use shared::guiddef::GUID;
use shared::minwindef::ULONG;
use um::unknwnbase::{IUnknown, IUnknownVtbl};
use um::winnt::{BOOLEAN, HRESULT, LONG, LPCWSTR, LPWSTR};
ENUM!{enum DOT11_ADHOC_CIPHER_ALGORITHM {
    DOT11_ADHOC_CIPHER_ALGO_INVALID = -1i32 as u32,
    DOT11_ADHOC_CIPHER_ALGO_NONE = 0,
    DOT11_ADHOC_CIPHER_ALGO_CCMP = 0x4,
    DOT11_ADHOC_CIPHER_ALGO_WEP = 0x101,
}}
ENUM!{enum DOT11_ADHOC_AUTH_ALGORITHM {
    DOT11_ADHOC_AUTH_ALGO_INVALID = -1i32 as u32,
    DOT11_ADHOC_AUTH_ALGO_80211_OPEN = 1,
    DOT11_ADHOC_AUTH_ALGO_RSNA_PSK = 7,
}}
ENUM!{enum DOT11_ADHOC_NETWORK_CONNECTION_STATUS {
    DOT11_ADHOC_NETWORK_CONNECTION_STATUS_INVALID = 0,
    DOT11_ADHOC_NETWORK_CONNECTION_STATUS_DISCONNECTED = 11,
    DOT11_ADHOC_NETWORK_CONNECTION_STATUS_CONNECTING = 12,
    DOT11_ADHOC_NETWORK_CONNECTION_STATUS_CONNECTED = 13,
    DOT11_ADHOC_NETWORK_CONNECTION_STATUS_FORMED = 14,
}}
ENUM!{enum DOT11_ADHOC_CONNECT_FAIL_REASON {
    DOT11_ADHOC_CONNECT_FAIL_DOMAIN_MISMATCH = 0,
    DOT11_ADHOC_CONNECT_FAIL_PASSPHRASE_MISMATCH = 1,
    DOT11_ADHOC_CONNECT_FAIL_OTHER = 2,
}}
RIDL!{#[uuid(0x8f10cc26, 0xcf0d, 0x42a0, 0xac, 0xbe, 0xe2, 0xde, 0x70, 0x07, 0x38, 0x4d)]
interface IDot11AdHocManager(IDot11AdHocManagerVtbl): IUnknown(IUnknownVtbl) {
    fn CreateNetwork(
        Name: LPCWSTR,
        Password: LPCWSTR,
        GeographicalId: LONG,
        pInterface: *mut IDot11AdHocInterface,
        pSecurity: *mut IDot11AdHocSecuritySettings,
        pContextGuid: *mut GUID,
        pIAdHoc: *mut *mut IDot11AdHocNetwork,
    ) -> HRESULT,
    fn CommitCreatedNetwork(
        pIAdHoc: *mut IDot11AdHocNetwork,
        fSaveProfile: BOOLEAN,
        fMakeSavedProfileUserSpecific: BOOLEAN,
    ) -> HRESULT,
    fn GetIEnumDot11AdHocNetworks(
        pContextGuid: *mut GUID,
        ppEnum: *mut *mut IEnumDot11AdHocNetworks,
    ) -> HRESULT,
    fn GetIEnumDot11AdHocInterfaces(
        ppEnum: *mut *mut IEnumDot11AdHocInterfaces,
    ) -> HRESULT,
    fn GetNetwork(
        NetworkSignature: *mut GUID,
        pNetwork: *mut *mut IDot11AdHocNetwork,
    ) -> HRESULT,
}}
RIDL!{#[uuid(0x8f10cc27, 0xcf0d, 0x42a0, 0xac, 0xbe, 0xe2, 0xde, 0x70, 0x07, 0x38, 0x4d)]
interface IDot11AdHocManagerNotificationSink(IDot11AdHocManagerNotificationSinkVtbl):
    IUnknown(IUnknownVtbl) {
    fn OnNetworkAdd(
        pIAdHocNetwork: *mut IDot11AdHocNetwork,
    ) -> HRESULT,
    fn OnNetworkRemove(
        Signature: *mut GUID,
    ) -> HRESULT,
    fn OnInterfaceAdd(
        pIAdHocInterface: *mut IDot11AdHocInterface,
    ) -> HRESULT,
    fn OnInterfaceRemove(
        Signature: *mut GUID,
    ) -> HRESULT,
}}
RIDL!{#[uuid(0x8f10cc28, 0xcf0d, 0x42a0, 0xac, 0xbe, 0xe2, 0xde, 0x70, 0x07, 0x38, 0x4d)]
interface IEnumDot11AdHocNetworks(IEnumDot11AdHocNetworksVtbl): IUnknown(IUnknownVtbl) {
    fn Next(
        cElt: ULONG,
        rgElt: *mut *mut IDot11AdHocNetwork,
        pcEltFetched: *mut ULONG,
    ) -> HRESULT,
    fn Skip(
        cElt: ULONG,
    ) -> HRESULT,
    fn Reset() -> HRESULT,
    fn Clone(
        ppEnum: *mut *mut IEnumDot11AdHocNetworks,
    ) -> HRESULT,
}}
RIDL!{#[uuid(0x8f10cc29, 0xcf0d, 0x42a0, 0xac, 0xbe, 0xe2, 0xde, 0x70, 0x07, 0x38, 0x4d)]
interface IDot11AdHocNetwork(IDot11AdHocNetworkVtbl): IUnknown(IUnknownVtbl) {
    fn GetStatus(
        eStatus: *mut DOT11_ADHOC_NETWORK_CONNECTION_STATUS,
    ) -> HRESULT,
    fn GetSSID(
        ppszwSSID: *mut LPWSTR,
    ) -> HRESULT,
    fn HasProfile(
        pf11d: *mut BOOLEAN,
    ) -> HRESULT,
    fn GetProfileName(
        ppszwProfileName: *mut LPWSTR,
    ) -> HRESULT,
    fn DeleteProfile() -> HRESULT,
    fn GetSignalQuality(
        puStrengthValue: *mut ULONG,
        puStrengthMax: *mut ULONG,
    ) -> HRESULT,
    fn GetSecuritySetting(
        pAdHocSecuritySetting: *mut *mut IDot11AdHocSecuritySettings,
    ) -> HRESULT,
    fn GetContextGuid(
        pContextGuid: *mut GUID,
    ) -> HRESULT,
    fn GetSignature(
        pSignature: *mut GUID,
    ) -> HRESULT,
    fn GetInterface(
        pAdHocInterface: *mut *mut IDot11AdHocInterface,
    ) -> HRESULT,
    fn Connect(
        Passphrase: LPCWSTR,
        GeographicalId: LONG,
        fSaveProfile: BOOLEAN,
        fMakeSavedProfileUserSpecific: BOOLEAN,
    ) -> HRESULT,
    fn Disconnect() -> HRESULT,
}}
RIDL!{#[uuid(0x8f10cc2a, 0xcf0d, 0x42a0, 0xac, 0xbe, 0xe2, 0xde, 0x70, 0x07, 0x38, 0x4d)]
interface IDot11AdHocNetworkNotificationSink(IDot11AdHocNetworkNotificationSinkVtbl):
    IUnknown(IUnknownVtbl) {
    fn OnStatusChange(
        eStatus: DOT11_ADHOC_NETWORK_CONNECTION_STATUS,
    ) -> HRESULT,
    fn OnConnectFail(
        eFailReason: DOT11_ADHOC_CONNECT_FAIL_REASON,
    ) -> HRESULT,
}}
RIDL!{#[uuid(0x8f10cc2b, 0xcf0d, 0x42a0, 0xac, 0xbe, 0xe2, 0xde, 0x70, 0x07, 0x38, 0x4d)]
interface IDot11AdHocInterface(IDot11AdHocInterfaceVtbl): IUnknown(IUnknownVtbl) {
    fn GetDeviceSignature(
        pSignature: *mut GUID,
    ) -> HRESULT,
    fn GetFriendlyName(
        ppszName: *mut LPWSTR,
    ) -> HRESULT,
    fn IsDot11d(
        pf11d: *mut BOOLEAN,
    ) -> HRESULT,
    fn IsAdHocCapable(
        pfAdHocCapable: *mut BOOLEAN,
    ) -> HRESULT,
    fn IsRadioOn(
        pfIsRadioOn: *mut BOOLEAN,
    ) -> HRESULT,
    fn GetActiveNetwork(
        ppNetwork: *mut *mut IDot11AdHocNetwork,
    ) -> HRESULT,
    fn GetIEnumSecuritySettings(
        ppEnum: *mut *mut IEnumDot11AdHocSecuritySettings,
    ) -> HRESULT,
    fn GetIEnumDot11AdHocNetworks(
        pFilterGuid: *mut GUID,
        ppEnum: *mut *mut IEnumDot11AdHocNetworks,
    ) -> HRESULT,
    fn GetStatus(
        pState: *mut DOT11_ADHOC_NETWORK_CONNECTION_STATUS,
    ) -> HRESULT,
}}
RIDL!{#[uuid(0x8f10cc2c, 0xcf0d, 0x42a0, 0xac, 0xbe, 0xe2, 0xde, 0x70, 0x07, 0x38, 0x4d)]
interface IEnumDot11AdHocInterfaces(IEnumDot11AdHocInterfacesVtbl): IUnknown(IUnknownVtbl) {
    fn Next(
        cElt: ULONG,
        rgElt: *mut *mut IDot11AdHocInterface,
        pcEltFetched: *mut ULONG,
    ) -> HRESULT,
    fn Skip(
        cElt: ULONG,
    ) -> HRESULT,
    fn Reset() -> HRESULT,
    fn Clone(
        ppEnum: *mut *mut IEnumDot11AdHocInterfaces,
    ) -> HRESULT,
}}
RIDL!{#[uuid(0x8f10cc2d, 0xcf0d, 0x42a0, 0xac, 0xbe, 0xe2, 0xde, 0x70, 0x07, 0x38, 0x4d)]
interface IEnumDot11AdHocSecuritySettings(IEnumDot11AdHocSecuritySettingsVtbl):
    IUnknown(IUnknownVtbl) {
    fn Next(
        cElt: ULONG,
        rgElt: *mut *mut IDot11AdHocSecuritySettings,
        pcEltFetched: *mut ULONG,
    ) -> HRESULT,
    fn Skip(
        cElt: ULONG,
    ) -> HRESULT,
    fn Reset() -> HRESULT,
    fn Clone(
        ppEnum: *mut *mut IEnumDot11AdHocSecuritySettings,
    ) -> HRESULT,
}}
RIDL!{#[uuid(0x8f10cc2e, 0xcf0d, 0x42a0, 0xac, 0xbe, 0xe2, 0xde, 0x70, 0x07, 0x38, 0x4d)]
interface IDot11AdHocSecuritySettings(IDot11AdHocSecuritySettingsVtbl): IUnknown(IUnknownVtbl) {
    fn GetDot11AuthAlgorithm(
        pAuth: *mut DOT11_ADHOC_AUTH_ALGORITHM,
    ) -> HRESULT,
    fn GetDot11CipherAlgorithm(
        pCipher: *mut DOT11_ADHOC_CIPHER_ALGORITHM,
    ) -> HRESULT,
}}
RIDL!{#[uuid(0x8f10cc2f, 0xcf0d, 0x42a0, 0xac, 0xbe, 0xe2, 0xde, 0x70, 0x07, 0x38, 0x4d)]
interface IDot11AdHocInterfaceNotificationSink(IDot11AdHocInterfaceNotificationSinkVtbl):
    IUnknown(IUnknownVtbl) {
    fn OnConnectionStatusChange(
        eStatus: DOT11_ADHOC_NETWORK_CONNECTION_STATUS,
    ) -> HRESULT,
}}
RIDL!{#[uuid(0xdd06a84f, 0x83bd, 0x4d01, 0x8a, 0xb9, 0x23, 0x89, 0xfe, 0xa0, 0x86, 0x9e)]
class Dot11AdHocManager;}