/*
 * Copyright 2015 Jacek Caban for CodeWeavers
 *
 * 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 "windowscontracts.idl";
import "eventtoken.idl";
/* import "ivectorchangedeventargs.idl"; */
import "windows.foundation.collections.idl";

namespace Windows.Foundation.Collections {
    interface IPropertySet;

    declare {
        interface Windows.Foundation.Collections.IKeyValuePair<HSTRING, IInspectable *>;
        interface Windows.Foundation.Collections.IIterable<Windows.Foundation.Collections.IKeyValuePair<HSTRING, IInspectable *> *>;
        interface Windows.Foundation.Collections.IIterator<Windows.Foundation.Collections.IKeyValuePair<HSTRING, IInspectable *> *>;
        interface Windows.Foundation.Collections.IMapChangedEventArgs<HSTRING>;
        interface Windows.Foundation.Collections.MapChangedEventHandler<HSTRING, IInspectable *>;
        interface Windows.Foundation.Collections.IMap<HSTRING, IInspectable *>;
        interface Windows.Foundation.Collections.IMapView<HSTRING, IInspectable *>;
        interface Windows.Foundation.Collections.IObservableMap<HSTRING, IInspectable *>;
    }

    [
        contract(Windows.Foundation.FoundationContract, 1.0),
        uuid(8a43ed9f-f4e6-4421-acf9-1dab2986820c)
    ]
    interface IPropertySet : IInspectable
        requires Windows.Foundation.Collections.IObservableMap<HSTRING, IInspectable *>,
                 Windows.Foundation.Collections.IMap<HSTRING, IInspectable *>,
                 Windows.Foundation.Collections.IIterable<Windows.Foundation.Collections.IKeyValuePair<HSTRING, IInspectable *> *>
    {
    }
}

namespace Windows.Foundation {
    typedef enum PropertyType PropertyType;
    typedef struct Point Point;
    typedef struct Size Size;
    typedef struct Rect Rect;
    typedef struct DateTime DateTime;
    typedef struct TimeSpan TimeSpan;
    interface IAsyncAction;
    interface IClosable;
    interface IDeferral;
    interface IDeferralFactory;
    interface IMemoryBuffer;
    interface IMemoryBufferFactory;
    interface IMemoryBufferReference;
    interface IStringable;
    interface IUriEscapeStatics;
    interface IUriRuntimeClass;
    interface IUriRuntimeClassFactory;
    interface IUriRuntimeClassWithAbsoluteCanonicalUri;
    interface IWwwFormUrlDecoderEntry;
    interface IWwwFormUrlDecoderRuntimeClass;
    interface IWwwFormUrlDecoderRuntimeClassFactory;

    runtimeclass Deferral;
    runtimeclass MemoryBuffer;
    runtimeclass Uri;
    runtimeclass WwwFormUrlDecoder;
    runtimeclass WwwFormUrlDecoderEntry;

    declare {
        interface Windows.Foundation.Collections.IIterable<HSTRING>;
        interface Windows.Foundation.Collections.IIterable<IInspectable *>;
        interface Windows.Foundation.Collections.IIterable<IWwwFormUrlDecoderEntry *>;
        interface Windows.Foundation.Collections.IIterable<Uri *>;
        interface Windows.Foundation.Collections.IIterator<HSTRING>;
        interface Windows.Foundation.Collections.IIterator<IInspectable *>;
        interface Windows.Foundation.Collections.IIterator<IWwwFormUrlDecoderEntry *>;
        interface Windows.Foundation.Collections.IIterator<Uri *>;
        interface Windows.Foundation.Collections.IVectorView<HSTRING>;
        interface Windows.Foundation.Collections.IVectorView<IInspectable *>;
        interface Windows.Foundation.Collections.IVectorView<IWwwFormUrlDecoderEntry *>;
        interface Windows.Foundation.Collections.IVector<HSTRING>;
        interface Windows.Foundation.Collections.IVector<IInspectable *>;
        interface Windows.Foundation.Collections.IMapView<HSTRING, Windows.Foundation.Collections.IVectorView<HSTRING> *>;
        interface Windows.Foundation.EventHandler<IInspectable *>;
        interface Windows.Foundation.AsyncOperationCompletedHandler<IInspectable *>;
        interface Windows.Foundation.AsyncOperationCompletedHandler<boolean>;
        interface Windows.Foundation.AsyncOperationCompletedHandler<UINT32>;
        interface Windows.Foundation.IAsyncOperation<IInspectable *>;
        interface Windows.Foundation.IAsyncOperation<boolean>;
        interface Windows.Foundation.IAsyncOperation<UINT32>;
        interface Windows.Foundation.IReference<BYTE>;
        interface Windows.Foundation.IReference<INT32>;
        interface Windows.Foundation.IReference<DOUBLE>;
        interface Windows.Foundation.TypedEventHandler<IInspectable *, IInspectable *>;
        interface Windows.Foundation.TypedEventHandler<Windows.Foundation.IMemoryBufferReference *, IInspectable *>;
    }

