~aleteoryx/sexchat

206acfd7e92059bf5c610a9eefc40bd0e75b0dd1 — Aleteoryx 4 months ago 5fc4ba2
dynamic dispatch refactored
M src/common/ctcp.c => src/common/ctcp.c +1 -1
@@ 147,7 147,7 @@ ctcp_handle (session *sess, char *to, char *nick, char *ip,
		g_snprintf (outbuf, sizeof (outbuf), "VERSION HexChat "PACKAGE_VERSION" / %s",
					 get_sys_str (1));
#endif
		serv->p_nctcp (serv, nick, outbuf);
		irc_nctcp (serv, nick, outbuf);
	}

	if (word[4][1] == '\0')

M src/common/dcc.c => src/common/dcc.c +5 -5
@@ 1392,7 1392,7 @@ dcc_connect (struct DCC *dcc)
		else
			g_snprintf (tbuf, sizeof (tbuf), "DCC CHAT chat %u %d %d",
				dcc->addr, dcc->port, dcc->pasvid);
		dcc->serv->p_ctcp (dcc->serv, dcc->nick, tbuf);
		irc_ctcp (dcc->serv, dcc->nick, tbuf);
	}
	else
	{


@@ 1897,7 1897,7 @@ dcc_send (struct session *sess, char *to, char *filename, gint64 maxcps, int pas
					file_part (dcc->file), dcc->addr,
					dcc->port, dcc->size);
		}
		sess->server->p_ctcp (sess->server, to, outbuf);
		irc_ctcp (sess->server, to, outbuf);

		EMIT_SIGNAL (XP_TE_DCCOFFER, sess, file_part (dcc->file),
							to, dcc->file, NULL, 0);


@@ 2323,7 2323,7 @@ dcc_chat (struct session *sess, char *nick, int passive)
			g_snprintf (outbuf, sizeof (outbuf), "DCC CHAT chat %u %d",
						 dcc->addr, dcc->port);
		}
		dcc->serv->p_ctcp (dcc->serv, nick, outbuf);
		irc_ctcp (dcc->serv, nick, outbuf);
		EMIT_SIGNAL (XP_TE_DCCCHATOFFERING, sess, nick, NULL, NULL, NULL, 0);
	} else
	{


@@ 2356,7 2356,7 @@ dcc_resume (struct DCC *dcc)
		if (dcc->pasvid)
 			sprintf (tbuf + strlen (tbuf), " %d", dcc->pasvid);

		dcc->serv->p_ctcp (dcc->serv, dcc->nick, tbuf);
		irc_ctcp (dcc->serv, dcc->nick, tbuf);
		return 1;
	}



