Обработка сообщений с помощью ppapi_simple

Насколько я понимаю, у одного есть два варианта портирования программы на C на Native Client:

  1. Реализуйте ряд инициализирующих функций, таких как PPP_InitializeModule а также PPP_GetInterface,
  2. Просто передайте свою основную функцию PPAPI_SIMPLE_REGISTER_MAIN,

Поэтому вопрос заключается в том, как я могу реализовать обработку сообщений JS (обрабатывать сообщения, отправляемые кодом JS в нативном коде) во втором случае?

1 ответ

Решение

Посмотрите на некоторые примеры из SDK в каталоге examples/demo: earth, voronoi, flock, pi_generator и life все используют ppapi_simple.

Вот в основном, как это работает:

При использовании ppapi_simple все события (например, события ввода, сообщения из JavaScript) добавляются в очередь событий. Следующий код взят из примера из жизни (хотя некоторые из них изменены и не проверены):

PSEventSetFilter(PSE_ALL);
while (true) {
  PSEvent* ps_event;
  /* Process all waiting events without blocking */
  while ((ps_event = PSEventTryAcquire()) != NULL) {
    earth.HandleEvent(ps_event);
    PSEventRelease(ps_event);
  }
  ...
}

Затем HandleEvent определяет, что это за событие, и обрабатывает его специфичным для приложения способом:

void ProcessEvent(PSEvent* ps_event) {
  ...
  if (ps_event->type == PSE_INSTANCE_HANDLEINPUT) {
    ...
  } else if (ps_event->type == PSE_INSTANCE_HANDLEMESSAGE) {
    // ps_event->as_var is a PP_Var with the value sent from JavaScript.
    // See docs for it here: https://developers.google.com/native-client/dev/pepperc/struct_p_p___var
   if (ps_event->as_var->type == PP_VARTYPE_STRING) {
     const char* message;
     uint32_t len;
     message = PSInterfaceVar()->VarToUtf8(ps_event->as_var, &len);
     // Do something with the message. Note that it is NOT null-terminated.
   }
}

Чтобы отправить сообщения обратно в JavaScript, используйте функцию PostMessage в интерфейсе обмена сообщениями:

PP_Var message;
message = PSInterfaceVar()->VarFromUtf8("Hello, World!", 13);
// Send a string message to JavaScript
PSInterfaceMessaging()->PostMessage(PSGetInstanceId(), message);
// Release the string resource
PSInterfaceVar()->Release(message);

Вы также можете отправлять и получать другие типы JavaScript: целые числа, числа с плавающей запятой, массивы, буферы массивов и словари. Смотрите также интерфейсы PPB_VarArray, PPB_VarArrayBuffer и PPB_VarDictionary.

Другие вопросы по тегам