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/*
27df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger IMPORTANT:  This Apple software is supplied to you by Apple Computer, Inc. ("Apple") in
28df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger consideration of your agreement to the following terms, and your use, installation,
29df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger modification or redistribution of this Apple software constitutes acceptance of these
30df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger terms.  If you do not agree with these terms, please do not use, install, modify or
31df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger redistribute this Apple software.
32df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger
33df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger In consideration of your agreement to abide by the following terms, and subject to these
34df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger terms, Apple grants you a personal, non-exclusive license, under Apple�s copyrights in
35df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger this original Apple software (the "Apple Software"), to use, reproduce, modify and
36df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger redistribute the Apple Software, with or without modifications, in source and/or binary
37df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger forms; provided that if you redistribute the Apple Software in its entirety and without
38df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger modifications, you must retain this notice and the following text and disclaimers in all
39df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger such redistributions of the Apple Software.  Neither the name, trademarks, service marks
40df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger or logos of Apple Computer, Inc. may be used to endorse or promote products derived from
41df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger the Apple Software without specific prior written permission from Apple. Except as expressly
42df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger stated in this notice, no other rights or licenses, express or implied, are granted by Apple
43df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger herein, including but not limited to any patent rights that may be infringed by your
44df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger derivative works or by other works in which the Apple Software may be incorporated.
45df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger
46df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger The Apple Software is provided by Apple on an "AS IS" basis.  APPLE MAKES NO WARRANTIES,
47df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION THE IMPLIED WARRANTIES OF NON-INFRINGEMENT,
48df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS
49df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger USE AND OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
50df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger
51df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL OR CONSEQUENTIAL
52df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
53df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger          OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) ARISING IN ANY WAY OUT OF THE USE,
54df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger REPRODUCTION, MODIFICATION AND/OR DISTRIBUTION OF THE APPLE SOFTWARE, HOWEVER CAUSED AND
55df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE), STRICT LIABILITY OR
56df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
57df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger */
58df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger
59df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger#include <stdlib.h>
60df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger#include "main.h"
61df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger#include "PluginObject.h"
62df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger
63df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenbergerstatic void pluginInvalidate(NPObject *obj);
64df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenbergerstatic bool pluginHasProperty(NPObject *obj, NPIdentifier name);
65df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenbergerstatic bool pluginHasMethod(NPObject *obj, NPIdentifier name);
66df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenbergerstatic bool pluginGetProperty(NPObject *obj, NPIdentifier name, NPVariant *variant);
67df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenbergerstatic bool pluginSetProperty(NPObject *obj, NPIdentifier name, const NPVariant *variant);
68df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenbergerstatic bool pluginInvoke(NPObject *obj, NPIdentifier name, const NPVariant *args, uint32_t argCount, NPVariant *result);
69df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenbergerstatic bool pluginInvokeDefault(NPObject *obj, const NPVariant *args, uint32_t argCount, NPVariant *result);
70df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenbergerstatic NPObject *pluginAllocate(NPP npp, NPClass *theClass);
71df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenbergerstatic void pluginDeallocate(NPObject *obj);
72df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenbergerstatic bool pluginRemoveProperty(NPObject *npobj, NPIdentifier name);
73df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenbergerstatic bool pluginEnumerate(NPObject *npobj, NPIdentifier **value, uint32_t *count);
74df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger
75df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger
76df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger
77df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenbergerstatic NPClass pluginClass = {
78df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger    NP_CLASS_STRUCT_VERSION,
79df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger    pluginAllocate,
80df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger    pluginDeallocate,
81df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger    pluginInvalidate,
82df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger    pluginHasMethod,
83df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger    pluginInvoke,
84df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger    pluginInvokeDefault,
85df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger    pluginHasProperty,
86df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger    pluginGetProperty,
87df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger    pluginSetProperty,
88df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger    pluginRemoveProperty,
89df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger    pluginEnumerate
90df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger};
91df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger
92df8a3f31d871db25e952972c2eb346a71186e9e3Derek SollenbergerNPClass *getPluginClass(void)
93df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger{
94df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger    return &pluginClass;
95df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger}
96df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger
97df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenbergerstatic bool identifiersInitialized = false;
98df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger
99df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger#define ID_TESTFILE_PROPERTY            0
100df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger#define NUM_PROPERTY_IDENTIFIERS        1
101df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger
102df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenbergerstatic NPIdentifier pluginPropertyIdentifiers[NUM_PROPERTY_IDENTIFIERS];
103df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenbergerstatic const NPUTF8 *pluginPropertyIdentifierNames[NUM_PROPERTY_IDENTIFIERS] = {
104df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger    "testfile"
105df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger};
106df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger
107df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger#define ID_GETTESTFILE_METHOD                   0
108df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger#define NUM_METHOD_IDENTIFIERS                  1
109df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger
110df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenbergerstatic NPIdentifier pluginMethodIdentifiers[NUM_METHOD_IDENTIFIERS];
111df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenbergerstatic const NPUTF8 *pluginMethodIdentifierNames[NUM_METHOD_IDENTIFIERS] = {
112df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger    "getTestFile"
113df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger};
114df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger
115df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenbergerstatic void initializeIdentifiers(void)
116df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger{
117df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger    browser->getstringidentifiers(pluginPropertyIdentifierNames, NUM_PROPERTY_IDENTIFIERS, pluginPropertyIdentifiers);
118df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger    browser->getstringidentifiers(pluginMethodIdentifierNames, NUM_METHOD_IDENTIFIERS, pluginMethodIdentifiers);
119df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger}
120df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger
121df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenbergerstatic bool pluginHasProperty(NPObject *obj, NPIdentifier name)
122df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger{
123df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger    int i;
124df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger    for (i = 0; i < NUM_PROPERTY_IDENTIFIERS; i++)
125df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger        if (name == pluginPropertyIdentifiers[i])
126df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger            return true;
127df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger    return false;
128df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger}
129df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger
130df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenbergerstatic bool pluginHasMethod(NPObject *obj, NPIdentifier name)
131df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger{
132df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger    int i;
133df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger    for (i = 0; i < NUM_METHOD_IDENTIFIERS; i++)
134df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger        if (name == pluginMethodIdentifiers[i])
135df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger            return true;
136df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger    return false;
137df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger}
138df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger
139df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenbergerstatic bool pluginGetProperty(NPObject *obj, NPIdentifier name, NPVariant *variant)
140df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger{
141df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger    PluginObject *plugin = (PluginObject *)obj;
142df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger    if (name == pluginPropertyIdentifiers[ID_TESTFILE_PROPERTY]) {
143df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger        BOOLEAN_TO_NPVARIANT(true, *variant);
144df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger        return true;
145df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger    }
146df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger    return false;
147df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger}
148df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger
149df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenbergerstatic bool pluginSetProperty(NPObject *obj, NPIdentifier name, const NPVariant *variant)
150df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger{
151df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger    return false;
152df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger}
153df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger
154df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenbergerstatic bool pluginInvoke(NPObject *obj, NPIdentifier name, const NPVariant *args, uint32_t argCount, NPVariant *result)
155df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger{
156df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger    PluginObject *plugin = (PluginObject *)obj;
157df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger    if (name == pluginMethodIdentifiers[ID_GETTESTFILE_METHOD]) {
158df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger        return true;
159df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger    }
160df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger    return false;
161df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger}
162df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger
163df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenbergerstatic bool pluginInvokeDefault(NPObject *obj, const NPVariant *args, uint32_t argCount, NPVariant *result)
164df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger{
165df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger    return false;
166df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger}
167df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger
168df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenbergerstatic void pluginInvalidate(NPObject *obj)
169df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger{
170df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger    // Release any remaining references to JavaScript objects.
171df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger}
172df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger
173df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenbergerstatic NPObject *pluginAllocate(NPP npp, NPClass *theClass)
174df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger{
175df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger    PluginObject *newInstance = (PluginObject*) malloc(sizeof(PluginObject));
176df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger    newInstance->header._class = theClass;
177df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger    newInstance->header.referenceCount = 1;
178df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger
179df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger    if (!identifiersInitialized) {
180df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger        identifiersInitialized = true;
181df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger        initializeIdentifiers();
182df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger    }
183df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger
184df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger    newInstance->npp = npp;
185df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger
186df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger    return &newInstance->header;
187df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger}
188df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger
189df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenbergerstatic void pluginDeallocate(NPObject *obj)
190df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger{
191df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger    free(obj);
192df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger}
193df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger
194df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenbergerstatic bool pluginRemoveProperty(NPObject *npobj, NPIdentifier name)
195df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger{
196df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger    return false;
197df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger}
198df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger
199df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenbergerstatic bool pluginEnumerate(NPObject *npobj, NPIdentifier **value, uint32_t *count)
200df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger{
201df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger    return false;
202df8a3f31d871db25e952972c2eb346a71186e9e3Derek Sollenberger}
203