RSS リーダー 〜 HTTP と XML の BREW C++ プログラミング 〜
HTTP 通信
SFXHTTPConnection クラス
HTTP 通信は SFXHTTPConnection クラスを使います。
SFXHTTPConnection インスタンスの宣言
class SubscriptionWindow : public SFRTitleWindow { private: ... SFXHTTPConnection _http; // HTTP 接続用 SFXAnsiStringStreamReader _reader; // データ受信用ストリーム SFXAnsiString _xml; // 受信したデータを溜める文字列 ... // HTTP 接続確立時のコールバック関数の宣言 CALLBACK_DECLARE_SFXHTTPCONNECTION(ConnectCallback) // HTTP データ受信時のコールバック関数の宣言 CALLBACK_DECLARE_SFXBINARYSTREAMREADER(FetchCallback) }
HTTP 接続確立
error = _http.Open(); // 最初に、Open 関数を呼び出す if (error == SFERR_NO_ERROR) { error = _http.SetMethod("GET"); if (error == SFERR_NO_ERROR) { // Connect 関数を呼び出して接続を開始する // 第 1 引数は URL 文字列 // 第 2 引数は接続確立を通知するコールバック関数 error = _http.Connect(url, CALLBACK_FUNCTION(ConnectCallback)); if (error == SFERR_NO_ERROR) { // ダイアログの外枠の長方形を設定 rectangle.Set(SFXGraphics::GetDeviceRectangle()); rectangle.Deflate(10, 100); // "接続中..." ダイアログを表示 connectingDialog = ::new SFRMessageDialog(rectangle, "接続中...", ""); if (connectingDialog != null && static_try()) { // キー入力を受け付けないようにする static_throw( connectingDialog->RegisterHandler(SFEVT_KEY, HANDLER_AFTER, HANDLER_NULL)); } } } }
ConnectCallback コールバック関数
ConnectCallback は、接続が確立したときに実行されるコールバック関数です。
接続が確立すると、読み取りストリームを取得し、Fetch 関数を呼び出し、データを受信します。Fetch 関数でコールバック関数 FetchCallback を登録します。
CALLBACK_IMPLEMENT_SFXHTTPCONNECTION(SubscriptionWindow, ConnectCallback, error) { if (error == SFERR_NO_ERROR) { // 読み取りストリームを取得 error = _http.GetStreamReader(1024, &_reader); if (error == SFERR_NO_ERROR) { // データを受信する error = _reader.Fetch(CALLBACK_FUNCTION(FetchCallback)); } } return; }
FetchCallback コールバック関数
FetchCallback は、データを受信したときに実行されるコールバック関数です。
受信した文字列はストリームから ReadSFXAnsiString 関数で読み込みます。受信するデータがまだある場合、Fetch 関数でコールバック関数 FetchCallback を登録します。
CALLBACK_IMPLEMENT_SFXBINARYSTREAMREADER(SubscriptionWindow, FetchCallback, error) { SFRResponderPtr dialog; SFXAnsiString string; if (error == SFERR_NO_ERROR) { // 文字列を読み取り _reader.ReadSFXAnsiString(&string); // 読み取った文字列を _xml の末尾に加える _xml += string; if (_reader.Ends() && _reader.GetReadableSize() == 0) { // 受信終了 _http.Close(); // SFXHTTPConnection の終了処理 // 受信した文字列 _xml を解析する // 前面のダイアログを検索 dialog = SFRApplication::GetInstance()->GetFront(TYPE_WINDOW); if (dialog != null) { // ダイアログを閉じる dialog->Invoke(SFXEvent(SREVT_RESPONDER_TERMINATE, SRP16_TERMINATE_INVOKE, true)); } // 再描画 SFRApplication::GetInstance()->Invoke( SFXEvent(SREVT_RESPONDER_RENDER, SRP16_RENDER_INVOKE, true)); } else { // 受信するデータがまだある場合 _reader.Fetch(CALLBACK_FUNCTION(FetchCallback)); } } return; }