@@ 2601,7 2601,7 @@ handle_dcc (struct session *sess, char *nick, char *word[], char *word_eol[],
							"DCC ACCEPT %s %d %" G_GUINT64_FORMAT,
							file_part (dcc->file), port, dcc->resumable);

				dcc->serv->p_ctcp (dcc->serv, dcc->nick, tbuf);
				irc_ctcp (dcc->serv, dcc->nick, tbuf);
			}
			sprintf (tbuf, "%" G_GUINT64_FORMAT, dcc->pos);
			EMIT_SIGNAL_TAGS (XP_TE_DCCRESUMEREQUEST, sess, nick, file_part (dcc->file),

M src/common/hexchat.c => src/common/hexchat.c +4 -4
@@ 48,6 48,7 @@
#include "plugin-timer.h"
#include "notify.h"
#include "server.h"
#include "proto-irc.h"
#include "servlist.h"
#include "outbound.h"
#include "text.h"


@@ 271,7 272,7 @@ lag_check (void)
			else
			{
				g_snprintf (tbuf, sizeof (tbuf), "LAG%lu", tim);
				serv->p_ping (serv, "", tbuf);
				irc_ping (serv, "", tbuf);
				
				if (!serv->lag_sent)
				{


@@ 317,8 318,7 @@ doover:
				{
					sess->done_away_check = TRUE;
					sess->doing_who = TRUE;
					/* this'll send a WHO #channel */
					sess->server->p_away_status (sess->server, sess->channel);
					irc_who (sess->server, sess->channel);
					sent += sess->total;
				}
			}


@@ 518,7 518,7 @@ new_ircwindow (ircconn *serv, char *name, int type, int focus)
	switch (type)
	{
	case SESS_SERVER:
		serv = server_new ();
		serv = ircconn_new ();
		if (prefs.hex_gui_tab_server)
			sess = session_new (serv, name, SESS_SERVER, focus);
		else

M src/common/hexchat.h => src/common/hexchat.h +11 -35
@@ 433,13 433,22 @@ typedef struct session
#define MECH_SCRAM_SHA_256 3
#define MECH_SCRAM_SHA_512 4

typedef struct conn
{

} conn;

typedef struct ircconn
{
	struct conn c;

	/*  server control operations (in server*.c) */
	int  (*cleanup)(struct ircconn *);
	void (*flush_queue)(struct ircconn *);
	void (*auto_reconnect)(struct ircconn *, int send_quit, int err);
	
	/* irc protocol functions (in proto*.c) */
	void (*p_inline)(struct ircconn *, char *buf, int len);
	void (*p_connected)(struct ircconn *);
	void (*p_disconnected)(struct ircconn *, int, int);
	void (*p_ssl_message)(struct ircconn *, const char *);


@@ 455,42 464,9 @@ typedef struct ircconn
	void (*p_throttle_update)(struct ircconn *);
	void (*p_cleanup)(struct ircconn *);
	void (*p_stopconnect)(struct ircconn *);
	
	/* irc protocol functions (in proto*.c) */
	void (*p_inline)(struct ircconn *, char *buf, int len);
	void (*p_invite)(struct ircconn *, char *channel, char *nick);
	void (*p_cycle)(struct ircconn *, char *channel, char *key);
	void (*p_ctcp)(struct ircconn *, char *to, char *msg);
	void (*p_nctcp)(struct ircconn *, char *to, char *msg);
	int  (*p_cmp)(const char *s1, const char *s2);
	void (*p_quit)(struct ircconn *);
	void (*p_kick)(struct ircconn *, char *channel, char *nick, char *reason);
	void (*p_part)(struct ircconn *, char *channel, char *reason);
	void (*p_ns_identify)(struct ircconn *, char *pass);
	void (*p_ns_ghost)(struct ircconn *, char *usname, char *pass);
	void (*p_join)(struct ircconn *, char *channel, char *key);
	void (*p_join_list)(struct ircconn *, GSList *favorites);
	void (*p_login)(struct ircconn *, char *user, char *realname);
	void (*p_join_info)(struct ircconn *, char *channel);
	void (*p_mode)(struct ircconn *, char *target, char *mode);
	void (*p_user_list)(struct ircconn *, char *channel);
	void (*p_away_status)(struct ircconn *, char *channel);
	void (*p_whois)(struct ircconn *, char *nicks);
	void (*p_get_ip)(struct ircconn *, char *nick);
	void (*p_get_ip_uh)(struct ircconn *, char *nick);
	void (*p_set_back)(struct ircconn *);
	void (*p_set_away)(struct ircconn *, char *reason);
	void (*p_message)(struct ircconn *, char *channel, char *text);
	void (*p_action)(struct ircconn *, char *channel, char *act);
	void (*p_notice)(struct ircconn *, char *channel, char *text);
	void (*p_topic)(struct ircconn *, char *channel, char *topic);
	void (*p_list_channels)(struct ircconn *, char *arg, int min_users);
	void (*p_change_nick)(struct ircconn *, char *new_nick);
	void (*p_names)(struct ircconn *, char *channel);
	void (*p_ping)(struct ircconn *, char *to, char *timestring);
/*	void (*p_set_away)(struct ircconn *);*/
	int (*p_raw)(struct ircconn *, char *raw);
	int (*p_cmp)(const char *s1, const char *s2);

	
	int port;
	int sok;					/* is equal to sok4 or sok6 (the one we are using) */
	int sok4;					/* tcp4 socket */

M src/common/inbound.c => src/common/inbound.c +12 -12
@@ 42,6 42,7 @@
#include "outbound.h"
#include "inbound.h"
#include "server.h"
#include "proto-irc.h"
#include "servlist.h"
#include "text.h"
#include "ctcp.h"


@@ 471,7 472,7 @@ inbound_chanmsg (ircconn *serv, session *sess, char *chan, char *from,
	if (fromme)
	{
		if (prefs.hex_away_auto_unmark && serv->is_away && !tags_data->timestamp)
			sess->server->p_set_back (sess->server);
			irc_set_back (sess->server);
		EMIT_SIGNAL_TAGS (XP_TE_UCHANMSG, sess, from, text, nickchar, NULL, 0, tags_data);
		return;
	}


@@ 619,14 620,13 @@ inbound_ujoin (ircconn *serv, char *chan, char *nick, char *ip,
	sess->end_of_names = FALSE;

	/* sends a MODE */
	serv->p_join_info (sess->server, chan);
	irc_join_info (sess->server, chan);

	EMIT_SIGNAL_TAGS (XP_TE_UJOIN, sess, nick, chan, ip, NULL, 0, tags_data);

	if (prefs.hex_irc_who_join)
	{
		/* sends WHO #channel */
		serv->p_user_list (sess->server, chan);
		irc_who (sess->server, chan);
		sess->doing_who = TRUE;
	}
}


@@ 642,7 642,7 @@ inbound_ukick (ircconn *serv, char *chan, char *kicker, char *reason,
		clear_channel (sess);
		if (prefs.hex_irc_auto_rejoin)
		{
			serv->p_join (serv, chan, sess->channelkey);
			irc_join (serv, chan, sess->channelkey);
			safe_strcpy (sess->waitchannel, chan, CHANLEN);
		}
	}


@@ 1172,7 1172,7 @@ check_autojoin_channels (ircconn *serv)

	if (sess_channels)
	{
		serv->p_join_list (serv, sess_channels);
		irc_join_list (serv, sess_channels);
		g_slist_free_full (sess_channels, (GDestroyNotify) servlist_favchan_free);
	}
	else


@@ 1180,7 1180,7 @@ check_autojoin_channels (ircconn *serv)
		/* If there's no session, just autojoin to favorites. */
		if (serv->favlist)
		{
			serv->p_join_list (serv, serv->favlist);
			irc_join_list (serv, serv->favlist);
			i++;

			/* FIXME this is not going to work and is not needed either. server_free() does the job already. */


@@ 1213,7 1213,7 @@ inbound_next_nick (session *sess, char *nick, int error,
		{
			newnick = net->nick2;
		}
		serv->p_change_nick (serv, newnick);
		irc_change_nick (serv, newnick);
		if (error)
		{
			EMIT_SIGNAL_TAGS (XP_TE_NICKERROR, sess, nick, newnick, NULL, NULL, 0, tags_data);


@@ 1225,7 1225,7 @@ inbound_next_nick (session *sess, char *nick, int error,
		break;

	case 3:
		serv->p_change_nick (serv, prefs.hex_irc_nick3);
		irc_change_nick (serv, prefs.hex_irc_nick3);
		if (error)
		{
			EMIT_SIGNAL_TAGS (XP_TE_NICKERROR, sess, nick, prefs.hex_irc_nick3, NULL, NULL, 0, tags_data);


@@ 1329,7 1329,7 @@ set_default_modes (ircconn *serv)

	if (modes[1] != '\0')
	{
		serv->p_mode (serv, serv->nick, modes);
		irc_mode (serv, serv->nick, modes);
	}
}



@@ 1544,7 1544,7 @@ inbound_login_end (session *sess, char *text, const message_tags_data *tags_data
		if (prefs.hex_dcc_ip_from_server && serv->use_who)
		{
			serv->skip_next_userhost = TRUE;
			serv->p_get_ip_uh (serv, serv->nick);	/* sends USERHOST mynick */
			irc_userhost (serv, serv->nick);	/* sends USERHOST mynick */
		}
		set_default_modes (serv);



@@ 1567,7 1567,7 @@ inbound_login_end (session *sess, char *text, const message_tags_data *tags_data
		/* send nickserv password */
		if (net && net->pass && inbound_nickserv_login (serv))
		{
			serv->p_ns_identify (serv, net->pass);
			irc_ns_identify (serv, net->pass);
		}

		/* wait for join if command or nickserv set */

M src/common/modes.c => src/common/modes.c +2 -1
@@ 24,6 24,7 @@
#include "hexchatc.h"
#include "modes.h"
#include "server.h"
#include "proto-irc.h"
#include "text.h"
#include "fe.h"
#include "util.h"


@@ 117,7 118,7 @@ send_channel_modes (session *sess, char *tbuf, char *word[], int wpos,
			strcat (tbuf, " ");
			strcat (tbuf, word[wpos + i]);
		}
		serv->p_mode (serv, sess->channel, tbuf);
		irc_mode (serv, sess->channel, tbuf);

		wpos += usable_modes;
	}

M src/common/notify.c => src/common/notify.c +5 -4
@@ 35,6 35,7 @@
#include "cfgfiles.h"
#include "fe.h"
#include "server.h"
#include "proto-irc.h"
#include "text.h"
#include "util.h"
#include "hexchatc.h"


@@ 247,7 248,7 @@ notify_announce_online (ircconn * serv, struct notify_per_server *servnot,
	    /* Let's do whois with idle time (like in /quote WHOIS %s %s) */

	    char *wii_str = g_strdup_printf ("%s %s", nick, nick);
	    serv->p_whois (serv, wii_str);
	    irc_user_whois (serv, wii_str);
	    g_free (wii_str);
	}
}


@@ 350,7 351,7 @@ notify_watch (ircconn * serv, char *nick, int add)
	else
		return;

	serv->p_raw (serv, tbuf);
	irc_raw (serv, tbuf);
}

static void


@@ 387,7 388,7 @@ notify_flush_watches (ircconn * serv, GSList *from, GSList *end)
		g_strlcat (tbuf, notify->name, sizeof(tbuf));
		list = list->next;
	}
	serv->p_raw (serv, tbuf);
	irc_raw (serv, tbuf);
}

/* called when logging in. e.g. when End of motd. */


@@ 521,7 522,7 @@ notify_checklist_for_server (ircconn *serv)
	}

	if (i)
		serv->p_raw (serv, outbuf);
		irc_raw (serv, outbuf);
}

int

M src/common/outbound.c => src/common/outbound.c +48 -47
@@ 52,6 52,7 @@
#include "hexchatc.h"
#include "servlist.h"
#include "server.h"
#include "proto-irc.h"
#include "tree.h"
#include "outbound.h"
#include "chanopt.h"


@@ 81,12 82,12 @@ server_sendpart (ircconn * serv, char *channel, char *reason)
	if (!reason)
	{
		reason = random_line (prefs.hex_irc_part_reason);
		serv->p_part (serv, channel, reason);
		irc_part (serv, channel, reason);
		g_free (reason);
	} else
	{
		/* reason set by /quit, /close argument */
		serv->p_part (serv, channel, reason);
		irc_part (serv, channel, reason);
	}
}



@@ 316,7 317,7 @@ cmd_away (struct session *sess, char *tbuf, char *word[], char *word_eol[])
			/* must manage memory pointed to by random_line() */
			reason = random_line (prefs.hex_away_reason);
	}
	sess->server->p_set_away (sess->server, reason);
	irc_set_away (sess->server, reason);

	if (sess->server->last_away_reason != reason)
	{


@@ 339,7 340,7 @@ cmd_back (struct session *sess, char *tbuf, char *word[], char *word_eol[])
{
	if (sess->server->is_away)
	{
		sess->server->p_set_back (sess->server);
		irc_set_back (sess->server);
	}
	else
	{


@@ 475,7 476,7 @@ ban (session * sess, char *tbuf, char *mask, char *bantypestr, int deop)
	
	if (banmask)
	{
		serv->p_mode (serv, sess->channel, banmask);
		irc_mode (serv, sess->channel, banmask);
		g_free (banmask);
	}
}


@@ 490,7 491,7 @@ cmd_ban (struct session *sess, char *tbuf, char *word[], char *word_eol[])
		ban (sess, tbuf, mask, word[3], 0);
	} else
	{
		sess->server->p_mode (sess->server, sess->channel, "+b");	/* banlist */
		irc_mode (sess->server, sess->channel, "+b");	/* banlist */
	}

	return TRUE;


@@ 634,7 635,7 @@ cmd_ctcp (struct session *sess, char *tbuf, char *word[], char *word_eol[])
				cmd += mbl;
			}

			sess->server->p_ctcp (sess->server, to, msg);
			irc_ctcp (sess->server, to, msg);

			EMIT_SIGNAL (XP_TE_CTCPSEND, sess, to, msg, NULL, NULL, 0);



@@ 688,7 689,7 @@ cmd_cycle (struct session *sess, char *tbuf, char *word[], char *word_eol[])
		if (chan_sess && chan_sess->type == SESS_CHANNEL)
		{
			key = chan_sess->channelkey;
			sess->server->p_cycle (sess->server, chan, key);
			irc_cycle (sess->server, chan, key);
			return TRUE;
		}
	}


@@ 1309,7 1310,7 @@ static int
mkick_cb (struct User *user, multidata *data)
{
	if (!user->op && !user->me)
		data->sess->server->p_kick (data->sess->server, data->sess->channel, user->nick, data->reason);
		irc_kick (data->sess->server, data->sess->channel, user->nick, data->reason);
	return TRUE;
}



@@ 1317,7 1318,7 @@ static int
mkickops_cb (struct User *user, multidata *data)
{
	if (user->op && !user->me)
		data->sess->server->p_kick (data->sess->server, data->sess->channel, user->nick, data->reason);
		irc_kick (data->sess->server, data->sess->channel, user->nick, data->reason);
	return TRUE;
}



@@ 1377,7 1378,7 @@ cmd_dns (struct session *sess, char *tbuf, char *word[], char *word_eol[])
				do_dns (sess, user->nick, user->hostname, &no_tags);
			} else
			{
				sess->server->p_get_ip (sess->server, nick);
				irc_who (sess->server, nick);
				sess->server->doing_dns = TRUE;
			}
		} else


