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