/**
 * This file has no copyright assigned and is placed in the Public Domain.
 * This file is part of the mingw-w64 runtime package.
 * No warranty is given; refer to the file DISCLAIMER.PD within this package.
 */

#ifdef __WIDL__
#pragma winrt ns_prefix
#endif

import "inspectable.idl";
import "windows.foundation.idl";

namespace Windows {
    namespace Foundation {
        interface IAsyncAction;
    }

    namespace System {
        namespace Threading {
            typedef enum WorkItemPriority WorkItemPriority;
            typedef enum WorkItemOptions WorkItemOptions;
            interface TimerElapsedHandler;   //delegate
            interface TimerDestroyedHandler; //delegate
            interface WorkItemHandler;       //delegate
            interface IThreadPoolStatics;
            interface IThreadPoolTimer;
            interface IThreadPoolTimerStatics;
        }
    }
}

namespace Windows {
    namespace System {
        namespace Threading
        {
            enum WorkItemPriority {
                Low    = -1,
                Normal = 0,
                High   = 1
            };

            enum WorkItemOptions {
                None       = 0,
                TimeSliced = 1
            };

            [uuid(FAAEA667-FBEB-49CB-ADB2-71184C556E43)]
            interface TimerElapsedHandler : IUnknown {
                HRESULT Invoke(IThreadPoolTimer* timer);
            }

            [uuid(34ED19FA-8384-4EB9-8209-FB5094EEEC35)]
            interface TimerDestroyedHandler : IUnknown {
                HRESULT Invoke(IThreadPoolTimer* timer);
            }

            [uuid(1D1A8B8B-FA66-414F-9CBD-B65FC99D17FA)]
            interface WorkItemHandler : IUnknown {
                HRESULT Invoke(
                        Windows.Foundation.IAsyncAction* operation);
            }

            [uuid(B6BF67DD-84BD-44F8-AC1C-93EBCB9DBA91)]
            interface IThreadPoolStatics : IInspectable
            {
                HRESULT RunAsync(
                        WorkItemHandler* handler,
                        Windows.Foundation.IAsyncAction** operation);

                HRESULT RunWithPriorityAsync(
                        WorkItemHandler* handler,
                        WorkItemPriority priority,
                        Windows.Foundation.IAsyncAction** operation);

                HRESULT RunWithPriorityAndOptionsAsync(
                        WorkItemHandler* handler,
                        WorkItemPriority priority,
                        WorkItemOptions options,
                        Windows.Foundation.IAsyncAction** operation);
            }

            [uuid(594EBE78-55EA-4A88-A50D-3402AE1F9CF2)]
            interface IThreadPoolTimer : IInspectable
            {
                [propget] HRESULT Period(Windows.Foundation.TimeSpan* value);
                [propget] HRESULT Delay(Windows.Foundation.TimeSpan* value);
                HRESULT Cancel();
            }

            [uuid(1A8A9D02-E482-461B-B8C7-8EFAD1CCE590)]
            interface IThreadPoolTimerStatics : IInspectable
            {
                HRESULT CreatePeriodicTimer(
                        TimerElapsedHandler* handler,
                        Windows.Foundation.TimeSpan period,
                        IThreadPoolTimer** timer);

                HRESULT CreateTimer(
                        TimerElapsedHandler* handler,
                        Windows.Foundation.TimeSpan delay,
                        IThreadPoolTimer** timer);

                HRESULT CreatePeriodicTimerWithCompletion(
                        TimerElapsedHandler* handler,
                        Windows.Foundation.TimeSpan period,
                        TimerDestroyedHandler* destroyed,
                        IThreadPoolTimer** timer);

                HRESULT CreateTimerWithCompletion(
                        TimerElapsedHandler* handler,
                        Windows.Foundation.TimeSpan delay,
                        TimerDestroyedHandler* destroyed,
                        IThreadPoolTimer** timer);
            }
        }
    }
}
