Update To 11.40.268.0
[platform/framework/web/crosswalk.git] / src / remoting / host / it2me / it2me_native_messaging_host_main.cc
1 // Copyright 2013 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 #include "remoting/host/it2me/it2me_native_messaging_host_main.h"
6
7 #include "base/at_exit.h"
8 #include "base/command_line.h"
9 #include "base/i18n/icu_util.h"
10 #include "base/message_loop/message_loop.h"
11 #include "base/run_loop.h"
12 #include "net/socket/ssl_server_socket.h"
13 #include "remoting/base/breakpad.h"
14 #include "remoting/base/resources.h"
15 #include "remoting/host/chromoting_host_context.h"
16 #include "remoting/host/host_exit_codes.h"
17 #include "remoting/host/it2me/it2me_native_messaging_host.h"
18 #include "remoting/host/logging.h"
19 #include "remoting/host/native_messaging/native_messaging_pipe.h"
20 #include "remoting/host/native_messaging/pipe_messaging_channel.h"
21 #include "remoting/host/usage_stats_consent.h"
22
23 #if defined(OS_LINUX)
24 #include <gtk/gtk.h>
25 #include <X11/Xlib.h>
26 #endif  // defined(OS_LINUX)
27
28 #if defined(OS_MACOSX)
29 #include "base/mac/scoped_nsautorelease_pool.h"
30 #endif  // defined(OS_MACOSX)
31
32 #if defined(OS_WIN)
33 #include <commctrl.h>
34 #endif  // defined(OS_WIN)
35
36 namespace remoting {
37
38 // Creates a It2MeNativeMessagingHost instance, attaches it to stdin/stdout and
39 // runs the message loop until It2MeNativeMessagingHost signals shutdown.
40 int StartIt2MeNativeMessagingHost() {
41 #if defined(OS_MACOSX)
42   // Needed so we don't leak objects when threads are created.
43   base::mac::ScopedNSAutoreleasePool pool;
44 #endif  // defined(OS_MACOSX)
45
46 #if defined(REMOTING_ENABLE_BREAKPAD)
47   // Initialize Breakpad as early as possible. On Mac the command-line needs to
48   // be initialized first, so that the preference for crash-reporting can be
49   // looked up in the config file.
50   if (IsUsageStatsAllowed()) {
51     InitializeCrashReporting();
52   }
53 #endif  // defined(REMOTING_ENABLE_BREAKPAD)
54
55 #if defined(OS_WIN)
56   // Register and initialize common controls.
57   INITCOMMONCONTROLSEX info;
58   info.dwSize = sizeof(info);
59   info.dwICC = ICC_STANDARD_CLASSES;
60   InitCommonControlsEx(&info);
61 #endif  // defined(OS_WIN)
62
63   // Required to find the ICU data file, used by some file_util routines.
64   base::i18n::InitializeICU();
65
66   remoting::LoadResources("");
67
68   // Cannot use TOOLKIT_GTK because it is not defined when aura is enabled.
69 #if defined(OS_LINUX)
70   // Required in order for us to run multiple X11 threads.
71   XInitThreads();
72
73   // Required for any calls into GTK functions, such as the Disconnect and
74   // Continue windows. Calling with NULL arguments because we don't have
75   // any command line arguments for gtk to consume.
76   gtk_init(NULL, NULL);
77 #endif  // OS_LINUX
78
79   // Enable support for SSL server sockets, which must be done while still
80   // single-threaded.
81   net::EnableSSLServerSockets();
82
83 #if defined(OS_WIN)
84   // GetStdHandle() returns pseudo-handles for stdin and stdout even if
85   // the hosting executable specifies "Windows" subsystem. However the returned
86   // handles are invalid in that case unless standard input and output are
87   // redirected to a pipe or file.
88   base::File read_file(GetStdHandle(STD_INPUT_HANDLE));
89   base::File write_file(GetStdHandle(STD_OUTPUT_HANDLE));
90
91   // After the native messaging channel starts the native messaging reader
92   // will keep doing blocking read operations on the input named pipe.
93   // If any other thread tries to perform any operation on STDIN, it will also
94   // block because the input named pipe is synchronous (non-overlapped).
95   // It is pretty common for a DLL to query the device info (GetFileType) of
96   // the STD* handles at startup. So any LoadLibrary request can potentially
97   // be blocked. To prevent that from happening we close STDIN and STDOUT
98   // handles as soon as we retrieve the corresponding file handles.
99   SetStdHandle(STD_INPUT_HANDLE, NULL);
100   SetStdHandle(STD_OUTPUT_HANDLE, NULL);
101 #elif defined(OS_POSIX)
102   // The files are automatically closed.
103   base::File read_file(STDIN_FILENO);
104   base::File write_file(STDOUT_FILENO);
105 #else
106 #error Not implemented.
107 #endif
108
109   base::MessageLoopForUI message_loop;
110   base::RunLoop run_loop;
111
112   scoped_refptr<AutoThreadTaskRunner> task_runner =
113       new remoting::AutoThreadTaskRunner(message_loop.message_loop_proxy(),
114                                          run_loop.QuitClosure());
115
116   scoped_ptr<It2MeHostFactory> factory(new It2MeHostFactory());
117
118   scoped_ptr<NativeMessagingPipe> native_messaging_pipe(
119       new NativeMessagingPipe());
120
121   // Set up the native messaging channel.
122   scoped_ptr<extensions::NativeMessagingChannel> channel(
123       new PipeMessagingChannel(read_file.Pass(), write_file.Pass()));
124
125   scoped_ptr<extensions::NativeMessageHost> host(new It2MeNativeMessagingHost(
126       ChromotingHostContext::Create(task_runner), factory.Pass()));
127
128   host->Start(native_messaging_pipe.get());
129
130   native_messaging_pipe->Start(
131       host.Pass(), channel.Pass(), run_loop.QuitClosure());
132
133   // Run the loop until channel is alive.
134   run_loop.Run();
135
136   return kSuccessExitCode;
137 }
138
139 int It2MeNativeMessagingHostMain(int argc, char** argv) {
140   // This object instance is required by Chrome code (such as MessageLoop).
141   base::AtExitManager exit_manager;
142
143   base::CommandLine::Init(argc, argv);
144   remoting::InitHostLogging();
145
146   return StartIt2MeNativeMessagingHost();
147 }
148
149 }  // namespace remoting