@@ 2103,7 2104,7 @@ cmd_ghost (struct session *sess, char *tbuf, char *word[], char *word_eol[])
	if (!word[2][0])
		return FALSE;

	sess->server->p_ns_ghost (sess->server, word[2], word[3]);
	irc_ns_ghost (sess->server, word[2], word[3]);
	return TRUE;
}



@@ 2277,7 2278,7 @@ cmd_id (struct session *sess, char *tbuf, char *word[], char *word_eol[])
{
	if (word[2][0])
	{
		sess->server->p_ns_identify (sess->server, word[2]);
		irc_ns_identify (sess->server, word[2]);
		return TRUE;
	}



@@ 2367,9 2368,9 @@ cmd_invite (struct session *sess, char *tbuf, char *word[], char *word_eol[])
	if (!*word[2])
		return FALSE;
	if (*word[3])
		sess->server->p_invite (sess->server, word[3], word[2]);
		irc_invite (sess->server, word[3], word[2]);
	else
		sess->server->p_invite (sess->server, sess->channel, word[2]);
		irc_invite (sess->server, sess->channel, word[2]);
	return TRUE;
}



@@ 2385,7 2386,7 @@ cmd_join (struct session *sess, char *tbuf, char *word[], char *word_eol[])
		sess_find = find_channel (sess->server, chan);
		if (!sess_find)
		{
			sess->server->p_join (sess->server, chan, pass);
			irc_join (sess->server, chan, pass);
			if (sess->channel[0] == 0 && sess->waitchannel[0])
			{
				po = strchr (chan, ',');


@@ 2409,7 2410,7 @@ cmd_kick (struct session *sess, char *tbuf, char *word[], char *word_eol[])
	char *reason = word_eol[3];
	if (*nick)
	{
		sess->server->p_kick (sess->server, sess->channel, nick, reason);
		irc_kick (sess->server, sess->channel, nick, reason);
		return TRUE;
	}
	return FALSE;


@@ 2435,7 2436,7 @@ cmd_kickban (struct session *sess, char *tbuf, char *word[], char *word_eol[])
		} else
			ban (sess, tbuf, nick, "", (user && user->op));

		sess->server->p_kick (sess->server, sess->channel, nick, reason);
		irc_kick (sess->server, sess->channel, nick, reason);

		return TRUE;
	}


