/*** Autogenerated by WIDL 7.0-rc2 from include/rtworkq.idl - Do not edit ***/

#ifdef _WIN32
#ifndef __REQUIRED_RPCNDR_H_VERSION__
#define __REQUIRED_RPCNDR_H_VERSION__ 475
#endif
#include <rpc.h>
#include <rpcndr.h>
#endif

#ifndef COM_NO_WINDOWS_H
#include <windows.h>
#include <ole2.h>
#endif

#ifndef __rtworkq_h__
#define __rtworkq_h__

/* Forward declarations */

#ifndef __IRtwqAsyncResult_FWD_DEFINED__
#define __IRtwqAsyncResult_FWD_DEFINED__
typedef interface IRtwqAsyncResult IRtwqAsyncResult;
#ifdef __cplusplus
interface IRtwqAsyncResult;
#endif /* __cplusplus */
#endif

#ifndef __IRtwqAsyncCallback_FWD_DEFINED__
#define __IRtwqAsyncCallback_FWD_DEFINED__
typedef interface IRtwqAsyncCallback IRtwqAsyncCallback;
#ifdef __cplusplus
interface IRtwqAsyncCallback;
#endif /* __cplusplus */
#endif

#ifndef __IRtwqPlatformEvents_FWD_DEFINED__
#define __IRtwqPlatformEvents_FWD_DEFINED__
typedef interface IRtwqPlatformEvents IRtwqPlatformEvents;
#ifdef __cplusplus
interface IRtwqPlatformEvents;
#endif /* __cplusplus */
#endif

/* Headers for imported files */

#include <unknwn.h>

#ifdef __cplusplus
extern "C" {
#endif

typedef enum __WIDL_rtworkq_generated_name_0000000C {
    RTWQ_STANDARD_WORKQUEUE = 0,
    RTWQ_WINDOW_WORKQUEUE = 1,
    RTWQ_MULTITHREADED_WORKQUEUE = 2
} RTWQ_WORKQUEUE_TYPE;
typedef UINT64 RTWQWORKITEM_KEY;
/*****************************************************************************
 * IRtwqAsyncResult interface
 */
#ifndef __IRtwqAsyncResult_INTERFACE_DEFINED__
#define __IRtwqAsyncResult_INTERFACE_DEFINED__

DEFINE_GUID(IID_IRtwqAsyncResult, 0xac6b7889, 0x0740, 0x4d51, 0x86,0x19, 0x90,0x59,0x94,0xa5,0x5c,0xc6);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("ac6b7889-0740-4d51-8619-905994a55cc6")
IRtwqAsyncResult : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE GetState(
        IUnknown **state) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetStatus(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetStatus(
        HRESULT status) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetObject(
        IUnknown **object) = 0;

    virtual IUnknown * STDMETHODCALLTYPE GetStateNoAddRef(
        ) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IRtwqAsyncResult, 0xac6b7889, 0x0740, 0x4d51, 0x86,0x19, 0x90,0x59,0x94,0xa5,0x5c,0xc6)
#endif
#else
typedef struct IRtwqAsyncResultVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IRtwqAsyncResult *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IRtwqAsyncResult *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IRtwqAsyncResult *This);

    /*** IRtwqAsyncResult methods ***/
    HRESULT (STDMETHODCALLTYPE *GetState)(
        IRtwqAsyncResult *This,
        IUnknown **state);

    HRESULT (STDMETHODCALLTYPE *GetStatus)(
        IRtwqAsyncResult *This);

    HRESULT (STDMETHODCALLTYPE *SetStatus)(
        IRtwqAsyncResult *This,
        HRESULT status);

    HRESULT (STDMETHODCALLTYPE *GetObject)(
        IRtwqAsyncResult *This,
        IUnknown **object);

    IUnknown * (STDMETHODCALLTYPE *GetStateNoAddRef)(
        IRtwqAsyncResult *This);

    END_INTERFACE
} IRtwqAsyncResultVtbl;

