OLD | NEW |
| (Empty) |
1 // Copyright 2009-2010 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 // Defines the App COM object exposed by the model. App tracks two versions: | |
17 // - the version currently installed | |
18 // - the future version to be updated to, if such a version exists | |
19 | |
20 #ifndef OMAHA_GOOPDATE_APP_H_ | |
21 #define OMAHA_GOOPDATE_APP_H_ | |
22 | |
23 #include <atlbase.h> | |
24 #include <atlcom.h> | |
25 #include "base/basictypes.h" | |
26 #include "base/scoped_ptr.h" | |
27 #include "goopdate/omaha3_idl.h" | |
28 #include "omaha/base/browser_utils.h" | |
29 #include "omaha/base/constants.h" | |
30 #include "omaha/common/const_goopdate.h" | |
31 #include "omaha/common/ping_event.h" | |
32 #include "omaha/goopdate/com_wrapper_creator.h" | |
33 #include "omaha/goopdate/installer_result_info.h" | |
34 #include "omaha/goopdate/model_object.h" | |
35 | |
36 namespace omaha { | |
37 | |
38 // Stores the error codes associated with a particular error. | |
39 struct ErrorContext { | |
40 ErrorContext() : error_code(S_OK), extra_code1(0) {} | |
41 explicit ErrorContext(HRESULT hr, int code1 = 0) | |
42 : error_code(hr), | |
43 extra_code1(code1) {} | |
44 | |
45 HRESULT error_code; | |
46 int extra_code1; | |
47 | |
48 // Add more extra codes here as needed. | |
49 }; | |
50 | |
51 class DownloadManagerInterface; | |
52 class InstallManagerInterface; | |
53 | |
54 namespace fsm { | |
55 | |
56 class AppState; | |
57 | |
58 } // namespace fsm | |
59 | |
60 namespace xml { | |
61 | |
62 class UpdateRequest; | |
63 class UpdateResponse; | |
64 | |
65 } // namespace xml | |
66 | |
67 class AppBundle; | |
68 class AppVersion; | |
69 class CurrentAppState; | |
70 | |
71 class App : public ModelObject { | |
72 public: | |
73 App(const GUID& app_guid, bool is_update, AppBundle* app_bundle); | |
74 virtual ~App(); | |
75 | |
76 AppVersion* current_version(); | |
77 const AppVersion* current_version() const; | |
78 | |
79 AppVersion* next_version(); | |
80 const AppVersion* next_version() const; | |
81 | |
82 AppBundle* app_bundle(); | |
83 const AppBundle* app_bundle() const; | |
84 | |
85 CString app_guid_string() const; | |
86 | |
87 // TODO(omaha): refactor so that the app guid setter is only used by tests. | |
88 GUID app_guid() const; | |
89 void set_app_guid(const GUID& app_guid); | |
90 | |
91 CString language() const; | |
92 | |
93 bool is_eula_accepted() const; | |
94 | |
95 CString display_name() const; | |
96 | |
97 CurrentState state() const; | |
98 | |
99 bool is_install() const { return !is_update(); } | |
100 bool is_update() const; | |
101 | |
102 bool has_update_available() const; | |
103 void set_has_update_available(bool has_update_available); | |
104 | |
105 GUID iid() const; | |
106 | |
107 CString client_id() const; | |
108 | |
109 CString GetExperimentLabels() const; | |
110 | |
111 CString referral_id() const; | |
112 | |
113 BrowserType browser_type() const; | |
114 | |
115 Tristate usage_stats_enable() const; | |
116 | |
117 CString client_install_data() const; | |
118 | |
119 CString server_install_data() const; | |
120 void set_server_install_data(const CString& server_install_data); | |
121 | |
122 CString brand_code() const; | |
123 | |
124 uint32 install_time_diff_sec() const; | |
125 | |
126 ActiveStates did_run() const; | |
127 | |
128 int days_since_last_active_ping() const; | |
129 void set_days_since_last_active_ping(int days); | |
130 | |
131 int days_since_last_roll_call() const; | |
132 void set_days_since_last_roll_call(int days); | |
133 | |
134 CString ap() const; | |
135 | |
136 CString tt_token() const; | |
137 | |
138 CString server_install_data_index() const; | |
139 | |
140 HRESULT error_code() const; | |
141 | |
142 ErrorContext error_context() const; | |
143 | |
144 int installer_result_code() const; | |
145 | |
146 int installer_result_extra_code1() const; | |
147 | |
148 const PingEventVector& ping_events() const; | |
149 | |
150 AppVersion* working_version(); | |
151 const AppVersion* working_version() const; | |
152 | |
153 // IApp. | |
154 STDMETHOD(get_appId)(BSTR* app_id); | |
155 | |
156 STDMETHOD(get_pv)(BSTR* pv); | |
157 STDMETHOD(put_pv)(BSTR pv); | |
158 | |
159 STDMETHOD(get_language)(BSTR* language); | |
160 STDMETHOD(put_language)(BSTR language); | |
161 | |
162 STDMETHOD(get_ap)(BSTR* ap); | |
163 STDMETHOD(put_ap)(BSTR ap); | |
164 | |
165 STDMETHOD(get_ttToken)(BSTR* tt_token); | |
166 STDMETHOD(put_ttToken)(BSTR tt_token); | |
167 | |
168 STDMETHOD(get_iid)(BSTR* iid); | |
169 STDMETHOD(put_iid)(BSTR iid); | |
170 | |
171 STDMETHOD(get_brandCode)(BSTR* brand_code); | |
172 STDMETHOD(put_brandCode)(BSTR brand_code); | |
173 | |
174 STDMETHOD(get_clientId)(BSTR* client_id); | |
175 STDMETHOD(put_clientId)(BSTR client_id); | |
176 | |
177 STDMETHOD(get_labels)(BSTR* labels); | |
178 STDMETHOD(put_labels)(BSTR labels); | |
179 | |
180 STDMETHOD(get_referralId)(BSTR* referral_id); | |
181 STDMETHOD(put_referralId)(BSTR referral_id); | |
182 | |
183 STDMETHOD(get_installTimeDiffSec)(UINT* install_time_diff_sec); | |
184 | |
185 STDMETHOD(get_isEulaAccepted)(VARIANT_BOOL* is_eula_accepted); | |
186 STDMETHOD(put_isEulaAccepted)(VARIANT_BOOL is_eula_accepted); | |
187 | |
188 STDMETHOD(get_displayName)(BSTR* display_name); | |
189 STDMETHOD(put_displayName)(BSTR display_name); | |
190 | |
191 STDMETHOD(get_browserType)(UINT* browser_type); | |
192 STDMETHOD(put_browserType)(UINT browser_type); | |
193 | |
194 STDMETHOD(get_clientInstallData)(BSTR* data); | |
195 STDMETHOD(put_clientInstallData)(BSTR data); | |
196 | |
197 STDMETHOD(get_serverInstallDataIndex)(BSTR* index); | |
198 STDMETHOD(put_serverInstallDataIndex)(BSTR index); | |
199 | |
200 STDMETHOD(get_usageStatsEnable)(UINT* usage_stats_enable); | |
201 STDMETHOD(put_usageStatsEnable)(UINT usage_stats_enable); | |
202 | |
203 STDMETHOD(get_currentState)(IDispatch** current_state); | |
204 | |
205 // Sets the error context and the completion message. | |
206 void SetNoUpdate(const ErrorContext& error_context, const CString& message); | |
207 void SetError(const ErrorContext& error_context, const CString& message); | |
208 | |
209 // Records the details of the installer success or failure. | |
210 void SetInstallerResult(const InstallerResultInfo& result_info); | |
211 | |
212 // Gets the appropriate installer data regardless of the source. Only valid | |
213 // in STATE_UPDATE_AVAILABLE and later. | |
214 CString GetInstallData() const; | |
215 | |
216 | |
217 // | |
218 // App state machine transition conditions. These functions make | |
219 // the application change states. | |
220 // | |
221 | |
222 // Sets the app to Waiting To Check. | |
223 void QueueUpdateCheck(); | |
224 | |
225 // Adds the app to the update request. | |
226 void PreUpdateCheck(xml::UpdateRequest* update_request); | |
227 | |
228 // Processes the update response for the app. | |
229 void PostUpdateCheck(HRESULT result, xml::UpdateResponse* update_response); | |
230 | |
231 // Sets the app to Waiting To Download. | |
232 void QueueDownload(); | |
233 | |
234 // Sets the app to Waiting To Download or Waiting To Install depending on the | |
235 // current state. | |
236 void QueueDownloadOrInstall(); | |
237 | |
238 // Initiates download of the app if necessary. | |
239 void Download(DownloadManagerInterface* download_manager); | |
240 | |
241 // Reports that the download is in progress. May be called multiple times. | |
242 void Downloading(); | |
243 | |
244 // Reports that all packages have been downloaded. | |
245 void DownloadComplete(); | |
246 | |
247 // Sets the app to Ready To install. | |
248 void MarkReadyToInstall(); | |
249 | |
250 // Sets the app to Waiting To Install. | |
251 void QueueInstall(); | |
252 | |
253 // Initiates installation of the app. | |
254 void Install(InstallManagerInterface* install_manager); | |
255 | |
256 // Reports that the install is in progress. May be called multiple times. | |
257 void Installing(); | |
258 | |
259 // Reports that the app installer has completed. Can be success or failure. | |
260 void ReportInstallerComplete(const InstallerResultInfo& result_info); | |
261 | |
262 // TODO(omaha3): What does this pause? | |
263 void Pause(); | |
264 | |
265 // Cancels the app install. | |
266 void Cancel(); | |
267 | |
268 // Stops installation in the Error state. | |
269 void Error(const ErrorContext& error_context, const CString& message); | |
270 | |
271 // For logging support. | |
272 CString FetchAndResetLogText(); | |
273 void LogTextAppendFormat(const TCHAR* format, ...); | |
274 | |
275 // Adds an event to the app's ping, which is sent when the bundle is | |
276 // destroyed. In most cases, pings should be added in | |
277 // AppState::CreatePingEvent(). | |
278 void AddPingEvent(const PingEventPtr& ping_event); | |
279 | |
280 // Returns an error if update/install, as determined by is_update_, is | |
281 // disabled by Group Policy. | |
282 HRESULT CheckGroupPolicy() const; | |
283 | |
284 // Sets current time as download start time. | |
285 void SetDownloadStartTime(); | |
286 | |
287 // Sets current time as download complete time. | |
288 void SetDownloadCompleteTime(); | |
289 | |
290 // Updates num bytes downloaded by adding newly downloaded bytes. | |
291 void UpdateNumBytesDownloaded(uint64 num_bytes); | |
292 | |
293 // Returns how long it takes for the download manager to download this app. | |
294 int GetDownloadTimeMs() const; | |
295 | |
296 // Returns how many bytes are actually downloaded. | |
297 uint64 num_bytes_downloaded() const; | |
298 | |
299 // Returns the size sum of all packages for this app. | |
300 uint64 GetPackagesTotalSize() const; | |
301 | |
302 private: | |
303 // TODO(omaha): accessing directly the data members bypasses locking. Review | |
304 // the places where members are accessed by friends and check the caller locks | |
305 // before going directly for the private members. | |
306 friend class AppManager; | |
307 friend class AppManagerTestBase; | |
308 | |
309 // TODO(omaha3): Maybe use a mock in these tests instead. | |
310 friend class InstallManagerInstallAppTest; | |
311 | |
312 friend class fsm::AppState; | |
313 | |
314 // Sets the app state for unit testing. | |
315 friend void SetAppStateForUnitTest(App* app, fsm::AppState* state); | |
316 | |
317 HRESULT GetDownloadProgress(uint64* bytes_downloaded, | |
318 uint64* bytes_total, | |
319 LONG* time_remaining_ms, | |
320 uint64* next_retry_time); | |
321 | |
322 void ChangeState(fsm::AppState* app_state); | |
323 | |
324 scoped_ptr<fsm::AppState> app_state_; | |
325 | |
326 scoped_ptr<AppVersion> current_version_; | |
327 scoped_ptr<AppVersion> next_version_; | |
328 | |
329 // Alias to the version of the app that is being modified. | |
330 AppVersion* working_version_; | |
331 | |
332 PingEventVector ping_events_; | |
333 | |
334 CString event_log_text_; | |
335 | |
336 // Weak reference to the containing bundle. | |
337 AppBundle* app_bundle_; | |
338 | |
339 // True if the app is in the update scenario. | |
340 const bool is_update_; | |
341 | |
342 // True if the server responded that an update is available for the app. | |
343 // This can happen in both install and update cases. | |
344 bool has_update_available_; | |
345 | |
346 GUID app_guid_; | |
347 CString pv_; | |
348 | |
349 // These values are stored in Clients. language can be in ClientState too. | |
350 CString language_; | |
351 CString display_name_; | |
352 | |
353 // These values are stored in ClientState. | |
354 CString ap_; | |
355 CString tt_token_; | |
356 GUID iid_; | |
357 CString brand_code_; | |
358 CString client_id_; | |
359 // TODO(omaha3): Rename member and registry value to match the COM property. | |
360 CString referral_id_; | |
361 uint32 install_time_diff_sec_; | |
362 Tristate is_eula_accepted_; | |
363 BrowserType browser_type_; | |
364 int days_since_last_active_ping_; | |
365 int days_since_last_roll_call_; | |
366 | |
367 // This value is stored in ClientState but not currently populated from there. | |
368 Tristate usage_stats_enable_; | |
369 | |
370 // This value is stored by the clients in one of several registry locations. | |
371 ActiveStates did_run_; | |
372 | |
373 // This value is not currently persisted in the registry. | |
374 CString server_install_data_index_; | |
375 | |
376 // Contains the installer data string specified by the client (usually | |
377 // contained in /appdata). | |
378 CString client_install_data_; | |
379 | |
380 // Contains the installer data string returned by the server for | |
381 // server_install_data_index_. | |
382 CString server_install_data_; | |
383 | |
384 bool is_canceled_; | |
385 ErrorContext error_context_; | |
386 CString completion_message_; | |
387 PingEvent::Results completion_result_; | |
388 int installer_result_code_; | |
389 int installer_result_extra_code1_; | |
390 CString post_install_launch_command_line_; | |
391 CString post_install_url_; | |
392 PostInstallAction post_install_action_; | |
393 | |
394 uint64 previous_total_download_bytes_; | |
395 | |
396 // Values for download metrics. | |
397 uint64 download_start_time_ms_; | |
398 uint64 download_complete_time_ms_; | |
399 uint64 num_bytes_downloaded_; | |
400 | |
401 DISALLOW_COPY_AND_ASSIGN(App); | |
402 }; | |
403 | |
404 class ATL_NO_VTABLE AppWrapper | |
405 : public ComWrapper<AppWrapper, App>, | |
406 public IDispatchImpl<IApp, | |
407 &__uuidof(IApp), | |
408 &CAtlModule::m_libid, | |
409 kMajorTypeLibVersion, | |
410 kMinorTypeLibVersion> { | |
411 public: | |
412 // IApp. | |
413 STDMETHOD(get_currentVersion)(IDispatch** current); | |
414 STDMETHOD(get_nextVersion)(IDispatch** next); | |
415 STDMETHOD(get_currentState)(IDispatch** current_state_disp); | |
416 | |
417 STDMETHOD(get_appId)(BSTR* app_id); | |
418 | |
419 STDMETHOD(get_pv)(BSTR* pv); | |
420 STDMETHOD(put_pv)(BSTR pv); | |
421 | |
422 STDMETHOD(get_language)(BSTR* language); | |
423 STDMETHOD(put_language)(BSTR language); | |
424 | |
425 STDMETHOD(get_ap)(BSTR* ap); | |
426 STDMETHOD(put_ap)(BSTR ap); | |
427 | |
428 STDMETHOD(get_ttToken)(BSTR* tt_token); | |
429 STDMETHOD(put_ttToken)(BSTR tt_token); | |
430 | |
431 STDMETHOD(get_iid)(BSTR* iid); | |
432 STDMETHOD(put_iid)(BSTR iid); | |
433 | |
434 STDMETHOD(get_brandCode)(BSTR* brand_code); | |
435 STDMETHOD(put_brandCode)(BSTR brand_code); | |
436 | |
437 STDMETHOD(get_clientId)(BSTR* client_id); | |
438 STDMETHOD(put_clientId)(BSTR client_id); | |
439 | |
440 STDMETHOD(get_labels)(BSTR* labels); | |
441 STDMETHOD(put_labels)(BSTR labels); | |
442 | |
443 STDMETHOD(get_referralId)(BSTR* referral_id); | |
444 STDMETHOD(put_referralId)(BSTR referral_id); | |
445 | |
446 STDMETHOD(get_installTimeDiffSec)(UINT* install_time_diff_sec); | |
447 | |
448 STDMETHOD(get_isEulaAccepted)(VARIANT_BOOL* is_eula_accepted); | |
449 STDMETHOD(put_isEulaAccepted)(VARIANT_BOOL is_eula_accepted); | |
450 | |
451 STDMETHOD(get_displayName)(BSTR* display_name); | |
452 STDMETHOD(put_displayName)(BSTR display_name); | |
453 | |
454 STDMETHOD(get_browserType)(UINT* browser_type); | |
455 STDMETHOD(put_browserType)(UINT browser_type); | |
456 | |
457 STDMETHOD(get_clientInstallData)(BSTR* data); | |
458 STDMETHOD(put_clientInstallData)(BSTR data); | |
459 | |
460 STDMETHOD(get_serverInstallDataIndex)(BSTR* index); | |
461 STDMETHOD(put_serverInstallDataIndex)(BSTR index); | |
462 | |
463 STDMETHOD(get_usageStatsEnable)(UINT* usage_stats_enable); | |
464 STDMETHOD(put_usageStatsEnable)(UINT usage_stats_enable); | |
465 | |
466 protected: | |
467 AppWrapper() {} | |
468 virtual ~AppWrapper() {} | |
469 | |
470 BEGIN_COM_MAP(AppWrapper) | |
471 COM_INTERFACE_ENTRY(IApp) | |
472 COM_INTERFACE_ENTRY(IDispatch) | |
473 END_COM_MAP() | |
474 | |
475 private: | |
476 DISALLOW_COPY_AND_ASSIGN(AppWrapper); | |
477 }; | |
478 | |
479 } // namespace omaha | |
480 | |
481 #endif // OMAHA_GOOPDATE_APP_H_ | |
OLD | NEW |