NPAPI: Basic usage of NPN_RequestRead

余生长醉 提交于 2019-12-25 03:58:22

问题


I am trying to understand how NPN_RequestRead should be used when writing an NPAPI plugin. The documentation looked at first pretty clear but I still cannot make the plugin work so far.

Here is my goal: implement a JPEG 2000 plugin using NPAPI. To have a proper implementation I need to access the JPEG 2000 stream using random access. In my case images are huge (100000x100000 RGB), but can efficiently be displayed using the first few bytes (thanks to multiresolution !).

As far I can tell I cannot make the plugin stop the GET. I cannot use local file access in firefox since it appears to be broken. However I can use a local apache2 installation and have the plugin be called with NPP_NewStream( ... seekable=true ) mode:

$ HEAD http://localhost/test.jp2 | grep Accept-Ranges
Accept-Ranges: bytes

Since seekable is set to true, I create the plugin with *stype = NP_SEEK. It seems that from this point I should be able to stop the GET with:

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);

However the requestread returns an error. I've had a little more chance with:

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);

But still, from the network console I can see that the entire stream has been downloaded.

Does anyone has a minimal example of a working NPAPI using the NPN_RequestRead API ?


回答1:


You're requesting 0 bytes (.length = 0).

Firefox will therefore skip the range. Since there are no other valid ranges, there are no actual requests and hence Firefox returns an error.

From nsPluginStreamListenerPeer.cpp, unrelated parts stripped:

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;

So, you'll need to actually request something!

(Admittedly, the implementation looks kinda broken/lmited, e.g. you cannot request bytes=0- with it)



来源:https://stackoverflow.com/questions/24514909/npapi-basic-usage-of-npn-requestread

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!