From a5ba0c3c606df801bb498060053ec46bdbb0c71b Mon Sep 17 00:00:00 2001 From: Michele Caini Date: Wed, 27 Jul 2016 13:09:44 +0200 Subject: [PATCH] WIP: Fs::[readlink/readlinkSync] --- src/uvw/fs.hpp | 57 +++++++++++++++++++++++++++++++++++++------------- 1 file changed, 43 insertions(+), 14 deletions(-) diff --git a/src/uvw/fs.hpp b/src/uvw/fs.hpp index 4de70211..cbd70eb5 100644 --- a/src/uvw/fs.hpp +++ b/src/uvw/fs.hpp @@ -123,6 +123,22 @@ private: }; +template<> +struct TypedEvent + : Event> +{ + using Type = details::UVFsType; + static constexpr details::UVFsType value = details::UVFsType::READLINK; + + explicit TypedEvent(const char *d) noexcept: dt{d} { } + + const char * data() const noexcept { return dt; } + +private: + const char *dt; +}; + + template using FsEvent = TypedEvent; @@ -171,13 +187,19 @@ class Fs final: public Request { } static void fsReadlinkCallback(uv_fs_t *req) { - // TODO - uv_fs_readlink callback - /* -[10:00] <@saghul> in readlink's case, the result is in req->ptr -[10:00] <@saghul> it's a null terminated string -[10:00] <@saghul> but in that case the result will be 0 -[10:00] <@saghul> indicating success - */ + Fs &fs = *(static_cast(req->data)); + + auto ptr = fs.shared_from_this(); + (void)ptr; + + fs.reset(); + + if(req->result) { + int err = req->result; + fs.publish(ErrorEvent{err}); + } else { + fs.publish(FsEvent{static_cast(req->ptr)}); + } } using Request::Request; @@ -302,8 +324,9 @@ public: } auto statSync(std::string path) { - auto err = cleanupAndExec(&uv_fs_stat, parent(), get(), path.data(), nullptr); - return std::make_pair(ErrorEvent{err}, FsEvent{get()->statbuf}); + auto req = get(); + auto err = cleanupAndExec(&uv_fs_stat, parent(), req, path.data(), nullptr); + return std::make_pair(ErrorEvent{err}, FsEvent{req->statbuf}); } void fstat(FileHandle file) { @@ -311,8 +334,9 @@ public: } auto fstatSync(FileHandle file) { - auto err = cleanupAndExec(&uv_fs_fstat, parent(), get(), file, nullptr); - return std::make_pair(ErrorEvent{err}, FsEvent{get()->statbuf}); + auto req = get(); + auto err = cleanupAndExec(&uv_fs_fstat, parent(), req, file, nullptr); + return std::make_pair(ErrorEvent{err}, FsEvent{req->statbuf}); } void lstat(std::string path) { @@ -320,8 +344,9 @@ public: } auto lstatSync(std::string path) { - auto err = cleanupAndExec(&uv_fs_lstat, parent(), get(), path.data(), nullptr); - return std::make_pair(ErrorEvent{err}, FsEvent{get()->statbuf}); + auto req = get(); + auto err = cleanupAndExec(&uv_fs_lstat, parent(), req, path.data(), nullptr); + return std::make_pair(ErrorEvent{err}, FsEvent{req->statbuf}); } void rename(std::string old, std::string path) { @@ -436,7 +461,11 @@ public: cleanupAndInvoke(&uv_fs_readlink, parent(), get(), path.data(), &fsReadlinkCallback); } - // TODO uv_fs_readlink (sync (cb null)) + auto readlinkSync(std::string path) { + auto req = get(); + auto err = cleanupAndExec(&uv_fs_readlink, parent(), req, path.data(), nullptr); + return std::make_pair(ErrorEvent{err}, FsEvent{static_cast(req->ptr)}); + } void realpath(std::string path) { cleanupAndInvoke(&uv_fs_realpath, parent(), get(), path.data(), &fsGenericCallback);