Module: wine Branch: master Commit: 7e4d4a7edb9c6e69f68491359cea0eb0c6af3de0 URL: https://gitlab.winehq.org/wine/wine/-/commit/7e4d4a7edb9c6e69f68491359cea0eb...
Author: Paul Gofman pgofman@codeweavers.com Date: Fri Jul 15 16:11:51 2022 -0500
taskschd: Implement writing settings to XML.
---
dlls/taskschd/task.c | 107 ++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 106 insertions(+), 1 deletion(-)
diff --git a/dlls/taskschd/task.c b/dlls/taskschd/task.c index 8c9fc9f2582..28c0ff89945 100644 --- a/dlls/taskschd/task.c +++ b/dlls/taskschd/task.c @@ -2457,6 +2457,19 @@ static inline HRESULT write_text_value(IStream *stream, const WCHAR *name, const return write_stringW(stream, L">\n"); }
+static HRESULT write_bool_value(IStream *stream, const WCHAR *name, VARIANT_BOOL value) +{ + return write_text_value(stream, name, value ? L"true" : L"false"); +} + +static HRESULT write_int_value(IStream *stream, const WCHAR *name, int val) +{ + WCHAR s[32]; + + swprintf(s, ARRAY_SIZE(s), L"%d", val); + return write_text_value(stream, name, s); +} + static HRESULT write_task_attributes(IStream *stream, ITaskDefinition *taskdef) { HRESULT hr; @@ -2684,12 +2697,104 @@ static HRESULT write_principal(IStream *stream, IPrincipal *principal) return write_element_end(stream, L"Principals"); }
+const WCHAR *string_from_instances_policy(TASK_INSTANCES_POLICY policy) +{ + switch (policy) + { + case TASK_INSTANCES_PARALLEL: return L"Parallel"; + case TASK_INSTANCES_QUEUE: return L"Queue"; + case TASK_INSTANCES_IGNORE_NEW: return L"IgnoreNew"; + case TASK_INSTANCES_STOP_EXISTING : return L"StopExisting"; + } + return L"<error>"; +} + static HRESULT write_settings(IStream *stream, ITaskSettings *settings) { + INetworkSettings *network_settings; + TASK_INSTANCES_POLICY policy; + IIdleSettings *idle_settings; + VARIANT_BOOL bval; + HRESULT hr; + INT ival; + BSTR s; + if (!settings) return write_empty_element(stream, L"Settings");
- FIXME("stub\n"); + if (FAILED(hr = write_element(stream, L"Settings"))) + return hr; + + push_indent(); + +#define WRITE_BOOL_OPTION(name) \ + { \ + if (FAILED(hr = ITaskSettings_get_##name(settings, &bval))) \ + return hr; \ + if (FAILED(hr = write_bool_value(stream, L ## #name, bval))) \ + return hr; \ + } + + + if (FAILED(hr = ITaskSettings_get_AllowDemandStart(settings, &bval))) + return hr; + if (FAILED(hr = write_bool_value(stream, L"AllowStartOnDemand", bval))) + return hr; + + if (SUCCEEDED(hr = TaskSettings_get_RestartInterval(settings, &s)) && s) + { + FIXME("RestartInterval not handled.\n"); + SysFreeString(s); + } + if (FAILED(hr = ITaskSettings_get_MultipleInstances(settings, &policy))) + return hr; + if (FAILED(hr = write_text_value(stream, L"MultipleInstancesPolicy", string_from_instances_policy(policy)))) + return hr; + + WRITE_BOOL_OPTION(DisallowStartIfOnBatteries); + WRITE_BOOL_OPTION(StopIfGoingOnBatteries); + WRITE_BOOL_OPTION(AllowHardTerminate); + WRITE_BOOL_OPTION(StartWhenAvailable); + WRITE_BOOL_OPTION(RunOnlyIfNetworkAvailable); + WRITE_BOOL_OPTION(WakeToRun); + WRITE_BOOL_OPTION(Enabled); + WRITE_BOOL_OPTION(Hidden); + + if (SUCCEEDED(hr = TaskSettings_get_DeleteExpiredTaskAfter(settings, &s)) && s) + { + hr = write_text_value(stream, L"DeleteExpiredTaskAfter", s); + SysFreeString(s); + if (FAILED(hr)) + return hr; + } + if (SUCCEEDED(hr = TaskSettings_get_IdleSettings(settings, &idle_settings))) + { + FIXME("IdleSettings not handled.\n"); + IIdleSettings_Release(idle_settings); + } + if (SUCCEEDED(hr = TaskSettings_get_NetworkSettings(settings, &network_settings))) + { + FIXME("NetworkSettings not handled.\n"); + INetworkSettings_Release(network_settings); + } + if (SUCCEEDED(hr = TaskSettings_get_ExecutionTimeLimit(settings, &s)) && s) + { + hr = write_text_value(stream, L"ExecutionTimeLimit", s); + SysFreeString(s); + if (FAILED(hr)) + return hr; + } + if (FAILED(hr = ITaskSettings_get_Priority(settings, &ival))) + return hr; + if (FAILED(hr = write_int_value(stream, L"Priority", ival))) + return hr; + + WRITE_BOOL_OPTION(RunOnlyIfIdle); +#undef WRITE_BOOL_OPTION + + pop_indent(); + write_element_end(stream, L"Settings"); + return S_OK; }