|  | // Copyright 2007, Google Inc. | 
|  | // | 
|  | // Redistribution and use in source and binary forms, with or without | 
|  | // modification, are permitted provided that the following conditions are met: | 
|  | // | 
|  | //  1. Redistributions of source code must retain the above copyright notice, | 
|  | //     this list of conditions and the following disclaimer. | 
|  | //  2. Redistributions in binary form must reproduce the above copyright notice, | 
|  | //     this list of conditions and the following disclaimer in the documentation | 
|  | //     and/or other materials provided with the distribution. | 
|  | //  3. Neither the name of Google Inc. nor the names of its contributors may be | 
|  | //     used to endorse or promote products derived from this software without | 
|  | //     specific prior written permission. | 
|  | // | 
|  | // THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED | 
|  | // WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF | 
|  | // MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO | 
|  | // EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, | 
|  | // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, | 
|  | // PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; | 
|  | // OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, | 
|  | // WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR | 
|  | // OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF | 
|  | // ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | 
|  |  | 
|  | // Modified from gears/base/npapi/plugin.h | 
|  |  | 
|  | #ifndef _H_NPObjectWrapper | 
|  | #define _H_NPObjectWrapper | 
|  |  | 
|  | #include <cstdio> | 
|  | #include "mozincludes.h" | 
|  |  | 
|  | // This is a base class for the bridge between the JavaScript engine and the plugin. | 
|  | template<class Wrapper> | 
|  | class NPObjectWrapper : public NPObject { | 
|  | public: | 
|  | // NPClass callbacks. | 
|  | static NPObject* Allocate(NPP npp, NPClass *npclass) { | 
|  | Wrapper* obj = new Wrapper(npp); | 
|  | return obj; | 
|  | } | 
|  |  | 
|  | static void Deallocate(NPObject *npobj) { | 
|  | delete static_cast<Wrapper*>(npobj); | 
|  | } | 
|  |  | 
|  | static bool Enumeration(NPObject *npobj, NPIdentifier** value, | 
|  | uint32_t *count) { | 
|  | Wrapper* obj = static_cast<Wrapper*>(npobj); | 
|  | return obj->enumeration(value, count); | 
|  | } | 
|  |  | 
|  | static bool HasMethod(NPObject *npobj, NPIdentifier name) { | 
|  | Wrapper* obj = static_cast<Wrapper*>(npobj); | 
|  | return obj->hasMethod(name); | 
|  | } | 
|  |  | 
|  | static bool Invoke(NPObject *npobj, NPIdentifier name, const NPVariant *args, | 
|  | uint32_t num_args, NPVariant *result) { | 
|  | Wrapper* obj = static_cast<Wrapper*>(npobj); | 
|  | return obj->invoke(name, args, num_args, result); | 
|  | } | 
|  |  | 
|  | static bool InvokeDefault(NPObject *npobj, const NPVariant *args, | 
|  | uint32_t num_args, NPVariant *result) { | 
|  | Wrapper* obj = static_cast<Wrapper*>(npobj); | 
|  | return obj->invokeDefault(args, num_args, result); | 
|  | } | 
|  |  | 
|  | static bool HasProperty(NPObject *npobj, NPIdentifier name) { | 
|  | Wrapper* obj = static_cast<Wrapper*>(npobj); | 
|  | return obj->hasProperty(name); | 
|  | } | 
|  |  | 
|  | static bool GetProperty(NPObject *npobj, NPIdentifier name, | 
|  | NPVariant *result) { | 
|  | Wrapper* obj = static_cast<Wrapper*>(npobj); | 
|  | return obj->getProperty(name, result); | 
|  | } | 
|  |  | 
|  | static bool SetProperty(NPObject *npobj, NPIdentifier name, | 
|  | const NPVariant *value) { | 
|  | Wrapper* obj = static_cast<Wrapper*>(npobj); | 
|  | return obj->setProperty(name, value); | 
|  | } | 
|  |  | 
|  | virtual ~NPObjectWrapper() {} | 
|  |  | 
|  | /** | 
|  | * *value must be memory allocated with NPN_MemAlloc, as the caller will call NPN_MemFree. | 
|  | */ | 
|  | virtual bool enumeration(NPIdentifier** value, uint32_t* count) { | 
|  | return false; | 
|  | } | 
|  |  | 
|  | /** | 
|  | * Caller must release the result value when it no longer needs it, | 
|  | * so implementation must return an extra refcount. | 
|  | */ | 
|  | virtual bool getProperty(NPIdentifier name, NPVariant *result) { | 
|  | return false; | 
|  | } | 
|  |  | 
|  | virtual bool hasMethod(NPIdentifier name) { | 
|  | return false; | 
|  | } | 
|  |  | 
|  | virtual bool hasProperty(NPIdentifier name) { | 
|  | return false; | 
|  | } | 
|  |  | 
|  | /** | 
|  | * Caller must release the result value when it no longer needs it, | 
|  | * so implementation must return an extra refcount. | 
|  | */ | 
|  | virtual bool invoke(NPIdentifier name, const NPVariant *args, | 
|  | uint32_t num_args, NPVariant *result) { | 
|  | return false; | 
|  | } | 
|  |  | 
|  | /** | 
|  | * Caller must release the result value when it no longer needs it, | 
|  | * so implementation must return an extra refcount. | 
|  | */ | 
|  | virtual bool invokeDefault(const NPVariant *args, uint32_t num_args, | 
|  | NPVariant *result) { | 
|  | return false; | 
|  | } | 
|  |  | 
|  | virtual bool setProperty(NPIdentifier name, const NPVariant *value) { | 
|  | return false; | 
|  | } | 
|  |  | 
|  | protected: | 
|  | NPObjectWrapper(NPP instance) : npp(instance) {} | 
|  |  | 
|  | public: | 
|  | const NPP getNPP() const { | 
|  | return npp; | 
|  | } | 
|  |  | 
|  | private: | 
|  | NPP npp; | 
|  | DISALLOW_EVIL_CONSTRUCTORS(NPObjectWrapper); | 
|  | }; | 
|  |  | 
|  | // Get the NPClass for a NPObject wrapper (the type must derive from NPObjectWrapper). | 
|  | template<class Wrapper> | 
|  | NPClass* GetNPClass() { | 
|  | static NPClass plugin_class = { | 
|  | NP_CLASS_STRUCT_VERSION, | 
|  | NPObjectWrapper<Wrapper>::Allocate, | 
|  | NPObjectWrapper<Wrapper>::Deallocate, | 
|  | NULL,  // Invalidate, | 
|  | NPObjectWrapper<Wrapper>::HasMethod, | 
|  | NPObjectWrapper<Wrapper>::Invoke, | 
|  | NPObjectWrapper<Wrapper>::InvokeDefault, | 
|  | NPObjectWrapper<Wrapper>::HasProperty, | 
|  | NPObjectWrapper<Wrapper>::GetProperty, | 
|  | NPObjectWrapper<Wrapper>::SetProperty, | 
|  | NULL,  // RemoveProperty, | 
|  | NPObjectWrapper<Wrapper>::Enumeration, | 
|  | }; | 
|  |  | 
|  | return &plugin_class; | 
|  | } | 
|  |  | 
|  | #endif // GEARS_BASE_NPAPI_PLUGIN_H__ |