uvw  2.10.0
handle.hpp
1 #ifndef UVW_HANDLE_INCLUDE_H
2 #define UVW_HANDLE_INCLUDE_H
3 
4 
5 #include <cstddef>
6 #include <utility>
7 #include <memory>
8 #include <uv.h>
9 #include "resource.hpp"
10 #include "util.h"
11 
12 
13 namespace uvw {
14 
15 
21 struct CloseEvent {};
22 
23 
29 template<typename T, typename U>
30 class Handle: public Resource<T, U> {
31 protected:
32  static void closeCallback(uv_handle_t *handle) {
33  Handle<T, U> &ref = *(static_cast<T*>(handle->data));
34  auto ptr = ref.shared_from_this();
35  (void)ptr;
36  ref.reset();
37  ref.publish(CloseEvent{});
38  }
39 
40  static void allocCallback(uv_handle_t *, std::size_t suggested, uv_buf_t *buf) {
41  auto size = static_cast<unsigned int>(suggested);
42  *buf = uv_buf_init(new char[size], size);
43  }
44 
45  template<typename F, typename... Args>
46  bool initialize(F &&f, Args&&... args) {
47  if(!this->self()) {
48  auto err = std::forward<F>(f)(this->parent(), this->get(), std::forward<Args>(args)...);
49 
50  if(err) {
51  this->publish(ErrorEvent{err});
52  } else {
53  this->leak();
54  }
55  }
56 
57  return this->self();
58  }
59 
60  template<typename F, typename... Args>
61  void invoke(F &&f, Args&&... args) {
62  auto err = std::forward<F>(f)(std::forward<Args>(args)...);
63  if(err) { Emitter<T>::publish(ErrorEvent{err}); }
64  }
65 
66 public:
68 
78  HandleCategory category() const noexcept {
79  return HandleCategory{this->template get<uv_handle_t>()->type};
80  }
81 
91  HandleType type() const noexcept {
93  }
94 
114  bool active() const noexcept {
115  return !(uv_is_active(this->template get<uv_handle_t>()) == 0);
116  }
117 
126  bool closing() const noexcept {
127  return !(uv_is_closing(this->template get<uv_handle_t>()) == 0);
128  }
129 
139  void close() noexcept {
140  if(!closing()) {
141  uv_close(this->template get<uv_handle_t>(), &Handle<T, U>::closeCallback);
142  }
143  }
144 
151  void reference() noexcept {
152  uv_ref(this->template get<uv_handle_t>());
153  }
154 
161  void unreference() noexcept {
162  uv_unref(this->template get<uv_handle_t>());
163  }
164 
169  bool referenced() const noexcept {
170  return !(uv_has_ref(this->template get<uv_handle_t>()) == 0);
171  }
172 
177  std::size_t size() const noexcept {
178  return uv_handle_size(this->template get<uv_handle_t>()->type);
179  }
180 
193  int value = 0;
194  auto err = uv_send_buffer_size(this->template get<uv_handle_t>(), &value);
195  return err ? 0 : value;
196  }
197 
209  bool sendBufferSize(int value) {
210  return (0 == uv_send_buffer_size(this->template get<uv_handle_t>(), &value));
211  }
212 
225  int value = 0;
226  auto err = uv_recv_buffer_size(this->template get<uv_handle_t>(), &value);
227  return err ? 0 : value;
228  }
229 
241  bool recvBufferSize(int value) {
242  return (0 == uv_recv_buffer_size(this->template get<uv_handle_t>(), &value));
243  }
244 
268  uv_os_fd_t fd;
269  uv_fileno(this->template get<uv_handle_t>(), &fd);
270  return fd;
271  }
272 };
273 
274 
275 }
276 
277 #endif // UVW_HANDLE_INCLUDE_H
Event emitter base class.
Definition: emitter.h:87
Handle base class.
Definition: handle.hpp:30
bool closing() const noexcept
Checks if a handle is closing or closed.
Definition: handle.hpp:126
void reference() noexcept
Reference the given handle.
Definition: handle.hpp:151
HandleCategory category() const noexcept
Gets the category of the handle.
Definition: handle.hpp:78
int sendBufferSize()
Gets the size of the send buffer used for the socket.
Definition: handle.hpp:192
bool recvBufferSize(int value)
Sets the size of the receive buffer used for the socket.
Definition: handle.hpp:241
HandleType type() const noexcept
Gets the type of the handle.
Definition: handle.hpp:91
bool active() const noexcept
Checks if the handle is active.
Definition: handle.hpp:114
void unreference() noexcept
Unreference the given handle.
Definition: handle.hpp:161
std::size_t size() const noexcept
Returns the size of the underlying handle type.
Definition: handle.hpp:177
void close() noexcept
Request handle to be closed.
Definition: handle.hpp:139
bool sendBufferSize(int value)
Sets the size of the send buffer used for the socket.
Definition: handle.hpp:209
int recvBufferSize()
Gets the size of the receive buffer used for the socket.
Definition: handle.hpp:224
bool referenced() const noexcept
Checks if the given handle referenced.
Definition: handle.hpp:169
OSFileDescriptor fd() const
Gets the platform dependent file descriptor equivalent.
Definition: handle.hpp:267
Common class for almost all the resources available in uvw.
Definition: resource.hpp:20
uvw default namespace.
Definition: async.h:10
details::UVTypeWrapper< uv_handle_type > HandleCategory
Definition: util.h:188
details::UVTypeWrapper< uv_os_fd_t > OSFileDescriptor
Definition: util.h:191
CloseEvent event.
Definition: handle.hpp:21
The ErrorEvent event.
Definition: emitter.h:25
static HandleType guessHandle(HandleCategory category) noexcept
Gets the type of the handle given a category.