ホーム > デベロッパ > BREW プログラミング入門 > HTTP ネットワークプログラミング > - 3 / 3 -

HTTP ネットワークプログラミング 3 / 3

SFXHTTPConnection クラス

SFXHTTPConnection は HTTP プロトコルが使いやすくカプセル化されている SophiaFramework のクラスです。

SophiaFramework によるアプリ

最初に、"Push Select Key... " を表示します。
セレクトキーが押されると、通信が開始します。
通信が終了すると、受け取ったデータを表示します。

SFXHTTPConnection を使う準備

アプリケーションクラスでは、 SFXHTTPConnection クラスのほかに、通信ストリームへのポインタ SFXAnsiStringStreamReader、バッファとなる文字列 SFXAnsiString の変数を追加します。

通信が終了したときや、ストリームにデータを読み込んだときに呼び出されるコールバック関数も定義します。

■アプリケーションクラスの宣言

SFMTYPEDEFCLASS(SFHttpApp)
class SFHttpApp : public SFRApplication {
    SFMSEALCOPY(SFHttpApp)
    private:
        SFXHTTPConnection _http;
        SFXAnsiStringStreamReader _reader;
        SFXAnsiString _string;

    public:
        static SFCInvokerPtr Factory(Void);
    private:
        explicit SFHttpApp(Void) static_throws;
        virtual ~SFHttpApp(Void);
        HANDLER_DECLARE_VOIDRENDER(SFHttpApp, OnRenderContent)
        HANDLER_DECLARE_BOOLEVENT(SFHttpApp, OnKey)
        CALLBACK_DECLARE_SFXHTTPCONNECTION(HttpNotify)
        CALLBACK_DECLARE_SFXSTREAMREADER(SourceNotify)
};

SFXHTTPConnection の使い方

セレクトキーが押されると、通信を開始します。コールバック関数を登録し、通信メソッドを設定します。

さらに URL を指定して Connect 関数を呼び出せば、通信が始まります。

// キー ハンドラ
HANDLER_IMPLEMENT_BOOLEVENT(SFHttpApp, OnKey, event)
{
    switch (event.GetP16()) {
        case AVK_SELECT:
            _string = "";
            _http.Open();
            _http.SetMethod("GET");
            _http.Connect(ACCESS_URL, CALLBACK_FUNCTION(HttpNotify));
            return true;
    }
    return false;
}

HttpConnection の通知コールバック

通信が終了すると、コールバック関数が呼ばれます。

通信が成功した場合に、コールバック関数を登録し、ストリームからデータを読み込みます。

// HttpConnection の通知コールバック
CALLBACK_IMPLEMENT_SFXHTTPCONNECTION(SFHttpApp, HttpNotify, error)
{
    if (error == SFERR_NO_ERROR) {
        // HTTP レスポンスが取得できた場合
        _http.GetStreamReader(1024, &_reader);
        TRACE(">> pre Fetch...");
        _reader.Fetch(CALLBACK_FUNCTION(SourceNotify));
    }
    else {
        TRACE(">> HTTP NOTIFY ERROR.");
    }
    return;
}

SFXAnsiStringStreamReader クラスを使用したデータの読み込み

SFXAnsiStringStreamReader クラスは、通信ストリームを AnsiString として読み込むためのクラスです。

Fetch 関数を呼ぶと、クラス内部にデータを読み込み、準備ができるとコールバック関数を呼びます。

この関数は、読み込みが終了するとウインドウを画面に描画します。

// SFXAnsiStringStreamReader の通知コールバック
CALLBACK_IMPLEMENT_SFXSTREAMREADER(SFHttpApp, SourceNotify, error)
{
    if (error == SFERR_NO_ERROR) {
        while (_reader.GetReadableSize()) {
            SFXAnsiString temp;
            _reader >> temp;
            _string += temp;
        }
        if (_reader.Ends()) {
            TRACE(">> end source");
            _http.Close();

            ::new MyWindow(GetContentWorld(), _string);
            // responder のコンテント領域 (描画領域) を再描画する
            Invoke(SFXEvent(SREVT_RESPONDER_RENDER, SRP16_RENDER_INVOKE, false));
        }
        else {
            // 再度データを取得する
            TRACE(">> pre Refetch...");
            _reader.Fetch(CALLBACK_FUNCTION(SourceNotify));
        }
    }
    else {
        TRACE(">> SOURCE NOTIFY ERROR");
    }
    return;
}