[PATCH 4/7] opcservices: Keep target uri and mode for relationships.
Nikolay Sivov
nsivov at codeweavers.com
Wed Sep 5 00:37:26 CDT 2018
Signed-off-by: Nikolay Sivov <nsivov at codeweavers.com>
---
dlls/opcservices/package.c | 28 ++++++++++++++++++++++------
dlls/opcservices/tests/opcservices.c | 16 +++++++++++++---
2 files changed, 35 insertions(+), 9 deletions(-)
diff --git a/dlls/opcservices/package.c b/dlls/opcservices/package.c
index 1970fc447e..235dc974a0 100644
--- a/dlls/opcservices/package.c
+++ b/dlls/opcservices/package.c
@@ -66,6 +66,8 @@ struct opc_relationship
LONG refcount;
WCHAR *id;
+ IUri *target;
+ OPC_URI_TARGET_MODE target_mode;
};
struct opc_relationship_set
@@ -397,6 +399,7 @@ static ULONG WINAPI opc_relationship_Release(IOpcRelationship *iface)
if (!refcount)
{
CoTaskMemFree(relationship->id);
+ IUri_Release(relationship->target);
heap_free(relationship);
}
@@ -429,16 +432,25 @@ static HRESULT WINAPI opc_relationship_GetSourceUri(IOpcRelationship *iface, IOp
static HRESULT WINAPI opc_relationship_GetTargetUri(IOpcRelationship *iface, IUri **target)
{
- FIXME("iface %p, target %p stub!\n", iface, target);
+ struct opc_relationship *relationship = impl_from_IOpcRelationship(iface);
- return E_NOTIMPL;
+ TRACE("iface %p, target %p.\n", iface, target);
+
+ *target = relationship->target;
+ IUri_AddRef(*target);
+
+ return S_OK;
}
static HRESULT WINAPI opc_relationship_GetTargetMode(IOpcRelationship *iface, OPC_URI_TARGET_MODE *target_mode)
{
- FIXME("iface %p, target_mode %p stub!\n", iface, target_mode);
+ struct opc_relationship *relationship = impl_from_IOpcRelationship(iface);
- return E_NOTIMPL;
+ TRACE("iface %p, target_mode %p.\n", iface, target_mode);
+
+ *target_mode = relationship->target_mode;
+
+ return S_OK;
}
static const IOpcRelationshipVtbl opc_relationship_vtbl =
@@ -453,7 +465,8 @@ static const IOpcRelationshipVtbl opc_relationship_vtbl =
opc_relationship_GetTargetMode,
};
-static HRESULT opc_relationship_create(struct opc_relationship_set *set, const WCHAR *id, IOpcRelationship **out)
+static HRESULT opc_relationship_create(struct opc_relationship_set *set, const WCHAR *id, IUri *target_uri,
+ OPC_URI_TARGET_MODE target_mode, IOpcRelationship **out)
{
struct opc_relationship *relationship;
@@ -488,6 +501,9 @@ static HRESULT opc_relationship_create(struct opc_relationship_set *set, const W
return E_OUTOFMEMORY;
}
+ relationship->target = target_uri;
+ IUri_AddRef(relationship->target);
+
set->relationships[set->count++] = relationship;
IOpcRelationship_AddRef(&relationship->IOpcRelationship_iface);
@@ -561,7 +577,7 @@ static HRESULT WINAPI opc_relationship_set_CreateRelationship(IOpcRelationshipSe
if (!type || !target_uri)
return E_POINTER;
- return opc_relationship_create(relationship_set, id, relationship);
+ return opc_relationship_create(relationship_set, id, target_uri, target_mode, relationship);
}
static HRESULT WINAPI opc_relationship_set_DeleteRelationship(IOpcRelationshipSet *iface, const WCHAR *id)
diff --git a/dlls/opcservices/tests/opcservices.c b/dlls/opcservices/tests/opcservices.c
index 8232a7ed83..28507162c7 100644
--- a/dlls/opcservices/tests/opcservices.c
+++ b/dlls/opcservices/tests/opcservices.c
@@ -205,16 +205,17 @@ static void test_file_stream(void)
DeleteFileW(pathW);
}
-static void test_relationship_id(void)
+static void test_relationship(void)
{
static const WCHAR absoluteW[] = {'f','i','l','e',':','/','/','h','o','s','t','/','f','i','l','e','.','t','x','t',0};
static const WCHAR targetW[] = {'t','a','r','g','e','t',0};
static const WCHAR typeW[] = {'t','y','p','e',0};
- IUri *target_uri, *target_uri2;
+ IUri *target_uri, *target_uri2, *uri;
IOpcRelationshipSet *rels;
IOpcRelationship *rel;
IOpcFactory *factory;
IOpcPackage *package;
+ DWORD mode;
HRESULT hr;
WCHAR *id;
@@ -257,6 +258,15 @@ todo_wine
ok(lstrlenW(id) == 9 && *id == 'R', "Unexpected relationship id %s.\n", wine_dbgstr_w(id));
CoTaskMemFree(id);
+ hr = IOpcRelationship_GetTargetUri(rel, &uri);
+ ok(SUCCEEDED(hr), "Failed to get target uri, hr %#x.\n", hr);
+ ok(uri == target_uri, "Unexpected uri.\n");
+ IUri_Release(uri);
+
+ hr = IOpcRelationship_GetTargetMode(rel, &mode);
+ ok(SUCCEEDED(hr), "Failed to get target mode, hr %#x.\n", hr);
+ ok(mode == OPC_URI_TARGET_MODE_INTERNAL, "Unexpected mode %d.\n", mode);
+
IOpcRelationship_Release(rel);
IOpcRelationshipSet_Release(rels);
@@ -283,7 +293,7 @@ START_TEST(opcservices)
test_package();
test_file_stream();
- test_relationship_id();
+ test_relationship();
IOpcFactory_Release(factory);
--
2.18.0
More information about the wine-devel
mailing list