Smart CODE | |
生成済みコードに関するオンラインガイド
|
このページでは、スマートコードの一部として生成されるさまざまなデータ構造について説明します。さらに、それらが生成済みコードの中でどのように使用されるかを、共通プログラミング
API と併せて詳しく説明します。
これらの変更の多くは、スマートコードデータ構造によって処理されます。 C では、データ構造は引数としてコールアウトルーチンに渡されます。 C++ および Java では、データ構造はコールアウトクラスの基底クラスになり、その doit() メソッドがツールキットコールバックから呼び出されます。
スマートコードデータオブジェクトは X-Designer 内部でのカスタマイズを管理しているため、X-Designer コードファイル、スタブファイル、groups_<c|cpp|java> 内のグループコードファイル、およびスマートコードヘッダーファイルだけは、コードが生成されるたびに上書きされます。これ以外のスマートコードファイルは、削除されていた場合だけ再生成され、カスタマイズの内容が変更されるたびに再構築されることはありません。
スマートコードデータ構造は、使用できる言語とツールキットのあらゆる可能な組み合わせに対応して動作するように設計されています。データ構造には C、C++ および Java のフォーマットがあり、Motif (X) コールバック、MFC (Windows) メッセージハンドラ、および AWT (Java) イベントハンドラで使用することができます。
取得/設定スマートコードを使用する場合、生のコールバックまたはイベントハンドラとしてコールアウトをプログラムする必要があります。ただし、ツールキット API からでなく、ツールキットから独立した getter および setter グループからユーザーインタフェース制御にアクセスし、変更する場合は例外です。
インターネット用および thin クライアント用スマートコードの場合、コールアウトは書き込み可能で、ネットワーク機能を提供します。このコールアウトには、ユーザー定義の precondition または postcondition ルーチンを呼び出すため、あるいはサーバーへデータを送信するルーチンやサーバーからデータを受け取るルーチンを無効にするためのフックがあります。
Public フィールド および メンバーは、ユーザーのコールアウトとハンドラ内でプログラミングすることを目的としたデータオブジェクトの要素で、次のものが含まれます。
次の定義の中で、GROUPNAME は特定のグループに割り当てられた名前で、GROUPCLASS は生成済みコード内のグループクラスの名前です。また、CALLOUTCLASS は特定のコールアウトに対応するクラスの名前です。
取得/設定スマートコードの場合、データフィールド および メソッドは、callouts_<c|cpp|java> ディレクトリ内のユーザー定義コールアウト (またはクラス内の doit メソッド) によって直接使用されます。
C |
typedef struct { char * name; AnyGroup_t * group; void * client_data; [.. private 要素を入れる] } sc_data_t; コールアウトで使用: typedef void (*UserCallbackProc)( sc_data_t *, GROUPNAME_t*, void *) |
---|---|
C++ |
class sc_data_c { public: char * getName(); sc_group_c * getGroup(); void * getClientData(); void warn( char * s); virtual void doit() = 0; [.. private 要素を入れる] }; コールアウトで使用: class CALLOUTCLASS: public sc_data_c { void doit() { GROUPCLASS * g = (GROUPCLASS*)getGroup(); } }; |
Java |
package utils_java; public abstract class SCData { public String getName() ... public SCGroup getGroup() ... public Object getClientData() ... public abstract void doit() ; } コールアウトで使用: package callouts_java; public class CALLOUTCLASS extends SCData { public void doit() { GROUPCLASS g = (GROUPCLASS)getGroup(); } } |
thin クライアント用およびインターネット用スマートコード
thin クライアント用およびインターネット用スマートコードの場合、データ構造およびクラスは、書き込み可能な doit() ルーチンおよびメソッドによって使用されます。doit() では、ユーザーの precondition および postcondition をチェックし、リモートサーバーに接続し、プログラマが無効にしている場合を除き、デフォルトの 送信、受信、およびバンドデータの範囲外ルーチンを使用してサーバーとのデータの送受信を管理します。thin クライアント用のデフォルトの送信および受信ルーチンは、インタフェースの順列化、送信、並列化、および更新を行い、上書きされるのは特殊な状況だけに限られます。インターネット用スマートコードの場合、Web から返されるデータを管理するために、プログラマが必ず受信ルーチンを作成します。送信ルーチンが提供された場合、送信されるデータは Web サーバーへ POST されます。デフォルトでは、インターネット用スマートコードでは、GET メソッドが使用されます。
C |
クライアント側 typedef struct { char * name; AnyGroup_t * group; void * client_data; int poll; [.. private 要素を入れる] } sc_stdcs_t; 生成したコールアウトで使用、および: typedef int (*ReceiveHandlerProc)( sc_stdcs_t*, sc_idata_t*) typedef int (*SendHandlerProc) ( URLConnection *,sc_stdcs_t *) typedef int (*OutOfBandHandlerProc)( sc_stdcs_t*, sc_idata_t*) サーバー側 typedef struct { char * name; AnyGroup_t * group; int poll; } sc_data_t; コールアウトで使用: |
---|---|
C++ |
クライアント側 class sc_stdcs_c: public sc_data_c { public: virtual int preconditions() = 0; virtual int postconditions() = 0; void setPollInterval( int seconds); int getPollInterval(); void doit(); [.. private 要素を入れる] // 以下、継承されたメソッド char * getName(); sc_group_c * getGroup(); void * getClientData(); void warn( char * s); }; 生成したコールアウトで使用: class CALLOUTCLASS: public sc_stdcs_c { int preconditions() { return 1; } int postconditions() { return 1; } }; および: typedef int (*ReceiveHandlerProc)( sc_stdcs_c*, sc_idata_c*) typedef int (*SendHandlerProc) ( URLConnection *,sc_stdcs_c *) typedef int (*OutOfBandHandlerProc)( sc_stdcs_c*, sc_idata_c*) サーバー側 class sc_data_c { public: char * getName(); sc_group_c * getGroup(); void setPoll( int p); int getPoll(); virtual int doit() = 0; }; class CALLOUTCLASS: public sc_data_c { public: int doit(); static CALLOUTCLASS * new_doit_callback_c(); GROUPCLASS * getGroup(); }; int CALLOUTCLASS::doit () { GROUPCLASS * g = getGroup(); return 1; } |
Java |
クライアント側 package utils_java; public abstract class SCStdCS extends SCData { public abstract boolean preconditions(); public abstract boolean postconditions(); public void setPollInterval( int seconds) ... public int getPollInterval() ... public void doit() ... } 生成したコールアウトで使用: package callouts_java; public class CALLOUTCLASS extends SCStdCS { public boolean preconditions() { return true; } public boolean postconditions() { return true; } } および: public class ReceiveHandlerClass extends SCInputDataHandler public class SendHandlerClass extends SCOutputDataHandler public class OutOfBandHandlerClass extends SCInputDataHandler 例: C または C++ のサーバー側のコードを使用する |
receive ルーチンは、次の順序で処理を行います。
送信ハンドラは、スマートコードデータオブジェクトと一緒に呼び出され、グループオブジェクトなどへのアクセスを行うことができます。また、URL の内容ヘッダーを更新し、URL の OutputStream にデータを書き込むために URLConnection オブジェクトにアクセスできます。
受信ハンドラおよびバンドデータの範囲外ハンドラは、スマートコードデータオブジェクトやインターネットデータオブジェクトと一緒に呼び出され、URL の MIME 型にアクセスできるようにして、InputStream を返します。