[PATCH 7/7] opcservices: Forward IOpcPartUri methods to urlmon implementation.

Nikolay Sivov nsivov at codeweavers.com
Wed Sep 5 00:37:29 CDT 2018


Signed-off-by: Nikolay Sivov <nsivov at codeweavers.com>
---
 dlls/opcservices/Makefile.in |   2 +-
 dlls/opcservices/uri.c       | 190 ++++++++++++++++++++++++-----------
 2 files changed, 135 insertions(+), 57 deletions(-)

diff --git a/dlls/opcservices/Makefile.in b/dlls/opcservices/Makefile.in
index 3e9907f011..f165b5ceb8 100644
--- a/dlls/opcservices/Makefile.in
+++ b/dlls/opcservices/Makefile.in
@@ -1,5 +1,5 @@
 MODULE  = opcservices.dll
-IMPORTS = uuid ole32 advapi32
+IMPORTS = uuid ole32 advapi32 urlmon
 
 C_SRCS = \
 	factory.c \
diff --git a/dlls/opcservices/uri.c b/dlls/opcservices/uri.c
index 651c2e38f0..594abc36f1 100644
--- a/dlls/opcservices/uri.c
+++ b/dlls/opcservices/uri.c
@@ -33,6 +33,8 @@ struct opc_uri
     IOpcPartUri IOpcPartUri_iface;
     LONG refcount;
     BOOL is_part_uri;
+
+    IUri *uri;
 };
 
 static inline struct opc_uri *impl_from_IOpcPartUri(IOpcPartUri *iface)
@@ -78,7 +80,10 @@ static ULONG WINAPI opc_uri_Release(IOpcPartUri *iface)
     TRACE("%p decreasing refcount to %u.\n", iface, refcount);
 
     if (!refcount)
+    {
+        IUri_Release(uri->uri);
         heap_free(uri);
+    }
 
     return refcount;
 }
