前のページ次のページ上に戻るホーム SophiaFramework UNIVERSE 5.3
SFXZIPDecoder
gzip を利用した Deflate 圧縮を解凍するためのストレージクラスです。
#include <SFXZIPDecoder.h.hpp>
class SFXZIPDecoder : public SFXStorage;
SFMTYPEDEFCLASS(SFXZIPDecoder)

継承図

SFXZIPDecoder クラスの継承図

協調図

SFXZIPDecoder クラスの協調図

解説

SFXZIPDecoder クラスは、 SFXFileSFXTCPSocket などのストレージや SFBSourceSFBAStream に格納された gzip による Deflate 圧縮データを解凍するときに使用します。

■ SFXZIPDecoder クラスの使用手順

  1. SFXZIPDecoder インスタンスを生成します。
  2. SFXZIPDecoder::Open 関数を呼び出して、 Deflate 圧縮されたストレージ、ストリーム、またはソースを SFXZIPDecoder ストレージに設定します。
  3. SFXZIPDecoder::GetStreamReader 関数を呼び出してストリームを取得し、 SFXZIPDecoder ストレージからデータを読み込みます(このとき、データは解凍されています)。
  4. ※ストリームを利用しない場合は、 SFXZIPDecoder::Read 関数を呼び出してデータを読み込みます。
  5. SFXZIPDecoder::Close 関数を呼び出して SFXZIPDecoder ストレージを閉じます。
[Note] 制限事項

データの読み込みだけがサポートされます。データの書き込みはサポートされません。 また、読み込み位置の移動もサポートしません。

例 862. SFXZIPDecoder クラスの使用方法

// コールバック関数で使うので、_decoder はクラスのメンバ変数にする
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 デコーダから読み込み用ストリームを取得する
            // ※ size 引数を指定していないので、ストリームバッファは可変長
            if ((error = _decoder.GetStreamReader(&_reader)) == SFERR_NO_ERROR) {

                // フェッチを行う: 実際に gzip デコーダからからストリームバッファにデータを読み込む
                // ※1. 読み込み(フェッチ)の結果は、OnFetch 関数に通知される
                // ※2. ストリームバッファは、読み込むデータのサイズに合わせて自動的に拡張される
                if ((error = _reader.Fetch(XALLBACK_INTERNAL(OnFetch))) != SFERR_NO_ERROR) {

                    // エラーのとき: OnFetch 関数は呼び出されない

                    _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) {

            // _unzipString 変数の内容をデバッグウィンドウに表示する
            TRACE("%s", _unzipString.GetCString());

            _reader.Release();
        }
    }

    // 終了処理
    _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 )
Read のスケジュールをキャンセルします。
Void Close( Void )
デコーダーを閉じます。
SFBUnzipAStreamSmpConstRef GetSFBUnzipAStream( Void )
内部で管理する SFBUnzipAStream インスタンスを取得します。
SFCError GetStreamReader( UInt32 size , SFXStreamReaderPtr result )
読み込み用ストリームを取得します。
SFCError GetStreamReader( SFXStreamReaderPtr result )
読み込み用ストリームを取得します。
SFCError GetStreamWriter( UInt32 size , SFXStreamWriterPtr result )
【現在、この関数は使えません。】
SFCError GetStreamWriter( SFXStreamWriterPtr result )
【現在、この関数は使えません。】
SFCError Open( SFXStorageConstRef storage )
ストレージ、ストリーム、またはソースを設定します。
SFCError Open( SFBAStreamSmpConstRef stream )
ストレージ、ストリーム、またはソースを設定します。
SFCError Open( SFBSourceSmpConstRef source )
ストレージ、ストリーム、またはソースを設定します。
SFCError Read( VoidPtr buffer , UInt32Ptr size )
Read(ストリームを使用しないデコーダーからのデータ読み込み)を行います。
SFCError ScheduleRead( CallbackSPP spp , VoidPtr reference )
Read(ストリームを使用しないデコーダーからのデータ読み込み)をスケジュールします。
SFCError ScheduleWrite( CallbackSPP spp , VoidPtr reference )
【現在、この関数は使えません。】
SFCError Write( VoidConstPtr buffer , UInt32Ptr size )
【現在、この関数は使えません。】
CallbackSPP (SFXStorage から継承)
ストレージクラスで使用するコールバック関数の型です。

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

解説

このコンストラクタは、何も行いません。


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

解説

このデストラクタは、 SFXZIPDecoder::Close 関数を呼び出します。

[Note] 注意

登録されていたコールバックはキャンセルされます。

参照

SFXZIPDecoder::Close


SFXZIPDecoder::AsSFBAStream
SFBAStream インスタンスに変換します。
[ public, virtual, const ]
SFCError AsSFBAStream(
    SFBAStreamSmpPtr result   // SFBAStream インスタンスへのポインタ
);

引数

result

SFBAStream インスタンスへのポインタを指定します。

戻り値

  • 成功したとき: SFERR_NO_ERROR
  • このストレージが閉じているとき: SFERR_INVALID_STATE
  • result 引数が null のとき: SFERR_INVALID_PARAM

解説

