実施nsIProtocolHandlerとデ
質問
私形成のための試みが行われているnsIProtocolHandler実施にご利用いただけます:standardとexpress。(もちろん、IInternetProtocol前に成功し、いいこと"と、暮らしの中の安らFireFoxんどろ風mikiモデルを作ってみたにインターネット以下のように変更しました。) 感謝 dゲ プロジェクトは、何らかのリンクをTInterfacedObject魔法のnsISupportsプロジェクトでは、私ができるDLLとnsIModuleまた、nsIFactoryまた、私nsIProtocolHandlerの時、私nsIChannel/nsIHttpChannelのがあります。
時のデバッグ用firefox.exe っていくことが大事だと思い、私はマイライブラリが読み込まれNewURIが呼び出され、NewChannelが呼び出され、過オブジェクトを実装したnsIChannelと nsIHttpChannel.
これは私が破していった。いうことになっているコOnStartRequestとOnDataAvailableのnsIStreamListenerを取得しままで戻ってからの制御AsyncOpenもいなかったのでしょうかを制のスレッドAsyncOpenと呼ばれた。
私たデバッグと自作のラッパデフォルトのhttp扱っと CreateInstanceByContractID('@mozilla.org/network/protocol;1?name=http',
...).いものに包まれたリスナーに渡されます。奇しくも、いOnStartRequestとOnDataAvailableばれるよう 後 私のチャネルのラッパー金型、同一のねじになります。がいくつかの場合はhttpのチャンネルではないん包は、どのようなケースで生(同じスレッド)どのような制するリスナー?私は戸惑.付かない。
たっての主要開発者のd-マンプロジェクトであっせんに応じます。
また、いま知っblurb下 語ページをMDCにnsIProtocolHandler?)
(Ohそしてもう一つ、そのきっかけをつくっていきた知"の生活がより簡単"だけからは継承しnsBaseChannel可能です。その点を追加するFireFoxプロトコルハンドラを既存のデプロジェクトのコアです。)
更新: っかり読んで記 こちらの どの"ストリームのリスナーの方法 と呼ばれるスレッドを呼asyncOpen[...]"が発生する可能性があるなというから、"グループ、なければならない。があるというXPCOMトリック?思いが読みになるかも知れませんが)より多いのでfirefoxソースの前に取得します。
解決
私は考えていませんMozillaコーディングがここにいるにすぎないことが分かる。
非同期でオープンします。データ 供給を、指定されたストリーム リスナーが用意されていませんでした。の ストリームリスナーのメソッド呼び出される のスレッドを呼asyncOpenと て呼び出されませんでasyncOpen に戻ります。まasyncOpenを返します 成功のチャンネルを約束する 話を少なくともonStartRequestと onStopRequest.
などのプロトコル腕を実装するチャンネルオブジェクトにリダイレクトするチャンネルオブジェクトでは、消費者のチャンネル電話ビジネス開発プロセスの使用 asyncOpen()
.である非同期通話せることを考えを返し制御の消費者を直ちに、いかにコールバックでの荷重のデータです。
私にはわかれば、何の意味がないと思い制御のスレッドAsyncOpenと呼ばれた。 スレッドが作成され、消費者のプロトコル、開いたままになっています。
まasyncOpenを返しますし、 チャネルが向上のための そのものまで生きていれ onStopRequestにaListenerすることはない onChannelRedirect.
以来、asyncOpenを返します制御権のチャンネルそのもののニーズにいきどこかということです。
宿のコード例は、このcodaseは非常に便利です。見 nsIProtocolHandler や nsIChannel.を用いた ビューソースのプロトコル (この実装が古いが、関係ありません).
nsViewSourceHandler
実装のカスタムします。
nsViewSourceHandler::NewChannel(nsIURI* uri, nsIChannel* *result)
{
nsresult rv;
nsViewSourceChannel* channel;
rv = nsViewSourceChannel::Create(nsnull, NS_GET_IID(nsIChannel), (void**)&channel);
if (NS_FAILED(rv)) return rv;
rv = channel->Init(uri);
if (NS_FAILED(rv)) {
NS_RELEASE(channel);
return rv;
}
*result = NS_STATIC_CAST(nsIViewSourceChannel*, channel);
return NS_OK;
}
こちらの nsViewSourceChannel
's AsyncOpen:
nsViewSourceChannel::AsyncOpen(nsIStreamListener *aListener, nsISupports *ctxt)
{
NS_ENSURE_TRUE(mChannel, NS_ERROR_FAILURE);
mListener = aListener;
/*
* We want to add ourselves to the loadgroup before opening
* mChannel, since we want to make sure we're in the loadgroup
* when mChannel finishes and fires OnStopRequest()
*/
nsCOMPtr<nsILoadGroup> loadGroup;
mChannel->GetLoadGroup(getter_AddRefs(loadGroup));
if (loadGroup)
loadGroup->AddRequest(NS_STATIC_CAST(nsIViewSourceChannel*,
this), nsnull);
nsresult rv = mChannel->AsyncOpen(this, ctxt);
if (NS_FAILED(rv) && loadGroup)
loadGroup->RemoveRequest(NS_STATIC_CAST(nsIViewSourceChannel*,
this),
nsnull, rv);
if (NS_SUCCEEDED(rv)) {
mOpened = PR_TRUE;
}
return rv;
}
とにかく、長く曲がりくねったのか、どのようすを作成する。