15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#ifndef COMPONENTS_NACL_BROWSER_NACL_BROKER_HOST_WIN_H_
6f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#define COMPONENTS_NACL_BROWSER_NACL_BROKER_HOST_WIN_H_
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string>
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/basictypes.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/scoped_ptr.h"
12bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch#include "base/process/process.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/browser_child_process_host_delegate.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace content {
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class BrowserChildProcessHost;
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)namespace nacl {
20f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class NaClBrokerHost : public content::BrowserChildProcessHostDelegate {
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NaClBrokerHost();
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ~NaClBrokerHost();
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // This function starts the broker process. It needs to be called
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // before loaders can be launched.
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool Init();
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Send a message to the broker process, causing it to launch
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // a Native Client loader process.
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool LaunchLoader(const std::string& loader_channel_id);
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool LaunchDebugExceptionHandler(int32 pid,
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                   base::ProcessHandle process_handle,
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                   const std::string& startup_info);
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Stop the broker process.
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void StopBroker();
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns true if the process has been asked to terminate. If true, this
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // object should no longer be used; it will eventually be destroyed by
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // BrowserChildProcessHostImpl::OnChildDisconnected()
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool IsTerminating() { return is_terminating_; }
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Handler for NaClProcessMsg_LoaderLaunched message
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void OnLoaderLaunched(const std::string& loader_channel_id,
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        base::ProcessHandle handle);
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Handler for NaClProcessMsg_DebugExceptionHandlerLaunched message
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void OnDebugExceptionHandlerLaunched(int32 pid, bool success);
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // BrowserChildProcessHostDelegate implementation:
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual bool OnMessageReceived(const IPC::Message& msg);
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<content::BrowserChildProcessHost> process_;
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool is_terminating_;
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(NaClBrokerHost);
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
62f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}  // namespace nacl
63f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
64f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#endif  // COMPONENTS_NACL_BROWSER_NACL_BROKER_HOST_WIN_H_
65