#pragma once
#include "UVHandle.h"
#include <panda/unievent/backend/FsEventImpl.h>
namespace panda { namespace unievent { namespace backend { namespace uv {
struct UVFsEvent : UVHandle<FsEventImpl, uv_fs_event_t> {
UVFsEvent (UVLoop* loop, IFsEventImplListener* lst) : UVHandle<FsEventImpl, uv_fs_event_t>(loop, lst) {
uvx_strict(uv_fs_event_init(loop->uvloop, &uvh));
}
std::error_code start (string_view path, unsigned flags) override {
unsigned uv_flags = 0;
if (flags & Flags::RECURSIVE) uv_flags |= UV_FS_EVENT_RECURSIVE;
UE_NULL_TERMINATE(path, path_str);
return uvx_ce(uv_fs_event_start(&uvh, on_fs_event, path_str, uv_flags));
}
std::error_code stop () override {
return uvx_ce(uv_fs_event_stop(&uvh));
}
private:
static void on_fs_event (uv_fs_event_t* p, const char* filename, int uv_events, int status) {
auto h = get_handle<UVFsEvent*>(p);
auto sv = (status || !filename) ? string_view() : string_view(filename);
int events = 0;
if (uv_events & UV_RENAME) events |= Event::RENAME;
if (uv_events & UV_CHANGE) events |= Event::CHANGE;
h->handle_fs_event(sv, events, uvx_ce(status));
}
};
}}}}