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