前のページ次のページ上に戻るホーム BREW C++ ライブラリ & GUI フレームワーク & XML ミドルウェア : SophiaFramework 4.1
SFXZIPDecoder
gzip を利用した Deflate 圧縮を解凍するためのストレージ クラスです。
#include <SFXZIPDecoder.h.hpp>
class SFXZIPDecoder : public SFXStorage;
SFMTYPEDEFCLASS(SFXZIPDecoder)

継承図

SFXZIPDecoder クラスの継承図

協調図

SFXZIPDecoder クラスの協調図

解説

SFXFile クラスや SFXTCPSocket クラスなどのストレージ クラス、SFBSource クラス、SFBAStream クラスの Deflate 圧縮されたデータを登録し、解凍したデータを取得できます。

■ SFXZIPDecoder クラスの使用手順

  1. SFXZIPDecoder クラスのインスタンスを生成します。
  2. SFXZIPDecoder::Open 関数を呼び出して、ストレージ クラス、SFBAStream クラス、SFBSource クラスの Deflate 圧縮されたデータを登録します。
  3. SFXZIPDecoder::GetStreamReader 関数を使って、入力ストリームを取得します。
  4. 通常の入力ストリームと同様に、解凍されたデータとして取得します。

例 507. gzip ファイルを解凍する方法

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

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

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

    // 読み書きモードでファイルを開く
    if ((error = _file.OpenReadOnly(SFXPath("/testdata.tar.gz")))
        == SFERR_NO_ERROR) {

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

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

                // フェッチする
                if ((error = _reader.Fetch(CALLBACK_FUNCTION(OnFetch)))
                    != SFERR_NO_ERROR) {
                    // エラーのとき
                    _reader.Release();
                }
            }
            if (error != SFERR_NO_ERROR) { 
                // エラーのとき
                _decoder.Close();
            }
        }
        if (error != SFERR_NO_ERROR) { 
            // エラーのとき
            _file.Close();
        }
    }
}

// フェッチが完了したときに呼び出されるコールバック関数
CALLBACK_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();
}

参照

SFBAStream | SFBSource

メンバ

コンストラクタ/デストラクタ
SFXZIPDecoder( Void )
SFXZIPDecoder クラスのコンストラクタです。
~SFXZIPDecoder( Void )
SFXZIPDecoder クラスのデストラクタです。
パブリック関数
SFCError AsSFBAStream( SFBAStreamSmpPtr result )
内部で管理されているストリームを SFBAStream クラスのインスタンスに変換します。
SFCError AsSFBSource( SFBSourceSmpPtr result )
内部で管理されているストリームを SFBSource クラスのインスタンスに変換します。
Void Cancel( Void )
登録したコールバックをキャンセルします。
Void Close( Void )
ストレージを閉じます。
SFBUnzipAStreamSmpConstRef GetSFBUnzipAStream( Void )
内部で管理されている SFBUnzipAStream クラスのインスタンスを取得します。
SFCError GetStreamReader( UInt32 size , SFXStreamReaderPtr result )
GetStreamReader( SFXStreamReaderPtr result )
読み込み用ストリームを取得します。
SFCError GetStreamWriter( UInt32 size , SFXStreamWriterPtr result )
GetStreamWriter( SFXStreamWriterPtr result )
【 現在、この関数は使えません。 】
SFCError Open( SFXStorageConstRef storage )
Open( SFBSourceSmpConstRef source )
Open( SFBAStreamSmpConstRef stream )
ストレージをデコーダに登録します。
SFCError Read( VoidPtr buffer , UInt32Ptr size )
読み込み用ストリームを使わずにデコーダーからデータを読み込みます。
SFCError ScheduleRead( CallbackSPP spp , VoidPtr reference )
コールバック関数を登録して読み込みをスケジュールします。
SFCError ScheduleWrite( CallbackSPP spp , VoidPtr reference )
【 現在、この関数は使えません。 】
SFCError Write( VoidConstPtr buffer , UInt32Ptr size )
【 現在、この関数は使えません。 】
CallbackSPP (SFXStorage から継承)
コールバック関数を表す型です。

SFXZIPDecoder::SFXZIPDecoder
SFXZIPDecoder クラスのコンストラクタです。
[ public, explicit ]
SFXZIPDecoder(Void);

