// 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 VM_TOOLS_CONCIERGE_SENESCHAL_SERVER_PROXY_H_
#define VM_TOOLS_CONCIERGE_SENESCHAL_SERVER_PROXY_H_

#include <stdint.h>

#include <memory>
#include <utility>
#include <vector>

#include <base/macros.h>
#include <base/files/scoped_file.h>
#include <dbus/object_proxy.h>
#include <seneschal/proto_bindings/seneschal_service.pb.h>

namespace vm_tools {
namespace concierge {

// Represents a running shared directory server.
class SeneschalServerProxy final {
 public:
  // Ask the seneschal service to start a new 9P server.  Callers must ensure
  // that the |seneschal_proxy| object outlives this object.
  static std::unique_ptr<SeneschalServerProxy> CreateVsockProxy(
      scoped_refptr<dbus::Bus> bus,
      dbus::ObjectProxy* seneschal_proxy,
      uint32_t port,
      uint32_t accept_cid,
      std::vector<std::pair<uint32_t, uint32_t>> uid_map,
      std::vector<std::pair<uint32_t, uint32_t>> gid_map);
  static std::unique_ptr<SeneschalServerProxy> CreateFdProxy(
      scoped_refptr<dbus::Bus> bus,
      dbus::ObjectProxy* seneschal_proxy,
      const base::ScopedFD& socket_fd);

  ~SeneschalServerProxy();

  uint32_t handle() const { return handle_; }

 private:
  SeneschalServerProxy(scoped_refptr<dbus::Bus> bus,
                       dbus::ObjectProxy* seneschal_proxy,
                       uint32_t handle);
  SeneschalServerProxy(const SeneschalServerProxy&) = delete;
  SeneschalServerProxy& operator=(const SeneschalServerProxy&) = delete;

  static std::unique_ptr<SeneschalServerProxy> SeneschalCreateProxy(
      scoped_refptr<dbus::Bus> bus,
      dbus::ObjectProxy* seneschal_proxy,
      dbus::MethodCall* method_call);

  scoped_refptr<dbus::Bus> bus_;

  // Proxy to the seneschal service.  Not owned.
  dbus::ObjectProxy* seneschal_proxy_;

  // The handle for this server.
  uint32_t handle_;
};

}  // namespace concierge
}  // namespace vm_tools

#endif  // VM_TOOLS_CONCIERGE_SENESCHAL_SERVER_PROXY_H_
