/**
 * 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;
        struct TimeSpan;
    }

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

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

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

            typedef struct TimeSpan {
                INT64 Duration;
            } TimeSpan;

            [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,
                        IAsyncAction** operation);

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

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

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

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

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

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

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