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 "base/logging.h" 6 #include "ppapi/c/pp_array_output.h" 7 #include "ppapi/c/pp_errors.h" 8 #include "ppapi/c/private/ppb_flash.h" 9 #include "ppapi/shared_impl/ppapi_globals.h" 10 #include "ppapi/shared_impl/proxy_lock.h" 11 #include "ppapi/shared_impl/var.h" 12 #include "ppapi/thunk/enter.h" 13 #include "ppapi/thunk/ppb_flash_functions_api.h" 14 #include "ppapi/thunk/ppb_instance_api.h" 15 #include "ppapi/thunk/ppb_video_capture_api.h" 16 #include "ppapi/thunk/thunk.h" 17 18 namespace ppapi { 19 namespace thunk { 20 21 namespace { 22 23 void SetInstanceAlwaysOnTop(PP_Instance instance, PP_Bool on_top) { 24 EnterInstanceAPI<PPB_Flash_Functions_API> enter(instance); 25 if (enter.failed()) 26 return; 27 enter.functions()->SetInstanceAlwaysOnTop(instance, on_top); 28 } 29 30 PP_Bool DrawGlyphs(PP_Instance instance, 31 PP_Resource pp_image_data, 32 const PP_BrowserFont_Trusted_Description* font_desc, 33 uint32_t color, 34 const PP_Point* position, 35 const PP_Rect* clip, 36 const float transformation[3][3], 37 PP_Bool allow_subpixel_aa, 38 uint32_t glyph_count, 39 const uint16_t glyph_indices[], 40 const PP_Point glyph_advances[]) { 41 EnterInstanceAPI<PPB_Flash_Functions_API> enter(instance); 42 if (enter.failed()) 43 return PP_FALSE; 44 return enter.functions()->DrawGlyphs( 45 instance, pp_image_data, font_desc, color, position, clip, transformation, 46 allow_subpixel_aa, glyph_count, glyph_indices, glyph_advances); 47 } 48 49 PP_Var GetProxyForURL(PP_Instance instance, const char* url) { 50 EnterInstanceAPI<PPB_Flash_Functions_API> enter(instance); 51 if (enter.failed()) 52 return PP_MakeUndefined(); 53 return enter.functions()->GetProxyForURL(instance, url); 54 } 55 56 int32_t Navigate(PP_Resource request_id, 57 const char* target, 58 PP_Bool from_user_action) { 59 // TODO(brettw): this function should take an instance. 60 // To work around this, use the PP_Instance from the resource. 61 PP_Instance instance; 62 { 63 EnterResource<PPB_URLRequestInfo_API> enter(request_id, true); 64 if (enter.failed()) 65 return PP_ERROR_BADRESOURCE; 66 instance = enter.resource()->pp_instance(); 67 } 68 69 EnterInstanceAPI<PPB_Flash_Functions_API> enter(instance); 70 if (enter.failed()) 71 return PP_ERROR_BADARGUMENT; 72 return enter.functions()->Navigate(instance, request_id, target, 73 from_user_action); 74 } 75 76 void RunMessageLoop(PP_Instance instance) { 77 // Deprecated. 78 NOTREACHED(); 79 return; 80 } 81 82 void QuitMessageLoop(PP_Instance instance) { 83 // Deprecated. 84 NOTREACHED(); 85 return; 86 } 87 88 double GetLocalTimeZoneOffset(PP_Instance instance, PP_Time t) { 89 EnterInstanceAPI<PPB_Flash_Functions_API> enter(instance); 90 if (enter.failed()) 91 return 0.0; 92 return enter.functions()->GetLocalTimeZoneOffset(instance, t); 93 } 94 95 PP_Var GetCommandLineArgs(PP_Module /* pp_module */) { 96 // There's no instance so we have to reach into the globals without thunking. 97 ProxyAutoLock lock; 98 return StringVar::StringToPPVar(PpapiGlobals::Get()->GetCmdLine()); 99 } 100 101 void PreLoadFontWin(const void* logfontw) { 102 // There's no instance so we have to reach into the delegate without 103 // thunking. 104 ProxyAutoLock lock; 105 PpapiGlobals::Get()->PreCacheFontForFlash(logfontw); 106 } 107 108 PP_Bool IsRectTopmost(PP_Instance instance, const PP_Rect* rect) { 109 EnterInstanceAPI<PPB_Flash_Functions_API> enter(instance); 110 if (enter.failed()) 111 return PP_FALSE; 112 return enter.functions()->IsRectTopmost(instance, rect); 113 } 114 115 int32_t InvokePrinting(PP_Instance instance) { 116 // This function is no longer supported, use PPB_Flash_Print instead. 117 return PP_ERROR_NOTSUPPORTED; 118 } 119 120 void UpdateActivity(PP_Instance instance) { 121 EnterInstanceAPI<PPB_Flash_Functions_API> enter(instance); 122 if (enter.failed()) 123 return; 124 enter.functions()->UpdateActivity(instance); 125 } 126 127 PP_Var GetDeviceID(PP_Instance instance) { 128 // Deprecated. 129 NOTREACHED(); 130 return PP_MakeUndefined(); 131 } 132 133 int32_t GetSettingInt(PP_Instance instance, PP_FlashSetting setting) { 134 // Deprecated. 135 NOTREACHED(); 136 return -1; 137 } 138 139 PP_Var GetSetting(PP_Instance instance, PP_FlashSetting setting) { 140 EnterInstanceAPI<PPB_Flash_Functions_API> enter(instance); 141 if (enter.failed()) 142 return PP_MakeUndefined(); 143 return enter.functions()->GetSetting(instance, setting); 144 } 145 146 PP_Bool SetCrashData(PP_Instance instance, 147 PP_FlashCrashKey key, 148 PP_Var value) { 149 EnterInstanceAPI<PPB_Flash_Functions_API> enter(instance); 150 if (enter.failed()) 151 return PP_FALSE; 152 return enter.functions()->SetCrashData(instance, key, value); 153 } 154 155 int32_t EnumerateVideoCaptureDevices(PP_Instance instance, 156 PP_Resource video_capture, 157 PP_ArrayOutput devices) { 158 EnterResource<PPB_VideoCapture_API> enter(video_capture, true); 159 if (enter.failed()) 160 return enter.retval(); 161 return enter.object()->EnumerateDevicesSync(devices); 162 } 163 164 const PPB_Flash_12_4 g_ppb_flash_12_4_thunk = { 165 &SetInstanceAlwaysOnTop, 166 &DrawGlyphs, 167 &GetProxyForURL, 168 &Navigate, 169 &RunMessageLoop, 170 &QuitMessageLoop, 171 &GetLocalTimeZoneOffset, 172 &GetCommandLineArgs, 173 &PreLoadFontWin, 174 &IsRectTopmost, 175 &InvokePrinting, 176 &UpdateActivity, 177 &GetDeviceID, 178 &GetSettingInt, 179 &GetSetting 180 }; 181 182 const PPB_Flash_12_5 g_ppb_flash_12_5_thunk = { 183 &SetInstanceAlwaysOnTop, 184 &DrawGlyphs, 185 &GetProxyForURL, 186 &Navigate, 187 &RunMessageLoop, 188 &QuitMessageLoop, 189 &GetLocalTimeZoneOffset, 190 &GetCommandLineArgs, 191 &PreLoadFontWin, 192 &IsRectTopmost, 193 &InvokePrinting, 194 &UpdateActivity, 195 &GetDeviceID, 196 &GetSettingInt, 197 &GetSetting, 198 &SetCrashData 199 }; 200 201 const PPB_Flash_12_6 g_ppb_flash_12_6_thunk = { 202 &SetInstanceAlwaysOnTop, 203 &DrawGlyphs, 204 &GetProxyForURL, 205 &Navigate, 206 &RunMessageLoop, 207 &QuitMessageLoop, 208 &GetLocalTimeZoneOffset, 209 &GetCommandLineArgs, 210 &PreLoadFontWin, 211 &IsRectTopmost, 212 &InvokePrinting, 213 &UpdateActivity, 214 &GetDeviceID, 215 &GetSettingInt, 216 &GetSetting, 217 &SetCrashData, 218 &EnumerateVideoCaptureDevices 219 }; 220 221 const PPB_Flash_13_0 g_ppb_flash_13_0_thunk = { 222 &SetInstanceAlwaysOnTop, 223 &DrawGlyphs, 224 &GetProxyForURL, 225 &Navigate, 226 &GetLocalTimeZoneOffset, 227 &GetCommandLineArgs, 228 &PreLoadFontWin, 229 &IsRectTopmost, 230 &UpdateActivity, 231 &GetSetting, 232 &SetCrashData, 233 &EnumerateVideoCaptureDevices 234 }; 235 236 } // namespace 237 238 const PPB_Flash_12_4* GetPPB_Flash_12_4_Thunk() { 239 return &g_ppb_flash_12_4_thunk; 240 } 241 242 const PPB_Flash_12_5* GetPPB_Flash_12_5_Thunk() { 243 return &g_ppb_flash_12_5_thunk; 244 } 245 246 const PPB_Flash_12_6* GetPPB_Flash_12_6_Thunk() { 247 return &g_ppb_flash_12_6_thunk; 248 } 249 250 const PPB_Flash_13_0* GetPPB_Flash_13_0_Thunk() { 251 return &g_ppb_flash_13_0_thunk; 252 } 253 254 } // namespace thunk 255 } // namespace ppapi 256