// Copyright 2016 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.

#include "arc/obb-mounter/service.h"

#include <string>

#include <base/bind.h>
#include <base/logging.h>
#include <chromeos/dbus/service_constants.h>
#include <dbus/bus.h>
#include <dbus/message.h>

#include "arc/obb-mounter/mount.h"

namespace arc {
namespace obb_mounter {

Service::Service() : weak_ptr_factory_(this) {}

Service::~Service() {
  if (bus_) {
    bus_->ShutdownAndBlock();
  }
}

bool Service::Initialize(scoped_refptr<dbus::Bus> bus) {
  bus_ = bus;
  // Export methods.
  exported_object_ =
      bus->GetExportedObject(dbus::ObjectPath(kArcObbMounterServicePath));
  if (!exported_object_->ExportMethodAndBlock(
          kArcObbMounterInterface, kMountObbMethod,
          base::Bind(&Service::MountObb, weak_ptr_factory_.GetWeakPtr()))) {
    LOG(ERROR) << "Failed to export MountObb method.";
    return false;
  }
  if (!exported_object_->ExportMethodAndBlock(
          kArcObbMounterInterface, kUnmountObbMethod,
          base::Bind(&Service::UnmountObb, weak_ptr_factory_.GetWeakPtr()))) {
    LOG(ERROR) << "Failed to export UnmountObb method.";
    return false;
  }
  // Request the ownership of the service name.
  if (!bus->RequestOwnershipAndBlock(kArcObbMounterServiceName,
                                     dbus::Bus::REQUIRE_PRIMARY)) {
    LOG(ERROR) << "Failed to own the service name";
    return false;
  }
  return true;
}

void Service::MountObb(dbus::MethodCall* method_call,
                       dbus::ExportedObject::ResponseSender response_sender) {
  dbus::MessageReader reader(method_call);
  std::string obb_file, mount_path;
  int32_t owner_gid = 0;
  if (!reader.PopString(&obb_file) || !reader.PopString(&mount_path) ||
      !reader.PopInt32(&owner_gid)) {
    response_sender.Run(dbus::ErrorResponse::FromMethodCall(
        method_call, DBUS_ERROR_INVALID_ARGS, std::string()));
    return;
  }
  if (!obb_mounter::MountObb(obb_file, mount_path, owner_gid)) {
    response_sender.Run(dbus::ErrorResponse::FromMethodCall(
        method_call, DBUS_ERROR_FAILED, std::string()));
    return;
  }
  response_sender.Run(dbus::Response::FromMethodCall(method_call));
}

void Service::UnmountObb(dbus::MethodCall* method_call,
                         dbus::ExportedObject::ResponseSender response_sender) {
  dbus::MessageReader reader(method_call);
  std::string mount_path;
  if (!reader.PopString(&mount_path)) {
    response_sender.Run(dbus::ErrorResponse::FromMethodCall(
        method_call, DBUS_ERROR_INVALID_ARGS, std::string()));
    return;
  }
  if (!obb_mounter::UnmountObb(mount_path)) {
    response_sender.Run(dbus::ErrorResponse::FromMethodCall(
        method_call, DBUS_ERROR_FAILED, std::string()));
    return;
  }
  response_sender.Run(dbus::Response::FromMethodCall(method_call));
}

}  // namespace obb_mounter
}  // namespace arc
