123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412 |
- #ifndef WEBSOCKETPP_TRANSPORT_DEBUG_CON_HPP
- #define WEBSOCKETPP_TRANSPORT_DEBUG_CON_HPP
- #include <websocketpp/transport/debug/base.hpp>
- #include <websocketpp/transport/base/connection.hpp>
- #include <websocketpp/uri.hpp>
- #include <websocketpp/logger/levels.hpp>
- #include <websocketpp/common/connection_hdl.hpp>
- #include <websocketpp/common/memory.hpp>
- #include <websocketpp/common/platforms.hpp>
- #include <string>
- #include <vector>
- namespace websocketpp {
- namespace transport {
- namespace debug {
- struct timer {
- void cancel() {}
- };
- template <typename config>
- class connection : public lib::enable_shared_from_this< connection<config> > {
- public:
-
- typedef connection<config> type;
-
- typedef lib::shared_ptr<type> ptr;
-
- typedef typename config::concurrency_type concurrency_type;
-
- typedef typename config::alog_type alog_type;
-
- typedef typename config::elog_type elog_type;
-
- typedef typename concurrency_type::scoped_lock_type scoped_lock_type;
- typedef typename concurrency_type::mutex_type mutex_type;
- typedef lib::shared_ptr<timer> timer_ptr;
- explicit connection(bool is_server, const lib::shared_ptr<alog_type> & alog, const lib::shared_ptr<elog_type> & elog)
- : m_reading(false), m_is_server(is_server), m_alog(alog), m_elog(elog)
- {
- m_alog->write(log::alevel::devel,"debug con transport constructor");
- }
-
- ptr get_shared() {
- return type::shared_from_this();
- }
-
-
- void set_secure(bool) {}
-
-
- bool is_secure() const {
- return false;
- }
-
-
- void set_uri(uri_ptr) {}
-
-
- void set_remote_endpoint(std::string) {}
-
-
- std::string get_remote_endpoint() const {
- return "unknown (debug transport)";
- }
-
-
- connection_hdl get_handle() const {
- return connection_hdl();
- }
-
-
- timer_ptr set_timer(long, timer_handler handler) {
- m_alog->write(log::alevel::devel,"debug connection set timer");
- m_timer_handler = handler;
- return timer_ptr();
- }
-
-
-
- size_t read_all(char const * buf, size_t len) {
- size_t total_read = 0;
- size_t temp_read = 0;
- do {
- temp_read = this->read_some_impl(buf+total_read,len-total_read);
- total_read += temp_read;
- } while (temp_read != 0 && total_read < len);
- return total_read;
- }
-
-
- void expire_timer(lib::error_code const & ec) {
- m_timer_handler(ec);
- }
-
- void fullfil_write() {
- m_write_handler(lib::error_code());
- }
- protected:
-
-
- void init(init_handler handler) {
- m_alog->write(log::alevel::devel,"debug connection init");
- handler(lib::error_code());
- }
-
-
- void async_read_at_least(size_t num_bytes, char * buf, size_t len,
- read_handler handler)
- {
- std::stringstream s;
- s << "debug_con async_read_at_least: " << num_bytes;
- m_alog->write(log::alevel::devel,s.str());
- if (num_bytes > len) {
- handler(make_error_code(error::invalid_num_bytes),size_t(0));
- return;
- }
- if (m_reading == true) {
- handler(make_error_code(error::double_read),size_t(0));
- return;
- }
- if (num_bytes == 0 || len == 0) {
- handler(lib::error_code(),size_t(0));
- return;
- }
- m_buf = buf;
- m_len = len;
- m_bytes_needed = num_bytes;
- m_read_handler = handler;
- m_cursor = 0;
- m_reading = true;
- }
-
-
- void async_write(char const *, size_t, write_handler handler) {
- m_alog->write(log::alevel::devel,"debug_con async_write");
- m_write_handler = handler;
- }
-
-
- void async_write(std::vector<buffer> const &, write_handler handler) {
- m_alog->write(log::alevel::devel,"debug_con async_write buffer list");
- m_write_handler = handler;
- }
-
-
- void set_handle(connection_hdl) {}
-
-
- lib::error_code dispatch(dispatch_handler handler) {
- handler();
- return lib::error_code();
- }
-
-
- void async_shutdown(shutdown_handler handler) {
- handler(lib::error_code());
- }
-
- size_t read_some_impl(char const * buf, size_t len) {
- m_alog->write(log::alevel::devel,"debug_con read_some");
- if (!m_reading) {
- m_elog->write(log::elevel::devel,"write while not reading");
- return 0;
- }
- size_t bytes_to_copy = (std::min)(len,m_len-m_cursor);
- std::copy(buf,buf+bytes_to_copy,m_buf+m_cursor);
- m_cursor += bytes_to_copy;
- if (m_cursor >= m_bytes_needed) {
- complete_read(lib::error_code());
- }
- return bytes_to_copy;
- }
-
-
- void complete_read(lib::error_code const & ec) {
- m_reading = false;
- read_handler handler = m_read_handler;
- m_read_handler = read_handler();
- handler(ec,m_cursor);
- }
- private:
- timer_handler m_timer_handler;
-
-
- char * m_buf;
- size_t m_len;
- size_t m_bytes_needed;
- read_handler m_read_handler;
- size_t m_cursor;
-
- connection_hdl m_connection_hdl;
- write_handler m_write_handler;
- shutdown_handler m_shutdown_handler;
- bool m_reading;
- bool const m_is_server;
- bool m_is_secure;
- lib::shared_ptr<alog_type> m_alog;
- lib::shared_ptr<elog_type> m_elog;
- std::string m_remote_endpoint;
- };
- }
- }
- }
- #endif
|