Nikolay Sivov : opcservices: Implement GetRelationship().

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


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

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

opcservices: Implement GetRelationship().

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

---

 dlls/opcservices/package.c           | 25 +++++++++++++++++++++++--
 dlls/opcservices/tests/opcservices.c | 21 ++++++++++++++++++++-
 include/opcbase.idl                  |  1 +
 3 files changed, 44 insertions(+), 3 deletions(-)

diff --git a/dlls/opcservices/package.c b/dlls/opcservices/package.c
index 00f4a4f..d0d39a9 100644
--- a/dlls/opcservices/package.c
+++ b/dlls/opcservices/package.c
@@ -583,9 +583,30 @@ static ULONG WINAPI opc_relationship_set_Release(IOpcRelationshipSet *iface)
 static HRESULT WINAPI opc_relationship_set_GetRelationship(IOpcRelationshipSet *iface, const WCHAR *id,
         IOpcRelationship **relationship)
 {
-    FIXME("iface %p, id %s, relationship %p stub!\n", iface, debugstr_w(id), relationship);
+    struct opc_relationship_set *relationship_set = impl_from_IOpcRelationshipSet(iface);
+    size_t i;
 
-    return E_NOTIMPL;
+    TRACE("iface %p, id %s, relationship %p.\n", iface, debugstr_w(id), relationship);
+
+    if (!relationship)
+        return E_POINTER;
+
+    *relationship = NULL;
+
+    if (!id)
+        return E_POINTER;
+
+    for (i = 0; i < relationship_set->count; i++)
+    {
+        if (!strcmpW(id, relationship_set->relationships[i]->id))
+        {
+            *relationship = &relationship_set->relationships[i]->IOpcRelationship_iface;
+            IOpcRelationship_AddRef(*relationship);
+            break;
+        }
+    }
+
+    return *relationship ? S_OK : OPC_E_NO_SUCH_RELATIONSHIP;
 }
 
 static HRESULT WINAPI opc_relationship_set_CreateRelationship(IOpcRelationshipSet *iface, const WCHAR *id,
diff --git a/dlls/opcservices/tests/opcservices.c b/dlls/opcservices/tests/opcservices.c
index a2a032f..63809aa 100644
--- a/dlls/opcservices/tests/opcservices.c
+++ b/dlls/opcservices/tests/opcservices.c
@@ -232,8 +232,8 @@ static void test_relationship(void)
     static const WCHAR typeW[] = {'t','y','p','e',0};
     static const WCHAR rootW[] = {'/',0};
     IUri *target_uri, *target_uri2, *uri;
+    IOpcRelationship *rel, *rel2, *rel3;
     IOpcUri *source_uri, *source_uri2;
-    IOpcRelationship *rel, *rel2;
     IOpcRelationshipSet *rels;
     IOpcFactory *factory;
     IOpcPackage *package;
@@ -283,6 +283,25 @@ todo_wine
     hr = IOpcRelationship_GetId(rel, &id);
     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));
+
+    hr = IOpcRelationshipSet_GetRelationship(rels, id, &rel3);
+    ok(SUCCEEDED(hr), "Failed to get relationship, hr %#x.\n", hr);
+    IOpcRelationship_Release(rel3);
+
+    hr = IOpcRelationshipSet_GetRelationship(rels, id, NULL);
+    ok(hr == E_POINTER, "Unexpected hr %#x.\n", hr);
+
+    rel3 = (void *)0xdeadbeef;
+    hr = IOpcRelationshipSet_GetRelationship(rels, NULL, &rel3);
+    ok(hr == E_POINTER, "Unexpected hr %#x.\n", hr);
+    ok(rel3 == NULL, "Expected null pointer.\n");
+
+    *id = 'r';
+    rel3 = (void *)0xdeadbeef;
+    hr = IOpcRelationshipSet_GetRelationship(rels, id, &rel3);
+    ok(hr == OPC_E_NO_SUCH_RELATIONSHIP, "Unexpected hr %#x.\n", hr);
+    ok(rel3 == NULL, "Expected null pointer.\n");
+
     CoTaskMemFree(id);
 
     hr = IOpcRelationship_GetTargetUri(rel, &uri);
diff --git a/include/opcbase.idl b/include/opcbase.idl
index 80f459f..ca42ceb 100644
--- a/include/opcbase.idl
+++ b/include/opcbase.idl
@@ -42,3 +42,4 @@ typedef [v1_enum] enum
 } OPC_URI_TARGET_MODE;
 
 cpp_quote("#define OPC_E_INVALID_RELATIONSHIP_TARGET MAKE_HRESULT(SEVERITY_ERROR, FACILITY_OPC, 0x12)")
+cpp_quote("#define OPC_E_NO_SUCH_RELATIONSHIP MAKE_HRESULT(SEVERITY_ERROR, FACILITY_OPC, 0x48)")




More information about the wine-cvs mailing list