interface IRtwqAsyncResult {
    CONST_VTBL IRtwqAsyncResultVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IRtwqAsyncResult_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IRtwqAsyncResult_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IRtwqAsyncResult_Release(This) (This)->lpVtbl->Release(This)
/*** IRtwqAsyncResult methods ***/
#define IRtwqAsyncResult_GetState(This,state) (This)->lpVtbl->GetState(This,state)
#define IRtwqAsyncResult_GetStatus(This) (This)->lpVtbl->GetStatus(This)
#define IRtwqAsyncResult_SetStatus(This,status) (This)->lpVtbl->SetStatus(This,status)
#define IRtwqAsyncResult_GetObject(This,object) (This)->lpVtbl->GetObject(This,object)
#define IRtwqAsyncResult_GetStateNoAddRef(This) (This)->lpVtbl->GetStateNoAddRef(This)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IRtwqAsyncResult_QueryInterface(IRtwqAsyncResult* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IRtwqAsyncResult_AddRef(IRtwqAsyncResult* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IRtwqAsyncResult_Release(IRtwqAsyncResult* This) {
    return This->lpVtbl->Release(This);
}
/*** IRtwqAsyncResult methods ***/
static FORCEINLINE HRESULT IRtwqAsyncResult_GetState(IRtwqAsyncResult* This,IUnknown **state) {
    return This->lpVtbl->GetState(This,state);
}
static FORCEINLINE HRESULT IRtwqAsyncResult_GetStatus(IRtwqAsyncResult* This) {
    return This->lpVtbl->GetStatus(This);
}
static FORCEINLINE HRESULT IRtwqAsyncResult_SetStatus(IRtwqAsyncResult* This,HRESULT status) {
    return This->lpVtbl->SetStatus(This,status);
}
static FORCEINLINE HRESULT IRtwqAsyncResult_GetObject(IRtwqAsyncResult* This,IUnknown **object) {
    return This->lpVtbl->GetObject(This,object);
}
static FORCEINLINE IUnknown * IRtwqAsyncResult_GetStateNoAddRef(IRtwqAsyncResult* This) {
    return This->lpVtbl->GetStateNoAddRef(This);
}
#endif
#endif

#endif


#endif  /* __IRtwqAsyncResult_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IRtwqAsyncCallback interface
 */
#ifndef __IRtwqAsyncCallback_INTERFACE_DEFINED__
#define __IRtwqAsyncCallback_INTERFACE_DEFINED__

DEFINE_GUID(IID_IRtwqAsyncCallback, 0xa27003cf, 0x2354, 0x4f2a, 0x8d,0x6a, 0xab,0x7c,0xff,0x15,0x43,0x7e);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("a27003cf-2354-4f2a-8d6a-ab7cff15437e")
IRtwqAsyncCallback : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE GetParameters(
        DWORD *flags,
        DWORD *queue) = 0;

    virtual HRESULT STDMETHODCALLTYPE Invoke(
        IRtwqAsyncResult *result) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IRtwqAsyncCallback, 0xa27003cf, 0x2354, 0x4f2a, 0x8d,0x6a, 0xab,0x7c,0xff,0x15,0x43,0x7e)
#endif
#else
typedef struct IRtwqAsyncCallbackVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IRtwqAsyncCallback *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IRtwqAsyncCallback *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IRtwqAsyncCallback *This);

    /*** IRtwqAsyncCallback methods ***/
    HRESULT (STDMETHODCALLTYPE *GetParameters)(
        IRtwqAsyncCallback *This,
        DWORD *flags,
        DWORD *queue);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IRtwqAsyncCallback *This,
        IRtwqAsyncResult *result);

    END_INTERFACE
} IRtwqAsyncCallbackVtbl;

interface IRtwqAsyncCallback {
    CONST_VTBL IRtwqAsyncCallbackVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IRtwqAsyncCallback_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IRtwqAsyncCallback_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IRtwqAsyncCallback_Release(This) (This)->lpVtbl->Release(This)
/*** IRtwqAsyncCallback methods ***/
#define IRtwqAsyncCallback_GetParameters(This,flags,queue) (This)->lpVtbl->GetParameters(This,flags,queue)
#define IRtwqAsyncCallback_Invoke(This,result) (This)->lpVtbl->Invoke(This,result)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IRtwqAsyncCallback_QueryInterface(IRtwqAsyncCallback* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IRtwqAsyncCallback_AddRef(IRtwqAsyncCallback* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IRtwqAsyncCallback_Release(IRtwqAsyncCallback* This) {
    return This->lpVtbl->Release(This);
}
/*** IRtwqAsyncCallback methods ***/
static FORCEINLINE HRESULT IRtwqAsyncCallback_GetParameters(IRtwqAsyncCallback* This,DWORD *flags,DWORD *queue) {
    return This->lpVtbl->GetParameters(This,flags,queue);
}
static FORCEINLINE HRESULT IRtwqAsyncCallback_Invoke(IRtwqAsyncCallback* This,IRtwqAsyncResult *result) {
    return This->lpVtbl->Invoke(This,result);
}
#endif
#endif

