// Copyright (c) 2011 The Chromium OS Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include "cros-disks/device_event_moderator.h"

#include <base/logging.h>

#include "cros-disks/device_event_dispatcher_interface.h"
#include "cros-disks/device_event_source_interface.h"

using std::string;

namespace cros_disks {

DeviceEventModerator::DeviceEventModerator(
    DeviceEventDispatcherInterface* event_dispatcher,
    DeviceEventSourceInterface* event_source)
    : event_dispatcher_(event_dispatcher),
      event_source_(event_source),
      is_event_queued_(true) {
  CHECK(event_dispatcher_) << "Invalid event dispatcher object";
  CHECK(event_source_) << "Invalid event source object";
}

DeviceEventModerator::~DeviceEventModerator() {
}

void DeviceEventModerator::DispatchQueuedDeviceEvents() {
  const DeviceEvent* event;
  while ((event = event_queue_.Head()) != NULL) {
    LOG(INFO) << "Dispatch queued event: type=" << event->event_type
              << " device='" << event->device_path << "'";
    event_dispatcher_->DispatchDeviceEvent(*event);
    event_queue_.Remove();
  }
}

void DeviceEventModerator::OnScreenIsLocked() {
  LOG(INFO) << "Screen is locked. Device events are now queued.";
  is_event_queued_ = true;
}

void DeviceEventModerator::OnScreenIsUnlocked() {
  LOG(INFO) << "Screen is locked. Queued device events are now dispatched.";
  DispatchQueuedDeviceEvents();
  is_event_queued_ = false;
}

void DeviceEventModerator::OnSessionStarted() {
  LOG(INFO) << "Session started. Queued device events are now dispatched.";
  DispatchQueuedDeviceEvents();
  is_event_queued_ = false;
}

void DeviceEventModerator::OnSessionStopped() {
  LOG(INFO) << "Session stopped. Device events are now queued.";
  is_event_queued_ = true;
}

void DeviceEventModerator::ProcessDeviceEvents() {
  DeviceEventList events;
  if (event_source_->GetDeviceEvents(&events)) {
    if (is_event_queued_) {
      for (const auto& event : events) {
        event_queue_.Add(event);
      }
    } else {
      for (const auto& event : events) {
        event_dispatcher_->DispatchDeviceEvent(event);
      }
    }
  }
}

}  // namespace cros_disks
