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

}  // namespace cryptohome
