OLD | NEW |
| (Empty) |
1 // Copyright 2008-2009 Google Inc. | |
2 // | |
3 // Licensed under the Apache License, Version 2.0 (the "License"); | |
4 // you may not use this file except in compliance with the License. | |
5 // You may obtain a copy of the License at | |
6 // | |
7 // http://www.apache.org/licenses/LICENSE-2.0 | |
8 // | |
9 // Unless required by applicable law or agreed to in writing, software | |
10 // distributed under the License is distributed on an "AS IS" BASIS, | |
11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |
12 // See the License for the specific language governing permissions and | |
13 // limitations under the License. | |
14 // ======================================================================== | |
15 | |
16 | |
17 #ifndef OMAHA_TOOLS_SRC_PERFORMONDEMAND_PERFORMONDEMAND_H_ | |
18 #define OMAHA_TOOLS_SRC_PERFORMONDEMAND_PERFORMONDEMAND_H_ | |
19 | |
20 #pragma once | |
21 #include <windows.h> | |
22 #include <atlbase.h> | |
23 #include <atlcom.h> | |
24 #include "goopdate\google_update_idl.h" // NOLINT | |
25 | |
26 // Keep this list syncronized with qa\client\lib\on_demand_lib.py | |
27 #define ON_COMPLETE_SUCCESS 0x00000001 | |
28 #define ON_COMPLETE_SUCCESS_CLOSE_UI 0x00000002 | |
29 #define ON_COMPLETE_ERROR 0x00000004 | |
30 #define ON_COMPLETE_RESTART_ALL_BROWSERS 0x00000008 | |
31 #define ON_COMPLETE_REBOOT 0x00000010 | |
32 #define ON_SHOW 0x00000020 | |
33 #define ON_CHECKING_FOR_UPDATES 0x00000040 | |
34 #define ON_UPDATE_AVAILABLE 0x00000080 | |
35 #define ON_WAITING_TO_DOWNLOAD 0x00000100 | |
36 #define ON_DOWNLOADING 0x00000200 | |
37 #define ON_WAITING_TO_INSTALL 0x00000400 | |
38 #define ON_INSTALLING 0x00000800 | |
39 #define ON_PAUSE 0x00001000 | |
40 #define SET_EVENT_SINK 0x00002000 | |
41 #define ON_COMPLETE_RESTART_BROWSER 0x00004000 | |
42 #define ON_COMPLETE_RESTART_ALL_BROWSERS_NOTICE_ONLY 0x00008000 | |
43 #define ON_COMPLETE_REBOOT_NOTICE_ONLY 0x00010000 | |
44 #define ON_COMPLETE_RESTART_BROWSER_NOTICE_ONLY 0x00020000 | |
45 #define ON_COMPLETE_RUN_COMMAND 0x00040000 | |
46 | |
47 class JobObserver | |
48 : public CComObjectRootEx<CComSingleThreadModel>, | |
49 public IJobObserver { | |
50 public: | |
51 BEGIN_COM_MAP(JobObserver) | |
52 COM_INTERFACE_ENTRY(IJobObserver) | |
53 END_COM_MAP() | |
54 | |
55 // Each interaction enables a bit in observed, which is eventually returned as | |
56 // a return code. | |
57 int observed; | |
58 | |
59 // Similar to observed, misbehave_modes_ and close_modes_ take on bits from | |
60 // the list of all events. For example, if close_modes_ | ON_DOWNLOADING | |
61 // is true, then when ON_DOWNLOADING is called, DoClose will be called. | |
62 int misbehave_modes_; | |
63 int close_modes_; | |
64 bool do_closed_called; | |
65 | |
66 JobObserver() | |
67 : observed(0), misbehave_modes_(0), close_modes_(0), | |
68 do_closed_called(false) { | |
69 wprintf(L"JobObserver\n"); | |
70 } | |
71 virtual ~JobObserver() { | |
72 wprintf(L"~JobObserver\n"); | |
73 } | |
74 | |
75 void Reset() { | |
76 observed = 0; | |
77 misbehave_modes_ = 0; | |
78 close_modes_ = 0; | |
79 do_closed_called = false; | |
80 } | |
81 | |
82 void AddMisbehaveMode(int event_code) { | |
83 misbehave_modes_ |= event_code; | |
84 } | |
85 | |
86 void AddCloseMode(int event_code) { | |
87 close_modes_ |= event_code; | |
88 } | |
89 | |
90 HRESULT HandleEvent(int event_code) { | |
91 observed |= event_code; | |
92 | |
93 if ((event_code & close_modes_) && !do_closed_called) { | |
94 wprintf(L"Calling DoClose()\n"); | |
95 do_closed_called = true; | |
96 event_sink_->DoClose(); | |
97 } | |
98 | |
99 if (event_code & misbehave_modes_) { | |
100 wprintf(L"Misbehaving\n"); | |
101 return E_FAIL; | |
102 } else { | |
103 return S_OK; | |
104 } | |
105 } | |
106 | |
107 // JobObserver implementation. | |
108 STDMETHOD(OnShow)() { | |
109 wprintf(L"OnShow\n"); | |
110 return HandleEvent(ON_SHOW); | |
111 } | |
112 STDMETHOD(OnCheckingForUpdate)() { | |
113 wprintf(L"OnCheckingForUpdate\n"); | |
114 return HandleEvent(ON_CHECKING_FOR_UPDATES); | |
115 } | |
116 STDMETHOD(OnUpdateAvailable)(const TCHAR* version_string) { | |
117 wprintf(L"OnUpdateAvailable [%s]\n", version_string); | |
118 return HandleEvent(ON_UPDATE_AVAILABLE); | |
119 } | |
120 STDMETHOD(OnWaitingToDownload)() { | |
121 wprintf(L"OnWaitingToDownload\n"); | |
122 return HandleEvent(ON_WAITING_TO_INSTALL); | |
123 } | |
124 STDMETHOD(OnDownloading)(int time_remaining_ms, int pos) { | |
125 wprintf(L"OnDownloading [%d][%d]\n", time_remaining_ms, pos); | |
126 return HandleEvent(ON_DOWNLOADING); | |
127 } | |
128 STDMETHOD(OnWaitingToInstall)() { | |
129 wprintf(L"OnWaitingToInstall\n"); | |
130 return HandleEvent(ON_WAITING_TO_INSTALL); | |
131 } | |
132 STDMETHOD(OnInstalling)() { | |
133 wprintf(L"OnInstalling\n"); | |
134 return HandleEvent(ON_INSTALLING); | |
135 } | |
136 STDMETHOD(OnPause)() { | |
137 wprintf(L"OnPause\n"); | |
138 return HandleEvent(ON_PAUSE); | |
139 } | |
140 STDMETHOD(OnComplete)(CompletionCodes code, const TCHAR* text) { | |
141 wprintf(L"OnComplete [%d][%s]\n", code, text); | |
142 int event_code = 0; | |
143 switch (code) { | |
144 case COMPLETION_CODE_SUCCESS: | |
145 event_code |= ON_COMPLETE_SUCCESS; | |
146 break; | |
147 case COMPLETION_CODE_SUCCESS_CLOSE_UI: | |
148 event_code |= ON_COMPLETE_SUCCESS_CLOSE_UI; | |
149 break; | |
150 case COMPLETION_CODE_ERROR: | |
151 event_code |= ON_COMPLETE_ERROR; | |
152 break; | |
153 case COMPLETION_CODE_RESTART_ALL_BROWSERS: | |
154 event_code |= ON_COMPLETE_RESTART_ALL_BROWSERS; | |
155 break; | |
156 case COMPLETION_CODE_REBOOT: | |
157 event_code |= ON_COMPLETE_REBOOT; | |
158 break; | |
159 case COMPLETION_CODE_RESTART_BROWSER: | |
160 event_code |= ON_COMPLETE_RESTART_BROWSER; | |
161 break; | |
162 case COMPLETION_CODE_RESTART_ALL_BROWSERS_NOTICE_ONLY: | |
163 event_code |= ON_COMPLETE_RESTART_ALL_BROWSERS_NOTICE_ONLY; | |
164 break; | |
165 case COMPLETION_CODE_REBOOT_NOTICE_ONLY: | |
166 event_code |= ON_COMPLETE_REBOOT_NOTICE_ONLY; | |
167 break; | |
168 case COMPLETION_CODE_RESTART_BROWSER_NOTICE_ONLY: | |
169 event_code |= ON_COMPLETE_RESTART_BROWSER_NOTICE_ONLY; | |
170 break; | |
171 case COMPLETION_CODE_RUN_COMMAND: | |
172 event_code |= ON_COMPLETE_RUN_COMMAND; | |
173 break; | |
174 default: | |
175 break; | |
176 } | |
177 ::PostThreadMessage(::GetCurrentThreadId(), WM_QUIT, 0, 0); | |
178 return HandleEvent(event_code); | |
179 } | |
180 STDMETHOD(SetEventSink)(IProgressWndEvents* event_sink) { | |
181 wprintf(L"SetEventSink [%d]\n", event_sink); | |
182 event_sink_ = event_sink; | |
183 return HandleEvent(SET_EVENT_SINK); | |
184 } | |
185 | |
186 CComPtr<IProgressWndEvents> event_sink_; | |
187 }; | |
188 | |
189 #endif // OMAHA_TOOLS_SRC_PERFORMONDEMAND_PERFORMONDEMAND_H_ | |
OLD | NEW |