ホーム > デベロッパ > SophiaFramework > BREW C++ 逆引きコード集

BREW C++ プログラミング 逆引きコード集 : プログラム全般

C++ で作成されたBREW アプリで、アプリ終了や例外処理などのプログラム全般の処理を行う方法です。
SophiaFramework を用いています。

HTTP / HTTPS 通信の行う方法

SFXHTTPConnection クラスを利用してHTTP / HTTPS 通信を行います。

// HTTP / HTTPS 通信に必要な SFXHTTPConnection クラスのインスタンス _http は
// クラスのメンバ変数として定義する
class MyClass {
private:
    SFXHTTPConnection _http;
    SFXAnsiStringStreamReader _reader;
    SFXAnsiString _receivedString;
public:
    Void Start(Void);
    CALLBACK_DECLARE_SFXHTTPCONNECTION(OnConnect)
    CALLBACK_DECLARE_SFXANSISTRINGSTREAMREADER(OnFetch)
};

Void MyClass::Start(Void)
{
    SFCError error(SFERR_NO_ERROR);

    // HTTP 接続の初期化を行う
    if ((error = _http.Open()) == SFERR_NO_ERROR) {
    
        // HTTP リクエスト メソッドを "GET" に設定する
        // 設定省略時は "GET" となる
        _http.SetMethod("GET");

        // 接続を開始する
#if 1
        // HTTP 接続の場合
        if ((error = _http.Connect("http://www.example.com/",
                         CALLBACK_FUNCTION(OnConnect))) == SFERR_NO_ERROR) {
#else
        // HTTPS 接続の場合: 
        //     ※ サーバー証明書が使用するCA証明書が携帯端末に標準搭載
        //          されていない場合、CA証明書を追加する必要がある
        //                                     [下記『関連情報』参照]
        //             
        // 必要に応じて検証モードを設定する
        _http.SetTrustMode(SSL_TRUST_MODE_FAIL);
        if ((error = _http.Connect("https://www.example.com/",
                         CALLBACK_FUNCTION(OnConnect))) == SFERR_NO_ERROR) {
#endif
            ...
        }
    }

    if (error != SFERR_NO_ERROR) {
        // エラーが発生したとき
        _http.Close();
    }
    return;
}

// 接続が完了すると呼び出されるコールバック関数
CALLBACK_IMPLEMENT_SFXHTTPCONNECTION(MyClass, OnConnect, error)
{
    SFXPropertyConstPtr header;
    SInt16 i;

    if (error == SFERR_NO_ERROR) {
        
        // 各種パラメータを表示する

        // HTTP ステータス コードを取得する
        TRACE("result code = %d", _http.GetResultCode());
        // HTTP レスポンス ヘッダーの Content-Length フィールドを取得する
        TRACE("content length = %d", _http.GetLength()); 
        // HTTP レスポンス ヘッダーの Content-Type フィールドを取得する
        TRACE("content type = %s", _http.GetType().GetCString());
        // HTTP レスポンス ヘッダーの Content-Encoding フィールドを取得する
        TRACE("content encoding = %s", _http.GetEncoding().GetCString());
        // HTTP レスポンス ヘッダーの Date フィールドを取得する
        TRACE("date = %s", 
              _http.GetDate().Format("YYYY/MM/DD hh:mm:ss").GetCString());
        // HTTP レスポンス ヘッダーの Expires フィールドを取得する
        TRACE("expires = %s", 
              _http.GetExpires().Format("YYYY/MM/DD hh:mm:ss").GetCString());
        // HTTP レスポンス ヘッダーの Last-Modified フィールドを取得する
        TRACE("last modified = %s",
         _http.GetLastModified().Format("YYYY/MM/DD hh:mm:ss").GetCString());

        
        // HTTP レスポンス ヘッダーを取得する
        header = &_http.GetResponseHeader();
        
        // HTTP レスポンス ヘッダーをすべて表示する
        for (i = 0; i < header->GetSize(); ++i) {
            TRACE("%s: %s", header->GetKey(i).GetCString(), 
                  header->GetValue(i).GetCString());
        }

        if (_http.GetResultCode() == 200) {

            // データ受信用ストリームを取得する
            if ((error = _http.GetStreamReader(1024, &_reader))
                == SFERR_NO_ERROR) {

                // フェッチ(データ受信)する
                // データ受信が完了すると、OnFetch 関数に通知される
                if ((error = _reader.Fetch(CALLBACK_FUNCTION(OnFetch)))
                    == SFERR_NO_ERROR) {
                    ...
                }
            }
        }
        else {
            error = SFERR_INVALID_STATE;
        }
    }

    if (error != SFERR_NO_ERROR) {
        // エラーが発生したとき
       _http.Close();
    }
    return;
}

// フェッチ(データ受信)が完了したときに呼び出されるコールバック関数
CALLBACK_IMPLEMENT_SFXANSISTRINGSTREAMREADER(MyClass, OnFetch, error)
{
    SFXAnsiString string;

    if (error == SFERR_NO_ERROR) {

        // データ受信用ストリームからデータを取得する
        if ((error = _reader.ReadSFXAnsiString(&string)) == SFERR_NO_ERROR) {

            // 断片化されたデータを結合する
            if ((error = _receivedString.Add(string)) == SFERR_NO_ERROR) {

                // 残りのデータをチェックする
                if (_reader.Ends()) {

                    // すべてのデータが受信できたので表示する
                    TRACE("--------");
                    TRACE("%s", _receivedString.GetCString());
                    TRACE("--------");

                    // 明示的にリソースを解放する
                    _reader.Release();
                    _http.Close();
                }
                else {

                    // フェッチ(データ受信)する
                    // データ受信が完了すると、OnFetch 関数に通知される
                    error = _reader.Fetch(CALLBACK_FUNCTION(OnFetch));
                }
            }
        }
    }

    if (error != SFERR_NO_ERROR) {
        // エラーが発生したとき
        _reader.Release();
        _http.Close();
    }
    return;
      

独自にルート証明書を追加して https 通信を行う方法

https 通信を行うとき、サーバ証明書が使用するCA証明書が SSLROOTCERTS クラスに含まれない場合、BREW アプリ側で独自にルート証明書を追加する必要があります。

SophiaFramework UNIVERSE では、以下のようにして https 通信を行います。

  1. SFBX509Chain インスタンスを生成します。
  2. SFXFile , SFXPath , SFXBinaryStreamReader , SFXBuffer クラスを使って、DERエンコードされたCA証明書をバイナリデータとして読み込みます。
  3. SFBX509Chain::AddCert 関数を呼び出して、[1] で生成した SFBX509Chain インスタンスにWEBOPT_X509_ROOT_CERTS (ルート認証機関の証明書) として [2] で読み込んだ証明書(バイナリ形式)をセットします。
  4. SFXHTTPConnection::Open 関数を呼び出して https 通信をオープンします。
  5. SFXHTTPConnection::SetTrustMode 関数を呼び出して、認証モードを "SSL_TRUST_MODE_FAIL" に設定します。
  6. SFXHTTPConnection インスタンスが内部に保持する SFBWeb インスタンスを取得します。
  7. SFBWeb::AddOpt 関数を呼び出して、SFBWeb インスタンスにWEBOPT_DEFAULTSとして[1]で生成した SFBX509Chain インスタンスを追加します。
  8. SFXHTTPConnection::Connect 関数を呼び出して、https 接続を行い、以下 https プロトコルでデータ通信を行います。
  9. 最後に、SFXHTTPConnection::Close 関数を呼び出して https 通信をクローズします。

具体的なコードについては、下記のサンプルコードをご覧ください。

サンプルコードダウンロード( httpsapp.zip: 21.3kb )

(注)CA証明書読み込み時のバッファ(  SFXBuffer )および SFBX509Chain インスタンスを明示的に解放する場合は、SFXHTTPConnection::Close 関数呼出し後に行わなければいけません。そのため、CA証明書の読み込みおよび SFBX509Chain インスタンスの生成は、SFXHTTPConnection::Open 関数呼び出し前に行うことを推奨します。
      

BREW センタープッシュ (SMS) により BREW アプレットを起動するには …

BREW センタープッシュ (SMS) による BREW アプレットの起動は、SFEVT_APP_MESSAGE (EVT_APP_MESSAGE) イベントを受信し、そのイベントハンドラの中で目的とする BREW アプレットを起動することにより実現可能です。

このとき、SFEVT_APP_MESSAGE (EVT_APP_MESSAGE) イベントは、標準トレーサに「配信条件:なし」の配信ルールで登録されていますので、ルートを含めレスポンダに配信されません。

このイベントは、『標準トレーサに「配信条件:なし」で配信規則が登録されているイベントの取得方法』にあるように、アプリケーションクラスのコンストラクタ内でSFYDistributer から受信します。
 
SFEVT_APP_MESSAGE (EVT_APP_MESSAGE) イベントのハンドラでは、目的とする BREW アプレットを起動する処理を記述します。

サンプルコードダウンロード( smsdemosf.zip: 7.93kb )

// コンストラクタ
smsdemosf::smsdemosf(Void) static_throws
{
    // 開始イベントのハンドラを登録します。
    if (static_try()) {
        static_throw(RegisterHandler(
            SFXEventRange(SFEVT_APP_START, SFEVT_APP_START, SFP16_BEGIN, SFP16_END),
            XANDLER_INTERNAL(OnAppStart)
        ));
    }

    // 描画イベントのハンドラを登録します。
    if (static_try()) {
        static_throw(RegisterHandler(
            SFXEventRange(SFEVT_RESPONDER_RENDER, SFEVT_RESPONDER_RENDER, SFP16_RENDER_REQUEST, SFP16_RENDER_REQUEST),
            XANDLER_INTERNAL(OnRenderRequest)
        ));
    }

    // SMS メッセージイベントのハンドラを "配信クラス" に登録します。
    if (static_try()) {
        SFYDistributerPtr distributer = GetDistributer();
        if (distributer != null) {
            static_throw(distributer->RegisterHandler(
                SFXEventRange(SFEVT_APP_MESSAGE, SFEVT_APP_MESSAGE, SFP16_BEGIN, SFP16_END),
                XANDLER_INTERNAL(OnAppMessage)
            ));
        }
    }
}

// 開始ハンドラ
XANDLER_IMPLEMENT_VOIDSTART(smsdemosf, OnAppStart, invoker, environment)
{
    // 未使用変数のワーニングを回避します。

    unused(invoker);

    // ここにアプリケーション開始時の処理を記述します。

    // 起動引数から SMS メッセージを取り出します。
    _message = environment->pszArgs;

    // 再描画を要求します。
    Invalidate();

    return;
}


// 描画ハンドラ
XANDLER_IMPLEMENT_VOIDRENDER(smsdemosf, OnRenderRequest, invoker, reason, graphics)
{
    // 未使用変数のワーニングを回避します。

    unused(invoker);
    unused(reason);

    // ここに描画時の処理を記述します。

    // 画面にメッセージを描画します。
    graphics->DrawSingleText(_message.GetCString(), GetLocalBound(), SFXRGBColor(0x00, 0x00, 0x00, 0x00));
    return;
}


// SMS メッセージ ハンドラ
XANDLER_IMPLEMENT_VOIDEVENT(smsdemosf, OnAppMessage, invoker, event)
{
    // 未使用変数のワーニングを回避します。

    unused(invoker);

    // ここに SMS メッセージ受信時の処理を記述します。

    TRACE("## SFEVT_APP_MESSAGE ##");
    if (event.GetP32() != null) {

        ACharConstPtr message;
        message = reinterpret_cast<ACharConstPtr>(event.GetP32());

        // SMS メッセージを表示
        TRACE("## SMS Message = %s ##", message);

        SFBShellSmp shell;
        if ((shell = SFBShell::GetInstance()) != null) {

            // メッセージをアプリケーションの起動引数として渡します。
            if (shell->StartAppletArgs(AEECLSID_SMSDEMOSF, message) != SFERR_NO_ERROR) {

                // 起動失敗時のエラー処理を記述します
                // ...

            }
        }
    }
    return;
}
      

BREW コールバック関数の登録と呼び出し(JPEG 画像データを読み込んで表示する方法)

BREW ネイティブのコールバック関数を登録し、呼び出すためのサンプルコードです。

ファイルストレージまたはメモリストレージに保存された JPEG 画像データを読み込んで表示するコードを以下に記します。

BREW の仕様では、JPEG 画像データの表示処理は、ファイルストレージまたはメモリストレージに保存された JPEG 画像データの読み込みが完了したときに呼び出されるコールバック関数内に記述する必要があります。

ファイルストレージまたはメモリストレージに保存された JPEG 画像データを読み込むためのストリームは、 SFBImage::SetStream() 関数を使って設定します。

コールバック関数は SFBImage::Notify() 関数を使って登録します。

なお、コールバック関数を登録する SFBImage 型のインスタンス変数は jpegreader クラスの変数として登録します。メンバ関数などローカル変数として登録すると、スマートポインターで管理されるため変数スコープから外れたときに、メモリは自動的に解放され、コールバック関数が呼び出されません。

また、コールバック関数の実体は、ダミーのコールバック関数内から呼び出されます。コールバック関数の登録では、ダミーのコールバック関数を登録します。

■クラスの定義

SFMTYPEDEFCLASS(jpegreader)
class  : public SFYApplication {
    SFMSEALCOPY(jpegreader)
private:
    SFBImageSmp _image;
public:
    static SFCInvokerPtr Factory(Void);
private:
    explicit jpegreader(Void) static_throws;
    virtual ~jpegreader(Void);
    SFCError LoadImage(SFXPathConstRef path);
    SFCError ExampleDirectFile(SFXFilePtr file); 
    SFCError ExampleThroughMemory(SFXFilePtr file, UInt32 size);
    XANDLER_DECLARE_BOOLEVENT(OnKey)
   
    // コールバック関数の実体
    Void OnImage(Void);  
    // ダミーのコールバック関数
    friend Void read_finished(VoidPtr, IImage*, AEEImageInfo*, SIntN);  
};

※注意:
1.JPEG 画像データを読み込む変数 _image は、クラス変数として定義します。JPEG 画像データを読み込むためのメンバ関数 LoadImage() 内のローカル変数として定義すると、JPEG 画像データの読み込み完了時に自動的に解放されるため、JPEG 画像を表示するためのダミーのコールバック関数 read_finished() が呼び出されません。

2.JPEG 画像を表示するためのダミーのコールバック関数 read_finished()は、friend 関数として定義します。

3.JPEG 画像を表示する実際の処理は、jpegreader::OnImage() 関数に記述します。このメンバ関数は、ダミーのコールバック関数 read_finished() から呼び出されます。

■クラスの実装

// パスから JPEG 画像データを読み込む
SFCError jpegreader::LoadImage(SFXPathConstRef path)
{
    SFXFile   file;
    UInt32    size;
    SFCError  error(SFERR_NO_ERROR);

    if ((_image = SFBImage::NewInstance(AEECLSID_JPEG, &error)) != null) {

        if ((error = file.OpenReadOnly(path)) == SFERR_NO_ERROR) {

            if ((error = file.GetSize(path, &size)) == SFERR_NO_ERROR) {

                // ファイルストレージから JPEG 画像を読み込む場合
                // ExampleDirectFile(&file);  

                // メモリストレージから JPEG 画像を読み込む場合
                ExampleThroughMemory(&file, size);
             }
        }
    }
    return error;
}

// ファイルストレージから JPEG 画像データを読み込む
SFCError jpegreader::ExampleDirectFile(SFXFilePtr file)
{
    // ダミーのコールバック関数を登録する
    _image->Notify((PFNIMAGEINFO)read_finished, this);

    // ファイルストレージのストリームを設定する
    return _image->SetStream(*file);
}

// メモリストレージから JPEG 画像データを読み込む
SFCError jpegreader::ExampleThroughMemory(SFXFilePtr file, UInt32 size)
{
    SFXBuffer  buffer;
    VoidPtr    ptr;
    SFXMemory  memory;
    SFCError   error(SFERR_NO_ERROR);

    if (size > 0) {

        if ((error = buffer.SetSize(size)) == SFERR_NO_ERROR) {

            ptr = buffer.Detach();

            if ((error = file->Read(ptr, &size)) == SFERR_NO_ERROR) {

                if ((error = buffer.Attach(ptr, size)) ==SFERR_NO_ERROR) {

                    if ((error = memory.Open(buffer)) == SFERR_NO_ERROR) {

                        // ダミーのコールバック関数を登録する
                        _image->Notify((PFNIMAGEINFO)read_finished, this);

                        // メモリストレージのストリームを設定する
                        error = _image->SetStream(memory);
                    }
                }
            }
        }
    }
    else {
        error = SFERR_FAILED;
    }
    return error;
}

// 実際のコールバック関数(実体:  JPEG 画像を描画する)
Void jpegreader::OnImage(Void)
{
    SFXRectangle  rx;
    AEEImageInfo  info;

    rx.Set(GetLocalBound());

    _image->GetInfo(&info);

    //  JPEG 画像を描画する
    _image->Draw((rx.GetWidth()-info.cx)/2, (rx.GetHeight()-info.cy)/2);

    return;
}

// ダミーのコールバック関数(PFNIMAGEINFO 型)
Void read_finished(VoidPtr reference, IImage* /* image*/, AEEImageInfo* /* info*/, SIntN /* error*/)
{
    // 実際のコールバック関数を呼び出す
    static_cast<jpegreaderPtr>(reference)->OnImage();

    return;
}

※注意:
4.JPEG 画像表示処理の実体は、ダミーのコールバック関数 read_finished() から呼び出される実際のコールバック関数 jpegreader::OnImage() 内に実装します。

5.JPEG 画像データを読み込むためのファイルストレージまたはメモリストレージを SFBImage::SetStream() 関数を使って設定し、SFBImage::Notify() 関数を使ってダミーのコールバック関数 read_finished() を登録します。

サンプルコードダウンロード( jpegreader.zip: 99.7kb )

□関連情報:BREW FAQ : JPEG 形式で保存した画像ファイルを読み込むには

      

UNIVERSE アプリをフルスクリーンモード対応にする方法

■概要
ルート( SFZRoot )に設定する描画エンジンの初期化時( SFYRenderer::Initialize 関数呼び出し時)にパラメーターとしてレスポンダ空間を渡します。 このとき、SFBDisplay::SetPrefs 関数などを利用して携帯電話端末のフルスクリーン領域をレスポンダ空間に設定することが可能です。

■mif ファイルの設定など 
SFBDisplay::SetPrefs 関数を使うためには、mif ファイルの AEEPRIVID_DISPSETTINGS 特権の設定が必要です。 この特権は、mif エディタで「依存ファイル」のタブを選択し、BREW SDK のインクルードファイルに含まれている外部クラス 「DISPSETTINGS (0x0103081D)」 を追加する必要があります。

なお、フルスクリーンモードはシミュレーターでは対応していません。動作確認は実機で行う必要があります。 また、フルスクリーンモードに対応していない機種も存在します。

■レスポンダ空間としてフルスクリーン領域を設定するコード
ウィンドウ、ダイアログ、メニューやフレームを配置する汎用ルート[SFZRoot]の実装コードと異なる点は太字の部分だけです。

SFCError USRApplication::Make(Void)
{
  SFCError error(SFERR_NO_ERROR);

  // 配信エンジンを作成する
  error = _distributer.Initialize();
  if (error == SFERR_NO_ERROR) {

     // SFBDisplay インターフェースを取得する
    if ((graphics = SFXGraphics::GetInstance()) != null) {
          display = graphics->GetSFBDisplay();

      // 携帯画面サイズを変更 (ピクトあり、フルスクリーン)
      if ((error = display->SetPrefs("a:1,w:*,h:*")) 
           == SFERR_NO_ERROR) {
           display->ResetClipRect();

        // 描画エンジンを作成する
        // SFBDisplay::SetPrefs 関数で設定したフルスクリーン領域が
        //レスポンダ空間として設定される
        error = _renderer.Initialize(SFXGraphics::GetDeviceRectangle());
        if (error == SFERR_NO_ERROR) {

          // ルートを作成する
          if ((_root = SFZRoot::NewInstance(&error)) != null) {

            // ルートに配信エンジンを登録する
            _root->SetDistributer(&_distributer);

            // ルートに描画エンジンを登録する
            _root->SetRenderer(&_renderer);

            // レスポンダ空間上にルートの実領域を設定する
            _root->SetRealBound(_root->GetSuitableBound());

            // ルートの状態を「可視+活性+操作可能+フォーカス」
            // にまとめて設定する
            _root->SetState(true, true, true, true);
          }
        }
      }
    }
  }
  return error;
}

■レスポンダ空間
レスポンダ空間とは、 描画エンジンに関連付けられたレスポンダツリーを描画する画面上の矩形領域のことです。

SFYRenderer::Initialize 関数を利用して描画エンジンを初期化するときに設定します。 レスポンダ空間設定後は、動的に拡大したり縮小したりできません。
多くの場合、レスポンダ空間として画面の全領域を設定します。

サンプルコードダウンロード( fullscreen.zip : 40.3kb )

---------------------------------------------------------------------------------------------------------
SFYApplication を継承するアプリケーションのフルスクリーン対応:

SFYApplication がデフォルトで保持するルート( SFZRoot )のレスポンダ空間をフルスクリーン対応にするには、以下のコードをアプリケーションクラスのコンストラクタに追加すれば、フルスクリーン対応が可能です。

// アプリケーションクラスのコンストラクタ
USRApplication::USRApplication(Void) static_throws
{
  SFXGraphicsPtr  graphics;
  SFBDisplaySmp   display;
  SFBBitmapSmp   bitmap;
  AEEBitmapInfo    info = {0};
  SFYRendererPtr renderer;
  SFZRootSmp      root;
  SFCError            error(SFERR_NO_ERROR);

  // レスポンダシステムの初期化
  if ((graphics = SFXGraphics::GetInstance()) != null) {
    display = graphics->GetSFBDisplay();

    // 携帯画面サイズを変更する (ピクトあり、フルスクリーン)
    if ((error = display->SetPrefs("a:1,w:*,h:*")) == SFERR_NO_ERROR) {
        display->ResetClipRect();

      if ((bitmap = display->GetDeviceBitmap()) != null) {
        bitmap->GetInfo(&info);

        if ((renderer = GetRenderer()) != null) {

          // 描画エンジンを初期化する
          renderer->Initialize(SFXRectangle(0, 0, 
                                            static_cast<SInt16>(info.cx), 
                                            static_cast<SInt16>(info.cy)));

          if ((root = static_pointer_cast<SFZRoot>(GetRoot())) != null) {
            // ルートの領域を再設定する
            root->SetRealBound(root->GetSuitableBound());
          }
        }
      }
    }
  }

  // その他、初期化処理を記述する

  return error;
}

サンプルコードダウンロード( fullscreen_sfy.zip : 40.1kb )

      

UNIVERSE アプリからバイナリ形式の BREW アプリを起動する方法

UNIVERSE アプリからバイナリ形式の BREW アプリを起動するサンプルコードは、UNIVERSE 開発ライセンス保守契約を締結されており、かつ機密保持にご同意いただけるお客様に限定して公開させていただいております。

※ ひとつのアプリから複数の BREW アプリを呼び出せますが、mif ファイルは1つしか持てません。

      

標準トレーサに「配信条件:なし」で配信規則が登録されている BREW 定義イベントの取得方法

標準トレーサに『配信条件 : なし[SFYTracer::STATE_NONE]』で配信規則が登録されている BREW 定義イベントは、 SFYApplication クラスがデフォルトで保持するルート( SFZRoot )を含めレスポンダには配信されません。

これは標準トレーサの規則が SFYDistributer インスタンスに登録されているからです。

このイベントを取得するには、SFYDistributer インスタンスに直接ハンドラを登録する必要があります。

具体的には以下の方法で取得します。

1. SFYApplication::GetDistributer 関数を利用して SFYDistributer クラスのインスタンスを取得します。

2. SFYDistributer::RegisterHandler 関数を利用してこのイベントのハンドラを登録します。

3. このハンドラは、どこのクラスに定義してもかまいませんが、レスポンダへの登録時とは異なり、invoker パラメーターは null として呼び出されます。 invoker パラメーターを使用するときは注意が必要です。

      

ラッパー クラスの作成方法

BREW インターフェースには、ISHELL_CreateInstance() 関数でインスタンスを生成するインターフェース、IQI_QueryInterface() 関数でインスタンスを生成するインターフェース、 他の BREW インターフェースによってインスタンスを生成するインターフェースの 3 種類があります。

ラッパー クラスの作成は、ラッパー クラスの定義とそのメンバー関数の実装からなります。
それぞれのラッパー クラスの作成で異なるのはインスタンスの生成方法です。

詳細は、SophiaFramework リファレンスのラッパー クラスの作成方法をご覧ください。

      

グローバルな変数の定義とそのアクセス方法

アプリ内のどこからでも SFYApplication::GetInstance 関数を使ってアクセスできるので、グローバルな変数はアプリクラスに定義します。

//
//  ExampleAppli アプリ クラス
//
SFMTYPEDEFCLASS(ExampleAppli)
class ExampleAppli : public SFYApplication
{
    SFMSEALCOPY(ExampleAppli)
public:
    static SFCInvokerPtr Factory(Void);
private:
    explicit ExampleAppli(Void) static_throws;
    virtual ~ExampleAppli(Void);

    // グローバル変数 global_something_val を定義する
    SInt32 global_something_val;
public:
    SInt32 GetGlobalSomethingVal();
};

ExampleAppli::GetGlobalSomethingVal(Void)
{
    return global_something_val;
}

// グローバル変数 global_something_val の値を取得する
static_cast<ExampleAppliPtr>(SFYApplication::GetInstance())->GetGlobalSomethingVal();
      

リファレンスに記載されていないエラー番号の内容は … ?

SophiaFramework が返すエラー ( SFCError 型 ) に関して、その番号が [ 0x0000 〜 0x3FFF ] の範囲にあるものでリファレンスに記載のないものは BREW プラットフォームが返したエラーです。

これらのエラーの詳細内容については、BREW SDK に含まれる AEEError.h というファイルをご覧になってください。

      

SFXBrewPointer クラスの使用方法

SFXBrewPointer クラスは BREW インターフェースのインスタンスを自動管理するためのスマート ポインター クラスです。このクラスはテンプレート クラスとなっており、ラッパー クラスの種類だけ自動的に型が生成されます。

ラッパー クラスのインスタンスは、スマート ポインターで自動的に管理されますので、 SFXBrewPointer クラスを明示的に使用する必要はありません。

以下のようにして、明示的に型を生成することも可能です。

SFXBrewPointer クラスの使用方法
Void SFXPointerExplainer::_SFXBrewPointer(Void) const
{
    // 以下の 2 種類の変数宣言は同等
    // ( 通常、記述しやすい Smp バージョンを利用する )

    SFXBrewPointer<SFBDisplay> display1;
    SFBDisplaySmp display2;

    // ラッパー クラスのインスタンスの生成は、
    // 各ラッパー クラスの NewInstance() 関数または 
    // GetInstance() 関数を利用する
    // ( スマート ポインターがインスタンスを管理するので、解放処理は不要 )

    SFBGraphicsSmp graphics;
    SFBGraphicsPtr raw_graphics;

    if ((graphics = SFBGraphics::NewInstance()) != null) {

        // インスタンスの取得成功
    }

    // 管理しているインスタンスの生ポインターの取得

    raw_graphics = graphics.Get();

    // スマート ポインターの比較

    if (display1 == display2) {
    }

    if (display1 != display2) {
    }

    // スマート ポインターと生ポインターの比較

    if (graphics == raw_graphics) {
    }

    // null ポインターとの比較

    if (graphics != null) {
    }

    // 他の型を表すスマート ポインター同士の比較
    // ( 推奨されないが、設計上可能 )

    if (graphics != display1) {
    }

    // スマート ポインターが管理するインスタンスのポインターのキャストは、
    // static_pointer_cast 演算子などを利用する
    // ( static_cast 演算子を利用してはいけない )

    SFBBaseSmp base;
    SFBBitmapSmp bitmap;

    base = bitmap;
    bitmap = static_pointer_cast<SFBBitmap>(base);

    // 空インスタンスの取得
    // ( 関数の戻り値として空のインスタンスへの参照を返す場合に便利 )

    SFBFileSmpConstRef file(SFBFileSmp::EmptyInstance());

    unused(file);

    // 管理しているインスタンスの明示的な解放

    SFBFileMgrSmp filemgr;

    if ((filemgr = SFBFileMgr::NewInstance()) != null) {

        // SFXBrewPointer クラスの Release() 関数を呼び出す

        filemgr.Release();

        // SophiaFramework 3.0 以上では 
        // SFBBase (IBase) クラスの AddRef(), Release() 関数を呼び出せない

        /*
        filemgr->Release();
        */
    }

    return;
}
      

SophiaFrameworkから BREW エクステンションに AEEApplet 構造体のポインターを渡す方法

SophiaFramework には AEEApplet 構造体が存在しません。

SophiaFramework で AEEApplet に相当するクラスは、SFCApplet クラスですが、このクラスは IApplet クラスを独自に拡張した変数の並びとなっています。

そのため、SFBApplet::GetInstance() 関数や SFXHelper::getinstance() 関数を利用しても SFCApplet 構造体へのポインタが返ってくるので互換性はありません。

例えば、BREW エクステンション側が単純に IDisplay へのポインタを必要としているのであれば、以下の例のようにアプリ内で自前の AEEApplet 構造体を確保し、メンバを初期化した後、その AEEApplet 構造体へのポインタを渡すという方法が考えられます。

AEEApplet _brew_applet;

_brew_applet.m_pIDisplay = interface_cast(SFXGraphics::GetInstance()->GetSFBDisplay().Get());

3d_function(3d, &_brew_applet, ...);

// 必要に応じて他のメンバも初期化して渡します。

※ この方法は、エクステンション側がインターフェースへのポインタを単純に参照するだけの場合は有効ですが、アプレット自身の参照カウンタを変更するような特殊な場合には正常に動作しない可能性があります。

      

atomic_cast 演算子

SophiaFramework 4.1.7 から atomic_cast 演算子が利用可能になりました。

atomic_cast 演算子は、図形と色など AtomRec 構造体が定義されるクラスのポインターと、そのクラスの AtomRec 構造体のポインターを相互に変換するための型変換演算子です。

atomic_cast 演算子により、クラスのポインターは AtomRec 構造体のポインターへ、AtomRec 構造体のポインターはクラスのポインターへそれぞれ型変換されます。

以下は、atomic_cast 演算子を使ったサンプル コードです。

Void my_func(SFXRectangle rects[2]) 
{ 
  // 何らかの処理

  ......

} 


SFXRectangle::AtomRec rects[] = { 
  {0, 0, 100, 100}, 
  {0, 0, 50, 50} 
}; 


my_func(atomic_cast(rects)); 
      

BREW SDK 4.0.0 で開発する方法 (SophiaFramework 4.1.7)

SophiaFramework 4.1.7 から、BREW SDK 4.0.0 用新規プロジェクトを作成できるようになりました。CheckAvail 関数が BREW SDK 4.0.0 では正常に動作しないため、BREW SDK 4.0.0 を使う場合、サンプルコードで CheckAvail 関数が呼び出されないように変更しました。また、BREW SDK 4.0.0 ではモジュール名が 21 文字を超えると発生するエラーとなるため、すべてのサンプルコードのモジュール名を 21 文字以下としました。

※制約事項:
BREW SDK 4.0.0 API のラッパーは提供されていません。SophiaFramework 4.1.8 以降で、提供する予定です。

■ BREW SDK 4.0.0 で開発する手順

Step 1 : Qualcomm 社サイトから BREW 4.0.0 SDK をダウンロードし、インストールします。

Step 2 : SophiaFramework 4.1.7 をインストールします。

Step 3 : 環境変数を更新するため、再起動します。

Step 4 : SophiaFramework のリンカのファイルを変更します。

Visual C++ 6.0 の場合 :
[プロジェクト] -> [設定] -> [リンク] -> [オブジェクト / ライブラリ モジュール] で [SophiaFrameworkBrew310VC6.lib] を [SophiaFrameworkBrew400VC6.lib] に変更します。

.NET の場合 :
[プロジェクト] -> [(プロジェクト名)のプロパティ] -> [リンカの入力] -> [追加の依存ファイル] で [SophiaFrameworkBrew310NET.lib] を [SophiaFrameworkBrew400NET.lib] に変更します。

Step 5 : アプリをコンパイルします。

※ AEEIramCache および AEEIRecordStore に関してコンパイラ エラーが発生します。このエラーは、BREW SDK 4.0.0 の不具合です。

以下のように変更すれば、コンパイラ エラーを回避できます。

■変更前 

static __inline int IRAMCACHE_Find(IRamCache* piRamCache,
                                   const char* cpKey, int nKeyLen,
                                   void* pVal, int* pnValLen)
 
 {
     return AEEGETPVTBL(piRamCache,IRamCache)
           ->Find(piRamCache,
                  cpKey, nKeyLen,
                  pVal, pnValLen);
}


■変更後 

static __inline int IRAMCACHE_Find(IRamCache* piRamCache,
                                   const char* cpKey, int nKeyLen,
                                   void* pVal, int* pnValLen)
{
    return AEEGETPVTBL(piRamCache,IRamCache)
            ->Find(piRamCache,
                   cpKey, nKeyLen,
                   static_cast<char *>(pVal), pnValLen);
}
■変更前 

static __inline int IRECORDSTORE_Find(IRecordStore* piRecordStore,
                                     const char* cpKey, int nKeyLen,
                                     void* pVal, int* pnValLen)
{
    return AEEGETPVTBL(piRecordStore,IRecordStore)
           ->Find(piRecordStore,
                  cpKey, nKeyLen,
                  pVal, pnValLen);
}


■変更後 

static __inline int IRECORDSTORE_Find(IRecordStore* piRecordStore,
                                         char* cpKey, int nKeyLen,
                                         void* pVal, int* pnValLen)
{
    return AEEGETPVTBL(piRecordStore,IRecordStore)
           ->Find(piRecordStore,
                  cpKey, nKeyLen,
                  static_cast<char *>(pVal), pnValLen);
}

Step 6 : もう一度、コンパイルします。

【注意事項】

1) SophiaFramework 4.1.7 では BREW 4.0.0 API ラッパーは提供されていません。

[対策] SophiaFramework 4.1.8 以降で提供される予定です。

2) BREW 4.0.0 SDK には KDDI_FONT_FIXED16X16 が含まれないため、pclock アプリはコンパイルできません。

      

