Firefox NPAPI:NPN_RequestRead的基本用法

Firefox NPAPI:NPN_RequestRead的基本用法,firefox,npapi,Firefox,Npapi,我试图理解在编写插件时应该如何使用。文档一开始看起来很清楚,但我仍然无法使插件工作到目前为止 我的目标是:使用NPAPI实现JPEG2000插件。为了有一个正确的实现,我需要使用随机访问访问JPEG2000流。在我的例子中,图像是巨大的(10000x100000RGB),但可以使用前几个字节高效地显示(多亏了多分辨率!) 据我所知,我无法让插件停止GET。我不能用。但是,我可以使用本地apache2安装,并使用以下模式调用插件: 由于seekable设置为true,因此我使用*stype=NP\

我试图理解在编写插件时应该如何使用。文档一开始看起来很清楚,但我仍然无法使插件工作到目前为止

我的目标是:使用NPAPI实现JPEG2000插件。为了有一个正确的实现,我需要使用随机访问访问JPEG2000流。在我的例子中,图像是巨大的(10000x100000RGB),但可以使用前几个字节高效地显示(多亏了多分辨率!)

据我所知,我无法让插件停止GET。我不能用。但是,我可以使用本地apache2安装,并使用以下模式调用插件:

由于
seekable
设置为
true
,因此我使用
*stype=NP\u 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的最小示例?

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

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

从,不相关的零件剥离:

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-

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;