ホーム > 製品情報 > SophiaFramework UNIVERSE > チュートリアル > BREW RSS リーダー

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;
}