BREW SDK 4.0.0 で開発する方法 (SophiaFramework 4.1.6)

SophiaFramework 4.1.6 では、一部 BREW SDK 4.0.0 に対応しています。BREW SDK 3.1 以前の環境で開発した SophiaFramework アプリをコンパイルし実行できます。

※制約事項:
BREW SDK 4.0.0 用の新規プロジェクトは作成できません。また、BREW SDK 4.0.0 API のラッパーも提供されていません。SophiaFramework 4.1.7 以降で、提供する予定です。

■ BREW SDK 4.0.0 で開発する手順

Step 1 : Qualcomm 社サイトから BREW 4.0.0 SDK をダウンロードし、インストールします。

Step 2 : SophiaFramework 4.1.6 をインストールします。

Step 3 : 環境変数を更新するため、再起動します。

Step 4 : SophiaFramework のリンカのファイルを変更します。

Visual C++ 6.0 の場合 :
[プロジェクト] -> [設定] -> [リンク] -> [オブジェクト / ライブラリ モジュール] で [SophiaFrameworkBrew310VC6.lib] を [SophiaFrameworkBrew400VC6.lib] に変更します。

.NET の場合 :
[プロジェクト] -> [(プロジェクト名)のプロパティ] -> [リンカの入力] -> [追加の依存ファイル] で [SophiaFrameworkBrew310NET.lib] を [SophiaFrameworkBrew400NET.lib] に変更します。

