void IRCConnection::send_command(const IRCRawString &command, const std::vector<IRCRawString> params) { connection_activity(); std::unique_lock<std::mutex> lock(mutex); IRCRawString line = IRCMessage::create_line(IRCRawString(), command, params); queues.push_send(line); lock.unlock(); change_event.notify(); }
void DCCChatConnection::worker_main() { { std::unique_lock<std::mutex> lock(mutex); started_flag = true; started_event.notify_all(); lock.unlock(); } try { std::unique_lock<std::mutex> lock(mutex); clan::TCPConnection connection; if (is_server) { queue_system(clan::string_format("Started listening on port %1", socket_name.get_port())); clan::TCPListen listen(socket_name); while (true) { if (stop_flag) { queue_disconnected(IRCRawString()); return; } clan::SocketName end_point; connection = listen.accept(end_point); if (!connection.is_null()) break; clan::NetworkEvent *events[] = { &listen }; change_event.wait(lock, 1, events); } clan::SocketName remote_name = connection.get_remote_name(); lock.unlock(); try { queue_system(clan::string_format("Accepted connection from %1 port %2", remote_name.lookup_hostname(), remote_name.get_port())); } catch (clan::Exception &) { queue_system(clan::string_format("Accepted connection from %1 port %2", remote_name.get_address(), remote_name.get_port())); } lock.lock(); } else { lock.unlock(); try { queue_system(clan::string_format("Connecting to %1 port %2", socket_name.lookup_hostname(), socket_name.get_port())); } catch (clan::Exception &) { queue_system(clan::string_format("Connecting to %1 port %2", socket_name.get_address(), socket_name.get_port())); } connection = clan::TCPConnection(socket_name); lock.lock(); } IRCRawString read_line, write_line; IRCRawString::size_type write_pos = 0; while (!stop_flag) { if (!read_connection_data(connection, read_line)) break; if (!write_connection_data(write_line, write_pos, connection)) break; clan::NetworkEvent *events[] = { &connection }; change_event.wait(lock, 1, events); } queue_disconnected(IRCRawString()); } catch (clan::Exception &e) { std::unique_lock<std::mutex> lock(mutex); queue_disconnected(e.message); } }
void IRCConnection::send_command(const IRCRawString &command, const std::vector<IRCRawString> params) { IRCRawString line = IRCMessage::create_line(IRCRawString(), command, params); queues.push_send(line); }