[URLMON] Sync with Wine 3.0. CORE-14225
authorAmine Khaldi <amine.khaldi@reactos.org>
Sat, 20 Jan 2018 12:29:39 +0000 (13:29 +0100)
committerAmine Khaldi <amine.khaldi@reactos.org>
Sat, 20 Jan 2018 12:29:39 +0000 (13:29 +0100)
dll/win32/urlmon/axinstall.c
dll/win32/urlmon/usrmarshal.c
media/doc/README.WINE

index 18f8fdb..c84adbb 100644 (file)
@@ -243,12 +243,25 @@ static HRESULT install_inf_file(install_ctx_t *ctx)
 
     len = GetPrivateProfileStringW(add_codeW, NULL, NULL, buf, sizeof(buf)/sizeof(*buf), ctx->install_file);
     if(len) {
-        FIXME("[Add.Code] section not supported\n");
+        default_install = FALSE;
 
-        /* Don't throw an error if we successfully ran setup hooks;
-           installation is likely to be complete enough */
-        if(default_install)
-            return E_NOTIMPL;
+        for(key = buf; *key; key += strlenW(key)+1) {
+            TRACE("[Add.Code] key: %s\n", debugstr_w(key));
+
+            len = GetPrivateProfileStringW(add_codeW, key, NULL, sect_name, sizeof(sect_name)/sizeof(*sect_name),
+                    ctx->install_file);
+            if(!len) {
+                WARN("Could not get key value\n");
+                return E_FAIL;
+            }
+
+            hres = RunSetupCommandW(ctx->hwnd, ctx->install_file, sect_name,
+                    ctx->tmp_dir, NULL, NULL, RSC_FLAG_INF, NULL);
+            if(FAILED(hres)) {
+                WARN("RunSetupCommandW failed: %08x\n", hres);
+                return hres;
+            }
+        }
     }
 
     if(default_install) {
index 1e49325..fd8d6d2 100644 (file)
@@ -18,6 +18,8 @@
 
 #include "urlmon_main.h"
 
+#include <ole2.h>
+
 HRESULT CALLBACK IWinInetHttpInfo_QueryInfo_Proxy(IWinInetHttpInfo* This,
     DWORD dwOption, LPVOID pBuffer, DWORD *pcbBuf, DWORD *pdwFlags,
     DWORD *pdwReserved)
@@ -80,51 +82,281 @@ HRESULT __RPC_STUB IBindHost_MonikerBindToObject_Stub(IBindHost* This,
     return IBindHost_MonikerBindToObject(This, moniker, bc, bsc, riid, (void**)obj);
 }
 
+static HRESULT marshal_stgmed(STGMEDIUM *stgmed, RemSTGMEDIUM **ret)
+{
+    RemSTGMEDIUM *rem_stgmed;
+    IStream *stream = NULL;
+    ULONG size = 0;
+    HRESULT hres = S_OK;
+
+    if((stgmed->tymed == TYMED_ISTREAM && stgmed->u.pstm) || stgmed->pUnkForRelease) {
+        hres = CreateStreamOnHGlobal(NULL, TRUE, &stream);
+        if(FAILED(hres))
+            return hres;
+    }
+
+    switch(stgmed->tymed) {
+    case TYMED_NULL:
+        break;
+    case TYMED_ISTREAM:
+        if(stgmed->u.pstm)
+            hres = CoMarshalInterface(stream, &IID_IStream, (IUnknown*)stgmed->u.pstm,
+                                      MSHCTX_LOCAL, NULL, MSHLFLAGS_NORMAL);
+        break;
+    default:
+        FIXME("unsupported tymed %u\n", stgmed->tymed);
+        break;
+    }
+
+    if(SUCCEEDED(hres) && stgmed->pUnkForRelease)
+        hres = CoMarshalInterface(stream, &IID_IUnknown, stgmed->pUnkForRelease,
+                                  MSHCTX_LOCAL, NULL, MSHLFLAGS_NORMAL);
+    if(FAILED(hres)) {
+        if(stream)
+            IStream_Release(stream);
+        return hres;
+    }
+
+    if(stream) {
+        LARGE_INTEGER zero;
+        ULARGE_INTEGER off;
+
+        zero.QuadPart = 0;
+        IStream_Seek(stream, zero, STREAM_SEEK_CUR, &off);
+        size = off.QuadPart;
+        IStream_Seek(stream, zero, STREAM_SEEK_SET, &off);
+    }
+
+    rem_stgmed = heap_alloc_zero(FIELD_OFFSET(RemSTGMEDIUM, data[size]));
+    if(!rem_stgmed) {
+        if(stream)
+            IStream_Release(stream);
+        return E_OUTOFMEMORY;
+    }
+
+    rem_stgmed->tymed = stgmed->tymed;
+    rem_stgmed->dwHandleType = 0;
+    rem_stgmed->pData = stgmed->u.pstm != NULL;
+    rem_stgmed->pUnkForRelease = stgmed->pUnkForRelease != NULL;
+    rem_stgmed->cbData = size;
+    if(stream) {
+        IStream_Read(stream, rem_stgmed->data, size, &size);
+        IStream_Release(stream);
+    }
+
+    *ret = rem_stgmed;
+    return S_OK;
+}
+
+static HRESULT unmarshal_stgmed(RemSTGMEDIUM *rem_stgmed, STGMEDIUM *stgmed)
+{
+    IStream *stream = NULL;
+    HRESULT hres = S_OK;
+
+    stgmed->tymed = rem_stgmed->tymed;
+
+    if((stgmed->tymed == TYMED_ISTREAM && rem_stgmed->pData) || rem_stgmed->pUnkForRelease) {
+        LARGE_INTEGER zero;
+
+        hres = CreateStreamOnHGlobal(NULL, TRUE, &stream);
+        if(FAILED(hres))
+            return hres;
+
+        hres = IStream_Write(stream, rem_stgmed->data, rem_stgmed->cbData, NULL);
+        if(FAILED(hres)) {
+            IStream_Release(stream);
+            return hres;
+        }
+
+        zero.QuadPart = 0;
+        IStream_Seek(stream, zero, STREAM_SEEK_SET, NULL);
+    }
+
+    switch(stgmed->tymed) {
+    case TYMED_NULL:
+        break;
+    case TYMED_ISTREAM:
+        if(rem_stgmed->pData)
+            hres = CoUnmarshalInterface(stream, &IID_IStream, (void**)&stgmed->u.pstm);
+        break;
+    default:
+        FIXME("unsupported tymed %u\n", stgmed->tymed);
+        break;
+    }
+
+    if(SUCCEEDED(hres) && rem_stgmed->pUnkForRelease)
+        hres = CoUnmarshalInterface(stream, &IID_IUnknown, (void**)&stgmed->pUnkForRelease);
+    if(stream)
+        IStream_Release(stream);
+    return hres;
+}
+
+static void proxy_marshal_bindinfo(BINDINFO *bindinfo, RemBINDINFO *rem_bindinfo)
+{
+    rem_bindinfo->szExtraInfo = bindinfo->szExtraInfo;
+    rem_bindinfo->grfBindInfoF = bindinfo->grfBindInfoF;
+    rem_bindinfo->dwBindVerb = bindinfo->dwBindVerb;
+    rem_bindinfo->szCustomVerb = bindinfo->szCustomVerb;
+    rem_bindinfo->cbstgmedData = bindinfo->cbstgmedData;
+}
+
+static void proxy_unmarshal_bindinfo(RemBINDINFO *rem_bindinfo, BINDINFO *bindinfo)
+{
+    bindinfo->szExtraInfo = rem_bindinfo->szExtraInfo;
+    bindinfo->grfBindInfoF = rem_bindinfo->grfBindInfoF;
+    bindinfo->dwBindVerb = rem_bindinfo->dwBindVerb;
+    bindinfo->szCustomVerb = rem_bindinfo->szCustomVerb;
+    bindinfo->cbstgmedData = rem_bindinfo->cbstgmedData;
+    bindinfo->dwOptions = rem_bindinfo->dwOptions;
+    bindinfo->dwOptionsFlags = rem_bindinfo->dwOptionsFlags;
+    bindinfo->dwCodePage = rem_bindinfo->dwCodePage;
+    bindinfo->iid = IID_NULL;
+    bindinfo->pUnk = NULL;
+}
+
+static void stub_unmarshal_bindinfo(RemBINDINFO *rem_bindinfo, BINDINFO *bindinfo)
+{
+    bindinfo->szExtraInfo = rem_bindinfo->szExtraInfo;
+    bindinfo->grfBindInfoF = rem_bindinfo->grfBindInfoF;
+    bindinfo->dwBindVerb = rem_bindinfo->dwBindVerb;
+    bindinfo->szCustomVerb = rem_bindinfo->szCustomVerb;
+    bindinfo->cbstgmedData = rem_bindinfo->cbstgmedData;
+
+    if(bindinfo->stgmedData.tymed != TYMED_NULL)
+        WARN("stgmed data (tymed %u) will be lost!\n", bindinfo->stgmedData.tymed);
+}
+
+static void stub_marshal_bindinfo(BINDINFO *bindinfo, RemBINDINFO *rem_bindinfo)
+{
+    rem_bindinfo->cbSize = sizeof(*rem_bindinfo);
+    rem_bindinfo->szExtraInfo = bindinfo->szExtraInfo;
+    rem_bindinfo->grfBindInfoF = bindinfo->grfBindInfoF;
+    rem_bindinfo->dwBindVerb = bindinfo->dwBindVerb;
+    rem_bindinfo->szCustomVerb = bindinfo->szCustomVerb;
+    rem_bindinfo->cbstgmedData = bindinfo->cbstgmedData;
+    rem_bindinfo->dwOptions = bindinfo->dwOptions;
+    rem_bindinfo->dwOptionsFlags = bindinfo->dwOptionsFlags;
+    rem_bindinfo->dwCodePage = bindinfo->dwCodePage;
+    rem_bindinfo->pUnk = NULL;
+    rem_bindinfo->dwReserved = bindinfo->dwReserved;
+}
+
+
 HRESULT CALLBACK IBindStatusCallbackEx_GetBindInfoEx_Proxy(
-        IBindStatusCallbackEx* This, DWORD *grfBINDF, BINDINFO *pbindinfo,
+        IBindStatusCallbackEx* This, DWORD *grfBINDF, BINDINFO *bindinfo,
         DWORD *grfBINDF2, DWORD *pdwReserved)
 {
-    FIXME("stub\n");
-    return E_NOTIMPL;
+    RemBINDINFO rem_bindinfo = {sizeof(rem_bindinfo)};
+    RemSTGMEDIUM rem_stgmed = {0};
+    HRESULT hres;
+
+    TRACE("(%p)->(%p %p %p %p)\n", This, grfBINDF, bindinfo, grfBINDF2, pdwReserved);
+
+    proxy_marshal_bindinfo(bindinfo, &rem_bindinfo);
+    hres = IBindStatusCallbackEx_RemoteGetBindInfoEx_Proxy(This, grfBINDF, &rem_bindinfo,
+            &rem_stgmed, grfBINDF2, pdwReserved);
+    proxy_unmarshal_bindinfo(&rem_bindinfo, bindinfo);
+    return hres;
 }
 
 HRESULT __RPC_STUB IBindStatusCallbackEx_GetBindInfoEx_Stub(
-        IBindStatusCallbackEx* This, DWORD *grfBINDF, RemBINDINFO *pbindinfo,
-        RemSTGMEDIUM *pstgmed, DWORD *grfBINDF2, DWORD *pdwReserved)
+        IBindStatusCallbackEx* This, DWORD *grfBINDF, RemBINDINFO *rem_bindinfo,
+        RemSTGMEDIUM *rem_stgmed, DWORD *grfBINDF2, DWORD *pdwReserved)
 {
-    FIXME("stub\n");
-    return E_NOTIMPL;
-}
+    BINDINFO bindinfo = {sizeof(bindinfo)};
+    HRESULT hres;
 
