From 7e310f87fe1c781dcdbba854df84db29c86d1238 Mon Sep 17 00:00:00 2001 From: Nikolay Sivov Date: Thu, 6 Sep 2018 06:37:14 +0300 Subject: [PATCH] opcservices: Implement GetRelationship(). Signed-off-by: Nikolay Sivov Signed-off-by: Alexandre Julliard --- 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 00f4a4fa4bd..d0d39a98040 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 a2a032f4065..63809aad252 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 80f459fe8bf..ca42ceb4e33 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)")