您的位置:首页 > 其它

Cross-browser NPAPI extensions for plugin scriptability

2009-08-25 18:43 218 查看
原文出处:http://board.mozest.com/viewthread.php?tid=6759&highlight=NPAPI

这不是一个文档翻译,而是按照我个人的理解,将NPAPI extensions的使用做一简单的描述,NPAPI的基础部分我在这里就不说来

代码
NPPVpluginScriptableNPObject = 15
typedef unsigned int uint32_t;
struct NPObject;
typedef NPObject *(*NPAllocateFunctionPtr)(NPP npp, NPClass *aClass);
typedef void (*NPDeallocateFunctionPtr)(NPObject *npobj);
typedef void (*NPInvalidateFunctionPtr)(NPObject *npobj);
typedef bool (*NPHasMethodFunctionPtr)(NPObject *npobj, NPIdentifier name);
typedef bool (*NPInvokeFunctionPtr)(NPObject *npobj, NPIdentifier name,
const NPVariant *args, uint32_t argCount,
NPVariant *result);
typedef bool (*NPInvokeDefaultFunctionPtr)(NPObject *npobj,
const NPVariant *args,
uint32_t argCount,
NPVariant *result);
typedef bool (*NPHasPropertyFunctionPtr)(NPObject *npobj, NPIdentifier name);
typedef bool (*NPGetPropertyFunctionPtr)(NPObject *npobj, NPIdentifier name,
NPVariant *result);
typedef bool (*NPSetPropertyFunctionPtr)(NPObject *npobj, NPIdentifier name,
const NPVariant *value);
typedef bool (*NPRemovePropertyFunctionPtr)(NPObject *npobj,
NPIdentifier name);
struct NPClass
{
uint32_t structVersion;
NPAllocateFunctionPtr allocate;
NPDeallocateFunctionPtr deallocate;
NPInvalidateFunctionPtr invalidate;
NPHasMethodFunctionPtr hasMethod;
NPInvokeFunctionPtr invoke;
NPInvokeDefaultFunctionPtr invokeDefault;
NPHasPropertyFunctionPtr hasProperty;
NPGetPropertyFunctionPtr getProperty;
NPSetPropertyFunctionPtr setProperty;
NPRemovePropertyFunctionPtr removeProperty;
};
struct NPObject {
NPClass *_class;
uint32_t referenceCount;
/*
* Additional space may be allocated here by types of NPObjects
*/
};

具体实现:

代码
NPError NPP_GetValue(NPP instance, NPPVariable variable,void *value)
{
if(instance==NULL)
return NPERR_INVALID_INSTANCE_ERROR;
if(variable==NPPVpluginScriptableNPObject)
{
*((void**)value)=/*此处是一个NPObject实例的指针*/
return NPERR_NO_ERROR;
}
return NPERR_GENERIC_ERROR;
}

下面说一下几个回调函数的具体意义
NPAllocateFunction:NPObject实例创建函数,我感觉没什么用处,因为Gecko不会使用此函数,而实例的创建一般人不会兜个大圈子来用这个东西。
DeallocateFunction:NPObject实例释放函数,这个很重要,Gecko要使用这个函数来释放实例,只有在这里,才可以释放以前创建的NPObject实例
InvalidateFunction:NPObject实例释放之前此函数会被调用,一般来说用处不是很大
HasMethodFunction:Gecko询问plugin是否支持指定的函数,参数NPIdentifier name,需要转换成字符串
下面是当前Gecko支持的_NPNetscapeFuncs结构的头文件

npupp.rar (7.55 KB)

使用NPN_IdentifierIsString判断name是否是一个字串,如果是,再使用NPN_UTF8FromIdentifier获得这个字串,格式是UTF-8的,使用完毕后要用NPN_MemFree释放内存。如果判断是你plugin支持的函数,那么就返回true,否则返回false;
NPInvokeFunction:如果上面那个函数返回true,那么Gecko会立即调用这个函数来执行Function,通过NPIdentifier name获得函数名,NPVariant *args是参数数组,uint32_t argCount是参数个数,NPVariant *result是函数执行完毕后的返回值。NPInvokeFunction本身也有一个返回值,表示这个函数执行是否成功

代码
typedef enum {
NPVariantType_Void,
NPVariantType_Null,
NPVariantType_Bool,
NPVariantType_Int32,
NPVariantType_Double,
NPVariantType_String,
NPVariantType_Object
} NPVariantType;
typedef struct _NPVariant {
NPVariantType type;
union {
bool boolValue;
uint32_t intValue;
double_t doubleValue;
NPString stringValue;
NPObject *objectValue;
} value;
} NPVariant;

有关这个结构我就不用说了吧,一眼就能看明白
如果NPVariantType==NPVariantType_String;那么stringValue.utf8characters要使用NPN_MemAlloc来申请内存,使用完毕的NPVariant使用NPN_ReleaseVariantValue释放
以下的函数同上面的类似,就简单写
InvokeDefaultFunction:调用默认函数
HasPropertyFunction:是否有指定的属性
GetPropertyFunction:获得属性
SetPropertyFunction:设置属性
RemovePropertyFunction:移除属性
不知道我理解上是否有误差,反正我写的plugin工作还算是正常的...

最后说要说的两点就是NPObject在意义上和基本NPAPI中的NPP instance意义差不多,不过使用plugin自定义的创建和销毁函数,虽然在旧版API中NPP_New函数的argn和argv参数定义是char,但实际上是UTF-8,这也是为什么有些plugin不支持中文的缘故,字符串转换错了...
写得比较乱...还有就是event的实现,因为我没有在文档中找到可以直接使用的方法,所以我是利用扩展接口,使用XPCOM,与Gecko直接通讯的方式,实现起来稍微有点麻烦,等我以后有时间再写吧...
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