+    TRACE("(%p)->(%p %p %p %p %p)\n", This, grfBINDF, rem_bindinfo, rem_stgmed, grfBINDF2, pdwReserved);
+
+    /*
+     * Although arguments suggest support for STGMEDIUM from BINDINFO, tests show
+     * that it's not supported and returned data is lost.
+     */
+    stub_unmarshal_bindinfo(rem_bindinfo, &bindinfo);
+    hres = IBindStatusCallbackEx_GetBindInfoEx(This, grfBINDF, &bindinfo, grfBINDF2, pdwReserved);
+    stub_marshal_bindinfo(&bindinfo, rem_bindinfo);
+    return hres;
+}
 HRESULT CALLBACK IBindStatusCallback_GetBindInfo_Proxy(
-        IBindStatusCallback* This, DWORD *grfBINDF, BINDINFO *pbindinfo)
+        IBindStatusCallback* This, DWORD *grfBINDF, BINDINFO *bindinfo)
 {
-    FIXME("stub\n");
-    return E_NOTIMPL;
+    RemBINDINFO rem_bindinfo = {sizeof(rem_bindinfo)};
+    RemSTGMEDIUM rem_stgmed = {0};
+    HRESULT hres;
+
+    TRACE("(%p)->(%p %p)\n", This, grfBINDF, bindinfo);
+
+    proxy_marshal_bindinfo(bindinfo, &rem_bindinfo);
+    hres = IBindStatusCallback_RemoteGetBindInfo_Proxy(This, grfBINDF, &rem_bindinfo, &rem_stgmed);
+    proxy_unmarshal_bindinfo(&rem_bindinfo, bindinfo);
+    return hres;
 }
 
 HRESULT __RPC_STUB IBindStatusCallback_GetBindInfo_Stub(
         IBindStatusCallback* This, DWORD *grfBINDF,
-        RemBINDINFO *pbindinfo, RemSTGMEDIUM *pstgmed)
+        RemBINDINFO *rem_bindinfo, RemSTGMEDIUM *rem_stgmed)
 {
-    FIXME("stub\n");
-    return E_NOTIMPL;
+    BINDINFO bindinfo = {sizeof(bindinfo)};
+    HRESULT hres;
+
+    TRACE("(%p)->(%p %p %p)\n", This, grfBINDF, rem_bindinfo, rem_stgmed);
+
+    stub_unmarshal_bindinfo(rem_bindinfo, &bindinfo);
+    hres = IBindStatusCallback_GetBindInfo(This, grfBINDF, &bindinfo);
+    stub_marshal_bindinfo(&bindinfo, rem_bindinfo);
+    return hres;
 }
 
 HRESULT CALLBACK IBindStatusCallback_OnDataAvailable_Proxy(
         IBindStatusCallback* This, DWORD grfBSCF, DWORD dwSize,
         FORMATETC *pformatetc, STGMEDIUM *pstgmed)
 {
-    FIXME("stub\n");
-    return E_NOTIMPL;
+    RemFORMATETC rem_formatetc;
+    RemSTGMEDIUM *rem_stgmed;
+    HRESULT hres;
+
+    TRACE("(%p)->(%x %u %p %p)\n", This, grfBSCF, dwSize, pformatetc, pstgmed);
+
+    hres = marshal_stgmed(pstgmed, &rem_stgmed);
+    if(FAILED(hres))
+        return hres;
+
+    rem_formatetc.cfFormat = pformatetc->cfFormat;
+    rem_formatetc.ptd = 0;
+    rem_formatetc.dwAspect = pformatetc->dwAspect;
+    rem_formatetc.lindex = pformatetc->lindex;
+    rem_formatetc.tymed = pformatetc->tymed;
+
+    hres = IBindStatusCallback_RemoteOnDataAvailable_Proxy(This, grfBSCF, dwSize, &rem_formatetc, rem_stgmed);
+
+    heap_free(rem_stgmed);
+    return hres;
 }
 
 HRESULT __RPC_STUB IBindStatusCallback_OnDataAvailable_Stub(
         IBindStatusCallback* This, DWORD grfBSCF, DWORD dwSize,
         RemFORMATETC *pformatetc, RemSTGMEDIUM *pstgmed)
 {
-    FIXME("stub\n");
-    return E_NOTIMPL;
+    STGMEDIUM stgmed = { TYMED_NULL };
+    FORMATETC formatetc;
+    HRESULT hres;
+
+    TRACE("(%p)->(%x %u %p %p)\n", This, grfBSCF, dwSize, pformatetc, pstgmed);
+
+    hres = unmarshal_stgmed(pstgmed, &stgmed);
+    if(FAILED(hres))
+        return hres;
+
+    formatetc.cfFormat = pformatetc->cfFormat;
+    formatetc.ptd = NULL;
+    formatetc.dwAspect = pformatetc->dwAspect;
+    formatetc.lindex = pformatetc->lindex;
+    formatetc.tymed = pformatetc->tymed;
+
+    hres = IBindStatusCallback_OnDataAvailable(This, grfBSCF, dwSize, &formatetc, &stgmed);
+
+    ReleaseStgMedium(&stgmed);
+    return hres;
 }
 
 HRESULT CALLBACK IBinding_GetBindResult_Proxy(IBinding* This,
index 5106521..14089f8 100644 (file)
@@ -188,7 +188,7 @@ reactos/dll/win32/traffic             # Synced to WineStaging-2.9
 reactos/dll/win32/twain_32            # Synced to Wine-3.0
 reactos/dll/win32/updspapi            # Synced to WineStaging-2.9
 reactos/dll/win32/url                 # Synced to WineStaging-2.9
-reactos/dll/win32/urlmon              # Synced to WineStaging-2.16
+reactos/dll/win32/urlmon              # Synced to Wine-3.0
 reactos/dll/win32/usp10               # Synced to Wine-3.0
 reactos/dll/win32/uxtheme             # Forked
 reactos/dll/win32/vbscript            # Synced to WineStaging-2.9