#endif


#endif  /* __IRtwqAsyncCallback_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IRtwqPlatformEvents interface
 */
#ifndef __IRtwqPlatformEvents_INTERFACE_DEFINED__
#define __IRtwqPlatformEvents_INTERFACE_DEFINED__

DEFINE_GUID(IID_IRtwqPlatformEvents, 0x63d9255a, 0x7ff1, 0x4b61, 0x8f,0xaf, 0xed,0x64,0x60,0xda,0xcf,0x2b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("63d9255a-7ff1-4b61-8faf-ed6460dacf2b")
IRtwqPlatformEvents : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE InitializationComplete(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE ShutdownStart(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE ShutdownComplete(
        ) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IRtwqPlatformEvents, 0x63d9255a, 0x7ff1, 0x4b61, 0x8f,0xaf, 0xed,0x64,0x60,0xda,0xcf,0x2b)
#endif
#else
typedef struct IRtwqPlatformEventsVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IRtwqPlatformEvents *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IRtwqPlatformEvents *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IRtwqPlatformEvents *This);

    /*** IRtwqPlatformEvents methods ***/
    HRESULT (STDMETHODCALLTYPE *InitializationComplete)(
        IRtwqPlatformEvents *This);

    HRESULT (STDMETHODCALLTYPE *ShutdownStart)(
        IRtwqPlatformEvents *This);

    HRESULT (STDMETHODCALLTYPE *ShutdownComplete)(
        IRtwqPlatformEvents *This);

    END_INTERFACE
} IRtwqPlatformEventsVtbl;

interface IRtwqPlatformEvents {
    CONST_VTBL IRtwqPlatformEventsVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IRtwqPlatformEvents_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IRtwqPlatformEvents_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IRtwqPlatformEvents_Release(This) (This)->lpVtbl->Release(This)
/*** IRtwqPlatformEvents methods ***/
#define IRtwqPlatformEvents_InitializationComplete(This) (This)->lpVtbl->InitializationComplete(This)
#define IRtwqPlatformEvents_ShutdownStart(This) (This)->lpVtbl->ShutdownStart(This)
#define IRtwqPlatformEvents_ShutdownComplete(This) (This)->lpVtbl->ShutdownComplete(This)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IRtwqPlatformEvents_QueryInterface(IRtwqPlatformEvents* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IRtwqPlatformEvents_AddRef(IRtwqPlatformEvents* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IRtwqPlatformEvents_Release(IRtwqPlatformEvents* This) {
    return This->lpVtbl->Release(This);
}
/*** IRtwqPlatformEvents methods ***/
static FORCEINLINE HRESULT IRtwqPlatformEvents_InitializationComplete(IRtwqPlatformEvents* This) {
    return This->lpVtbl->InitializationComplete(This);
}
static FORCEINLINE HRESULT IRtwqPlatformEvents_ShutdownStart(IRtwqPlatformEvents* This) {
    return This->lpVtbl->ShutdownStart(This);
}
static FORCEINLINE HRESULT IRtwqPlatformEvents_ShutdownComplete(IRtwqPlatformEvents* This) {
    return This->lpVtbl->ShutdownComplete(This);
}
#endif
#endif

#endif


#endif  /* __IRtwqPlatformEvents_INTERFACE_DEFINED__ */