Step 5 : アプリをコンパイルします。

※ AEEIramCache および AEEIRecordStore に関してコンパイラ エラーが発生します。このエラーは、BREW SDK 4.0.0 の不具合です。

以下のように変更すれば、コンパイラ エラーを回避できます。

■変更前 

static __inline int IRAMCACHE_Find(IRamCache* piRamCache,
                                   const char* cpKey, int nKeyLen,
                                   void* pVal, int* pnValLen)
 
 {
     return AEEGETPVTBL(piRamCache,IRamCache)
           ->Find(piRamCache,
                  cpKey, nKeyLen,
                  pVal, pnValLen);
}


■変更後 

static __inline int IRAMCACHE_Find(IRamCache* piRamCache,
                                   const char* cpKey, int nKeyLen,
                                   void* pVal, int* pnValLen)
{
    return AEEGETPVTBL(piRamCache,IRamCache)
            ->Find(piRamCache,
                   cpKey, nKeyLen,
                   static_cast<char *>(pVal), pnValLen);
}
■変更前 

static __inline int IRECORDSTORE_Find(IRecordStore* piRecordStore,
                                     const char* cpKey, int nKeyLen,
                                     void* pVal, int* pnValLen)
{
    return AEEGETPVTBL(piRecordStore,IRecordStore)
           ->Find(piRecordStore,
                  cpKey, nKeyLen,
                  pVal, pnValLen);
}


