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