#define RTWQ_E_ERROR(x)            ((HRESULT)(0xc00d0000L+x))
#define RTWQ_E_BUFFERTOOSMALL      RTWQ_E_ERROR(14001)
#define RTWQ_E_NOT_INITIALIZED     RTWQ_E_ERROR(14006)
#define RTWQ_E_UNEXPECTED          RTWQ_E_ERROR(14011)
#define RTWQ_E_NOT_FOUND           RTWQ_E_ERROR(14037)
#define RTWQ_E_OPERATION_CANCELLED RTWQ_E_ERROR(14061)
#define RTWQ_E_INVALID_WORKQUEUE   RTWQ_E_ERROR(14079)
#define RTWQ_E_SHUTDOWN            RTWQ_E_ERROR(16005)
#ifdef __WINESRC__
typedef struct tagRTWQASYNCRESULT
{
    IRtwqAsyncResult AsyncResult;
#else
typedef struct tagRTWQASYNCRESULT : public IRtwqAsyncResult {
#endif
    OVERLAPPED overlapped;
    IRtwqAsyncCallback *pCallback;
    HRESULT hrStatusResult;
    DWORD dwBytesTransferred;
    HANDLE hEvent;
} RTWQASYNCRESULT;
typedef void (WINAPI *RTWQPERIODICCALLBACK)(IUnknown *context);
HRESULT WINAPI RtwqAddPeriodicCallback(RTWQPERIODICCALLBACK callback, IUnknown *context, DWORD *key);
HRESULT WINAPI RtwqAllocateSerialWorkQueue(DWORD target_queue, DWORD *queue);
HRESULT WINAPI RtwqAllocateWorkQueue(RTWQ_WORKQUEUE_TYPE queue_type, DWORD *queue);
HRESULT WINAPI RtwqBeginRegisterWorkQueueWithMMCSS(DWORD queue, const WCHAR *mmcss_class, DWORD taskid, LONG priority, IRtwqAsyncCallback *callback, IUnknown *state);
HRESULT WINAPI RtwqBeginUnregisterWorkQueueWithMMCSS(DWORD queue, IRtwqAsyncCallback *callback, IUnknown *state);
HRESULT WINAPI RtwqCancelDeadline(HANDLE request);
HRESULT WINAPI RtwqCancelWorkItem(RTWQWORKITEM_KEY key);
HRESULT WINAPI RtwqCreateAsyncResult(IUnknown *object, IRtwqAsyncCallback *callback, IUnknown *state, IRtwqAsyncResult **result);
HRESULT WINAPI RtwqEndRegisterWorkQueueWithMMCSS(IRtwqAsyncResult *result, DWORD *taskid);
HRESULT WINAPI RtwqGetWorkQueueMMCSSClass(DWORD queue, WCHAR *mmcss_class, DWORD *length);
HRESULT WINAPI RtwqGetWorkQueueMMCSSPriority(DWORD queue, LONG *priority);
HRESULT WINAPI RtwqGetWorkQueueMMCSSTaskId(DWORD queue, DWORD *taskid);
HRESULT WINAPI RtwqInvokeCallback(IRtwqAsyncResult *result);
HRESULT WINAPI RtwqJoinWorkQueue(DWORD queue, HANDLE hFile, HANDLE *cookie);
HRESULT WINAPI RtwqLockPlatform(void);
HRESULT WINAPI RtwqLockSharedWorkQueue(const WCHAR *usageclass, LONG priority, DWORD *taskid, DWORD *queue);
HRESULT WINAPI RtwqLockWorkQueue(DWORD queue);
HRESULT WINAPI RtwqPutWaitingWorkItem(HANDLE event, LONG priority, IRtwqAsyncResult *result, RTWQWORKITEM_KEY *key);
HRESULT WINAPI RtwqPutWorkItem(DWORD queue, LONG priority, IRtwqAsyncResult *result);
HRESULT WINAPI RtwqRegisterPlatformEvents(IRtwqPlatformEvents *events);
HRESULT WINAPI RtwqRegisterPlatformWithMMCSS(const WCHAR *mmcss_class, DWORD *taskid, LONG priority);
HRESULT WINAPI RtwqRemovePeriodicCallback(DWORD key);
HRESULT WINAPI RtwqScheduleWorkItem(IRtwqAsyncResult *result, INT64 timeout, RTWQWORKITEM_KEY *key);
HRESULT WINAPI RtwqSetDeadline(DWORD queue_id, LONGLONG deadline, HANDLE *request);
HRESULT WINAPI RtwqSetDeadline2(DWORD queue_id, LONGLONG deadline, LONGLONG predeadline, HANDLE *request);
HRESULT WINAPI RtwqSetLongRunning(DWORD queue_id, WINBOOL enable);
HRESULT WINAPI RtwqShutdown(void);
HRESULT WINAPI RtwqStartup(void);
HRESULT WINAPI RtwqUnjoinWorkQueue(DWORD queue, HANDLE cookie);
HRESULT WINAPI RtwqUnlockPlatform(void);
HRESULT WINAPI RtwqUnlockWorkQueue(DWORD queue);
HRESULT WINAPI RtwqUnregisterPlatformEvents(IRtwqPlatformEvents *events);
HRESULT WINAPI RtwqUnregisterPlatformFromMMCSS(void);
/* Begin additional prototypes for all interfaces */


/* End additional prototypes */

#ifdef __cplusplus
}
#endif

#endif /* __rtworkq_h__ */