■変更後 

static __inline int IRECORDSTORE_Find(IRecordStore* piRecordStore,
                                         char* cpKey, int nKeyLen,
                                         void* pVal, int* pnValLen)
{
    return AEEGETPVTBL(piRecordStore,IRecordStore)
           ->Find(piRecordStore,
                  cpKey, nKeyLen,
                  static_cast<char *>(pVal), pnValLen);
}

Step 6 : もう一度、コンパイルします。

【注意事項】

1) SophiaFramework 4.1.6 では、BREW 4.0.0 用の新規プロジェクトを作成できません。

[対策] SophiaFramework 4.1.7 以降で対応いたします。

2) SophiaFramework 4.1.6 では BREW 4.0.0 API ラッパーは提供されていません。

[対策] SophiaFramework 4.1.8 以降で提供される予定です。

3) BREW 4.0.0 用シミュレータでアプリ起動すると Unknown Error(1) が発生します。

以下のサンプルアプリで発生します。

−SyncScheduler
−psec
−Recog
−pself_dom
−pself_sax

[原因] CheckAvail 関数が BREW 4.0.0 では正常に動作しないためです。

[対策] CheckAvail 関数を使わなければ正常に動作します。

4) BREW 4.0.0 用シミュレータでアプリ起動すると Unknown Error(14) が発生します。

