// Copyright 2018 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 HERMES_SOCKET_QRTR_H_
#define HERMES_SOCKET_QRTR_H_

#include <memory>

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

#include "hermes/socket_interface.h"

namespace hermes {

class SocketQrtr : public SocketInterface {
 public:
  struct PacketMetadata {
    uint32_t port;
    uint32_t node;
    bool operator==(const PacketMetadata& rhs) const;
  };

  SocketQrtr();

  void SetDataAvailableCallback(DataAvailableCallback cb) override;

  bool Open() override;
  void Close() override;
  bool IsValid() const override { return socket_.is_valid(); }
  Type GetType() const override { return Type::kQrtr; }

  bool StartService(uint32_t service,
                    uint16_t version_major,
                    uint16_t version_minor) override;
  bool StopService(uint32_t service,
                   uint16_t version_major,
                   uint16_t version_minor) override;

  // If the metadata ptr is not null, it must point to a
  // SocketQrtr::PacketMetadata instance.
  int Recv(void* buf, size_t size, void* metadata) override;
  int Send(const void* data, size_t size, const void* metadata) override;

 private:
  void OnFileCanReadWithoutBlocking();

 private:
  base::ScopedFD socket_;
  std::unique_ptr<base::FileDescriptorWatcher::Controller> watcher_;

  DataAvailableCallback cb_;
};

}  // namespace hermes

namespace std {

template <>
struct std::hash<hermes::SocketQrtr::PacketMetadata> {
  std::size_t operator()(const hermes::SocketQrtr::PacketMetadata& key) const {
    return std::hash<uint32_t>()(key.node) ^ std::hash<uint32_t>()(key.port);
  }
};

}  // namespace std

#endif  // HERMES_SOCKET_QRTR_H_
