blob: 0d4b80ef77259a57057d5010dd679ba9bb3824a6 [file] [log] [blame]
[email protected]cb3b1f9312010-06-07 19:58:231// Copyright (c) 2010 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4//
5// This is an application of a minimal host process in a Chromoting
6// system. It serves the purpose of gluing different pieces together
7// to make a functional host process for testing.
8//
9// It peforms the following functionality:
10// 1. Connect to the GTalk network and register the machine as a host.
11// 2. Accepts connection through libjingle.
12// 3. Receive mouse / keyboard events through libjingle.
13// 4. Sends screen capture through libjingle.
14
15#include <iostream>
16#include <string>
[email protected]7de8b182010-06-23 15:38:2917#include <stdlib.h>
[email protected]cb3b1f9312010-06-07 19:58:2318
19#include "build/build_config.h"
20
[email protected]cb3b1f9312010-06-07 19:58:2321#include "base/at_exit.h"
[email protected]76207352010-06-17 23:43:0022#include "base/command_line.h"
[email protected]76b90d312010-08-03 03:00:5023#include "base/environment.h"
[email protected]76207352010-06-17 23:43:0024#include "base/file_path.h"
25#include "base/logging.h"
[email protected]c2818d42010-10-18 02:47:3926#include "base/mac/scoped_nsautorelease_pool.h"
[email protected]81565e952010-06-30 22:51:0627#include "base/nss_util.h"
[email protected]04b36142010-11-02 01:08:1928#include "base/path_service.h"
[email protected]76207352010-06-17 23:43:0029#include "base/thread.h"
[email protected]04b36142010-11-02 01:08:1930#include "media/base/media.h"
[email protected]04b36142010-11-02 01:08:1931#include "remoting/base/tracer.h"
[email protected]cb3b1f9312010-06-07 19:58:2332#include "remoting/host/capturer_fake.h"
[email protected]2a4f9882010-06-15 00:20:3833#include "remoting/host/chromoting_host.h"
[email protected]92698ce2010-06-28 21:49:3034#include "remoting/host/chromoting_host_context.h"
[email protected]76207352010-06-17 23:43:0035#include "remoting/host/json_host_config.h"
[email protected]04b36142010-11-02 01:08:1936#include "remoting/proto/video.pb.h"
[email protected]cb3b1f9312010-06-07 19:58:2337
38#if defined(OS_WIN)
39#include "remoting/host/capturer_gdi.h"
40#include "remoting/host/event_executor_win.h"
41#elif defined(OS_LINUX)
42#include "remoting/host/capturer_linux.h"
43#include "remoting/host/event_executor_linux.h"
[email protected]9ec52732010-06-09 23:47:1844#elif defined(OS_MACOSX)
[email protected]cb3b1f9312010-06-07 19:58:2345#include "remoting/host/capturer_mac.h"
46#include "remoting/host/event_executor_mac.h"
47#endif
48
[email protected]76207352010-06-17 23:43:0049#if defined(OS_WIN)
[email protected]7de8b182010-06-23 15:38:2950const std::wstring kDefaultConfigPath = L".ChromotingConfig.json";
[email protected]65b6c1aa2010-06-25 01:19:5051const wchar_t kHomeDrive[] = L"HOMEDRIVE";
[email protected]7de8b182010-06-23 15:38:2952const wchar_t kHomePath[] = L"HOMEPATH";
53const wchar_t* GetEnvironmentVar(const wchar_t* x) { return _wgetenv(x); }
[email protected]76207352010-06-17 23:43:0054#else
[email protected]7de8b182010-06-23 15:38:2955const std::string kDefaultConfigPath = ".ChromotingConfig.json";
[email protected]65b6c1aa2010-06-25 01:19:5056static char* GetEnvironmentVar(const char* x) { return getenv(x); }
[email protected]76207352010-06-17 23:43:0057#endif
58
[email protected]92698ce2010-06-28 21:49:3059void ShutdownTask(MessageLoop* message_loop) {
60 message_loop->PostTask(FROM_HERE, new MessageLoop::QuitTask());
61}
62
[email protected]76207352010-06-17 23:43:0063const std::string kFakeSwitchName = "fake";
64const std::string kConfigSwitchName = "config";
65
[email protected]cb3b1f9312010-06-07 19:58:2366int main(int argc, char** argv) {
[email protected]7de8b182010-06-23 15:38:2967 // Needed for the Mac, so we don't leak objects when threads are created.
[email protected]c2818d42010-10-18 02:47:3968 base::mac::ScopedNSAutoreleasePool pool;
[email protected]7de8b182010-06-23 15:38:2969
[email protected]76207352010-06-17 23:43:0070 CommandLine::Init(argc, argv);
71 const CommandLine* cmd_line = CommandLine::ForCurrentProcess();
72
[email protected]cb3b1f9312010-06-07 19:58:2373 base::AtExitManager exit_manager;
[email protected]81565e952010-06-30 22:51:0674 base::EnsureNSPRInit();
75
[email protected]6fd3d6a12010-11-16 19:53:3576 // Allocate a chromoting context and starts it.
77 remoting::ChromotingHostContext context;
78 context.Start();
79
[email protected]cb3b1f9312010-06-07 19:58:2380 scoped_ptr<remoting::Capturer> capturer;
[email protected]6fd3d6a12010-11-16 19:53:3581 scoped_ptr<remoting::protocol::InputStub> input_stub;
[email protected]cb3b1f9312010-06-07 19:58:2382#if defined(OS_WIN)
83 capturer.reset(new remoting::CapturerGdi());
[email protected]6fd3d6a12010-11-16 19:53:3584 input_stub.reset(new remoting::EventExecutorWin(
85 context.capture_message_loop(), capturer.get()));
[email protected]cb3b1f9312010-06-07 19:58:2386#elif defined(OS_LINUX)
87 capturer.reset(new remoting::CapturerLinux());
[email protected]6fd3d6a12010-11-16 19:53:3588 input_stub.reset(new remoting::EventExecutorLinux(
89 context.capture_message_loop(), capturer.get()));
[email protected]9ec52732010-06-09 23:47:1890#elif defined(OS_MACOSX)
[email protected]cb3b1f9312010-06-07 19:58:2391 capturer.reset(new remoting::CapturerMac());
[email protected]6fd3d6a12010-11-16 19:53:3592 input_stub.reset(new remoting::EventExecutorMac(
93 context.capture_message_loop(), capturer.get()));
[email protected]cb3b1f9312010-06-07 19:58:2394#endif
[email protected]cb3b1f9312010-06-07 19:58:2395
[email protected]14fd1a602010-11-03 04:17:0996 // Check the argument to see if we should use a fake capturer.
[email protected]76207352010-06-17 23:43:0097 bool fake = cmd_line->HasSwitch(kFakeSwitchName);
98
[email protected]65b6c1aa2010-06-25 01:19:5099#if defined(OS_WIN)
[email protected]04b36142010-11-02 01:08:19100 std::wstring home_path = GetEnvironmentVar(kHomeDrive);
101 home_path += GetEnvironmentVar(kHomePath);
[email protected]65b6c1aa2010-06-25 01:19:50102#else
[email protected]04b36142010-11-02 01:08:19103 std::string home_path = GetEnvironmentVar(base::env_vars::kHome);
[email protected]65b6c1aa2010-06-25 01:19:50104#endif
[email protected]04b36142010-11-02 01:08:19105 FilePath config_path(home_path);
[email protected]7de8b182010-06-23 15:38:29106 config_path = config_path.Append(kDefaultConfigPath);
[email protected]76207352010-06-17 23:43:00107 if (cmd_line->HasSwitch(kConfigSwitchName)) {
108 config_path = cmd_line->GetSwitchValuePath(kConfigSwitchName);
109 }
110
[email protected]cb3b1f9312010-06-07 19:58:23111 if (fake) {
112 // Inject a fake capturer.
[email protected]88552a92010-08-06 22:50:00113 LOG(INFO) << "Using a fake capturer.";
[email protected]cb3b1f9312010-06-07 19:58:23114 capturer.reset(new remoting::CapturerFake());
115 }
116
[email protected]76207352010-06-17 23:43:00117 base::Thread file_io_thread("FileIO");
118 file_io_thread.Start();
[email protected]34f09f1a2010-06-15 23:00:26119
[email protected]76207352010-06-17 23:43:00120 scoped_refptr<remoting::JsonHostConfig> config(
121 new remoting::JsonHostConfig(
122 config_path, file_io_thread.message_loop_proxy()));
123
124 if (!config->Read()) {
125 LOG(ERROR) << "Failed to read configuration file " << config_path.value();
[email protected]6fd3d6a12010-11-16 19:53:35126 context.Stop();
[email protected]76207352010-06-17 23:43:00127 return 1;
128 }
129
[email protected]04b36142010-11-02 01:08:19130 FilePath module_path;
131 PathService::Get(base::DIR_MODULE, &module_path);
132 CHECK(media::InitializeMediaLibrary(module_path))
133 << "Cannot load media library";
134
[email protected]92698ce2010-06-28 21:49:30135 // Construct a chromoting host.
[email protected]ad8e04a2010-11-01 04:16:27136 scoped_refptr<remoting::ChromotingHost> host(
[email protected]92698ce2010-06-28 21:49:30137 new remoting::ChromotingHost(&context,
138 config,
[email protected]34f09f1a2010-06-15 23:00:26139 capturer.release(),
[email protected]6fd3d6a12010-11-16 19:53:35140 input_stub.release()));
[email protected]76207352010-06-17 23:43:00141
[email protected]88552a92010-08-06 22:50:00142 // Let the chromoting host run until the shutdown task is executed.
[email protected]81565e952010-06-30 22:51:06143 MessageLoop message_loop(MessageLoop::TYPE_UI);
[email protected]92698ce2010-06-28 21:49:30144 host->Start(NewRunnableFunction(&ShutdownTask, &message_loop));
145 message_loop.Run();
146
147 // And then stop the chromoting context.
148 context.Stop();
[email protected]76207352010-06-17 23:43:00149 file_io_thread.Stop();
[email protected]cb3b1f9312010-06-07 19:58:23150 return 0;
151}