diff --git a/src/uvw/request.hpp b/src/uvw/request.hpp index 05fb4c64..68faac3b 100644 --- a/src/uvw/request.hpp +++ b/src/uvw/request.hpp @@ -16,6 +16,7 @@ struct RequestType; template<> struct RequestType { }; template<> struct RequestType { }; template<> struct RequestType { }; +template<> struct RequestType { }; template diff --git a/src/uvw/stream.hpp b/src/uvw/stream.hpp index f96816bb..0e3261ad 100644 --- a/src/uvw/stream.hpp +++ b/src/uvw/stream.hpp @@ -29,9 +29,25 @@ public: return std::shared_ptr{new Shutdown{std::forward(args)...}}; } - template - void shutdown(uv_stream_t *stream) noexcept { - exec(&uv_shutdown, get(), stream); + void shutdown(uv_stream_t *handle) noexcept { + exec(&uv_shutdown, get(), handle); + } +}; + + +class Write final: public Request { + explicit Write(std::shared_ptr ref) + : Request{RequestType{}, std::move(ref)} + { } + +public: + template + static std::shared_ptr create(Args&&... args) { + return std::shared_ptr{new Write{std::forward(args)...}}; + } + + void write(uv_stream_t *handle, const uv_buf_t bufs[], unsigned int nbufs) { + exec(&uv_write, get(), handle, bufs, nbufs); } }; @@ -61,14 +77,6 @@ class Stream: public Handle { } } - static void writeCallback(uv_write_t *req, int status) { - // TODO migrate to Request (see request.hpp for further details) - T &ref = *(static_cast(req->handle->data)); - if(status) { ref.publish(ErrorEvent{status}); } - else { ref.publish(WriteEvent{}); } - delete req; - } - static void listenCallback(uv_stream_t *handle, int status) { T &ref = *(static_cast(handle->data)); if(status) ref.publish(ErrorEvent{status}); @@ -114,15 +122,17 @@ public: void write(char *data, ssize_t length) { uv_buf_t bufs[] = { uv_buf_init(data, length) }; - // TODO migrate to Request (see request.hpp for further details) - uv_write_t *req = new uv_write_t; + std::weak_ptr weak = this->shared_from_this(); - auto err = uv_write(req, this->template get(), bufs, 1, &Stream::writeCallback); + auto listener = [weak](const auto &event, details::Write &) { + auto ptr = weak.lock(); + if(ptr) { ptr->publish(event); } + }; - if(err) { - delete req; - this->publish(ErrorEvent{err}); - } + auto write = this->loop().template resource(); + write->template once(listener); + write->template once(listener); + write->write(this->template get(), bufs, 1); } void write(std::unique_ptr data, ssize_t length) { diff --git a/src/uvw/tcp.hpp b/src/uvw/tcp.hpp index f2b03f35..1f03f117 100644 --- a/src/uvw/tcp.hpp +++ b/src/uvw/tcp.hpp @@ -19,21 +19,6 @@ namespace details { class Connect final: public Request { - static void connectCallback(uv_connect_t *req, int status) { - Connect &connect = *(static_cast(req->data)); - - auto ptr = connect.shared_from_this(); - (void)ptr; - - connect.reset(); - - if(status) { - connect.publish(ErrorEvent{status}); - } else { - connect.publish(ConnectEvent{}); - } - } - explicit Connect(std::shared_ptr ref) : Request{RequestType{}, std::move(ref)} { } @@ -44,8 +29,8 @@ public: return std::shared_ptr{new Connect{std::forward(args)...}}; } - void connect(uv_tcp_t *tcp, const sockaddr *addr) noexcept { - exec(&uv_tcp_connect, get(), tcp, addr); + void connect(uv_tcp_t *handle, const sockaddr *addr) noexcept { + exec(&uv_tcp_connect, get(), handle, addr); } };