解説

SFBUnzipAStream インターフェースは確保されません。


SFXZIPDecoder::~SFXZIPDecoder
SFXZIPDecoder クラスのデストラクタです。
[ public, virtual ]
virtual ~SFXZIPDecoder(Void);

解説

SFXZIPDecoder::Close 関数が呼び出されます。

参照

SFXZIPDecoder::Close


SFXZIPDecoder::AsSFBAStream
内部で管理されているストリームを SFBAStream クラスのインスタンスに変換します。
[ public, virtual, const ]
SFCError AsSFBAStream(
    SFBAStreamSmpPtr result   // 結果を格納するポインター
);

戻り値

  • 成功したとき : SFERR_NO_ERROR
  • ストレージがデコーダに登録されていない( SFXZIPDecoder::Open 関数を呼び出していない )とき : SFERR_INVALID_STATE
  • 引数が null のとき : SFERR_INVALID_PARAM

参照

SFBAStream


SFXZIPDecoder::AsSFBSource
内部で管理されているストリームを SFBSource クラスのインスタンスに変換します。
[ public, virtual, const ]
SFCError AsSFBSource(
    SFBSourceSmpPtr result   // 結果を格納するポインター
);

戻り値

  • 成功したとき : SFERR_NO_ERROR
  • ストレージがデコーダに登録されていない( SFXZIPDecoder::Open 関数を呼び出していない )とき : SFERR_INVALID_STATE
  • 引数が null のとき : SFERR_INVALID_PARAM
  • 変換に失敗したとき : SFERR_FAILED

解説

[Note] 注意
SFXZIPDecoder::AsSFBSource 関数の内部では SFBSourceUtil クラスが使われています。

参照

SFBSource | SFBSourceUtil


SFXZIPDecoder::Cancel
登録したコールバックをキャンセルします。
[ public, virtual ]
Void Cancel(Void);

解説

内部で使っている SFBUnzipAStream クラスのインスタンスに登録されたコールバックをキャンセルします。

参照

SFXZIPDecoder::Close | SFBUnzipAStream


SFXZIPDecoder::Close
ストレージを閉じます。
[ public ]
Void Close(Void);

解説

登録していたコールバックはキャンセルされ、内部の SFBUnzipAStream クラスのインスタンスは解放されます。

参照

SFXZIPDecoder::Cancel | SFBUnzipAStream


SFXZIPDecoder::GetSFBUnzipAStream
内部で管理されている SFBUnzipAStream クラスのインスタンスを取得します。
[ public, const ]
SFBUnzipAStreamSmpConstRef GetSFBUnzipAStream(Void);

参照

SFBUnzipAStream


SFXZIPDecoder::GetStreamReader
読み込み用ストリームを取得します。
[ public, virtual ]
SFCError GetStreamReader(
    UInt32 size                 // バッファ サイズ
    SFXStreamReaderPtr result   // 読み込み用ストリームへのポインター
);
[ public, virtual ]
SFCError GetStreamReader(
    SFXStreamReaderPtr result   // 読み込み用ストリームへのポインター
);

戻り値

  • 成功したとき : SFERR_NO_ERROR
  • 引数が null のとき : SFERR_INVALID_PARAM
  • ソースがデコーダーに登録されていない( SFXZIPDecoder::Open 関数を呼び出していない )とき : SFERR_INVALID_STATE
  • メモリ不足のとき : SFERR_NO_MEMORY

解説

読み込み用ストリームのバッファ サイズを指定することも可能です。 読み込み用ストリームは、データの種類に応じて、SFXBinaryStreamReaderSFXAnsiStringStreamReader、または SFXWideStringStreamReader クラスを使い分けます。

[Note] 注意
SFXZIPDecoder::GetStreamReader 関数を呼び出す前に、SFXZIPDecoder::Open 関数を使ってソースをデコーダーに登録する必要があります。

参照

SFXZIPDecoder::Open | SFXZIPDecoder::GetStreamWriter | SFXBinaryStreamReader | SFXAnsiStringStreamReader | SFXWideStringStreamReader


