Nikolay Sivov : opcservices: Implement RelationshipExists().

Alexandre Julliard julliard at winehq.org
Thu Sep 6 15:51:51 CDT 2018


Module: wine
Branch: master
Commit: 89c2553503bae0539530fc13e37a96dd4e65a39f
URL:    https://source.winehq.org/git/wine.git/?a=commit;h=89c2553503bae0539530fc13e37a96dd4e65a39f

Author: Nikolay Sivov <nsivov at codeweavers.com>
Date:   Thu Sep  6 06:37:15 2018 +0300

opcservices: Implement RelationshipExists().

Signed-off-by: Nikolay Sivov <nsivov at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/opcservices/package.c           | 37 ++++++++++++++++++++++++++----------
 dlls/opcservices/tests/opcservices.c | 19 ++++++++++++++++++
 2 files changed, 46 insertions(+), 10 deletions(-)

diff --git a/dlls/opcservices/package.c b/dlls/opcservices/package.c
index d0d39a9..370b42e 100644
--- a/dlls/opcservices/package.c
+++ b/dlls/opcservices/package.c
@@ -580,11 +580,25 @@ static ULONG WINAPI opc_relationship_set_Release(IOpcRelationshipSet *iface)
     return refcount;
 }
 
+static struct opc_relationship *opc_relationshipset_get_item(struct opc_relationship_set *relationship_set,
+        const WCHAR *id)
+{
+    size_t i;
+
+    for (i = 0; i < relationship_set->count; i++)
+    {
+        if (!strcmpW(id, relationship_set->relationships[i]->id))
+            return relationship_set->relationships[i];
+    }
+
+    return NULL;
+}
+
 static HRESULT WINAPI opc_relationship_set_GetRelationship(IOpcRelationshipSet *iface, const WCHAR *id,
         IOpcRelationship **relationship)
 {
     struct opc_relationship_set *relationship_set = impl_from_IOpcRelationshipSet(iface);
-    size_t i;
+    struct opc_relationship *ret;
 
     TRACE("iface %p, id %s, relationship %p.\n", iface, debugstr_w(id), relationship);
 
@@ -596,14 +610,10 @@ static HRESULT WINAPI opc_relationship_set_GetRelationship(IOpcRelationshipSet *
     if (!id)
         return E_POINTER;
 
-    for (i = 0; i < relationship_set->count; i++)
+    if ((ret = opc_relationshipset_get_item(relationship_set, id)))
     {
-        if (!strcmpW(id, relationship_set->relationships[i]->id))
-        {
-            *relationship = &relationship_set->relationships[i]->IOpcRelationship_iface;
-            IOpcRelationship_AddRef(*relationship);
-            break;
-        }
+        *relationship = &ret->IOpcRelationship_iface;
+        IOpcRelationship_AddRef(*relationship);
     }
 
     return *relationship ? S_OK : OPC_E_NO_SUCH_RELATIONSHIP;
@@ -632,9 +642,16 @@ static HRESULT WINAPI opc_relationship_set_DeleteRelationship(IOpcRelationshipSe
 
 static HRESULT WINAPI opc_relationship_set_RelationshipExists(IOpcRelationshipSet *iface, const WCHAR *id, BOOL *exists)
 {
-    FIXME("iface %p, id %s, exists %p stub!\n", iface, debugstr_w(id), exists);
+    struct opc_relationship_set *relationship_set = impl_from_IOpcRelationshipSet(iface);
 
-    return E_NOTIMPL;
+    TRACE("iface %p, id %s, exists %p.\n", iface, debugstr_w(id), exists);
+
+    if (!id || !exists)
+        return E_POINTER;
+
+    *exists = opc_relationshipset_get_item(relationship_set, id) != NULL;
+
+    return S_OK;
 }
 
 static HRESULT WINAPI opc_relationship_set_GetEnumerator(IOpcRelationshipSet *iface,
diff --git a/dlls/opcservices/tests/opcservices.c b/dlls/opcservices/tests/opcservices.c
index 63809aa..4bb3d64 100644
--- a/dlls/opcservices/tests/opcservices.c
+++ b/dlls/opcservices/tests/opcservices.c
@@ -241,6 +241,7 @@ static void test_relationship(void)
     DWORD mode;
     HRESULT hr;
     WCHAR *id;
+    BOOL ret;
     BSTR str;
 
     factory = create_factory();
@@ -284,6 +285,19 @@ todo_wine
     ok(SUCCEEDED(hr), "Failed to get id, hr %#x.\n", hr);
     ok(lstrlenW(id) == 9 && *id == 'R', "Unexpected relationship id %s.\n", wine_dbgstr_w(id));
 
+    ret = 123;
+    hr = IOpcRelationshipSet_RelationshipExists(rels, NULL, &ret);
+    ok(hr == E_POINTER, "Unexpected hr %#x.\n", hr);
+    ok(ret == 123, "Unexpected result %d.\n", ret);
+
+    hr = IOpcRelationshipSet_RelationshipExists(rels, id, NULL);
+    ok(hr == E_POINTER, "Unexpected hr %#x.\n", hr);
+
+    ret = FALSE;
+    hr = IOpcRelationshipSet_RelationshipExists(rels, id, &ret);
+    ok(SUCCEEDED(hr), "Failed to get relationship, hr %#x.\n", hr);
+    ok(ret, "Unexpected result %d.\n", ret);
+
     hr = IOpcRelationshipSet_GetRelationship(rels, id, &rel3);
     ok(SUCCEEDED(hr), "Failed to get relationship, hr %#x.\n", hr);
     IOpcRelationship_Release(rel3);
@@ -302,6 +316,11 @@ todo_wine
     ok(hr == OPC_E_NO_SUCH_RELATIONSHIP, "Unexpected hr %#x.\n", hr);
     ok(rel3 == NULL, "Expected null pointer.\n");
 
+    ret = TRUE;
+    hr = IOpcRelationshipSet_RelationshipExists(rels, id, &ret);
+    ok(SUCCEEDED(hr), "Unexpected hr %#x.\n", hr);
+    ok(!ret, "Unexpected result %d.\n", ret);
+
     CoTaskMemFree(id);
 
     hr = IOpcRelationship_GetTargetUri(rel, &uri);




More information about the wine-cvs mailing list