以下のサンプルコードで発生します。

−SFXCollectionExplainer
−SFXMathematicsExplainer

[原因] モジュール名が 21 文字を超えると発生するエラーです。

[対策] BREW 4.0.0 SDKでは、モジュール名は 21 文字以下にします。

5) BREW 4.0.0 SDK には KDDI_FONT_FIXED16X16 が含まれないため、pclock アプリはコンパイルできません。

      

SFR ・ SFC アプリの使い分けについて

SFRアプリは複雑なUIを構築するとき、SFCアプリは既存の BREW 標準のコードを流用するときに、それぞれ効果を発揮します。

■ SFRアプリのメリットとデメリット

<メリット>

・SophiaFramework独自の標準UIコンポーネントを利用できます。

・イベント処理はハンドラ形式になり、コードがすっきりします。

<デメリット>

・BREW 標準の UI クラスと相性が悪い部分があります。 
( IHtmlViewer などはそのままでは使えません。 )

■ SFCアプリのメリットとデメリット

<メリット>

・UI の構築方法やイベントの処理方法が、BREW 標準のものとほぼ同じ構造です。 
( IHtmlViewer などのインターフェースもラッパークラス経由でそのまま使えます。 )

<デメリット>

・SophiaFramework 付属の UI コンポーネントを利用できません。

