// 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 "cryptohome/mount_task.h"

#include "cryptohome/install_attributes.h"

namespace cryptohome {

const char* kMountTaskResultEventType = "MountTaskResult";
const char* kPkcs11InitResultEventType = "Pkcs11InitResult";

MountTask::MountTask(MountTaskObserver* observer,
                     Mount* mount,
                     const Credentials& credentials,
                     int sequence_id)
    : mount_(mount),
      credentials_(credentials),
      sequence_id_(sequence_id),
      observer_(observer),
      default_result_(new MountTaskResult),
      result_(default_result_.get()),
      complete_event_(NULL) {
  result_->set_sequence_id(sequence_id_);
}

MountTask::MountTask(MountTaskObserver* observer, Mount* mount, int sequence_id)
    : mount_(mount),
      sequence_id_(sequence_id),
      observer_(observer),
      default_result_(new MountTaskResult),
      result_(default_result_.get()),
      complete_event_(NULL) {
  result_->set_sequence_id(sequence_id_);
}

MountTask::~MountTask() {
}

void MountTask::Notify() {
  if (observer_) {
    if (observer_->MountTaskObserve(*result_)) {
      delete observer_;
      observer_ = NULL;
    }
  }
  Signal();
}

void MountTask::Signal() {
  if (complete_event_) {
    complete_event_->Signal();
  }
}

}  // namespace cryptohome
