// Copyright 2015 The Crashpad Authors. All rights reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//     http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

#include "test/win/win_multiprocess.h"

#include <shellapi.h>

#include "base/check.h"
#include "base/scoped_generic.h"
#include "base/strings/stringprintf.h"
#include "base/strings/utf_string_conversions.h"
#include "util/stdlib/string_number_conversion.h"
#include "util/string/split_string.h"

namespace crashpad {
namespace test {

WinMultiprocess::WinMultiprocess()
    : exit_code_(EXIT_SUCCESS),
      child_handles_(nullptr),
      child_process_helper_(nullptr) {}

WinMultiprocess::~WinMultiprocess() {
}

void WinMultiprocess::SetExpectedChildExitCode(unsigned int exit_code) {
  exit_code_ = exit_code;
}

FileHandle WinMultiprocess::ReadPipeHandle() const {
  if (child_handles_)
    return child_handles_->read.get();
  CHECK(child_process_helper_);
  return child_process_helper_->ReadPipeHandleForwarder();
}

FileHandle WinMultiprocess::WritePipeHandle() const {
  if (child_handles_)
    return child_handles_->write.get();
  CHECK(child_process_helper_);
  return child_process_helper_->WritePipeHandleForwarder();
}

void WinMultiprocess::CloseReadPipe() {
  if (child_handles_) {
    child_handles_->read.reset();
  } else {
    CHECK(child_process_helper_);
    child_process_helper_->CloseReadPipeForwarder();
  }
}

void WinMultiprocess::CloseWritePipe() {
  if (child_handles_) {
    child_handles_->write.reset();
  } else {
    CHECK(child_process_helper_);
    child_process_helper_->CloseWritePipeForwarder();
  }
}

HANDLE WinMultiprocess::ChildProcess() const {
  CHECK(child_handles_);
  return child_handles_->process.get();
}

}  // namespace test
}  // namespace crashpad
