| // 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__ |