From c30cd0fe90fdebb0a42594fde2a7175dbc834c15 Mon Sep 17 00:00:00 2001 From: "melo.yao" Date: Fri, 3 Apr 2015 02:24:18 +0800 Subject: [PATCH] partially work --- src/internal/sio_client_impl.h | 10 +- src/sio_client.cpp | 229 +------------------------ src/sio_client.h | 38 ---- src/sio_socket.cpp | 305 +++++++++++++++++++++++++++++++-- src/sio_socket.h | 36 +++- 5 files changed, 326 insertions(+), 292 deletions(-) diff --git a/src/internal/sio_client_impl.h b/src/internal/sio_client_impl.h index 9e1da9b..f0963b9 100644 --- a/src/internal/sio_client_impl.h +++ b/src/internal/sio_client_impl.h @@ -80,12 +80,12 @@ void set_##__FIELD__(__TYPE__ const& l) \ std::string const& get_sessionid() const { return m_sid; } - std::string const& get_namespace() const { return m_nsp; } - friend class client; protected: void send(packet const& packet); + void remove_socket(std::string const& nsp); + private: void send(std::shared_ptr const& payload_ptr,frame::opcode::value opcode); @@ -118,12 +118,6 @@ void set_##__FIELD__(__TYPE__ const& l) \ void on_pong_timeout(); - // Message Parsing callbacks. - void on_socketio_event(const std::string& nsp, int msgId,const std::string& name, message::ptr const& message); - void on_socketio_ack(int msgId, message::ptr const& message); - - void on_socketio_error(message::ptr const& err_message); - void reset_states(); void clear_timers(); diff --git a/src/sio_client.cpp b/src/sio_client.cpp index 48503a3..3a6f753 100755 --- a/src/sio_client.cpp +++ b/src/sio_client.cpp @@ -24,75 +24,6 @@ using std::stringstream; namespace sio { - class event_adapter - { - public: - static void adapt_func(client::event_listener_aux const& func, event& event) - { - func(event.get_name(),event.get_message(),event.need_ack(),event.__get_ack_message()); - } - - static inline client::event_listener do_adapt(client::event_listener_aux const& func) - { - return std::bind(&event_adapter::adapt_func, func,std::placeholders::_1); - } - - static inline event create_event(std::string const& nsp,std::string const& name,message::ptr const& message,bool need_ack) - { - return event(nsp,name,message,need_ack); - } - }; - - inline - const std::string& event::get_nsp() const - { - return m_nsp; - } - - inline - const std::string& event::get_name() const - { - return m_name; - } - - inline - const message::ptr& event::get_message() const - { - return m_message; - } - - inline - bool event::need_ack() const - { - return m_need_ack; - } - - inline - void event::put_ack_message(message::ptr const& ack_message) - { - if(m_need_ack) - m_ack_message = ack_message; - } - - inline - event::event(std::string const& nsp,std::string const& name,message::ptr const& message,bool need_ack): - m_nsp(nsp), - m_name(name), - m_message(message), - m_need_ack(need_ack) - { - } - - message::ptr const& event::get_ack_message() const - { - return m_ack_message; - } - - message::ptr& event::__get_ack_message() - { - return m_ack_message; - } - client::client(): m_impl(new impl()) @@ -425,79 +356,7 @@ namespace sio { case packet::frame_message: { - switch (p.get_type()) - { - // Connect open - case packet::type_connect: - { - LOG("Received Message type (Connect)"<on_connected(); - } - break; - } - case packet::type_disconnect: - { - LOG("Received Message type (Disconnect)"<get_flag() == message::flag_array) - { - const array_message* array_ptr = static_cast(ptr.get()); - if(array_ptr->get_vector().size() >= 1&&array_ptr->get_vector()[0]->get_flag() == message::flag_string) - { - const string_message* name_ptr = static_cast(array_ptr->get_vector()[0].get()); - message::ptr value_ptr; - if(array_ptr->get_vector().size()>1) - { - value_ptr = array_ptr->get_vector()[1]; - } - this->on_socketio_event(p.get_nsp(), p.get_pack_id(),name_ptr->get_string(), value_ptr); - } - } - - break; - } - // Ack - case packet::type_ack: - case packet::type_binary_ack: - { - LOG("Received Message type (ACK)"<get_flag() == message::flag_array) - { - const array_message* array_ptr = static_cast(ptr.get()); - if(array_ptr->get_vector().size() >= 1&&array_ptr->get_vector()[0]->get_flag() == message::flag_string) - { - message::ptr value_ptr; - if(array_ptr->get_vector().size()>1) - { - value_ptr = array_ptr->get_vector()[1]; - } - this->on_socketio_ack(p.get_pack_id(), value_ptr); - break; - } - } - this->on_socketio_ack(p.get_pack_id(),ptr); - break; - } - // Error - case packet::type_error: - { - LOG("Received Message type (ERROR)"<on_socketio_error(p.get_message()); - break; - } - default: - break; - } + break; } case packet::frame_open: @@ -521,53 +380,7 @@ namespace sio m_client.get_io_service().dispatch(lib::bind(&client::impl::__send,this,payload,isBinary?frame::opcode::binary:frame::opcode::text)); } - - unsigned int client::impl::s_global_event_id = 1; - - void client::impl::emit(std::string const& name, std::string const& message) - { - message::ptr msg_ptr = make_message(name, message); - packet p(m_nsp, msg_ptr); - m_packet_mgr.encode(p); - } - - void client::impl::emit(std::string const& name, std::string const& message, std::function const& ack) - { - message::ptr msg_ptr = make_message(name, message); - packet p(m_nsp, msg_ptr,s_global_event_id); - m_acks[s_global_event_id++] = ack; - m_packet_mgr.encode(p); - } - - void client::impl::emit(std::string const& name, message::ptr const& args) - { - message::ptr msg_ptr = make_message(name, args); - packet p(m_nsp, msg_ptr); - m_packet_mgr.encode(p); - } - - void client::impl::emit(std::string const& name, message::ptr const& args, std::function const& ack) - { - message::ptr msg_ptr = make_message(name, args); - packet p(m_nsp, msg_ptr,s_global_event_id); - m_acks[s_global_event_id++] = ack; - m_packet_mgr.encode(p); - } - - void client::impl::emit(std::string const& name, std::shared_ptr const& binary_ptr) - { - message::ptr msg_ptr = make_message(name, binary_ptr); - packet p(m_nsp, msg_ptr); - m_packet_mgr.encode(p); - } - - void client::impl::emit(std::string const& name, std::shared_ptr const& binary_ptr, std::function const& ack) - { - message::ptr msg_ptr = make_message(name, binary_ptr); - packet p(m_nsp, msg_ptr,s_global_event_id); - m_acks[s_global_event_id++] = ack; - m_packet_mgr.encode(p); - } + void client::impl::__ping(const boost::system::error_code& ec) { @@ -793,42 +606,4 @@ namespace sio "run loop end"); } - - // This is where you'd add in behavior to handle events. - // By default, nothing is done with the endpoint or ID params. - void client::impl::on_socketio_event(const std::string& nsp,int msgId,const std::string& name, message::ptr const& message) - { - event_listener *functor_ptr = &(m_default_event_listener); - auto it = m_event_binding.find(name); - if(it!=m_event_binding.end()) - { - functor_ptr = &(it->second); - } - bool needAck = msgId >= 0; - event ev = event_adapter::create_event(nsp,name, message,needAck); - if (*functor_ptr) { - (*functor_ptr)(ev); - } - if(needAck) - { - this->__ack(msgId, name, ev.get_ack_message()); - } - } - - // This is where you'd add in behavior to handle ack - void client::impl::on_socketio_ack(int msgId, message::ptr const& message) - { - auto it = m_acks.find(msgId); - if(it!=m_acks.end()) - { - (it->second)(message); - m_acks.erase(it); - } - } - - // This is where you'd add in behavior to handle errors - void client::impl::on_socketio_error(message::ptr const& err_message) - { - if(m_error_listener)m_error_listener(err_message); - } } diff --git a/src/sio_client.h b/src/sio_client.h index faf3cbe..8f2c701 100755 --- a/src/sio_client.h +++ b/src/sio_client.h @@ -12,38 +12,6 @@ namespace sio { - class event_adapter; - - class event - { - public: - const std::string& get_nsp() const; - - const std::string& get_name() const; - - const message::ptr& get_message() const; - - bool need_ack() const; - - void put_ack_message(message::ptr const& ack_message); - - message::ptr const& get_ack_message() const; - - protected: - event(std::string const& nsp,std::string const& name,message::ptr const& message,bool need_ack); - - message::ptr& __get_ack_message(); - - private: - const std::string m_nsp; - const std::string m_name; - const message::ptr m_message; - const bool m_need_ack; - message::ptr m_ack_message; - - friend class event_adapter; - }; - class client { public: enum close_reason @@ -55,12 +23,6 @@ namespace sio { typedef std::function con_listener; typedef std::function close_listener; - - typedef std::function event_listener_aux; - - typedef std::function event_listener; - - typedef std::function error_listener; client(); ~client(); diff --git a/src/sio_socket.cpp b/src/sio_socket.cpp index 6a4f742..3cf42dd 100644 --- a/src/sio_socket.cpp +++ b/src/sio_socket.cpp @@ -1,23 +1,95 @@ #include "sio_socket.h" +#include "sio_packet.h" namespace sio { + +class event_adapter +{ +public: + static void adapt_func(client::event_listener_aux const& func, event& event) + { + func(event.get_name(),event.get_message(),event.need_ack(),event.__get_ack_message()); + } + + static inline client::event_listener do_adapt(client::event_listener_aux const& func) + { + return std::bind(&event_adapter::adapt_func, func,std::placeholders::_1); + } + + static inline event create_event(std::string const& nsp,std::string const& name,message::ptr const& message,bool need_ack) + { + return event(nsp,name,message,need_ack); + } +}; + +inline +const std::string& event::get_nsp() const +{ + return m_nsp; +} + +inline +const std::string& event::get_name() const +{ + return m_name; +} + +inline +const message::ptr& event::get_message() const +{ + return m_message; +} + +inline +bool event::need_ack() const +{ + return m_need_ack; +} + +inline +void event::put_ack_message(message::ptr const& ack_message) +{ + if(m_need_ack) + m_ack_message = ack_message; +} + +inline +event::event(std::string const& nsp,std::string const& name,message::ptr const& message,bool need_ack): +m_nsp(nsp), +m_name(name), +m_message(message), +m_need_ack(need_ack) +{ +} + +message::ptr const& event::get_ack_message() const +{ + return m_ack_message; +} + +message::ptr& event::__get_ack_message() +{ + return m_ack_message; +} + + class socket::impl { public: - typedef std::function event_listener; - typedef std::function error_listener; - - typedef std::function con_listener; - - impl(); + impl(client::impl *,std::string const&); ~impl(); - void bind_event(std::string const& event_name,event_listener const& func) + void on(std::string const& event_name,event_listener_aux const& func) + { + m_event_binding[event_name] = event_adapter::do_adapt(func); + } + + void on(std::string const& event_name,event_listener const& func) { m_event_binding[event_name] = func; } - void unbind_event(std::string const& event_name) + void off(std::string const& event_name) { auto it = m_event_binding.find(event_name); if(it!=m_event_binding.end()) @@ -26,7 +98,7 @@ public: } } - void clear_event_bindings() + void all_off() { m_event_binding.clear(); } @@ -37,8 +109,12 @@ public: SYNTHESIS_SETTER(con_listener,connect_listener) SYNTHESIS_SETTER(error_listener, error_listener) //socket io errors + + SYNTHESIS_SETTER(con_listener, disconnect_listener) //socket io errors #undef SYNTHESIS_SETTER + void connect(); + void emit(std::string const& name, std::string const& message); void emit(std::string const& name, std::string const& message, std::function const& ack); @@ -51,10 +127,22 @@ public: void emit(std::string const& name, std::shared_ptr const& binary_ptr, std::function const& ack); + std::string const& get_namespace() const {return m_nsp;} + protected: void on_connected(); + + void on_disconnected(); + + void on_message_packet(packet const& packet); + private: + // Message Parsing callbacks. + void on_socketio_event(const std::string& nsp, int msgId,const std::string& name, message::ptr const& message); + void on_socketio_ack(int msgId, message::ptr const& message); + void on_socketio_error(message::ptr const& err_message); + void __ack(int msgId,string const& name,message::ptr const& ack_message); static unsigned int s_global_event_id; @@ -69,12 +157,17 @@ private: std::map m_event_binding; - con_listener m_open_listener; + con_listener m_connect_listener; - std::unique_ptr m_connection_timer; + con_listener m_disconnect_listener; + + error_listener m_error_listener; + + std::unique_ptr m_connection_timer; }; -socket::impl() +socket::impl(client::impl *client,std::string const& nsp): +m_client(client),m_nsp(nsp) { } @@ -84,18 +177,194 @@ socket::~impl() } +unsigned int client::impl::s_global_event_id = 1; -void socket::emit(std::string const& name, std::string const& message); +void socket::impl::emit(std::string const& name, std::string const& message) +{ + message::ptr msg_ptr = make_message(name, message); + packet p(m_nsp, msg_ptr); + m_client->send(p); +} -void socket::emit(std::string const& name, std::string const& message, std::function const& ack); +void socket::impl::emit(std::string const& name, std::string const& message, std::function const& ack) +{ + message::ptr msg_ptr = make_message(name, message); + packet p(m_nsp, msg_ptr,s_global_event_id); + m_acks[s_global_event_id++] = ack; + m_client->send(p); +} -void socket::emit(std::string const& name, message::ptr const& args); +void socket::impl::emit(std::string const& name, message::ptr const& args) +{ + message::ptr msg_ptr = make_message(name, args); + packet p(m_nsp, msg_ptr); + m_client->send(p); +} -void socket::emit(std::string const& name, message::ptr const& args, std::function const& ack); +void socket::impl::emit(std::string const& name, message::ptr const& args, std::function const& ack) +{ + message::ptr msg_ptr = make_message(name, args); + packet p(m_nsp, msg_ptr,s_global_event_id); + m_acks[s_global_event_id++] = ack; + m_client->send(p); +} -void socket::emit(std::string const& name, std::shared_ptr const& binary_ptr); +void socket::impl::emit(std::string const& name, std::shared_ptr const& binary_ptr) +{ + message::ptr msg_ptr = make_message(name, binary_ptr); + packet p(m_nsp, msg_ptr); + m_client->send(p); +} -void socket::emit(std::string const& name, std::shared_ptr const& binary_ptr, std::function const& ack); +void socket::impl::emit(std::string const& name, std::shared_ptr const& binary_ptr, std::function const& ack) +{ + message::ptr msg_ptr = make_message(name, binary_ptr); + packet p(m_nsp, msg_ptr,s_global_event_id); + m_acks[s_global_event_id++] = ack; + m_client->send(p); +} + + void connect() + { + if(!m_connect) + { + packet p(packet::type_connect,m_nsp); + m_client->send(p); + } + } + +void socket::impl::on_connected() +{ + + m_connected = true; + if(m_connect_listener) + { + m_connect_listener(); + } +} + +void socket::impl::on_disconnected() +{ + m_connected = false; + m_client->remove_socket(m_nsp); + m_client = NULL; + if(m_disconnect_listener) + { + m_disconnect_listener(); + } +} + +void socket::impl::on_message_packet(packet const& p) +{ + if(p.get_nsp() == m_nsp) + { + switch (p.get_type()) + { + // Connect open + case packet::type_connect: + { + LOG("Received Message type (Connect)"<on_connected(); + break; + } + case packet::type_disconnect: + { + LOG("Received Message type (Disconnect)"<on_disconnected(); + break; + } + case packet::type_event: + case packet::type_binary_event: + { + LOG("Received Message type (Event)"<get_flag() == message::flag_array) + { + const array_message* array_ptr = static_cast(ptr.get()); + if(array_ptr->get_vector().size() >= 1&&array_ptr->get_vector()[0]->get_flag() == message::flag_string) + { + const string_message* name_ptr = static_cast(array_ptr->get_vector()[0].get()); + message::ptr value_ptr; + if(array_ptr->get_vector().size()>1) + { + value_ptr = array_ptr->get_vector()[1]; + } + this->on_socketio_event(p.get_nsp(), p.get_pack_id(),name_ptr->get_string(), value_ptr); + } + } + + break; + } + // Ack + case packet::type_ack: + case packet::type_binary_ack: + { + LOG("Received Message type (ACK)"<get_flag() == message::flag_array) + { + const array_message* array_ptr = static_cast(ptr.get()); + if(array_ptr->get_vector().size() >= 1&&array_ptr->get_vector()[0]->get_flag() == message::flag_string) + { + message::ptr value_ptr; + if(array_ptr->get_vector().size()>1) + { + value_ptr = array_ptr->get_vector()[1]; + } + this->on_socketio_ack(p.get_pack_id(), value_ptr); + break; + } + } + this->on_socketio_ack(p.get_pack_id(),ptr); + break; + } + // Error + case packet::type_error: + { + LOG("Received Message type (ERROR)"<on_socketio_error(p.get_message()); + break; + } + default: + break; + } + } +} + +void socket::impl::on_socketio_event(const std::string& nsp,int msgId,const std::string& name, message::ptr const& message) +{ + event_listener *functor_ptr = &(m_default_event_listener); + auto it = m_event_binding.find(name); + if(it!=m_event_binding.end()) + { + functor_ptr = &(it->second); + } + bool needAck = msgId >= 0; + event ev = event_adapter::create_event(nsp,name, message,needAck); + if (*functor_ptr) { + (*functor_ptr)(ev); + } + if(needAck) + { + this->__ack(msgId, name, ev.get_ack_message()); + } +} + +void socket::impl::on_socketio_ack(int msgId, message::ptr const& message) +{ + auto it = m_acks.find(msgId); + if(it!=m_acks.end()) + { + (it->second)(message); + m_acks.erase(it); + } +} + +void socket::impl::on_socketio_error(message::ptr const& err_message) +{ + if(m_error_listener)m_error_listener(err_message); +} } diff --git a/src/sio_socket.h b/src/sio_socket.h index baf89ee..0691568 100644 --- a/src/sio_socket.h +++ b/src/sio_socket.h @@ -3,10 +3,44 @@ #include "internal/sio_client_impl.h" namespace sio { +class event_adapter; + +class event +{ +public: + const std::string& get_nsp() const; + + const std::string& get_name() const; + + const message::ptr& get_message() const; + + bool need_ack() const; + + void put_ack_message(message::ptr const& ack_message); + + message::ptr const& get_ack_message() const; + +protected: + event(std::string const& nsp,std::string const& name,message::ptr const& message,bool need_ack); + + message::ptr& __get_ack_message(); + +private: + const std::string m_nsp; + const std::string m_name; + const message::ptr m_message; + const bool m_need_ack; + message::ptr m_ack_message; + + friend class event_adapter; +}; + class socket { public: - typedef std::function event_listener; + typedef std::function event_listener_aux; + + typedef std::function event_listener; typedef std::function error_listener;