// Copyright (c) 2012 The Chromium 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 "remoting/host/chromoting_host_context.h"

#include <string>

#include "base/bind.h"
#include "remoting/base/auto_thread.h"
#include "remoting/base/url_request_context.h"

namespace remoting {

ChromotingHostContext::ChromotingHostContext(
    AutoThreadTaskRunner* ui_task_runner)
    : ui_task_runner_(ui_task_runner) {
#if defined(OS_WIN)
  // On Windows the AudioCapturer requires COM, so we run a single-threaded
  // apartment, which requires a UI thread.
  audio_task_runner_ =
      AutoThread::CreateWithLoopAndComInitTypes("ChromotingAudioThread",
                                                ui_task_runner_,
                                                base::MessageLoop::TYPE_UI,
                                                AutoThread::COM_INIT_STA);
#else // !defined(OS_WIN)
  audio_task_runner_ = AutoThread::CreateWithType(
      "ChromotingAudioThread", ui_task_runner_, base::MessageLoop::TYPE_IO);
#endif  // !defined(OS_WIN)

  file_task_runner_ = AutoThread::CreateWithType(
      "ChromotingFileThread", ui_task_runner_, base::MessageLoop::TYPE_IO);
  input_task_runner_ = AutoThread::CreateWithType(
      "ChromotingInputThread", ui_task_runner_, base::MessageLoop::TYPE_IO);
  network_task_runner_ = AutoThread::CreateWithType(
      "ChromotingNetworkThread", ui_task_runner_, base::MessageLoop::TYPE_IO);
  video_capture_task_runner_ =
      AutoThread::Create("ChromotingCaptureThread", ui_task_runner_);
  video_encode_task_runner_ = AutoThread::Create(
      "ChromotingEncodeThread", ui_task_runner_);

  url_request_context_getter_ = new URLRequestContextGetter(
      network_task_runner_);
}

ChromotingHostContext::~ChromotingHostContext() {
}

scoped_ptr<ChromotingHostContext> ChromotingHostContext::Create(
    scoped_refptr<AutoThreadTaskRunner> ui_task_runner) {
  DCHECK(ui_task_runner->BelongsToCurrentThread());

  scoped_ptr<ChromotingHostContext> context(
      new ChromotingHostContext(ui_task_runner.get()));
  if (!context->audio_task_runner_.get() || !context->file_task_runner_.get() ||
      !context->input_task_runner_.get() ||
      !context->network_task_runner_.get() ||
      !context->video_capture_task_runner_.get() ||
      !context->video_encode_task_runner_.get() ||
      !context->url_request_context_getter_.get()) {
    context.reset();
  }

  return context.Pass();
}

scoped_refptr<AutoThreadTaskRunner>
ChromotingHostContext::audio_task_runner() {
  return audio_task_runner_;
}

scoped_refptr<AutoThreadTaskRunner>
ChromotingHostContext::file_task_runner() {
  return file_task_runner_;
}

scoped_refptr<AutoThreadTaskRunner>
ChromotingHostContext::input_task_runner() {
  return input_task_runner_;
}

scoped_refptr<AutoThreadTaskRunner>
ChromotingHostContext::network_task_runner() {
  return network_task_runner_;
}

scoped_refptr<AutoThreadTaskRunner>
ChromotingHostContext::ui_task_runner() {
  return ui_task_runner_;
}

scoped_refptr<AutoThreadTaskRunner>
ChromotingHostContext::video_capture_task_runner() {
  return video_capture_task_runner_;
}

scoped_refptr<AutoThreadTaskRunner>
ChromotingHostContext::video_encode_task_runner() {
  return video_encode_task_runner_;
}

scoped_refptr<net::URLRequestContextGetter>
ChromotingHostContext::url_request_context_getter() {
  return url_request_context_getter_;
}

}  // namespace remoting
