前のページ次のページ上に戻るホーム SophiaFramework UNIVERSE 5.2

9.6. アプリケーションクラス(基礎編)

レスポンダシステムを利用するすべての BREW アプリは SFYApplication クラスを継承し、 ユーザー定義アプリケーションクラスを実装する必要があります。

SFYApplication はレスポンダではありませんが、 デフォルトで配信エンジン描画エンジンが関連付けられたルートSFZRoot)を保持します。

SFYApplication に対するレスポンダ関連の操作はデフォルトのルートSFZRoot)に委譲されます。 SFYApplication に用意された API の範囲内でアプリケーションクラスはレスポンダのように振舞います。

表 9.5. 抽象アプリケーションクラスの種類

クラス名 解説
SFYApplication アプリケーションクラスを表す抽象クラスです。

9.6.1. アプリケーションクラスを表す抽象クラス[SFYApplication]

SFYApplication は、各種アプリケーションクラスを実装するための起点(基底クラス)となります。

このクラスは、デフォルトで配信エンジン描画エンジンが関連付けられたルートを保持します。 また、以下の仮想関数のデフォルトの動作を実装します。

表 9.6. 仮想関数名とデフォルトの動作

仮想関数名 デフォルトの動作 オーバーライド
SFYApplication::HandleEvent 配信エンジンを起動し、イベントが処理された場合はさらに描画エンジンを起動※1 任意
SFYApplication::HandleRender 描画エンジンを起動し、画面を強制的に再描画※1 任意
SFCApplication::HandleError 任意
[Note] 注釈

※1.配信エンジンや描画エンジンの起動中にメモリ不足などのエラーが発生するなど致命的なエラーが発生した場合は SFCApplication::HandleError 関数を起動します。

ユーザー定義アプリケーションクラスを作成するときに最低限必要なコードを示します。

例 9.35. 宣言

SFMTYPEDEFCLASS(USRApplication)
class USRApplication: public SFYApplication {
    SFMSEALCOPY(USRApplication)
public:
    static SFCInvokerPtr Factory(Void);
private:
    explicit USRApplication(Void) static_throws;
    virtual ~USRApplication(Void);
};

例 9.36. 実装

// ブートローダ: BREW アプリで最初に実行される関数
SFCApplet::FactorySPP SFCApplet::Boot(AEECLSID id, SFXAnsiStringPtr license)
{
    // ここにライセンスコードを記述する
    *license = "heap://";

    return (id == AEECLSID_USRAPPLICATION) ? (&USRApplication::Factory): (null);
}

// ファクトリ関数: ユーザー定義アプリケーションクラスのインスタンスを生成する関数
SFCInvokerPtr USRApplication::Factory(Void)
{
    return ::new USRApplication;
}

// コンストラクタ
USRApplication::USRApplication(Void) static_throws
{
    if (static_try()) {

        // 初期化処理を記述する
    }
}

// デストラクタ
USRApplication::~USRApplication(Void)
{
    // 終了処理を記述する
}
[Caution] コンストラクタやデストラクタ内の return 文

C++ ではコンストラクタやデストラクタでは return 文を記述しません。

GCC を使う場合、コンストラクタやデストラクタ内で return 文を記述すると、 特定の継承関係になっているときにコンパイラがフリーズするバグが確認されています。

SFYApplication::HandleEvent 仮想関数と SFYApplication::HandleRender 仮想関数の実装は以下の通りです。

例 9.37. SFYApplication::HandleEvent 関数の実装

// BREW 環境からイベントを受信したときに呼び出される仮想関数
/*protected virtual */Bool SFYApplication::HandleEvent(SFXEventConstRef event)
{
    // ここに BREW 環境から受信した各種イベントの分岐処理を記述する

    SFCError  error;
    Bool      result(false);

    // 配信エンジンを起動し、トレーサを使用してイベントを配信する
    // イベントを最初に受信するのはルートに関連付けられた SFYDistributer インスタンス
    // その後、トレーサの配信規則に基づいてルートを頂点とするレスポンダツリー上のレスポンダにイベントは配信される
    // ※_root はルート(SFZRoot)
    if ((error = _root->Distribute(event, &result)) == SFERR_NO_ERROR) {

        if (result) { // ※result 引数には、イベントの配信結果が格納されている

            if (IsRenderable()) { // 画面を再描画しても良い場合(優先的イベントハンドラが登録されていない場合)

                // 描画エンジンを起動し、画面を再描画する
                error = _root->Render();
            }
        }
    }
    if (error != SFERR_NO_ERROR) {

        // 配信エンジンや描画エンジンの起動時にメモリ不足などの致命的エラーが発生した場合、HandleError() を呼び出す
        if (HandleError(event, error)) {

            result = true;
        }
    }

    return result; // イベントを処理したときは true を返し, そうでないときは false を返す

}// SFYApplication::HandleEvent //

参照: SFYResponder::Distribute | SFYResponder::Render | SFCApplication::HandleEvent | SFCApplication::IsRenderable | SFCApplication::HandleError | SFZRoot | ルート | トレーサ | 配信エンジン | 描画エンジン

例 9.38. SFYApplication::HandleRender 関数の実装

// 全画面の再描画が必要なときに呼び出される仮想関数
/*protected virtual */Bool SFYApplication::HandleRender(SFXEventConstRef event)
{
    // ここにアプリ開始時とレジューム時の全画面の再描画処理を記述する

    SFCError  error;
    Bool      result(false);

    if (IsRenderable()) { // 画面が再描画可能なら(優先的イベントハンドラが登録されていないなら)

        // 全画面を再描画する ( Render() の引数に "true" が指定されているため )
        // ※_root はルート(SFZRoot)
        if ((error = _root->Render(true)) == SFERR_NO_ERROR) {

            result = true;
        }

        // 描画エンジンの起動時にメモリ不足などの致命的エラーが発生した場合、HandleError() を呼び出す
        else if (HandleError(event, error)) {

            result = true;
        }
    }

    return result; // 全画面を再描画したときは true を返し, そうでないときは false を返す

}// SFYApplication::HandleRender //

参照: SFYResponder::Render | SFCApplication::HandleRender | SFCApplication::IsRenderable | SFCApplication::HandleError | SFZRoot | ルート | 描画エンジン

[Note] 優先的イベントハンドラ

SFXEventBypass クラスの解説を参照してください。