@@ 2680,7 2681,7 @@ cmd_me (struct session *sess, char *tbuf, char *word[], char *word_eol[])
	{
		/* print it to screen */
		inbound_action (sess, sess->channel, sess->server->nick, "", act, TRUE, FALSE,
							 &no_tags);
				&no_tags);
	} else
	{
		/* DCC CHAT failed, try through server */


@@ 2688,7 2689,7 @@ cmd_me (struct session *sess, char *tbuf, char *word[], char *word_eol[])
		{
			while ((split_text = split_up_text (sess, act + offset, cmd_length, split_text)))
			{
				sess->server->p_action (sess->server, sess->channel, split_text);
				irc_action (sess->server, sess->channel, split_text);
				/* print it to screen */
				if (!sess->server->have_echo_message)
					inbound_action (sess, sess->channel, sess->server->nick, "",


@@ 2701,7 2702,7 @@ cmd_me (struct session *sess, char *tbuf, char *word[], char *word_eol[])
				g_free (split_text);
			}

			sess->server->p_action (sess->server, sess->channel, act + offset);
			irc_action (sess->server, sess->channel, act + offset);
			/* print it to screen */
			if (!sess->server->have_echo_message)
				inbound_action (sess, sess->channel, sess->server->nick, "",


@@ 2730,13 2731,13 @@ cmd_mode (struct session *sess, char *tbuf, char *word[], char *word_eol[])
	        && (is_channel (sess->server, word[2]) || !rfc_casecmp (sess->server->nick, word[2])))
	   )
	{
		sess->server->p_mode (sess->server, word[2], word_eol[3]);
		irc_mode (sess->server, word[2], word_eol[3]);
	}
	else
	{
		if(sess->channel[0] == 0)
			return FALSE;
		sess->server->p_mode (sess->server, sess->channel, word_eol[2]);
		irc_mode (sess->server, sess->channel, word_eol[2]);
	}
	return TRUE;
}


@@ 2809,14 2810,14 @@ cmd_msg (struct session *sess, char *tbuf, char *word[], char *word_eol[])

				while ((split_text = split_up_text (sess, msg + offset, cmd_length, split_text)))
				{
					sess->server->p_message (sess->server, nick, split_text);
					irc_message (sess->server, nick, split_text);

					if (*split_text)
						offset += strlen(split_text);

					g_free (split_text);
				}
				sess->server->p_message (sess->server, nick, msg + offset);
				irc_message (sess->server, nick, msg + offset);
				offset = 0;
			}
			newsess = find_dialog (sess->server, nick);


@@ 2865,9 2866,9 @@ static int
cmd_names (struct session *sess, char *tbuf, char *word[], char *word_eol[])
{
	if (*word[2])
	  	sess->server->p_names (sess->server, word[2]);
	  	irc_names (sess->server, word[2]);
	else
		sess->server->p_names (sess->server, sess->channel);
		irc_names (sess->server, sess->channel);
	return TRUE;
}



