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