・イベント処理がハンドラ形式ではなく、BREW 標準の分岐形式になり、コードが煩雑になります。

尚、文字列やコレクションなどのユーティリティクラスは SFR・SFC アプリとも利用可能です。

      

バージョン 4.0 のコードを 4.1 に対応させる方法

1.SFU??? で始まる SophiaFramework 2.x, SophiaFramework 3.x に関するクラスが利用されていないことを確認する。

※利用されている場合は、先にバージョン3.0 のコードを 4.0 に対応 させておく必要があります。

2.IndexOf() 関数を利用している個所を FirstIndexOf() 関数に置き換える。
3.引数を指定せずに利用している SFXArray , SFXStack , SFXList クラスの GetIterator() 関数と GetEnumerator() 関数を、GetFirstIterator() 関数と GetFirstEnumerator() 関数に置き換える。

4.コンパイルを行い、エラーを確認する。

エラーが発生しなければバージョン 4.1 への対応は完了です。

5.手順4でクラス、マクロや関数が見つからない旨のエラーが発生する場合は、下記表の非推奨 API を利用していないか確認する。

6.すべて修正できたら手順4へ

さらに、バージョン 4.1 に最適化するためには、SFXHashmap クラスを利用している個所を確認します。
バージョン 4.1 ではキーイテレータと値イテレータが搭載されましたので、従来独自に管理しなければいけなかった値オブジェクトのリストをこれらのイテレータを利用して管理できます。


