diff nodejs/observer.cc @ 651:aa52883534fc

Code generated by generator can be built
author Thinker K.F. Li <thinker@branda.to>
date Sat, 31 Jul 2010 13:28:48 +0800
parents
children d58251f1bf0b
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/nodejs/observer.cc	Sat Jul 31 13:28:48 2010 +0800
@@ -0,0 +1,61 @@
+#include <v8.h>
+#include "mbfly_njs.h"
+
+extern "C" {
+#include <mb.h>
+#include <string.h>
+}
+
+#ifndef ASSERT
+#define ASSERT(x)
+#endif
+
+using namespace v8;
+
+struct xnjsmb_observer_data {
+    Persistent<Function> func;
+};
+
+static void
+event_handler(event_t *evt, void *arg);
+
+static observer_t *
+_subject_add_event_observer(subject_t *subject, int type,
+                            Handle<Function> func) {
+    observer_t *observer;
+    xnjsmb_observer_data *data;
+    
+    data = new xnjsmb_observer_data;
+    if(data == NULL)
+	return NULL;
+    data->func = Persistent<Function>::New(func);
+    observer = subject_add_event_observer(subject, type,
+					  event_handler,
+    	       				  data);
+
+    return observer;
+}
+
+static void
+_subject_remove_observer(subject_t *subject, observer_t *observer) {
+    xnjsmb_observer_data *data;
+
+    subject_remove_observer(subject, observer);
+    data = (xnjsmb_observer_data *)observer->arg;
+    delete data;
+}
+
+#include "observer-inc.h"
+
+static void
+event_handler(event_t *evt, void *arg) {
+    xnjsmb_observer_data *data = (xnjsmb_observer_data *)arg;
+    Handle<Value> evt_obj;
+    Handle<Value> func_args[1];
+
+    evt_obj = xnjsmb_event_new(evt);
+    ASSERT(!evt_obj.IsEmpty());
+    func_args[0] = evt_obj;
+    data->func->Call(Context::GetCurrent()->Global(), 1, func_args);
+}
+