49
void StatWatcher::Callback(EV_P_ ev_stat *watcher, int revents) {
50
assert(revents == EV_STAT);
51
StatWatcher *handler = static_cast<StatWatcher*>(watcher->data);
52
assert(watcher == &handler->watcher_);
52
static void Delete(uv_handle_t* handle) {
53
delete reinterpret_cast<uv_fs_poll_t*>(handle);
57
StatWatcher::StatWatcher()
59
, watcher_(new uv_fs_poll_t)
61
uv_fs_poll_init(uv_default_loop(), watcher_);
62
watcher_->data = static_cast<void*>(this);
66
StatWatcher::~StatWatcher() {
68
uv_close(reinterpret_cast<uv_handle_t*>(watcher_), Delete);
72
void StatWatcher::Callback(uv_fs_poll_t* handle,
74
const uv_statbuf_t* prev,
75
const uv_statbuf_t* curr) {
76
StatWatcher* wrap = static_cast<StatWatcher*>(handle->data);
77
assert(wrap->watcher_ == handle);
54
Handle<Value> argv[2];
55
argv[0] = Handle<Value>(BuildStatsObject(&watcher->attr));
56
argv[1] = Handle<Value>(BuildStatsObject(&watcher->prev));
57
MakeCallback(handler->handle_, "onchange", 2, argv);
80
argv[0] = BuildStatsObject(curr);
81
argv[1] = BuildStatsObject(prev);
82
argv[2] = Integer::New(status);
84
SetErrno(uv_last_error(wrap->watcher_->loop));
86
if (onchange_sym.IsEmpty()) {
87
onchange_sym = NODE_PSYMBOL("onchange");
89
MakeCallback(wrap->handle_, onchange_sym, ARRAY_SIZE(argv), argv);
61
93
Handle<Value> StatWatcher::New(const Arguments& args) {
62
if (!args.IsConstructCall()) {
63
return FromConstructorTemplate(constructor_template, args);
94
assert(args.IsConstructCall());
67
StatWatcher *s = new StatWatcher();
96
StatWatcher* s = new StatWatcher();
68
97
s->Wrap(args.Holder());
69
98
return args.This();
73
102
Handle<Value> StatWatcher::Start(const Arguments& args) {
103
assert(args.Length() == 3);
74
104
HandleScope scope;
76
if (args.Length() < 1 || !args[0]->IsString()) {
77
return ThrowException(Exception::TypeError(String::New("Bad arguments")));
80
StatWatcher *handler = ObjectWrap::Unwrap<StatWatcher>(args.Holder());
81
String::Utf8Value path(args[0]->ToString());
83
assert(handler->path_ == NULL);
84
handler->path_ = strdup(*path);
86
ev_tstamp interval = 0.;
87
if (args[2]->IsInt32()) {
88
interval = NODE_V8_UNIXTIME(args[2]);
91
ev_stat_set(&handler->watcher_, handler->path_, interval);
92
ev_stat_start(EV_DEFAULT_UC_ &handler->watcher_);
94
handler->persistent_ = args[1]->IsTrue();
96
if (!handler->persistent_) {
97
ev_unref(EV_DEFAULT_UC);
106
StatWatcher* wrap = ObjectWrap::Unwrap<StatWatcher>(args.Holder());
107
String::Utf8Value path(args[0]);
108
const bool persistent = args[1]->BooleanValue();
109
const uint32_t interval = args[2]->Uint32Value();
111
if (!persistent) uv_unref(reinterpret_cast<uv_handle_t*>(wrap->watcher_));
112
uv_fs_poll_start(wrap->watcher_, Callback, *path, interval);
102
115
return Undefined();
106
119
Handle<Value> StatWatcher::Stop(const Arguments& args) {
107
120
HandleScope scope;
108
StatWatcher *handler = ObjectWrap::Unwrap<StatWatcher>(args.Holder());
109
MakeCallback(handler->handle_, "onstop", 0, NULL);
121
StatWatcher* wrap = ObjectWrap::Unwrap<StatWatcher>(args.Holder());
122
if (onstop_sym.IsEmpty()) {
123
onstop_sym = NODE_PSYMBOL("onstop");
125
MakeCallback(wrap->handle_, onstop_sym, 0, NULL);
111
127
return Undefined();
115
131
void StatWatcher::Stop () {
116
if (watcher_.active) {
117
if (!persistent_) ev_ref(EV_DEFAULT_UC);
118
ev_stat_stop(EV_DEFAULT_UC_ &watcher_);
132
if (!uv_is_active(reinterpret_cast<uv_handle_t*>(watcher_))) return;
133
uv_fs_poll_stop(watcher_);