1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
|
// Copyright (c) 2006-2008 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "webkit/default_plugin/activex_installer.h"
#include "base/string_util.h"
ActiveXInstaller::ActiveXInstaller()
: wnd_(NULL),
notification_msg_(0) {
}
void ActiveXInstaller::Cleanup() {
if (bind_ctx_ != NULL) {
RevokeBindStatusCallback(bind_ctx_, this);
bind_ctx_.Release();
}
}
HRESULT ActiveXInstaller::StartDownload(const std::string& clsid,
const std::string& codebase,
HWND wnd,
UINT notification_msg) {
wnd_ = wnd;
notification_msg_ = notification_msg;
HRESULT hr = E_FAIL;
do {
CLSID id;
hr = CLSIDFromString(const_cast<LPOLESTR>(ASCIIToWide(clsid).c_str()), &id);
if (FAILED(hr))
break;
// Create the bind context, register it with myself (status callback).
hr = CreateBindCtx(0, &bind_ctx_);
if (FAILED(hr))
break;
BIND_OPTS opts;
opts.cbStruct = sizeof(opts);
bind_ctx_->GetBindOptions(&opts);
opts.grfFlags |= BIND_MAYBOTHERUSER;
bind_ctx_->SetBindOptions(&opts);
hr = RegisterBindStatusCallback(bind_ctx_, this, 0, 0);
if (FAILED(hr))
break;
CComPtr<IClassFactory> class_factory;
hr = CoGetClassObjectFromURL(id, ASCIIToWide(codebase).c_str(), 0xffffffff,
0xffffffff, NULL, bind_ctx_,
CLSCTX_INPROC_HANDLER | CLSCTX_INPROC_SERVER,
0, IID_IClassFactory, (void**)&class_factory);
} while(false);
switch (hr) {
case S_OK:
PostMessage(wnd_, notification_msg_, hr, 0);
break;
case MK_S_ASYNCHRONOUS:
// Still need to wait until IBindStatusCallback is updated.
break;
default:
PostMessage(wnd_, notification_msg_, hr, 0);
break;
}
return hr;
}
HRESULT STDMETHODCALLTYPE ActiveXInstaller::OnStartBinding(DWORD dw_reserved,
IBinding* pib) {
return S_OK;
}
HRESULT STDMETHODCALLTYPE ActiveXInstaller::GetPriority(LONG* pn_priority) {
return E_NOTIMPL;
}
HRESULT STDMETHODCALLTYPE ActiveXInstaller::OnLowResource(DWORD reserved) {
return E_NOTIMPL;
}
HRESULT STDMETHODCALLTYPE ActiveXInstaller::OnProgress(ULONG ul_progress,
ULONG ul_progress_max,
ULONG ul_status_code,
LPCWSTR sz_status_text) {
return S_OK;
}
HRESULT STDMETHODCALLTYPE ActiveXInstaller::OnStopBinding(HRESULT hresult,
LPCWSTR sz_error) {
if (wnd_)
PostMessage(wnd_, notification_msg_, hresult, 0);
return S_OK;
}
HRESULT STDMETHODCALLTYPE ActiveXInstaller::GetBindInfo(DWORD* grf_bindf,
BINDINFO* pbindinfo) {
return S_OK;
}
HRESULT STDMETHODCALLTYPE ActiveXInstaller::OnDataAvailable(
DWORD grf_bscf,
DWORD dw_size,
FORMATETC* pformatetc,
STGMEDIUM* pstgmed) {
return S_OK;
}
HRESULT STDMETHODCALLTYPE ActiveXInstaller::OnObjectAvailable(REFIID riid,
IUnknown* punk) {
return S_OK;
}
HRESULT STDMETHODCALLTYPE ActiveXInstaller::GetWindow(REFGUID rguid_reason,
HWND* phwnd) {
*phwnd = wnd_;
return S_OK;
}
|