Commit 59055c4d authored by Jacek Caban's avatar Jacek Caban Committed by Alexandre Julliard

urlmon: Added AsyncInstallDistributionUnit implementation.

parent 8012d4ae
...@@ -3,8 +3,10 @@ IMPORTLIB = urlmon ...@@ -3,8 +3,10 @@ IMPORTLIB = urlmon
IMPORTS = uuid ole32 oleaut32 shell32 rpcrt4 shlwapi wininet user32 advapi32 IMPORTS = uuid ole32 oleaut32 shell32 rpcrt4 shlwapi wininet user32 advapi32
EXTRADEFS = -D_URLMON_ -DENTRY_PREFIX=URLMON_ -DPROXY_DELEGATION -DWINE_REGISTER_DLL \ EXTRADEFS = -D_URLMON_ -DENTRY_PREFIX=URLMON_ -DPROXY_DELEGATION -DWINE_REGISTER_DLL \
-DPROXY_CLSID_IS="{0x79EAC9F1,0xBAF9,0x11CE,{0x8C,0x82,0x00,0xAA,0x00,0x4B,0xA9,0x0B}}" -DPROXY_CLSID_IS="{0x79EAC9F1,0xBAF9,0x11CE,{0x8C,0x82,0x00,0xAA,0x00,0x4B,0xA9,0x0B}}"
DELAYIMPORTS = advpack
C_SRCS = \ C_SRCS = \
axinstall.c \
bindctx.c \ bindctx.c \
binding.c \ binding.c \
bindprot.c \ bindprot.c \
......
...@@ -66,7 +66,7 @@ static IBindStatusCallback *bsch_from_bctx(IBindCtx *bctx) ...@@ -66,7 +66,7 @@ static IBindStatusCallback *bsch_from_bctx(IBindCtx *bctx)
return SUCCEEDED(hres) ? bsc : NULL; return SUCCEEDED(hres) ? bsc : NULL;
} }
static IBindStatusCallback *bsc_from_bctx(IBindCtx *bctx) IBindStatusCallback *bsc_from_bctx(IBindCtx *bctx)
{ {
BindStatusCallback *holder; BindStatusCallback *holder;
IBindStatusCallback *bsc; IBindStatusCallback *bsc;
......
...@@ -31,6 +31,10 @@ typedef struct { ...@@ -31,6 +31,10 @@ typedef struct {
IBinding *binding; IBinding *binding;
LPWSTR file_name; LPWSTR file_name;
LPWSTR cache_file; LPWSTR cache_file;
DWORD bindf;
stop_cache_binding_proc_t onstop_proc;
void *ctx;
} DownloadBSC; } DownloadBSC;
static inline DownloadBSC *impl_from_IBindStatusCallback(IBindStatusCallback *iface) static inline DownloadBSC *impl_from_IBindStatusCallback(IBindStatusCallback *iface)
...@@ -189,6 +193,7 @@ static HRESULT WINAPI DownloadBSC_OnStopBinding(IBindStatusCallback *iface, ...@@ -189,6 +193,7 @@ static HRESULT WINAPI DownloadBSC_OnStopBinding(IBindStatusCallback *iface,
HRESULT hresult, LPCWSTR szError) HRESULT hresult, LPCWSTR szError)
{ {
DownloadBSC *This = impl_from_IBindStatusCallback(iface); DownloadBSC *This = impl_from_IBindStatusCallback(iface);
HRESULT hres = S_OK;
TRACE("(%p)->(%08x %s)\n", This, hresult, debugstr_w(szError)); TRACE("(%p)->(%08x %s)\n", This, hresult, debugstr_w(szError));
...@@ -204,7 +209,9 @@ static HRESULT WINAPI DownloadBSC_OnStopBinding(IBindStatusCallback *iface, ...@@ -204,7 +209,9 @@ static HRESULT WINAPI DownloadBSC_OnStopBinding(IBindStatusCallback *iface,
} }
} }
if(This->callback) if(This->onstop_proc)
hres = This->onstop_proc(This->ctx, This->cache_file, hresult, szError);
else if(This->callback)
IBindStatusCallback_OnStopBinding(This->callback, hresult, szError); IBindStatusCallback_OnStopBinding(This->callback, hresult, szError);
if(This->binding) { if(This->binding) {
...@@ -212,7 +219,7 @@ static HRESULT WINAPI DownloadBSC_OnStopBinding(IBindStatusCallback *iface, ...@@ -212,7 +219,7 @@ static HRESULT WINAPI DownloadBSC_OnStopBinding(IBindStatusCallback *iface,
This->binding = NULL; This->binding = NULL;
} }
return S_OK; return hres;
} }
static HRESULT WINAPI DownloadBSC_GetBindInfo(IBindStatusCallback *iface, static HRESULT WINAPI DownloadBSC_GetBindInfo(IBindStatusCallback *iface,
...@@ -235,7 +242,7 @@ static HRESULT WINAPI DownloadBSC_GetBindInfo(IBindStatusCallback *iface, ...@@ -235,7 +242,7 @@ static HRESULT WINAPI DownloadBSC_GetBindInfo(IBindStatusCallback *iface,
ReleaseBindInfo(&bindinfo); ReleaseBindInfo(&bindinfo);
} }
*grfBINDF = BINDF_PULLDATA | BINDF_NEEDFILE | (bindf & BINDF_ENFORCERESTRICTED); *grfBINDF = BINDF_PULLDATA | BINDF_NEEDFILE | (bindf & BINDF_ENFORCERESTRICTED) | This->bindf;
return S_OK; return S_OK;
} }
...@@ -323,39 +330,84 @@ static const IServiceProviderVtbl ServiceProviderVtbl = { ...@@ -323,39 +330,84 @@ static const IServiceProviderVtbl ServiceProviderVtbl = {
DwlServiceProvider_QueryService DwlServiceProvider_QueryService
}; };
static HRESULT DownloadBSC_Create(IBindStatusCallback *callback, LPCWSTR file_name, IBindStatusCallback **ret_callback) static HRESULT DownloadBSC_Create(IBindStatusCallback *callback, LPCWSTR file_name, DownloadBSC **ret_callback)
{ {
DownloadBSC *ret = heap_alloc(sizeof(*ret)); DownloadBSC *ret;
ret = heap_alloc_zero(sizeof(*ret));
if(!ret)
return E_OUTOFMEMORY;
ret->IBindStatusCallback_iface.lpVtbl = &BindStatusCallbackVtbl; ret->IBindStatusCallback_iface.lpVtbl = &BindStatusCallbackVtbl;
ret->IServiceProvider_iface.lpVtbl = &ServiceProviderVtbl; ret->IServiceProvider_iface.lpVtbl = &ServiceProviderVtbl;
ret->ref = 1; ret->ref = 1;
if(file_name) {
ret->file_name = heap_strdupW(file_name); ret->file_name = heap_strdupW(file_name);
ret->cache_file = NULL; if(!ret->file_name) {
ret->binding = NULL; heap_free(ret);
return E_OUTOFMEMORY;
}
}
if(callback) if(callback)
IBindStatusCallback_AddRef(callback); IBindStatusCallback_AddRef(callback);
ret->callback = callback; ret->callback = callback;
*ret_callback = &ret->IBindStatusCallback_iface; *ret_callback = ret;
return S_OK; return S_OK;
} }
HRESULT create_default_callback(IBindStatusCallback **ret) HRESULT create_default_callback(IBindStatusCallback **ret)
{ {
IBindStatusCallback *callback; DownloadBSC *callback;
HRESULT hres; HRESULT hres;
hres = DownloadBSC_Create(NULL, NULL, &callback); hres = DownloadBSC_Create(NULL, NULL, &callback);
if(FAILED(hres)) if(FAILED(hres))
return hres; return hres;
hres = wrap_callback(callback, ret); hres = wrap_callback(&callback->IBindStatusCallback_iface, ret);
IBindStatusCallback_Release(callback); IBindStatusCallback_Release(&callback->IBindStatusCallback_iface);
return hres; return hres;
} }
HRESULT download_to_cache(IUri *uri, stop_cache_binding_proc_t proc, void *ctx, IBindStatusCallback *callback)
{
DownloadBSC *dwl_bsc;
IBindCtx *bindctx;
IMoniker *mon;
IUnknown *unk;
HRESULT hres;
hres = DownloadBSC_Create(callback, NULL, &dwl_bsc);
if(FAILED(hres))
return hres;
dwl_bsc->onstop_proc = proc;
dwl_bsc->ctx = ctx;
dwl_bsc->bindf = BINDF_ASYNCHRONOUS;
hres = CreateAsyncBindCtx(0, &dwl_bsc->IBindStatusCallback_iface, NULL, &bindctx);
IBindStatusCallback_Release(&dwl_bsc->IBindStatusCallback_iface);
if(FAILED(hres))
return hres;
hres = CreateURLMonikerEx2(NULL, uri, &mon, 0);
if(FAILED(hres)) {
IBindCtx_Release(bindctx);
return hres;
}
hres = IMoniker_BindToStorage(mon, bindctx, NULL, &IID_IUnknown, (void**)&unk);
IMoniker_Release(mon);
IBindCtx_Release(bindctx);
if(SUCCEEDED(hres) && unk)
IUnknown_Release(unk);
return hres;
}
/*********************************************************************** /***********************************************************************
* URLDownloadToFileW (URLMON.@) * URLDownloadToFileW (URLMON.@)
* *
...@@ -375,7 +427,7 @@ HRESULT create_default_callback(IBindStatusCallback **ret) ...@@ -375,7 +427,7 @@ HRESULT create_default_callback(IBindStatusCallback **ret)
HRESULT WINAPI URLDownloadToFileW(LPUNKNOWN pCaller, LPCWSTR szURL, LPCWSTR szFileName, HRESULT WINAPI URLDownloadToFileW(LPUNKNOWN pCaller, LPCWSTR szURL, LPCWSTR szFileName,
DWORD dwReserved, LPBINDSTATUSCALLBACK lpfnCB) DWORD dwReserved, LPBINDSTATUSCALLBACK lpfnCB)
{ {
IBindStatusCallback *callback; DownloadBSC *callback;
IUnknown *unk; IUnknown *unk;
IMoniker *mon; IMoniker *mon;
IBindCtx *bindctx; IBindCtx *bindctx;
...@@ -390,8 +442,8 @@ HRESULT WINAPI URLDownloadToFileW(LPUNKNOWN pCaller, LPCWSTR szURL, LPCWSTR szFi ...@@ -390,8 +442,8 @@ HRESULT WINAPI URLDownloadToFileW(LPUNKNOWN pCaller, LPCWSTR szURL, LPCWSTR szFi
if(FAILED(hres)) if(FAILED(hres))
return hres; return hres;
hres = CreateAsyncBindCtx(0, callback, NULL, &bindctx); hres = CreateAsyncBindCtx(0, &callback->IBindStatusCallback_iface, NULL, &bindctx);
IBindStatusCallback_Release(callback); IBindStatusCallback_Release(&callback->IBindStatusCallback_iface);
if(FAILED(hres)) if(FAILED(hres))
return hres; return hres;
......
/*
* Copyright 2012 Jacek Caban for CodeWeavers
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
#define ID_AXINSTALL_WARNING_DLG 1000
#define ID_AXINSTALL_LOCATION 1001
#define ID_AXINSTALL_INSTALL_BTN 1002
#define ID_AXINSTALL_ICON 1003
#define IDS_AXINSTALL_FAILURE 1100
#define IDS_AXINSTALL_INSTALLN 1101
#define IDS_AXINSTALL_INSTALL 1102
...@@ -16,6 +16,41 @@ ...@@ -16,6 +16,41 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/ */
#include <windef.h>
#include <winuser.h>
#include <commctrl.h>
#include "resource.h"
LANGUAGE LANG_ENGLISH, SUBLANG_DEFAULT
ID_AXINSTALL_WARNING_DLG DIALOG 0, 0, 260, 115
STYLE DS_MODALFRAME | DS_CENTER | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
CAPTION "Security Warning"
FONT 8, "MS Shell Dlg"
{
CONTROL "Do you want to install this software?",
100, "static", SS_LEFT | WS_CHILD | WS_VISIBLE, 10, 10, 240, 23
CONTROL "Location:", 101, "static", SS_LEFT | WS_CHILD | WS_VISIBLE, 10, 26, 40, 13
CONTROL "", ID_AXINSTALL_LOCATION, "static", SS_LEFT | WS_CHILD | WS_VISIBLE, 50, 26, 200, 13
DEFPUSHBUTTON "Don't install", IDCANCEL, 200, 48, 50, 14, WS_GROUP | WS_TABSTOP
PUSHBUTTON "", ID_AXINSTALL_INSTALL_BTN, 144, 48, 50, 14, WS_GROUP | WS_TABSTOP | WS_DISABLED
CONTROL "", 102, "static", SS_ETCHEDHORZ, 10, 70, 240, 1
ICON "", ID_AXINSTALL_ICON, 10, 82, 32, 32, WS_CHILD | WS_VISIBLE
CONTROL "When installed, ActiveX has full access to your computer." \
"Do not click install unless you have absolute trust in the above source.",
22002, "static", SS_LEFT | WS_CHILD | WS_VISIBLE, 46, 80, 194, 23
}
STRINGTABLE
{
IDS_AXINSTALL_FAILURE "Installation of component failed: %08x"
IDS_AXINSTALL_INSTALLN "Install (%d)"
IDS_AXINSTALL_INSTALL "Install"
}
LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL
/* @makedep: urlmon.rgs */ /* @makedep: urlmon.rgs */
1 WINE_REGISTRY urlmon.rgs 1 WINE_REGISTRY urlmon.rgs
......
...@@ -950,14 +950,3 @@ HRESULT WINAPI GetSoftwareUpdateInfo( LPCWSTR szDistUnit, LPSOFTDISTINFO psdi ) ...@@ -950,14 +950,3 @@ HRESULT WINAPI GetSoftwareUpdateInfo( LPCWSTR szDistUnit, LPSOFTDISTINFO psdi )
FIXME("%s %p\n", debugstr_w(szDistUnit), psdi ); FIXME("%s %p\n", debugstr_w(szDistUnit), psdi );
return E_FAIL; return E_FAIL;
} }
/***********************************************************************
* AsyncInstallDistributionUnit (URLMON.@)
*/
HRESULT WINAPI AsyncInstallDistributionUnit( LPCWSTR szDistUnit, LPCWSTR szTYPE,
LPCWSTR szExt, DWORD dwFileVersionMS, DWORD dwFileVersionLS,
LPCWSTR szURL, IBindCtx *pbc, LPVOID pvReserved, DWORD flags )
{
FIXME(": stub\n");
return E_NOTIMPL;
}
...@@ -38,6 +38,7 @@ WINE_DEFAULT_DEBUG_CHANNEL(urlmon); ...@@ -38,6 +38,7 @@ WINE_DEFAULT_DEBUG_CHANNEL(urlmon);
DEFINE_GUID(CLSID_CUri, 0xDF2FCE13, 0x25EC, 0x45BB, 0x9D,0x4C, 0xCE,0xCD,0x47,0xC2,0x43,0x0C); DEFINE_GUID(CLSID_CUri, 0xDF2FCE13, 0x25EC, 0x45BB, 0x9D,0x4C, 0xCE,0xCD,0x47,0xC2,0x43,0x0C);
LONG URLMON_refCount = 0; LONG URLMON_refCount = 0;
HINSTANCE urlmon_instance;
static HMODULE hCabinet = NULL; static HMODULE hCabinet = NULL;
static DWORD urlmon_tls = TLS_OUT_OF_INDEXES; static DWORD urlmon_tls = TLS_OUT_OF_INDEXES;
...@@ -151,6 +152,7 @@ BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID fImpLoad) ...@@ -151,6 +152,7 @@ BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID fImpLoad)
switch(fdwReason) { switch(fdwReason) {
case DLL_PROCESS_ATTACH: case DLL_PROCESS_ATTACH:
urlmon_instance = hinstDLL;
init_session(); init_session();
break; break;
......
...@@ -64,6 +64,8 @@ extern LONG URLMON_refCount DECLSPEC_HIDDEN; ...@@ -64,6 +64,8 @@ extern LONG URLMON_refCount DECLSPEC_HIDDEN;
static inline void URLMON_LockModule(void) { InterlockedIncrement( &URLMON_refCount ); } static inline void URLMON_LockModule(void) { InterlockedIncrement( &URLMON_refCount ); }
static inline void URLMON_UnlockModule(void) { InterlockedDecrement( &URLMON_refCount ); } static inline void URLMON_UnlockModule(void) { InterlockedDecrement( &URLMON_refCount ); }
extern HINSTANCE urlmon_instance;
IInternetProtocolInfo *get_protocol_info(LPCWSTR) DECLSPEC_HIDDEN; IInternetProtocolInfo *get_protocol_info(LPCWSTR) DECLSPEC_HIDDEN;
HRESULT get_protocol_handler(IUri*,CLSID*,BOOL*,IClassFactory**) DECLSPEC_HIDDEN; HRESULT get_protocol_handler(IUri*,CLSID*,BOOL*,IClassFactory**) DECLSPEC_HIDDEN;
IInternetProtocol *get_mime_filter(LPCWSTR) DECLSPEC_HIDDEN; IInternetProtocol *get_mime_filter(LPCWSTR) DECLSPEC_HIDDEN;
...@@ -78,6 +80,10 @@ HRESULT bind_to_object(IMoniker*,IUri*,IBindCtx*,REFIID,void**ppv) DECLSPEC_HIDD ...@@ -78,6 +80,10 @@ HRESULT bind_to_object(IMoniker*,IUri*,IBindCtx*,REFIID,void**ppv) DECLSPEC_HIDD
HRESULT create_default_callback(IBindStatusCallback**) DECLSPEC_HIDDEN; HRESULT create_default_callback(IBindStatusCallback**) DECLSPEC_HIDDEN;
HRESULT wrap_callback(IBindStatusCallback*,IBindStatusCallback**) DECLSPEC_HIDDEN; HRESULT wrap_callback(IBindStatusCallback*,IBindStatusCallback**) DECLSPEC_HIDDEN;
IBindStatusCallback *bsc_from_bctx(IBindCtx*) DECLSPEC_HIDDEN;
typedef HRESULT (*stop_cache_binding_proc_t)(void*,const WCHAR*,HRESULT,const WCHAR*);
HRESULT download_to_cache(IUri*,stop_cache_binding_proc_t,void*,IBindStatusCallback*) DECLSPEC_HIDDEN;
typedef struct ProtocolVtbl ProtocolVtbl; typedef struct ProtocolVtbl ProtocolVtbl;
...@@ -289,4 +295,17 @@ static inline LPWSTR heap_strdupAtoW(const char *str) ...@@ -289,4 +295,17 @@ static inline LPWSTR heap_strdupAtoW(const char *str)
return ret; return ret;
} }
static inline char *heap_strdupWtoA(const WCHAR *str)
{
char *ret = NULL;
if(str) {
size_t size = WideCharToMultiByte(CP_ACP, 0, str, -1, NULL, 0, NULL, NULL);
ret = heap_alloc(size);
WideCharToMultiByte(CP_ACP, 0, str, -1, ret, size, NULL, NULL);
}
return ret;
}
#endif /* __WINE_URLMON_MAIN_H */ #endif /* __WINE_URLMON_MAIN_H */
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment