nporuntime.h
上传用户:kjfoods
上传日期:2020-07-06
资源大小:29949k
文件大小:12k
源码类别:

midi

开发平台:

Unix_Linux

  1. /*****************************************************************************
  2.  * runtime.cpp: support for NPRuntime API for Netscape Script-able plugins
  3.  *              FYI: http://www.mozilla.org/projects/plugins/npruntime.html
  4.  *****************************************************************************
  5.  * Copyright (C) 2002-2005 the VideoLAN team
  6.  * $Id: 2ac525d39de922ee692ee3ffd4beae75126fd42a $
  7.  *
  8.  * Authors: Damien Fouilleul <damien.fouilleul@laposte.net>
  9.  *
  10.  * This program is free software; you can redistribute it and/or modify
  11.  * it under the terms of the GNU General Public License as published by
  12.  * the Free Software Foundation; either version 2 of the License, or
  13.  * (at your option) any later version.
  14.  *
  15.  * This program is distributed in the hope that it will be useful,
  16.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  17.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  18.  * GNU General Public License for more details.
  19.  *
  20.  * You should have received a copy of the GNU General Public License
  21.  * along with this program; if not, write to the Free Software
  22.  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
  23.  *****************************************************************************/
  24. #ifndef __NPORUNTIME_H__
  25. #define __NPORUNTIME_H__
  26. /*
  27. ** support framework for runtime script objects
  28. */
  29. #include <npapi.h>
  30. #include <npruntime.h>
  31. static void RuntimeNPClassDeallocate(NPObject *npobj);
  32. static void RuntimeNPClassInvalidate(NPObject *npobj);
  33. static bool RuntimeNPClassInvokeDefault(NPObject *npobj,
  34.                                         const NPVariant *args,
  35.                                         uint32_t argCount,
  36.                                         NPVariant *result);
  37. class RuntimeNPObject : public NPObject
  38. {
  39. public:
  40.     /*
  41.     ** utility functions
  42.     */
  43.     static bool isNumberValue(const NPVariant &v)
  44.     {
  45.         return NPVARIANT_IS_INT32(v)
  46.             || NPVARIANT_IS_DOUBLE(v);
  47.     };
  48.     static int numberValue(const NPVariant &v)
  49.     {
  50.         switch( v.type ) {
  51.             case NPVariantType_Int32:
  52.                 return NPVARIANT_TO_INT32(v);
  53.             case NPVariantType_Double:
  54.                 return(int)NPVARIANT_TO_DOUBLE(v);
  55.             default:
  56.                 return 0;
  57.         }
  58.     };
  59.     static char* stringValue(const NPString &v);
  60.     static char* stringValue(const NPVariant &v);
  61. protected:
  62.     void *operator new(size_t n)
  63.     {
  64.         /*
  65.         ** Assume that browser has a smarter memory allocator
  66.         ** than plain old malloc() and use it instead.
  67.         */
  68.         return NPN_MemAlloc(n);
  69.     };
  70.     void operator delete(void *p)
  71.     {
  72.         NPN_MemFree(p);
  73.     };
  74.     bool isValid()
  75.     {
  76.         return _instance != NULL;
  77.     };
  78.     RuntimeNPObject(NPP instance, const NPClass *aClass) :
  79.         _instance(instance)
  80.     {
  81.         _class = const_cast<NPClass *>(aClass);
  82.         referenceCount = 1;
  83.     };
  84.     virtual ~RuntimeNPObject() {};
  85.     enum InvokeResult
  86.     {
  87.         INVOKERESULT_NO_ERROR       = 0,    /* returns no error */
  88.         INVOKERESULT_GENERIC_ERROR  = 1,    /* returns error */
  89.         INVOKERESULT_NO_SUCH_METHOD = 2,    /* throws method does not exist */
  90.         INVOKERESULT_INVALID_ARGS   = 3,    /* throws invalid arguments */
  91.         INVOKERESULT_INVALID_VALUE  = 4,    /* throws invalid value in assignment */
  92.         INVOKERESULT_OUT_OF_MEMORY  = 5,    /* throws out of memory */
  93.     };
  94.     friend void RuntimeNPClassDeallocate(NPObject *npobj);
  95.     friend void RuntimeNPClassInvalidate(NPObject *npobj);
  96.     template <class RuntimeNPObject> friend bool RuntimeNPClassGetProperty(NPObject *npobj, NPIdentifier name, NPVariant *result);
  97.     template <class RuntimeNPObject> friend bool RuntimeNPClassSetProperty(NPObject *npobj, NPIdentifier name, const NPVariant *value);
  98.     template <class RuntimeNPObject> friend bool RuntimeNPClassRemoveProperty(NPObject *npobj, NPIdentifier name);
  99.     template <class RuntimeNPObject> friend bool RuntimeNPClassInvoke(NPObject *npobj, NPIdentifier name,
  100.                                                     const NPVariant *args, uint32_t argCount,
  101.                                                     NPVariant *result);
  102.     friend bool RuntimeNPClassInvokeDefault(NPObject *npobj,
  103.                                             const NPVariant *args,
  104.                                             uint32_t argCount,
  105.                                             NPVariant *result);
  106.     virtual InvokeResult getProperty(int index, NPVariant &result);
  107.     virtual InvokeResult setProperty(int index, const NPVariant &value);
  108.     virtual InvokeResult removeProperty(int index);
  109.     virtual InvokeResult invoke(int index, const NPVariant *args, uint32_t argCount, NPVariant &result);
  110.     virtual InvokeResult invokeDefault(const NPVariant *args, uint32_t argCount, NPVariant &result);
  111.     bool returnInvokeResult(InvokeResult result);
  112.     bool isPluginRunning()
  113.     {
  114.         return (_instance->pdata != NULL);
  115.     }
  116.     template<class T> T *getPrivate()
  117.     {
  118.         return reinterpret_cast<T *>(_instance->pdata);
  119.     }
  120.     NPP _instance;
  121. };
  122. template<class T> class RuntimeNPClass : public NPClass
  123. {
  124. public:
  125.     static NPClass *getClass()
  126.     {
  127.         static NPClass *singleton = new RuntimeNPClass<T>;
  128.         return singleton;
  129.     }
  130. protected:
  131.     RuntimeNPClass();
  132.     virtual ~RuntimeNPClass();
  133.     template <class RuntimeNPObject> friend NPObject *RuntimeNPClassAllocate(NPP instance, NPClass *aClass);
  134.     template <class RuntimeNPObject> friend bool RuntimeNPClassHasMethod(NPObject *npobj, NPIdentifier name);
  135.     template <class RuntimeNPObject> friend bool RuntimeNPClassHasProperty(NPObject *npobj, NPIdentifier name);
  136.     template <class RuntimeNPObject> friend bool RuntimeNPClassGetProperty(NPObject *npobj, NPIdentifier name, NPVariant *result);
  137.     template <class RuntimeNPObject> friend bool RuntimeNPClassSetProperty(NPObject *npobj, NPIdentifier name, const NPVariant *value);
  138.     template <class RuntimeNPObject> friend bool RuntimeNPClassRemoveProperty(NPObject *npobj, NPIdentifier name);
  139.     template <class RuntimeNPObject> friend bool RuntimeNPClassInvoke(NPObject *npobj, NPIdentifier name,
  140.                                                                       const NPVariant *args, uint32_t argCount,
  141.                                                                       NPVariant *result);
  142.     RuntimeNPObject *create(NPP instance) const;
  143.     int indexOfMethod(NPIdentifier name) const;
  144.     int indexOfProperty(NPIdentifier name) const;
  145. private:
  146.     NPIdentifier *propertyIdentifiers;
  147.     NPIdentifier *methodIdentifiers;
  148. };
  149. template<class T>
  150. static NPObject *RuntimeNPClassAllocate(NPP instance, NPClass *aClass)
  151. {
  152.     const RuntimeNPClass<T> *vClass = static_cast<RuntimeNPClass<T> *>(aClass);
  153.     return vClass->create(instance);
  154. }
  155. static void RuntimeNPClassDeallocate(NPObject *npobj)
  156. {
  157.     RuntimeNPObject *vObj = static_cast<RuntimeNPObject *>(npobj);
  158.     vObj->_class = NULL;
  159.     delete vObj;
  160. }
  161. static void RuntimeNPClassInvalidate(NPObject *npobj)
  162. {
  163.     RuntimeNPObject *vObj = static_cast<RuntimeNPObject *>(npobj);
  164.     vObj->_instance = NULL;
  165. }
  166. template<class T>
  167. static bool RuntimeNPClassHasMethod(NPObject *npobj, NPIdentifier name)
  168. {
  169.     const RuntimeNPClass<T> *vClass = static_cast<RuntimeNPClass<T> *>(npobj->_class);
  170.     return vClass->indexOfMethod(name) != -1;
  171. }
  172. template<class T>
  173. static bool RuntimeNPClassHasProperty(NPObject *npobj, NPIdentifier name)
  174. {
  175.     const RuntimeNPClass<T> *vClass = static_cast<RuntimeNPClass<T> *>(npobj->_class);
  176.     return vClass->indexOfProperty(name) != -1;
  177. }
  178. template<class T>
  179. static bool RuntimeNPClassGetProperty(NPObject *npobj, NPIdentifier name, NPVariant *result)
  180. {
  181.     RuntimeNPObject *vObj = static_cast<RuntimeNPObject *>(npobj);
  182.     if( vObj->isValid() )
  183.     {
  184.         const RuntimeNPClass<T> *vClass = static_cast<RuntimeNPClass<T> *>(npobj->_class);
  185.         int index = vClass->indexOfProperty(name);
  186.         if( index != -1 )
  187.         {
  188.             return vObj->returnInvokeResult(vObj->getProperty(index, *result));
  189.         }
  190.     }
  191.     return false;
  192. }
  193. template<class T>
  194. static bool RuntimeNPClassSetProperty(NPObject *npobj, NPIdentifier name, const NPVariant *value)
  195. {
  196.     RuntimeNPObject *vObj = static_cast<RuntimeNPObject *>(npobj);
  197.     if( vObj->isValid() )
  198.     {
  199.         const RuntimeNPClass<T> *vClass = static_cast<RuntimeNPClass<T> *>(npobj->_class);
  200.         int index = vClass->indexOfProperty(name);
  201.         if( index != -1 )
  202.         {
  203.             return vObj->returnInvokeResult(vObj->setProperty(index, *value));
  204.         }
  205.     }
  206.     return false;
  207. }
  208. template<class T>
  209. static bool RuntimeNPClassRemoveProperty(NPObject *npobj, NPIdentifier name)
  210. {
  211.     RuntimeNPObject *vObj = static_cast<RuntimeNPObject *>(npobj);
  212.     if( vObj->isValid() )
  213.     {
  214.         const RuntimeNPClass<T> *vClass = static_cast<RuntimeNPClass<T> *>(npobj->_class);
  215.         int index = vClass->indexOfProperty(name);
  216.         if( index != -1 )
  217.         {
  218.             return vObj->returnInvokeResult(vObj->removeProperty(index));
  219.         }
  220.     }
  221.     return false;
  222. }
  223. template<class T>
  224. static bool RuntimeNPClassInvoke(NPObject *npobj, NPIdentifier name,
  225.                                     const NPVariant *args, uint32_t argCount,
  226.                                     NPVariant *result)
  227. {
  228.     RuntimeNPObject *vObj = static_cast<RuntimeNPObject *>(npobj);
  229.     if( vObj->isValid() )
  230.     {
  231.         const RuntimeNPClass<T> *vClass = static_cast<RuntimeNPClass<T> *>(npobj->_class);
  232.         int index = vClass->indexOfMethod(name);
  233.         if( index != -1 )
  234.         {
  235.             return vObj->returnInvokeResult(vObj->invoke(index, args, argCount, *result));
  236.         }
  237.     }
  238.     return false;
  239. }
  240. static bool RuntimeNPClassInvokeDefault(NPObject *npobj,
  241.                                            const NPVariant *args,
  242.                                            uint32_t argCount,
  243.                                            NPVariant *result)
  244. {
  245.     RuntimeNPObject *vObj = static_cast<RuntimeNPObject *>(npobj);
  246.     if( vObj->isValid() )
  247.     {
  248.         return vObj->returnInvokeResult(vObj->invokeDefault(args, argCount, *result));
  249.     }
  250.     return false;
  251. }
  252. template<class T>
  253. RuntimeNPClass<T>::RuntimeNPClass()
  254. {
  255.     // retreive property identifiers from names
  256.     if( T::propertyCount > 0 )
  257.     {
  258.         propertyIdentifiers = new NPIdentifier[T::propertyCount];
  259.         if( propertyIdentifiers )
  260.             NPN_GetStringIdentifiers(const_cast<const NPUTF8**>(T::propertyNames),
  261.                 T::propertyCount, propertyIdentifiers);
  262.     }
  263.     // retreive method identifiers from names
  264.     if( T::methodCount > 0 )
  265.     {
  266.         methodIdentifiers = new NPIdentifier[T::methodCount];
  267.         if( methodIdentifiers )
  268.             NPN_GetStringIdentifiers(const_cast<const NPUTF8**>(T::methodNames),
  269.                 T::methodCount, methodIdentifiers);
  270.     }
  271.     // fill in NPClass structure
  272.     structVersion  = NP_CLASS_STRUCT_VERSION;
  273.     allocate       = &RuntimeNPClassAllocate<T>;
  274.     deallocate     = &RuntimeNPClassDeallocate;
  275.     invalidate     = &RuntimeNPClassInvalidate;
  276.     hasMethod      = &RuntimeNPClassHasMethod<T>;
  277.     invoke         = &RuntimeNPClassInvoke<T>;
  278.     invokeDefault  = &RuntimeNPClassInvokeDefault;
  279.     hasProperty    = &RuntimeNPClassHasProperty<T>;
  280.     getProperty    = &RuntimeNPClassGetProperty<T>;
  281.     setProperty    = &RuntimeNPClassSetProperty<T>;
  282.     removeProperty = &RuntimeNPClassRemoveProperty<T>;
  283. }
  284. template<class T>
  285. RuntimeNPClass<T>::~RuntimeNPClass()
  286. {
  287.     delete[] propertyIdentifiers;
  288.     delete[] methodIdentifiers;
  289. }
  290. template<class T>
  291. RuntimeNPObject *RuntimeNPClass<T>::create(NPP instance) const
  292. {
  293.     return new T(instance, this);
  294. }
  295. template<class T>
  296. int RuntimeNPClass<T>::indexOfMethod(NPIdentifier name) const
  297. {
  298.     if( methodIdentifiers )
  299.     {
  300.         for(int c=0; c< T::methodCount; ++c )
  301.         {
  302.             if( name == methodIdentifiers[c] )
  303.                 return c;
  304.         }
  305.     }
  306.     return -1;
  307. }
  308. template<class T>
  309. int RuntimeNPClass<T>::indexOfProperty(NPIdentifier name) const
  310. {
  311.     if( propertyIdentifiers )
  312.     {
  313.         for(int c=0; c< T::propertyCount; ++c )
  314.         {
  315.             if( name == propertyIdentifiers[c] )
  316.                 return c;
  317.         }
  318.     }
  319.     return -1;
  320. }
  321. #endif