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