Nikolay Sivov : opcservices: Add IOpcRelationshipSet stub.
Alexandre Julliard
julliard at winehq.org
Tue Sep 4 14:04:15 CDT 2018
Module: wine
Branch: master
Commit: bde0de68fc7b95cb7ebfd266a3c6d7268fb52868
URL: https://source.winehq.org/git/wine.git/?a=commit;h=bde0de68fc7b95cb7ebfd266a3c6d7268fb52868
Author: Nikolay Sivov <nsivov at codeweavers.com>
Date: Tue Sep 4 08:04:54 2018 +0300
opcservices: Add IOpcRelationshipSet stub.
Signed-off-by: Nikolay Sivov <nsivov at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
---
dlls/opcservices/package.c | 150 ++++++++++++++++++++++++++++++++++-
dlls/opcservices/tests/opcservices.c | 11 +++
2 files changed, 158 insertions(+), 3 deletions(-)
diff --git a/dlls/opcservices/package.c b/dlls/opcservices/package.c
index e673f0c..09014ff 100644
--- a/dlls/opcservices/package.c
+++ b/dlls/opcservices/package.c
@@ -35,6 +35,7 @@ struct opc_package
LONG refcount;
IOpcPartSet *part_set;
+ IOpcRelationshipSet *relationship_set;
};
struct opc_part
@@ -53,6 +54,12 @@ struct opc_part_set
LONG refcount;
};
+struct opc_relationship_set
+{
+ IOpcRelationshipSet IOpcRelationshipSet_iface;
+ LONG refcount;
+};
+
static inline struct opc_package *impl_from_IOpcPackage(IOpcPackage *iface)
{
return CONTAINING_RECORD(iface, struct opc_package, IOpcPackage_iface);
@@ -68,6 +75,11 @@ static inline struct opc_part *impl_from_IOpcPart(IOpcPart *iface)
return CONTAINING_RECORD(iface, struct opc_part, IOpcPart_iface);
}
+static inline struct opc_relationship_set *impl_from_IOpcRelationshipSet(IOpcRelationshipSet *iface)
+{
+ return CONTAINING_RECORD(iface, struct opc_relationship_set, IOpcRelationshipSet_iface);
+}
+
static WCHAR *opc_strdupW(const WCHAR *str)
{
WCHAR *ret = NULL;
@@ -85,7 +97,6 @@ static WCHAR *opc_strdupW(const WCHAR *str)
return ret;
}
-
static HRESULT WINAPI opc_part_QueryInterface(IOpcPart *iface, REFIID iid, void **out)
{
TRACE("iface %p, iid %s, out %p.\n", iface, debugstr_guid(iid), out);
@@ -299,6 +310,128 @@ static const IOpcPartSetVtbl opc_part_set_vtbl =
opc_part_set_GtEnumerator,
};
+static HRESULT WINAPI opc_relationship_set_QueryInterface(IOpcRelationshipSet *iface, REFIID iid, void **out)
+{
+ TRACE("iface %p, iid %s, out %p.\n", iface, debugstr_guid(iid), out);
+
+ if (IsEqualIID(iid, &IID_IOpcRelationshipSet) ||
+ IsEqualIID(iid, &IID_IUnknown))
+ {
+ *out = iface;
+ IOpcRelationshipSet_AddRef(iface);
+ return S_OK;
+ }
+
+ WARN("Unsupported interface %s.\n", debugstr_guid(iid));
+ return E_NOINTERFACE;
+}
+
+static ULONG WINAPI opc_relationship_set_AddRef(IOpcRelationshipSet *iface)
+{
+ struct opc_relationship_set *relationship_set = impl_from_IOpcRelationshipSet(iface);
+ ULONG refcount = InterlockedIncrement(&relationship_set->refcount);
+
+ TRACE("%p increasing refcount to %u.\n", iface, refcount);
+
+ return refcount;
+}
+
+static ULONG WINAPI opc_relationship_set_Release(IOpcRelationshipSet *iface)
+{
+ struct opc_relationship_set *relationship_set = impl_from_IOpcRelationshipSet(iface);
+ ULONG refcount = InterlockedDecrement(&relationship_set->refcount);
+
+ TRACE("%p decreasing refcount to %u.\n", iface, refcount);
+
+ if (!refcount)
+ heap_free(relationship_set);
+
+ return refcount;
+}
+
+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);
+
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI opc_relationship_set_CreateRelationship(IOpcRelationshipSet *iface, const WCHAR *id,
+ const WCHAR *type, IUri *target_uri, OPC_URI_TARGET_MODE target_mode, IOpcRelationship **relationship)
+{
+ FIXME("iface %p, id %s, type %s, target_uri %p, target_mode %d, relationship %p stub!\n", iface, debugstr_w(id),
+ debugstr_w(type), target_uri, target_mode, relationship);
+
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI opc_relationship_set_DeleteRelationship(IOpcRelationshipSet *iface, const WCHAR *id)
+{
+ FIXME("iface %p, id %s stub!\n", iface, debugstr_w(id));
+
+ return E_NOTIMPL;
+}
+
+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);
+
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI opc_relationship_set_GetEnumerator(IOpcRelationshipSet *iface,
+ IOpcRelationshipEnumerator **enumerator)
+{
+ FIXME("iface %p, enumerator %p stub!\n", iface, enumerator);
+
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI opc_relationship_set_GetEnumeratorForType(IOpcRelationshipSet *iface, const WCHAR *type,
+ IOpcRelationshipEnumerator **enumerator)
+{
+ FIXME("iface %p, type %s, enumerator %p stub!\n", iface, debugstr_w(type), enumerator);
+
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI opc_relationship_set_GetRelationshipsContentStream(IOpcRelationshipSet *iface, IStream **stream)
+{
+ FIXME("iface %p, stream %p stub!\n", iface, stream);
+
+ return E_NOTIMPL;
+}
+
+static const IOpcRelationshipSetVtbl opc_relationship_set_vtbl =
+{
+ opc_relationship_set_QueryInterface,
+ opc_relationship_set_AddRef,
+ opc_relationship_set_Release,
+ opc_relationship_set_GetRelationship,
+ opc_relationship_set_CreateRelationship,
+ opc_relationship_set_DeleteRelationship,
+ opc_relationship_set_RelationshipExists,
+ opc_relationship_set_GetEnumerator,
+ opc_relationship_set_GetEnumeratorForType,
+ opc_relationship_set_GetRelationshipsContentStream,
+};
+
+static HRESULT opc_relationship_set_create(IOpcRelationshipSet **out)
+{
+ struct opc_relationship_set *relationship_set;
+
+ if (!(relationship_set = heap_alloc_zero(sizeof(*relationship_set))))
+ return E_OUTOFMEMORY;
+
+ relationship_set->IOpcRelationshipSet_iface.lpVtbl = &opc_relationship_set_vtbl;
+ relationship_set->refcount = 1;
+
+ *out = &relationship_set->IOpcRelationshipSet_iface;
+ TRACE("Created relationship set %p.\n", *out);
+ return S_OK;
+}
+
static HRESULT WINAPI opc_package_QueryInterface(IOpcPackage *iface, REFIID iid, void **out)
{
TRACE("iface %p, iid %s, out %p.\n", iface, debugstr_guid(iid), out);
@@ -336,6 +469,8 @@ static ULONG WINAPI opc_package_Release(IOpcPackage *iface)
{
if (package->part_set)
IOpcPartSet_Release(package->part_set);
+ if (package->relationship_set)
+ IOpcRelationshipSet_Release(package->relationship_set);
heap_free(package);
}
@@ -368,9 +503,18 @@ static HRESULT WINAPI opc_package_GetPartSet(IOpcPackage *iface, IOpcPartSet **p
static HRESULT WINAPI opc_package_GetRelationshipSet(IOpcPackage *iface, IOpcRelationshipSet **relationship_set)
{
- FIXME("iface %p, relationship_set %p stub!\n", iface, relationship_set);
+ struct opc_package *package = impl_from_IOpcPackage(iface);
+ HRESULT hr;
- return E_NOTIMPL;
+ TRACE("iface %p, relationship_set %p.\n", iface, relationship_set);
+
+ if (!package->relationship_set && FAILED(hr = opc_relationship_set_create(&package->relationship_set)))
+ return hr;
+
+ *relationship_set = package->relationship_set;
+ IOpcRelationshipSet_AddRef(*relationship_set);
+
+ return S_OK;
}
static const IOpcPackageVtbl opc_package_vtbl =
diff --git a/dlls/opcservices/tests/opcservices.c b/dlls/opcservices/tests/opcservices.c
index 9ef44e6..118ef8f 100644
--- a/dlls/opcservices/tests/opcservices.c
+++ b/dlls/opcservices/tests/opcservices.c
@@ -38,6 +38,7 @@ static void test_package(void)
{
static const WCHAR typeW[] = {'t','y','p','e','/','s','u','b','t','y','p','e',0};
static const WCHAR uriW[] = {'/','u','r','i',0};
+ IOpcRelationshipSet *relset, *relset2;
IOpcPartSet *partset, *partset2;
IOpcPartUri *part_uri;
IOpcFactory *factory;
@@ -82,6 +83,16 @@ todo_wine {
IOpcPartUri_Release(part_uri);
IOpcPart_Release(part);
+ /* Relationships */
+ hr = IOpcPackage_GetRelationshipSet(package, &relset);
+ ok(SUCCEEDED(hr), "Failed to get relationship set, hr %#x.\n", hr);
+
+ hr = IOpcPackage_GetRelationshipSet(package, &relset2);
+ ok(SUCCEEDED(hr), "Failed to get relationship set, hr %#x.\n", hr);
+ ok(relset == relset2, "Expected same part set instance.\n");
+ IOpcRelationshipSet_Release(relset);
+ IOpcRelationshipSet_Release(relset2);
+
IOpcPackage_Release(package);
IOpcFactory_Release(factory);
More information about the wine-cvs
mailing list