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 18namespace ppapi { 19namespace thunk { 20 21namespace { 22 23void 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 30PP_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 49PP_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 56int32_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 76void RunMessageLoop(PP_Instance instance) { 77 // Deprecated. 78 NOTREACHED(); 79 return; 80} 81 82void QuitMessageLoop(PP_Instance instance) { 83 // Deprecated. 84 NOTREACHED(); 85 return; 86} 87 88double 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 95PP_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 101void 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 108PP_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 115int32_t InvokePrinting(PP_Instance instance) { 116 // This function is no longer supported, use PPB_Flash_Print instead. 117 return PP_ERROR_NOTSUPPORTED; 118} 119 120void 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 127PP_Var GetDeviceID(PP_Instance instance) { 128 // Deprecated. 129 NOTREACHED(); 130 return PP_MakeUndefined(); 131} 132 133int32_t GetSettingInt(PP_Instance instance, PP_FlashSetting setting) { 134 // Deprecated. 135 NOTREACHED(); 136 return -1; 137} 138 139PP_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 146PP_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 155int32_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 164const 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 182const 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 201const 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 221const 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 238const PPB_Flash_12_4* GetPPB_Flash_12_4_Thunk() { 239 return &g_ppb_flash_12_4_thunk; 240} 241 242const PPB_Flash_12_5* GetPPB_Flash_12_5_Thunk() { 243 return &g_ppb_flash_12_5_thunk; 244} 245 246const PPB_Flash_12_6* GetPPB_Flash_12_6_Thunk() { 247 return &g_ppb_flash_12_6_thunk; 248} 249 250const 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