mirror of https://github.com/lukechilds/node.git
Ryan
16 years ago
8 changed files with 146 additions and 63 deletions
@ -0,0 +1,56 @@ |
|||
#include "events.h" |
|||
|
|||
#include <assert.h> |
|||
#include <stdlib.h> |
|||
#include <string.h> |
|||
#include <strings.h> |
|||
#include <errno.h> |
|||
#include <sys/types.h> |
|||
#include <sys/socket.h> |
|||
#include <netdb.h> |
|||
#include <arpa/inet.h> /* inet_ntop */ |
|||
#include <netinet/in.h> /* sockaddr_in, sockaddr_in6 */ |
|||
|
|||
using namespace v8; |
|||
using namespace node; |
|||
|
|||
Persistent<FunctionTemplate> EventEmitter::constructor_template; |
|||
|
|||
void |
|||
EventEmitter::Initialize (v8::Handle<v8::Object> target) |
|||
{ |
|||
HandleScope scope; |
|||
|
|||
Local<FunctionTemplate> t = FunctionTemplate::New(); |
|||
constructor_template = Persistent<FunctionTemplate>::New(t); |
|||
|
|||
// All prototype methods are defined in events.js
|
|||
|
|||
target->Set(String::NewSymbol("EventEmitter"), constructor_template->GetFunction()); |
|||
} |
|||
|
|||
bool |
|||
EventEmitter::Emit (const char *type, int argc, Handle<Value> argv[]) |
|||
{ |
|||
Local<Value> emit_v = handle_->Get(String::NewSymbol("emit")); |
|||
assert(emit_v->IsFunction()); |
|||
Local<Function> emit = Local<Function>::Cast(emit_v); |
|||
|
|||
Local<Array> event_args = Array::New(argc); |
|||
for (int i = 0; i < argc; i++) { |
|||
event_args->Set(Integer::New(i), argv[i]); |
|||
} |
|||
|
|||
Handle<Value> emit_argv[2] = { String::NewSymbol(type), event_args }; |
|||
|
|||
TryCatch try_catch; |
|||
|
|||
emit->Call(handle_, 2, emit_argv); |
|||
|
|||
if (try_catch.HasCaught()) { |
|||
FatalException(try_catch); |
|||
return false; |
|||
} |
|||
|
|||
return true; |
|||
} |
@ -0,0 +1,21 @@ |
|||
#ifndef node_events_h |
|||
#define node_events_h |
|||
|
|||
#include "node.h" |
|||
#include <v8.h> |
|||
|
|||
namespace node { |
|||
|
|||
class EventEmitter : public ObjectWrap { |
|||
public: |
|||
static void Initialize (v8::Handle<v8::Object> target); |
|||
static v8::Persistent<v8::FunctionTemplate> constructor_template; |
|||
|
|||
bool Emit (const char *type, int argc, v8::Handle<v8::Value> argv[]); |
|||
|
|||
EventEmitter (v8::Handle<v8::Object> handle) |
|||
: ObjectWrap(handle) { }; |
|||
}; |
|||
|
|||
} // namespace node
|
|||
#endif |
@ -0,0 +1,33 @@ |
|||
(function () { |
|||
|
|||
// node.EventEmitter is defined in src/events.cc
|
|||
var emitter = node.EventEmitter.prototype; |
|||
|
|||
emitter.addListener = function (type, listener) { |
|||
if (!this._events) this._events = {}; |
|||
if (!this._events.hasOwnProperty(type)) this._events[type] = []; |
|||
this._events[type].push(listener); |
|||
}; |
|||
|
|||
emitter.listeners = function (type, listener) { |
|||
if (!this._events) this._events = {}; |
|||
if (!this._events.hasOwnProperty(type)) this._events[type] = []; |
|||
return this._events[type]; |
|||
}; |
|||
|
|||
/* This function is called often from C++. |
|||
* See events.cc |
|||
*/ |
|||
emitter.emit = function (type, args) { |
|||
if (this["on" + type] instanceof Function) { |
|||
this["on" + type].apply(this, args); |
|||
} |
|||
if (!this._events) return; |
|||
if (!this._events.hasOwnProperty(type)) return; |
|||
for (var i = 0; i < this._events[type].length; i++) { |
|||
var listener = this._events[type][i]; |
|||
listener.apply(this, args); |
|||
} |
|||
}; |
|||
|
|||
})(); // end annonymous namespace
|
Loading…
Reference in new issue