Esempio n. 1
0
/* Create a new session.  */
static int
sess_create (Any_Type arg)
{
  Sess *sess;

  if (num_sessions_generated++ >= param.wsesspage.num_sessions)
    return -1;

  sess = sess_new ();
  if (!sess)
    return 1;

  issue_calls (sess, SESS_PRIVATE_DATA (sess));
  return 0;
}
static void
sess_private_open_req(gpointer user)
{
	session_t * s;

	g_return_if_fail(user);

	/* check if the session is not already open */
	s = sess_new(SESSTYPE_PRIVATE, user_name_of(user), TRUE, user);
	if(!s) {
		/* seems we have such a session opened already */
		s = PSESSION_T( sess_find(SESSTYPE_PRIVATE, user_name_of(user)) );
	}

	/* switch to that one */
	sess_switch_to(s);
}
Esempio n. 3
0
/* Create a new session.  */
static int
sess_create (Any_Type arg)
{
  Sess_Private_Data *priv;
  Sess *sess;

  if (num_sessions_generated++ >= param.wsess.num_sessions)
    return -1;

  sess = sess_new ();
  if (!sess)
    return 1;

  priv = SESS_PRIVATE_DATA (sess);

  priv->num_calls_target = param.burst_len;
  issue_calls (sess, SESS_PRIVATE_DATA (sess));
  return 0;
}
static void
sess_event_cb(enum app_event_enum event, gpointer p, int i)
{
	session_t *sid;
	gpointer event_v[2];

	if(event & EVENT_NET) {
		sess_net_event(event, p, i);
		return;
	}

	switch(event) {
	case EVENT_MAIN_INIT:
		sess_list = NULL;
		break;

	case EVENT_MAIN_REGISTER_PREFS:
		prefs_register(
			PREFS_SESS_STAMP_CHANNEL, PREFS_TYPE_BOOL,
			_("Time-stamp channel text"), NULL, NULL);
		prefs_register(
			PREFS_SESS_STAMP_PRIVATE, PREFS_TYPE_BOOL,
			_("Time-stamp private text"), NULL, NULL);
		prefs_register(
			PREFS_SESS_STAMP_STATUS, PREFS_TYPE_BOOL,
			_("Time-stamp status text"), NULL, NULL);
		prefs_register(
			PREFS_SESS_IMPORTANT_CHANNELS, PREFS_TYPE_LIST,
			_("List of channels that trigger popup on new text"), NULL, NULL);
		prefs_register(
			PREFS_SESS_SUPPRESS_RENAME_TEXT, PREFS_TYPE_BOOL,
			_("Suppress rename messages"), NULL, NULL);
		prefs_register(
			PREFS_SESS_SUPPRESS_MODE_TEXT, PREFS_TYPE_BOOL,
			_("Suppress mode change messages"), NULL, NULL);
		prefs_register(
			PREFS_SESS_SUPPRESS_JOIN_LEAVE_TEXT, PREFS_TYPE_BOOL,
			_("Suppress join/leave messages"), NULL, NULL);
		break;

	case EVENT_MAIN_PRESET_PREFS:
		prefs_set(PREFS_SESS_STAMP_CHANNEL, TRUE);
		prefs_set(PREFS_SESS_STAMP_PRIVATE, TRUE);
		prefs_set(PREFS_SESS_STAMP_STATUS, TRUE);
		break;

	case EVENT_MAIN_PRECLOSE:
		delete_all_sessions();
		break;
	case EVENT_IFACE_PAGE_SWITCH:
		/* un-hilite page if hilited */
		if(PSESSION_T(p)->hilited) {
			gui_page_hilite(p, FALSE);
			PSESSION_T(p)->hilited = FALSE;
		}
		break;
	case EVENT_IFACE_PAGE_CLOSE:
		sid = p ? (sess_id)p: sess_current();
		if(PSESSION_T(sid)->closeable) {
			/*
			 * Delete session and it's page
			 * only if it's closeable (by the user).
			 */
			sess_delete(sid);
		}
		break;
	case EVENT_IFACE_USER_OPEN_REQ:
		sess_private_open_req(p);
		break;
	case EVENT_IFACE_TOPIC_ENTER:
		sid = EVENT_V(p, 0);
		if(!SESSION_TOPIC_READONLY(sid)) {
			/* here we don't care to set topic for ALL the channels in case of QChat,
			 * as net.c will forcefully raise EVENT_NET_MSG_TOPIC_CHANGE
			 */
			if(sess_set_topic(sid, (const gchar*)EVENT_V(p, 1))) {
				EVENT_V(event_v, 0) = sid;
				EVENT_V(event_v, 1) = EVENT_V(p, 1);
				raise_event(EVENT_SESSION_TOPIC_ENTER, event_v, 0);
			}
		}
		break;
	case EVENT_IFACE_JOIN_CHANNEL:
		sid = sess_find(SESSTYPE_CHANNEL, (const gchar *)p);
		if(!sid)
			sid = sess_new(SESSTYPE_CHANNEL, (const gchar *)p, TRUE, NULL);

		sess_switch_to(sid);
		break;

	case EVENT_CMDPROC_SESSION_TEXT:
		sess_handle_my_text((const char *)p, i);
		break;
	case EVENT_USER_RENAME:
		handle_user_rename(EVENT_V(p, 0), EVENT_V(p, 1));
		break;
	case EVENT_USER_MODE_CHANGE:
		handle_user_mode_change(p, (enum user_mode_enum)i);
		break;
	default:
		break;
	}
}
/* sess_net_event:
 *	handles EVENT_NET_* messages
 */
