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

#include <string>

#include <base/files/file_path.h>
#include <base/files/scoped_file.h>
#include <base/macros.h>
#include <base/memory/weak_ptr.h>
#include <base/threading/thread_checker.h>
#include <dbus/exported_object.h>

#include "virtual_file_provider/size_map.h"

namespace dbus {
class Bus;
class MethodCall;
class ObjectProxy;
}  // namespace dbus

namespace virtual_file_provider {

// This class handles incoming D-Bus method calls.
class Service {
 public:
  Service(const base::FilePath& fuse_mount_path, SizeMap* size_map);
  Service(const Service&) = delete;
  Service& operator=(const Service&) = delete;

  ~Service();

  // Exports D-Bus methods via the system bus and requests the ownership of the
  // service name.
  bool Initialize();

  // Sends read request with the given parameters.
  // Chrome is responsible for feeding the data to the FD.
  void SendReadRequest(const std::string& id,
                       int64_t offset,
                       int64_t size,
                       base::ScopedFD fd);

  // Sends a released ID. Chrome is responsible for releasing resources
  // associated with the ID.
  void SendIdReleased(const std::string& id);

 private:
  // Handles GenerateVirtualFileId D-Bus method call.
  // Generates and returns an ID, to be used for FD creation on the FUSE file
  // system at a later stage. This ID is registered in the |size_map_|.
  void GenerateVirtualFileId(
      dbus::MethodCall* method_call,
      dbus::ExportedObject::ResponseSender response_sender);

  // TODO(b/170695541): Remove this function.
  // Handles OpenFile D-Bus method call.
  // Returns a seekable FD backed by the FUSE file system, and an ID associated
  // with the FD.
  void OpenFile(dbus::MethodCall* method_call,
                dbus::ExportedObject::ResponseSender response_sender);

  // Handles OpenFileById D-Bus method call.
  // Given an ID, creates and returns a seekable FD backed by the FUSE file
  // system.
  void OpenFileById(dbus::MethodCall* method_call,
                    dbus::ExportedObject::ResponseSender response_sender);

  const base::FilePath fuse_mount_path_;
  SizeMap* const size_map_;
  scoped_refptr<dbus::Bus> bus_;
  dbus::ExportedObject* exported_object_ = nullptr;
  dbus::ObjectProxy* request_handler_proxy_ = nullptr;

  base::ThreadChecker thread_checker_;

  base::WeakPtrFactory<Service> weak_ptr_factory_;
};

}  // namespace virtual_file_provider

#endif  // VIRTUAL_FILE_PROVIDER_SERVICE_H_