SFXZIPDecoder::GetStreamWriter
【 現在、この関数は使えません。 】
[ public, virtual ]
SFCError GetStreamWriter(
    UInt32 size                 // サイズ
    SFXStreamWriterPtr result   // 書き込み用ストリームへのポインター
);
[ public, virtual ]
SFCError GetStreamWriter(
    SFXStreamWriterPtr result   // 書き込み用ストリームへのポインター
);

解説

SFERR_UNSUPPORTED を返します。


SFXZIPDecoder::Open
ストレージをデコーダに登録します。
[ public ]
SFCError Open(
    SFXStorageConstRef storage   // 解凍するデータのストレージ
);
[ public ]
SFCError Open(
    SFBAStreamSmpConstRef stream   // 解凍するデータの SFBAStream
);
[ public ]
SFCError Open(
    SFBSourceSmpConstRef source   // 解凍するデータの SFBSource
);

戻り値

  • 成功したとき : SFERR_NO_ERROR
  • ストレージがデコーダに既に登録されているとき : SFERR_INVALID_STATE
  • 引数が null のとき : SFERR_INVALID_PARAM
  • 失敗したとき : SFERR_FAILED

解説

内部の SFBUnzipAStream クラスのインスタンスに、SFXStorageSFBAStreamSFBSource のいずれかのクラスのインスタンスを設定します。

参照

SFXStorage | SFBAStream | SFBSource | SFBUnzipAStream


SFXZIPDecoder::Read
読み込み用ストリームを使わずにデコーダーからデータを読み込みます。
[ public, virtual ]
SFCError Read(
    VoidPtr buffer   // 読み込んだデータを格納するバッファ
    UInt32Ptr size   // バッファのサイズ、読み込んだデータのサイズ
);

引数

buffer

読み込んだデータを格納するバッファを指定します。

size

関数の呼び出し時には、バッファのサイズを指定します。Read 関数が終了すると、読み込んだデータのサイズが格納されます。

戻り値

  • 成功したとき : SFERR_NO_ERROR
  • ソースがデコーダに登録されていない ( SFXZIPDecoder::Open 関数を呼び出していない ) とき : SFERR_INVALID_STATE
  • サイズが null のとき : SFERR_INVALID_PARAM
  • 再試行が必要なとき : AEE_STREAM_WOULDBLOCK

解説

[Note] 注意
SFXZIPDecoder::Read 関数を呼び出す前に、SFXZIPDecoder::Open 関数を使ってソースをデコーダーに登録する必要があります。

参照

SFXZIPDecoder::Open


SFXZIPDecoder::ScheduleRead
コールバック関数を登録して読み込みをスケジュールします。
[ public, virtual ]
SFCError ScheduleRead(
    CallbackSPP spp     // コールバック関数
    VoidPtr reference   // コールバック関数に渡すデータ
);

戻り値

  • 成功したとき : SFERR_NO_ERROR
  • ソースがデコーダに登録されていない ( SFXZIPDecoder::Open 関数を呼び出していない ) とき、またはコールバック関数が既に登録されているとき : SFERR_INVALID_STATE

解説

SFXZIPDecoder::ScheduleRead 関数は、SFXZIPDecoder::Read 関数を使ってデータ受信するコールバック関数を登録するために使います。

SFXZIPDecoder::Read 関数の戻り値が AEE_STREAM_WOULDBLOCK である場合、SFXZIPDecoder::ScheduleRead 関数でコールバック関数を登録して、再びデータ受信を試みます。

[Note] 注意
SFXZIPDecoder::ScheduleRead 関数を呼び出す前に、SFXZIPDecoder::Open 関数を使ってソースをデコーダーに登録する必要があります。

参照

SFXZIPDecoder::Read | SFXZIPDecoder::Open


SFXZIPDecoder::ScheduleWrite
【 現在、この関数は使えません。 】
[ public, virtual ]
SFCError ScheduleWrite(
    CallbackSPP spp     // コールバック関数
    VoidPtr reference   // コールバックに渡すデータ
);

解説

SFERR_UNSUPPORTED を返します。


SFXZIPDecoder::Write
【 現在、この関数は使えません。 】
[ public, virtual ]
SFCError Write(
    VoidConstPtr buffer   // 書き込むデータ
    UInt32Ptr size        // 書き込むデータのサイズ
);

解説

SFERR_UNSUPPORTED を返します。