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