Example #1
0
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);
	}
}
Example #3
0
void IRCConnection::send_command(const IRCRawString &command, const std::vector<IRCRawString> params)
{
	IRCRawString line = IRCMessage::create_line(IRCRawString(), command, params);
	queues.push_send(line);
}