/**
 * 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(
                        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);
            }
        }
    }
}
