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

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

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

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


person Alexander Solovets    schedule 05.12.2013    source источник


Ответы (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 интерфейсов.

person binji    schedule 05.12.2013
comment
Вам необходимо переносить программу C, а не C ++. - person Alexander Solovets; 06.12.2013
comment
Тогда вы можете взглянуть на жизненный пример - он использует C. Библиотека ppapi_simple использует интерфейс C с C ++ под капотом. Большинство вещей, которые я описал выше, одинаковы (хотя, очевидно, HandleEvent будет обычной функцией, а не функцией-членом). - person binji; 06.12.2013
comment
Я изменил свой ответ, чтобы использовать C. - person binji; 06.12.2013
comment
Демонстрация земли тоже написана на C ++ =) Но действительно есть то, что мне нужно. Похоже, главное - позвонить PSEventSetFilter(PSE_ALL). Спасибо за ваши усилия! - person Alexander Solovets; 07.12.2013