/*
 * Task Scheduler Service definitions
 *
 * Copyright 2014 Dmitry Timoshkov
 *
 * 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
 */

cpp_quote("#define SCHEDSVC_TRANSPORT {'n','c','a','l','r','p','c',0}")
cpp_quote("#define SCH_FLAG_STATE 0x10000000")

import "oaidl.idl";
import "ocidl.idl";

[
    uuid(86d35949-83c9-4044-b424-db363231fd0c),
    implicit_handle(handle_t rpc_handle),
    version(1.0),
    pointer_default(unique)
]
interface ITaskSchedulerService
{
    typedef struct _TASK_USER_CRED
    {
        [string] const WCHAR *user;
        [string] const WCHAR *password;
        DWORD flags;
    } TASK_USER_CRED;

    typedef struct _TASK_XML_ERROR_INFO
    {
        DWORD line, column;
        [string] WCHAR *node;
        [string] WCHAR *value;
    } TASK_XML_ERROR_INFO;

    typedef [string] WCHAR **TASK_NAMES;

    HRESULT SchRpcHighestVersion([out] DWORD *version);
    HRESULT SchRpcRegisterTask([in, string, unique] const WCHAR *path,
                [in, string] const WCHAR *xml, [in] DWORD flags,
                [in, string, unique] const WCHAR *sddl,
                [in] DWORD task_logon_type, [in] DWORD n_creds,
                [in, size_is(n_creds), unique] const TASK_USER_CRED *creds,
                [out, string] WCHAR **actual_path,
                [out] TASK_XML_ERROR_INFO **xml_error_info);
    HRESULT SchRpcRetrieveTask([in, string] const WCHAR *path,
                [in, string] const WCHAR *languages,
                [in] unsigned long *n_languages, [out, string] WCHAR **xml);
    HRESULT SchRpcCreateFolder([in, string] const WCHAR *path,
                [in, string, unique] const WCHAR *sddl, [in] DWORD flags);
    HRESULT SchRpcSetSecurity([in, string] const WCHAR *path,
                [in, string] const WCHAR *sddl, [in] DWORD flags);
    HRESULT SchRpcGetSecurity([in, string] const WCHAR *path,
                [in] DWORD flags, [out, string] WCHAR **sddl);
    HRESULT SchRpcEnumFolders([in, string] const WCHAR *path,
                [in] DWORD flags, [in, out] DWORD *start_index,
                [in] DWORD n_requested, [out] DWORD *n_names,
                [out, string, size_is(,*n_names)] TASK_NAMES *names);
    HRESULT SchRpcEnumTasks([in, string] const WCHAR *path,
                [in] DWORD flags, [in, out] DWORD *start_index,
                [in] DWORD n_requested, [out] DWORD *n_names,
                [out, string, size_is(,*n_names)] TASK_NAMES *names);
    HRESULT SchRpcEnumInstances([in, string, unique] const WCHAR *path,
                [in] DWORD flags, [out] DWORD *n_guids,
                [out, size_is(,*n_guids)] GUID **guids);
    HRESULT SchRpcGetInstanceInfo([in] GUID guid, [out, string] WCHAR **path,
                [out] DWORD *task_state, [out, string] WCHAR **action,
                [out, string] WCHAR **info, [out] DWORD *n_instances,
                [out, size_is(,*n_instances)] GUID **instances, [out] DWORD *pid);
    HRESULT SchRpcStopInstance([in] GUID guid, [in] DWORD flags);
    HRESULT SchRpcStop([in, string, unique] const WCHAR *path, [in] DWORD flags);
    HRESULT SchRpcRun([in, string] const WCHAR *path,
                [in] DWORD n_args, [in, size_is(n_args),unique] const WCHAR **args,
                [in] DWORD flags, [in] DWORD session_id,
                [in, unique, string] const WCHAR *user, [out] GUID *guid);
    HRESULT SchRpcDelete([in, string] const WCHAR *path, [in] DWORD flags);
    HRESULT SchRpcRename([in, string] const WCHAR *path, [in, string] const WCHAR *name, [in] DWORD flags);
    HRESULT SchRpcScheduledRuntimes([in, string] const WCHAR *path,
                [in, unique] SYSTEMTIME *start, [in, unique] SYSTEMTIME *end,
                [in] DWORD flags, [in] DWORD n_requested, [out] DWORD *n_runtimes,
                [out, size_is(,*n_runtimes)] SYSTEMTIME **runtimes);
    HRESULT SchRpcGetLastRunInfo([in, string] const WCHAR *path,
                [out] SYSTEMTIME *last_runtime, [out] DWORD *last_return_code);
    HRESULT SchRpcGetTaskInfo([in, string] const WCHAR *path, [in] DWORD flags,
                [out] DWORD *enabled, [out] DWORD *task_state);
    HRESULT SchRpcGetNumberOfMissedRuns([in, string] const WCHAR *path, [out] DWORD *runs);
    HRESULT SchRpcEnableTask([in, string] const WCHAR *path, [in] DWORD enabled);
}
