/************************************************************************** * Plugin stuff **************************************************************************/ static gboolean plugin_load(GaimPlugin *plugin) { gaim_signal_connect(gaim_connections_get_handle(), "signed-on", plugin, GAIM_CALLBACK(signed_on_cb), NULL); /* we don't check if we're offline */ if(gaim_connections_get_all()) do_check(); return TRUE; }
void gaim_connection_register(GaimConnection *gc) { GaimAccount *account; GaimConnectionUiOps *ops; GaimPluginProtocolInfo *prpl_info = NULL; g_return_if_fail(gc != NULL); gaim_debug(GAIM_DEBUG_INFO, "connection", "Registering. gc = %p\n", gc); ops = gaim_get_connection_ui_ops(); if (gc->prpl != NULL) prpl_info = GAIM_PLUGIN_PROTOCOL_INFO(gc->prpl); else { gchar *message = g_strdup_printf(_("Missing protocol plugin for %s"), gaim_account_get_username(gaim_connection_get_account(gc))); gaim_debug(GAIM_DEBUG_ERROR, "connection", "Could not get prpl info for %p\n", gc); gaim_notify_error(NULL, _("Registration Error"), message, NULL); g_free(message); return; } account = gaim_connection_get_account(gc); if (gaim_connection_get_state(gc) != GAIM_DISCONNECTED) return; gaim_connection_set_state(gc, GAIM_CONNECTING); connections = g_list_append(connections, gc); gaim_signal_emit(gaim_connections_get_handle(), "signing-on", gc); /* set this so we don't auto-reconnect after registering */ gc->wants_to_die = TRUE; gaim_debug(GAIM_DEBUG_INFO, "connection", "Calling register_user\n"); prpl_info->register_user(account); }
static gboolean plugin_load(GaimPlugin *plugin) { GaimBuddyList *list = gaim_get_blist(); void *conn_handle = gaim_connections_get_handle(); if (!check_timeout(NULL)) { gaim_debug_warning("mailchk", "Could not read $MAIL or /var/spool/mail/$USER"); return FALSE; } if (list && GAIM_IS_GTK_BLIST(list) && GAIM_GTK_BLIST(list)->vbox) timer = g_timeout_add(2000, check_timeout, NULL); gaim_signal_connect(conn_handle, "signed-on", plugin, GAIM_CALLBACK(signon_cb), NULL); gaim_signal_connect(conn_handle, "signed-off", plugin, GAIM_CALLBACK(signoff_cb), NULL); return TRUE; }
void gaim_connections_uninit(void) { gaim_signals_unregister_by_instance(gaim_connections_get_handle()); }
void gaim_connection_set_state(GaimConnection *gc, GaimConnectionState state) { GaimConnectionUiOps *ops; g_return_if_fail(gc != NULL); if (gc->state == state) return; gc->state = state; ops = gaim_get_connection_ui_ops(); if (gc->state == GAIM_CONNECTING) { connections_connecting = g_list_append(connections_connecting, gc); } else { connections_connecting = g_list_remove(connections_connecting, gc); } if (gc->state == GAIM_CONNECTED) { GaimBlistNode *gnode,*cnode,*bnode; GList *wins; GList *add_buds=NULL; /* Set the time the account came online */ time(&gc->login_time); if (ops != NULL && ops->connected != NULL) ops->connected(gc); gaim_blist_show(); gaim_blist_add_account(gc->account); /* * XXX This is a hack! Remove this and replace it with a better event * notification system. */ for (wins = gaim_get_windows(); wins != NULL; wins = wins->next) { GaimWindow *win = (GaimWindow *)wins->data; gaim_conversation_update(gaim_window_get_conversation_at(win, 0), GAIM_CONV_ACCOUNT_ONLINE); } gaim_signal_emit(gaim_connections_get_handle(), "signed-on", gc); system_log(log_signon, gc, NULL, OPT_LOG_BUDDY_SIGNON | OPT_LOG_MY_SIGNON); #if 0 /* away option given? */ if (opt_away) { away_on_login(opt_away_arg); /* don't do it again */ opt_away = 0; } else if (awaymessage) { serv_set_away(gc, GAIM_AWAY_CUSTOM, awaymessage->message); } if (opt_away_arg != NULL) { g_free(opt_away_arg); opt_away_arg = NULL; } #endif /* let the prpl know what buddies we pulled out of the local list */ for (gnode = gaim_get_blist()->root; gnode; gnode = gnode->next) { if(!GAIM_BLIST_NODE_IS_GROUP(gnode)) continue; for(cnode = gnode->child; cnode; cnode = cnode->next) { if(!GAIM_BLIST_NODE_IS_CONTACT(cnode)) continue; for(bnode = cnode->child; bnode; bnode = bnode->next) { GaimBuddy *b; if(!GAIM_BLIST_NODE_IS_BUDDY(bnode)) continue; b = (GaimBuddy *)bnode; if(b->account == gc->account) { add_buds = g_list_append(add_buds, b->name); } } } } if(add_buds) { serv_add_buddies(gc, add_buds); g_list_free(add_buds); } serv_set_permit_deny(gc); } else if (gc->state == GAIM_DISCONNECTED) { if (ops != NULL && ops->disconnected != NULL) ops->disconnected(gc); } }
void gaim_connection_connect(GaimConnection *gc) { GaimAccount *account; GaimConnectionUiOps *ops; GaimPluginProtocolInfo *prpl_info = NULL; g_return_if_fail(gc != NULL); gaim_debug(GAIM_DEBUG_INFO, "connection", "Connecting. gc = %p\n", gc); ops = gaim_get_connection_ui_ops(); if (gc->prpl != NULL) prpl_info = GAIM_PLUGIN_PROTOCOL_INFO(gc->prpl); else { gchar *message = g_strdup_printf(_("Missing protocol plugin for %s"), gaim_account_get_username(gaim_connection_get_account(gc))); gaim_debug(GAIM_DEBUG_ERROR, "connection", "Could not get prpl info for %p\n", gc); gaim_notify_error(NULL, _("Connection Error"), message, NULL); g_free(message); return; } account = gaim_connection_get_account(gc); if (gaim_connection_get_state(gc) != GAIM_DISCONNECTED) return; if (!(prpl_info->options & OPT_PROTO_NO_PASSWORD) && !(prpl_info->options & OPT_PROTO_PASSWORD_OPTIONAL) && gaim_account_get_password(account) == NULL) { gchar *primary; gchar *escaped; const gchar *username = gaim_account_get_username(account); gaim_debug(GAIM_DEBUG_INFO, "connection", "Requesting password\n"); gaim_connection_destroy(gc); escaped = g_markup_escape_text(username, strlen(username)); primary = g_strdup_printf(_("Enter password for %s"), escaped); gaim_request_input(gc, NULL, primary, NULL, NULL, FALSE, TRUE, _("OK"), G_CALLBACK(request_pass_ok_cb), _("Cancel"), NULL, account); g_free(primary); g_free(escaped); return; } gaim_connection_set_state(gc, GAIM_CONNECTING); connections = g_list_append(connections, gc); gaim_signal_emit(gaim_connections_get_handle(), "signing-on", gc); gaim_debug(GAIM_DEBUG_INFO, "connection", "Calling serv_login\n"); serv_login(account); }
/************************************************************************** * Plugin stuff **************************************************************************/ static gboolean plugin_load(GaimPlugin *plugin) { void *core_handle = gaim_get_core(); void *blist_handle = gaim_blist_get_handle(); void *conn_handle = gaim_connections_get_handle(); void *conv_handle = gaim_conversations_get_handle(); void *accounts_handle = gaim_accounts_get_handle(); void *buddy_icons_handle = gaim_buddy_icons_get_handle(); /* Accounts subsystem signals */ gaim_signal_connect(accounts_handle, "account-connecting", plugin, GAIM_CALLBACK(account_connecting_cb), NULL); gaim_signal_connect(accounts_handle, "account-away", plugin, GAIM_CALLBACK(account_away_cb), NULL); gaim_signal_connect(accounts_handle, "account-setting-info", plugin, GAIM_CALLBACK(account_setting_info_cb), NULL); gaim_signal_connect(accounts_handle, "account-set-info", plugin, GAIM_CALLBACK(account_set_info_cb), NULL); gaim_signal_connect(accounts_handle, "account-warned", plugin, GAIM_CALLBACK(account_warned_cb), NULL); /* Buddy Icon subsystem signals */ gaim_signal_connect(buddy_icons_handle, "buddy-icon-cached", plugin, GAIM_CALLBACK(buddy_icon_cached_cb), NULL); /* Buddy List subsystem signals */ gaim_signal_connect(blist_handle, "buddy-away", plugin, GAIM_CALLBACK(buddy_away_cb), NULL); gaim_signal_connect(blist_handle, "buddy-back", plugin, GAIM_CALLBACK(buddy_back_cb), NULL); gaim_signal_connect(blist_handle, "buddy-idle", plugin, GAIM_CALLBACK(buddy_idle_cb), NULL); gaim_signal_connect(blist_handle, "buddy-unidle", plugin, GAIM_CALLBACK(buddy_unidle_cb), NULL); gaim_signal_connect(blist_handle, "buddy-signed-on", plugin, GAIM_CALLBACK(buddy_signed_on_cb), NULL); gaim_signal_connect(blist_handle, "buddy-signed-off", plugin, GAIM_CALLBACK(buddy_signed_off_cb), NULL); gaim_signal_connect(blist_handle, "blist-node-extended-menu", plugin, GAIM_CALLBACK(blist_node_extended_menu_cb), NULL); /* Connection subsystem signals */ gaim_signal_connect(conn_handle, "signing-on", plugin, GAIM_CALLBACK(signing_on_cb), NULL); gaim_signal_connect(conn_handle, "signed-on", plugin, GAIM_CALLBACK(signed_on_cb), NULL); gaim_signal_connect(conn_handle, "signing-off", plugin, GAIM_CALLBACK(signing_off_cb), NULL); gaim_signal_connect(conn_handle, "signed-off", plugin, GAIM_CALLBACK(signed_off_cb), NULL); /* Conversations subsystem signals */ gaim_signal_connect(conv_handle, "displaying-im-msg", plugin, GAIM_CALLBACK(displaying_im_msg_cb), NULL); gaim_signal_connect(conv_handle, "displayed-im-msg", plugin, GAIM_CALLBACK(displayed_im_msg_cb), NULL); gaim_signal_connect(conv_handle, "writing-im-msg", plugin, GAIM_CALLBACK(writing_im_msg_cb), NULL); gaim_signal_connect(conv_handle, "wrote-im-msg", plugin, GAIM_CALLBACK(wrote_im_msg_cb), NULL); gaim_signal_connect(conv_handle, "sending-im-msg", plugin, GAIM_CALLBACK(sending_im_msg_cb), NULL); gaim_signal_connect(conv_handle, "sent-im-msg", plugin, GAIM_CALLBACK(sent_im_msg_cb), NULL); gaim_signal_connect(conv_handle, "receiving-im-msg", plugin, GAIM_CALLBACK(receiving_im_msg_cb), NULL); gaim_signal_connect(conv_handle, "received-im-msg", plugin, GAIM_CALLBACK(received_im_msg_cb), NULL); gaim_signal_connect(conv_handle, "displaying-chat-msg", plugin, GAIM_CALLBACK(displaying_chat_msg_cb), NULL); gaim_signal_connect(conv_handle, "displayed-chat-msg", plugin, GAIM_CALLBACK(displayed_chat_msg_cb), NULL); gaim_signal_connect(conv_handle, "writing-chat-msg", plugin, GAIM_CALLBACK(writing_chat_msg_cb), NULL); gaim_signal_connect(conv_handle, "wrote-chat-msg", plugin, GAIM_CALLBACK(wrote_chat_msg_cb), NULL); gaim_signal_connect(conv_handle, "sending-chat-msg", plugin, GAIM_CALLBACK(sending_chat_msg_cb), NULL); gaim_signal_connect(conv_handle, "sent-chat-msg", plugin, GAIM_CALLBACK(sent_chat_msg_cb), NULL); gaim_signal_connect(conv_handle, "receiving-chat-msg", plugin, GAIM_CALLBACK(receiving_chat_msg_cb), NULL); gaim_signal_connect(conv_handle, "received-chat-msg", plugin, GAIM_CALLBACK(received_chat_msg_cb), NULL); gaim_signal_connect(conv_handle, "conversation-switching", plugin, GAIM_CALLBACK(conversation_switching_cb), NULL); gaim_signal_connect(conv_handle, "conversation-switched", plugin, GAIM_CALLBACK(conversation_switched_cb), NULL); gaim_signal_connect(conv_handle, "conversation-created", plugin, GAIM_CALLBACK(conversation_created_cb), NULL); gaim_signal_connect(conv_handle, "deleting-conversation", plugin, GAIM_CALLBACK(deleting_conversation_cb), NULL); gaim_signal_connect(conv_handle, "buddy-typing", plugin, GAIM_CALLBACK(buddy_typing_cb), NULL); gaim_signal_connect(conv_handle, "chat-buddy-joining", plugin, GAIM_CALLBACK(chat_buddy_joining_cb), NULL); gaim_signal_connect(conv_handle, "chat-buddy-joined", plugin, GAIM_CALLBACK(chat_buddy_joined_cb), NULL); gaim_signal_connect(conv_handle, "chat-buddy-flags", plugin, GAIM_CALLBACK(chat_buddy_flags_cb), NULL); gaim_signal_connect(conv_handle, "chat-buddy-leaving", plugin, GAIM_CALLBACK(chat_buddy_leaving_cb), NULL); gaim_signal_connect(conv_handle, "chat-buddy-left", plugin, GAIM_CALLBACK(chat_buddy_left_cb), NULL); gaim_signal_connect(conv_handle, "chat-inviting-user", plugin, GAIM_CALLBACK(chat_inviting_user_cb), NULL); gaim_signal_connect(conv_handle, "chat-invited-user", plugin, GAIM_CALLBACK(chat_invited_user_cb), NULL); gaim_signal_connect(conv_handle, "chat-invited", plugin, GAIM_CALLBACK(chat_invited_cb), NULL); gaim_signal_connect(conv_handle, "chat-joined", plugin, GAIM_CALLBACK(chat_joined_cb), NULL); gaim_signal_connect(conv_handle, "chat-left", plugin, GAIM_CALLBACK(chat_left_cb), NULL); gaim_signal_connect(conv_handle, "chat-topic-changed", plugin, GAIM_CALLBACK(chat_topic_changed_cb), NULL); /* Core signals */ gaim_signal_connect(core_handle, "quitting", plugin, GAIM_CALLBACK(quitting_cb), NULL); return TRUE; }
void gaim_connection_new(GaimAccount *account, gboolean regist, const char *password) { GaimConnection *gc; GaimPlugin *prpl; GaimPluginProtocolInfo *prpl_info; g_return_if_fail(account != NULL); if (!gaim_account_is_disconnected(account)) return; prpl = gaim_find_prpl(gaim_account_get_protocol_id(account)); if (prpl != NULL) prpl_info = GAIM_PLUGIN_PROTOCOL_INFO(prpl); else { gchar *message; message = g_strdup_printf(_("Missing protocol plugin for %s"), gaim_account_get_username(account)); gaim_notify_error(NULL, regist ? _("Registration Error") : _("Connection Error"), message, NULL); g_free(message); return; } if (regist) { if (prpl_info->register_user == NULL) return; } else { if (((password == NULL) || (*password == '\0')) && !(prpl_info->options & OPT_PROTO_NO_PASSWORD) && !(prpl_info->options & OPT_PROTO_PASSWORD_OPTIONAL)) { gaim_debug_error("connection", "Can not connect to account %s without " "a password.\n", gaim_account_get_username(account)); return; } } gc = g_new0(GaimConnection, 1); GAIM_DBUS_REGISTER_POINTER(gc, GaimConnection); gc->prpl = prpl; if ((password != NULL) && (*password != '\0')) gc->password = g_strdup(password); gaim_connection_set_account(gc, account); gaim_connection_set_state(gc, GAIM_CONNECTING); connections = g_list_append(connections, gc); gaim_account_set_connection(account, gc); gaim_signal_emit(gaim_connections_get_handle(), "signing-on", gc); if (regist) { gaim_debug_info("connection", "Registering. gc = %p\n", gc); /* set this so we don't auto-reconnect after registering */ gc->wants_to_die = TRUE; prpl_info->register_user(account); } else { gaim_debug_info("connection", "Connecting. gc = %p\n", gc); gaim_signal_emit(gaim_accounts_get_handle(), "account-connecting", account); prpl_info->login(account); } }
void gaim_connection_set_state(GaimConnection *gc, GaimConnectionState state) { GaimConnectionUiOps *ops; g_return_if_fail(gc != NULL); if (gc->state == state) return; gc->state = state; ops = gaim_connections_get_ui_ops(); if (gc->state == GAIM_CONNECTING) { connections_connecting = g_list_append(connections_connecting, gc); } else { connections_connecting = g_list_remove(connections_connecting, gc); } if (gc->state == GAIM_CONNECTED) { GaimAccount *account; GaimPresence *presence; account = gaim_connection_get_account(gc); presence = gaim_account_get_presence(account); /* Set the time the account came online */ gaim_presence_set_login_time(presence, time(NULL)); if (gaim_prefs_get_bool("/core/logging/log_system")) { GaimLog *log = gaim_account_get_log(account, TRUE); if (log != NULL) { char *msg = g_strdup_printf(_("+++ %s signed on"), gaim_account_get_username(account)); gaim_log_write(log, GAIM_MESSAGE_SYSTEM, gaim_account_get_username(account), gaim_presence_get_login_time(presence), msg); g_free(msg); } } if (ops != NULL && ops->connected != NULL) ops->connected(gc); gaim_blist_add_account(account); gaim_signal_emit(gaim_connections_get_handle(), "signed-on", gc); serv_set_permit_deny(gc); update_keepalive(gc, TRUE); } else if (gc->state == GAIM_DISCONNECTED) { GaimAccount *account = gaim_connection_get_account(gc); if (gaim_prefs_get_bool("/core/logging/log_system")) { GaimLog *log = gaim_account_get_log(account, FALSE); if (log != NULL) { char *msg = g_strdup_printf(_("+++ %s signed off"), gaim_account_get_username(account)); gaim_log_write(log, GAIM_MESSAGE_SYSTEM, gaim_account_get_username(account), time(NULL), msg); g_free(msg); } } gaim_account_destroy_log(account); if (ops != NULL && ops->disconnected != NULL) ops->disconnected(gc); } }
void gaim_connection_destroy(GaimConnection *gc) { GaimAccount *account; GSList *buddies, *tmp; #if 0 GList *wins; #endif GaimPluginProtocolInfo *prpl_info = NULL; gboolean remove = FALSE; g_return_if_fail(gc != NULL); account = gaim_connection_get_account(gc); gaim_debug_info("connection", "Disconnecting connection %p\n", gc); if (gaim_connection_get_state(gc) != GAIM_CONNECTING) remove = TRUE; gaim_signal_emit(gaim_connections_get_handle(), "signing-off", gc); while (gc->buddy_chats) { GaimConversation *b = gc->buddy_chats->data; gc->buddy_chats = g_slist_remove(gc->buddy_chats, b); gaim_conv_chat_left(GAIM_CONV_CHAT(b)); } update_keepalive(gc, FALSE); gaim_proxy_connect_cancel_with_handle(gc); prpl_info = GAIM_PLUGIN_PROTOCOL_INFO(gc->prpl); if (prpl_info->close) (prpl_info->close)(gc); /* Clear out the proto data that was freed in the prpl close method*/ buddies = gaim_find_buddies(account, NULL); for (tmp = buddies; tmp; tmp = tmp->next) { GaimBuddy *buddy = tmp->data; buddy->proto_data = NULL; } g_slist_free(buddies); connections = g_list_remove(connections, gc); gaim_connection_set_state(gc, GAIM_DISCONNECTED); if (remove) gaim_blist_remove_account(account); gaim_signal_emit(gaim_connections_get_handle(), "signed-off", gc); #if 0 /* see comment later in file on if 0'd same code */ /* * XXX This is a hack! Remove this and replace it with a better event * notification system. */ for (wins = gaim_get_windows(); wins != NULL; wins = wins->next) { GaimConvWindow *win = (GaimConvWindow *)wins->data; gaim_conversation_update(gaim_conv_window_get_conversation_at(win, 0), GAIM_CONV_ACCOUNT_OFFLINE); } #endif gaim_request_close_with_handle(gc); gaim_notify_close_with_handle(gc); gaim_debug_info("connection", "Destroying connection %p\n", gc); gaim_account_set_connection(account, NULL); g_free(gc->password); g_free(gc->display_name); if (gc->disconnect_timeout) gaim_timeout_remove(gc->disconnect_timeout); GAIM_DBUS_UNREGISTER_POINTER(gc); g_free(gc); }