/*
 * Task Scheduler Service interface
 *
 * Copyright (C) 2008 Google (Roy Shea)
 *
 * 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
 *
 */

/*
 * Oracle LGPL Disclaimer: For the avoidance of doubt, except that if any license choice
 * other than GPL or LGPL is available it will apply instead, Oracle elects to use only
 * the Lesser General Public License version 2.1 (LGPLv2) at this time for any software where
 * a choice of LGPL license versions is made available with the language indicating
 * that LGPLv2 or any later version may be used, or where a choice of which version
 * of the LGPL is applied is otherwise unspecified.
 */

import "oaidl.idl";
import "oleidl.idl";

#ifndef __WIDL__
#define threading(model)
#define progid(str)
#define vi_progid(str)
#endif

cpp_quote("#define TASK_SUNDAY 0x1")
cpp_quote("#define TASK_MONDAY 0x2")
cpp_quote("#define TASK_TUESDAY 0x4")
cpp_quote("#define TASK_WEDNESDAY 0x8")
cpp_quote("#define TASK_THURSDAY 0x10")
cpp_quote("#define TASK_FRIDAY 0x20")
cpp_quote("#define TASK_SATURDAY 0x40")

cpp_quote("#define TASK_FIRST_WEEK 1")
cpp_quote("#define TASK_SECOND_WEEK 2")
cpp_quote("#define TASK_THIRD_WEEK 3")
cpp_quote("#define TASK_FOURTH_WEEK 4")
cpp_quote("#define TASK_LAST_WEEK 5")

cpp_quote("#define TASK_JANUARY 0x1")
cpp_quote("#define TASK_FEBRUARY 0x2")
cpp_quote("#define TASK_MARCH 0x4")
cpp_quote("#define TASK_APRIL 0x8")
cpp_quote("#define TASK_MAY 0x10")
cpp_quote("#define TASK_JUNE 0x20")
cpp_quote("#define TASK_JULY 0x40")
cpp_quote("#define TASK_AUGUST 0x80")
cpp_quote("#define TASK_SEPTEMBER 0x100")
cpp_quote("#define TASK_OCTOBER 0x200")
cpp_quote("#define TASK_NOVEMBER 0x400")
cpp_quote("#define TASK_DECEMBER 0x800")

cpp_quote("#define TASK_TRIGGER_FLAG_HAS_END_DATE 0x1")
cpp_quote("#define TASK_TRIGGER_FLAG_KILL_AT_DURATION_END 0x2")
cpp_quote("#define TASK_TRIGGER_FLAG_DISABLED 0x4")

[
    local,
    object,
    uuid(148BD528-A2AB-11CE-B11F-00AA00530503),
    pointer_default(unique)
]
interface IEnumWorkItems : IUnknown
{
    HRESULT Next(
            [in]   ULONG celt,
            [out]  LPWSTR **rgpwszNames,
            [out]  ULONG *pceltFetched);

    HRESULT Skip(
            [in]  ULONG celt);

    HRESULT Reset();

    HRESULT Clone(
            [out]  IEnumWorkItems **ppEnumWorkItems);
}

cpp_quote("#ifndef _HPROPSHEETPAGE_DEFINED")
typedef struct _PSP *HPROPSHEETPAGE;
cpp_quote("#define _HPROPSHEETPAGE_DEFINED")
cpp_quote("#endif")

[
    local,
    object,
    uuid(4086658a-cbbb-11cf-b604-00c04fd8d565),
    pointer_default(unique)
]
interface IProvideTaskPage : IUnknown
{
    typedef enum _TASKPAGE {
        TASKPAGE_TASK       = 0,
        TASKPAGE_SCHEDULE   = 1,
        TASKPAGE_SETTINGS   = 2
    } TASKPAGE;

    HRESULT GetPage(
            [in]   TASKPAGE tpType,
            [in]   BOOL fPersistChanges,
            [out]  HPROPSHEETPAGE *phPage);
}

