comparison src/connection.c @ 10754:8a97b59f0071

[gaim-migrate @ 12357] Some fairly clutch changes to how accounts set their statuses. This gets rid of a lot of those g_assertion warnings. My Girlfriend: Dad, why do we have so many forks? Her Dad: Well, it's like the lord said, "Go fork and multiply." committer: Tailor Script <tailor@pidgin.im>
author Mark Doliner <mark@kingant.net>
date Sun, 27 Mar 2005 19:12:52 +0000
parents bf5e48215158
children fffc664d5294
comparison
equal deleted inserted replaced
10753:b40a67d45dbb 10754:8a97b59f0071
145 145
146 void 146 void
147 gaim_connection_destroy(GaimConnection *gc) 147 gaim_connection_destroy(GaimConnection *gc)
148 { 148 {
149 GaimAccount *account; 149 GaimAccount *account;
150 GList *wins;
151 GaimPresence *presence = NULL;
152 GaimPluginProtocolInfo *prpl_info = NULL;
150 153
151 g_return_if_fail(gc != NULL); 154 g_return_if_fail(gc != NULL);
152 155
153 account = gaim_connection_get_account(gc); 156 account = gaim_connection_get_account(gc);
154 157
155 if (gaim_connection_get_state(gc) != GAIM_DISCONNECTED) 158 gaim_debug_info("connection", "Disconnecting connection %p\n", gc);
156 { 159
157 GList *wins; 160 if (gaim_connection_get_state(gc) != GAIM_CONNECTING)
158 GaimPresence *presence = NULL; 161 gaim_blist_remove_account(account);
159 GaimPluginProtocolInfo *prpl_info = NULL; 162
160 163 gaim_signal_emit(gaim_connections_get_handle(), "signing-off", gc);
161 gaim_debug_info("connection", "Disconnecting connection %p\n", gc); 164
162 165 while (gc->buddy_chats)
163 if (gaim_connection_get_state(gc) != GAIM_CONNECTING) 166 {
164 gaim_blist_remove_account(account); 167 GaimConversation *b = gc->buddy_chats->data;
165 168
166 gaim_signal_emit(gaim_connections_get_handle(), "signing-off", gc); 169 gc->buddy_chats = g_slist_remove(gc->buddy_chats, b);
167 170 gaim_conv_chat_left(GAIM_CONV_CHAT(b));
168 while (gc->buddy_chats) 171 }
169 { 172
170 GaimConversation *b = gc->buddy_chats->data; 173 if (gc->idle_timer > 0)
171 174 gaim_timeout_remove(gc->idle_timer);
172 gc->buddy_chats = g_slist_remove(gc->buddy_chats, b); 175 gc->idle_timer = 0;
173 gaim_conv_chat_left(GAIM_CONV_CHAT(b)); 176
174 } 177 update_keepalive(gc, FALSE);
175 178
176 if (gc->idle_timer > 0) 179 if (gc->prpl != NULL)
177 gaim_timeout_remove(gc->idle_timer); 180 {
178 gc->idle_timer = 0; 181 prpl_info = GAIM_PLUGIN_PROTOCOL_INFO(gc->prpl);
179 182
180 update_keepalive(gc, FALSE); 183 if (prpl_info->close)
181 184 (prpl_info->close)(gc);
182 if (gc->prpl != NULL) 185 }
183 { 186
184 prpl_info = GAIM_PLUGIN_PROTOCOL_INFO(gc->prpl); 187 connections = g_list_remove(connections, gc);
185 188
186 if (prpl_info->close) 189 gaim_connection_set_state(gc, GAIM_DISCONNECTED);
187 (prpl_info->close)(gc); 190
188 } 191 /* LOG system_log(log_signoff, gc, NULL,
189 192 OPT_LOG_BUDDY_SIGNON | OPT_LOG_MY_SIGNON); */
190 connections = g_list_remove(connections, gc); 193 gaim_signal_emit(gaim_connections_get_handle(), "signed-off", gc);
191 194
192 gaim_connection_set_state(gc, GAIM_DISCONNECTED); 195 presence = gaim_account_get_presence(account);
193 196 if (gaim_presence_is_online(presence) == TRUE)
194 /* LOG system_log(log_signoff, gc, NULL, 197 gaim_presence_set_status_active(presence, "offline", TRUE);
195 OPT_LOG_BUDDY_SIGNON | OPT_LOG_MY_SIGNON); */ 198
196 gaim_signal_emit(gaim_connections_get_handle(), "signed-off", gc); 199 /*
197 200 * XXX This is a hack! Remove this and replace it with a better event
198 presence = gaim_account_get_presence(account); 201 * notification system.
199 if (gaim_presence_is_online(presence) == TRUE) 202 */
200 gaim_presence_set_status_active(presence, "offline", TRUE); 203 for (wins = gaim_get_windows(); wins != NULL; wins = wins->next) {
201 204 GaimConvWindow *win = (GaimConvWindow *)wins->data;
202 /* 205 gaim_conversation_update(gaim_conv_window_get_conversation_at(win, 0),
203 * XXX This is a hack! Remove this and replace it with a better event 206 GAIM_CONV_ACCOUNT_OFFLINE);
204 * notification system. 207 }
205 */ 208
206 for (wins = gaim_get_windows(); wins != NULL; wins = wins->next) { 209 gaim_request_close_with_handle(gc);
207 GaimConvWindow *win = (GaimConvWindow *)wins->data; 210 gaim_notify_close_with_handle(gc);
208 gaim_conversation_update(gaim_conv_window_get_conversation_at(win, 0),
209 GAIM_CONV_ACCOUNT_OFFLINE);
210 }
211
212 gaim_request_close_with_handle(gc);
213 gaim_notify_close_with_handle(gc);
214
215 return;
216 }
217 211
218 gaim_debug_info("connection", "Destroying connection %p\n", gc); 212 gaim_debug_info("connection", "Destroying connection %p\n", gc);
219 213
220 gaim_account_set_connection(account, NULL); 214 gaim_account_set_connection(account, NULL);
221 215