C++ ときどき ごはん、わりとてぃーぶれいく☆

USAGI.NETWORKのなかのひとのブログ。主にC++。

NaCl tips; NaClモジュール <==> JavaScript メッセージング

自分自身が作りたいと思っていたゲームのアイデアを実現したり、技術的なテストをオンラインで行うプラットフォームとすべく、
"Labyrinthian - Wonder Rabbit Project"
を実装し始めました。実装というかテストしてるだけな感じですけど。

source

NaClモジュールとJavaScriptの間でメッセージングを確認した状態に自分用備忘録としてメモを遺しておく事に。

tips

JavaScript side
  • NaClモジュールをホストしたembed要素の`message`イベントにNaClモジュールからのメッセージが届く
    • 第1パラメータにメッセージが入っているので適宜に受け取る
  • NaClモジュールをホストしたembed要素の`postMessage`関数でNaClモジュールへのメッセージを送る
    • 第1パラメータにメッセージを放り込めば良い
  • `message`、`postMessage`はembedのNaClモジュールが読み込みを完了していなければ発動できないから、当然その要素の`load`イベントの発行よりも後でなければ使えない。
NaCl side
  • #include "ppapi/cpp/var.h"
    • 読むなら: nacl_sdk/pepper_19/toolchain/linux_x86_newlib/x86_64-nacl/include/ppapi/cpp/var.h
    • `pp::Var`型はメッセージの送受信に用いるヴァリアント型
    • 基本的なデータとしては `bool` `int32_t` `double` `const char*` `const std::string&` を扱う。(文字列は何れもUTF-8を想定。)
      • JS固有の `undefined` `null` `object` も扱える。
    • `is_undefined` `is_object` `is_bool` `is_int` `is_string` `is_number` などのメンバー関数により内包する型を判定できる。
    • `AsBool` `AsInt` `AsDouble` `AsString` により C++ が標準的に扱える型で中身を取り出せる。
    • `Var(const Var&)`コンストラクターと`virtual Var& operator=(const Var&)`破壊的代入演算子が実装されている。
      • `bool` `int32_t` `double` `const char*` `const std::string&`に対応したコンストラクターも持っている。
    • `bool operator==(const Var&) const`等価性比較演算子が実装されている。
  • `pp::Instance`をpublic継承したNaClインスタンスクラスのメンバー仮想関数`virtual void HandleMessage(const pp::Var&)`にJavaScriptからNaClモジュールへ送出されたメッセージが届く。
  • `pp::Instance`をpublic継承したNaClインスタンスクラスが継承したメンバー関数`void PostMessage(const pp::Var&)`でJavaScriptへのメッセージを送出する。