この関数は、 このストレージが内部で管理する SFBUnzipAStream インスタンスを SFBAStream インスタンスに変換します。

result 引数には、変換結果である SFBAStream インスタンスへのポインタが返ります。

[Note] 注意

この関数により、 このストレージを SFBAStream インスタンスとして扱えます。

参照

SFXZIPDecoder::Open | SFBUnzipAStream | SFBAStream


SFXZIPDecoder::AsSFBSource
SFBSource インスタンスに変換します。
[ public, virtual, const ]
SFCError AsSFBSource(
    SFBSourceSmpPtr result   // 結果を格納するポインタ
);

引数

result

SFBSource インスタンスへのポインタを指定します。

戻り値

  • 成功したとき: SFERR_NO_ERROR
  • このストレージが閉じているとき: SFERR_INVALID_STATE
  • result 引数が null のとき: SFERR_INVALID_PARAM

解説

この関数は、 このストレージが内部で管理する SFBUnzipAStream インスタンスを SFBSource インスタンスに変換します。

result 引数には、変換結果である SFBSource インスタンスへのポインタが返ります。

[Note] 注意

この関数は、内部で BREW API の BREW API ISOURCEUTIL_SourceFromAStream 関数を呼び出します。

[Note] 注意

この関数により、 このストレージを SFBSource インスタンスとして扱えます。

参照

SFXZIPDecoder::Open | SFBUnzipAStream | SFBSource | SFBSourceUtil | BREW API ISOURCEUTIL_SourceFromAStream


SFXZIPDecoder::Cancel
Read のスケジュールをキャンセルします。
[ public, virtual ]
Void Cancel(Void);

解説

この関数は、 SFXZIPDecoder::ScheduleRead 関数による Read(ストリームを使用しないデコーダーからのデータ読み込み)のスケジュールをキャンセルします。

具体的には、コールバック関数の登録をキャンセルします。

[Note] 注意

この関数は、SFXZIPDecoder::Close 関数から呼び出されます。

参照

SFXZIPDecoder::ScheduleRead | SFXZIPDecoder::Close


SFXZIPDecoder::Close
デコーダーを閉じます。
[ public ]
Void Close(Void);

解説

この関数は、このデコーダーを閉じます(このデコーダーを終了します)。

具体的には、 SFXZIPDecoder::Cancel 関数を呼び出して Read(ストリームを使用しないデコーダーからのデータ読み込み)のスケジュールをキャンセルし、 内部で管理している SFBUnzipAStream インスタンスを解放します。

[Note] 注意

登録されていたコールバックはキャンセルされます。

[Note] 注意

この関数は、SFXZIPDecoder::~SFXZIPDecoder デストラクタから呼び出されます。

[Tip] Tip

サスペンド時は、この関数を呼び出してリソースを解放します。

参照

SFXZIPDecoder::Cancel | SFXZIPDecoder::~SFXZIPDecoder | SFXZIPDecoder::Open | SFBUnzipAStream


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

戻り値

このデコーダーが内部で管理する SFBUnzipAStream インスタンス

解説

この関数は、 このデコーダーが内部で管理する SFBUnzipAStream インスタンスを取得します。

参照

SFBUnzipAStream | BREW API IUnzipAStream


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

戻り値

  • 成功したとき: SFERR_NO_ERROR
  • result 引数が null のとき: SFERR_INVALID_PARAM
  • SFXZIPDecoder::Open 関数を使用してソースをデコーダーに登録していないとき: SFERR_INVALID_STATE
  • メモリ不足のとき: SFERR_NO_MEMORY

解説

この関数は、読み込み用ストリームを取得します。

size 引数を指定する場合、ストリームバッファは指定したサイズで固定です。 指定しない場合は、ストリームバッファは可変長になり、 内部的に SFXElasticStreamReader クラスが利用されます。

[Tip] Tip
読み込み用ストリームは、読み込むデータの種類に応じて SFXBinaryStreamReaderSFXAnsiStringStreamReader、または SFXWideStringStreamReader クラスを使い分けます。
[Caution] 注意
この関数を呼び出す前に、 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::GetStreamReader


SFXZIPDecoder::Open
ストレージ、ストリーム、またはソースを設定します。
[ public ]
SFCError Open(
    SFXStorageConstRef storage   // 解凍するストレージ
);
[ public ]
SFCError Open(
    SFBAStreamSmpConstRef stream   // 解凍するストリーム
);
[ public ]
SFCError Open(
    SFBSourceSmpConstRef source   // 解凍するソース
);

戻り値

  • 成功したとき: SFERR_NO_ERROR
  • ストレージ、ストリーム、またはソースが既に設定されているとき: SFERR_INVALID_STATE
  • 引数が null のとき: SFERR_INVALID_PARAM

解説

この関数は、解凍するストレージ、ストリーム、またはソースをこのデコーダ(SFXZIPDecoder ストレージ)に設定します。

引数には、SFXStorageSFBAStream、または SFBSource インスタンスを指定できます。

この関数を実行した後、 SFXZIPDecoder::GetStreamReader 関数または SFXZIPDecoder::Read 関数を使用して gzip 形式で圧縮されたデータを解凍して読み込むことが可能です。