非推奨 API 一覧

/*** クラス ***/

・SFRBrewTextControl クラスは SFREditboxControl クラスに置き換え

/*** マクロ ***/

#define alignof(type) align64of(type)
#define clusterof(type) cluster64of(type)

macro TYPE_<コンポーネント名>
    => TYPE_SFR<コンポーネント名>

macro ATTRIBUTE_<コンポーネント名>
    => ATTRIBUTE_SFR<コンポーネント名>

macro BEHAVIOR_<コンポーネント名>
    => BEHAVIOR_SFR<コンポーネント名>

・SFRBREWTEXTCONTROL に関するマクロは、すべて SFREDITBOXCONTROL に置き換え

/*** 関数 ***/

・以下の関数は非推奨 API です。それぞれの実装を参考に置換してください。

/*** SFXBuffer ***/
inline SFXBuffer Slice(UInt32 begin, UInt32 end) const
{
    SFXBuffer result(*this);

    result.Slice(begin, end);
    return result;
}

/*** SFXRingBuffer ***/
inline VoidPtr LockWrite(UInt32Ptr size = null)
{
    return GetWritableBuffer(size);
}

inline VoidPtr LockRead(UInt32Ptr size = null)
{
    return const_cast<VoidPtr>(GetReadableBuffer(size));
}

inline SFCError UnlockWrite(UInt32 size)
{
    return SeekWrite(size);
}

inline SFCError UnlockRead(UInt32 size)
{
    return SeekRead(size);
}

/*** SFXAscii ***/
inline static AChar ToUpper(AChar param)
{
    return AsUpper(param);
}

inline static WChar ToUpper(WChar param)
{
    return AsUpper(param);
}

inline static AChar ToLower(AChar param)
{
    return AsLower(param);
}

inline static WChar ToLower(WChar param)
{
    return AsLower(param);
}

/*** SFXAnsiString ***/
inline SInt32 ToSInt32(SInt32 substitute = 0) const
{
    return AsSInt32(substitute);
}

inline UInt32 ToUInt32(UInt32 substitute = 0) const
{
    return AsUInt32(substitute);
}

/*inline Void Rotate(SInt32 shift)
{
    => removed
}*/

/*** SFXWideString ***/
inline SInt32 ToSInt32(SInt32 substitute = 0) const
{
    return AsSInt32(substitute);
}

inline UInt32 ToUInt32(UInt32 substitute = 0) const
{
    return AsUInt32(substitute);
}

/*inline Void Rotate(SInt32 shift)
{
    => removed
}*/

/*** SFXShiftJIS ***/
inline static UInt16 WCharToUInt16(WChar param)
{
    return AsUInt16(param);
}

inline static UInt16 UInt16ToWChar(WChar param)
{
    return AsWChar(param);
}

/*** SFXRGBColor ***/
inline RGBVAL ToRGBVAL(Void) const
{
    return AsRGBVAL();
}

/*** SFXGraphics ***/
inline SFBGraphicsSmpConstRef GetGraphics(Void) const
{
    return GetSFBGraphics();
}

inline SFBDisplaySmpConstRef GetDisplay(Void) const
{
    return GetSFBDisplay();
}

/*** SFXDirectory ***/
inline static SFCError GetTemporaryPath(SFXPathConstRef path, SFXAnsiStringConstRef prefix, SFXAnsiStringConstRef suffix, SFXPathPtr result)
{
    return GetUniquePath(path, prefix, suffix, result);
}

/*** SFXFile ***/
inline static SFCError GetTemporaryPath(SFXPathConstRef path, SFXAnsiStringConstRef prefix, SFXAnsiStringConstRef suffix, SFXPathPtr result)
{
    return GetUniquePath(path, prefix, suffix + ".tmp", result);
}

/*** SFXConfig ***/
inline SFCError Load(SFXAnsiStringConstRef file)
{
    return Load(SFXPath(file));
}

inline SFCError Save(SFXAnsiStringConstRef file)
{
    return Save(SFXPath(file));
}

/*inline SFCError GetEntry(SInt32 index, UInt16Ptr tag, VoidConstHandle value, UInt16Ptr length) const
{
    => removed
}*/

/*** SFXDate ***/
inline UInt32 ToUInt32(Void) const
{
    return AsUInt32();
}

inline JulianType ToJulianType(Void) const
{
    return AsJulianType();
}

/*** SFXDateDuration ***/
inline SInt32 ToSInt32(Void) const
{
    return static_cast<SInt32>(AsSInt64());
}
      

アプリ全体からアクセスする変数

アプリ全体からアクセスする変数は、アプリクラスのメンバ変数として定義します。

