// Copyright (c) 2012 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 "cros-disks/daemon.h"

namespace {

const char kArchiveMountRootDirectory[] = "/media/archive";
const char kDiskMountRootDirectory[] = "/media/removable";
const char kNonPrivilegedMountUser[] = "chronos";

}  // namespace

namespace cros_disks {

Daemon::Daemon(DBus::Connection* dbus_connection)
    : archive_manager_(kArchiveMountRootDirectory, &platform_, &metrics_),
      disk_manager_(kDiskMountRootDirectory, &platform_, &metrics_,
                    &device_ejector_),
      server_(*dbus_connection, &platform_, &disk_manager_, &format_manager_),
      event_moderator_(&server_, &disk_manager_),
      session_manager_proxy_(dbus_connection) {
}

void Daemon::Initialize() {
  // Register mount managers with the commonly used ones come first.
  server_.RegisterMountManager(&disk_manager_);
  server_.RegisterMountManager(&archive_manager_);

  CHECK(platform_.SetMountUser(kNonPrivilegedMountUser))
      << "'" << kNonPrivilegedMountUser
      << "' is not available for non-privileged mount operations.";
  CHECK(archive_manager_.Initialize())
      << "Failed to initialize the archive manager";
  CHECK(disk_manager_.Initialize()) << "Failed to initialize the disk manager";

  session_manager_proxy_.AddObserver(&server_);
  session_manager_proxy_.AddObserver(&event_moderator_);
}

int Daemon::GetDeviceEventDescriptor() const {
  return disk_manager_.udev_monitor_fd();
}

void Daemon::ProcessDeviceEvents() {
  event_moderator_.ProcessDeviceEvents();
}

}  // namespace cros_disks
