// 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 "shill/ephemeral_profile.h"

#include <chromeos/dbus/service_constants.h>

#include "shill/adaptor_interfaces.h"
#include "shill/control_interface.h"
#include "shill/logging.h"
#include "shill/manager.h"

namespace shill {

using std::string;

namespace Logging {
static auto kModuleLogScope = ScopeLogger::kProfile;
static string ObjectID(EphemeralProfile *e) { return e->GetRpcIdentifier(); }
}

// static
const char EphemeralProfile::kFriendlyName[] = "(ephemeral)";

EphemeralProfile::EphemeralProfile(ControlInterface *control_interface,
                                   Metrics *metrics,
                                   Manager *manager)
    : Profile(control_interface, metrics, manager, Identifier(), "", false) {
}

EphemeralProfile::~EphemeralProfile() {}

string EphemeralProfile::GetFriendlyName() {
  return kFriendlyName;
}

bool EphemeralProfile::AdoptService(const ServiceRefPtr &service) {
  SLOG(this, 2) << "Adding service " << service->unique_name()
                << " to ephemeral profile.";
  service->SetProfile(this);
  return true;
}

bool EphemeralProfile::AbandonService(const ServiceRefPtr &service) {
  if (service->profile() == this)
    service->SetProfile(nullptr);
  SLOG(this, 2) << "Removing service " << service->unique_name()
                << " from ephemeral profile.";
  return true;
}

bool EphemeralProfile::Save() {
  NOTREACHED();
  return false;
}

}  // namespace shill
