// 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/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);

  // 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_
