Paul Gofman : taskschd: Implement writing settings to XML.
Alexandre Julliard
julliard at winehq.org
Mon Jul 18 15:45:51 CDT 2022
Module: wine
Branch: master
Commit: 7e4d4a7edb9c6e69f68491359cea0eb0c6af3de0
URL: https://gitlab.winehq.org/wine/wine/-/commit/7e4d4a7edb9c6e69f68491359cea0eb0c6af3de0
Author: Paul Gofman <pgofman at 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;
}
More information about the wine-cvs
mailing list