[PATCH 5/5] opcservices: Implement RelationshipExists().
Nikolay Sivov
nsivov at codeweavers.com
Wed Sep 5 22:37:15 CDT 2018
Signed-off-by: Nikolay Sivov <nsivov at codeweavers.com>
---
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 d0d39a9804..370b42e83b 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 e370e97ba8..2deaf30809 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);
--
2.18.0
More information about the wine-devel
mailing list