blob: 98548485a9f4a2dff925371d7ea983250b330746 [file] [log] [blame]
Grace Klobafbe47c02009-05-14 17:31:45 -07001/*
2 * Copyright 2008, The Android Open Source Project
3 *
4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions
6 * are met:
7 * * Redistributions of source code must retain the above copyright
8 * notice, this list of conditions and the following disclaimer.
9 * * Redistributions in binary form must reproduce the above copyright
10 * notice, this list of conditions and the following disclaimer in the
11 * documentation and/or other materials provided with the distribution.
12 *
13 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY
14 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
15 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE COMPUTER, INC. OR
17 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
18 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
19 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
20 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
21 * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
22 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
23 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
24 */
25
26#include <stdlib.h>
27#include <string.h>
28#include <stdio.h>
29#include "main.h"
30#include "PluginObject.h"
Derek Sollenbergerd7ebf272009-06-18 11:19:41 -040031#include "AnimationPlugin.h"
Derek Sollenbergerf42e2f42009-06-26 11:42:46 -040032#include "AudioPlugin.h"
Derek Sollenbergerd7ebf272009-06-18 11:19:41 -040033#include "BackgroundPlugin.h"
Derek Sollenbergerdb398a72009-06-29 13:53:04 -040034#include "FormPlugin.h"
Derek Sollenberger1bc5ab62010-01-14 11:44:37 -050035#include "NavigationPlugin.h"
Derek Sollenberger4fb83e62009-07-27 16:40:13 -040036#include "PaintPlugin.h"
Derek Sollenbergerb8947ee2009-10-05 14:40:18 -040037#include "VideoPlugin.h"
Grace Klobafbe47c02009-05-14 17:31:45 -070038
39NPNetscapeFuncs* browser;
Derek Sollenbergerb8947ee2009-10-05 14:40:18 -040040JavaVM* gVM;
41
Grace Klobafbe47c02009-05-14 17:31:45 -070042#define EXPORT __attribute__((visibility("default")))
43
Ben Murdoch3b6f45d2010-05-12 14:09:26 +010044NPError NPP_New(NPMIMEType pluginType, NPP instance, uint16_t mode, int16_t argc,
Grace Klobafbe47c02009-05-14 17:31:45 -070045 char* argn[], char* argv[], NPSavedData* saved);
46NPError NPP_Destroy(NPP instance, NPSavedData** save);
47NPError NPP_SetWindow(NPP instance, NPWindow* window);
Derek Sollenberger9119e7d2009-06-08 10:53:09 -040048NPError NPP_NewStream(NPP instance, NPMIMEType type, NPStream* stream,
Ben Murdoch3b6f45d2010-05-12 14:09:26 +010049 NPBool seekable, uint16_t* stype);
Grace Klobafbe47c02009-05-14 17:31:45 -070050NPError NPP_DestroyStream(NPP instance, NPStream* stream, NPReason reason);
Ben Murdoch3b6f45d2010-05-12 14:09:26 +010051int32_t NPP_WriteReady(NPP instance, NPStream* stream);
52int32_t NPP_Write(NPP instance, NPStream* stream, int32_t offset, int32_t len,
Grace Klobafbe47c02009-05-14 17:31:45 -070053 void* buffer);
54void NPP_StreamAsFile(NPP instance, NPStream* stream, const char* fname);
55void NPP_Print(NPP instance, NPPrint* platformPrint);
Ben Murdoch3b6f45d2010-05-12 14:09:26 +010056int16_t NPP_HandleEvent(NPP instance, void* event);
Derek Sollenberger9119e7d2009-06-08 10:53:09 -040057void NPP_URLNotify(NPP instance, const char* URL, NPReason reason,
Grace Klobafbe47c02009-05-14 17:31:45 -070058 void* notifyData);
59NPError NPP_GetValue(NPP instance, NPPVariable variable, void *value);
60NPError NPP_SetValue(NPP instance, NPNVariable variable, void *value);
61
62extern "C" {
Derek Sollenberger4fe6d382010-01-21 15:04:58 -050063EXPORT NPError NP_Initialize(NPNetscapeFuncs* browserFuncs, NPPluginFuncs* pluginFuncs, void *java_env);
Grace Klobafbe47c02009-05-14 17:31:45 -070064EXPORT NPError NP_GetValue(NPP instance, NPPVariable variable, void *value);
65EXPORT const char* NP_GetMIMEDescription(void);
Derek Sollenberger9119e7d2009-06-08 10:53:09 -040066EXPORT void NP_Shutdown(void);
Grace Klobafbe47c02009-05-14 17:31:45 -070067};
68
69ANPAudioTrackInterfaceV0 gSoundI;
Mike Reed224adad2009-06-10 10:24:01 -040070ANPBitmapInterfaceV0 gBitmapI;
Grace Klobafbe47c02009-05-14 17:31:45 -070071ANPCanvasInterfaceV0 gCanvasI;
Derek Sollenbergerd53b56d2010-01-11 12:31:49 -050072ANPEventInterfaceV0 gEventI;
Grace Klobafbe47c02009-05-14 17:31:45 -070073ANPLogInterfaceV0 gLogI;
74ANPPaintInterfaceV0 gPaintI;
75ANPPathInterfaceV0 gPathI;
Derek Sollenbergerc0f26572009-07-16 11:38:02 -040076ANPSurfaceInterfaceV0 gSurfaceI;
Grace Kloba9ffe5ac2009-08-04 17:51:06 -070077ANPSystemInterfaceV0 gSystemI;
Grace Klobafbe47c02009-05-14 17:31:45 -070078ANPTypefaceInterfaceV0 gTypefaceI;
Derek Sollenberger1e64f022011-01-07 14:11:29 -050079ANPWindowInterfaceV1 gWindowI;
Derek Sollenberger349bc372011-01-04 16:14:34 -050080ANPOpenGLInterfaceV0 gOpenGLI;
Grace Klobafbe47c02009-05-14 17:31:45 -070081
82#define ARRAY_COUNT(array) (sizeof(array) / sizeof(array[0]))
Derek Sollenberger5b011e32009-06-22 11:39:40 -040083#define DEBUG_PLUGIN_EVENTS 0
Grace Klobafbe47c02009-05-14 17:31:45 -070084
Derek Sollenberger4fe6d382010-01-21 15:04:58 -050085NPError NP_Initialize(NPNetscapeFuncs* browserFuncs, NPPluginFuncs* pluginFuncs, void *java_env)
Grace Klobafbe47c02009-05-14 17:31:45 -070086{
87 // Make sure we have a function table equal or larger than we are built against.
88 if (browserFuncs->size < sizeof(NPNetscapeFuncs)) {
89 return NPERR_GENERIC_ERROR;
90 }
Derek Sollenberger9119e7d2009-06-08 10:53:09 -040091
Grace Klobafbe47c02009-05-14 17:31:45 -070092 // Copy the function table (structure)
93 browser = (NPNetscapeFuncs*) malloc(sizeof(NPNetscapeFuncs));
94 memcpy(browser, browserFuncs, sizeof(NPNetscapeFuncs));
Derek Sollenberger9119e7d2009-06-08 10:53:09 -040095
Grace Klobafbe47c02009-05-14 17:31:45 -070096 // Build the plugin function table
97 pluginFuncs->version = 11;
98 pluginFuncs->size = sizeof(pluginFuncs);
99 pluginFuncs->newp = NPP_New;
100 pluginFuncs->destroy = NPP_Destroy;
101 pluginFuncs->setwindow = NPP_SetWindow;
102 pluginFuncs->newstream = NPP_NewStream;
103 pluginFuncs->destroystream = NPP_DestroyStream;
104 pluginFuncs->asfile = NPP_StreamAsFile;
105 pluginFuncs->writeready = NPP_WriteReady;
106 pluginFuncs->write = (NPP_WriteProcPtr)NPP_Write;
107 pluginFuncs->print = NPP_Print;
108 pluginFuncs->event = NPP_HandleEvent;
109 pluginFuncs->urlnotify = NPP_URLNotify;
110 pluginFuncs->getvalue = NPP_GetValue;
111 pluginFuncs->setvalue = NPP_SetValue;
112
113 static const struct {
114 NPNVariable v;
115 uint32_t size;
116 ANPInterface* i;
117 } gPairs[] = {
Derek Sollenbergerc0f26572009-07-16 11:38:02 -0400118 { kAudioTrackInterfaceV0_ANPGetValue, sizeof(gSoundI), &gSoundI },
Mike Reed224adad2009-06-10 10:24:01 -0400119 { kBitmapInterfaceV0_ANPGetValue, sizeof(gBitmapI), &gBitmapI },
Grace Klobafbe47c02009-05-14 17:31:45 -0700120 { kCanvasInterfaceV0_ANPGetValue, sizeof(gCanvasI), &gCanvasI },
Derek Sollenbergerd53b56d2010-01-11 12:31:49 -0500121 { kEventInterfaceV0_ANPGetValue, sizeof(gEventI), &gEventI },
Mike Reed224adad2009-06-10 10:24:01 -0400122 { kLogInterfaceV0_ANPGetValue, sizeof(gLogI), &gLogI },
Grace Klobafbe47c02009-05-14 17:31:45 -0700123 { kPaintInterfaceV0_ANPGetValue, sizeof(gPaintI), &gPaintI },
124 { kPathInterfaceV0_ANPGetValue, sizeof(gPathI), &gPathI },
Derek Sollenbergerc0f26572009-07-16 11:38:02 -0400125 { kSurfaceInterfaceV0_ANPGetValue, sizeof(gSurfaceI), &gSurfaceI },
Grace Kloba9ffe5ac2009-08-04 17:51:06 -0700126 { kSystemInterfaceV0_ANPGetValue, sizeof(gSystemI), &gSystemI },
127 { kTypefaceInterfaceV0_ANPGetValue, sizeof(gTypefaceI), &gTypefaceI },
Derek Sollenberger1e64f022011-01-07 14:11:29 -0500128 { kWindowInterfaceV1_ANPGetValue, sizeof(gWindowI), &gWindowI },
Derek Sollenberger349bc372011-01-04 16:14:34 -0500129 { kOpenGLInterfaceV0_ANPGetValue, sizeof(gOpenGLI), &gOpenGLI },
Grace Klobafbe47c02009-05-14 17:31:45 -0700130 };
131 for (size_t i = 0; i < ARRAY_COUNT(gPairs); i++) {
132 gPairs[i].i->inSize = gPairs[i].size;
133 NPError err = browser->getvalue(NULL, gPairs[i].v, gPairs[i].i);
134 if (err) {
135 return err;
136 }
137 }
Derek Sollenberger9119e7d2009-06-08 10:53:09 -0400138
Derek Sollenbergerb8947ee2009-10-05 14:40:18 -0400139 // store the JavaVM for the plugin
140 JNIEnv* env = (JNIEnv*)java_env;
141 env->GetJavaVM(&gVM);
142
Grace Klobafbe47c02009-05-14 17:31:45 -0700143 return NPERR_NO_ERROR;
144}
145
146void NP_Shutdown(void)
147{
148
149}
150
Derek Sollenberger9119e7d2009-06-08 10:53:09 -0400151const char *NP_GetMIMEDescription(void)
Grace Klobafbe47c02009-05-14 17:31:45 -0700152{
Derek Sollenbergerd7ebf272009-06-18 11:19:41 -0400153 return "application/x-testbrowserplugin:tst:Test plugin mimetype is application/x-testbrowserplugin";
Grace Klobafbe47c02009-05-14 17:31:45 -0700154}
155
Ben Murdoch3b6f45d2010-05-12 14:09:26 +0100156NPError NPP_New(NPMIMEType pluginType, NPP instance, uint16_t mode, int16_t argc,
Grace Klobafbe47c02009-05-14 17:31:45 -0700157 char* argn[], char* argv[], NPSavedData* saved)
158{
Derek Sollenbergerd7ebf272009-06-18 11:19:41 -0400159
160 /* BEGIN: STANDARD PLUGIN FRAMEWORK */
Grace Klobafbe47c02009-05-14 17:31:45 -0700161 PluginObject *obj = NULL;
162
163 // Scripting functions appeared in NPAPI version 14
164 if (browser->version >= 14) {
Derek Sollenbergerb4a23912009-11-09 15:38:58 -0500165 instance->pdata = browser->createobject (instance, getPluginClass());
166 obj = static_cast<PluginObject*>(instance->pdata);
Derek Sollenberger349bc372011-01-04 16:14:34 -0500167 obj->pluginType = 0;
Grace Klobafbe47c02009-05-14 17:31:45 -0700168 }
Derek Sollenbergerd7ebf272009-06-18 11:19:41 -0400169 /* END: STANDARD PLUGIN FRAMEWORK */
Derek Sollenberger9119e7d2009-06-08 10:53:09 -0400170
Derek Sollenberger4fb83e62009-07-27 16:40:13 -0400171 // select the drawing model based on user input
172 ANPDrawingModel model = kBitmap_ANPDrawingModel;
173
174 for (int i = 0; i < argc; i++) {
175 if (!strcmp(argn[i], "DrawingModel")) {
176 if (!strcmp(argv[i], "Bitmap")) {
177 model = kBitmap_ANPDrawingModel;
178 }
179 else if (!strcmp(argv[i], "Surface")) {
180 model = kSurface_ANPDrawingModel;
181 }
Derek Sollenberger349bc372011-01-04 16:14:34 -0500182 else if (!strcmp(argv[i], "OpenGL")) {
183 model = kOpenGL_ANPDrawingModel;
184 }
Derek Sollenbergere62ce172009-11-30 11:52:06 -0500185 gLogI.log(kDebug_ANPLogType, "------ %p DrawingModel is %d", instance, model);
Derek Sollenberger4fb83e62009-07-27 16:40:13 -0400186 break;
187 }
188 }
189
190 // notify the plugin API of the drawing model we wish to use. This must be
191 // done prior to creating certain subPlugin objects (e.g. surfaceViews)
192 NPError err = browser->setvalue(instance, kRequestDrawingModel_ANPSetValue,
193 reinterpret_cast<void*>(model));
194 if (err) {
Derek Sollenbergere62ce172009-11-30 11:52:06 -0500195 gLogI.log(kError_ANPLogType, "request model %d err %d", model, err);
Derek Sollenberger4fb83e62009-07-27 16:40:13 -0400196 return err;
197 }
198
Grace Kloba9ffe5ac2009-08-04 17:51:06 -0700199 const char* path = gSystemI.getApplicationDataDirectory();
200 if (path) {
Derek Sollenbergere62ce172009-11-30 11:52:06 -0500201 gLogI.log(kDebug_ANPLogType, "Application data dir is %s", path);
Grace Kloba9ffe5ac2009-08-04 17:51:06 -0700202 } else {
Derek Sollenbergere62ce172009-11-30 11:52:06 -0500203 gLogI.log(kError_ANPLogType, "Can't find Application data dir");
Grace Kloba9ffe5ac2009-08-04 17:51:06 -0700204 }
205
Derek Sollenbergerd7ebf272009-06-18 11:19:41 -0400206 // select the pluginType
207 for (int i = 0; i < argc; i++) {
208 if (!strcmp(argn[i], "PluginType")) {
209 if (!strcmp(argv[i], "Animation")) {
210 obj->pluginType = kAnimation_PluginType;
211 obj->activePlugin = new BallAnimation(instance);
212 }
213 else if (!strcmp(argv[i], "Audio")) {
214 obj->pluginType = kAudio_PluginType;
Derek Sollenbergerf42e2f42009-06-26 11:42:46 -0400215 obj->activePlugin = new AudioPlugin(instance);
Derek Sollenbergerd7ebf272009-06-18 11:19:41 -0400216 }
217 else if (!strcmp(argv[i], "Background")) {
218 obj->pluginType = kBackground_PluginType;
219 obj->activePlugin = new BackgroundPlugin(instance);
220 }
Derek Sollenbergerdb398a72009-06-29 13:53:04 -0400221 else if (!strcmp(argv[i], "Form")) {
222 obj->pluginType = kForm_PluginType;
223 obj->activePlugin = new FormPlugin(instance);
224 }
Derek Sollenberger1bc5ab62010-01-14 11:44:37 -0500225 else if (!strcmp(argv[i], "Navigation")) {
226 obj->pluginType = kNavigation_PluginType;
227 obj->activePlugin = new NavigationPlugin(instance);
228 }
Derek Sollenberger4fb83e62009-07-27 16:40:13 -0400229 else if (!strcmp(argv[i], "Paint")) {
230 obj->pluginType = kPaint_PluginType;
231 obj->activePlugin = new PaintPlugin(instance);
232 }
Derek Sollenbergerb8947ee2009-10-05 14:40:18 -0400233 else if (!strcmp(argv[i], "Video")) {
234 obj->pluginType = kVideo_PluginType;
235 obj->activePlugin = new VideoPlugin(instance);
236 }
Derek Sollenbergerd7ebf272009-06-18 11:19:41 -0400237 break;
238 }
239 }
240
241 // if no pluginType is specified then default to Animation
242 if (!obj->pluginType) {
Derek Sollenbergere62ce172009-11-30 11:52:06 -0500243 gLogI.log(kError_ANPLogType, "------ %p No PluginType attribute was found", instance);
Derek Sollenbergerd7ebf272009-06-18 11:19:41 -0400244 obj->pluginType = kAnimation_PluginType;
245 obj->activePlugin = new BallAnimation(instance);
246 }
247
Derek Sollenberger349bc372011-01-04 16:14:34 -0500248 gLogI.log(kDebug_ANPLogType, "------ %p PluginType is %d", instance, obj->pluginType);
249
Derek Sollenberger21f39912009-07-09 09:19:39 -0400250 // check to ensure the pluginType supports the model
251 if (!obj->activePlugin->supportsDrawingModel(model)) {
Derek Sollenbergere62ce172009-11-30 11:52:06 -0500252 gLogI.log(kError_ANPLogType, "------ %p Unsupported DrawingModel (%d)", instance, model);
Derek Sollenberger21f39912009-07-09 09:19:39 -0400253 return NPERR_GENERIC_ERROR;
254 }
255
Derek Sollenbergerd53b56d2010-01-11 12:31:49 -0500256 // if the plugin uses the surface drawing model then set the java context
Derek Sollenberger349bc372011-01-04 16:14:34 -0500257 if (model == kSurface_ANPDrawingModel || model == kOpenGL_ANPDrawingModel) {
Derek Sollenbergerd53b56d2010-01-11 12:31:49 -0500258 SurfaceSubPlugin* surfacePlugin = static_cast<SurfaceSubPlugin*>(obj->activePlugin);
259
260 jobject context;
261 NPError err = browser->getvalue(instance, kJavaContext_ANPGetValue,
262 static_cast<void*>(&context));
263 if (err) {
264 gLogI.log(kError_ANPLogType, "request context err: %d", err);
265 return err;
266 }
267
268 surfacePlugin->setContext(context);
269 }
270
271
Derek Sollenbergerd7ebf272009-06-18 11:19:41 -0400272 return NPERR_NO_ERROR;
Grace Klobafbe47c02009-05-14 17:31:45 -0700273}
274
275NPError NPP_Destroy(NPP instance, NPSavedData** save)
276{
277 PluginObject *obj = (PluginObject*) instance->pdata;
Grace Klobaa0e762c2009-12-27 13:21:41 -0800278 if (obj) {
279 delete obj->activePlugin;
280 browser->releaseobject(&obj->header);
281 }
Grace Klobafbe47c02009-05-14 17:31:45 -0700282
283 return NPERR_NO_ERROR;
284}
285
Grace Klobafbe47c02009-05-14 17:31:45 -0700286NPError NPP_SetWindow(NPP instance, NPWindow* window)
287{
288 PluginObject *obj = (PluginObject*) instance->pdata;
Derek Sollenberger9119e7d2009-06-08 10:53:09 -0400289
Grace Klobafbe47c02009-05-14 17:31:45 -0700290 // Do nothing if browser didn't support NPN_CreateObject which would have created the PluginObject.
291 if (obj != NULL) {
292 obj->window = window;
293 }
Derek Sollenberger9119e7d2009-06-08 10:53:09 -0400294
Grace Klobafbe47c02009-05-14 17:31:45 -0700295 browser->invalidaterect(instance, NULL);
296
297 return NPERR_NO_ERROR;
298}
Derek Sollenberger9119e7d2009-06-08 10:53:09 -0400299
Ben Murdoch3b6f45d2010-05-12 14:09:26 +0100300NPError NPP_NewStream(NPP instance, NPMIMEType type, NPStream* stream, NPBool seekable, uint16_t* stype)
Grace Klobafbe47c02009-05-14 17:31:45 -0700301{
302 *stype = NP_ASFILEONLY;
303 return NPERR_NO_ERROR;
304}
305
306NPError NPP_DestroyStream(NPP instance, NPStream* stream, NPReason reason)
307{
308 return NPERR_NO_ERROR;
309}
310
Ben Murdoch3b6f45d2010-05-12 14:09:26 +0100311int32_t NPP_WriteReady(NPP instance, NPStream* stream)
Grace Klobafbe47c02009-05-14 17:31:45 -0700312{
313 return 0;
314}
315
Ben Murdoch3b6f45d2010-05-12 14:09:26 +0100316int32_t NPP_Write(NPP instance, NPStream* stream, int32_t offset, int32_t len, void* buffer)
Grace Klobafbe47c02009-05-14 17:31:45 -0700317{
318 return 0;
319}
320
321void NPP_StreamAsFile(NPP instance, NPStream* stream, const char* fname)
322{
323}
324
325void NPP_Print(NPP instance, NPPrint* platformPrint)
326{
Grace Klobafbe47c02009-05-14 17:31:45 -0700327}
328
Ben Murdoch3b6f45d2010-05-12 14:09:26 +0100329int16_t NPP_HandleEvent(NPP instance, void* event)
Grace Klobafbe47c02009-05-14 17:31:45 -0700330{
331 PluginObject *obj = reinterpret_cast<PluginObject*>(instance->pdata);
332 const ANPEvent* evt = reinterpret_cast<const ANPEvent*>(event);
333
Derek Sollenberger5b011e32009-06-22 11:39:40 -0400334#if DEBUG_PLUGIN_EVENTS
Grace Klobafbe47c02009-05-14 17:31:45 -0700335 switch (evt->eventType) {
336 case kDraw_ANPEventType:
Derek Sollenbergerd7ebf272009-06-18 11:19:41 -0400337
338 if (evt->data.draw.model == kBitmap_ANPDrawingModel) {
339
340 static ANPBitmapFormat currentFormat = -1;
341 if (evt->data.draw.data.bitmap.format != currentFormat) {
342 currentFormat = evt->data.draw.data.bitmap.format;
Derek Sollenbergere62ce172009-11-30 11:52:06 -0500343 gLogI.log(kDebug_ANPLogType, "---- %p Draw (bitmap)"
Derek Sollenbergerd7ebf272009-06-18 11:19:41 -0400344 " clip=%d,%d,%d,%d format=%d", instance,
345 evt->data.draw.clip.left,
346 evt->data.draw.clip.top,
347 evt->data.draw.clip.right,
348 evt->data.draw.clip.bottom,
349 evt->data.draw.data.bitmap.format);
350 }
Grace Klobafbe47c02009-05-14 17:31:45 -0700351 }
Derek Sollenbergerd7ebf272009-06-18 11:19:41 -0400352 break;
Grace Klobafbe47c02009-05-14 17:31:45 -0700353
354 case kKey_ANPEventType:
Derek Sollenbergere62ce172009-11-30 11:52:06 -0500355 gLogI.log(kDebug_ANPLogType, "---- %p Key action=%d"
Grace Klobafbe47c02009-05-14 17:31:45 -0700356 " code=%d vcode=%d unichar=%d repeat=%d mods=%x", instance,
357 evt->data.key.action,
358 evt->data.key.nativeCode,
359 evt->data.key.virtualCode,
360 evt->data.key.unichar,
361 evt->data.key.repeatCount,
362 evt->data.key.modifiers);
Derek Sollenbergerd7ebf272009-06-18 11:19:41 -0400363 break;
Derek Sollenberger9119e7d2009-06-08 10:53:09 -0400364
365 case kLifecycle_ANPEventType:
Derek Sollenbergere62ce172009-11-30 11:52:06 -0500366 gLogI.log(kDebug_ANPLogType, "---- %p Lifecycle action=%d",
Derek Sollenbergerd7ebf272009-06-18 11:19:41 -0400367 instance, evt->data.lifecycle.action);
Mike Reed1e7c3312009-05-26 16:37:45 -0400368 break;
Grace Klobafbe47c02009-05-14 17:31:45 -0700369
Derek Sollenbergerd7ebf272009-06-18 11:19:41 -0400370 case kTouch_ANPEventType:
Derek Sollenbergere62ce172009-11-30 11:52:06 -0500371 gLogI.log(kDebug_ANPLogType, "---- %p Touch action=%d [%d %d]",
Grace Klobafbe47c02009-05-14 17:31:45 -0700372 instance, evt->data.touch.action, evt->data.touch.x,
373 evt->data.touch.y);
Derek Sollenberger5b011e32009-06-22 11:39:40 -0400374 break;
375
Derek Sollenbergerdb398a72009-06-29 13:53:04 -0400376 case kMouse_ANPEventType:
Derek Sollenbergere62ce172009-11-30 11:52:06 -0500377 gLogI.log(kDebug_ANPLogType, "---- %p Mouse action=%d [%d %d]",
Derek Sollenbergerdb398a72009-06-29 13:53:04 -0400378 instance, evt->data.mouse.action, evt->data.mouse.x,
379 evt->data.mouse.y);
380 break;
381
Derek Sollenberger5b011e32009-06-22 11:39:40 -0400382 case kVisibleRect_ANPEventType:
Derek Sollenbergere62ce172009-11-30 11:52:06 -0500383 gLogI.log(kDebug_ANPLogType, "---- %p VisibleRect [%d %d %d %d]",
Derek Sollenbergerf42e2f42009-06-26 11:42:46 -0400384 instance, evt->data.visibleRect.rect.left, evt->data.visibleRect.rect.top,
385 evt->data.visibleRect.rect.right, evt->data.visibleRect.rect.bottom);
Derek Sollenberger5b011e32009-06-22 11:39:40 -0400386 break;
Grace Klobafbe47c02009-05-14 17:31:45 -0700387
388 default:
Derek Sollenbergere62ce172009-11-30 11:52:06 -0500389 gLogI.log(kError_ANPLogType, "---- %p Unknown Event [%d]",
Derek Sollenberger5b011e32009-06-22 11:39:40 -0400390 instance, evt->eventType);
Grace Klobafbe47c02009-05-14 17:31:45 -0700391 break;
392 }
Derek Sollenberger5b011e32009-06-22 11:39:40 -0400393#endif
Derek Sollenbergerd7ebf272009-06-18 11:19:41 -0400394
395 if(!obj->activePlugin) {
Derek Sollenbergere62ce172009-11-30 11:52:06 -0500396 gLogI.log(kError_ANPLogType, "the active plugin is null.");
Derek Sollenbergerd7ebf272009-06-18 11:19:41 -0400397 return 0; // unknown or unhandled event
398 }
399 else {
400 return obj->activePlugin->handleEvent(evt);
401 }
Grace Klobafbe47c02009-05-14 17:31:45 -0700402}
403
404void NPP_URLNotify(NPP instance, const char* url, NPReason reason, void* notifyData)
405{
406
407}
408
409EXPORT NPError NP_GetValue(NPP instance, NPPVariable variable, void *value) {
410
411 if (variable == NPPVpluginNameString) {
412 const char **str = (const char **)value;
413 *str = "Test Plugin";
414 return NPERR_NO_ERROR;
415 }
Derek Sollenberger9119e7d2009-06-08 10:53:09 -0400416
Grace Klobafbe47c02009-05-14 17:31:45 -0700417 if (variable == NPPVpluginDescriptionString) {
418 const char **str = (const char **)value;
419 *str = "Description of Test Plugin";
420 return NPERR_NO_ERROR;
421 }
Derek Sollenberger9119e7d2009-06-08 10:53:09 -0400422
Grace Klobafbe47c02009-05-14 17:31:45 -0700423 return NPERR_GENERIC_ERROR;
424}
425
Derek Sollenbergerd53b56d2010-01-11 12:31:49 -0500426NPError NPP_GetValue(NPP instance, NPPVariable variable, void* value)
Grace Klobafbe47c02009-05-14 17:31:45 -0700427{
428 if (variable == NPPVpluginScriptableNPObject) {
429 void **v = (void **)value;
430 PluginObject *obj = (PluginObject*) instance->pdata;
Derek Sollenberger9119e7d2009-06-08 10:53:09 -0400431
Grace Klobafbe47c02009-05-14 17:31:45 -0700432 if (obj)
Derek Sollenbergerb4a23912009-11-09 15:38:58 -0500433 browser->retainobject(&obj->header);
Derek Sollenberger9119e7d2009-06-08 10:53:09 -0400434
Derek Sollenbergerb4a23912009-11-09 15:38:58 -0500435 *v = &(obj->header);
Grace Klobafbe47c02009-05-14 17:31:45 -0700436 return NPERR_NO_ERROR;
437 }
Derek Sollenberger9119e7d2009-06-08 10:53:09 -0400438
Derek Sollenbergerd53b56d2010-01-11 12:31:49 -0500439 if (variable == kJavaSurface_ANPGetValue) {
440 //get the surface sub-plugin
441 PluginObject* obj = static_cast<PluginObject*>(instance->pdata);
442 if (obj && obj->activePlugin) {
443
Derek Sollenberger349bc372011-01-04 16:14:34 -0500444 if(obj->activePlugin->supportsDrawingModel(kSurface_ANPDrawingModel)
445 || obj->activePlugin->supportsDrawingModel(kOpenGL_ANPDrawingModel)) {
Derek Sollenbergerd53b56d2010-01-11 12:31:49 -0500446 SurfaceSubPlugin* plugin = static_cast<SurfaceSubPlugin*>(obj->activePlugin);
447 jobject* surface = static_cast<jobject*>(value);
448 *surface = plugin->getSurface();
449 return NPERR_NO_ERROR;
450 } else {
451 gLogI.log(kError_ANPLogType,
452 "-- %p Tried to retrieve surface for non-surface plugin",
453 instance);
454 }
455 }
456 }
457
Grace Klobafbe47c02009-05-14 17:31:45 -0700458 return NPERR_GENERIC_ERROR;
459}
460
461NPError NPP_SetValue(NPP instance, NPNVariable variable, void *value)
462{
463 return NPERR_GENERIC_ERROR;
464}
465