static void pidgin_connection_report_disconnect_reason (PurpleConnection *gc, PurpleConnectionError reason, const char *text) { PurpleAccount *account = NULL; PidginAutoRecon *info; account = purple_connection_get_account(gc); info = g_hash_table_lookup(auto_reconns, account); if (!purple_connection_error_is_fatal (reason)) { if (info == NULL) { info = g_new0(PidginAutoRecon, 1); g_hash_table_insert(auto_reconns, account, info); info->delay = g_random_int_range(INITIAL_RECON_DELAY_MIN, INITIAL_RECON_DELAY_MAX); } else { info->delay = MIN(2 * info->delay, MAX_RECON_DELAY); if (info->timeout != 0) g_source_remove(info->timeout); } info->timeout = g_timeout_add(info->delay, do_signon, account); } else { if (info != NULL) g_hash_table_remove(auto_reconns, account); purple_account_set_enabled(account, PIDGIN_UI, FALSE); } }
void purple_connection_error_reason (PurpleConnection *gc, PurpleConnectionError reason, const char *description) { PurpleConnectionUiOps *ops; g_return_if_fail(gc != NULL); /* This sanity check relies on PURPLE_CONNECTION_ERROR_OTHER_ERROR * being the last member of the PurpleConnectionError enum in * connection.h; if other reasons are added after it, this check should * be updated. */ if (reason > PURPLE_CONNECTION_ERROR_OTHER_ERROR) { purple_debug_error("connection", "purple_connection_error_reason: reason %u isn't a " "valid reason\n", reason); reason = PURPLE_CONNECTION_ERROR_OTHER_ERROR; } if (description == NULL) { purple_debug_error("connection", "purple_connection_error_reason called with NULL description\n"); description = _("Unknown error"); } /* If we've already got one error, we don't need any more */ if (gc->disconnect_timeout > 0) return; gc->wants_to_die = purple_connection_error_is_fatal (reason); purple_debug_info("connection", "Connection error on %p (reason: %u description: %s)\n", gc, reason, description); ops = purple_connections_get_ui_ops(); if (ops != NULL) { if (ops->report_disconnect_reason != NULL) ops->report_disconnect_reason (gc, reason, description); if (ops->report_disconnect != NULL) ops->report_disconnect (gc, description); } purple_signal_emit(purple_connections_get_handle(), "connection-error", gc, reason, description); gc->disconnect_timeout = purple_timeout_add(0, purple_connection_disconnect_cb, purple_connection_get_account(gc)); }