| // 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. |
| |
| #ifndef CROS_DISKS_DEVICE_EVENT_QUEUE_H_ |
| #define CROS_DISKS_DEVICE_EVENT_QUEUE_H_ |
| |
| #include <list> |
| |
| #include <base/basictypes.h> |
| |
| #include "cros-disks/device-event.h" |
| |
| namespace cros_disks { |
| |
| struct DeviceEvent; |
| |
| // An event queue for keeping track of deferred device events. |
| class DeviceEventQueue { |
| public: |
| DeviceEventQueue(); |
| |
| ~DeviceEventQueue(); |
| |
| // Removes a device event from the event queue in a FIFO manner. |
| // It is a no-op if the queue is empty. |
| void Remove(); |
| |
| // Adds a device event to the event queue in a FIFO manner. |
| // |
| // Due to its use for keeping track of deferred device events, the |
| // event queue does not simply accumulate events being passed to the |
| // Add method. Depending on the type of an event and its correlation |
| // with other events in the queue, the event may be discarded or cause |
| // other events in the queue to be discarded. |
| // |
| // The rules are: |
| // 1) Ignored and DeviceScanned events are always discarded as they |
| // do not carry any useful information to the prospective client. |
| // 2) If a DeviceRemoved event is seen after a DeviceAdded event with |
| // the same device path, both events are discarded as if the device |
| // has not been added. |
| // 3) If a DiskRemoved event is seen after a DiskAdded, DiskChanged, |
| // or DiskAddedAfterRemoved event with the same device path, both |
| // events are discarded as if the device has not been added. |
| // 4) A DiskChanged event is discarded if a DiskAdded or |
| // DiskAddedAfterRemoved is already in the queue. This is because |
| // both events are deferred and thus the DiskChanged event, which |
| // signals some property changes in the disk, can be absorbed |
| // into the DiskAdded or DiskAddedAfterRemoved event. |
| void Add(const DeviceEvent& event); |
| |
| // Returns a pointer to the oldest device event at the head of event |
| // queue or NULL if the queue is empty. The pointer will become |
| // invalid upon the next Remove call. |
| const DeviceEvent* Head() const; |
| |
| const std::list<DeviceEvent>& events() const { return events_; } |
| |
| private: |
| // A list of events in the event queue. |
| // The latest event is inserted at the beginning of the list. |
| std::list<DeviceEvent> events_; |
| |
| DISALLOW_COPY_AND_ASSIGN(DeviceEventQueue); |
| }; |
| |
| } // namespace cros_disks |
| |
| #endif // CROS_DISKS_DEVICE_EVENT_QUEUE_H_ |