OrderlyクラスはOfficerクラスに登録をします。さらにOfficerはCommanderに 登録されます。Commander→Officer→Orderlyという指揮系統を通して命令が 伝達されます。
Orderlyクラスに命令を登録することで機能を利用することができるように なります。addCommandメソッドでコマンドを追加します。addCommandメソッドは 引数にKonoeCommandProcessorを 継承した命令オブジェクトをとります。命令オブジェクトを定義するためには KonoeCommandDescriptorで 命令語や引数の数・型などを指定する必要があります。
#include <ui/KonoeOrderly.hh> class KonoeSoftwareCrateOrderly : public KonoeOrderly { public : KInt createObject( KonoeCommand * cmd ); KInt deleteObject( KonoeCommand * cmd ); KInt showTarget( KonoeCommand * cmd ); KInt isOrderlyOf( void * target ); KonoeOrderly * clone( KChar * name ); void * getTarget( ); void setTarget( void * target ); };
//クラス定義の中 public : enum { CLASS_ID = KonoeCategories::DATASOURCE + KonoeDataSourceCM::CID_SOFTWARECRATE }; ... //コンストラクタの中 setClassID( CLASS_ID );などと記述します。
また、Orderlyはクラスの名前とオブジェクトの名前を持つことになります。 まずクラスの名前を定義しなければなりません。
//クラス定義の中 protected : static const KChar * classname; public : const KChar * getClassName( ) { return classname; } ... //.ccファイル中 const KChar * KonoeSoftwareCrateOrderly::classname = "SoftwareCrate";
これにより、コマンド処理系の中でこのOrderlyはSoftwareCrateという 名前で参照できるようになります。
このクラスはOrderlyの中でだけ使われます。それ故、クラス内クラスとして スコープを限定して定義をします。create(クラスオブジェクトを生成する) やhelpなどの共通的な命令は、それぞれ KonoeCreateCommandやKonoeHelpCommand として実装されています。ここではaddコマンドを定義しましょう。
#include <ui/KonoeCommandProcessor.hh> ... //クラス定義の中 class AddUnit : public KonoeCommandProcessor { public : AddUnit( KonoeCommandDescriptor * cd, KonoeOrderly * owner ); KInt execute( KonoeCommand * cmd ); };それぞれのメンバー関数の中身はKonoeSoftwareCrateOrderlyのファイルをみてください。
//クラス定義の中 enum { ARG_ADD_MODULE, N_ARG_ADD }; //addコマンドが引数を一つとることをenumで表します。 //コンストラクタの中 KonoeCommandDescriptor * cd; KonoeArgumentDescriptor * ad; cd = new KonoeCommandDescriptor( "add", N_ARG_ADD ); ad = new KonoeArgumentDescriptor( "module", STRING, NECESSARY ); ad -> setDescription( "Name of module to be installed" ); cd -> add( ad ); cd -> setDescription( "Install a software module to the crate" ); addCommand( new AddUnit( cd, this ) );これで、add命令が使えるようになりました。
引数の数をチェックするには
KInt n_arg = cmd -> getArgumentCount( );です。そして実際に引数を取り出すのは
KonoeCommandArgument * arg; arg = cmd -> getArgument( index );ここではindex番目の引数が取り出されます。この引数オブジェクトから 実際に与えられた引数文字列を取り出す場合
const KChar * val = arg -> getValue( );となります。
エラーメッセージなどの出力は、ネットワーク経由で操作される 場合などもあり、標準出力にする訳にはいきません。そのために、 KonoeCommandはその時点での出力ストリームを知っています。
ostream & os = cmd -> getOutputStream( ); os << "Error .. invalid argument : " << val << endl;などとなります。
コマンド処理系ですでに定義されたオブジェクトを取り出したい場合が あります。それらの情報はOrderlyを統括するOfficerが知っています。 そのOrderlyと同じカテゴリーのオブジェクトを知りたいのであれば
KonoeOfficer * officer = owner -> getOfficer( ); KonoeOrderly * orderly = officer -> findObject( val );
//KonoeDataSourceOfficer.ccのコンストラクタの中 registerOrderly( new KonoeSoftwareCrateOrderly( 0 ) );これで、KonoeDataSourceOfficerを雇ったコマンダーはこのOrderlyに アクセスできるようになりました。