/* 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); }
/* 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; } }