[3/3] taskschd: Implement setters for IRegistrationInfo string properties.

Dmitry Timoshkov dmitry at baikal.ru
Fri Apr 11 02:27:23 CDT 2014


---
 dlls/taskschd/task.c            | 113 +++++++++++++++++++++++++++++++++++-----
 dlls/taskschd/tests/scheduler.c |   1 -
 2 files changed, 99 insertions(+), 15 deletions(-)

diff --git a/dlls/taskschd/task.c b/dlls/taskschd/task.c
index 9c3d20a..fda1305 100644
--- a/dlls/taskschd/task.c
+++ b/dlls/taskschd/task.c
@@ -61,6 +61,13 @@ static ULONG WINAPI RegistrationInfo_Release(IRegistrationInfo *iface)
     if (!ref)
     {
         TRACE("destroying %p\n", iface);
+        heap_free(reginfo->description);
+        heap_free(reginfo->author);
+        heap_free(reginfo->version);
+        heap_free(reginfo->date);
+        heap_free(reginfo->documentation);
+        heap_free(reginfo->uri);
+        heap_free(reginfo->source);
         heap_free(reginfo);
     }
 
@@ -128,8 +135,15 @@ static HRESULT WINAPI RegistrationInfo_get_Description(IRegistrationInfo *iface,
 
 static HRESULT WINAPI RegistrationInfo_put_Description(IRegistrationInfo *iface, BSTR description)
 {
-    FIXME("%p,%p: stub\n", iface, debugstr_w(description));
-    return E_NOTIMPL;
+    registration_info *reginfo = impl_from_IRegistrationInfo(iface);
+
+    TRACE("%p,%p\n", iface, debugstr_w(description));
+
+    if (!description) return E_INVALIDARG;
+
+    reginfo->description = heap_strdupW(description);
+    /* FIXME: update XML on the server side */
+    return reginfo->description ? S_OK : E_OUTOFMEMORY;
 }
 
 static HRESULT WINAPI RegistrationInfo_get_Author(IRegistrationInfo *iface, BSTR *author)
@@ -146,8 +160,15 @@ static HRESULT WINAPI RegistrationInfo_get_Author(IRegistrationInfo *iface, BSTR
 
 static HRESULT WINAPI RegistrationInfo_put_Author(IRegistrationInfo *iface, BSTR author)
 {
-    FIXME("%p,%p: stub\n", iface, debugstr_w(author));
-    return E_NOTIMPL;
+    registration_info *reginfo = impl_from_IRegistrationInfo(iface);
+
+    TRACE("%p,%p\n", iface, debugstr_w(author));
+
+    if (!author) return E_INVALIDARG;
+
+    reginfo->author = heap_strdupW(author);
+    /* FIXME: update XML on the server side */
+    return reginfo->author ? S_OK : E_OUTOFMEMORY;
 }
 
 static HRESULT WINAPI RegistrationInfo_get_Version(IRegistrationInfo *iface, BSTR *version)
@@ -164,8 +185,15 @@ static HRESULT WINAPI RegistrationInfo_get_Version(IRegistrationInfo *iface, BST
 
 static HRESULT WINAPI RegistrationInfo_put_Version(IRegistrationInfo *iface, BSTR version)
 {
-    FIXME("%p,%p: stub\n", iface, debugstr_w(version));
-    return E_NOTIMPL;
+    registration_info *reginfo = impl_from_IRegistrationInfo(iface);
+
+    TRACE("%p,%p\n", iface, debugstr_w(version));
+
+    if (!version) return E_INVALIDARG;
+
+    reginfo->version = heap_strdupW(version);
+    /* FIXME: update XML on the server side */
+    return reginfo->version ? S_OK : E_OUTOFMEMORY;
 }
 
 static HRESULT WINAPI RegistrationInfo_get_Date(IRegistrationInfo *iface, BSTR *date)
@@ -182,8 +210,15 @@ static HRESULT WINAPI RegistrationInfo_get_Date(IRegistrationInfo *iface, BSTR *
 
 static HRESULT WINAPI RegistrationInfo_put_Date(IRegistrationInfo *iface, BSTR date)
 {
-    FIXME("%p,%p: stub\n", iface, debugstr_w(date));
-    return E_NOTIMPL;
+    registration_info *reginfo = impl_from_IRegistrationInfo(iface);
+
+    TRACE("%p,%p\n", iface, debugstr_w(date));
+
+    if (!date) return E_INVALIDARG;
+
+    reginfo->date = heap_strdupW(date);
+    /* FIXME: update XML on the server side */
+    return reginfo->date ? S_OK : E_OUTOFMEMORY;
 }
 
 static HRESULT WINAPI RegistrationInfo_get_Documentation(IRegistrationInfo *iface, BSTR *doc)
@@ -200,8 +235,15 @@ static HRESULT WINAPI RegistrationInfo_get_Documentation(IRegistrationInfo *ifac
 
 static HRESULT WINAPI RegistrationInfo_put_Documentation(IRegistrationInfo *iface, BSTR doc)
 {
-    FIXME("%p,%p: stub\n", iface, debugstr_w(doc));
-    return E_NOTIMPL;
+    registration_info *reginfo = impl_from_IRegistrationInfo(iface);
+
+    TRACE("%p,%p\n", iface, debugstr_w(doc));
+
+    if (!doc) return E_INVALIDARG;
+
+    reginfo->documentation = heap_strdupW(doc);
+    /* FIXME: update XML on the server side */
+    return reginfo->documentation ? S_OK : E_OUTOFMEMORY;
 }
 
 static HRESULT WINAPI RegistrationInfo_get_XmlText(IRegistrationInfo *iface, BSTR *xml)
@@ -230,8 +272,15 @@ static HRESULT WINAPI RegistrationInfo_get_URI(IRegistrationInfo *iface, BSTR *u
 
 static HRESULT WINAPI RegistrationInfo_put_URI(IRegistrationInfo *iface, BSTR uri)
 {
-    FIXME("%p,%p: stub\n", iface, debugstr_w(uri));
-    return E_NOTIMPL;
+    registration_info *reginfo = impl_from_IRegistrationInfo(iface);
+
+    TRACE("%p,%p\n", iface, debugstr_w(uri));
+
+    if (!uri) return E_INVALIDARG;
+
+    reginfo->uri = heap_strdupW(uri);
+    /* FIXME: update XML on the server side */
+    return reginfo->uri ? S_OK : E_OUTOFMEMORY;
 }
 
 static HRESULT WINAPI RegistrationInfo_get_SecurityDescriptor(IRegistrationInfo *iface, VARIANT *sddl)
@@ -260,8 +309,15 @@ static HRESULT WINAPI RegistrationInfo_get_Source(IRegistrationInfo *iface, BSTR
 
 static HRESULT WINAPI RegistrationInfo_put_Source(IRegistrationInfo *iface, BSTR source)
 {
-    FIXME("%p,%p: stub\n", iface, debugstr_w(source));
-    return E_NOTIMPL;
+    registration_info *reginfo = impl_from_IRegistrationInfo(iface);
+
+    TRACE("%p,%p\n", iface, debugstr_w(source));
+
+    if (!source) return E_INVALIDARG;
+
+    reginfo->source = heap_strdupW(source);
+    /* FIXME: update XML on the server side */
+    return reginfo->source ? S_OK : E_OUTOFMEMORY;
 }
 
 static const IRegistrationInfoVtbl RegistrationInfo_vtbl =
@@ -2215,6 +2271,7 @@ static HRESULT read_xml(IXmlReader *reader, ITaskDefinition *taskdef)
 
 static HRESULT WINAPI TaskDefinition_put_XmlText(ITaskDefinition *iface, BSTR xml)
 {
+    TaskDefinition *taskdef = impl_from_ITaskDefinition(iface);
     HRESULT hr;
     IStream *stream;
     IXmlReader *reader;
@@ -2248,7 +2305,35 @@ static HRESULT WINAPI TaskDefinition_put_XmlText(ITaskDefinition *iface, BSTR xm
 
     hr = IXmlReader_SetInput(reader, (IUnknown *)stream);
     if (hr == S_OK)
+    {
+        if (taskdef->reginfo)
+        {
+            IRegistrationInfo_Release(taskdef->reginfo);
+            taskdef->reginfo = NULL;
+        }
+        if (taskdef->taskset)
+        {
+            ITaskSettings_Release(taskdef->taskset);
+            taskdef->taskset = NULL;
+        }
+        if (taskdef->triggers)
+        {
+            ITriggerCollection_Release(taskdef->triggers);
+            taskdef->triggers = NULL;
+        }
+        if (taskdef->principal)
+        {
+            IPrincipal_Release(taskdef->principal);
+            taskdef->principal = NULL;
+        }
+        if (taskdef->actions)
+        {
+            IActionCollection_Release(taskdef->actions);
+            taskdef->actions = NULL;
+        }
+
         hr = read_xml(reader, iface);
+    }
 
     IXmlReader_Release(reader);
     IStream_Release(stream);
diff --git a/dlls/taskschd/tests/scheduler.c b/dlls/taskschd/tests/scheduler.c
index 1132268..98ff227 100644
--- a/dlls/taskschd/tests/scheduler.c
+++ b/dlls/taskschd/tests/scheduler.c
@@ -1353,7 +1353,6 @@ todo_wine
 
     hr = IRegistrationInfo_get_Description(reginfo, &bstr);
     ok(hr == S_OK, "get_Description error %#x\n", hr);
-todo_wine
     ok(bstr && !lstrcmpW(bstr, Task1), "expected Task1, got %s\n", wine_dbgstr_w(bstr));
     SysFreeString(bstr);
     hr = IRegistrationInfo_get_Author(reginfo, &bstr);
-- 
1.9.2




More information about the wine-patches mailing list