Closed
Bug 211718
Opened 21 years ago
Closed 9 years ago
Implement simple protocol handler object
Categories
(Core :: Networking, defect)
Tracking
()
RESOLVED
WONTFIX
People
(Reporter: adamlock, Assigned: adamlock)
Details
Attachments
(5 files)
3.17 KB,
text/plain
|
Details | |
2.20 KB,
text/plain
|
Details | |
16.62 KB,
text/plain
|
Details | |
6.59 KB,
patch
|
Details | Diff | Splinter Review | |
3.18 KB,
patch
|
Details | Diff | Splinter Review |
wxEmbed contains a class that makes it easy to register new protocols that return a chunk of data. The called registers a callback with a single GetData method which is called when Gecko tries to load a URI with the registered scheme. http://lxr.mozilla.org/seamonkey/source/embedding/tests/wxEmbed/GeckoProtocolHandler.h http://lxr.mozilla.org/seamonkey/source/embedding/tests/wxEmbed/GeckoProtocolHandler.cpp This should be cleaned up and wrapped in an XPCOM service and spun off into embedcomponents or necko. The callback should be renamed something like nsISimpleProtocolHandlerCallback. The RegisterHandler static method in the header should become an inline NS_RegisterSimpleProtocolHandler() which gets the simple protocol handler service and registers the supplied callback. The GetData method on nsISimpleProtocolHandlerCallback should also be supplemented or extended to allow the embedder to return an nsIInputStream object instead of a memory block.
IDL for nsISimpleProtocolHandler and nsISimpleProtocolHandlerCallback. I still have to add a getStream method to the callback for embedders who want to return a stream (e.g. a local file, or a stream they got from somewhere else).
Sample use of simple protocol handler with winEmbed. Caller gets the simple protocol handler service, registers the 'foo' scheme with a supplied callback. The callback returns some simple 'text/html' content. Patch also contains plumbing to embedcomponents to build & register it.
Doug / Darin, can I have a review on this please? Thanks
Comment 6•21 years ago
|
||
Comment on attachment 127049 [details] nsISimpleProtocolHandler.idl > * The Initial Developer of the Original Code is > * Netscape Communications Corporation. > * Portions created by the Initial Developer are Copyright (C) 1998 > * the Initial Developer. All Rights Reserved. > * > * Contributor(s): > * > * Adam Lock <adamlock@netscape.com> copyright info needs to be updated... > [noscript] void getData(in nsIURI aURI, > in nsIChannel aChannel, > out ACString aContentType, > out charPtr aData, > out unsigned long aSize); nit: fix indentation. > // TODO getStream same as above but returns an nsIInputStream seems like getStream would be sufficient. it could be scriptable even. we just need to freeze a simple byte-array input stream wrapper class. we have nsIStringInputStream, but that only really supports ASCII data. maybe: void getStream(in nsIURI aURI, out nsIInputStream aStream, out ACString aContentType, out ACString aContentCharset, out unsigned long aContentLength); why expose the channel? what can the callback do with the channel anyways? i suppose the callback might want to access the interface requestor off of the channel so it can get a prompter to use, etc. if you do expose the channel, then it seems like you don't need to have out params for content{type,charset,length} since those can just be set directly on the nsIChannel. >interface nsISimpleProtocolHandler : nsISupports >{ > /** > * Register a callback handler. The callback will be called to handle > * uris with the specified scheme. > */ > void registerHandler(in ACString aScheme, in ACString aDescription, in nsISimpleProtocolHandlerCallback aCallback); maybe you should just force the caller to give you a CID here. that would avoid the whole problem of having to invent a CID. another approach to all of this is to maybe extend nsIOService to search for simple protocol handlers in much the same was as it searches for full protocol handlers. or if we didn't want to declare nsISimpleProtocolHandler in necko, we could think about extending the mechanism used for unknown protocols (currently we look for the nsIProtocolHandler registered under the scheme "default" which is implemented by nsExternalProtocolHandler).
Thanks Darin, I'll fix the nits. Concerning the TODO, I was thinking of having two versions of getData to basically allow the client to do one of two things: a) Return a lump of memory containing the data (easy). b) Return a stream which could be anything from anywhere (more flexible). The simple protocol handler would call one and if that returns not implemented it would call the other. The client would implement the one it wants to use. My thoughts were having both would give greater choice and the second might be attractive if they want to feed out some file, or a stream from another request. Regarding the channel, I put that there so they could query it for any extra info that was passed with the request. For example, the embedding client might stuff some extra headers in there during progress notifications and use them here to determine what to do, or wish to look at some post data etc. Regarding the CID, I'm not sure it's meaningful for the embedder to supply one since it's for internal use only, to register the class factory. Perhaps I could even earmark a range of CIDs and just increment a counter with each new one to be added.
Comment 8•21 years ago
|
||
>Regarding the CID, I'm not sure it's meaningful for the embedder to supply one
>since it's for internal use only, to register the class factory. Perhaps I
>could even earmark a range of CIDs and just increment a counter with each new
>one to be added.
I agree that it is an awkward thing to expose in the API as written. That's why
I was suggesting changing things so that the IO service might query the
nsISimpleProtocolHandler (or something like it) directly before deferring to the
external protocol handler. Going this route would completely eliminate the need
to register a dummy nsIProtocolHandler with the component manager.
Picking up an old bug with a patch... Darin, I'll do your suggestion on this bug. This patch (work in progress) demonstrates how the nsIOService.cpp could check if there was a simple protocol service and ask that for an nsIProtocolHandler before looking for external handlers. I've made the appropriate changes to the simple protocol handler object interface, but I've still got to test it
Comment 10•21 years ago
|
||
hm.. this sounds like bug 234714 would be useful for this
Updated•9 years ago
|
Status: NEW → RESOLVED
Closed: 9 years ago
Resolution: --- → WONTFIX
You need to log in
before you can comment on or make changes to this bug.
Description
•