class AppliClass : public SFRApplication {
private:
    SInt32 _data;  // アプリ全体からアクセスする変数
    ...
public:
    Void SetData(SInt32 data) { _data = data; }
    SInt32 GetData() { return _data; }
};

データは任意の場所で取得、設定できます。

// アプリのインスタンスの取得
AppliClassPtr app;
app = (AppliClassPtr)SFRApplication::GetInstance();
app->SetData(1); // データの設定
app->GetData(); // データの取得

参考: リファレンス 7.4.1 アプリケーションクラス

      

バージョン 3.0 のコードを 4.0 に書き換える

バージョン 3.0 のコードを 4.0 に書き換えるときの手順は

1.ヘッダファイル中の HANDLER_DECLARE_??? マクロの第1引数 (クラス名) を削除する (変更後の引数は1つになる)。

// 修正前
HANDLER_DECLARE_VOIDVOID(CHelloWorld, OnKey)

// 修正後
HANDLER_DECLARE_VOIDVOID(OnKey)

2.SFUIPEndpoint クラスを SFXSocketAddress クラスに置き換える。

3.SFUHostResolver クラスを SFXInetAddress クラスに置き換える。

4.コンパイルしてコンパイルが通るか確認する。

この時点で、 3.0 のクラスと 4.0 のクラスが共存した状態になっている。さらに 4.0 のクラスだけを利用する場合は、次へ進む。

5.コンパイラの設定やメイクファイルに

TARGET_COMPATIBILITY_ONLY400

マクロを設定する。
(SophiaFramework.hpp ファイルを読み込む前に #define してもよい。)

6.コンパイルしてエラーを確認する。

エラーが出力されず、正常に終了した場合は、すでに 4.0 のクラスに対応している。

7.alignof, clusterof マクロを align64of , cluster64of マクロに置き換える。

8.ToSInt32() 関数などが存在しないとエラーが出る場合は、AsSInt32() 関数などに適切に置き換える。(該当クラスのクラス定義ヘッダファイル *.h.hpp 中に新しい関数との対応関係が記述されています。)

例:SFXAnsiString::ToSInt32 関数は SFXAnsiString::AsSInt32 関数に変更する。

9.SFUHttpConnection クラスを SFXHTTPConnection クラスに置き換える。

10.SFUStream 系のクラス(SFUFileStream, SFUNetworkStream, SFUMemoryStream, SFUSourceStream)を SFXFile , SFXTCPSocket , SFXMemory , SFXSource クラスに置き換える。

      

例外処理を記述する(static_exception クラスの利用)

BREW 環境では C++ 言語の例外を利用することができず、
コンストラクタ内部のエラーや演算子内部のエラーを外部で検知することができません。
SophiaFramework では static_exception クラスを利用して、統一的なエラー処理を行います。

static_exception クラスは、継承して使用します。

SFMTYPEDEFCLASS(myclass)
class myclass : public static_exception {
    public:
        explicit myclass(Void) static_throws; // static_throws キーワードは
        // この関数(コンストラクタ)の中でエラーが起こるかもしれないと
        // いうことを示す目印(実際には何もしない)
    private:
        SFCError Function(Void);  // エラー値を返す関数
};

myclass::myclass(Void)
{
    // 親クラスでエラーが発生してないかチェック
    if (static_try()) {

        // Function() 関数の戻り値(エラー値)を設定
        static_throw(Function());

        // エラーが発生していないかチェック
        if (static_try()) {
            ...
        }
    }
    return;
}

このクラスの使い方

myclass my; // コンストラクタの中でエラーが起きているかもしれないので…

// エラーが起きているかを調べる
if (my.static_catch() == SFERR_NO_ERROR) {
    // エラーは起きていない
    ...
} else {
    // エラーが起きている
    // my.static_catch() の戻り値でエラーの種類を知ることができる
}

参照 static_exception | static_exception::static_try | static_exception::static_throw
static_exception::static_catch

      

効率の良い定数構造体の渡し方

関数の引数に定数の構造体を渡す場合(例えば、SFXGraphics::SetForeColor 関数などに
SFXRGBColor クラスのインスタンスを渡す場合)、以下のように記述できます。

SFXGraphicsPtr graphics = SFXGraphics::GetInstance();

graphics->SetForeColor(SFXRGBColor(0xFF, 0x00, 0x00, 0x00));

この方法では、SFXRGBColor クラスのコンストラクタの分がオーバーヘッドになります。
SFXRGBColor クラスのコンストラクタを起動させずに、
定数を直接渡すには以下のように記述します。

static SFXRGBColor::AtomRecConst color = {
    0x00, 0xFF, 0x00, 0x00    // 左から順に α、R、G、B
};
SFXGraphicsPtr graphics = SFXGraphics::GetInstance();

graphics->SetForeColor(color);

このような構造体として、カラーの他にシェイプ クラスなどがあります。

参照 SFXGraphics::GetInstance | SFXGraphics::SetForeColor |
SFXRGBColor::AtomRecConst

      

コードの実行速度をミリ秒単位で計測する

SFXDate::CurrentDate 関数で取得できる時刻は秒単位です。
時間をミリ秒単位で取得するには、SFXHelper::gettimems を使用します。

UInt32 startms = SFXHelper::gettimems();

func();  // 測定したい処理

UInt32 endms = SFXHelper::gettimems();
SInt32 milisecTime = endms - startms;  // milisecTime は
                                       // 測定した時間(ミリ秒単位)

参照 SFXHelper::gettimems

      

画面のサイズを取得する

画面のサイズを取得するには、SFXGraphics::GetDeviceRectangle 関数、または
SFXGraphics::GetDeviceSize 関数を使用します。

// 画面サイズが 横 240、縦 290 の場合

SFXRectangle rect = SFXGraphics::GetDeviceRectangle();
// rect は (x, y) = (0, 0), 幅 240, 高さ 290 となる

SFXSize size = SFXGraphics::GetDeviceSize();
// size は 幅 240, 高さ 290 となる

参照 SFXGraphics::GetDeviceRectangle | SFXGraphics::GetDeviceSize

      

アプリを終了させる

アプリを終了させるには、SFRApplication::Terminate 関数
(GUI フレームワークを使わない場合は SFCApplication::Terminate 関数)を使用します。

引数が true の場合、全ての BREW アプリケーションを終了し、 待ち受け画面に戻ります。
false の場合は現在アクティブなアプリケーションのみを終了し、 BREW アプリケーション センター画面に戻ります。

SFRApplication::Terminate(false);  // アプリを終了させる

SFCApplication::Terminate(false); // GUI フレームワークを使わない場合 

参照 SFRApplication::Terminate | SFCApplication::Terminate