// Copyright (c) 2013 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 "cryptohome/mount_stack.h"

#include <algorithm>
#include <base/files/file_path.h>
#include <base/logging.h>

using base::FilePath;

namespace cryptohome {

MountStack::MountInfo::MountInfo(const FilePath& src, const FilePath& dest)
    : src(src), dest(dest) {}

MountStack::MountStack() {}

MountStack::~MountStack() {
  if (!mounts_.empty()) {
    LOG(ERROR) << "MountStack destroyed with " << mounts_.size() << " mounts.";
    for (const auto& it : mounts_)
      LOG(ERROR) << "  " << it.src.value() << " -> " << it.dest.value();
  }
}

void MountStack::Push(const FilePath& src, const FilePath& dest) {
  mounts_.push_back(MountInfo(src, dest));
}

bool MountStack::Pop(FilePath* src_out, FilePath* dest_out) {
  if (mounts_.empty())
    return false;

  const MountInfo& info = mounts_.back();
  *src_out = info.src;
  *dest_out = info.dest;
  mounts_.pop_back();
  return true;
}

bool MountStack::ContainsDest(const FilePath& dest) const {
  for (const auto& info : mounts_) {
    if (info.dest == dest)
      return true;
  }
  return false;
}

std::vector<base::FilePath> MountStack::MountDestinations() const {
  std::vector<base::FilePath> res;
  for (const auto& mount : mounts_) {
    res.push_back(mount.dest);
  }
  return res;
}

}  // namespace cryptohome