[
    local,
    object,
    uuid(148BD52B-A2AB-11CE-B11F-00AA00530503),
    pointer_default(unique)
]
interface ITaskTrigger : IUnknown
{
    typedef enum _TASK_TRIGGER_TYPE {
        TASK_TIME_TRIGGER_ONCE              = 0,
        TASK_TIME_TRIGGER_DAILY             = 1,
        TASK_TIME_TRIGGER_WEEKLY            = 2,
        TASK_TIME_TRIGGER_MONTHLYDATE       = 3,
        TASK_TIME_TRIGGER_MONTHLYDOW        = 4,
        TASK_EVENT_TRIGGER_ON_IDLE          = 5,
        TASK_EVENT_TRIGGER_AT_SYSTEMSTART   = 6,
        TASK_EVENT_TRIGGER_AT_LOGON         = 7
    } TASK_TRIGGER_TYPE, *PTASK_TRIGGER_TYPE;

    typedef struct _DAILY {
        WORD DaysInterval;
    } DAILY;

    typedef struct _WEEKLY {
        WORD WeeksInterval;
        WORD rgfDaysOfTheWeek;
    } WEEKLY;

    typedef struct _MONTHLYDATE {
        DWORD rgfDays;
        WORD rgfMonths;
    } MONTHLYDATE;

    typedef struct _MONTHLYDOW {
        WORD wWhichWeek;
        WORD rgfDaysOfTheWeek;
        WORD rgfMonths;
    } MONTHLYDOW;

    typedef union _TRIGGER_TYPE_UNION {
        DAILY Daily;
        WEEKLY Weekly;
        MONTHLYDATE MonthlyDate;
        MONTHLYDOW MonthlyDOW;
    } TRIGGER_TYPE_UNION;

    typedef struct _TASK_TRIGGER {
        WORD cbTriggerSize;
        WORD Reserved1;
        WORD wBeginYear;
        WORD wBeginMonth;
        WORD wBeginDay;
        WORD wEndYear;
        WORD wEndMonth;
        WORD wEndDay;
        WORD wStartHour;
        WORD wStartMinute;
        DWORD MinutesDuration;
        DWORD MinutesInterval;
        DWORD rgFlags;
        TASK_TRIGGER_TYPE TriggerType;
        TRIGGER_TYPE_UNION Type;
        WORD Reserved2;
        WORD wRandomMinutesInterval;
    } TASK_TRIGGER, *PTASK_TRIGGER;

    HRESULT SetTrigger(
            [in]  const PTASK_TRIGGER pTrigger);

    HRESULT GetTrigger(
            [out]  PTASK_TRIGGER pTrigger);

    HRESULT GetTriggerString(
            [out]  LPWSTR *ppwszTrigger);
}

[
    local,
    object,
    uuid(a6b952f0-a4b1-11d0-997d-00aa006887ec),
    pointer_default(unique)
]
interface IScheduledWorkItem : IUnknown
{
    HRESULT CreateTrigger(
            [out]  WORD *piNewTrigger,
            [out]  ITaskTrigger **ppTrigger);

    HRESULT DeleteTrigger(
            [in]  WORD iTrigger);

    HRESULT GetTriggerCount(
            [out]  WORD *plCount);

    HRESULT GetTrigger(
            [in]   WORD iTrigger,
            [out]  ITaskTrigger **ppTrigger);

    HRESULT GetTriggerString(
            [in]   WORD iTrigger,
            [out]  LPWSTR *ppwszTrigger);

    HRESULT GetRunTimes(
            [in]       const LPSYSTEMTIME pstBegin,
            [in]       const LPSYSTEMTIME pstEnd,
            [in, out]  WORD *pCount,
            [out]      LPSYSTEMTIME *rgstTaskTimes);

    HRESULT GetNextRunTime(
            [out]  SYSTEMTIME *pstNextRun);

    HRESULT SetIdleWait(
            [in]  WORD wIdleMinutes,
            [in]  WORD wDeadlineMinutes);

    HRESULT GetIdleWait(
            [out]  WORD *pwIdleMinutes,
            [out]  WORD *pwDeadlineMinutes);

    HRESULT Run();

    HRESULT Terminate();

    HRESULT EditWorkItem(
            [in]  HWND hParent,
            [in]  DWORD dwReserved);

    HRESULT GetMostRecentRunTime(
            [out]  SYSTEMTIME *pstLastRun);

    HRESULT GetStatus(
            [out]  HRESULT *phrStatus);

