1
0
mirror of https://github.com/profanity-im/profanity.git synced 2024-12-04 14:46:46 -05:00

Merge branch 'master' into osx-functional

This commit is contained in:
James Booth 2015-12-31 00:41:06 +00:00
commit bdf7b0442b
2 changed files with 72 additions and 56 deletions

View File

@ -93,11 +93,13 @@ static int _room_kick_result_handler(xmpp_conn_t *const conn, xmpp_stanza_t *con
static int _enable_carbons_handler(xmpp_conn_t *const conn, xmpp_stanza_t *const stanza, void *const userdata); static int _enable_carbons_handler(xmpp_conn_t *const conn, xmpp_stanza_t *const stanza, void *const userdata);
static int _disable_carbons_handler(xmpp_conn_t *const conn, xmpp_stanza_t *const stanza, void *const userdata); static int _disable_carbons_handler(xmpp_conn_t *const conn, xmpp_stanza_t *const stanza, void *const userdata);
static int _manual_pong_handler(xmpp_conn_t *const conn, xmpp_stanza_t *const stanza, void *const userdata); static int _manual_pong_handler(xmpp_conn_t *const conn, xmpp_stanza_t *const stanza, void *const userdata);
static int _ping_timed_handler(xmpp_conn_t *const conn, void *const userdata); static int _autoping_timed_handler(xmpp_conn_t *const conn, void *const userdata);
static int _caps_response_handler(xmpp_conn_t *const conn, xmpp_stanza_t *const stanza, void *const userdata); static int _caps_response_handler(xmpp_conn_t *const conn, xmpp_stanza_t *const stanza, void *const userdata);
static int _caps_response_handler_for_jid(xmpp_conn_t *const conn, xmpp_stanza_t *const stanza, void *const userdata); static int _caps_response_handler_for_jid(xmpp_conn_t *const conn, xmpp_stanza_t *const stanza, void *const userdata);
static int _caps_response_handler_legacy(xmpp_conn_t *const conn, xmpp_stanza_t *const stanza, void *const userdata); static int _caps_response_handler_legacy(xmpp_conn_t *const conn, xmpp_stanza_t *const stanza, void *const userdata);
static gboolean autoping_wait = FALSE;
void void
iq_add_handlers(void) iq_add_handlers(void)
{ {
@ -119,25 +121,27 @@ iq_add_handlers(void)
if (prefs_get_autoping() != 0) { if (prefs_get_autoping() != 0) {
int millis = prefs_get_autoping() * 1000; int millis = prefs_get_autoping() * 1000;
xmpp_timed_handler_add(conn, _ping_timed_handler, millis, ctx); xmpp_timed_handler_add(conn, _autoping_timed_handler, millis, ctx);
} }
} }
void void
iq_set_autoping(const int seconds) iq_set_autoping(const int seconds)
{ {
xmpp_conn_t * const conn = connection_get_conn(); if (jabber_get_connection_status() != JABBER_CONNECTED) {
xmpp_ctx_t * const ctx = connection_get_ctx(); return;
if (jabber_get_connection_status() == JABBER_CONNECTED) {
xmpp_timed_handler_delete(conn, _ping_timed_handler);
if (seconds != 0) {
int millis = seconds * 1000;
xmpp_timed_handler_add(conn, _ping_timed_handler, millis,
ctx);
}
} }
xmpp_conn_t * const conn = connection_get_conn();
xmpp_timed_handler_delete(conn, _autoping_timed_handler);
if (seconds == 0) {
return;
}
int millis = seconds * 1000;
xmpp_ctx_t * const ctx = connection_get_ctx();
xmpp_timed_handler_add(conn, _autoping_timed_handler, millis, ctx);
} }
void void
@ -522,42 +526,47 @@ _error_handler(xmpp_conn_t *const conn, xmpp_stanza_t *const stanza,
} }
static int static int
_pong_handler(xmpp_conn_t *const conn, xmpp_stanza_t *const stanza, _auto_pong_handler(xmpp_conn_t *const conn, xmpp_stanza_t *const stanza, void *const userdata)
void *const userdata)
{ {
autoping_wait = FALSE;
char *id = xmpp_stanza_get_id(stanza); char *id = xmpp_stanza_get_id(stanza);
if (id == NULL) {
log_debug("Autoping: Pong handler fired.");
return 0;
}
log_debug("Autoping: Pong handler fired: %s.", id);
char *type = xmpp_stanza_get_type(stanza); char *type = xmpp_stanza_get_type(stanza);
if (type == NULL) {
if (id) { return 0;
log_debug("IQ pong handler fired, id: %s.", id); }
} else { if (g_strcmp0(type, STANZA_TYPE_ERROR) != 0) {
log_debug("IQ pong handler fired."); return 0;
} }
if (id && type) { // show warning if error
// show warning if error char *error_msg = stanza_get_error_message(stanza);
if (strcmp(type, STANZA_TYPE_ERROR) == 0) { log_warning("Server ping (id=%s) responded with error: %s", id, error_msg);
char *error_msg = stanza_get_error_message(stanza); free(error_msg);
log_warning("Server ping (id=%s) responded with error: %s", id, error_msg);
free(error_msg);
// turn off autoping if error type is 'cancel' // turn off autoping if error type is 'cancel'
xmpp_stanza_t *error = xmpp_stanza_get_child_by_name(stanza, STANZA_NAME_ERROR); xmpp_stanza_t *error = xmpp_stanza_get_child_by_name(stanza, STANZA_NAME_ERROR);
if (error) { if (error == NULL) {
char *errtype = xmpp_stanza_get_type(error); return 0;
if (errtype) { }
if (strcmp(errtype, "cancel") == 0) { char *errtype = xmpp_stanza_get_type(error);
log_warning("Server ping (id=%s) error type 'cancel', disabling autoping.", id); if (errtype == NULL) {
prefs_set_autoping(0); return 0;
cons_show_error("Server ping not supported, autoping disabled."); }
xmpp_timed_handler_delete(conn, _ping_timed_handler); if (g_strcmp0(errtype, "cancel") == 0) {
} log_warning("Server ping (id=%s) error type 'cancel', disabling autoping.", id);
} prefs_set_autoping(0);
} cons_show_error("Server ping not supported, autoping disabled.");
} xmpp_timed_handler_delete(conn, _autoping_timed_handler);
} }
// remove this handler
return 0; return 0;
} }
@ -839,22 +848,29 @@ _manual_pong_handler(xmpp_conn_t *const conn, xmpp_stanza_t *const stanza,
} }
static int static int
_ping_timed_handler(xmpp_conn_t *const conn, void *const userdata) _autoping_timed_handler(xmpp_conn_t *const conn, void *const userdata)
{ {
xmpp_ctx_t *ctx = (xmpp_ctx_t *)userdata; if (jabber_get_connection_status() != JABBER_CONNECTED) {
return 1;
if (jabber_get_connection_status() == JABBER_CONNECTED) {
xmpp_stanza_t *iq = stanza_create_ping_iq(ctx, NULL);
char *id = xmpp_stanza_get_id(iq);
// add pong handler
xmpp_id_handler_add(conn, _pong_handler, id, ctx);
xmpp_send(conn, iq);
xmpp_stanza_release(iq);
} }
if (autoping_wait) {
log_debug("Autoping: Existing ping already in progress, aborting");
return 1;
}
xmpp_ctx_t *ctx = (xmpp_ctx_t *)userdata;
xmpp_stanza_t *iq = stanza_create_ping_iq(ctx, NULL);
char *id = xmpp_stanza_get_id(iq);
log_debug("Autoping: Sending ping request: %s", id);
// add pong handler
xmpp_id_handler_add(conn, _auto_pong_handler, id, ctx);
xmpp_send(conn, iq);
xmpp_stanza_release(iq);
autoping_wait = TRUE;
return 1; return 1;
} }

View File

@ -70,10 +70,10 @@ resource.title=true
resource.message=true resource.message=true
statuses.console=all statuses.console=all
statuses.chat=all statuses.chat=all
statuses.muc=all statuses.muc=none
roster=true roster=true
roster.offline=true roster.offline=true
roster.empty=true roster.empty=false
roster.by=group roster.by=group
roster.order=presence roster.order=presence
roster.count=true roster.count=true