connection.hpp 10.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286
  1. /*
  2. * Copyright (c) 2014, Peter Thorson. All rights reserved.
  3. *
  4. * Redistribution and use in source and binary forms, with or without
  5. * modification, are permitted provided that the following conditions are met:
  6. * * Redistributions of source code must retain the above copyright
  7. * notice, this list of conditions and the following disclaimer.
  8. * * Redistributions in binary form must reproduce the above copyright
  9. * notice, this list of conditions and the following disclaimer in the
  10. * documentation and/or other materials provided with the distribution.
  11. * * Neither the name of the WebSocket++ Project nor the
  12. * names of its contributors may be used to endorse or promote products
  13. * derived from this software without specific prior written permission.
  14. *
  15. * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
  16. * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  17. * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  18. * ARE DISCLAIMED. IN NO EVENT SHALL PETER THORSON BE LIABLE FOR ANY
  19. * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
  20. * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
  21. * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
  22. * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
  23. * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
  24. * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  25. *
  26. */
  27. #ifndef WEBSOCKETPP_TRANSPORT_STUB_CON_HPP
  28. #define WEBSOCKETPP_TRANSPORT_STUB_CON_HPP
  29. #include <websocketpp/transport/stub/base.hpp>
  30. #include <websocketpp/transport/base/connection.hpp>
  31. #include <websocketpp/logger/levels.hpp>
  32. #include <websocketpp/common/connection_hdl.hpp>
  33. #include <websocketpp/common/memory.hpp>
  34. #include <websocketpp/common/platforms.hpp>
  35. #include <string>
  36. #include <vector>
  37. namespace websocketpp {
  38. namespace transport {
  39. namespace stub {
  40. /// Empty timer class to stub out for timer functionality that stub
  41. /// transport doesn't support
  42. struct timer {
  43. void cancel() {}
  44. };
  45. template <typename config>
  46. class connection : public lib::enable_shared_from_this< connection<config> > {
  47. public:
  48. /// Type of this connection transport component
  49. typedef connection<config> type;
  50. /// Type of a shared pointer to this connection transport component
  51. typedef lib::shared_ptr<type> ptr;
  52. /// transport concurrency policy
  53. typedef typename config::concurrency_type concurrency_type;
  54. /// Type of this transport's access logging policy
  55. typedef typename config::alog_type alog_type;
  56. /// Type of this transport's error logging policy
  57. typedef typename config::elog_type elog_type;
  58. // Concurrency policy types
  59. typedef typename concurrency_type::scoped_lock_type scoped_lock_type;
  60. typedef typename concurrency_type::mutex_type mutex_type;
  61. typedef lib::shared_ptr<timer> timer_ptr;
  62. explicit connection(bool is_server, const lib::shared_ptr<alog_type> & alog, const lib::shared_ptr<elog_type> & elog)
  63. : m_alog(alog), m_elog(elog)
  64. {
  65. m_alog->write(log::alevel::devel,"stub con transport constructor");
  66. }
  67. /// Get a shared pointer to this component
  68. ptr get_shared() {
  69. return type::shared_from_this();
  70. }
  71. /// Set whether or not this connection is secure
  72. /**
  73. * Todo: docs
  74. *
  75. * @since 0.3.0-alpha4
  76. *
  77. * @param value Whether or not this connection is secure.
  78. */
  79. void set_secure(bool value) {}
  80. /// Tests whether or not the underlying transport is secure
  81. /**
  82. * TODO: docs
  83. *
  84. * @return Whether or not the underlying transport is secure
  85. */
  86. bool is_secure() const {
  87. return false;
  88. }
  89. /// Set uri hook
  90. /**
  91. * Called by the endpoint as a connection is being established to provide
  92. * the uri being connected to to the transport layer.
  93. *
  94. * Implementation is optional and can be ignored if the transport has no
  95. * need for this information.
  96. *
  97. * @since 0.6.0
  98. *
  99. * @param u The uri to set
  100. */
  101. void set_uri(uri_ptr) {}
  102. /// Set human readable remote endpoint address
  103. /**
  104. * Sets the remote endpoint address returned by `get_remote_endpoint`. This
  105. * value should be a human readable string that describes the remote
  106. * endpoint. Typically an IP address or hostname, perhaps with a port. But
  107. * may be something else depending on the nature of the underlying
  108. * transport.
  109. *
  110. * If none is set a default is returned.
  111. *
  112. * @since 0.3.0-alpha4
  113. *
  114. * @param value The remote endpoint address to set.
  115. */
  116. void set_remote_endpoint(std::string value) {}
  117. /// Get human readable remote endpoint address
  118. /**
  119. * TODO: docs
  120. *
  121. * This value is used in access and error logs and is available to the end
  122. * application for including in user facing interfaces and messages.
  123. *
  124. * @return A string identifying the address of the remote endpoint
  125. */
  126. std::string get_remote_endpoint() const {
  127. return "unknown (stub transport)";
  128. }
  129. /// Get the connection handle
  130. /**
  131. * @return The handle for this connection.
  132. */
  133. connection_hdl get_handle() const {
  134. return connection_hdl();
  135. }
  136. /// Call back a function after a period of time.
  137. /**
  138. * Timers are not implemented in this transport. The timer pointer will
  139. * always be empty. The handler will never be called.
  140. *
  141. * @param duration Length of time to wait in milliseconds
  142. * @param callback The function to call back when the timer has expired
  143. * @return A handle that can be used to cancel the timer if it is no longer
  144. * needed.
  145. */
  146. timer_ptr set_timer(long duration, timer_handler handler) {
  147. return timer_ptr();
  148. }
  149. protected:
  150. /// Initialize the connection transport
  151. /**
  152. * Initialize the connection's transport component.
  153. *
  154. * @param handler The `init_handler` to call when initialization is done
  155. */
  156. void init(init_handler handler) {
  157. m_alog->write(log::alevel::devel,"stub connection init");
  158. handler(make_error_code(error::not_implemented));
  159. }
  160. /// Initiate an async_read for at least num_bytes bytes into buf
  161. /**
  162. * Initiates an async_read request for at least num_bytes bytes. The input
  163. * will be read into buf. A maximum of len bytes will be input. When the
  164. * operation is complete, handler will be called with the status and number
  165. * of bytes read.
  166. *
  167. * This method may or may not call handler from within the initial call. The
  168. * application should be prepared to accept either.
  169. *
  170. * The application should never call this method a second time before it has
  171. * been called back for the first read. If this is done, the second read
  172. * will be called back immediately with a double_read error.
  173. *
  174. * If num_bytes or len are zero handler will be called back immediately
  175. * indicating success.
  176. *
  177. * @param num_bytes Don't call handler until at least this many bytes have
  178. * been read.
  179. * @param buf The buffer to read bytes into
  180. * @param len The size of buf. At maximum, this many bytes will be read.
  181. * @param handler The callback to invoke when the operation is complete or
  182. * ends in an error
  183. */
  184. void async_read_at_least(size_t num_bytes, char * buf, size_t len,
  185. read_handler handler)
  186. {
  187. m_alog->write(log::alevel::devel, "stub_con async_read_at_least");
  188. handler(make_error_code(error::not_implemented), 0);
  189. }
  190. /// Asyncronous Transport Write
  191. /**
  192. * Write len bytes in buf to the output stream. Call handler to report
  193. * success or failure. handler may or may not be called during async_write,
  194. * but it must be safe for this to happen.
  195. *
  196. * Will return 0 on success.
  197. *
  198. * @param buf buffer to read bytes from
  199. * @param len number of bytes to write
  200. * @param handler Callback to invoke with operation status.
  201. */
  202. void async_write(char const * buf, size_t len, write_handler handler) {
  203. m_alog->write(log::alevel::devel,"stub_con async_write");
  204. handler(make_error_code(error::not_implemented));
  205. }
  206. /// Asyncronous Transport Write (scatter-gather)
  207. /**
  208. * Write a sequence of buffers to the output stream. Call handler to report
  209. * success or failure. handler may or may not be called during async_write,
  210. * but it must be safe for this to happen.
  211. *
  212. * Will return 0 on success.
  213. *
  214. * @param bufs vector of buffers to write
  215. * @param handler Callback to invoke with operation status.
  216. */
  217. void async_write(std::vector<buffer> const & bufs, write_handler handler) {
  218. m_alog->write(log::alevel::devel,"stub_con async_write buffer list");
  219. handler(make_error_code(error::not_implemented));
  220. }
  221. /// Set Connection Handle
  222. /**
  223. * @param hdl The new handle
  224. */
  225. void set_handle(connection_hdl hdl) {}
  226. /// Call given handler back within the transport's event system (if present)
  227. /**
  228. * Invoke a callback within the transport's event system if it has one. If
  229. * it doesn't, the handler will be invoked immediately before this function
  230. * returns.
  231. *
  232. * @param handler The callback to invoke
  233. *
  234. * @return Whether or not the transport was able to register the handler for
  235. * callback.
  236. */
  237. lib::error_code dispatch(dispatch_handler handler) {
  238. handler();
  239. return lib::error_code();
  240. }
  241. /// Perform cleanup on socket shutdown_handler
  242. /**
  243. * @param h The `shutdown_handler` to call back when complete
  244. */
  245. void async_shutdown(shutdown_handler handler) {
  246. handler(lib::error_code());
  247. }
  248. private:
  249. // member variables!
  250. lib::shared_ptr<alog_type> m_alog;
  251. lib::shared_ptr<elog_type> m_elog;
  252. };
  253. } // namespace stub
  254. } // namespace transport
  255. } // namespace websocketpp
  256. #endif // WEBSOCKETPP_TRANSPORT_STUB_CON_HPP