    [
        contract(Windows.Foundation.FoundationContract, 1.0),
        uuid(a4ed5c81-76c9-40bd-8be6-b1d90fb20ae7)
    ]
    delegate HRESULT AsyncActionCompletedHandler([in] Windows.Foundation.IAsyncAction *action, [in] AsyncStatus status);

    [
        contract(Windows.Foundation.FoundationContract, 1.0),
        uuid(ed32a372-f3c8-4faa-9cfb-470148da3888)
    ]
    delegate HRESULT DeferralCompletedHandler();

    [contract(Windows.Foundation.FoundationContract, 1.0)]
    enum PropertyType
    {
        Empty       = 0,
        UInt8       = 1,
        Int16       = 2,
        UInt16      = 3,
        Int32       = 4,
        UInt32      = 5,
        Int64       = 6,
        UInt64      = 7,
        Single      = 8,
        Double      = 9,
        Char16      = 10,
        Boolean     = 11,
        String      = 12,
        Inspectable = 13,
        DateTime    = 14,
        TimeSpan    = 15,
        Guid        = 16,
        Point       = 17,
        Size        = 18,
        Rect        = 19,
        OtherType   = 20,
        UInt8Array       = 1025,
        Int16Array       = 1026,
        UInt16Array      = 1027,
        Int32Array       = 1028,
        UInt32Array      = 1029,
        Int64Array       = 1030,
        UInt64Array      = 1031,
        SingleArray      = 1032,
        DoubleArray      = 1033,
        Char16Array      = 1034,
        BooleanArray     = 1035,
        StringArray      = 1036,
        InspectableArray = 1037,
        DateTimeArray    = 1038,
        TimeSpanArray    = 1039,
        GuidArray        = 1040,
        PointArray       = 1041,
        SizeArray        = 1042,
        RectArray        = 1043,
        OtherTypeArray   = 1044,
    };

    [contract(Windows.Foundation.FoundationContract, 1.0)]
    struct Point
    {
        FLOAT X;
        FLOAT Y;
    };

    [contract(Windows.Foundation.FoundationContract, 1.0)]
    struct Size
    {
        FLOAT Width;
        FLOAT Height;
    };

    [contract(Windows.Foundation.FoundationContract, 1.0)]
    struct Rect
    {
        FLOAT X;
        FLOAT Y;
        FLOAT Width;
        FLOAT Height;
    };

    [contract(Windows.Foundation.FoundationContract, 1.0)]
    struct DateTime
    {
        INT64 UniversalTime;
    };

    [contract(Windows.Foundation.FoundationContract, 1.0)]
    struct TimeSpan
    {
        INT64 Duration;
    };

    [
        contract(Windows.Foundation.FoundationContract, 1.0),
        uuid(96369f54-8eb6-48f0-abce-c1b211e627c3)
    ]
    interface IStringable : IInspectable
    {
        HRESULT ToString([out, retval] HSTRING *value);
    }

    [
        contract(Windows.Foundation.FoundationContract, 1.0),
        uuid(30d5a829-7fa4-4026-83bb-d75bae4ea99e)
    ]
    interface IClosable : IInspectable
    {
        HRESULT Close();
    }

    [
        contract(Windows.Foundation.FoundationContract, 1.0),
        exclusiveto(Windows.Foundation.Deferral),
        uuid(d6269732-3b7f-46a7-b40b-4fdca2a2c693)
    ]
    interface IDeferral : IInspectable
        requires Windows.Foundation.IClosable
    {
        HRESULT Complete();
    }

    [
        contract(Windows.Foundation.FoundationContract, 1.0),
        exclusiveto(Windows.Foundation.Deferral),
        uuid(65a1ecc5-3fb5-4832-8ca9-f061b281d13a)
    ]
    interface IDeferralFactory : IInspectable
    {
        HRESULT Create([in] Windows.Foundation.DeferralCompletedHandler *handler, [out, retval] Windows.Foundation.Deferral **result);
    }