@@ 2876,7 2877,7 @@ cmd_nctcp (struct session *sess, char *tbuf, char *word[], char *word_eol[])
{
	if (*word_eol[3])
	{
		sess->server->p_nctcp (sess->server, word[2], word_eol[3]);
		irc_nctcp (sess->server, word[2], word_eol[3]);
		return TRUE;
	}
	return FALSE;


@@ 2904,7 2905,7 @@ cmd_nick (struct session *sess, char *tbuf, char *word[], char *word_eol[])
	if (*nick)
	{
		if (sess->server->connected)
			sess->server->p_change_nick (sess->server, nick);
			irc_change_nick (sess->server, nick);
		else
		{
			message_tags_data no_tags = MESSAGE_TAGS_DATA_INIT;


@@ 2928,7 2929,7 @@ cmd_notice (struct session *sess, char *tbuf, char *word[], char *word_eol[])
	{
		while ((split_text = split_up_text (sess, text + offset, cmd_length, split_text)))
		{
			sess->server->p_notice (sess->server, word[2], split_text);
			irc_notice (sess->server, word[2], split_text);
			EMIT_SIGNAL (XP_TE_NOTICESEND, sess, word[2], split_text, NULL, NULL, 0);
			
			if (*split_text)


@@ 2937,7 2938,7 @@ cmd_notice (struct session *sess, char *tbuf, char *word[], char *word_eol[])
			g_free (split_text);
		}

		sess->server->p_notice (sess->server, word[2], text + offset);
		irc_notice (sess->server, word[2], text + offset);
		EMIT_SIGNAL (XP_TE_NOTICESEND, sess, word[2], text + offset, NULL, NULL, 0);

		return TRUE;


@@ 3031,7 3032,7 @@ cmd_ping (struct session *sess, char *tbuf, char *word[], char *word_eol[])
	tim = make_ping_time ();

	g_snprintf (timestring, sizeof (timestring), "%lu", tim);
	sess->server->p_ping (sess->server, to, timestring);
	irc_ping (sess->server, to, timestring);

	return TRUE;
}


@@ 3085,7 3086,7 @@ cmd_query (struct session *sess, char *tbuf, char *word[], char *word_eol[])

			while ((split_text = split_up_text (sess, msg + offset, cmd_length, split_text)))
			{
				sess->server->p_message (sess->server, nick, split_text);
				irc_message (sess->server, nick, split_text);
				inbound_chanmsg (nick_sess->server, nick_sess, nick_sess->channel,
								 nick_sess->server->nick, split_text, TRUE, FALSE,
								 &no_tags);


@@ 3095,7 3096,7 @@ cmd_query (struct session *sess, char *tbuf, char *word[], char *word_eol[])

				g_free (split_text);
			}
			sess->server->p_message (sess->server, nick, msg + offset);
			irc_message (sess->server, nick, msg + offset);
			inbound_chanmsg (nick_sess->server, nick_sess, nick_sess->channel,
							 nick_sess->server->nick, msg + offset, TRUE, FALSE,
							 &no_tags);


@@ 3124,13 3125,13 @@ cmd_quiet (struct session *sess, char *tbuf, char *word[], char *word_eol[])
	
		if (quietmask)
		{
			serv->p_mode (serv, sess->channel, quietmask);
			irc_mode (serv, sess->channel, quietmask);
			g_free (quietmask);
		}
	}
	else
	{
		serv->p_mode (serv, sess->channel, "+q");	/* quietlist */
		irc_mode (serv, sess->channel, "+q");	/* quietlist */
	}

	return TRUE;


@@ 3166,7 3167,7 @@ cmd_quote (struct session *sess, char *tbuf, char *word[], char *word_eol[])
{
	char *raw = word_eol[2];

	return sess->server->p_raw (sess->server, raw);
	return irc_raw (sess->server, raw);
}

static int


@@ 3549,9 3550,9 @@ static int
cmd_topic (struct session *sess, char *tbuf, char *word[], char *word_eol[])
{
	if (word[2][0] && is_channel (sess->server, word[2]))
		sess->server->p_topic (sess->server, word[2], word_eol[3]);
		irc_topic (sess->server, word[2], word_eol[3]);
	else
		sess->server->p_topic (sess->server, sess->channel, word_eol[2]);
		irc_topic (sess->server, sess->channel, word_eol[2]);
	return TRUE;
}



@@ 3707,9 3708,9 @@ url_join_only (ircconn *serv, char *tbuf, char *channel, char *key)
	/* tbuf is 4kb */
	safe_strcpy ((tbuf + 1), channel, 256);
	if (key)
		serv->p_join (serv, tbuf, key);
		irc_join (serv, tbuf, key);
	else
		serv->p_join (serv, tbuf, "");
		irc_join (serv, tbuf, "");
}

static int


@@ 3832,7 3833,7 @@ wallchop_cb (struct User *user, multidata *data)
		data->i = 0;
		sprintf (data->tbuf + strlen (data->tbuf),
					" :[@%s] %s", data->sess->channel, data->reason);
		data->sess->server->p_raw (data->sess->server, data->tbuf);
		irc_raw (data->sess->server, data->tbuf);
		strcpy (data->tbuf, "NOTICE ");
	}



@@ 3859,8 3860,8 @@ cmd_wallchop (struct session *sess, char *tbuf, char *word[],
	if (data.i)
	{
		sprintf (tbuf + strlen (tbuf),
					" :[@%s] %s", sess->channel, word_eol[2]);
		sess->server->p_raw (sess->server, tbuf);
			 " :[@%s] %s", sess->channel, word_eol[2]);
		irc_raw (sess->server, tbuf);
	}

	return TRUE;


