Upstream version 5.34.104.0
[platform/framework/web/crosswalk.git] / src / chrome / browser / extensions / api / messaging / native_message_process_host.h
1 // Copyright (c) 2012 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 #ifndef CHROME_BROWSER_EXTENSIONS_API_MESSAGING_NATIVE_MESSAGE_PROCESS_HOST_H_
6 #define CHROME_BROWSER_EXTENSIONS_API_MESSAGING_NATIVE_MESSAGE_PROCESS_HOST_H_
7
8 #include <queue>
9 #include <string>
10
11 #include "base/memory/scoped_ptr.h"
12 #include "base/memory/weak_ptr.h"
13 #include "base/message_loop/message_loop.h"
14 #include "base/process/process.h"
15 #include "chrome/browser/extensions/api/messaging/native_process_launcher.h"
16 #include "ui/gfx/native_widget_types.h"
17
18 class PrefService;
19
20 namespace net {
21
22 class DrainableIOBuffer;
23 class FileStream;
24 class IOBuffer;
25 class IOBufferWithSize;
26
27 }  // namespace net
28
29 namespace extensions {
30
31 // Manages the native side of a connection between an extension and a native
32 // process.
33 //
34 // This class must only be created, called, and deleted on the IO thread.
35 // Public methods typically accept callbacks which will be invoked on the UI
36 // thread.
37 class NativeMessageProcessHost
38 #if defined(OS_POSIX)
39     : public base::MessageLoopForIO::Watcher
40 #endif  // !defined(OS_POSIX)
41 {
42  public:
43   // Interface for the object that receives messages from the native process.
44   class Client {
45    public:
46     virtual ~Client() {}
47     // Called on the UI thread.
48     virtual void PostMessageFromNativeProcess(int port_id,
49                                               const std::string& message) = 0;
50     virtual void CloseChannel(int port_id,
51                               const std::string& error_message) = 0;
52   };
53
54   // Result returned from IsHostAllowed().
55   enum PolicyPermission {
56     DISALLOW,           // The host is not allowed.
57     ALLOW_SYSTEM_ONLY,  // Allowed only when installed on system level.
58     ALLOW_ALL,          // Allowed when installed on system or user level.
59   };
60
61   virtual ~NativeMessageProcessHost();
62
63   // Returns policy permissions for the host with the specified name.
64   static PolicyPermission IsHostAllowed(const PrefService* pref_service,
65                                         const std::string& native_host_name);
66
67   static scoped_ptr<NativeMessageProcessHost> Create(
68       gfx::NativeView native_view,
69       base::WeakPtr<Client> weak_client_ui,
70       const std::string& source_extension_id,
71       const std::string& native_host_name,
72       int destination_port,
73       bool allow_user_level);
74
75   // Create using specified |launcher|. Used in tests.
76   static scoped_ptr<NativeMessageProcessHost> CreateWithLauncher(
77       base::WeakPtr<Client> weak_client_ui,
78       const std::string& source_extension_id,
79       const std::string& native_host_name,
80       int destination_port,
81       scoped_ptr<NativeProcessLauncher> launcher);
82
83   // Send a message with the specified payload.
84   void Send(const std::string& json);
85
86 #if defined(OS_POSIX)
87   // MessageLoopForIO::Watcher interface
88   virtual void OnFileCanReadWithoutBlocking(int fd) OVERRIDE;
89   virtual void OnFileCanWriteWithoutBlocking(int fd) OVERRIDE;
90 #endif  // !defined(OS_POSIX)
91
92   // Try and read a single message from |read_file_|. This should only be called
93   // in unittests when you know there is data in the file.
94   void ReadNowForTesting();
95
96  private:
97   NativeMessageProcessHost(base::WeakPtr<Client> weak_client_ui,
98                            const std::string& source_extension_id,
99                            const std::string& native_host_name,
100                            int destination_port,
101                            scoped_ptr<NativeProcessLauncher> launcher);
102
103   // Starts the host process.
104   void LaunchHostProcess();
105
106   // Callback for NativeProcessLauncher::Launch().
107   void OnHostProcessLaunched(NativeProcessLauncher::LaunchResult result,
108                              base::ProcessHandle process_handle,
109                              base::PlatformFile read_file,
110                              base::PlatformFile write_file);
111
112   // Helper methods to read incoming messages.
113   void WaitRead();
114   void DoRead();
115   void OnRead(int result);
116   void HandleReadResult(int result);
117   void ProcessIncomingData(const char* data, int data_size);
118
119   // Helper methods to write outgoing messages.
120   void DoWrite();
121   void HandleWriteResult(int result);
122   void OnWritten(int result);
123
124   // Closes the connection. Called from OnError() and destructor.
125   void Close(const std::string& error_message);
126
127   // The Client messages will be posted to. Should only be accessed from the
128   // UI thread.
129   base::WeakPtr<Client> weak_client_ui_;
130
131   // ID of the calling extension.
132   std::string source_extension_id_;
133
134   // Name of the native messaging host.
135   std::string native_host_name_;
136
137   // The id of the port on the other side of this connection. This is passed to
138   // |weak_client_ui_| when posting messages.
139   int destination_port_;
140
141   // Launcher used to launch the native process.
142   scoped_ptr<NativeProcessLauncher> launcher_;
143
144   // Set to true after the native messaging connection has been stopped, e.g.
145   // due to an error.
146   bool closed_;
147
148   base::ProcessHandle process_handle_;
149
150   // Input stream handle and reader.
151   base::PlatformFile read_file_;
152   scoped_ptr<net::FileStream> read_stream_;
153
154 #if defined(OS_POSIX)
155   base::MessageLoopForIO::FileDescriptorWatcher read_watcher_;
156 #endif  // !defined(OS_POSIX)
157
158   // Write stream.
159   scoped_ptr<net::FileStream> write_stream_;
160
161   // Read buffer passed to FileStream::Read().
162   scoped_refptr<net::IOBuffer> read_buffer_;
163
164   // Set to true when a read is pending.
165   bool read_pending_;
166
167   // Buffer for incomplete incoming messages.
168   std::string incoming_data_;
169
170   // Queue for outgoing messages.
171   std::queue<scoped_refptr<net::IOBufferWithSize> > write_queue_;
172
173   // The message that's currently being sent.
174   scoped_refptr<net::DrainableIOBuffer> current_write_buffer_;
175
176   // Set to true when a write is pending.
177   bool write_pending_;
178
179   DISALLOW_COPY_AND_ASSIGN(NativeMessageProcessHost);
180 };
181
182 }  // namespace extensions
183
184 #endif  // CHROME_BROWSER_EXTENSIONS_API_MESSAGING_NATIVE_MESSAGE_PROCESS_HOST_H_