    [
        contract(Windows.Foundation.FoundationContract, 1.0),
        uuid(5a648006-843a-4da9-865b-9d26e5dfad7b)
    ]
    interface IAsyncAction : IInspectable
        requires IAsyncInfo
    {
        [propput] HRESULT Completed([in] Windows.Foundation.AsyncActionCompletedHandler *handler);
        [propget] HRESULT Completed([out, retval] Windows.Foundation.AsyncActionCompletedHandler **handler);
        HRESULT GetResults();
    }

    [
        contract(Windows.Foundation.UniversalApiContract, 1.0),
        uuid(fbc4dd2a-245b-11e4-af98-689423260cf8)
    ]
    interface IMemoryBuffer : IInspectable
        requires Windows.Foundation.IClosable
    {
        HRESULT CreateReference([out, retval] Windows.Foundation.IMemoryBufferReference **reference);
    }

    [
        contract(Windows.Foundation.UniversalApiContract, 1.0),
        exclusiveto(Windows.Foundation.MemoryBuffer),
        uuid(fbc4dd2b-245b-11e4-af98-689423260cf8)
    ]
    interface IMemoryBufferFactory : IInspectable
    {
        HRESULT Create([in, range(0x00000000, 0x7fffffff)] UINT32 capacity,
                       [out, retval] Windows.Foundation.MemoryBuffer **value);
    }

    [
        contract(Windows.Foundation.UniversalApiContract, 1.0),
        uuid(fbc4dd29-245b-11e4-af98-689423260cf8)
    ]
    interface IMemoryBufferReference : IInspectable
        requires Windows.Foundation.IClosable
    {
        [propget] HRESULT Capacity([out, retval] UINT32 *value);
        [eventadd] HRESULT Closed([in] Windows.Foundation.TypedEventHandler<Windows.Foundation.IMemoryBufferReference *, IInspectable *> *handler,
                                  [out, retval] EventRegistrationToken *cookie);
        [eventremove] HRESULT Closed([in] EventRegistrationToken cookie);
    }

    [
        contract(Windows.Foundation.UniversalApiContract, 1.0),
        exclusiveto(Windows.Foundation.Uri),
        uuid(c1d432ba-c824-4452-a7fd-512bc3bbe9a1)
    ]
    interface IUriEscapeStatics : IInspectable
    {
        HRESULT UnescapeComponent([in] HSTRING to_unescape, [out, retval] HSTRING *value);
        HRESULT EscapeComponent([in] HSTRING to_escape, [out, retval] HSTRING *value);
    }

    [
        contract(Windows.Foundation.UniversalApiContract, 1.0),
        exclusiveto(Windows.Foundation.Uri),
        uuid(9e365e57-48b2-4160-956f-c7385120bbfc)
    ]
    interface IUriRuntimeClass : IInspectable
    {
        [propget] HRESULT AbsoluteUri([out, retval] HSTRING *value);
        [propget] HRESULT DisplayUri([out, retval] HSTRING *value);
        [propget] HRESULT Domain([out, retval] HSTRING *value);
        [propget] HRESULT Extension([out, retval] HSTRING *value);
        [propget] HRESULT Fragment([out, retval] HSTRING *value);
        [propget] HRESULT Host([out, retval] HSTRING *value);
        [propget] HRESULT Password([out, retval] HSTRING *value);
        [propget] HRESULT Path([out, retval] HSTRING *value);
        [propget] HRESULT Query([out, retval] HSTRING *value);
        [propget] HRESULT QueryParsed([out, retval] Windows.Foundation.WwwFormUrlDecoder **decoder);
        [propget] HRESULT RawUri([out, retval] HSTRING *value);
        [propget] HRESULT SchemeName([out, retval] HSTRING *value);
        [propget] HRESULT UserName([out, retval] HSTRING *value);
        [propget] HRESULT Port([out, retval] INT32 *value);
        [propget] HRESULT Suspicious([out, retval] boolean *value);
        HRESULT Equals([in] Windows.Foundation.Uri *uri, [out, retval] boolean *value);
        HRESULT CombineUri([in] HSTRING relative_uri, [out, retval] Windows.Foundation.Uri **instance);
    }

    [
        contract(Windows.Foundation.UniversalApiContract, 1.0),
        exclusiveto(Windows.Foundation.Uri),
        uuid(44a9796f-723e-4fdf-a218-033e75b0c084)
    ]
    interface IUriRuntimeClassFactory : IInspectable
    {
        HRESULT CreateUri([in] HSTRING uri, [out, retval] Windows.Foundation.Uri **instance);
        HRESULT CreateWithRelativeUri([in] HSTRING base_uri, [in] HSTRING relative_uri, [out, retval] Windows.Foundation.Uri **instance);
    }