    HRESULT GetExitCode(
            [out]  DWORD *pdwExitCode);

    HRESULT SetComment(
            [in]  LPCWSTR pwszComment);

    HRESULT GetComment(
            [out]  LPWSTR *ppwszComment);

    HRESULT SetCreator(
            LPCWSTR pwszCreator);

    HRESULT GetCreator(
            [out]  LPWSTR *ppwszCreator);

    HRESULT SetWorkItemData(
            [in]  WORD cBytes,
            [in]  BYTE rgbData[]);

    HRESULT GetWorkItemData(
            [out]  WORD *pcBytes,
            [out]  BYTE **ppBytes);

    HRESULT SetErrorRetryCount(
            WORD wRetryCount);

    HRESULT GetErrorRetryCount(
            [out]  WORD *pwRetryCount);

    HRESULT SetErrorRetryInterval(
            WORD wRetryInterval);

    HRESULT GetErrorRetryInterval(
            [out]  WORD *pwRetryInterval);

    HRESULT SetFlags(
            DWORD dwFlags);

    HRESULT GetFlags(
            [out]  DWORD *pdwFlags);

    HRESULT SetAccountInformation(
            [in]  LPCWSTR pwszAccountName,
            [in]  LPCWSTR pwszPassword);

    HRESULT GetAccountInformation(
            [out]  LPWSTR *ppwszAccountName);
}

[
    local,
    object,
    uuid(148BD524-A2AB-11CE-B11F-00AA00530503),
    pointer_default(unique)
]
interface ITask : IScheduledWorkItem
{
    HRESULT SetApplicationName(
            [in]  LPCWSTR pwszApplicationName);

    HRESULT GetApplicationName(
            [out]  LPWSTR *ppwszApplicationName);

    HRESULT SetParameters(
            [in]  LPCWSTR pwszParameters);

    HRESULT GetParameters(
            [out]  LPWSTR *ppwszParameters);

    HRESULT SetWorkingDirectory(
            [in]  LPCWSTR pwszWorkingDirectory);

    HRESULT GetWorkingDirectory(
            [in]  LPWSTR *ppwszWorkingDirectory);

    HRESULT SetPriority(
            [in]  DWORD dwPriority);

    HRESULT GetPriority(
            [out]  DWORD *pdwPriority);

    HRESULT SetTaskFlags(
            [in]  DWORD dwFlags);

    HRESULT GetTaskFlags(
            [out]  DWORD *pdwFlags);

    HRESULT SetMaxRunTime(
            [in]  DWORD dwMaxRunTime);

    HRESULT GetMaxRunTime(
            [out]  DWORD *pdwMaxRunTime);
}

[
    local,
    object,
    uuid(148BD527-A2AB-11CE-B11F-00AA00530503),
    pointer_default(unique)
]
interface ITaskScheduler : IUnknown
{
    HRESULT SetTargetComputer(
            [in]  LPCWSTR pwszComputer);

    HRESULT GetTargetComputer(
            [out]  LPWSTR *ppwszComputer);

    HRESULT Enum(
            [out]  IEnumWorkItems **ppEnumTasks);

    HRESULT Activate(
            [in]   LPCWSTR pwszName,
            [in]   REFIID riid,
            [out]  IUnknown **ppunk);

    HRESULT Delete(
            [in]  LPCWSTR pwszName);

    HRESULT NewWorkItem(
            [in]   LPCWSTR pwszTaskName,
            [in]   REFCLSID rclsid,
            [in]   REFIID riid,
            [out]  IUnknown **ppunk);

    HRESULT AddWorkItem(
            [in]  LPCWSTR pwszTaskName,
            [in]  IScheduledWorkItem *pWorkItem);

    HRESULT IsOfType(
            [in]  LPCWSTR pwszName,
            [in]  REFIID riid);
}

[
    threading(both),
    uuid(148BD52A-A2AB-11CE-B11F-00AA00530503)
]
coclass CTaskScheduler
{
    [default] interface ITaskScheduler;
};


[
    threading(both),
    uuid(148BD520-A2AB-11CE-B11F-00AA00530503)
]
coclass CTask
{
    [default] interface ITask;
};
