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