/*
 * 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 {
    namespace Devices {
        namespace Enumeration {
            typedef enum DeviceWatcherStatus DeviceWatcherStatus;
            typedef enum Panel Panel;

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

            runtimeclass DeviceInformation;
            runtimeclass DeviceInformationUpdate;
            runtimeclass DeviceThumbnail;
            runtimeclass DeviceWatcher;
            runtimeclass EnclosureLocation;
        }
    }
}

namespace Windows
{
    namespace Devices
    {
        namespace Enumeration
        {
            declare
            {
                interface Windows.Foundation.AsyncOperationCompletedHandler<Windows.Devices.Enumeration.DeviceInformation *>;
                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.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 *>;
            }
        }
    }
}

namespace Windows
{
    namespace Storage
    {
        namespace Streams
        {
            interface IContentTypeProvider;
            interface IInputStream;
            interface IOutputStream;
            interface IRandomAccessStream;
            interface IRandomAccessStreamWithContentType;
        }
    }
}

namespace Windows {
    namespace Devices {
        namespace Enumeration {
            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
            };

            [
                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),
                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;
            }

            [
                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;
            }
        }
    }
}
