1df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger/* 2df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger * Copyright 2009, The Android Open Source Project 3df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger * 4df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger * Redistribution and use in source and binary forms, with or without 5df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger * modification, are permitted provided that the following conditions 6df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger * are met: 7df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger * * Redistributions of source code must retain the above copyright 8df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger * notice, this list of conditions and the following disclaimer. 9df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger * * Redistributions in binary form must reproduce the above copyright 10df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger * notice, this list of conditions and the following disclaimer in the 11df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger * documentation and/or other materials provided with the distribution. 12df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger * 13df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY 14df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 15df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 16df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE COMPUTER, INC. OR 17df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 18df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 19df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR 20df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY 21df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 22df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 23df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 24df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger */ 25df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger 26df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger#include <stdlib.h> 27df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger#include <string.h> 28df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger#include <stdio.h> 29df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger#include "android_npapi.h" 30df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger#include "main.h" 31df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger#include "PluginObject.h" 32df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger#include "EventPlugin.h" 33df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger 34df8a3f31d871db25e952972c2eb346a71186e9e3Derek SollenbergerNPNetscapeFuncs* browser; 35df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger#define EXPORT __attribute__((visibility("default"))) 36df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger 37df8a3f31d871db25e952972c2eb346a71186e9e3Derek SollenbergerNPError NPP_New(NPMIMEType pluginType, NPP instance, uint16 mode, int16 argc, 38df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger char* argn[], char* argv[], NPSavedData* saved); 39df8a3f31d871db25e952972c2eb346a71186e9e3Derek SollenbergerNPError NPP_Destroy(NPP instance, NPSavedData** save); 40df8a3f31d871db25e952972c2eb346a71186e9e3Derek SollenbergerNPError NPP_SetWindow(NPP instance, NPWindow* window); 41df8a3f31d871db25e952972c2eb346a71186e9e3Derek SollenbergerNPError NPP_NewStream(NPP instance, NPMIMEType type, NPStream* stream, 42df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger NPBool seekable, uint16* stype); 43df8a3f31d871db25e952972c2eb346a71186e9e3Derek SollenbergerNPError NPP_DestroyStream(NPP instance, NPStream* stream, NPReason reason); 44df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenbergerint32 NPP_WriteReady(NPP instance, NPStream* stream); 45df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenbergerint32 NPP_Write(NPP instance, NPStream* stream, int32 offset, int32 len, 46df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger void* buffer); 47df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenbergervoid NPP_StreamAsFile(NPP instance, NPStream* stream, const char* fname); 48df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenbergervoid NPP_Print(NPP instance, NPPrint* platformPrint); 49df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenbergerint16 NPP_HandleEvent(NPP instance, void* event); 50df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenbergervoid NPP_URLNotify(NPP instance, const char* URL, NPReason reason, 51df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger void* notifyData); 52df8a3f31d871db25e952972c2eb346a71186e9e3Derek SollenbergerNPError NPP_GetValue(NPP instance, NPPVariable variable, void *value); 53df8a3f31d871db25e952972c2eb346a71186e9e3Derek SollenbergerNPError NPP_SetValue(NPP instance, NPNVariable variable, void *value); 54df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger 55df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenbergerextern "C" { 56f5831d4303410edffb865c936164a7aee981d04cDerek SollenbergerEXPORT NPError NP_Initialize(NPNetscapeFuncs* browserFuncs, NPPluginFuncs* pluginFuncs, void *java_env); 57df8a3f31d871db25e952972c2eb346a71186e9e3Derek SollenbergerEXPORT NPError NP_GetValue(NPP instance, NPPVariable variable, void *value); 58df8a3f31d871db25e952972c2eb346a71186e9e3Derek SollenbergerEXPORT const char* NP_GetMIMEDescription(void); 59df8a3f31d871db25e952972c2eb346a71186e9e3Derek SollenbergerEXPORT void NP_Shutdown(void); 60df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger}; 61df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger 62df8a3f31d871db25e952972c2eb346a71186e9e3Derek SollenbergerANPAudioTrackInterfaceV0 gSoundI; 63df8a3f31d871db25e952972c2eb346a71186e9e3Derek SollenbergerANPBitmapInterfaceV0 gBitmapI; 64df8a3f31d871db25e952972c2eb346a71186e9e3Derek SollenbergerANPCanvasInterfaceV0 gCanvasI; 65df8a3f31d871db25e952972c2eb346a71186e9e3Derek SollenbergerANPLogInterfaceV0 gLogI; 66df8a3f31d871db25e952972c2eb346a71186e9e3Derek SollenbergerANPPaintInterfaceV0 gPaintI; 67df8a3f31d871db25e952972c2eb346a71186e9e3Derek SollenbergerANPPathInterfaceV0 gPathI; 68df8a3f31d871db25e952972c2eb346a71186e9e3Derek SollenbergerANPTypefaceInterfaceV0 gTypefaceI; 69df8a3f31d871db25e952972c2eb346a71186e9e3Derek SollenbergerANPWindowInterfaceV0 gWindowI; 70df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger 71df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger#define ARRAY_COUNT(array) (sizeof(array) / sizeof(array[0])) 72df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger 73f5831d4303410edffb865c936164a7aee981d04cDerek SollenbergerNPError NP_Initialize(NPNetscapeFuncs* browserFuncs, NPPluginFuncs* pluginFuncs, void *java_env) 74df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger{ 75df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger // Make sure we have a function table equal or larger than we are built against. 76df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger if (browserFuncs->size < sizeof(NPNetscapeFuncs)) { 77df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger return NPERR_GENERIC_ERROR; 78df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger } 79df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger 80df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger // Copy the function table (structure) 81df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger browser = (NPNetscapeFuncs*) malloc(sizeof(NPNetscapeFuncs)); 82df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger memcpy(browser, browserFuncs, sizeof(NPNetscapeFuncs)); 83df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger 84df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger // Build the plugin function table 85df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger pluginFuncs->version = 11; 86df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger pluginFuncs->size = sizeof(pluginFuncs); 87df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger pluginFuncs->newp = NPP_New; 88df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger pluginFuncs->destroy = NPP_Destroy; 89df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger pluginFuncs->setwindow = NPP_SetWindow; 90df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger pluginFuncs->newstream = NPP_NewStream; 91df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger pluginFuncs->destroystream = NPP_DestroyStream; 92df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger pluginFuncs->asfile = NPP_StreamAsFile; 93df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger pluginFuncs->writeready = NPP_WriteReady; 94df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger pluginFuncs->write = (NPP_WriteProcPtr)NPP_Write; 95df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger pluginFuncs->print = NPP_Print; 96df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger pluginFuncs->event = NPP_HandleEvent; 97df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger pluginFuncs->urlnotify = NPP_URLNotify; 98df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger pluginFuncs->getvalue = NPP_GetValue; 99df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger pluginFuncs->setvalue = NPP_SetValue; 100df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger 101df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger static const struct { 102df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger NPNVariable v; 103df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger uint32_t size; 104df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger ANPInterface* i; 105df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger } gPairs[] = { 106df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger { kCanvasInterfaceV0_ANPGetValue, sizeof(gCanvasI), &gCanvasI }, 107df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger { kLogInterfaceV0_ANPGetValue, sizeof(gLogI), &gLogI }, 108df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger { kPaintInterfaceV0_ANPGetValue, sizeof(gPaintI), &gPaintI }, 109df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger { kTypefaceInterfaceV0_ANPGetValue, sizeof(gTypefaceI), &gTypefaceI }, 110df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger }; 111df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger for (size_t i = 0; i < ARRAY_COUNT(gPairs); i++) { 112df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger gPairs[i].i->inSize = gPairs[i].size; 113df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger NPError err = browser->getvalue(NULL, gPairs[i].v, gPairs[i].i); 114df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger if (err) { 115df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger return err; 116df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger } 117df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger } 118df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger 119df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger return NPERR_NO_ERROR; 120df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger} 121df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger 122df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenbergervoid NP_Shutdown(void) 123df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger{ 124df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger 125df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger} 126df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger 127df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenbergerconst char *NP_GetMIMEDescription(void) 128df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger{ 129df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger return "application/x-browsertestplugin:btp:Android Browser Test Plugin"; 130df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger} 131df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger 132df8a3f31d871db25e952972c2eb346a71186e9e3Derek SollenbergerNPError NPP_New(NPMIMEType pluginType, NPP instance, uint16 mode, int16 argc, 133df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger char* argn[], char* argv[], NPSavedData* saved) 134df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger{ 135df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger 136df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger 137b16749e2c60dca69f8b71adf900597bad10adf40Derek Sollenberger gLogI.log(kDebug_ANPLogType, "creating plugin"); 138df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger 139df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger PluginObject *obj = NULL; 140df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger 141df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger // Scripting functions appeared in NPAPI version 14 142df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger if (browser->version >= 14) { 143df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger instance->pdata = browser->createobject (instance, getPluginClass()); 144df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger obj = static_cast<PluginObject*>(instance->pdata); 1458e3015e7aa7007b1687a4dd39b99cc16f94b2bd1Carl Shapiro memset(obj, 0, sizeof(*obj)); 146df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger } else { 147df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger return NPERR_GENERIC_ERROR; 148df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger } 149df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger 150df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger // select the drawing model 1510b3a5d65247be1fb79d66af534fa78a94743864fDerek Sollenberger ANPDrawingModel model = kBitmap_ANPDrawingModel; 152df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger 153df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger // notify the plugin API of the drawing model we wish to use. This must be 154df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger // done prior to creating certain subPlugin objects (e.g. surfaceViews) 155df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger NPError err = browser->setvalue(instance, kRequestDrawingModel_ANPSetValue, 156df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger reinterpret_cast<void*>(model)); 157df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger if (err) { 158b16749e2c60dca69f8b71adf900597bad10adf40Derek Sollenberger gLogI.log(kError_ANPLogType, "request model %d err %d", model, err); 159df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger return err; 160df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger } 161df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger 162df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger // create the sub-plugin 163df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger obj->subPlugin = new EventPlugin(instance); 164df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger 165df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger return NPERR_NO_ERROR; 166df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger} 167df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger 168df8a3f31d871db25e952972c2eb346a71186e9e3Derek SollenbergerNPError NPP_Destroy(NPP instance, NPSavedData** save) 169df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger{ 170df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger PluginObject *obj = (PluginObject*) instance->pdata; 171c782c8d3277f1ee627b7d9b70eab27e956b78c98Grace Kloba if (obj) { 172c782c8d3277f1ee627b7d9b70eab27e956b78c98Grace Kloba delete obj->subPlugin; 173c782c8d3277f1ee627b7d9b70eab27e956b78c98Grace Kloba browser->releaseobject(&obj->header); 174c782c8d3277f1ee627b7d9b70eab27e956b78c98Grace Kloba } 175df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger 176df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger return NPERR_NO_ERROR; 177df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger} 178df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger 179df8a3f31d871db25e952972c2eb346a71186e9e3Derek SollenbergerNPError NPP_SetWindow(NPP instance, NPWindow* window) 180df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger{ 181df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger PluginObject *obj = (PluginObject*) instance->pdata; 182df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger 183df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger // Do nothing if browser didn't support NPN_CreateObject which would have created the PluginObject. 184df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger if (obj != NULL) { 185df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger obj->window = window; 186df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger } 187df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger 188df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger return NPERR_NO_ERROR; 189df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger} 190df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger 191df8a3f31d871db25e952972c2eb346a71186e9e3Derek SollenbergerNPError NPP_NewStream(NPP instance, NPMIMEType type, NPStream* stream, NPBool seekable, uint16* stype) 192df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger{ 193df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger *stype = NP_ASFILEONLY; 194df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger return NPERR_NO_ERROR; 195df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger} 196df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger 197df8a3f31d871db25e952972c2eb346a71186e9e3Derek SollenbergerNPError NPP_DestroyStream(NPP instance, NPStream* stream, NPReason reason) 198df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger{ 199df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger return NPERR_NO_ERROR; 200df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger} 201df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger 202df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenbergerint32 NPP_WriteReady(NPP instance, NPStream* stream) 203df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger{ 204df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger return 0; 205df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger} 206df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger 207df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenbergerint32 NPP_Write(NPP instance, NPStream* stream, int32 offset, int32 len, void* buffer) 208df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger{ 209df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger return 0; 210df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger} 211df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger 212df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenbergervoid NPP_StreamAsFile(NPP instance, NPStream* stream, const char* fname) 213df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger{ 214df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger} 215df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger 216df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenbergervoid NPP_Print(NPP instance, NPPrint* platformPrint) 217df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger{ 218df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger} 219df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger 220df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenbergerint16 NPP_HandleEvent(NPP instance, void* event) 221df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger{ 222df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger PluginObject *obj = reinterpret_cast<PluginObject*>(instance->pdata); 223df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger const ANPEvent* evt = reinterpret_cast<const ANPEvent*>(event); 224df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger 225df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger if(!obj->subPlugin) { 226b16749e2c60dca69f8b71adf900597bad10adf40Derek Sollenberger gLogI.log(kError_ANPLogType, "the sub-plugin is null."); 227df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger return 0; // unknown or unhandled event 228df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger } 229df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger else { 230df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger return obj->subPlugin->handleEvent(evt); 231df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger } 232df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger} 233df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger 234df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenbergervoid NPP_URLNotify(NPP instance, const char* url, NPReason reason, void* notifyData) 235df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger{ 236df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger} 237df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger 238df8a3f31d871db25e952972c2eb346a71186e9e3Derek SollenbergerEXPORT NPError NP_GetValue(NPP instance, NPPVariable variable, void *value) { 239df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger 240df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger if (variable == NPPVpluginNameString) { 241df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger const char **str = (const char **)value; 242df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger *str = "Browser Test Plugin"; 243df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger return NPERR_NO_ERROR; 244df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger } 245df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger 246df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger if (variable == NPPVpluginDescriptionString) { 247df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger const char **str = (const char **)value; 248df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger *str = "Description of Browser Test Plugin"; 249df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger return NPERR_NO_ERROR; 250df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger } 251df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger 252df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger return NPERR_GENERIC_ERROR; 253df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger} 254df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger 255df8a3f31d871db25e952972c2eb346a71186e9e3Derek SollenbergerNPError NPP_GetValue(NPP instance, NPPVariable variable, void *value) 256df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger{ 257df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger if (variable == NPPVpluginScriptableNPObject) { 258df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger void **v = (void **)value; 259df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger PluginObject *obj = (PluginObject*) instance->pdata; 260df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger 261df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger if (obj) 262df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger browser->retainobject((NPObject*)obj); 263df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger 264df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger *v = obj; 265df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger return NPERR_NO_ERROR; 266df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger } 267df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger 268df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger return NPERR_GENERIC_ERROR; 269df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger} 270df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger 271df8a3f31d871db25e952972c2eb346a71186e9e3Derek SollenbergerNPError NPP_SetValue(NPP instance, NPNVariable variable, void *value) 272df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger{ 273df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger return NPERR_GENERIC_ERROR; 274df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger} 275df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger 276