[Note] 注意

この関数は、内部的に SFBUnzipAStream::SetStream 関数を呼び出して、 解凍するストレージ、ストリーム、またはソースをこのデコーダ(SFXZIPDecoder ストレージ)が内部で管理する SFBUnzipAStream インスタンスのソースとして設定します。

このとき、ストレージとソースは、内部的にそれぞれ AsSFBStream 関数と SFBSourceUtil::AStreamFromSource 関数によりストリームに変換されて設定されます。

参照

SFBUnzipAStream::SetStream | SFXZIPDecoder::GetStreamReader | SFXZIPDecoder::Read | SFXZIPDecoder::Close | SFXStorage | SFBAStream | SFBSource | SFBUnzipAStream | BREW API IUNZIPASTREAM_SetStream


SFXZIPDecoder::Read
Read(ストリームを使用しないデコーダーからのデータ読み込み)を行います。
[ public, virtual ]
SFCError Read(
    VoidPtr buffer   // データを読み込むバッファ
    UInt32Ptr size   // 呼び出す前: データを読み込むバッファのサイズ。戻り値: 実際に読み込んだデータのサイズ
);

引数

buffer

データを読み込むバッファを指定します。

size

この関数を呼び出す時は、データを読み込むバッファのサイズを指定します。 この関数が戻ると、実際にバッファに読み込んだデータのサイズが格納されています。

戻り値

  • 成功したとき: SFERR_NO_ERROR
  • ソースがデコーダに登録されていないとき: SFERR_INVALID_STATE
  • size 引数が null のとき: SFERR_INVALID_PARAM
  • 再試行が必要なとき: AEE_STREAM_WOULDBLOCK

解説

この関数は、Read(ストリームを使用しないデコーダーからのデータ読み込み)を行います。

デコーダーからすべてのデータが読み込まれた場合、 この関数は SFERR_NO_ERROR を返し、かつ、 size 引数のポインタが指す場所に 0 が戻ります。

※ この関数が AEE_NET_WOULDBLOCK を返す場合、 SFXZIPDecoder::ScheduleRead 関数でコールバック関数を登録し、 コールバック関数の中で再度この関数を呼び出して Read を行う必要があります。

[Note] 注意

この関数は、 内部で SFBAStream::Read 関数を呼び出します。

[Note] 前提条件

この関数を呼び出す前に、 SFXZIPDecoder::Open 関数を呼び出して ソースをデコーダーに登録する必要があります 。

参照

SFXZIPDecoder::Open | SFXZIPDecoder::ScheduleRead | SFBAStream::Read | BREW API IUNZIPASTREAM_Read


SFXZIPDecoder::ScheduleRead
Read(ストリームを使用しないデコーダーからのデータ読み込み)をスケジュールします。
[ public, virtual ]
SFCError ScheduleRead(
    CallbackSPP spp     // コールバック関数
    VoidPtr reference   // コールバック関数に渡すデータ(参照値)
);

戻り値

  • 成功したとき: SFERR_NO_ERROR
  • ソースがデコーダに登録されていないとき、または「Read スケジュール中の状態」のとき: SFERR_INVALID_STATE

解説

この関数は、 Read(ストリームを使用しないデコーダーからのデータ読み込み)をスケジュールします。

具体的には、 SFXZIPDecoder::Read 関数による Read を行うコールバック関数を登録します。 登録されたコールバック関数は、Read が可能になると BREW AEE により呼び出されます。

コールバック関数が呼び出されるまでは、「Read スケジュール中の状態」になります。 コールバック関数が呼び出されると、この関数を呼び出す直前の状態(ソースが開いている状態)に戻ります。

コールバック関数が呼び出される前に、 SFXZIPDecoder::Cancel 関数を呼び出すと、 Read(ストリームを使用しないデコーダーからのデータ読み込み)のスケジュールはキャンセルされ、 この関数を呼び出す直前の状態(ソースが開いている状態)に戻ります。

なお、この関数の戻り値がエラー(SFERR_NO_ERROR 以外の値)の場合、コールバック関数は呼び出されません。

SFXZIPDecoder::Read 関数の戻り値が AEE_STREAM_WOULDBLOCK である場合、 この関数を使用してコールバック関数を登録し、再び Read(ストリームを使用しないデコーダーからのデータ読み込み)を試みます。

[Note] 注意

この関数は、 内部で SFBAStream::Readable 関数を呼び出します。

[Note] 前提条件

この関数を呼び出す前に、 SFXZIPDecoder::Open 関数を呼び出して ソースをデコーダーに登録しておく必要があります 。

また、既に Read がスケジュールされている場合は、SFERR_INVALID_STATE エラーが返ります。

参照

SFXZIPDecoder::Read | SFXZIPDecoder::Open | SFXZIPDecoder::Cancel | SFBAStream::Readable | SFXStorage::CallbackSPP | BREW API IUNZIPASTREAM_Readable


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

戻り値

SFERR_UNSUPPORTED

解説

【現在、この関数は使えません。】

参照

SFXStorage::CallbackSPP


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

戻り値

SFERR_UNSUPPORTED

解説

【現在、この関数は使えません。】