// Copyright (c) 2012 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.

// CryptohomeEventSource - Implements a GSource for the glib main event loop.
// This class is used to marshal asynchronous mount results from the worker
// thread (see service.h/.cc) over to the main event loop.  That way, all of the
// D-Bus messages are received and sent from the one thread, ensuring that
// signals returned by asynchronous commands are serialized with the original
// call.
//
// CryptohomeEventSource uses a pipe(2) to implement a file descriptor-based
// GSource.  When events are added to the object, it writes a byte to the write
// side of the pipe.  Glib, in the main event loop, will test if the read side
// has data pending.  If so, it will call the dispatch method on the main
// thread.
//
// CryptohomeEventSourceSink is an interface that is implemented by Service.  It
// provides the implementation of the handler that is called on the main event
// loop when an event is processed.

#ifndef CRYPTOHOME_CRYPTOHOME_EVENT_SOURCE_H_
#define CRYPTOHOME_CRYPTOHOME_EVENT_SOURCE_H_

#include <base/synchronization/lock.h>
#include <dbus/dbus-glib.h>
#include <glib-object.h>
#include <memory>
#include <vector>

namespace cryptohome {

class CryptohomeEventBase;
class CryptohomeEventSourceSink;

class CryptohomeEventSource {
 public:
  CryptohomeEventSource();
  virtual ~CryptohomeEventSource();

  // Resets the event queue and re-attaches this GSource to the GMainContext.
  //
  // Parameters
  //   sink - Pointer to the handler called when events are dispatched
  //   main_context - The GMainContext to attach this GSource to
  void Reset(CryptohomeEventSourceSink* sink, GMainContext* main_context);

  // Returns whether or not there are events in the queue
  bool EventsPending();

  // Processes pending events in the queue
  void HandleDispatch();

  // Adds an event to the queue for processing.
  //
  // Parameters
  //   task_result - The event to add
  void AddEvent(std::unique_ptr<CryptohomeEventBase> event);

  // Clears all pending events from the queue
  void Clear();


 private:
  // Structure that glib provides in calls to the static handlers, allows
  // getting the instance of this CryptohomeEventSource.
  struct Source : public GSource {
    CryptohomeEventSource* event_source;
    GPollFD poll_fd;
  };

  struct SourceDeleter {
    void operator()(Source* source);
  };

  // Called by glib (see GSourceFuncs in the glib documentation)
  static gboolean Prepare(GSource* source, gint* timeout_ms);

  // Called by glib (see GSourceFuncs in the glib documentation)
  static gboolean Check(GSource* source);

  // Called by glib (see GSourceFuncs in the glib documentation)
  static gboolean Dispatch(GSource* source,
                           GSourceFunc unused_func,
                           gpointer unused_data);

  // The event sink that handles event notifications
  CryptohomeEventSourceSink* sink_ = nullptr;

  // The D-Bus GSource that we provide
  std::unique_ptr<Source, SourceDeleter> source_;

  // Pending events vector
  std::vector<std::unique_ptr<CryptohomeEventBase>> events_;

  // Used to provide thread-safe access to events_
  base::Lock events_lock_;

  // Structure initialized to the static callbacks above
  static GSourceFuncs source_functions_;

  // The pipe used for our GPollFD
  int pipe_fds_[2];

  DISALLOW_COPY_AND_ASSIGN(CryptohomeEventSource);
};

class CryptohomeEventBase {
 public:
  CryptohomeEventBase() = default;
  virtual ~CryptohomeEventBase() = default;

  virtual const char* GetEventName() const = 0;
};

class CryptohomeEventSourceSink {
 public:
  virtual ~CryptohomeEventSourceSink() = default;
  virtual void NotifyEvent(CryptohomeEventBase* event) = 0;
};

}  // namespace cryptohome

#endif  // CRYPTOHOME_CRYPTOHOME_EVENT_SOURCE_H_