@@ 4599,7 4600,7 @@ handle_say (session *sess, char *text, int check_spch)
			if (!sess->server->have_echo_message)
				inbound_chanmsg (sess->server, sess, sess->channel, sess->server->nick,
								  split_text, TRUE, FALSE, &no_tags);
			sess->server->p_message (sess->server, sess->channel, split_text);
			irc_message (sess->server, sess->channel, split_text);
			
			if (*split_text)
				offset += strlen(split_text);


@@ 4610,7 4611,7 @@ handle_say (session *sess, char *text, int check_spch)
		if (!sess->server->have_echo_message)
			inbound_chanmsg (sess->server, sess, sess->channel, sess->server->nick,
							  text + offset, TRUE, FALSE, &no_tags);
		sess->server->p_message (sess->server, sess->channel, text + offset);
		irc_message (sess->server, sess->channel, text + offset);
	} else
	{
		notc_msg (sess);


@@ 4814,7 4815,7 @@ handle_command (session *sess, char *cmd, int check_spch)
		else
		{
			/* unknown command, just send it to the server and hope */
			sess->server->p_raw (sess->server, cmd);
			irc_raw (sess->server, cmd);
		}
	}


M src/common/proto-irc.c => src/common/proto-irc.c +31 -79
@@ 99,7 99,7 @@ irc_nickserv (ircconn *serv, char *cmd, char *arg1, char *arg2, char *arg3)
	}
}

static void
void
irc_ns_identify (ircconn *serv, char *pass)
{
	switch (serv->loginmethod)


@@ 117,7 117,7 @@ irc_ns_identify (ircconn *serv, char *pass)
	}
}

static void
void
irc_ns_ghost (ircconn *serv, char *usname, char *pass)
{
	if (serv->loginmethod != LOGIN_CHALLENGEAUTH)


@@ 126,7 126,7 @@ irc_ns_ghost (ircconn *serv, char *usname, char *pass)
	}
}

