// Copyright (c) 2013 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 CHROME_BROWSER_CHROME_PROCESS_SINGLETON_H_
#define CHROME_BROWSER_CHROME_PROCESS_SINGLETON_H_

#include "base/files/file_path.h"
#include "base/macros.h"
#include "chrome/browser/process_singleton.h"
#include "chrome/browser/process_singleton_modal_dialog_lock.h"
#include "chrome/browser/process_singleton_startup_lock.h"
#include "ui/gfx/native_widget_types.h"

// Composes a basic ProcessSingleton with ProcessSingletonStartupLock and
// ProcessSingletonModalDialogLock.
//
// Notifications from ProcessSingleton will be discarded if a modal dialog is
// active. Otherwise, until |Unlock()| is called, they will be queued up.
// Once unlocked, notifications will be passed to the client-supplied
// NotificationCallback.
//
// The client must ensure that SetActiveModalDialog is called appropriately when
// dialogs are displayed or dismissed during startup. While a dialog is active:
// 1. Neither this process nor the invoking process will handle the command
//    line.
// 2. The active dialog is brought to the foreground and/or the taskbar icon
//    flashed (using ::SetForegroundWindow on Windows).
class ChromeProcessSingleton {
 public:
  ChromeProcessSingleton(
      const base::FilePath& user_data_dir,
      const ProcessSingleton::NotificationCallback& notification_callback);

  ChromeProcessSingleton(
      const base::FilePath& user_data_dir,
      const ProcessSingleton::NotificationCallback& notification_callback,
      const ProcessSingletonModalDialogLock::SetForegroundWindowHandler&
          set_foreground_window_handler);

  ~ChromeProcessSingleton();

  // Notify another process, if available. Otherwise sets ourselves as the
  // singleton instance. Returns PROCESS_NONE if we became the singleton
  // instance. Callers are guaranteed to either have notified an existing
  // process or have grabbed the singleton (unless the profile is locked by an
  // unreachable process).
  ProcessSingleton::NotifyResult NotifyOtherProcessOrCreate();

  // Clear any lock state during shutdown.
  void Cleanup();

  // Receives a handle to the active modal dialog, or NULL if the active dialog
  // is dismissed.
  void SetActiveModalDialog(gfx::NativeWindow active_dialog);

  // Executes previously queued command-line invocations and allows future
  // invocations to be executed immediately.
  // This only has an effect the first time it is called.
  void Unlock();

 private:
  // We compose these two locks with the client-supplied notification callback.
  // First |modal_dialog_lock_| will discard any notifications that arrive while
  // a modal dialog is active. Otherwise, it will pass the notification to
  // |startup_lock_|, which will queue notifications until |Unlock()| is called.
  // Notifications passing through both locks are finally delivered to our
  // client.
  ProcessSingletonStartupLock startup_lock_;
  ProcessSingletonModalDialogLock modal_dialog_lock_;

  // The basic ProcessSingleton
  ProcessSingleton process_singleton_;

  DISALLOW_COPY_AND_ASSIGN(ChromeProcessSingleton);
};

#endif  // CHROME_BROWSER_CHROME_PROCESS_SINGLETON_H_
