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