我试图理解在编写RequestRead插件时应该如何使用NPAPI。文档最初看上去相当清楚,但到目前为止,我仍然无法使插件工作。
我的目标是:使用NPAPI实现一个JPEG 2000插件。为了有一个适当的实现,我需要使用随机访问访问JPEG 2000流。在我的例子中,图像是巨大的(100000x100000 RGB),但是可以使用前几个字节高效地显示(感谢多分辨率!)。
据我所知,我不能让插件停止获取。我不能使用在firefox中访问本地文件,因为它似乎被破坏了。但是,我可以使用本地apache2安装,并以NewStream( ...seekable=true )模式调用插件:
$ HEAD http://localhost/test.jp2 | grep Accept-Ranges
Accept-Ranges: bytes由于seekable设置为true,所以我使用*stype = NP_SEEK创建插件。从这一点上看,我应该能够阻止GET:
NPError NPP_NewStream(NPP instance, NPMIMEType type, NPStream* stream, NPBool seekable, uint16_t* stype)
[...]
NPByteRange range;
range.offset = 0;
range.length = 0;
range.next = NULL;
NPError e = s_pBrowserFunctions->requestread(stream, &range);但是,requestread返回一个错误。我有更多的机会:
int32_t NPP_Write(NPP instance, NPStream* stream, int32_t offset, int32_t len, void* buffer)
[...]
NPByteRange range;
range.offset = 0;
range.length = 0;
range.next = NULL;
NPError e = s_pBrowserFunctions->requestread(stream, &range);但是,从网络控制台我仍然可以看到整个流已经被下载了。
有人有使用NPN_RequestRead API的最小的NPAPI示例吗?
发布于 2014-07-01 19:50:10
您请求的是0字节(.length = 0)。
因此Firefox将跳过这个范围。由于没有其他有效范围,因此没有实际请求,因此Firefox返回一个错误。
从nsPluginStreamListenerPeer.cpp中,不相关的部分被剥离:
int32_t requestCnt = 0;
for (NPByteRange * range = aRangeList; range != nullptr; range = range->next) {
// XXX zero length?
if (!range->length)
continue;
// ...
requestCnt++;
}
// ...
*numRequests = requestCnt;
// ...
if (numRequests == 0)
return NS_ERROR_FAILURE;所以,你需要实际要求一些东西!
(不可否认,这个实现看起来有点坏/不完整,例如您不能用它请求bytes=0- )
https://stackoverflow.com/questions/24514909
复制相似问题