[PATCH 4/5] opcservices: Implement GetRelationship().
Nikolay Sivov
nsivov at codeweavers.com
Wed Sep 5 22:37:14 CDT 2018
Signed-off-by: Nikolay Sivov <nsivov at codeweavers.com>
---
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 00f4a4fa4b..d0d39a9804 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 a2a032f406..e370e97ba8 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 80f459fe8b..ca42ceb4e3 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)")
--
2.18.0
More information about the wine-devel
mailing list