blob: 3441940051bec7abc7ae6bd298369bc9b2532990 [file] [log] [blame]
/*
* Copyright 2009, Google Inc.
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are
* met:
*
* * Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* * Redistributions in binary form must reproduce the above
* copyright notice, this list of conditions and the following disclaimer
* in the documentation and/or other materials provided with the
* distribution.
* * Neither the name of Google Inc. nor the names of its
* contributors may be used to endorse or promote products derived from
* this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#ifndef O3D_GOOGLE_UPDATE_PERFORMONDEMAND_H_
#define O3D_GOOGLE_UPDATE_PERFORMONDEMAND_H_
#pragma once
#include <windows.h>
#include <atlbase.h>
#include <atlcom.h>
#include "google_update_idl.h" // NOLINT
class JobObserver
: public CComObjectRootEx<CComSingleThreadModel>,
public IJobObserver {
public:
enum ReturnCodes {
ON_COMPLETE_SUCCESS = 0x00000001,
ON_COMPLETE_SUCCESS_CLOSE_UI = 0x00000002,
ON_COMPLETE_ERROR = 0x00000004,
ON_COMPLETE_RESTART_ALL_BROWSERS = 0x00000008,
ON_COMPLETE_REBOOT = 0x00000010,
ON_SHOW = 0x00000020,
ON_CHECKING_FOR_UPDATES = 0x00000040,
ON_UPDATE_AVAILABLE = 0x00000080,
ON_WAITING_TO_DOWNLOAD = 0x00000100,
ON_DOWNLOADING = 0x00000200,
ON_WAITING_TO_INSTALL = 0x00000400,
ON_INSTALLING = 0x00000800,
ON_PAUSE = 0x00001000,
SET_EVENT_SINK = 0x00002000,
ON_COMPLETE_RESTART_BROWSER = 0x00004000,
ON_COMPLETE_RESTART_ALL_BROWSERS_NOTICE_ONLY = 0x00008000,
ON_COMPLETE_REBOOT_NOTICE_ONLY = 0x00010000,
ON_COMPLETE_RESTART_BROWSER_NOTICE_ONLY = 0x00020000,
ON_COMPLETE_RUN_COMMAND = 0x00040000,
};
BEGIN_COM_MAP(JobObserver)
COM_INTERFACE_ENTRY(IJobObserver)
END_COM_MAP()
// Each interaction enables a bit in observed, which is eventually returned as
// a return code.
int observed;
// Similar to observed, misbehave_modes_ and close_modes_ take on bits from
// the list of all events. For example, if close_modes_ | ON_DOWNLOADING
// is true, then when ON_DOWNLOADING is called, DoClose will be called.
int misbehave_modes_;
int close_modes_;
bool do_closed_called;
JobObserver()
: observed(0), misbehave_modes_(0), close_modes_(0),
do_closed_called(false) {
}
virtual ~JobObserver() {
}
void Reset() {
observed = 0;
misbehave_modes_ = 0;
close_modes_ = 0;
do_closed_called = false;
}
void AddMisbehaveMode(int event_code) {
misbehave_modes_ |= event_code;
}
void AddCloseMode(int event_code) {
close_modes_ |= event_code;
}
HRESULT HandleEvent(int event_code) {
observed |= event_code;
if ((event_code & close_modes_) && !do_closed_called) {
do_closed_called = true;
event_sink_->DoClose();
}
if (event_code & misbehave_modes_) {
return E_FAIL;
} else {
return S_OK;
}
}
// JobObserver implementation.
STDMETHOD(OnShow)() {
return HandleEvent(ON_SHOW);
}
STDMETHOD(OnCheckingForUpdate)() {
return HandleEvent(ON_CHECKING_FOR_UPDATES);
}
STDMETHOD(OnUpdateAvailable)(const TCHAR* version_string) {
return HandleEvent(ON_UPDATE_AVAILABLE);
}
STDMETHOD(OnWaitingToDownload)() {
return HandleEvent(ON_WAITING_TO_INSTALL);
}
STDMETHOD(OnDownloading)(int time_remaining_ms, int pos) {
return HandleEvent(ON_DOWNLOADING);
}
STDMETHOD(OnWaitingToInstall)() {
return HandleEvent(ON_WAITING_TO_INSTALL);
}
STDMETHOD(OnInstalling)() {
return HandleEvent(ON_INSTALLING);
}
STDMETHOD(OnPause)() {
return HandleEvent(ON_PAUSE);
}
STDMETHOD(OnComplete)(CompletionCodes code, const TCHAR* text) {
int event_code = 0;
switch (code) {
case COMPLETION_CODE_SUCCESS:
event_code |= ON_COMPLETE_SUCCESS;
break;
case COMPLETION_CODE_SUCCESS_CLOSE_UI:
event_code |= ON_COMPLETE_SUCCESS_CLOSE_UI;
break;
case COMPLETION_CODE_ERROR:
event_code |= ON_COMPLETE_ERROR;
break;
case COMPLETION_CODE_RESTART_ALL_BROWSERS:
event_code |= ON_COMPLETE_RESTART_ALL_BROWSERS;
break;
case COMPLETION_CODE_REBOOT:
event_code |= ON_COMPLETE_REBOOT;
break;
case COMPLETION_CODE_RESTART_BROWSER:
event_code |= ON_COMPLETE_RESTART_BROWSER;
break;
case COMPLETION_CODE_RESTART_ALL_BROWSERS_NOTICE_ONLY:
event_code |= ON_COMPLETE_RESTART_ALL_BROWSERS_NOTICE_ONLY;
break;
case COMPLETION_CODE_REBOOT_NOTICE_ONLY:
event_code |= ON_COMPLETE_REBOOT_NOTICE_ONLY;
break;
case COMPLETION_CODE_RESTART_BROWSER_NOTICE_ONLY:
event_code |= ON_COMPLETE_RESTART_BROWSER_NOTICE_ONLY;
break;
case COMPLETION_CODE_RUN_COMMAND:
event_code |= ON_COMPLETE_RUN_COMMAND;
break;
default:
break;
}
::PostThreadMessage(::GetCurrentThreadId(), WM_QUIT, 0, 0);
return HandleEvent(event_code);
}
STDMETHOD(SetEventSink)(IProgressWndEvents* event_sink) {
event_sink_ = event_sink;
return HandleEvent(SET_EVENT_SINK);
}
CComPtr<IProgressWndEvents> event_sink_;
};
#endif // O3D_GOOGLE_UPDATE_PERFORMONDEMAND_H_