首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >NPAPI: NPN_RequestRead的基本用法

NPAPI: NPN_RequestRead的基本用法
EN

Stack Overflow用户
提问于 2014-07-01 16:10:30
回答 1查看 56关注 0票数 0

我试图理解在编写RequestRead插件时应该如何使用NPAPI。文档最初看上去相当清楚,但到目前为止,我仍然无法使插件工作。

我的目标是:使用NPAPI实现一个JPEG 2000插件。为了有一个适当的实现,我需要使用随机访问访问JPEG 2000流。在我的例子中,图像是巨大的(100000x100000 RGB),但是可以使用前几个字节高效地显示(感谢多分辨率!)。

据我所知,我不能让插件停止获取。我不能使用在firefox中访问本地文件,因为它似乎被破坏了。但是,我可以使用本地apache2安装,并以NewStream( ...seekable=true )模式调用插件:

代码语言:javascript
复制
$ HEAD http://localhost/test.jp2 | grep Accept-Ranges
Accept-Ranges: bytes

由于seekable设置为true,所以我使用*stype = NP_SEEK创建插件。从这一点上看,我应该能够阻止GET:

代码语言:javascript
复制
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返回一个错误。我有更多的机会:

代码语言:javascript
复制
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示例吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-07-01 19:50:10

您请求的是0字节(.length = 0)。

因此Firefox将跳过这个范围。由于没有其他有效范围,因此没有实际请求,因此Firefox返回一个错误。

nsPluginStreamListenerPeer.cpp中,不相关的部分被剥离:

代码语言:javascript
复制
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- )

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24514909

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档