blob: 990728ad3463efc3e3f3a96f37f9c1fe91c0f9cc [file] [log] [blame]
// Copyright 2007-2009 Google Inc.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
// ========================================================================
#include "omaha/worker/job_observer.h"
#include "omaha/common/error.h"
#include "omaha/common/sta_call.h"
#include "omaha/worker/com_wrapper_shutdown_handler.h"
#include "omaha/worker/ui.h"
namespace omaha {
JobObserverCallMethodDecorator::JobObserverCallMethodDecorator(
ProgressWnd* job_observer)
: job_observer_(job_observer),
progress_wnd_events_(NULL),
ui_thread_id_(::GetCurrentThreadId()),
worker_job_thread_id_(0),
sta_(0) {
ASSERT1(job_observer_);
}
HRESULT JobObserverCallMethodDecorator::Initialize() {
job_observer_->SetEventSink(this);
HRESULT hr = sta_.result();
if (FAILED(hr)) {
return hr;
}
return job_observer_->Initialize();
}
void JobObserverCallMethodDecorator::OnShow() {
worker_job_thread_id_ = ::GetCurrentThreadId();
if (ui_thread_id_ != ::GetCurrentThreadId()) {
CallMethod(job_observer_, &ProgressWnd::OnShow);
} else {
job_observer_->OnShow();
}
}
void JobObserverCallMethodDecorator::OnCheckingForUpdate() {
ASSERT1(worker_job_thread_id_ == ::GetCurrentThreadId());
if (ui_thread_id_ != ::GetCurrentThreadId()) {
CallMethod(job_observer_, &ProgressWnd::OnCheckingForUpdate);
} else {
job_observer_->OnCheckingForUpdate();
}
}
void JobObserverCallMethodDecorator::OnUpdateAvailable(
const TCHAR* version_string) {
ASSERT1(worker_job_thread_id_ == ::GetCurrentThreadId());
if (ui_thread_id_ != ::GetCurrentThreadId()) {
CallMethod(job_observer_,
&ProgressWnd::OnUpdateAvailable,
version_string);
} else {
job_observer_->OnUpdateAvailable(version_string);
}
}
void JobObserverCallMethodDecorator::OnWaitingToDownload() {
ASSERT1(worker_job_thread_id_ == ::GetCurrentThreadId());
if (ui_thread_id_ != ::GetCurrentThreadId()) {
CallMethod(job_observer_, &ProgressWnd::OnWaitingToDownload);
} else {
job_observer_->OnWaitingToDownload();
}
}
void JobObserverCallMethodDecorator::OnDownloading(int time_remaining_ms,
int pos) {
ASSERT1(worker_job_thread_id_ == ::GetCurrentThreadId());
if (ui_thread_id_ != ::GetCurrentThreadId()) {
CallMethod(job_observer_,
&ProgressWnd::OnDownloading,
time_remaining_ms,
pos);
} else {
job_observer_->OnDownloading(time_remaining_ms, pos);
}
}
void JobObserverCallMethodDecorator::OnWaitingToInstall() {
ASSERT1(worker_job_thread_id_ == ::GetCurrentThreadId());
if (ui_thread_id_ != ::GetCurrentThreadId()) {
CallMethod(job_observer_, &ProgressWnd::OnWaitingToInstall);
} else {
job_observer_->OnWaitingToInstall();
}
}
void JobObserverCallMethodDecorator::OnInstalling() {
ASSERT1(worker_job_thread_id_ == ::GetCurrentThreadId());
if (ui_thread_id_ != ::GetCurrentThreadId()) {
CallMethod(job_observer_, &ProgressWnd::OnInstalling);
} else {
job_observer_->OnInstalling();
}
}
void JobObserverCallMethodDecorator::OnPause() {
ASSERT1(worker_job_thread_id_ == ::GetCurrentThreadId());
if (ui_thread_id_ != ::GetCurrentThreadId()) {
CallMethod(job_observer_, &ProgressWnd::OnPause);
} else {
job_observer_->OnPause();
}
}
void JobObserverCallMethodDecorator::OnComplete(CompletionCodes code,
const TCHAR* text,
DWORD error_code) {
ASSERT1(worker_job_thread_id_ == ::GetCurrentThreadId());
if (!job_observer_) {
// This method has been called twice.
return;
}
if (ui_thread_id_ != ::GetCurrentThreadId()) {
CallMethod(job_observer_,
&ProgressWnd::OnComplete,
code,
text,
error_code);
} else {
job_observer_->OnComplete(code, text, error_code);
}
// Unhook the observer. We do not unhook the progress_wnd_events_, because the
// UI can still call restart browsers or close.
job_observer_ = NULL;
}
void JobObserverCallMethodDecorator::SetEventSink(
ProgressWndEvents* event_sink) {
ASSERT1(event_sink);
progress_wnd_events_ = event_sink;
}
void JobObserverCallMethodDecorator::DoPause() {
ASSERT1(progress_wnd_events_);
progress_wnd_events_->DoPause();
}
void JobObserverCallMethodDecorator::DoResume() {
ASSERT1(progress_wnd_events_);
progress_wnd_events_->DoResume();
}
void JobObserverCallMethodDecorator::DoClose() {
if (progress_wnd_events_) {
progress_wnd_events_->DoClose();
}
}
void JobObserverCallMethodDecorator::DoRestartBrowsers() {
ASSERT1(progress_wnd_events_);
progress_wnd_events_->DoRestartBrowsers();
}
void JobObserverCallMethodDecorator::DoReboot() {
ASSERT1(progress_wnd_events_);
progress_wnd_events_->DoReboot();
}
void JobObserverCallMethodDecorator::DoLaunchBrowser(const CString& url) {
ASSERT1(progress_wnd_events_);
progress_wnd_events_->DoLaunchBrowser(url);
}
JobObserverCOMDecorator::JobObserverCOMDecorator()
: job_observer_(NULL),
progress_wnd_events_(NULL),
worker_job_thread_id_(0) {
}
JobObserverCOMDecorator::~JobObserverCOMDecorator() {
Uninitialize();
}
void JobObserverCOMDecorator::Initialize(
IJobObserver* job_observer,
WorkerComWrapperShutdownCallBack* call_back) {
ASSERT1(call_back);
ASSERT1(job_observer);
shutdown_callback_ = call_back;
job_observer_ = job_observer;
job_observer->SetEventSink(this);
}
void JobObserverCOMDecorator::Uninitialize() {
}
void JobObserverCOMDecorator::OnShow() {
ASSERT1(job_observer_);
worker_job_thread_id_ = ::GetCurrentThreadId();
job_observer_->OnShow();
}
void JobObserverCOMDecorator::OnCheckingForUpdate() {
ASSERT1(job_observer_);
ASSERT1(worker_job_thread_id_ == ::GetCurrentThreadId());
job_observer_->OnCheckingForUpdate();
}
void JobObserverCOMDecorator::OnUpdateAvailable(const TCHAR* version_string) {
ASSERT1(job_observer_);
ASSERT1(worker_job_thread_id_ == ::GetCurrentThreadId());
job_observer_->OnUpdateAvailable(version_string);
}
void JobObserverCOMDecorator::OnWaitingToDownload() {
ASSERT1(job_observer_);
ASSERT1(worker_job_thread_id_ == ::GetCurrentThreadId());
job_observer_->OnWaitingToDownload();
}
void JobObserverCOMDecorator::OnDownloading(int time_remaining_ms, int pos) {
ASSERT1(job_observer_);
ASSERT1(worker_job_thread_id_ == ::GetCurrentThreadId());
job_observer_->OnDownloading(time_remaining_ms, pos);
}
void JobObserverCOMDecorator::OnWaitingToInstall() {
ASSERT1(job_observer_);
ASSERT1(worker_job_thread_id_ == ::GetCurrentThreadId());
job_observer_->OnWaitingToInstall();
}
void JobObserverCOMDecorator::OnInstalling() {
ASSERT1(job_observer_);
ASSERT1(worker_job_thread_id_ == ::GetCurrentThreadId());
job_observer_->OnInstalling();
}
void JobObserverCOMDecorator::OnPause() {
ASSERT1(job_observer_);
ASSERT1(worker_job_thread_id_ == ::GetCurrentThreadId());
job_observer_->OnPause();
}
void JobObserverCOMDecorator::OnComplete(CompletionCodes code,
const TCHAR* text,
DWORD) {
UNREFERENCED_PARAMETER(text);
if (!job_observer_) {
return;
}
ASSERT1(worker_job_thread_id_ == ::GetCurrentThreadId());
SetEventSink(NULL);
// We do not want to send Omaha strings to the application, so pass an empty
// string instead.
job_observer_->OnComplete(code, L"");
job_observer_ = NULL;
shutdown_callback_->ReleaseIgnoreShutdown();
shutdown_callback_ = NULL;
}
void JobObserverCOMDecorator::SetEventSink(ProgressWndEvents* event_sink) {
set_progress_wnd_events(event_sink);
}
STDMETHODIMP JobObserverCOMDecorator::DoPause() {
ProgressWndEvents* progress_events(progress_wnd_events());
if (!progress_events) {
return GOOPDATE_E_OBSERVER_PROGRESS_WND_EVENTS_NULL;
}
progress_events->DoPause();
return S_OK;
}
STDMETHODIMP JobObserverCOMDecorator::DoResume() {
ProgressWndEvents* progress_events(progress_wnd_events());
if (!progress_events) {
return GOOPDATE_E_OBSERVER_PROGRESS_WND_EVENTS_NULL;
}
progress_events->DoResume();
return S_OK;
}
STDMETHODIMP JobObserverCOMDecorator::DoClose() {
ProgressWndEvents* progress_events(progress_wnd_events());
if (!progress_events) {
return GOOPDATE_E_OBSERVER_PROGRESS_WND_EVENTS_NULL;
}
progress_events->DoClose();
return S_OK;
}
STDMETHODIMP JobObserverCOMDecorator::DoRestartBrowsers() {
ProgressWndEvents* progress_events(progress_wnd_events());
if (!progress_events) {
return GOOPDATE_E_OBSERVER_PROGRESS_WND_EVENTS_NULL;
}
progress_events->DoRestartBrowsers();
return S_OK;
}
STDMETHODIMP JobObserverCOMDecorator::DoReboot() {
ProgressWndEvents* progress_events(progress_wnd_events());
if (!progress_events) {
return GOOPDATE_E_OBSERVER_PROGRESS_WND_EVENTS_NULL;
}
progress_events->DoReboot();
return S_OK;
}
STDMETHODIMP JobObserverCOMDecorator::DoLaunchBrowser(const WCHAR* url) {
ProgressWndEvents* progress_events(progress_wnd_events());
if (!progress_events) {
return GOOPDATE_E_OBSERVER_PROGRESS_WND_EVENTS_NULL;
}
progress_events->DoLaunchBrowser(url);
return S_OK;
}
} // namespace omaha