[PATCH 3/3] opcservices: Add IOpcPartSet stub.

Nikolay Sivov nsivov at codeweavers.com
Thu Aug 30 17:45:16 CDT 2018


Signed-off-by: Nikolay Sivov <nsivov at codeweavers.com>
---
 dlls/opcservices/package.c | 128 ++++++++++++++++++++++++++++++++++++-
 1 file changed, 125 insertions(+), 3 deletions(-)

diff --git a/dlls/opcservices/package.c b/dlls/opcservices/package.c
index 527bf949e5..c49c980e65 100644
--- a/dlls/opcservices/package.c
+++ b/dlls/opcservices/package.c
@@ -32,6 +32,14 @@ struct opc_package
 {
     IOpcPackage IOpcPackage_iface;
     LONG refcount;
+
+    IOpcPartSet *part_set;
+};
+
+struct opc_part_set
+{
+    IOpcPartSet IOpcPartSet_iface;
+    LONG refcount;
 };
 
 static inline struct opc_package *impl_from_IOpcPackage(IOpcPackage *iface)
@@ -39,6 +47,99 @@ static inline struct opc_package *impl_from_IOpcPackage(IOpcPackage *iface)
     return CONTAINING_RECORD(iface, struct opc_package, IOpcPackage_iface);
 }
 
+static inline struct opc_part_set *impl_from_IOpcPartSet(IOpcPartSet *iface)
+{
+    return CONTAINING_RECORD(iface, struct opc_part_set, IOpcPartSet_iface);
+}
+
+static HRESULT WINAPI opc_part_set_QueryInterface(IOpcPartSet *iface, REFIID iid, void **out)
+{
+    TRACE("iface %p, iid %s, out %p.\n", iface, debugstr_guid(iid), out);
+
+    if (IsEqualIID(iid, &IID_IOpcPartSet) ||
+            IsEqualIID(iid, &IID_IUnknown))
+    {
+        *out = iface;
+        IOpcPartSet_AddRef(iface);
+        return S_OK;
+    }
+
+    WARN("Unsupported interface %s.\n", debugstr_guid(iid));
+    return E_NOINTERFACE;
+}
+
+static ULONG WINAPI opc_part_set_AddRef(IOpcPartSet *iface)
+{
+    struct opc_part_set *part_set = impl_from_IOpcPartSet(iface);
+    ULONG refcount = InterlockedIncrement(&part_set->refcount);
+
+    TRACE("%p increasing refcount to %u.\n", iface, refcount);
+
+    return refcount;
+}
+
+static ULONG WINAPI opc_part_set_Release(IOpcPartSet *iface)
+{
+    struct opc_part_set *part_set = impl_from_IOpcPartSet(iface);
+    ULONG refcount = InterlockedDecrement(&part_set->refcount);
+
+    TRACE("%p decreasing refcount to %u.\n", iface, refcount);
+
+    if (!refcount)
+        heap_free(part_set);
+
+    return refcount;
+}
+
+static HRESULT WINAPI opc_part_set_GetPart(IOpcPartSet *iface, IOpcPartUri *name, IOpcPart **part)
+{
+    FIXME("iface %p, name %p, part %p stub!\n", iface, name, part);
+
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI opc_part_set_CreatePart(IOpcPartSet *iface, IOpcPartUri *name, LPCWSTR content_type,
+        OPC_COMPRESSION_OPTIONS compression_options, IOpcPart **part)
+{
+    FIXME("iface %p, name %p, content_type %s, compression_options %#x, part %p stub!\n", iface, name,
+            debugstr_w(content_type), compression_options, part);
+
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI opc_part_set_DeletePart(IOpcPartSet *iface, IOpcPartUri *name)
+{
+    FIXME("iface %p, name %p stub!\n", iface, name);
+
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI opc_part_set_PartExists(IOpcPartSet *iface, IOpcPartUri *name, BOOL *exists)
+{
+    FIXME("iface %p, name %p, exists %p stub!\n", iface, name, exists);
+
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI opc_part_set_GtEnumerator(IOpcPartSet *iface, IOpcPartEnumerator **enumerator)
+{
+    FIXME("iface %p, enumerator %p stub!\n", iface, enumerator);
+
+    return E_NOTIMPL;
+}
+
+static const IOpcPartSetVtbl opc_part_set_vtbl =
+{
+    opc_part_set_QueryInterface,
+    opc_part_set_AddRef,
+    opc_part_set_Release,
+    opc_part_set_GetPart,
+    opc_part_set_CreatePart,
+    opc_part_set_DeletePart,
+    opc_part_set_PartExists,
+    opc_part_set_GtEnumerator,
+};
+
 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);
@@ -73,16 +174,37 @@ static ULONG WINAPI opc_package_Release(IOpcPackage *iface)
     TRACE("%p decreasing refcount to %u.\n", iface, refcount);
 
     if (!refcount)
+    {
+        if (package->part_set)
+            IOpcPartSet_Release(package->part_set);
         heap_free(package);
+    }
 
     return refcount;
 }
 
 static HRESULT WINAPI opc_package_GetPartSet(IOpcPackage *iface, IOpcPartSet **part_set)
 {
-    FIXME("iface %p, part_set %p stub!\n", iface, part_set);
+    struct opc_package *package = impl_from_IOpcPackage(iface);
 
-    return E_NOTIMPL;
+    TRACE("iface %p, part_set %p.\n", iface, part_set);
+
+    if (!package->part_set)
+    {
+        struct opc_part_set *part_set = heap_alloc_zero(sizeof(*part_set));
+        if (!part_set)
+            return E_OUTOFMEMORY;
+
+        part_set->IOpcPartSet_iface.lpVtbl = &opc_part_set_vtbl;
+        part_set->refcount = 1;
+
+        package->part_set = &part_set->IOpcPartSet_iface;
+    }
+
+    *part_set = package->part_set;
+    IOpcPartSet_AddRef(*part_set);
+
+    return S_OK;
 }
 
 static HRESULT WINAPI opc_package_GetRelationshipSet(IOpcPackage *iface, IOpcRelationshipSet **relationship_set)
@@ -105,7 +227,7 @@ HRESULT opc_package_create(IOpcPackage **out)
 {
     struct opc_package *package;
 
-    if (!(package = heap_alloc(sizeof(*package))))
+    if (!(package = heap_alloc_zero(sizeof(*package))))
         return E_OUTOFMEMORY;
 
     package->IOpcPackage_iface.lpVtbl = &opc_package_vtbl;
-- 
2.18.0




More information about the wine-devel mailing list