// 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 {

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() ? nullptr : &events_.back();
}

}  // namespace cros_disks