    [
        contract(Windows.Foundation.UniversalApiContract, 1.0),
        exclusiveto(Windows.Foundation.Uri),
        uuid(758d9661-221c-480f-a339-50656673f46f)
    ]
    interface IUriRuntimeClassWithAbsoluteCanonicalUri : IInspectable
    {
        [propget] HRESULT AbsoluteCanonicalUri([out, retval] HSTRING *value);
        [propget] HRESULT DisplayIri([out, retval] HSTRING *value);
    }

    [
        contract(Windows.Foundation.UniversalApiContract, 1.0),
        uuid(125e7431-f678-4e8e-b670-20a9b06c512d)
    ]
    interface IWwwFormUrlDecoderEntry : IInspectable
    {
        [propget] HRESULT Name([out, retval] HSTRING *value);
        [propget] HRESULT Value([out, retval] HSTRING *value);
    }

    [
        contract(Windows.Foundation.UniversalApiContract, 1.0),
        exclusiveto(Windows.Foundation.WwwFormUrlDecoder),
        uuid(d45a0451-f225-4542-9296-0e1df5d254df)
    ]
    interface IWwwFormUrlDecoderRuntimeClass : IInspectable
        requires Windows.Foundation.Collections.IIterable<Windows.Foundation.IWwwFormUrlDecoderEntry *>,
                 Windows.Foundation.Collections.IVectorView<Windows.Foundation.IWwwFormUrlDecoderEntry *>
    {
        HRESULT GetFirstValueByName([in] HSTRING name, [out, retval] HSTRING *value);
    }

    [
        contract(Windows.Foundation.UniversalApiContract, 1.0),
        exclusiveto(Windows.Foundation.WwwFormUrlDecoder),
        uuid(5b8c6b3d-24ae-41b5-a1bf-f0c3d544845b)
    ]
    interface IWwwFormUrlDecoderRuntimeClassFactory : IInspectable
    {
        HRESULT CreateWwwFormUrlDecoder([in] HSTRING query, [out, retval] Windows.Foundation.WwwFormUrlDecoder **instance);
    }

    [
        activatable(Windows.Foundation.IDeferralFactory, Windows.Foundation.FoundationContract, 1.0),
        contract(Windows.Foundation.FoundationContract, 1.0),
        marshaling_behavior(agile)
    ]
    runtimeclass Deferral
    {
        [default] interface Windows.Foundation.IDeferral;
        interface Windows.Foundation.IClosable;
    }

    [
        activatable(Windows.Foundation.IMemoryBufferFactory, Windows.Foundation.UniversalApiContract, 1.0),
        contract(Windows.Foundation.UniversalApiContract, 1.0),
        marshaling_behavior(agile),
        threading(both)
    ]
    runtimeclass MemoryBuffer
    {
        [default] interface Windows.Foundation.IMemoryBuffer;
        interface Windows.Foundation.IClosable;
    }

    [
        activatable(Windows.Foundation.IUriRuntimeClassFactory, Windows.Foundation.UniversalApiContract, 1.0),
        contract(Windows.Foundation.UniversalApiContract, 1.0),
        marshaling_behavior(agile),
        static(Windows.Foundation.IUriEscapeStatics, Windows.Foundation.UniversalApiContract, 1.0),
        threading(both)
    ]
    runtimeclass Uri
    {
        [default] interface Windows.Foundation.IUriRuntimeClass;
        interface Windows.Foundation.IUriRuntimeClassWithAbsoluteCanonicalUri;
        [contract(Windows.Foundation.UniversalApiContract, 1.0)] interface Windows.Foundation.IStringable;
    }

    [
        activatable(Windows.Foundation.IWwwFormUrlDecoderRuntimeClassFactory, Windows.Foundation.UniversalApiContract, 1.0),
        contract(Windows.Foundation.UniversalApiContract, 1.0),
        marshaling_behavior(agile),
        threading(both)
    ]
    runtimeclass WwwFormUrlDecoder
    {
        [default] interface Windows.Foundation.IWwwFormUrlDecoderRuntimeClass;
        interface Windows.Foundation.Collections.IVectorView<Windows.Foundation.IWwwFormUrlDecoderEntry *>;
        interface Windows.Foundation.Collections.IIterable<Windows.Foundation.IWwwFormUrlDecoderEntry *>;
    }

    [
        contract(Windows.Foundation.UniversalApiContract, 1.0),
        marshaling_behavior(agile),
        threading(both)
    ]
    runtimeclass WwwFormUrlDecoderEntry
    {
        [default] interface Windows.Foundation.IWwwFormUrlDecoderEntry;
    }
}
