// 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_queue.h"

#include <base/logging.h>

#include "cros-disks/device_event.h"

namespace cros_disks {

DeviceEventQueue::DeviceEventQueue() {
}

DeviceEventQueue::~DeviceEventQueue() {
}

void DeviceEventQueue::Remove() {
  if (!events_.empty())
    events_.pop_back();
}

void DeviceEventQueue::Add(const DeviceEvent& event) {
  // Discard an Ignored or DeviceScanned event.
  if (event.event_type == DeviceEvent::kIgnored ||
      event.event_type == DeviceEvent::kDeviceScanned)
    return;

  for (DeviceEventList::iterator last_event_iterator = events_.begin();
       last_event_iterator != events_.end(); ++last_event_iterator) {
    const DeviceEvent& last_event = *last_event_iterator;

    // Skip an unrelated event.
    if (event.device_path != last_event.device_path ||
        event.IsDiskEvent() != last_event.IsDiskEvent())
      continue;

    // Combine events of the same type and device path and keep the latest one.
    if (event.event_type == last_event.event_type) {
      events_.erase(last_event_iterator);
      events_.push_front(event);
      return;
    }

    // Discard a Removed event and its last related event, which is an
    // Added/Changed event. Note that the last related event cannot be
    // a Removed event as that is already handled by the code above.
    if (event.event_type == DeviceEvent::kDeviceRemoved ||
        event.event_type == DeviceEvent::kDiskRemoved) {
      CHECK(last_event.event_type != DeviceEvent::kDeviceRemoved &&
            last_event.event_type != DeviceEvent::kDiskRemoved)
          << "Last event should not be a Removed event";
      events_.erase(last_event_iterator);
      return;
    }

    // Discard a DiskChanged event if a related DiskAdded event is already
    // in the queue.
    if (event.event_type == DeviceEvent::kDiskChanged &&
        last_event.event_type == DeviceEvent::kDiskAdded)
      return;
  }

  events_.push_front(event);
}

const DeviceEvent* DeviceEventQueue::Head() const {
  return events_.empty() ? NULL : &events_.back();
}

}  // namespace cros_disks
