![]() ![]() ![]()
|
SophiaFramework 2.2 |
#include <SFUStream.hpp>
class SFUStream : public SFAException, public SFAStreamManipulator;
typedef SFUStream& SFUStreamRef; typedef SFUStream* SFUStreamPtr; typedef SFUStream** SFUStreamHandle; typedef const SFUStream ConstSFUStream; typedef const SFUStream& ConstSFUStreamRef; typedef const SFUStream* ConstSFUStreamPtr; typedef const SFUStream** ConstSFUStreamHandle;
SFUStream クラスは、 ストリームを表す抽象クラスです。 このクラスは、ストリームの基本機能を定義しています。
Put、Get、Seek、Tell、Available、IsEOS は、 純粋仮想関数として宣言されており、 具体的なストリームを実装する派生クラスで定義されなければなりません。
派生クラス
SFUStream の派生クラスには、 ファイル入出力を行う SFUFileStream、 メモリの読み書きを行う SFUMemoryStream、 BREW の ISource インターフェイスからの読み取りを行う SFUSourceStream、 TCP/UDP ソケットの入出力を行う SFUNetworkStream が用意されています。
また、上記の6つの関数をオーバーライドすれば、 開発者は独自にストリームを定義できます。
ストリームのエラー処理
ストリームの関数は、 エラーが発生するとエラーコードを設定します。
表 13. ストリームで使用されるエラーコード
| SFERR_STREAM_NOT_OPEN | ストリームがオープンされていません。 |
| SFERR_STREAM_ALREADY_OPEN | ストリームがすでにオープンされています。 |
| SFERR_STREAM_READ_FAILED | ストリームからデータを読み取れません。 |
| SFERR_STREAM_WRITE_FAILED | ストリームにデータを書き込めません。 |
| SFERR_STREAM_EOS | ストリームの終端に達しています。 |
| SFERR_STREAM_BUFFER_FULL | バッファ (主に書き込みバッファ) がいっぱいです。 |
| SFERR_STREAM_NO_DATA | バッファ (主に読み取りバッファ) にデータがありません。 |
| SFERR_STREAM_CANNOT_BIND | バインドできません。 |
| コンストラクタ/デストラクタ | ||
|---|---|---|
| public |
SFUStream | SFUStream クラスのコンストラクタです。 |
| public |
~SFUStream | SFUStream クラスのデストラクタです。 |
| パブリック関数 | ||
|---|---|---|
| public |
Available | ストリームの読み取りの残りデータ サイズを返します。 |
| public |
Exception (SFAException から継承) | エラーコードを取得/設定します。 |
| public |
Get | ストリームからデータを読み取ります。 |
| public |
IsEOS | 読み込みポインタがストリームが終端に達しているかどうか判定します。 |
| public |
Put | ストリームにデータを書き込みます。 |
| public |
Seek | ストリームの読み込み/書き込みポインタを移動します。 |
| public |
Tell | 現在の読み込み/書き込みポインタの位置を取得します。 |
| public |
operator<< | ストリームのインサータ (書き込み演算子) です。 |
| public |
operator>> | ストリームのエクストラクタ (読み取り演算子) です。 |
| プロテクト関数 | ||
|---|---|---|
| public |
Exception (SFAException から継承) | エラーコードを取得/設定します。 |
| protected |
endianbig | 読み込みモード/書き込みモードのエンディアンをビッグエンディアンに設定します。 |
| protected |
endianlittle | 読み込みモード/書き込みモードのエンディアンをリトルエンディアンに設定します。 |
| protected |
multi | 任意のサイズのデータを読み書きします。 |
| protected |
offset | ストリームの読み込み/書き込みポインタを指定された位置に移動します。 |
| protected |
seek | ストリームの読み込み/書き込みポインタを指定された位置に移動します。 |
| 型 | ||
|---|---|---|
| EndianEnum | ストリームのエンディアン変換を表す定数です。 | |
| NO_ERROR (SFAException から継承) | エラーがないことを表す定数です。 | |
| SeekEnum | ストリームのシークモードを表す定数です。 | |
[ public ] SFUStream(Void);
データメンバの初期化を行います。 読み込み/書き込みいずれもリトル エンディアンとして初期化されます。
[ public, virtual ] ~SFUStream(Void);
一般に派生クラスでは、デストラクタで後処理を行います。
[ public, pure-virtual ] UInt32 Available(Void);
この関数は純粋仮想関数です。 派生クラスで実装されなければなりません。
[ protected ] Void endianbig( ModeEnum mode // 読み込みモード/書き込みモード );
ストリームの読み込みまたは書き込み時のエンディアンを、 ビッグエンディアンに設定します。 この関数は、通常マニピュレータ経由で使用します。 下記の使用例を参照してください。
下記の例では、 メモリストリームに対して、 整数値をホストのエンディアン形式から ビッグエンディアン形式に変換しながら出力しています。
SFUMemoryStream mstr; mstr.Open(256); mstr << endianbig << (UInt32) 0x12345678 << (SInt16) 0xABCD;
[ protected ] Void endianlittle( ModeEnum mode // 読み込みモード/書き込みモード );
ストリームの読み込みまたは書き込み時のエンディアンを、 リトルエンディアンに設定します。 この関数は、通常マニピュレータ経由で使用します。 下記の使用例を参照してください。
下記の例では、 メモリストリームに対して、 整数値をビッグエンディアン形式からホストのエンディアン形式に変換しながら 読み込んでいます。
SFUMemoryStream mstr; ... メリストリームにデータを書き込む ... UInt32 n; SInt16 m; mstr >> endianlittle >> n >> m;
この関数は純粋仮想関数であり、 派生クラスで実装されなければなりません。
実装の仕様は派生クラスに完全に依存しますが、 次のような仕様を推奨します。
[ public, pure-virtual ] Bool IsEOS(Void);
この関数は、純粋仮想関数です。 派生クラスで実装する必要があります。
実装の仕様は派生クラスに完全に依存しますが、 次のような仕様を推奨します。
Available が 0 を返すからとって、 この関数が TRUE となるとは限らないことに注意してください。 たとえばネットワーク ストリームなど、 どれだけのデータが取得できるかあらかじめ予測できないストリームの場合、 Avaiable が 0 を返しても、 ネットワークの接続が切断されない限り IsEOS は TRUE にはなりません。
[ protected, virtual ] Void multi( VoidPtr ptr // 読み込み先のポインタ UInt32 size // 読み込むサイズ ModeEnum mode // 読み込みモードの指定 );
[ protected, virtual ] Void multi( ConstVoidPtr ptr // 書き込みデータのポインタ UInt32 size // 書き込むサイズ ModeEnum mode // 書き込みモードの指定 );
この関数は、通常マニピュレータ経由で呼び出します。 下記の使用例を参照してください。
下記の例では、ストリームから 128 バイトのデータを読み込んでいます。
BytePtr ptr = new Byte[128]; stream >> multi(ptr, 128);
[ protected, virtual ] Void offset( SInt32 offset // 現在位置からのオフセット ModeEnum mode // 読み込み/書き込みモード指定 );
この関数は Seek を呼び出すことで、ストリームの読み込み/書き込みポインタを移動します。 この関数は、通常マニピュレータ経由で呼び出します。 下記の使用例を参照してください。
下記の例では、現在のストリーム位置を 4 バイト戻ってから、 4 バイト整数を書き込んでいます。
UInt32 n = 123; stream << offset(-4) << n;
[ public, pure-virtual ] UInt32 Put( ConstVoidPtr ptr // 書き込むデータのポインタ UInt32 size // 書き込むデータのサイズ );
この関数は純粋仮想関数であり、 派生クラスで実装されなければなりません。
実装の仕様は派生クラスに完全に依存しますが、 次のような仕様を推奨します。
下記の例では、ランダムなデータを 32 バイト書き込んでいます。
BytePtr data = new Byte[32]; GETRAND(data, 32); stream.Put(data, 32);
この関数は Seek を呼び出すことで、ストリームの読み込み/書き込みポインタを移動します。 この関数は、通常マニピュレータ経由で呼び出します。 下記の使用例を参照してください。
下記の例では、現在のストリーム位置を先頭に移動します。
UInt32 n = 123; stream << seek(0) << n;
[ public, pure-virtual ] UInt32 Seek( SInt32 offset // オフセット SeekEnum dir // シークモード ModeEnum mode // 読み込み/書き込みモード );
移動量を表すオフセット値です。 負の値も指定できます。
以下のいずれかの値を指定します。
| SEEK_START (ストリームの開始位置からの移動) |
| SEEK_CURRENT (ストリームの現在位置からの移動) |
| SEEK_END (ストリームの終端位置からの移動) |
以下のいずれかの値を指定します。
| MODE_READ (読み込みモード) |
| MODE_WRITE (書き込みモード) |
この関数は純粋仮想関数であり、 派生クラスで実装されなければなりません。
実装の仕様は派生クラスに完全に依存しますが、 次のような仕様を推奨します。
[ public, pure-virtual ] UInt32 Tell( ModeEnum mode // 読み込み/書き込みモード );
この関数は純粋仮想関数であり、 派生クラスで実装されなければなりません。
実装の仕様は派生クラスに完全に依存しますが、 次のような仕様を推奨します。
enum EndianEnum {
ENDIAN_BIG = 0,
ENDIAN_LITTLE
};
enum SeekEnum {
SEEK_START = _SEEK_START,
SEEK_CURRENT = _SEEK_CURRENT,
SEEK_END = _SEEK_END
};
SFUStream のシークモード定数は、 BREW API のシークモード定数へのエイリアスです。
[ public ] SFUStreamRef operator>>( SFUAnsiStringRef str );
[ public ] SFUStreamRef operator>>( SFUWideStringRef str );
[ public ] SFUStreamRef operator>>( ACharRef ch );
[ public ] SFUStreamRef operator>>( UInt08Ref num );
[ public ] SFUStreamRef operator>>( SInt08Ref num );
[ public ] SFUStreamRef operator>>( UInt16Ref num );
[ public ] SFUStreamRef operator>>( SInt16Ref num );
[ public ] SFUStreamRef operator>>( UInt32Ref num );
[ public ] SFUStreamRef operator>>( SInt32Ref num );
[ public ] SFUStreamRef operator>>( ZeroManipSPP manip );
[ public ] SFUStreamRef operator>>( BaseManipRef manip );
[ public ] SFUStreamRef operator>>( SingleManipRef manip );
エクストラクタは各種のデータ型に対して、 内部で Get を呼び出すことで、ストリームから読み取りを行います。
数値型を引数にとるエクストラクタは、 ストリームのエンディアン変換モードに従って、 Get を呼び出してからエンディアン変換を行います。
文字列型を引数にとるエクストラクタは、 ヌル文字が出現するまで文字を読み取り、 結果の文字列を返します。 ヌル文字が現れることなくストリーム終端に達した場合は、 ストリーム終端までの文字列を返します。
マニピュレータを引数にとるエクストラクタは、 そのマニピュレータを実装している関数を呼び出します。
[ public ] SFUStreamRef operator<<( AChar ch );
[ public ] SFUStreamRef operator<<( ConstACharPtr );
[ public ] SFUStreamRef operator<<( ConstWCharPtr );
[ public ] SFUStreamRef operator<<( UInt08 num );
[ public ] SFUStreamRef operator<<( SInt08 num );
[ public ] SFUStreamRef operator<<( UInt16 num );
[ public ] SFUStreamRef operator<<( SInt16 num );
[ public ] SFUStreamRef operator<<( UInt32 num );
[ public ] SFUStreamRef operator<<( SInt32 num );
[ public ] SFUStreamRef operator<<( ZeroManipSPP manip );
[ public ] SFUStreamRef operator<<( BaseManipRef manip );
[ public ] SFUStreamRef operator<<( ConstManipRef manip );
[ public ] SFUStreamRef operator<<( SingleManipRef manip );
インサータは各種のデータ型に対して、 内部で Put を呼び出すことで、ストリームへの書き込みを行います。
数値型を引数にとるインサータは、ストリームのエンディアン変換モードに従って、 エンディアン変換を行ってから Put を呼び出します。
文字列型を引数にとるインサータは、文字列の終端までの文字に対して Put を呼び出します。しかし、文字列終端のヌル文字は出力しません。
マニピュレータを引数にとるインサータは、 そのマニピュレータを実装している関数を呼び出します。
| Copyright(C) 2003-2004 Sophia Cradle Inc., All Rights Reserved. |
![]() ![]() ![]()
|