@@ -86,180 +91,230 @@ static ULONG WINAPI opc_uri_Release(IOpcPartUri *iface)
 static HRESULT WINAPI opc_uri_GetPropertyBSTR(IOpcPartUri *iface, Uri_PROPERTY property,
         BSTR *value, DWORD flags)
 {
-    FIXME("iface %p, property %d, value %p, flags %#x stub!\n", iface, property, value, flags);
+    struct opc_uri *uri = impl_from_IOpcPartUri(iface);
 
-    return E_NOTIMPL;
+    TRACE("iface %p, property %d, value %p, flags %#x.\n", iface, property, value, flags);
+
+    return IUri_GetPropertyBSTR(uri->uri, property, value, flags);
 }
 
 static HRESULT WINAPI opc_uri_GetPropertyLength(IOpcPartUri *iface, Uri_PROPERTY property,
         DWORD *length, DWORD flags)
 {
-    FIXME("iface %p, property %d, length %p, flags %#x stub!\n", iface, property, length, flags);
+    struct opc_uri *uri = impl_from_IOpcPartUri(iface);
 
-    return E_NOTIMPL;
+    TRACE("iface %p, property %d, length %p, flags %#x.\n", iface, property, length, flags);
+
+    return IUri_GetPropertyLength(uri->uri, property, length, flags);
 }
 
 static HRESULT WINAPI opc_uri_GetPropertyDWORD(IOpcPartUri *iface, Uri_PROPERTY property,
         DWORD *value, DWORD flags)
 {
-    FIXME("iface %p, property %d, value %p, flags %#x stub!\n", iface, property, value, flags);
+    struct opc_uri *uri = impl_from_IOpcPartUri(iface);
 
-    return E_NOTIMPL;
+    TRACE("iface %p, property %d, value %p, flags %#x.\n", iface, property, value, flags);
+
+    return IUri_GetPropertyDWORD(uri->uri, property, value, flags);
 }
 
 static HRESULT WINAPI opc_uri_HasProperty(IOpcPartUri *iface, Uri_PROPERTY property,
         BOOL *has_property)
 {
-    FIXME("iface %p, property %d, has_property %p stub!\n", iface, property, has_property);
+    struct opc_uri *uri = impl_from_IOpcPartUri(iface);
 
-    return E_NOTIMPL;
+    TRACE("iface %p, property %d, has_property %p.\n", iface, property, has_property);
+
+    return IUri_HasProperty(uri->uri, property, has_property);
 }
 
 static HRESULT WINAPI opc_uri_GetAbsoluteUri(IOpcPartUri *iface, BSTR *value)
 {
-    FIXME("iface %p, value %p stub!\n", iface, value);
+    struct opc_uri *uri = impl_from_IOpcPartUri(iface);
 
-    return E_NOTIMPL;
+    TRACE("iface %p, value %p.\n", iface, value);
+
+    return IUri_GetAbsoluteUri(uri->uri, value);
 }
 
 static HRESULT WINAPI opc_uri_GetAuthority(IOpcPartUri *iface, BSTR *value)
 {
-    FIXME("iface %p, value %p stub!\n", iface, value);
+    struct opc_uri *uri = impl_from_IOpcPartUri(iface);
 
-    return E_NOTIMPL;
+    TRACE("iface %p, value %p.\n", iface, value);
+
+    return IUri_GetAuthority(uri->uri, value);
 }
 
 static HRESULT WINAPI opc_uri_GetDisplayUri(IOpcPartUri *iface, BSTR *value)
 {
-    FIXME("iface %p, value %p stub!\n", iface, value);
+    struct opc_uri *uri = impl_from_IOpcPartUri(iface);
 
-    return E_NOTIMPL;
+    TRACE("iface %p, value %p.\n", iface, value);
+
+    return IUri_GetDisplayUri(uri->uri, value);
 }
 
 static HRESULT WINAPI opc_uri_GetDomain(IOpcPartUri *iface, BSTR *value)
 {
-    FIXME("iface %p, value %p stub!\n", iface, value);
+    struct opc_uri *uri = impl_from_IOpcPartUri(iface);
 
-    return E_NOTIMPL;
+    TRACE("iface %p, value %p.\n", iface, value);
+
+    return IUri_GetDomain(uri->uri, value);
 }
 
 static HRESULT WINAPI opc_uri_GetExtension(IOpcPartUri *iface, BSTR *value)
 {
-    FIXME("iface %p, value %p stub!\n", iface, value);
+    struct opc_uri *uri = impl_from_IOpcPartUri(iface);
 
-    return E_NOTIMPL;
+    TRACE("iface %p, value %p.\n", iface, value);
+
+    return IUri_GetExtension(uri->uri, value);
 }
 
 static HRESULT WINAPI opc_uri_GetFragment(IOpcPartUri *iface, BSTR *value)
 {
-    FIXME("iface %p, value %p stub!\n", iface, value);
+    struct opc_uri *uri = impl_from_IOpcPartUri(iface);
 
-    return E_NOTIMPL;
+    TRACE("iface %p, value %p.\n", iface, value);
+
+    return IUri_GetFragment(uri->uri, value);
 }
 
 static HRESULT WINAPI opc_uri_GetHost(IOpcPartUri *iface, BSTR *value)
 {
-    FIXME("iface %p, value %p stub!\n", iface, value);
+    struct opc_uri *uri = impl_from_IOpcPartUri(iface);
 
-    return E_NOTIMPL;
+    TRACE("iface %p, value %p.\n", iface, value);
+
+    return IUri_GetHost(uri->uri, value);
 }
 
 static HRESULT WINAPI opc_uri_GetPassword(IOpcPartUri *iface, BSTR *value)
 {
-    FIXME("iface %p, value %p stub!\n", iface, value);
+    struct opc_uri *uri = impl_from_IOpcPartUri(iface);
 
-    return E_NOTIMPL;
+    TRACE("iface %p, value %p.\n", iface, value);
+
+    return IUri_GetPassword(uri->uri, value);
 }
 
 static HRESULT WINAPI opc_uri_GetPath(IOpcPartUri *iface, BSTR *value)
 {
-    FIXME("iface %p, value %p stub!\n", iface, value);
+    struct opc_uri *uri = impl_from_IOpcPartUri(iface);
 
-    return E_NOTIMPL;
+    TRACE("iface %p, value %p.\n", iface, value);
+
+    return IUri_GetPath(uri->uri, value);
 }
 
 static HRESULT WINAPI opc_uri_GetPathAndQuery(IOpcPartUri *iface, BSTR *value)
 {
-    FIXME("iface %p, value %p stub!\n", iface, value);
+    struct opc_uri *uri = impl_from_IOpcPartUri(iface);
 
-    return E_NOTIMPL;
+    TRACE("iface %p, value %p.\n", iface, value);
+
+    return IUri_GetPathAndQuery(uri->uri, value);
 }
 
 static HRESULT WINAPI opc_uri_GetQuery(IOpcPartUri *iface, BSTR *value)
 {
-    FIXME("iface %p, value %p stub!\n", iface, value);
+    struct opc_uri *uri = impl_from_IOpcPartUri(iface);
 
-    return E_NOTIMPL;
+    TRACE("iface %p, value %p.\n", iface, value);
+
+    return IUri_GetQuery(uri->uri, value);
 }
 
 static HRESULT WINAPI opc_uri_GetRawUri(IOpcPartUri *iface, BSTR *value)
 {
-    FIXME("iface %p, value %p stub!\n", iface, value);
+    struct opc_uri *uri = impl_from_IOpcPartUri(iface);
 
-    return E_NOTIMPL;
+    TRACE("iface %p, value %p.\n", iface, value);
+
+    return IUri_GetRawUri(uri->uri, value);
 }
 
 static HRESULT WINAPI opc_uri_GetSchemeName(IOpcPartUri *iface, BSTR *value)
 {
-    FIXME("iface %p, value %p stub!\n", iface, value);
+    struct opc_uri *uri = impl_from_IOpcPartUri(iface);
 
-    return E_NOTIMPL;
+    TRACE("iface %p, value %p.\n", iface, value);
+
+    return IUri_GetSchemeName(uri->uri, value);
 }
 
 static HRESULT WINAPI opc_uri_GetUserInfo(IOpcPartUri *iface, BSTR *value)
 {
-    FIXME("iface %p, value %p stub!\n", iface, value);
+    struct opc_uri *uri = impl_from_IOpcPartUri(iface);
 
-    return E_NOTIMPL;
+    TRACE("iface %p, value %p.\n", iface, value);
+
+    return IUri_GetUserInfo(uri->uri, value);
 }
 
 static HRESULT WINAPI opc_uri_GetUserName(IOpcPartUri *iface, BSTR *value)
 {
-    FIXME("iface %p, value %p stub!\n", iface, value);
+    struct opc_uri *uri = impl_from_IOpcPartUri(iface);
 
-    return E_NOTIMPL;
+    TRACE("iface %p, value %p.\n", iface, value);
+
+    return IUri_GetUserName(uri->uri, value);
 }
 
 static HRESULT WINAPI opc_uri_GetHostType(IOpcPartUri *iface, DWORD *value)
 {
-    FIXME("iface %p, value %p stub!\n", iface, value);
+    struct opc_uri *uri = impl_from_IOpcPartUri(iface);
 
-    return E_NOTIMPL;
+    TRACE("iface %p, value %p.\n", iface, value);
+
+    return IUri_GetHostType(uri->uri, value);
 }
 
 static HRESULT WINAPI opc_uri_GetPort(IOpcPartUri *iface, DWORD *value)
 {
-    FIXME("iface %p, value %p stub!\n", iface, value);
+    struct opc_uri *uri = impl_from_IOpcPartUri(iface);
 
-    return E_NOTIMPL;
+    TRACE("iface %p, value %p.\n", iface, value);
+
+    return IUri_GetPort(uri->uri, value);
 }
 
 static HRESULT WINAPI opc_uri_GetScheme(IOpcPartUri *iface, DWORD *value)
 {
-    FIXME("iface %p, value %p stub!\n", iface, value);
+    struct opc_uri *uri = impl_from_IOpcPartUri(iface);
 
-    return E_NOTIMPL;
+    TRACE("iface %p, value %p.\n", iface, value);
+
+    return IUri_GetScheme(uri->uri, value);
 }
 
 static HRESULT WINAPI opc_uri_GetZone(IOpcPartUri *iface, DWORD *value)
 {
-    FIXME("iface %p, value %p stub!\n", iface, value);
+    struct opc_uri *uri = impl_from_IOpcPartUri(iface);
 
-    return E_NOTIMPL;
+    TRACE("iface %p, value %p.\n", iface, value);
+
+    return IUri_GetZone(uri->uri, value);
 }
 
 static HRESULT WINAPI opc_uri_GetProperties(IOpcPartUri *iface, DWORD *flags)
 {
-    FIXME("iface %p, flags %p stub!\n", iface, flags);
+    struct opc_uri *uri = impl_from_IOpcPartUri(iface);
 
-    return E_NOTIMPL;
+    TRACE("iface %p, flags %p.\n", iface, flags);
+
+    return IUri_GetProperties(uri->uri, flags);
 }
 
