main.cpp revision 0b3a5d65247be1fb79d66af534fa78a94743864f
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" { 56df8a3f31d871db25e952972c2eb346a71186e9e3Derek SollenbergerEXPORT NPError NP_Initialize(NPNetscapeFuncs* browserFuncs, NPPluginFuncs* pluginFuncs, void *java_env, void *application_context); 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 SollenbergerANPSystemInterfaceV0 gSystemI; 69df8a3f31d871db25e952972c2eb346a71186e9e3Derek SollenbergerANPTypefaceInterfaceV0 gTypefaceI; 70df8a3f31d871db25e952972c2eb346a71186e9e3Derek SollenbergerANPWindowInterfaceV0 gWindowI; 71df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger 72df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger#define ARRAY_COUNT(array) (sizeof(array) / sizeof(array[0])) 73df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger 74df8a3f31d871db25e952972c2eb346a71186e9e3Derek SollenbergerNPError NP_Initialize(NPNetscapeFuncs* browserFuncs, NPPluginFuncs* pluginFuncs, void *java_env, void *application_context) 75df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger{ 76df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger // Make sure we have a function table equal or larger than we are built against. 77df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger if (browserFuncs->size < sizeof(NPNetscapeFuncs)) { 78df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger return NPERR_GENERIC_ERROR; 79df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger } 80df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger 81df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger // Copy the function table (structure) 82df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger browser = (NPNetscapeFuncs*) malloc(sizeof(NPNetscapeFuncs)); 83df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger memcpy(browser, browserFuncs, sizeof(NPNetscapeFuncs)); 84df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger 85df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger // Build the plugin function table 86df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger pluginFuncs->version = 11; 87df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger pluginFuncs->size = sizeof(pluginFuncs); 88df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger pluginFuncs->newp = NPP_New; 89df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger pluginFuncs->destroy = NPP_Destroy; 90df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger pluginFuncs->setwindow = NPP_SetWindow; 91df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger pluginFuncs->newstream = NPP_NewStream; 92df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger pluginFuncs->destroystream = NPP_DestroyStream; 93df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger pluginFuncs->asfile = NPP_StreamAsFile; 94df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger pluginFuncs->writeready = NPP_WriteReady; 95df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger pluginFuncs->write = (NPP_WriteProcPtr)NPP_Write; 96df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger pluginFuncs->print = NPP_Print; 97df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger pluginFuncs->event = NPP_HandleEvent; 98df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger pluginFuncs->urlnotify = NPP_URLNotify; 99df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger pluginFuncs->getvalue = NPP_GetValue; 100df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger pluginFuncs->setvalue = NPP_SetValue; 101df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger 102df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger static const struct { 103df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger NPNVariable v; 104df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger uint32_t size; 105df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger ANPInterface* i; 106df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger } gPairs[] = { 107df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger { kCanvasInterfaceV0_ANPGetValue, sizeof(gCanvasI), &gCanvasI }, 108df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger { kLogInterfaceV0_ANPGetValue, sizeof(gLogI), &gLogI }, 109df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger { kPaintInterfaceV0_ANPGetValue, sizeof(gPaintI), &gPaintI }, 110df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger { kTypefaceInterfaceV0_ANPGetValue, sizeof(gTypefaceI), &gTypefaceI }, 111df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger }; 112df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger for (size_t i = 0; i < ARRAY_COUNT(gPairs); i++) { 113df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger gPairs[i].i->inSize = gPairs[i].size; 114df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger NPError err = browser->getvalue(NULL, gPairs[i].v, gPairs[i].i); 115df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger if (err) { 116df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger return err; 117df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger } 118df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger } 119df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger 120df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger return NPERR_NO_ERROR; 121df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger} 122df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger 123df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenbergervoid NP_Shutdown(void) 124df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger{ 125df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger 126df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger} 127df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger 128df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenbergerconst char *NP_GetMIMEDescription(void) 129df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger{ 130df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger return "application/x-browsertestplugin:btp:Android Browser Test Plugin"; 131df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger} 132df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger 133df8a3f31d871db25e952972c2eb346a71186e9e3Derek SollenbergerNPError NPP_New(NPMIMEType pluginType, NPP instance, uint16 mode, int16 argc, 134df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger char* argn[], char* argv[], NPSavedData* saved) 135df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger{ 136df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger 137df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger 138df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger gLogI.log(instance, kDebug_ANPLogType, "creating plugin"); 139df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger 140df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger PluginObject *obj = NULL; 141df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger 142df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger // Scripting functions appeared in NPAPI version 14 143df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger if (browser->version >= 14) { 144df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger instance->pdata = browser->createobject (instance, getPluginClass()); 145df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger obj = static_cast<PluginObject*>(instance->pdata); 146df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger bzero(obj, sizeof(*obj)); 147df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger } else { 148df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger return NPERR_GENERIC_ERROR; 149df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger } 150df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger 151df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger // select the drawing model 1520b3a5d65247be1fb79d66af534fa78a94743864fDerek Sollenberger ANPDrawingModel model = kBitmap_ANPDrawingModel; 153df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger 154df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger // notify the plugin API of the drawing model we wish to use. This must be 155df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger // done prior to creating certain subPlugin objects (e.g. surfaceViews) 156df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger NPError err = browser->setvalue(instance, kRequestDrawingModel_ANPSetValue, 157df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger reinterpret_cast<void*>(model)); 158df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger if (err) { 159df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger gLogI.log(instance, kError_ANPLogType, "request model %d err %d", model, err); 160df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger return err; 161df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger } 162df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger 163df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger // create the sub-plugin 164df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger obj->subPlugin = new EventPlugin(instance); 165df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger 166df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger return NPERR_NO_ERROR; 167df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger} 168df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger 169df8a3f31d871db25e952972c2eb346a71186e9e3Derek SollenbergerNPError NPP_Destroy(NPP instance, NPSavedData** save) 170df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger{ 171df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger PluginObject *obj = (PluginObject*) instance->pdata; 172df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger delete obj->subPlugin; 173df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger 174df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger return NPERR_NO_ERROR; 175df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger} 176df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger 177df8a3f31d871db25e952972c2eb346a71186e9e3Derek SollenbergerNPError NPP_SetWindow(NPP instance, NPWindow* window) 178df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger{ 179df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger PluginObject *obj = (PluginObject*) instance->pdata; 180df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger 181df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger // Do nothing if browser didn't support NPN_CreateObject which would have created the PluginObject. 182df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger if (obj != NULL) { 183df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger obj->window = window; 184df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger } 185df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger 186df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger return NPERR_NO_ERROR; 187df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger} 188df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger 189df8a3f31d871db25e952972c2eb346a71186e9e3Derek SollenbergerNPError NPP_NewStream(NPP instance, NPMIMEType type, NPStream* stream, NPBool seekable, uint16* stype) 190df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger{ 191df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger *stype = NP_ASFILEONLY; 192df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger return NPERR_NO_ERROR; 193df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger} 194df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger 195df8a3f31d871db25e952972c2eb346a71186e9e3Derek SollenbergerNPError NPP_DestroyStream(NPP instance, NPStream* stream, NPReason reason) 196df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger{ 197df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger return NPERR_NO_ERROR; 198df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger} 199df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger 200df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenbergerint32 NPP_WriteReady(NPP instance, NPStream* stream) 201df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger{ 202df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger return 0; 203df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger} 204df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger 205df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenbergerint32 NPP_Write(NPP instance, NPStream* stream, int32 offset, int32 len, void* buffer) 206df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger{ 207df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger return 0; 208df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger} 209df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger 210df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenbergervoid NPP_StreamAsFile(NPP instance, NPStream* stream, const char* fname) 211df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger{ 212df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger} 213df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger 214df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenbergervoid NPP_Print(NPP instance, NPPrint* platformPrint) 215df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger{ 216df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger} 217df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger 218df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenbergerint16 NPP_HandleEvent(NPP instance, void* event) 219df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger{ 220df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger PluginObject *obj = reinterpret_cast<PluginObject*>(instance->pdata); 221df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger const ANPEvent* evt = reinterpret_cast<const ANPEvent*>(event); 222df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger 223df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger if(!obj->subPlugin) { 224df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger gLogI.log(instance, kError_ANPLogType, "the sub-plugin is null."); 225df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger return 0; // unknown or unhandled event 226df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger } 227df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger else { 228df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger return obj->subPlugin->handleEvent(evt); 229df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger } 230df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger} 231df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger 232df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenbergervoid NPP_URLNotify(NPP instance, const char* url, NPReason reason, void* notifyData) 233df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger{ 234df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger} 235df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger 236df8a3f31d871db25e952972c2eb346a71186e9e3Derek SollenbergerEXPORT NPError NP_GetValue(NPP instance, NPPVariable variable, void *value) { 237df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger 238df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger if (variable == NPPVpluginNameString) { 239df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger const char **str = (const char **)value; 240df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger *str = "Browser Test Plugin"; 241df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger return NPERR_NO_ERROR; 242df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger } 243df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger 244df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger if (variable == NPPVpluginDescriptionString) { 245df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger const char **str = (const char **)value; 246df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger *str = "Description of Browser Test Plugin"; 247df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger return NPERR_NO_ERROR; 248df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger } 249df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger 250df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger return NPERR_GENERIC_ERROR; 251df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger} 252df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger 253df8a3f31d871db25e952972c2eb346a71186e9e3Derek SollenbergerNPError NPP_GetValue(NPP instance, NPPVariable variable, void *value) 254df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger{ 255df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger if (variable == NPPVpluginScriptableNPObject) { 256df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger void **v = (void **)value; 257df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger PluginObject *obj = (PluginObject*) instance->pdata; 258df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger 259df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger if (obj) 260df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger browser->retainobject((NPObject*)obj); 261df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger 262df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger *v = obj; 263df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger return NPERR_NO_ERROR; 264df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger } 265df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger 266df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger return NPERR_GENERIC_ERROR; 267df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger} 268df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger 269df8a3f31d871db25e952972c2eb346a71186e9e3Derek SollenbergerNPError NPP_SetValue(NPP instance, NPNVariable variable, void *value) 270df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger{ 271df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger return NPERR_GENERIC_ERROR; 272df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger} 273df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger 274