/*
 * Copyright 2021 Gijs Vermeulen
 *
 * 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.storage.streams.idl";
import "windows.foundation.idl";

namespace Windows.Devices.Enumeration {
    typedef enum DeviceClass DeviceClass;
    typedef enum DeviceInformationKind DeviceInformationKind;
    typedef enum DeviceWatcherStatus DeviceWatcherStatus;
    typedef enum Panel Panel;
    typedef enum DeviceAccessStatus DeviceAccessStatus;

    interface IDeviceInformation;
    interface IDeviceInformationStatics;
    interface IDeviceInformationStatics2;
    interface IDeviceInformationUpdate;
    interface IEnclosureLocation;

    runtimeclass DeviceInformation;
    runtimeclass DeviceInformationCollection;
    runtimeclass DeviceInformationUpdate;
    runtimeclass DeviceThumbnail;
    runtimeclass DeviceWatcher;
    runtimeclass EnclosureLocation;
    runtimeclass DeviceAccessChangedEventArgs;
    runtimeclass DeviceAccessInformation;

    declare
    {
        interface Windows.Foundation.Collections.IVectorView<Windows.Devices.Enumeration.DeviceInformation *>;
        interface Windows.Foundation.Collections.IIterable<Windows.Devices.Enumeration.DeviceInformation *>;
        interface Windows.Foundation.Collections.IIterator<Windows.Devices.Enumeration.DeviceInformation *>;
        interface Windows.Foundation.AsyncOperationCompletedHandler<Windows.Devices.Enumeration.DeviceInformation *>;
        interface Windows.Foundation.AsyncOperationCompletedHandler<Windows.Devices.Enumeration.DeviceInformationCollection *>;
        interface Windows.Foundation.AsyncOperationCompletedHandler<Windows.Devices.Enumeration.DeviceThumbnail *>;
        interface Windows.Foundation.Collections.IMapView<HSTRING, IInspectable *>;
        interface Windows.Foundation.IAsyncOperation<Windows.Devices.Enumeration.DeviceInformation *>;
        interface Windows.Foundation.IAsyncOperation<Windows.Devices.Enumeration.DeviceInformationCollection *>;
        interface Windows.Foundation.IAsyncOperation<Windows.Devices.Enumeration.DeviceThumbnail *>;
        interface Windows.Foundation.TypedEventHandler<Windows.Devices.Enumeration.DeviceWatcher *, IInspectable *>;
        interface Windows.Foundation.TypedEventHandler<Windows.Devices.Enumeration.DeviceWatcher *, Windows.Devices.Enumeration.DeviceInformation *>;
        interface Windows.Foundation.TypedEventHandler<Windows.Devices.Enumeration.DeviceWatcher *, Windows.Devices.Enumeration.DeviceInformationUpdate *>;
        interface Windows.Foundation.TypedEventHandler<Windows.Devices.Enumeration.DeviceAccessInformation *, Windows.Devices.Enumeration.DeviceAccessChangedEventArgs *>;
    }
}

namespace Windows.Devices.Enumeration {
    [contract(Windows.Foundation.UniversalApiContract, 1.0)]
    enum DeviceClass
    {
        All                   = 0,
        AudioCapture          = 1,
        AudioRender           = 2,
        PortableStorageDevice = 3,
        VideoCapture          = 4,
        [contract(Windows.Foundation.UniversalApiContract, 1.0)]
        ImageScanner          = 5,
        [contract(Windows.Foundation.UniversalApiContract, 1.0)]
        Location              = 6,
    };

    [contract(Windows.Foundation.UniversalApiContract, 1.0)]
    enum DeviceInformationKind
    {
        Unknown                      = 0,
        DeviceInterface              = 1,
        DeviceContainer              = 2,
        Device                       = 3,
        DeviceInterfaceClass         = 4,
        AssociationEndpoint          = 5,
        AssociationEndpointContainer = 6,
        AssociationEndpointService   = 7,
        [contract(Windows.Foundation.UniversalApiContract, 7.0)]
        DevicePanel                  = 8,
    };

    enum DeviceWatcherStatus
    {
        Created              = 0,
        Started              = 1,
        EnumerationCompleted = 2,
        Stopping             = 3,
        Stopped              = 4,
        Aborted              = 5,
    };

    enum Panel
    {
        Unknown = 0,
        Front   = 1,
        Back    = 2,
        Top     = 3,
        Bottom  = 4,
        Left    = 5,
        Right   = 6,
    };

    [contract(Windows.Foundation.UniversalApiContract, 1.0)]
    enum DeviceAccessStatus
    {
        Unspecified    = 0,
        Allowed        = 1,
        DeniedByUser   = 2,
        DeniedBySystem = 3,
    };

    [
        exclusiveto(Windows.Devices.Enumeration.DeviceInformation),
        uuid(aba0fb95-4398-489d-8e44-e6130927011f)
    ]
    interface IDeviceInformation : IInspectable
    {
        [propget] HRESULT Id([out, retval] HSTRING *value);
        [propget] HRESULT Name([out, retval] HSTRING *value);
        [propget] HRESULT IsEnabled([out, retval] boolean *value);
        [propget] HRESULT IsDefault([out, retval] boolean *value);
        [propget] HRESULT EnclosureLocation([out, retval] Windows.Devices.Enumeration.EnclosureLocation **value);
        [propget] HRESULT Properties([out, retval] Windows.Foundation.Collections.IMapView<HSTRING, IInspectable *> **value);
        HRESULT Update([in] Windows.Devices.Enumeration.DeviceInformationUpdate *info);
        HRESULT GetThumbnailAsync([out, retval] Windows.Foundation.IAsyncOperation<Windows.Devices.Enumeration.DeviceThumbnail *> **operation);
        HRESULT GetGlyphThumbnailAsync([out, retval] Windows.Foundation.IAsyncOperation<Windows.Devices.Enumeration.DeviceThumbnail *> **operation);
    }

    [
        exclusiveto(Windows.Devices.Enumeration.DeviceInformationUpdate),
        uuid(8f315305-d972-44b7-a37e-9e822c78213b)
    ]
    interface IDeviceInformationUpdate : IInspectable
    {
        [propget] HRESULT Id([out, retval] HSTRING *value);
        [propget] HRESULT Properties([out, retval] Windows.Foundation.Collections.IMapView<HSTRING, IInspectable *> **value);
    }

    [
        exclusiveto(Windows.Devices.Enumeration.DeviceWatcher),
        uuid(c9eab97d-8f6b-4f96-a9f4-abc814e22271),
    ]
    interface IDeviceWatcher : IInspectable
    {
        [eventadd] HRESULT Added([in] Windows.Foundation.TypedEventHandler<Windows.Devices.Enumeration.DeviceWatcher *,
                Windows.Devices.Enumeration.DeviceInformation *> *handler, [out, retval] EventRegistrationToken *token);
        [eventremove] HRESULT Added([in] EventRegistrationToken token);
        [eventadd] HRESULT Updated([in] Windows.Foundation.TypedEventHandler<Windows.Devices.Enumeration.DeviceWatcher *,
                Windows.Devices.Enumeration.DeviceInformationUpdate *> *handler, [out, retval] EventRegistrationToken *token);
        [eventremove] HRESULT Updated([in] EventRegistrationToken token);
        [eventadd] HRESULT Removed([in] Windows.Foundation.TypedEventHandler<Windows.Devices.Enumeration.DeviceWatcher *,
                Windows.Devices.Enumeration.DeviceInformationUpdate *> *handler, [out, retval] EventRegistrationToken *token);
        [eventremove] HRESULT Removed([in] EventRegistrationToken token);
        [eventadd] HRESULT EnumerationCompleted([in] Windows.Foundation.TypedEventHandler<Windows.Devices.Enumeration.DeviceWatcher *,
                IInspectable *> *handler, [out, retval] EventRegistrationToken *token);
        [eventremove] HRESULT EnumerationCompleted([in] EventRegistrationToken token);
        [eventadd] HRESULT Stopped([in] Windows.Foundation.TypedEventHandler<Windows.Devices.Enumeration.DeviceWatcher *,
                IInspectable *> *handler, [out, retval] EventRegistrationToken *token);
        [eventremove] HRESULT Stopped([in] EventRegistrationToken token);
        [propget] HRESULT Status([out, retval] Windows.Devices.Enumeration.DeviceWatcherStatus *status);
        HRESULT Start();
        HRESULT Stop();
    }

    [
        exclusiveto(Windows.Devices.Enumeration.EnclosureLocation),
        uuid(42340a27-5810-459c-aabb-c65e1f813ecf)
    ]
    interface IEnclosureLocation : IInspectable
    {
        [propget] HRESULT InDock([out, retval] boolean *value);
        [propget] HRESULT InLid([out, retval] boolean *value);
        [propget] HRESULT Panel([out, retval] Windows.Devices.Enumeration.Panel *value);
    }

    [
        contract(Windows.Foundation.UniversalApiContract, 1.0),
        exclusiveto(Windows.Devices.Enumeration.DeviceInformation),
        uuid(c17f100e-3a46-4a78-8013-769dc9b97390)
    ]
    interface IDeviceInformationStatics : IInspectable
    {
        [overload("CreateFromIdAsync")]
        HRESULT CreateFromIdAsync([in] HSTRING id,
                [out, retval] Windows.Foundation.IAsyncOperation<Windows.Devices.Enumeration.DeviceInformation *> **op);
        [overload("CreateFromIdAsync")]
        HRESULT CreateFromIdAsyncAdditionalProperties([in] HSTRING id,
                [in] Windows.Foundation.Collections.IIterable<HSTRING> *additional_properties,
                [out, retval] Windows.Foundation.IAsyncOperation<Windows.Devices.Enumeration.DeviceInformation *> **op);
        [overload("FindAllAsync")]
        HRESULT FindAllAsync([out, retval] Windows.Foundation.IAsyncOperation<Windows.Devices.Enumeration.DeviceInformationCollection *> **op);
        [overload("FindAllAsync"), default_overload]
        HRESULT FindAllAsyncDeviceClass([in] Windows.Devices.Enumeration.DeviceClass device_class,
                [out, retval] Windows.Foundation.IAsyncOperation<Windows.Devices.Enumeration.DeviceInformationCollection *> **op);
        [overload("FindAllAsync")]
        HRESULT FindAllAsyncAqsFilter([in] HSTRING filter,
                [out, retval] Windows.Foundation.IAsyncOperation<Windows.Devices.Enumeration.DeviceInformationCollection *> **op);
        [overload("FindAllAsync")]
        HRESULT FindAllAsyncAqsFilterAndAdditionalProperties([in] HSTRING filter,
                [in] Windows.Foundation.Collections.IIterable<HSTRING> *additional_properties,
                [out, retval] Windows.Foundation.IAsyncOperation<Windows.Devices.Enumeration.DeviceInformationCollection *> **op);
        [overload("CreateWatcher")]
        HRESULT CreateWatcher([out, retval] Windows.Devices.Enumeration.DeviceWatcher **watcher);
        [overload("CreateWatcher"), default_overload]
        HRESULT CreateWatcherDeviceClass([in] Windows.Devices.Enumeration.DeviceClass device_class,
                [out, retval] Windows.Devices.Enumeration.DeviceWatcher **watcher);
        [overload("CreateWatcher")]
        HRESULT CreateWatcherAqsFilter([in] HSTRING filter, [out, retval] Windows.Devices.Enumeration.DeviceWatcher **watcher);
        [overload("CreateWatcher")]
        HRESULT CreateWatcherAqsFilterAndAdditionalProperties([in] HSTRING filter,
                [in] Windows.Foundation.Collections.IIterable<HSTRING> *additional_properties, [out, retval] Windows.Devices.Enumeration.DeviceWatcher **watcher);
    }

    [
        contract(Windows.Foundation.UniversalApiContract, 1.0),
        exclusiveto(Windows.Devices.Enumeration.DeviceInformation),
        uuid(493b4f34-a84f-45fd-9167-15d1cb1bd1f9)
    ]
    interface IDeviceInformationStatics2 : IInspectable
    {
        HRESULT GetAqsFilterFromDeviceClass([in] Windows.Devices.Enumeration.DeviceClass device_class, [out, retval] HSTRING *filter);
        [overload("CreateFromIdAsync")]
        HRESULT CreateFromIdAsyncWithKindAndAdditionalProperties([in] HSTRING device_id,
                [in] Windows.Foundation.Collections.IIterable<HSTRING> *additional_properties,
                [in] Windows.Devices.Enumeration.DeviceInformationKind kind,
                [out, retval] Windows.Foundation.IAsyncOperation<Windows.Devices.Enumeration.DeviceInformation *> **async_operation);
        [overload("FindAllAsync")]
        HRESULT FindAllAsyncWithKindAqsFilterAndAdditionalProperties([in] HSTRING filter,
                [in] Windows.Foundation.Collections.IIterable<HSTRING> *additional_properties,
                [in] Windows.Devices.Enumeration.DeviceInformationKind kind,
                [out, retval] Windows.Foundation.IAsyncOperation<Windows.Devices.Enumeration.DeviceInformationCollection *> **async_operation);
        [overload("CreateWatcher")]
        HRESULT CreateWatcherWithKindAqsFilterAndAdditionalProperties([in] HSTRING filter,
                [in] Windows.Foundation.Collections.IIterable<HSTRING> *additional_properties,
                [in] Windows.Devices.Enumeration.DeviceInformationKind kind,
                [out, retval] Windows.Devices.Enumeration.DeviceWatcher **watcher);
    }

    [
        contract(Windows.Foundation.UniversalApiContract, 1.0),
        exclusiveto(Windows.Devices.Enumeration.DeviceAccessChangedEventArgs),
        uuid(deda0bcc-4f9d-4f58-9dba-a9bc800408d5)
    ]
    interface IDeviceAccessChangedEventArgs : IInspectable
    {
        [propget] HRESULT Status([out, retval] Windows.Devices.Enumeration.DeviceAccessStatus *value);
    }

    [
        contract(Windows.Foundation.UniversalApiContract, 3.0),
        exclusiveto(Windows.Devices.Enumeration.DeviceAccessChangedEventArgs),
        uuid(82523262-934b-4b30-a178-adc39f2f2be3)
    ]
    interface IDeviceAccessChangedEventArgs2 : IInspectable
        requires Windows.Devices.Enumeration.IDeviceAccessChangedEventArgs
    {
        [propget] HRESULT Id([out, retval] HSTRING *value);
    }

    [
        contract(Windows.Foundation.UniversalApiContract, 1.0),
        exclusiveto(Windows.Devices.Enumeration.DeviceAccessInformation),
        uuid(0baa9a73-6de5-4915-8ddd-9a0554a6f545)
    ]
    interface IDeviceAccessInformation : IInspectable
    {
        [eventadd] HRESULT AccessChanged([in] Windows.Foundation.TypedEventHandler<Windows.Devices.Enumeration.DeviceAccessInformation *, Windows.Devices.Enumeration.DeviceAccessChangedEventArgs *> *handler, [out, retval] EventRegistrationToken *cookie);
        [eventremove] HRESULT AccessChanged([in] EventRegistrationToken cookie);
        [propget] HRESULT CurrentStatus([out, retval] Windows.Devices.Enumeration.DeviceAccessStatus *status);
    }

    [
        contract(Windows.Foundation.UniversalApiContract, 1.0),
        exclusiveto(Windows.Devices.Enumeration.DeviceAccessInformation),
        uuid(574bd3d3-5f30-45cd-8a94-724fe5973084),
    ]
    interface IDeviceAccessInformationStatics : IInspectable
    {
        HRESULT CreateFromId([in] HSTRING device_id, [out, retval] Windows.Devices.Enumeration.DeviceAccessInformation **value);
        HRESULT CreateFromDeviceClassId([in] GUID device_class_id, [out, retval] Windows.Devices.Enumeration.DeviceAccessInformation **value);
        HRESULT CreateFromDeviceClass([in] Windows.Devices.Enumeration.DeviceClass device_class, [out, retval] Windows.Devices.Enumeration.DeviceAccessInformation **value);
    }

    [
        contract(Windows.Foundation.UniversalApiContract, 1.0),
        marshaling_behavior(agile),
        static(Windows.Devices.Enumeration.IDeviceInformationStatics, Windows.Foundation.UniversalApiContract, 1.0),
        static(Windows.Devices.Enumeration.IDeviceInformationStatics2, Windows.Foundation.UniversalApiContract, 1.0),
        threading(both)
    ]
    runtimeclass DeviceInformation
    {
        [default] interface Windows.Devices.Enumeration.IDeviceInformation;
        [contract(Windows.Foundation.UniversalApiContract, 1.0)] interface Windows.Devices.Enumeration.IDeviceInformation2;
    }

    [
        contract(Windows.Foundation.UniversalApiContract, 1.0),
        marshaling_behavior(agile),
    ]
    runtimeclass DeviceInformationCollection
    {
        [default] interface Windows.Foundation.Collections.IVectorView<Windows.Devices.Enumeration.DeviceInformation *>;
        interface Windows.Foundation.Collections.IIterable<Windows.Devices.Enumeration.DeviceInformation *>;
    }

    [
        marshaling_behavior(agile),
    ]
    runtimeclass DeviceInformationUpdate
    {
        [default] interface Windows.Devices.Enumeration.IDeviceInformationUpdate;
        interface Windows.Devices.Enumeration.IDeviceInformationUpdate2;
    }

    [
        marshaling_behavior(agile),
    ]
    runtimeclass DeviceThumbnail
    {
        [default] interface Windows.Storage.Streams.IRandomAccessStreamWithContentType;
        interface Windows.Storage.Streams.IContentTypeProvider;
        interface Windows.Storage.Streams.IRandomAccessStream;
        interface Windows.Storage.Streams.IOutputStream;
        interface Windows.Foundation.IClosable;
        interface Windows.Storage.Streams.IInputStream;
    }

    [
        marshaling_behavior(agile),
    ]
    runtimeclass DeviceWatcher
    {
        [default] interface Windows.Devices.Enumeration.IDeviceWatcher;
        interface Windows.Devices.Enumeration.IDeviceWatcher2;
    }

    [
        marshaling_behavior(agile)
    ]
    runtimeclass EnclosureLocation
    {
        [default] interface Windows.Devices.Enumeration.IEnclosureLocation;
    }

    [
        contract(Windows.Foundation.UniversalApiContract, 1.0),
        marshaling_behavior(agile)
    ]
    runtimeclass DeviceAccessChangedEventArgs
    {
        [default] interface Windows.Devices.Enumeration.IDeviceAccessChangedEventArgs;
        [contract(Windows.Foundation.UniversalApiContract, 3.0)] interface Windows.Devices.Enumeration.IDeviceAccessChangedEventArgs2;
    }

    [
        contract(Windows.Foundation.UniversalApiContract, 1.0),
        marshaling_behavior(agile),
        static(Windows.Devices.Enumeration.IDeviceAccessInformationStatics, Windows.Foundation.UniversalApiContract, 1.0),
        threading(both)
    ]
    runtimeclass DeviceAccessInformation
    {
        [default] interface Windows.Devices.Enumeration.IDeviceAccessInformation;
    }

}
