Home | History | Annotate | Download | only in embedder
      1 // Copyright 2014 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 "mojo/edk/embedder/embedder.h"
      6 
      7 #include <stdint.h>
      8 
      9 #include "base/bind.h"
     10 #include "base/location.h"
     11 #include "base/logging.h"
     12 #include "base/memory/ref_counted.h"
     13 #include "base/rand_util.h"
     14 #include "base/strings/string_number_conversions.h"
     15 #include "base/task_runner.h"
     16 #include "base/threading/thread_task_runner_handle.h"
     17 #include "mojo/edk/embedder/embedder_internal.h"
     18 #include "mojo/edk/embedder/entrypoints.h"
     19 #include "mojo/edk/embedder/platform_channel_pair.h"
     20 #include "mojo/edk/embedder/process_delegate.h"
     21 #include "mojo/edk/system/core.h"
     22 
     23 #if !defined(OS_NACL)
     24 #include "crypto/random.h"
     25 #endif
     26 
     27 namespace mojo {
     28 namespace edk {
     29 
     30 class Core;
     31 class PlatformSupport;
     32 
     33 namespace internal {
     34 
     35 Core* g_core;
     36 ProcessDelegate* g_process_delegate;
     37 
     38 Core* GetCore() { return g_core; }
     39 
     40 }  // namespace internal
     41 
     42 void SetMaxMessageSize(size_t bytes) {
     43 }
     44 
     45 void ChildProcessLaunched(base::ProcessHandle child_process,
     46                           ScopedPlatformHandle server_pipe,
     47                           const std::string& child_token) {
     48   ChildProcessLaunched(child_process, std::move(server_pipe),
     49                        child_token, ProcessErrorCallback());
     50 }
     51 
     52 void ChildProcessLaunched(base::ProcessHandle child_process,
     53                           ScopedPlatformHandle server_pipe,
     54                           const std::string& child_token,
     55                           const ProcessErrorCallback& process_error_callback) {
     56   CHECK(internal::g_core);
     57   internal::g_core->AddChild(child_process, std::move(server_pipe),
     58                              child_token, process_error_callback);
     59 }
     60 
     61 void ChildProcessLaunchFailed(const std::string& child_token) {
     62   CHECK(internal::g_core);
     63   internal::g_core->ChildLaunchFailed(child_token);
     64 }
     65 
     66 void SetParentPipeHandle(ScopedPlatformHandle pipe) {
     67   CHECK(internal::g_core);
     68   internal::g_core->InitChild(std::move(pipe));
     69 }
     70 
     71 void SetParentPipeHandleFromCommandLine() {
     72   ScopedPlatformHandle platform_channel =
     73       PlatformChannelPair::PassClientHandleFromParentProcess(
     74           *base::CommandLine::ForCurrentProcess());
     75   CHECK(platform_channel.is_valid());
     76   SetParentPipeHandle(std::move(platform_channel));
     77 }
     78 
     79 void Init() {
     80   MojoSystemThunks thunks = MakeSystemThunks();
     81   size_t expected_size = MojoEmbedderSetSystemThunks(&thunks);
     82   DCHECK_EQ(expected_size, sizeof(thunks));
     83 
     84   internal::g_core = new Core();
     85 }
     86 
     87 MojoResult CreatePlatformHandleWrapper(
     88     ScopedPlatformHandle platform_handle,
     89     MojoHandle* platform_handle_wrapper_handle) {
     90   return internal::g_core->CreatePlatformHandleWrapper(
     91       std::move(platform_handle), platform_handle_wrapper_handle);
     92 }
     93 
     94 MojoResult PassWrappedPlatformHandle(MojoHandle platform_handle_wrapper_handle,
     95                                      ScopedPlatformHandle* platform_handle) {
     96   return internal::g_core->PassWrappedPlatformHandle(
     97       platform_handle_wrapper_handle, platform_handle);
     98 }
     99 
    100 MojoResult CreateSharedBufferWrapper(
    101     base::SharedMemoryHandle shared_memory_handle,
    102     size_t num_bytes,
    103     bool read_only,
    104     MojoHandle* mojo_wrapper_handle) {
    105   return internal::g_core->CreateSharedBufferWrapper(
    106       shared_memory_handle, num_bytes, read_only, mojo_wrapper_handle);
    107 }
    108 
    109 MojoResult PassSharedMemoryHandle(
    110     MojoHandle mojo_handle,
    111     base::SharedMemoryHandle* shared_memory_handle,
    112     size_t* num_bytes,
    113     bool* read_only) {
    114   return internal::g_core->PassSharedMemoryHandle(
    115       mojo_handle, shared_memory_handle, num_bytes, read_only);
    116 }
    117 
    118 void InitIPCSupport(ProcessDelegate* process_delegate,
    119                     scoped_refptr<base::TaskRunner> io_thread_task_runner) {
    120   CHECK(internal::g_core);
    121   internal::g_core->SetIOTaskRunner(io_thread_task_runner);
    122   internal::g_process_delegate = process_delegate;
    123 }
    124 
    125 void ShutdownIPCSupport() {
    126   CHECK(internal::g_process_delegate);
    127   CHECK(internal::g_core);
    128   internal::g_core->RequestShutdown(
    129       base::Bind(&ProcessDelegate::OnShutdownComplete,
    130                  base::Unretained(internal::g_process_delegate)));
    131 }
    132 
    133 #if defined(OS_MACOSX) && !defined(OS_IOS)
    134 void SetMachPortProvider(base::PortProvider* port_provider) {
    135   DCHECK(port_provider);
    136   internal::g_core->SetMachPortProvider(port_provider);
    137 }
    138 #endif
    139 
    140 ScopedMessagePipeHandle CreateParentMessagePipe(
    141     const std::string& token, const std::string& child_token) {
    142   CHECK(internal::g_process_delegate);
    143   return internal::g_core->CreateParentMessagePipe(token, child_token);
    144 }
    145 
    146 ScopedMessagePipeHandle CreateChildMessagePipe(const std::string& token) {
    147   CHECK(internal::g_process_delegate);
    148   return internal::g_core->CreateChildMessagePipe(token);
    149 }
    150 
    151 std::string GenerateRandomToken() {
    152   char random_bytes[16];
    153 #if defined(OS_NACL)
    154   // Not secure. For NaCl only!
    155   base::RandBytes(random_bytes, 16);
    156 #else
    157   crypto::RandBytes(random_bytes, 16);
    158 #endif
    159   return base::HexEncode(random_bytes, 16);
    160 }
    161 
    162 MojoResult SetProperty(MojoPropertyType type, const void* value) {
    163   CHECK(internal::g_core);
    164   return internal::g_core->SetProperty(type, value);
    165 }
    166 
    167 }  // namespace edk
    168 }  // namespace mojo
    169