-static HRESULT WINAPI opc_uri_IsEqual(IOpcPartUri *iface, IUri *uri, BOOL *is_equal)
+static HRESULT WINAPI opc_uri_IsEqual(IOpcPartUri *iface, IUri *comparand, BOOL *is_equal)
 {
-    FIXME("iface %p, uri %p, is_equal %p stub!\n", iface, uri, is_equal);
+    struct opc_uri *uri = impl_from_IOpcPartUri(iface);
 
-    return E_NOTIMPL;
+    TRACE("iface %p, comparand %p, is_equal %p.\n", iface, comparand, is_equal);
+
+    return IUri_IsEqual(uri->uri, comparand, is_equal);
 }
 
 static HRESULT WINAPI opc_uri_GetRelationshipsPartUri(IOpcPartUri *iface, IOpcPartUri **part_uri)
@@ -344,16 +399,34 @@ static const IOpcPartUriVtbl opc_part_uri_vtbl =
     opc_uri_IsRelationshipsPartUri,
 };
 
+static HRESULT opc_part_uri_init(struct opc_uri *object, BOOL is_part_uri, const WCHAR *uri)
+{
+    HRESULT hr;
+
+    object->IOpcPartUri_iface.lpVtbl = &opc_part_uri_vtbl;
+    object->refcount = 1;
+    object->is_part_uri = is_part_uri;
+
+    if (FAILED(hr = CreateUri(uri, Uri_CREATE_ALLOW_RELATIVE, 0, &object->uri)))
+        return hr;
+
+    return S_OK;
+}
+
 HRESULT opc_part_uri_create(const WCHAR *str, IOpcPartUri **out)
 {
     struct opc_uri *uri;
+    HRESULT hr;
 
     if (!(uri = heap_alloc_zero(sizeof(*uri))))
         return E_OUTOFMEMORY;
 
-    uri->IOpcPartUri_iface.lpVtbl = &opc_part_uri_vtbl;
-    uri->refcount = 1;
-    uri->is_part_uri = TRUE;
+    if (FAILED(hr = opc_part_uri_init(uri, TRUE, str)))
+    {
+        WARN("Failed to init part uri, hr %#x.\n", hr);
+        heap_free(uri);
+        return hr;
+    }
 
     *out = &uri->IOpcPartUri_iface;
     TRACE("Created part uri %p.\n", *out);
@@ -363,12 +436,17 @@ HRESULT opc_part_uri_create(const WCHAR *str, IOpcPartUri **out)
 HRESULT opc_uri_create(const WCHAR *str, IOpcUri **out)
 {
     struct opc_uri *uri;
+    HRESULT hr;
 
     if (!(uri = heap_alloc_zero(sizeof(*uri))))
         return E_OUTOFMEMORY;
 
-    uri->IOpcPartUri_iface.lpVtbl = &opc_part_uri_vtbl;
-    uri->refcount = 1;
+    if (FAILED(hr = opc_part_uri_init(uri, FALSE, str)))
+    {
+        WARN("Failed to init uri, hr %#x.\n", hr);
+        heap_free(uri);
+        return hr;
+    }
 
     *out = (IOpcUri *)&uri->IOpcPartUri_iface;
     TRACE("Created part uri %p.\n", *out);
-- 
2.18.0




More information about the wine-devel mailing list