// Copyright 2017 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 MIDIS_SUBDEVICE_CLIENT_FD_HOLDER_H_
#define MIDIS_SUBDEVICE_CLIENT_FD_HOLDER_H_

#include <memory>

#include <base/files/file_descriptor_watcher_posix.h>
#include <base/files/scoped_file.h>
#include <base/memory/weak_ptr.h>

#include "media/midi/message_util.h"
#include "media/midi/midi_message_queue.h"

namespace midis {

// Container to store the client_id, pipe FD and file watcher task id for the
// corresponding pipe.
class SubDeviceClientFdHolder {
 public:
  using ClientDataCallback = base::Callback<void(
      uint32_t subdevice_id, const uint8_t* buffer, size_t buf_len)>;

  SubDeviceClientFdHolder(uint32_t client_id, uint32_t subdevice_id,
                          base::ScopedFD fd, ClientDataCallback client_data_cb);
  static std::unique_ptr<SubDeviceClientFdHolder> Create(
      uint32_t client_id, uint32_t subdevice_id, base::ScopedFD fd,
      ClientDataCallback client_data_cb);
  ~SubDeviceClientFdHolder();
  int GetRawFd() { return fd_.get(); }
  uint32_t GetClientId() const { return client_id_; }
  // This function is used to write data *to* the client when it is received
  // from a MIDI h/w device. NOTE: A failure in this write shouldn't result in
  // the deletion of a client. A faulty / crashed / deleted client will be
  // handled from the Client handling code via TriggerClientDeletion().
  void WriteDeviceDataToClient(const void* buffer, size_t buf_len);

 private:
  // This function is used as the callback which is run when a
  // base::FileDescriptorWatcher is set up on the client's fd for this
  // particular subdevice. It reads the data *from* the client, and in turn
  // invokes client_data_cb_ which writes the data to the device h/w.
  void HandleClientMidiData();
  // Starts to watch the client pipe FD.
  bool StartClientMonitoring();

  uint32_t client_id_;
  uint32_t subdevice_id_;
  base::ScopedFD fd_;
  std::unique_ptr<base::FileDescriptorWatcher::Controller> watcher_;
  ClientDataCallback client_data_cb_;
  std::unique_ptr<midi::MidiMessageQueue> queue_;
  base::WeakPtrFactory<SubDeviceClientFdHolder> weak_factory_;

  DISALLOW_COPY_AND_ASSIGN(SubDeviceClientFdHolder);
};

}  // namespace midis

#endif  // MIDIS_SUBDEVICE_CLIENT_FD_HOLDER_H_
