2009年3月16日月曜日

gwt経由でリンクを開く

uGreaderでGoogleのモバイルゲートウェイ経由でfeedに埋め込まれたリンクを開くのは、どうやら無理っぽいです。(外部ブラウザを開くのは出来たと思う)

今回 webBrowserコンポーネントのNavigatingイベントを使って、リンクのクリックを捕捉して、ゲートウェイ経由で開くようにリダイレクトする処理を入れてみました


ソースはこんなです
        private void webBrowser1_Navigating(object sender, WebBrowserNavigatingEventArgs e)
{
if (m_Setting.LinkBrowesr == 2)// ゲートウェイから開くときはココ
{
if (!e.Url.ToString().StartsWith("http://www.google.co.jp/gwt/") && e.Url.Scheme.CompareTo("http") == 0)
{
string url = URL_MOBILE_GATEWAY + Uri.EscapeDataString(e.Url.ToString());
//webBrowser1.Navigate(new Uri(url));
System.Threading.Timer t = new System.Threading.Timer(new TimerCallback(webBrowser1Redirect),url,100,System.Threading.Timeout.Infinite);
e.Cancel = true;
return;
}
}
else if (m_Setting.LinkBrowesr == 1)//外部ブラウザで開くときはココ
{
if (e.Url.Scheme.CompareTo("http") == 0)
{
e.Cancel = true;
System.Diagnostics.Process.Start(e.Url.ToString(), "");
}
}
}

ゲートウェイ経由で開くときは、とりあえず開始しようとしているNavigateをe.cancelで中止します
中止しておかないと、リダイレクトしたurlとレーシングして、ゲートウェイ経由で開いた後に、通常のサイトが開かれてしまうことがありました。
Navigateを中止した後に、プログラムからgwt経由のurlをNavigateするためにThread.Timerを使ってます。

Navigatingイベント

Navigateキャンセル

gwt+urlでNavigate

って流れにします。もっとスマートな方法ないのかな...

問題は、新しくNavigateするurlを
webBrowser1.Navigate(new Uri(urlstring));
するときに
Uriクラスがurlstringを間違ったエスケープ処理をしてしまいます。new Uri(urlstring,false)としてもエスケープされるみたいです。

例えばWIRED VISIONのurlを

http://www.google.co.jp/gwt/n?oe=Shift_JIS&hl=ja&u=http%3A%2F%2Frss.rssad.jp%2Frss%2Fartclk%2FAtwtlfaOjTY8%2F074dd6249a73bfc12194e6476d8d6bcd%3Ful%3D_a3iHtjvdQVi1PZVEHOBvicDM2myPMNQFtZgzUc21LsWwugCSRNUvYfc8mTZIyAxsHdZOKKwACr2azqy55Hg6CheS8v7

として入れると

uri = {http://www.google.co.jp/gwt/n?oe=Shift_JIS&hl=ja&u=http://rss.rssad.jp/rss/artclk/AtwtlfaOjTY8/074dd6249a73bfc12194e6476d8d6bcd?ul=_a3iHtjvdQVi1PZVEHOBvicDM2myPMNQFtZgzUc21LsWwugCSRNUvYfc8mTZIyAxsHdZOKKwACr2azqy55Hg6CheS8v7

と解釈されているようで、システムエラーページに飛ばされてしまいます

0 件のコメント: