blob: fc02ed89942f0e507634decbbf1d1b0ac1168574 [file] [log] [blame]
// 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.
#ifndef WEBKIT_DEFAULT_PLUGIN_PLUGIN_INSTALL_JOB_MONITOR_H__
#define WEBKIT_DEFAULT_PLUGIN_PLUGIN_INSTALL_JOB_MONITOR_H__
#include <windows.h>
#include "base/logging.h"
#include "base/thread.h"
#include "base/ref_counted.h"
// Provides the plugin installation job monitoring functionality.
// The PluginInstallationJobMonitorThread class represents a background
// thread which monitors the install job completion port which is associated
// with the job when an instance of this class is initialized.
class PluginInstallationJobMonitorThread :
public base::Thread,
public base::RefCountedThreadSafe<PluginInstallationJobMonitorThread> {
public:
PluginInstallationJobMonitorThread();
// Initializes the plugin install job. This involves creating the job object
// and starting the thread which monitors the job completion port.
// Returns true on success.
bool Initialize();
// Stops job monitoring and invokes the base Stop function.
void Stop();
// Simple setter/getters for the plugin window handle.
void set_plugin_window(HWND plugin_window) {
DCHECK(::IsWindow(plugin_window));
plugin_window_ = plugin_window;
}
HWND plugin_window() const {
return plugin_window_;
}
// Adds a process to the job object.
//
// Parameters:
// process_handle
// Handle to the process which is to be added to the plugin install job.
// Returns true on success.
bool AssignProcessToJob(HANDLE process_handle);
protected:
// Installs a task on our thread to call WaitForJobThread(). We
// can't call it directly since we would deadlock (thread which
// creates me blocks until Start() returns, and Start() doesn't
// return until Init() does).
virtual void Init();
// Blocks on the plugin installation job completion port by invoking the
// GetQueuedCompletionStatus API.
// We return from this function when the job monitoring thread is stopped.
virtual void WaitForJobThread();
private:
friend class base::RefCountedThreadSafe<PluginInstallationJobMonitorThread>;
virtual ~PluginInstallationJobMonitorThread();
// The install job completion port. Created in Init.
HANDLE install_job_completion_port_;
// Indicates that job monitoring is to be stopped
bool stop_job_monitoring_;
// The install job. Should be created before the job monitor thread
// is started.
HANDLE install_job_;
// The plugin window handle.
HWND plugin_window_;
DISALLOW_EVIL_CONSTRUCTORS(PluginInstallationJobMonitorThread);
};
#endif // WEBKIT_DEFAULT_PLUGIN_PLUGIN_INSTALL_JOB_MONITOR_H__