前のページ次のページ上に戻るホーム BREW C++ ライブラリ & GUI フレームワーク & XML ミドルウェア : SophiaFramework UNIVERSE 5.0

17.3. サンプルコード

17.3.1. ファイルからメモリへの読み込み

メモリをストリームで操作するには、SFXMemory クラスを使います。

例 17.35. ファイルからメモリへの読み込み

SFCError error;               // エラー値
SFXFile file;                 // 入力ファイル
SFXBinaryStreamReader reader; // ファイル読み込み用ストリーム

SFXMemory memory;             // メモリストレージ
SFXBinaryStreamWriter writer; // メモリ書き込み用ストリーム

UInt08 c;

// ファイルをオープンする
if ((error = file.OpenReadOnly(SFXPath("/dir1/data.txt"))) == SFERR_NO_ERROR) {

    // ファイル読み込み用ストリームを取得する
    if ((error = file.GetStreamReader(1024, &reader)) == SFERR_NO_ERROR) {

        // メモリストレージをオープンする
        if ((error = memory.Open()) == SFERR_NO_ERROR) {

            // メモリ書き込み用ストリームを取得する
            if ((error = memory.GetStreamWriter(1024, &writer))
                == SFERR_NO_ERROR) {

                // ファイル読み込み用ストリームのバッファから読み込む
                if ((error = reader.Fetch()) == SFERR_NO_ERROR) {

                    // ファイル読み込み用ストリームの終端まで繰り返す
                    while (error == SFERR_NO_ERROR &
                        !reader.Ends()) {

                        // ファイル読み込み用ストリームのバッファにデータがあるとき
                        if (reader.GetReadableSize() > 0) {
                            // ファイル読み込み用ストリームからデータを 1 バイト読み込む
                            reader > c;
                            if (c != '\r' & c != '\n') { // 改行文字でなければ
                                // メモリ書き込み用ストリームに書き込む
                                writer < c;
                            }
                        }
                        else { // ファイル読み込み用ストリームのバッファにデータがないとき
                            error = reader.Fetch();
                        }
                        if (error == SFERR_NO_ERROR) {
                            if (writer.GetWritableSize() == 0) {
                                // メモリ書き込み用ストリームのバッファに空きがないとき
                                error = writer.Flush();
                            }
                        }
                    }
                    if (error == SFERR_NO_ERROR) {

                        // 終端の '\0' を書き込む
                        writer < static_cast<UInt08>('\0');

                        if ((error = writer.Flush()) == SFERR_NO_ERROR) {
                            // 書き込んだデータへのポインタを取得してデータを表示する
                            TRACE("%s", memory.GetBuffer());

                            // 結果を buffer 変数に格納する
                            SFXBuffer buffer;
                            error = memory.Close(&buffer);
                        }
                    }
                }
            }
            writer.Release();
        }
        reader.Release();
    }
    file.Close();
}

17.3.2. 画像ダウンロード

BREW ISource のデータをストリームで操作するには、SFXSource クラスを使います。

例 17.36. HTTP 通信で画像をダウンロードし、SFBImage として扱う方法

// 接続処理のコードは省略

// HTTP 接続が確立されたときに呼び出されるコールバック関数
XALLBACK_IMPLEMENT_SFXHTTPCONNECTION(MyClass, OnConnect, error)
{
    SFBSourceSmp source;
    SFXSource temp;

    if (error == SFERR_NO_ERROR) {
        if (_http.GetResultCode() == 200) {

            // コンテント部分を管理する SFBSourceSmp クラスを取得する
            if ((source = _http.GetResponseContent()) != null) {

                // SFBSourceSmp から SFXStorage への変換
                // コンテント部分のデータの管理権限は SFXHTTPConnection クラスに
                // あるので SFXSource クラスはすぐに破棄しても良い
                if (temp.Open(source) == SFERR_NO_ERROR) {
                    if (_image.SetStorage(temp) == SFERR_NO_ERROR)    {
                        // SFXSource クラスを SFBImage クラスに設定する
                    }
                }
            }
        }
    }
    return;
}

17.3.3. gzip ファイルの解凍

gzip ファイルをストリームで解凍するには、SFXZIPDecoder クラスを使います。

例 17.37. gzip ファイルの解凍

// コールバック関数で使うので、SFXZIPDecoder のインスタンスはクラスのメンバ変数にする
class MyClass {
private:
    SFXFile _file;                      // 入力ファイル
    SFXZIPDecoder _decoder;             // gzip デコーダー
    SFXAnsiStringStreamReader  _reader; // 読み込み用ストリーム
    SFXAnsiString _unzipString;         // 解凍後の文字列
public:
    Void Start(Void);

    // コールバック関数
    XALLBACK_DECLARE_SFXANSISTRINGSTREAMREADER(OnFetch)
};

Void MyClass::Start(Void)
{
    SFCError error; // エラー

    // 読み込みモードでファイルをオープンする
    if ((error = _file.OpenReadOnly(SFXPath("/testdata.tar.gz")))
        == SFERR_NO_ERROR) {

        // ファイルストレージを gzip デコーダに登録する
        if ((error = _decoder.Open(_file)) == SFERR_NO_ERROR) {

            // gzip デコーダから読み込み用ストリームを取得する
            if ((error = _decoder.GetStreamReader(&_reader))
                == SFERR_NO_ERROR) {

                // データを読み込む( データ読み込みの完了は、OnFetch 関数に通知される)
                if ((error = _reader.Fetch(XALLBACK_FUNCTION(OnFetch)))
                    != SFERR_NO_ERROR) {
                    // エラーが発生したとき
                    _reader.Release();
                }
            }
            if (error != SFERR_NO_ERROR) { 
                // エラーが発生したとき
                _decoder.Close();
            }
        }
        if (error != SFERR_NO_ERROR) { 
            // エラーが発生したとき
            _file.Close();
        }
    }
}

// データ読み込みの完了が通知されるコールバック関数
XALLBACK_IMPLEMENT_SFXANSISTRINGSTREAMREADER(MyClass, OnFetch, error)
{
    if (error == SFERR_NO_ERROR) {  
        // エラーが発生していないとき

        // 解凍したデータを _unzipString 変数に読み込む
        if ((error = _reader.ReadSFXAnsiString(&_unzipString)) == SFERR_NO_ERROR) {

            // 文字列を表示する
            TRACE("%s", _unzipString.GetCString());
        }
    }
    // 終了処理
    _decoder.Close();
    _file.Close();
}