resource_creation_proxy.cc revision 2385ea399aae016c0806a4f9ef3c9cfe3d2a39df
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#include "ppapi/proxy/resource_creation_proxy.h"
6
7#include "ppapi/c/pp_errors.h"
8#include "ppapi/c/pp_size.h"
9#include "ppapi/proxy/audio_input_resource.h"
10#include "ppapi/proxy/connection.h"
11#include "ppapi/proxy/ext_crx_file_system_private_resource.h"
12#include "ppapi/proxy/file_chooser_resource.h"
13#include "ppapi/proxy/file_io_resource.h"
14#include "ppapi/proxy/file_system_resource.h"
15#include "ppapi/proxy/flash_drm_resource.h"
16#include "ppapi/proxy/flash_font_file_resource.h"
17#include "ppapi/proxy/flash_menu_resource.h"
18#include "ppapi/proxy/graphics_2d_resource.h"
19#include "ppapi/proxy/host_resolver_private_resource.h"
20#include "ppapi/proxy/host_resolver_resource.h"
21#include "ppapi/proxy/net_address_resource.h"
22#include "ppapi/proxy/plugin_dispatcher.h"
23#include "ppapi/proxy/plugin_globals.h"
24#include "ppapi/proxy/plugin_resource_tracker.h"
25#include "ppapi/proxy/ppapi_messages.h"
26#include "ppapi/proxy/ppb_audio_proxy.h"
27#include "ppapi/proxy/ppb_broker_proxy.h"
28#include "ppapi/proxy/ppb_buffer_proxy.h"
29#include "ppapi/proxy/ppb_file_ref_proxy.h"
30#include "ppapi/proxy/ppb_flash_message_loop_proxy.h"
31#include "ppapi/proxy/ppb_graphics_3d_proxy.h"
32#include "ppapi/proxy/ppb_image_data_proxy.h"
33#include "ppapi/proxy/ppb_network_monitor_private_proxy.h"
34#include "ppapi/proxy/ppb_tcp_socket_private_proxy.h"
35#include "ppapi/proxy/ppb_tcp_socket_proxy.h"
36#include "ppapi/proxy/ppb_video_decoder_proxy.h"
37#include "ppapi/proxy/ppb_x509_certificate_private_proxy.h"
38#include "ppapi/proxy/printing_resource.h"
39#include "ppapi/proxy/talk_resource.h"
40#include "ppapi/proxy/tcp_server_socket_private_resource.h"
41#include "ppapi/proxy/truetype_font_resource.h"
42#include "ppapi/proxy/udp_socket_private_resource.h"
43#include "ppapi/proxy/udp_socket_resource.h"
44#include "ppapi/proxy/url_loader_resource.h"
45#include "ppapi/proxy/url_request_info_resource.h"
46#include "ppapi/proxy/url_response_info_resource.h"
47#include "ppapi/proxy/video_capture_resource.h"
48#include "ppapi/proxy/video_destination_resource.h"
49#include "ppapi/proxy/video_source_resource.h"
50#include "ppapi/proxy/websocket_resource.h"
51#include "ppapi/shared_impl/api_id.h"
52#include "ppapi/shared_impl/host_resource.h"
53#include "ppapi/shared_impl/ppb_audio_config_shared.h"
54#include "ppapi/shared_impl/ppb_input_event_shared.h"
55#include "ppapi/shared_impl/ppb_resource_array_shared.h"
56#include "ppapi/shared_impl/var.h"
57#include "ppapi/thunk/enter.h"
58#include "ppapi/thunk/ppb_image_data_api.h"
59
60using ppapi::thunk::ResourceCreationAPI;
61
62namespace ppapi {
63namespace proxy {
64
65ResourceCreationProxy::ResourceCreationProxy(Dispatcher* dispatcher)
66    : InterfaceProxy(dispatcher) {
67}
68
69ResourceCreationProxy::~ResourceCreationProxy() {
70}
71
72// static
73InterfaceProxy* ResourceCreationProxy::Create(Dispatcher* dispatcher) {
74  return new ResourceCreationProxy(dispatcher);
75}
76
77PP_Resource ResourceCreationProxy::CreateFileIO(PP_Instance instance) {
78  return (new FileIOResource(GetConnection(), instance))->GetReference();
79}
80
81PP_Resource ResourceCreationProxy::CreateFileRef(PP_Instance instance,
82                                                 PP_Resource file_system,
83                                                 const char* path) {
84  return PPB_FileRef_Proxy::CreateProxyResource(instance, file_system, path);
85}
86
87PP_Resource ResourceCreationProxy::CreateFileRef(
88    const PPB_FileRef_CreateInfo& create_info) {
89  return PPB_FileRef_Proxy::DeserializeFileRef(create_info);
90}
91
92PP_Resource ResourceCreationProxy::CreateFileSystem(
93    PP_Instance instance,
94    PP_FileSystemType type) {
95  return (new FileSystemResource(GetConnection(), instance,
96                                 type))->GetReference();
97}
98
99PP_Resource ResourceCreationProxy::CreateIsolatedFileSystem(
100    PP_Instance instance,
101    const char* fsid) {
102  FileSystemResource* fs = new FileSystemResource(
103      GetConnection(), instance, PP_FILESYSTEMTYPE_ISOLATED);
104  fs->InitIsolatedFileSystem(fsid);
105  return fs->GetReference();
106}
107
108PP_Resource ResourceCreationProxy::CreateIMEInputEvent(
109    PP_Instance instance,
110    PP_InputEvent_Type type,
111    PP_TimeTicks time_stamp,
112    struct PP_Var text,
113    uint32_t segment_number,
114    const uint32_t* segment_offsets,
115    int32_t target_segment,
116    uint32_t selection_start,
117    uint32_t selection_end) {
118  return PPB_InputEvent_Shared::CreateIMEInputEvent(
119      OBJECT_IS_PROXY, instance, type, time_stamp, text, segment_number,
120      segment_offsets, target_segment, selection_start, selection_end);
121}
122
123PP_Resource ResourceCreationProxy::CreateKeyboardInputEvent(
124    PP_Instance instance,
125    PP_InputEvent_Type type,
126    PP_TimeTicks time_stamp,
127    uint32_t modifiers,
128    uint32_t key_code,
129    struct PP_Var character_text) {
130  return PPB_InputEvent_Shared::CreateKeyboardInputEvent(
131      OBJECT_IS_PROXY, instance, type, time_stamp, modifiers, key_code,
132      character_text);
133}
134
135PP_Resource ResourceCreationProxy::CreateMouseInputEvent(
136    PP_Instance instance,
137    PP_InputEvent_Type type,
138    PP_TimeTicks time_stamp,
139    uint32_t modifiers,
140    PP_InputEvent_MouseButton mouse_button,
141    const PP_Point* mouse_position,
142    int32_t click_count,
143    const PP_Point* mouse_movement) {
144  return PPB_InputEvent_Shared::CreateMouseInputEvent(
145      OBJECT_IS_PROXY, instance, type, time_stamp, modifiers,
146      mouse_button, mouse_position, click_count, mouse_movement);
147}
148
149PP_Resource ResourceCreationProxy::CreateTouchInputEvent(
150    PP_Instance instance,
151    PP_InputEvent_Type type,
152    PP_TimeTicks time_stamp,
153    uint32_t modifiers) {
154  return PPB_InputEvent_Shared::CreateTouchInputEvent(
155      OBJECT_IS_PROXY, instance, type, time_stamp, modifiers);
156}
157
158PP_Resource ResourceCreationProxy::CreateResourceArray(
159    PP_Instance instance,
160    const PP_Resource elements[],
161    uint32_t size) {
162  PPB_ResourceArray_Shared* object = new PPB_ResourceArray_Shared(
163      OBJECT_IS_PROXY, instance, elements, size);
164  return object->GetReference();
165}
166
167PP_Resource ResourceCreationProxy::CreateTrueTypeFont(
168    PP_Instance instance,
169    const PP_TrueTypeFontDesc_Dev* desc) {
170  return (new TrueTypeFontResource(GetConnection(),
171                                   instance, *desc))->GetReference();
172
173}
174
175PP_Resource ResourceCreationProxy::CreateURLLoader(PP_Instance instance) {
176    return (new URLLoaderResource(GetConnection(), instance))->GetReference();
177}
178
179PP_Resource ResourceCreationProxy::CreateURLRequestInfo(
180    PP_Instance instance) {
181  return (new URLRequestInfoResource(
182      GetConnection(), instance, URLRequestInfoData()))->GetReference();
183}
184
185PP_Resource ResourceCreationProxy::CreateWheelInputEvent(
186    PP_Instance instance,
187    PP_TimeTicks time_stamp,
188    uint32_t modifiers,
189    const PP_FloatPoint* wheel_delta,
190    const PP_FloatPoint* wheel_ticks,
191    PP_Bool scroll_by_page) {
192  return PPB_InputEvent_Shared::CreateWheelInputEvent(
193      OBJECT_IS_PROXY, instance, time_stamp, modifiers,
194      wheel_delta, wheel_ticks, scroll_by_page);
195}
196
197PP_Resource ResourceCreationProxy::CreateAudio(
198    PP_Instance instance,
199    PP_Resource config_id,
200    PPB_Audio_Callback audio_callback,
201    void* user_data) {
202  return PPB_Audio_Proxy::CreateProxyResource(instance, config_id,
203                                              audio_callback, user_data);
204}
205
206PP_Resource ResourceCreationProxy::CreateAudioTrusted(PP_Instance instance) {
207  // Proxied plugins can't create trusted audio devices.
208  return 0;
209}
210
211PP_Resource ResourceCreationProxy::CreateAudioConfig(
212    PP_Instance instance,
213    PP_AudioSampleRate sample_rate,
214    uint32_t sample_frame_count) {
215  return PPB_AudioConfig_Shared::Create(
216      OBJECT_IS_PROXY, instance, sample_rate, sample_frame_count);
217}
218
219PP_Resource ResourceCreationProxy::CreateFileChooser(
220    PP_Instance instance,
221    PP_FileChooserMode_Dev mode,
222    const PP_Var& accept_types) {
223  scoped_refptr<StringVar> string_var = StringVar::FromPPVar(accept_types);
224  std::string str = string_var.get() ? string_var->value() : std::string();
225  return (new FileChooserResource(GetConnection(), instance, mode, str.c_str()))
226      ->GetReference();
227}
228
229PP_Resource ResourceCreationProxy::CreateGraphics2D(PP_Instance instance,
230                                                    const PP_Size* size,
231                                                    PP_Bool is_always_opaque) {
232  return (new Graphics2DResource(GetConnection(), instance, *size,
233                                 is_always_opaque))->GetReference();
234}
235
236PP_Resource ResourceCreationProxy::CreateGraphics3D(
237    PP_Instance instance,
238    PP_Resource share_context,
239    const int32_t* attrib_list) {
240  return PPB_Graphics3D_Proxy::CreateProxyResource(
241      instance, share_context, attrib_list);
242}
243
244PP_Resource ResourceCreationProxy::CreateGraphics3DRaw(
245    PP_Instance instance,
246    PP_Resource share_context,
247    const int32_t* attrib_list) {
248  // Not proxied. The raw creation function is used only in the implementation
249  // of the proxy on the host side.
250  return 0;
251}
252
253PP_Resource ResourceCreationProxy::CreateHostResolver(PP_Instance instance) {
254  return (new HostResolverResource(GetConnection(), instance))->GetReference();
255}
256
257PP_Resource ResourceCreationProxy::CreateHostResolverPrivate(
258    PP_Instance instance) {
259  return (new HostResolverPrivateResource(
260      GetConnection(), instance))->GetReference();
261}
262
263PP_Resource ResourceCreationProxy::CreateImageData(
264    PP_Instance instance,
265    PP_ImageDataFormat format,
266    const PP_Size* size,
267    PP_Bool init_to_zero) {
268  // On the plugin side, we create PlatformImageData resources for trusted
269  // plugins and SimpleImageData resources for untrusted ones.
270  PPB_ImageData_Shared::ImageDataType type =
271#if !defined(OS_NACL)
272      PPB_ImageData_Shared::PLATFORM;
273#else
274      PPB_ImageData_Shared::SIMPLE;
275#endif
276  return PPB_ImageData_Proxy::CreateProxyResource(
277      instance, type,
278      format, *size, init_to_zero);
279}
280
281PP_Resource ResourceCreationProxy::CreateImageDataSimple(
282    PP_Instance instance,
283    PP_ImageDataFormat format,
284    const PP_Size* size,
285    PP_Bool init_to_zero) {
286  return PPB_ImageData_Proxy::CreateProxyResource(
287      instance,
288      PPB_ImageData_Shared::SIMPLE,
289      format, *size, init_to_zero);
290}
291
292PP_Resource ResourceCreationProxy::CreateNetAddressFromIPv4Address(
293    PP_Instance instance,
294    const PP_NetAddress_IPv4* ipv4_addr) {
295  return (new NetAddressResource(GetConnection(), instance,
296                                 *ipv4_addr))->GetReference();
297}
298
299PP_Resource ResourceCreationProxy::CreateNetAddressFromIPv6Address(
300    PP_Instance instance,
301    const PP_NetAddress_IPv6* ipv6_addr) {
302  return (new NetAddressResource(GetConnection(), instance,
303                                 *ipv6_addr))->GetReference();
304}
305
306PP_Resource ResourceCreationProxy::CreateNetAddressFromNetAddressPrivate(
307    PP_Instance instance,
308    const PP_NetAddress_Private& private_addr) {
309  return (new NetAddressResource(GetConnection(), instance,
310                                 private_addr))->GetReference();
311}
312
313PP_Resource ResourceCreationProxy::CreateNetworkMonitor(
314    PP_Instance instance,
315    PPB_NetworkMonitor_Callback callback,
316    void* user_data) {
317  return PPB_NetworkMonitor_Private_Proxy::CreateProxyResource(
318      instance, callback, user_data);
319}
320
321PP_Resource ResourceCreationProxy::CreatePrinting(PP_Instance instance) {
322  return (new PrintingResource(GetConnection(), instance))->GetReference();
323}
324
325PP_Resource ResourceCreationProxy::CreateTCPServerSocketPrivate(
326    PP_Instance instance) {
327  return (new TCPServerSocketPrivateResource(GetConnection(), instance))->
328      GetReference();
329}
330
331PP_Resource ResourceCreationProxy::CreateTCPSocket(
332    PP_Instance instance) {
333  return PPB_TCPSocket_Proxy::CreateProxyResource(instance);
334}
335
336PP_Resource ResourceCreationProxy::CreateTCPSocketPrivate(
337    PP_Instance instance) {
338  return PPB_TCPSocket_Private_Proxy::CreateProxyResource(instance);
339}
340
341PP_Resource ResourceCreationProxy::CreateUDPSocket(PP_Instance instance) {
342  return (new UDPSocketResource(GetConnection(), instance))->GetReference();
343}
344
345PP_Resource ResourceCreationProxy::CreateUDPSocketPrivate(
346    PP_Instance instance) {
347  return (new UDPSocketPrivateResource(
348      GetConnection(), instance))->GetReference();
349}
350
351PP_Resource ResourceCreationProxy::CreateVideoDestination(
352    PP_Instance instance) {
353  return (new VideoDestinationResource(GetConnection(),
354                                       instance))->GetReference();
355}
356
357PP_Resource ResourceCreationProxy::CreateVideoSource(
358    PP_Instance instance) {
359  return (new VideoSourceResource(GetConnection(), instance))->GetReference();
360}
361
362PP_Resource ResourceCreationProxy::CreateWebSocket(PP_Instance instance) {
363  return (new WebSocketResource(GetConnection(), instance))->GetReference();
364}
365
366PP_Resource ResourceCreationProxy::CreateX509CertificatePrivate(
367    PP_Instance instance) {
368  return PPB_X509Certificate_Private_Proxy::CreateProxyResource(instance);
369}
370
371#if !defined(OS_NACL)
372PP_Resource ResourceCreationProxy::CreateAudioInput(
373    PP_Instance instance) {
374  return (new AudioInputResource(GetConnection(), instance))->GetReference();
375}
376
377PP_Resource ResourceCreationProxy::CreateBroker(PP_Instance instance) {
378  return PPB_Broker_Proxy::CreateProxyResource(instance);
379}
380
381PP_Resource ResourceCreationProxy::CreateBrowserFont(
382    PP_Instance instance,
383    const PP_BrowserFont_Trusted_Description* description) {
384  PluginDispatcher* dispatcher = PluginDispatcher::GetForInstance(instance);
385  if (!dispatcher)
386    return 0;
387  return PluginGlobals::Get()->CreateBrowserFont(
388      GetConnection(), instance, *description, dispatcher->preferences());
389}
390
391PP_Resource ResourceCreationProxy::CreateBuffer(PP_Instance instance,
392                                                uint32_t size) {
393  return PPB_Buffer_Proxy::CreateProxyResource(instance, size);
394}
395
396PP_Resource ResourceCreationProxy::CreateFlashDRM(PP_Instance instance) {
397  return (new FlashDRMResource(GetConnection(), instance))->GetReference();
398}
399
400PP_Resource ResourceCreationProxy::CreateFlashFontFile(
401    PP_Instance instance,
402    const PP_BrowserFont_Trusted_Description* description,
403    PP_PrivateFontCharset charset) {
404  return (new FlashFontFileResource(
405      GetConnection(), instance, description, charset))->GetReference();
406}
407
408PP_Resource ResourceCreationProxy::CreateFlashMenu(
409    PP_Instance instance,
410    const PP_Flash_Menu* menu_data) {
411  scoped_refptr<FlashMenuResource> flash_menu(
412      new FlashMenuResource(GetConnection(), instance));
413  if (!flash_menu->Initialize(menu_data))
414    return 0;
415  return flash_menu->GetReference();
416}
417
418PP_Resource ResourceCreationProxy::CreateFlashMessageLoop(
419    PP_Instance instance) {
420  return PPB_Flash_MessageLoop_Proxy::CreateProxyResource(instance);
421}
422
423PP_Resource ResourceCreationProxy::CreateScrollbar(PP_Instance instance,
424                                                   PP_Bool vertical) {
425  NOTIMPLEMENTED();  // Not proxied yet.
426  return 0;
427}
428
429PP_Resource ResourceCreationProxy::CreateTalk(PP_Instance instance) {
430  return (new TalkResource(GetConnection(), instance))->GetReference();
431}
432
433PP_Resource ResourceCreationProxy::CreateVideoCapture(PP_Instance instance) {
434  PluginDispatcher* dispatcher = PluginDispatcher::GetForInstance(instance);
435  if (!dispatcher)
436    return 0;
437  return (new VideoCaptureResource(GetConnection(), instance, dispatcher))
438      ->GetReference();
439}
440
441PP_Resource ResourceCreationProxy::CreateVideoDecoder(
442    PP_Instance instance,
443    PP_Resource context3d_id,
444    PP_VideoDecoder_Profile profile) {
445  return PPB_VideoDecoder_Proxy::CreateProxyResource(
446      instance, context3d_id, profile);
447}
448
449#endif  // !defined(OS_NACL)
450
451bool ResourceCreationProxy::Send(IPC::Message* msg) {
452  return dispatcher()->Send(msg);
453}
454
455bool ResourceCreationProxy::OnMessageReceived(const IPC::Message& msg) {
456  return false;
457}
458
459Connection ResourceCreationProxy::GetConnection() {
460  return Connection(PluginGlobals::Get()->GetBrowserSender(), dispatcher());
461}
462
463}  // namespace proxy
464}  // namespace ppapi
465