static void
void
irc_join (ircconn *serv, char *channel, char *key)
{
	if (key[0])


@@ 161,7 161,7 @@ irc_join_list_flush (ircconn *serv, GString *channels, GString *keys, int send_k
 * to get around the 512 limit.
 */

static void
void
irc_join_list (ircconn *serv, GSList *favorites)
{
	int first_item = 1;										/* determine whether we add commas or not */


@@ 229,7 229,7 @@ irc_join_list (ircconn *serv, GSList *favorites)
	g_slist_free (favlist);
}

static void
void
irc_part (ircconn *serv, char *channel, char *reason)
{
	if (reason[0])


@@ 263,13 263,13 @@ irc_quit (ircconn *serv)
	}
}

static void
void
irc_set_back (ircconn *serv)
{
	tcp_send_len (serv, "AWAY\r\n", 6);
}

static void
void
irc_set_away (ircconn *serv, char *reason)
{
	if (reason)


@@ 285,25 285,25 @@ irc_set_away (ircconn *serv, char *reason)
	tcp_sendf (serv, "AWAY :%s\r\n", reason);
}

static void
void
irc_ctcp (ircconn *serv, char *to, char *msg)
{
	tcp_sendf (serv, "PRIVMSG %s :\001%s\001\r\n", to, msg);
}

static void
void
irc_nctcp (ircconn *serv, char *to, char *msg)
{
	tcp_sendf (serv, "NOTICE %s :\001%s\001\r\n", to, msg);
}

static void
void
irc_cycle (ircconn *serv, char *channel, char *key)
{
	tcp_sendf (serv, "PART %s\r\nJOIN %s %s\r\n", channel, channel, key);
}

static void
void
irc_kick (ircconn *serv, char *channel, char *nick, char *reason)
{
	if (reason[0])


@@ 312,13 312,13 @@ irc_kick (ircconn *serv, char *channel, char *nick, char *reason)
		tcp_sendf (serv, "KICK %s %s\r\n", channel, nick);
}

static void
void
irc_invite (ircconn *serv, char *channel, char *nick)
{
	tcp_sendf (serv, "INVITE %s %s\r\n", nick, channel);
}

static void
void
irc_mode (ircconn *serv, char *target, char *mode)
{
	tcp_sendf (serv, "MODE %s %s\r\n", target, mode);


@@ 326,16 326,14 @@ irc_mode (ircconn *serv, char *target, char *mode)

/* find channel info when joined */

static void
void
irc_join_info (ircconn *serv, char *channel)
{
	tcp_sendf (serv, "MODE %s\r\n", channel);
}

/* initiate userlist retreival */

static void
irc_user_list (ircconn *serv, char *channel)
void
irc_who (ircconn *serv, char *channel)
{
	if (serv->have_whox)
		tcp_sendf (serv, "WHO %s %%chtsunfra,152\r\n", channel);


@@ 345,57 343,42 @@ irc_user_list (ircconn *serv, char *channel)

/* userhost */

static void
void
irc_userhost (ircconn *serv, char *nick)
{
	tcp_sendf (serv, "USERHOST %s\r\n", nick);
}

static void
irc_away_status (ircconn *serv, char *channel)
{
	if (serv->have_whox)
		tcp_sendf (serv, "WHO %s %%chtsunfra,152\r\n", channel);
	else
		tcp_sendf (serv, "WHO %s\r\n", channel);
}

/*static void
irc_get_ip (ircconn *serv, char *nick)
{
	tcp_sendf (serv, "WHO %s\r\n", nick);
}*/


/*
 *  Command: WHOIS
 *     Parameters: [<server>] <nickmask>[,<nickmask>[,...]]
 */
static void
void
irc_user_whois (ircconn *serv, char *nicks)
{
	tcp_sendf (serv, "WHOIS %s\r\n", nicks);
}

static void
void
irc_message (ircconn *serv, char *channel, char *text)
{
	tcp_sendf (serv, "PRIVMSG %s :%s\r\n", channel, text);
}

static void
void
irc_action (ircconn *serv, char *channel, char *act)
{
	tcp_sendf (serv, "PRIVMSG %s :\001ACTION %s\001\r\n", channel, act);
}

static void
void
irc_notice (ircconn *serv, char *channel, char *text)
{
	tcp_sendf (serv, "NOTICE %s :%s\r\n", channel, text);
}

static void
void
irc_topic (ircconn *serv, char *channel, char *topic)
{
	if (!topic)


@@ 406,7 389,7 @@ irc_topic (ircconn *serv, char *channel, char *topic)
		tcp_sendf (serv, "TOPIC %s\r\n", channel);
}

static void
void
irc_list_channels (ircconn *serv, char *arg, int min_users)
{
	if (arg[0])


@@ 421,19 404,19 @@ irc_list_channels (ircconn *serv, char *arg, int min_users)
		tcp_send_len (serv, "LIST\r\n", 6);
}

static void
void
irc_names (ircconn *serv, char *channel)
{
	tcp_sendf (serv, "NAMES %s\r\n", channel);
}

static void
void
irc_change_nick (ircconn *serv, char *new_nick)
{
	tcp_sendf (serv, "NICK %s\r\n", new_nick);
}

static void
void
irc_ping (ircconn *serv, char *to, char *timestring)
{
	if (*to)


@@ 442,7 425,7 @@ irc_ping (ircconn *serv, char *to, char *timestring)
		tcp_sendf (serv, "PING %s\r\n", timestring);
}

static int
int
irc_raw (ircconn *serv, char *raw)
{
	int len;


@@ 760,12 743,12 @@ process_numeric (session * sess, int n,
		}
		break;

	case 354:	/* undernet WHOX: used as a reply for irc_away_status */
	case 354:	/* undernet WHOX: used as a reply for irc_who */
		{
			unsigned int away = 0;
			session *who_sess;

			/* irc_away_status and irc_user_list sends out a "152" */
			/* irc_who sends out a "152" */
			if (!strcmp (word[4], "152"))
			{
				who_sess = find_channel (serv, word[5]);


@@ 775,8 758,8 @@ process_numeric (session * sess, int n,

				/* :server 354 yournick 152 #channel ~ident host servname nick H account :realname */
				inbound_user_info (sess, word[5], word[6], word[7], word[8],
										 word[9], word_eol[12]+1, word[11], away,
										 tags_data);
						   word[9], word_eol[12]+1, word[11], away,
						   tags_data);

				/* try to show only user initiated whos */
				if (!who_sess || !who_sess->doing_who)


@@ 2013,36 1996,5 @@ proto_fill_her_up (ircconn *serv)

	serv->p_quit = irc_quit;
	serv->p_inline = irc_inline;

	serv->p_invite = irc_invite;
	serv->p_cycle = irc_cycle;
	serv->p_ctcp = irc_ctcp;
	serv->p_nctcp = irc_nctcp;
	serv->p_kick = irc_kick;
	serv->p_part = irc_part;
	serv->p_ns_identify = irc_ns_identify;
	serv->p_ns_ghost = irc_ns_ghost;
	serv->p_join = irc_join;
	serv->p_join_list = irc_join_list;
	serv->p_login = irc_login;
	serv->p_join_info = irc_join_info;
	serv->p_mode = irc_mode;
	serv->p_user_list = irc_user_list;
	serv->p_away_status = irc_away_status;
	/*serv->p_get_ip = irc_get_ip;*/
	serv->p_whois = irc_user_whois;
	serv->p_get_ip = irc_user_list;
	serv->p_get_ip_uh = irc_userhost;
	serv->p_set_back = irc_set_back;
	serv->p_set_away = irc_set_away;
	serv->p_message = irc_message;
	serv->p_action = irc_action;
	serv->p_notice = irc_notice;
	serv->p_topic = irc_topic;
	serv->p_list_channels = irc_list_channels;
	serv->p_change_nick = irc_change_nick;
	serv->p_names = irc_names;
	serv->p_ping = irc_ping;
	serv->p_raw = irc_raw;
	serv->p_cmp = rfc_casecmp;	/* can be changed by 005 in modes.c */
}

M src/common/proto-irc.h => src/common/proto-irc.h +27 -0
@@ 51,4 51,31 @@ void message_tags_data_free (message_tags_data *tags_data);

void proto_fill_her_up (ircconn *serv);

void irc_invite (ircconn *serv, char *channel, char *nick);
void irc_cycle (ircconn *serv, char *channel, char *key);
void irc_kick (ircconn *, char *channel, char *nick, char *reason);
void irc_part (ircconn *, char *channel, char *reason);
void irc_ns_identify (ircconn *, char *pass);
void irc_ns_ghost (ircconn *, char *usname, char *pass);
void irc_join_list (ircconn *, GSList *favorites);
void irc_set_back (ircconn *serv);
void irc_set_away (ircconn *serv, char *reason);
void irc_who (ircconn *, char *channel);
void irc_userhost (ircconn *, char *nick);
void irc_message (ircconn *, char *channel, char *text);
void irc_action (ircconn *, char *channel, char *act);
void irc_notice (ircconn *, char *channel, char *text);
void irc_topic (ircconn *, char *channel, char *topic);
void irc_change_nick (ircconn *serv, char *new_nick);
void irc_names (ircconn *, char *channel);
void irc_user_whois (ircconn *serv, char *nicks);
void irc_ping (ircconn *, char *to, char *timestring);
void irc_join_info (ircconn *, char *channel);
int  irc_raw (ircconn *, char *raw);
void irc_list_channels (ircconn *, char *arg, int min_users);
void irc_mode (ircconn *, char *target, char *mode);
void irc_join (ircconn *serv, char *channel, char *key);
void irc_ctcp (ircconn *serv, char *to, char *msg);
void irc_nctcp (ircconn *serv, char *to, char *msg);

#endif

M src/common/server.c => src/common/server.c +1 -2
@@ 51,7 51,6 @@
#include "text.h"
#include "util.h"
#include "url.h"
#include "proto-irc.h"
#include "servlist.h"
#include "server.h"



@@ 1531,7 1530,7 @@ server_set_encoding (ircconn *serv, char *new_encoding)
}

ircconn *
server_new (void)
ircconn_new (void)
{
	static int id = 0;
	ircconn *serv;

M src/common/server.h => src/common/server.h +1 -1
@@ 27,7 27,7 @@ int tcp_send_len (ircconn *serv, char *buf, int len);
void tcp_sendf (ircconn *serv, const char *fmt, ...) G_GNUC_PRINTF (2, 3);
int tcp_send_real (void *ssl, int sok, GIConv write_converter, char *buf, int len);

ircconn *server_new (void);
ircconn *ircconn_new (void);
int is_server (ircconn *serv);
void server_fill_her_up (ircconn *serv);
void server_set_encoding (ircconn *serv, char *new_encoding);

M src/fe-gtk/chanlist.c => src/fe-gtk/chanlist.c +2 -2
@@ 303,14 303,14 @@ chanlist_do_refresh (ircconn *serv)
	if (serv->use_listargs)
	{
		/* yes - it will download faster */
		serv->p_list_channels (serv, "", serv->gui->chanlist_minusers);
		irc_list_channels (serv, "", serv->gui->chanlist_minusers);
		/* don't allow the spin button below this value from now on */
		serv->gui->chanlist_minusers_downloaded = serv->gui->chanlist_minusers;
	}
	else
	{
		/* download all, filter minusers locally only */
		serv->p_list_channels (serv, "", 1);
		irc_list_channels (serv, "", 1);
		serv->gui->chanlist_minusers_downloaded = 1;
	}


M src/fe-gtk/joind.c => src/fe-gtk/joind.c +1 -1
@@ 91,7 91,7 @@ joind_ok_cb (GtkWidget *ok, ircconn *serv)
			fe_message (_("Channel name too short, try again."), FE_MSG_ERROR);
			return;
		}
		serv->p_join (serv, text, "");
		irc_join (serv, text, "");
		goto xit;
	}


M src/fe-gtk/maingui.c => src/fe-gtk/maingui.c +10 -10
@@ 1770,7 1770,7 @@ mg_topic_cb (GtkWidget *entry, gpointer userdata)
		text = (char *)gtk_entry_get_text (GTK_ENTRY (entry));
		if (text[0] == 0)
			text = NULL;
		sess->server->p_topic (sess->server, sess->channel, text);
		irc_topic (sess->server, sess->channel, text);
	} else
		gtk_entry_set_text (GTK_ENTRY (entry), "");
	/* restore focus to the input widget, where the next input will most


@@ 1913,8 1913,8 @@ mg_change_flag (GtkWidget * wid, session *sess, char flag)
			mode[0] = '+';
		else
			mode[0] = '-';
		serv->p_mode (serv, sess->channel, mode);
		serv->p_join_info (serv, sess->channel);
		irc_mode (serv, sess->channel, mode);
		irc_join_info (serv, sess->channel);
		sess->ignore_mode = TRUE;
		sess->ignore_date = TRUE;
	}


@@ 1940,8 1940,8 @@ flagl_hit (GtkWidget * wid, struct session *sess)
				return;
			}
			g_snprintf (modes, sizeof (modes), "+l %d", atoi (limit_str));
			serv->p_mode (serv, sess->channel, modes);
			serv->p_join_info (serv, sess->channel);
			irc_mode (serv, sess->channel, modes);
			irc_join_info (serv, sess->channel);
		}
	} else
		mg_change_flag (wid, sess, 'l');


@@ 1961,7 1961,7 @@ flagk_hit (GtkWidget * wid, struct session *sess)
		if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (wid)))
			modes[0] = '+';

		serv->p_mode (serv, sess->channel, modes);
		irc_mode (serv, sess->channel, modes);
	}
}



@@ 2030,8 2030,8 @@ mg_key_entry_cb (GtkWidget * igad, gpointer userdata)
	{
		g_snprintf (modes, sizeof (modes), "+k %s",
				gtk_entry_get_text (GTK_ENTRY (igad)));
		serv->p_mode (serv, sess->channel, modes);
		serv->p_join_info (serv, sess->channel);
		irc_mode (serv, sess->channel, modes);
		irc_join_info (serv, sess->channel);
	}
}



@@ 2053,8 2053,8 @@ mg_limit_entry_cb (GtkWidget * igad, gpointer userdata)
		}
		g_snprintf (modes, sizeof(modes), "+l %d", 
				atoi (gtk_entry_get_text (GTK_ENTRY (igad))));
		serv->p_mode (serv, sess->channel, modes);
		serv->p_join_info (serv, sess->channel);
		irc_mode (serv, sess->channel, modes);
		irc_join_info (serv, sess->channel);
	}
}


M src/fe-text/fe-text.c => src/fe-text/fe-text.c +4 -3
@@ 41,6 41,7 @@
#include "../common/outbound.h"
#include "../common/util.h"
#include "../common/fe.h"
#include "../common/proto-irc.h"
#include "fe-text.h"




@@ 847,8 848,8 @@ fe_flash_window (struct session *sess)
{
}
void fe_get_file (const char *title, char *initial,
				 void (*callback) (void *userdata, char *file), void *userdata,
				 int flags)
		  void (*callback) (void *userdata, char *file), void *userdata,
		  int flags)
{
}
void fe_tray_set_flash (const char *filename1, const char *filename2, int timeout){}


@@ 859,7 860,7 @@ void fe_userlist_update (session *sess, struct User *user){}
void
fe_open_chan_list (ircconn *serv, char *filter, int do_refresh)
{
	serv->p_list_channels (serv, filter, 1);
	irc_list_channels (serv, filter, 1);
}
const char *
fe_get_default_font (void)