Smart CODE
生成済みコードに関するオンラインガイド

名前
データ構造とファイル


このページでは、スマートコードの一部として生成されるさまざまなデータ構造について説明します。さらに、それらが生成済みコードの中でどのように使用されるかを、共通プログラミング API と併せて詳しく説明します。


概要
スマートコードは、X-Designer 内部でカスタマイズできます。グループを変更し、グループ要素の追加と削除を行うことができます。ネットワーク接続用の 「カスタマイズ」プロパティと handler ルーチンも変更できます。

これらの変更の多くは、スマートコードデータ構造によって処理されます。 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 ルーチンを呼び出すため、あるいはサーバーへデータを送信するルーチンやサーバーからデータを受け取るルーチンを無効にするためのフックがあります。


形式
C データ構造のほとんどのフィールドや、C++ および Java クラスのメンバーは、非公開であるため、ここでは説明しません。これらは、独自のスマートコードを構成するために X-Designer コードファイルに使用されます。この例として、「カスタマイズ」内に設定された送信、受信、およびバンドデータの範囲外ハンドラルーチン用の関数ポインタが挙げられます。また、自身が chat() メソッドのオブジェクトとなり、コールアウトにインターネット接続可能とする移動 (transport) メンバーもあります。

Public フィールド および メンバーは、ユーザーのコールアウトとハンドラ内でプログラミングすることを目的としたデータオブジェクトの要素で、次のものが含まれます。

  • (Callback) Name
  • Group
  • Client-data
  • Poll Interval (thin クライアント用およびインターネット用のみ)

  • 次に示すデータ構造には、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++ のサーバー側のコードを使用する

    説明
    取得/設定データ構造およびクラスは、クライアント-サーバー構造に比べるととても単純です。ただし、これらの公開インタフェースを拡張できるのは、クライアントが非同期でサーバーをポーリングするために使用する PollInterval getter および setter を使用した場合に限られます。

    Name
    これは、データ構造に関連付けられたコールバックまたはメソッドの名前です。取得/設定に関しては、単一のコールアウトを使用して多数のユーザーインタフェースコールバックをそれぞれ区別してサービスを提供するときに便利です。thin クライアント用およびインターネット用の場合、Name は受信要求に対してサーバー側のどのコールアウトを呼び出す必要があるかを調べるためにサーバー側で使用されます。
    Group
    - Group フィールドおよびメソッドは、コールアウトに関連付けられたグループオブジェクトにアクセスするために使用します。グループオブジェクトは、すべてのツールキット独立型の getter および setter をコールアウトで使用できるようにするため、グループにローカルハンドルを提供するためのコードが、コールアウトスタブの一部として生成されます。
    Client Data
    現在、これは C 関数にだけ使用可能で、Xt コールバック内の client-data フィールドに対応しています。これを使用して、任意の追加データをコールアウトに渡すことができます。C++ および Java では、コールアウトクラス内のユーザーデータ用に getter ルーチンおよび setter ルーチンを提供します。
    Poll Interval
    thin クライアント用スマートコード内だけで、サーバーの非同期ポーリングのタイミングを制御するためにクライアントが使用します。これは、HTML ドキュメントのヘッダーにある REFRESH メタコマンドに類似していて、クライアント駆動型の push に似た機能を提供します。これは、サーバー側で poll フィールドまたは setPoll() メソッドを使用してポーリング間隔を設定するためのものですが、クライアントは API を使用してこの要求を取り消すことができます。
    データオブジェクトのインスタンス
    - デフォルトでは、各コールアウトは個々のデータ構造ごとに独自のインスタンスを持ちます。プログラマが 新しいインスタンスの代わりに既存のデータを返すように GetNew...() ルーチンを変更した場合、コールアウトでスマートコードデータ構造を共有することができます。
    warn メソッド
    C++ 診断は、warn メソッドで処理されます。Unix のデフォルトの warn メソッドは、標準の診断に書き込みます。Windows では、warn() を呼び出すと、AfxMessageBox() 呼び出しにより情報が表示されます。
    サーバー側のデータオブジェクト
    サーバー側のデータオブジェクトは、poll フィールド、setPoll メソッドまたは getPoll メソッドを使用してグループとポーリング間隔の設定にアクセスできます。データアーキテクチャーは、クライアント側と同じです。クライアント側では、C の場合、データオブジェクトはコールアウトに引き渡され、一方 C++ および Java の場合、データオブジェクトはサブクラスに入れられ、ユーザー定義の doit() メソッドが呼び出されます。
    precondition、postcondition および書き込み可能なインターネット用コールアウト
    thin クライアントおよびインターネットプログラミング用の生成済みコールアウトは、次の順序で処理を行います。
  • ユーザーの preconditions() ルーチンを呼び出します。これが失敗した場合 (C、C++ の場合、ゼロが返されます)、コールアウトを中止します。
  • 「カスタマイズ」ダイアログで「サーバーにプッシュ」 が選択された場合、トランスポートオブジェクトの非同期 chat() ルーチンを呼び出して戻ります。
  • 上記以外の場合、トランスポートオブジェクトの chat() ルーチンを呼び出します。このルーチンは、Internet Data オブジェクトを返します。
  • 継続ルーチンの receive() を呼び出し、このデータを処理します。

  • 非同期の chat() も、サーバーに接続するたびに receive() 継続ルーチンを呼び出します。

    receive ルーチンは、次の順序で処理を行います。

  • データがない場合は戻ります。
  • ユーザーが受信ハンドラを用意している場合、それを呼び出し、後処理を行なって戻ります。
  • 戻されたデータの MIME 型が thin クライアントコードで予定されていた専用の MIME 型に対応しない場合、ユーザーのバンドデータの範囲外ハンドラが指定されていればこれを呼び出し、指定されていないときはデフォルトのハンドラを呼び出して、標準の診断にそのデータを出力します。
  • グループオブジェクトにデータを読み込みます。
  • ユーザーの postconditions() ハンドラを呼び出し、アプリケーションがグループ制御の更新された値をチェックできるようにします。アプリケーションが失敗した場合 (C、C++ の場合、ゼロが返されます)、コールアウトを中止します。
  • サーバーの要求に従ってインタフェースを更新します。
  • 使用法
    スマートコードデータ構造およびメソッドは、コールバックを準備するために生成されるコード内に X-Designer によって作成されることになっています。この理由から、getter メソッドは 先に述べた形式で公開として定義され、一方 setter メソッドは、Poll Interval 用にドキュメント化されるだけです。

    送信ハンドラは、スマートコードデータオブジェクトと一緒に呼び出され、グループオブジェクトなどへのアクセスを行うことができます。また、URL の内容ヘッダーを更新し、URL の OutputStream にデータを書き込むために URLConnection オブジェクトにアクセスできます。

    受信ハンドラおよびバンドデータの範囲外ハンドラは、スマートコードデータオブジェクトやインターネットデータオブジェクトと一緒に呼び出され、URL の MIME 型にアクセスできるようにして、InputStream を返します。

    スマートコードデータ構造を設定する方法の例は、X-Designer メインコードファイルに格納されています。ここでは、スマートコードコールバックは個々の制御ごとに設定されます。コールアウトと送信および受信ハンドラ内のコメントにもコード例が生成されます。コードの実例は、スマートコード応答スクリプトを実行すると作成され、これによってインタフェースが作成され、作業コールアウトが生成されます。最後に、thin クライアント用およびインターネット用スマートコードの「カスタマイズ」ダイアログで GoLive! @ 指定を使用すると、コントロールから更新または読み取りを行う実コードが生成されます。
    関連項目
    グループデータオブジェクトインターネットデータURL 接続入力ストリームと出力ストリーム送信ハンドラ受信ハンドラバンドデータの範囲外ハンドラ