main.cpp revision b16749e2c60dca69f8b71adf900597bad10adf40
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 SollenbergerANPTypefaceInterfaceV0      gTypefaceI;
69df8a3f31d871db25e952972c2eb346a71186e9e3Derek SollenbergerANPWindowInterfaceV0        gWindowI;
70df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger
71df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger#define ARRAY_COUNT(array)      (sizeof(array) / sizeof(array[0]))
72df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger
73df8a3f31d871db25e952972c2eb346a71186e9e3Derek SollenbergerNPError NP_Initialize(NPNetscapeFuncs* browserFuncs, NPPluginFuncs* pluginFuncs, void *java_env, void *application_context)
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);
145df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger    bzero(obj, 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;
171df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger    delete obj->subPlugin;
172df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger
173df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger    return NPERR_NO_ERROR;
174df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger}
175df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger
176df8a3f31d871db25e952972c2eb346a71186e9e3Derek SollenbergerNPError NPP_SetWindow(NPP instance, NPWindow* window)
177df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger{
178df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger    PluginObject *obj = (PluginObject*) instance->pdata;
179df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger
180df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger    // Do nothing if browser didn't support NPN_CreateObject which would have created the PluginObject.
181df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger    if (obj != NULL) {
182df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger        obj->window = window;
183df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger    }
184df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger
185df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger    return NPERR_NO_ERROR;
186df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger}
187df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger
188df8a3f31d871db25e952972c2eb346a71186e9e3Derek SollenbergerNPError NPP_NewStream(NPP instance, NPMIMEType type, NPStream* stream, NPBool seekable, uint16* stype)
189df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger{
190df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger    *stype = NP_ASFILEONLY;
191df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger    return NPERR_NO_ERROR;
192df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger}
193df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger
194df8a3f31d871db25e952972c2eb346a71186e9e3Derek SollenbergerNPError NPP_DestroyStream(NPP instance, NPStream* stream, NPReason reason)
195df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger{
196df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger    return NPERR_NO_ERROR;
197df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger}
198df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger
199df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenbergerint32 NPP_WriteReady(NPP instance, NPStream* stream)
200df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger{
201df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger    return 0;
202df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger}
203df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger
204df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenbergerint32 NPP_Write(NPP instance, NPStream* stream, int32 offset, int32 len, void* buffer)
205df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger{
206df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger    return 0;
207df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger}
208df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger
209df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenbergervoid NPP_StreamAsFile(NPP instance, NPStream* stream, const char* fname)
210df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger{
211df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger}
212df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger
213df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenbergervoid NPP_Print(NPP instance, NPPrint* platformPrint)
214df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger{
215df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger}
216df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger
217df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenbergerint16 NPP_HandleEvent(NPP instance, void* event)
218df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger{
219df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger    PluginObject *obj = reinterpret_cast<PluginObject*>(instance->pdata);
220df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger    const ANPEvent* evt = reinterpret_cast<const ANPEvent*>(event);
221df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger
222df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger    if(!obj->subPlugin) {
223b16749e2c60dca69f8b71adf900597bad10adf40Derek Sollenberger        gLogI.log(kError_ANPLogType, "the sub-plugin is null.");
224df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger        return 0; // unknown or unhandled event
225df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger    }
226df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger    else {
227df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger        return obj->subPlugin->handleEvent(evt);
228df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger    }
229df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger}
230df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger
231df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenbergervoid NPP_URLNotify(NPP instance, const char* url, NPReason reason, void* notifyData)
232df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger{
233df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger}
234df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger
235df8a3f31d871db25e952972c2eb346a71186e9e3Derek SollenbergerEXPORT NPError NP_GetValue(NPP instance, NPPVariable variable, void *value) {
236df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger
237df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger    if (variable == NPPVpluginNameString) {
238df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger        const char **str = (const char **)value;
239df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger        *str = "Browser Test Plugin";
240df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger        return NPERR_NO_ERROR;
241df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger    }
242df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger
243df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger    if (variable == NPPVpluginDescriptionString) {
244df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger        const char **str = (const char **)value;
245df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger        *str = "Description of Browser Test Plugin";
246df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger        return NPERR_NO_ERROR;
247df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger    }
248df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger
249df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger    return NPERR_GENERIC_ERROR;
250df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger}
251df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger
252df8a3f31d871db25e952972c2eb346a71186e9e3Derek SollenbergerNPError NPP_GetValue(NPP instance, NPPVariable variable, void *value)
253df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger{
254df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger    if (variable == NPPVpluginScriptableNPObject) {
255df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger        void **v = (void **)value;
256df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger        PluginObject *obj = (PluginObject*) instance->pdata;
257df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger
258df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger        if (obj)
259df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger            browser->retainobject((NPObject*)obj);
260df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger
261df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger        *v = obj;
262df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger        return NPERR_NO_ERROR;
263df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger    }
264df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger
265df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger    return NPERR_GENERIC_ERROR;
266df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger}
267df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger
268df8a3f31d871db25e952972c2eb346a71186e9e3Derek SollenbergerNPError NPP_SetValue(NPP instance, NPNVariable variable, void *value)
269df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger{
270df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger    return NPERR_GENERIC_ERROR;
271df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger}
272df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger
273