static void
sess_net_event(enum app_event_enum e, gpointer p, gint i)
{
	session_t * s;

	switch(e) {
	case EVENT_NET_PREDISCONNECT:
		/* we're going to be disconnected:
		 *	close all the channels & chat pages
		 */
		delete_all_sessions_of_type(SESSTYPE_CHANNEL);
		delete_all_sessions_of_type(SESSTYPE_PRIVATE);
		break;
		
	case EVENT_NET_MSG_TOPIC_CHANGE_4:
		/* topic change for specific channel */
		if((s = sess_find(SESSTYPE_CHANNEL, EVENT_V(p, 0))) != NULL) {
			sess_set_topic(s, EVENT_V(p, 1));
		}
		break;

	case EVENT_NET_MSG_TOPIC_CHANGE:
		/*
		 * handles topic change for all channels
		 * (theres a single topic for all channels on quickchat network)
		 */
		set_topic_for_all_channels((const gchar*)p);
		break;

	case EVENT_NET_MSG_CHANNEL_JOIN:
	case EVENT_NET_MSG_CHANNEL_LEAVE:
		if(prefs_bool(PREFS_SESS_SUPPRESS_JOIN_LEAVE_TEXT))
			break;

		s = sess_find(SESSTYPE_CHANNEL, EVENT_V(p, 1));
		if(s) {
			sess_write(s, SESSTEXT_NOTIFY,
				e==EVENT_NET_MSG_CHANNEL_JOIN
					? _("%s joins %h"): _("%s left %h"),
				user_name_of(EVENT_V(p, 0)), EVENT_V(p, 1));
		}
		break;

	case EVENT_NET_MSG_CHANNEL_TEXT:
		s = sess_find(SESSTYPE_CHANNEL, EVENT_V(p, 1));
		if(s) {
			if(i) {
				sess_write(s, SESSTEXT_THEIR_ME, "%n %s",
					user_name_of(EVENT_V(p, 0)), (const gchar*)EVENT_V(p, 2));
			} else {
				sess_write(s, SESSTEXT_THEIR_TEXT, "<%n> %s",
					user_name_of(EVENT_V(p, 0)), (const gchar*)EVENT_V(p, 2));
			}
		}
		break;

	case EVENT_NET_MSG_PRIVATE_OPEN:
		s = sess_new(SESSTYPE_PRIVATE, user_name_of(p), TRUE,p);
		if(!s) {
			s = sess_find(SESSTYPE_PRIVATE, user_name_of(p));
		}
		sess_write(s, SESSTEXT_JOIN, _("%s has opened private chat"), user_name_of(p));
		break;

	case EVENT_NET_MSG_PRIVATE_CLOSE:
		s = sess_find(SESSTYPE_PRIVATE, user_name_of(p));
		if(s) {
			sess_write(s, SESSTEXT_LEAVE, _("%s has closed private chat"), user_name_of(p));
		}
		break;

	case EVENT_NET_MSG_PRIVATE_TEXT:
		s = sess_new(SESSTYPE_PRIVATE, user_name_of(EVENT_V(p, 0)), TRUE, EVENT_V(p, 0));
		if(!s) {
			s = sess_find(SESSTYPE_PRIVATE, user_name_of(EVENT_V(p, 0)));
		}

		if(i) {
			sess_write(s, SESSTEXT_THEIR_ME, "%n %s",
				user_name_of(EVENT_V(p, 0)), (const gchar*)EVENT_V(p, 1));
		} else {
			sess_write(s, SESSTEXT_THEIR_TEXT, "<%n> %s",
				user_name_of(EVENT_V(p, 0)), (const gchar*)EVENT_V(p, 1));
		}
		break;

	default:
		break;
	}
}