はじめに
今回は、ポータルサイトのトップ画面にあるRSSリーダーと、スケジューラーに実装したメッセージャーについて書いていきます。RSSリーダーは、RSS情報を非同期で取得して、記事を表示する際は文字をスクロールさせて表示しています。メッセンジャーは、CurlのUDPソケットの機能を使用して実装しています。
これまでの記事
RSSリーダー
RSSリーダーには、主に以下の機能があります。
- ヘッドラインをティッカー表示
- ヘッドラインの一覧表示
- ヘッドラインをクリックすると目的の記事をブラウザを起動して表示
- フィードの登録・削除、記事の更新間隔・文字のスクロール速度の設定
ポータルサイトを起動すると、RSS情報を一定時間ごとに自動的にダウンロードして、記事をティッカー表示するようにしました。RSS情報をダウンロードする際は、非同期で取得するようにして、ダウンロード中に画面が固まらないようにしています。
{define-proc public {my-async-read-open p_src: Url, p_after-access-proc: {proc-type {#TextInputStream}: void}, error-proc: #{proc-type {Exception}: void} = null }: void let v_file: HttpFile = {p_src.instantiate-File} asa HttpFile {with-file-caching-style FileCachingStyle.resynchronize do let v_async-file-opener: AsyncFileOpener = {v_file.async-read-open {on t: AsyncFileOpenEvent do let v_stream: #TextInputStream = null {try {if-non-null t.exception then {if-non-null error-proc then {error-proc t.exception asa Exception} } else {if v_async-file-opener.done? and not t.canceled? then set v_stream = t.stream asa TextInputStream } {p_after-access-proc v_stream} } finally {if v_stream != null and v_stream.open? then {v_stream.close} } } } } } } ||RSS情報を非同期で取得する {my-async-read-open {url "http://rss.rssad.jp/rss/codezine/new/20/index.xml"}, {proc {p_in: #TextInputStream}: void ||取得完了したときに呼ばれる {if-non-null p_in then let (v_buf: StringBuf, v_num: int) = {p_in.read-one-string} : 省 略 : } }, error-proc = {proc {e: Exception}: void ||エラーが発生したときに呼ばれる } }