| OLD | NEW |
| 1 // Copyright (c) 2013 The Chromium Authors. All rights reserved. | 1 /* Copyright (c) 2015 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 * Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 * found in the LICENSE file. */ |
| 4 | 4 |
| 5 #ifndef PPAPI_SIMPLE_PS_INSTANCE_H_ | 5 #ifndef PPAPI_SIMPLE_PS_INSTANCE_H_ |
| 6 #define PPAPI_SIMPLE_PS_INSTANCE_H_ | 6 #define PPAPI_SIMPLE_PS_INSTANCE_H_ |
| 7 | 7 |
| 8 #include <stdarg.h> | 8 #include <stdarg.h> |
| 9 | 9 |
| 10 #include "ppapi/c/pp_instance.h" | 10 #include "ppapi/c/pp_instance.h" |
| 11 #include "ppapi/c/pp_stdint.h" | 11 #include "ppapi/c/pp_stdint.h" |
| 12 #include "ppapi/c/ppb_core.h" | |
| 13 #include "ppapi/c/ppb_var.h" | 12 #include "ppapi/c/ppb_var.h" |
| 14 #include "ppapi/c/ppb_view.h" | |
| 15 | |
| 16 #include "ppapi/cpp/fullscreen.h" | |
| 17 #include "ppapi/cpp/graphics_3d_client.h" | |
| 18 #include "ppapi/cpp/instance.h" | |
| 19 #include "ppapi/cpp/message_loop.h" | |
| 20 #include "ppapi/cpp/mouse_lock.h" | |
| 21 | |
| 22 #include "ppapi/utility/completion_callback_factory.h" | |
| 23 | 13 |
| 24 #include "ppapi_simple/ps_event.h" | 14 #include "ppapi_simple/ps_event.h" |
| 25 #include "ppapi_simple/ps_main.h" | |
| 26 | 15 |
| 27 #include "sdk_util/thread_safe_queue.h" | 16 EXTERN_C_BEGIN |
| 28 | 17 |
| 29 typedef void (*MessageHandler_t)(const pp::Var& key, | 18 enum PSVerbosity { |
| 30 const pp::Var& value, | 19 PSV_SILENT = 0, |
| 31 void* user_data); | 20 PSV_ERROR = 1, |
| 32 | 21 PSV_WARN = 2, |
| 33 struct MessageHandler { | 22 PSV_LOG = 3, |
| 34 MessageHandler_t handler; | 23 PSV_TRACE = 4, |
| 35 void* user_data; | |
| 36 }; | 24 }; |
| 37 | 25 |
| 38 // The basic instance class which also inherits the MouseLock and | 26 void PSInstanceSetVerbosity(enum PSVerbosity verbosity); |
| 39 // Graphics3DClient interfaces. | 27 void PSInstanceTrace(const char *fmt, ...); |
| 40 class PSInstance : public pp::Instance, pp::MouseLock, pp::Graphics3DClient { | 28 void PSInstanceLog(const char *fmt, ...); |
| 41 public: | 29 void PSInstanceWarn(const char *fmt, ...); |
| 42 // Verbosity levels, ecplicitly numbered since we pass these | 30 void PSInstanceError(const char *fmt, ...); |
| 43 // in from html attributes as numberic values. | |
| 44 enum Verbosity { | |
| 45 PSV_SILENT = 0, | |
| 46 PSV_ERROR = 1, | |
| 47 PSV_WARN = 2, | |
| 48 PSV_LOG = 3, | |
| 49 PSV_TRACE = 4, | |
| 50 }; | |
| 51 | 31 |
| 52 // Returns a pointer to the global instance | 32 EXTERN_C_END |
| 53 static PSInstance* GetInstance(); | |
| 54 | 33 |
| 55 PSInstance(PP_Instance inst); | 34 #endif /* PPAPI_SIMPLE_PS_INSTANCE_H_ */ |
| 56 virtual ~PSInstance(); | |
| 57 | |
| 58 // Set a function which will be called on a new thread once initialized. | |
| 59 // NOTE: This must be called by the Factory, once Init is called, this | |
| 60 // function will have no effect. | |
| 61 void SetMain(PSMainFunc_t func); | |
| 62 | |
| 63 // Started on Init, a thread which can be safely blocked. | |
| 64 virtual int MainThread(int argc, char* argv[]); | |
| 65 | |
| 66 // Logging Functions | |
| 67 void SetVerbosity(Verbosity verbosity); | |
| 68 void Trace(const char *fmt, ...); | |
| 69 void Log(const char *fmt, ...); | |
| 70 void Warn(const char *fmt, ...); | |
| 71 void Error(const char *fmt, ...); | |
| 72 | |
| 73 // Event Functions | |
| 74 void SetEnabledEvents(uint32_t mask); | |
| 75 void PostEvent(PSEventType type); | |
| 76 void PostEvent(PSEventType type, PP_Bool bool_value); | |
| 77 void PostEvent(PSEventType type, PP_Resource resource); | |
| 78 void PostEvent(PSEventType type, const PP_Var& var); | |
| 79 | |
| 80 PSEvent* TryAcquireEvent(); | |
| 81 PSEvent* WaitAcquireEvent(); | |
| 82 void ReleaseEvent(PSEvent* event); | |
| 83 | |
| 84 // Register a message handler for messages that arrive | |
| 85 // from JavaScript with a give names. Messages are of the | |
| 86 // form: { message_name : <value> }. | |
| 87 // | |
| 88 // PSInstance will then not generate events but instead | |
| 89 // cause the handler to be called upon message arrival. | |
| 90 // If handler is NULL then the current handler will be | |
| 91 // removed. Example usage: | |
| 92 // | |
| 93 // JavaScript: | |
| 94 // nacl_module.postMessage({'foo': 123}); | |
| 95 // | |
| 96 // C++: | |
| 97 // void MyMessageHandler(const pp::Var& key, | |
| 98 // const pp::Var& value, | |
| 99 // void* user_data) { | |
| 100 // assert(key.is_string()); | |
| 101 // assert(key.AsString() == "foo"); | |
| 102 // assert(value.is_int()); | |
| 103 // assert(value.AsInt() == 123); | |
| 104 // } | |
| 105 // ... | |
| 106 // instance_->RegisterMessageHandler("foo", &MyMessageHandler, NULL); | |
| 107 // | |
| 108 void RegisterMessageHandler(std::string message_name, | |
| 109 MessageHandler_t handler, | |
| 110 void* user_data); | |
| 111 | |
| 112 // Perform exit handshake with JavaScript. | |
| 113 // This is called by _exit before the process is terminated to ensure | |
| 114 // that all messages sent prior to _exit arrive at the JavaScript side. | |
| 115 void ExitHandshake(int status); | |
| 116 | |
| 117 protected: | |
| 118 typedef std::map<std::string, MessageHandler> MessageHandlerMap; | |
| 119 | |
| 120 // Callback functions triggered by Pepper | |
| 121 // | |
| 122 // These functions are called on the main pepper thread, so they must | |
| 123 // not block. | |
| 124 // | |
| 125 // Called by the browser when the NaCl module is loaded and all ready to go. | |
| 126 // This function will create a new thread which will run the pseudo main. | |
| 127 virtual bool Init(uint32_t argc, const char* argn[], const char* argv[]); | |
| 128 | |
| 129 // Output log message to stderr if the current verbosity is set | |
| 130 // at or above the given verbosity. | |
| 131 void VALog(Verbosity verbosity, const char *fmt, va_list args); | |
| 132 | |
| 133 // Called whenever the in-browser window changes size, it will pass a | |
| 134 // context change request to whichever thread is handling rendering. | |
| 135 virtual void DidChangeView(const pp::View& view); | |
| 136 | |
| 137 // Called by the browser when the NaCl canvas gets or loses focus. | |
| 138 virtual void DidChangeFocus(bool has_focus); | |
| 139 | |
| 140 // Called by the browser to handle the postMessage() call in Javascript. | |
| 141 virtual void HandleMessage(const pp::Var& message); | |
| 142 | |
| 143 // Called by the browser to handle incoming input events. Events are Q'd | |
| 144 // and can later be processed on a sperate processing thread. | |
| 145 virtual bool HandleInputEvent(const pp::InputEvent& event); | |
| 146 | |
| 147 // Called by the browser when the 3D context is lost. | |
| 148 virtual void Graphics3DContextLost(); | |
| 149 | |
| 150 // Called by the browser when the mouselock is lost. | |
| 151 virtual void MouseLockLost(); | |
| 152 | |
| 153 // Called by Init to processes default and embed tag arguments prior to | |
| 154 // launching the 'ppapi_main' thread. | |
| 155 virtual bool ProcessProperties(); | |
| 156 | |
| 157 private: | |
| 158 static void* MainThreadThunk(void *start_info); | |
| 159 ssize_t TtyOutputHandler(const char* buf, size_t count); | |
| 160 void MessageHandlerExit(const pp::Var& message); | |
| 161 void MessageHandlerInput(const pp::Var& key, const pp::Var& message); | |
| 162 void MessageHandlerResize(const pp::Var& message); | |
| 163 void HandleResize(int width, int height); | |
| 164 | |
| 165 static void HandleExitStatic(int status, void* user_data); | |
| 166 | |
| 167 static ssize_t TtyOutputHandlerStatic(const char* buf, size_t count, | |
| 168 void* user_data); | |
| 169 | |
| 170 /// Handle exit confirmation message from JavaScript. | |
| 171 static void MessageHandlerExitStatic(const pp::Var& key, | |
| 172 const pp::Var& message, | |
| 173 void* user_data); | |
| 174 | |
| 175 /// Handle input message from JavaScript. The value is | |
| 176 /// expected to be of type string. | |
| 177 static void MessageHandlerInputStatic(const pp::Var& key, | |
| 178 const pp::Var& message, | |
| 179 void* user_data); | |
| 180 | |
| 181 | |
| 182 /// Handle resizs message from JavaScript. The value is | |
| 183 /// expected to be an array of 2 integers representing the | |
| 184 /// number of columns and rows in the TTY. | |
| 185 static void MessageHandlerResizeStatic(const pp::Var& key, | |
| 186 const pp::Var& message, | |
| 187 void* user_data); | |
| 188 | |
| 189 protected: | |
| 190 pp::MessageLoop* main_loop_; | |
| 191 | |
| 192 sdk_util::ThreadSafeQueue<PSEvent> event_queue_; | |
| 193 uint32_t events_enabled_; | |
| 194 Verbosity verbosity_; | |
| 195 | |
| 196 // TTY handling | |
| 197 int tty_fd_; | |
| 198 const char* tty_prefix_; | |
| 199 MessageHandlerMap message_handlers_; | |
| 200 | |
| 201 PSMainFunc_t main_cb_; | |
| 202 | |
| 203 const PPB_Core* ppb_core_; | |
| 204 const PPB_Var* ppb_var_; | |
| 205 const PPB_View* ppb_view_; | |
| 206 | |
| 207 // Condition variable and lock used to wait for exit confirmation from | |
| 208 // JavaScript. | |
| 209 pthread_cond_t exit_cond_; | |
| 210 pthread_mutex_t exit_lock_; | |
| 211 | |
| 212 // A message to Post to JavaScript instead of exiting, or NULL if exit() | |
| 213 // should be called instead. | |
| 214 char* exit_message_; | |
| 215 }; | |
| 216 | |
| 217 #endif // PPAPI_SIMPLE_PS_INSTANCE_H_ | |
| OLD | NEW |