comparison libpurple/protocols/silc/silc.c @ 20130:6aca488bd8ab

Add disconnection reasons to silc.
author Will Thompson <will.thompson@collabora.co.uk>
date Wed, 03 Oct 2007 13:12:39 +0000
parents 9683da821d15
children 8174f6999308
comparison
equal deleted inserted replaced
20129:2d3032f710ac 20130:6aca488bd8ab
212 if (sg->resuming && !sg->detaching) 212 if (sg->resuming && !sg->detaching)
213 g_unlink(silcpurple_session_file(purple_account_get_username(sg->account))); 213 g_unlink(silcpurple_session_file(purple_account_get_username(sg->account)));
214 214
215 /* Close the connection */ 215 /* Close the connection */
216 if (!sg->detaching) 216 if (!sg->detaching)
217 purple_connection_error(gc, _("Disconnected by server")); 217 purple_connection_error_reason(gc,
218 PURPLE_REASON_NETWORK_ERROR,
219 _("Disconnected by server"));
218 else 220 else
219 /* TODO: Does this work correctly? Maybe we need to set wants_to_die? */ 221 /* TODO: Does this work correctly? Maybe we need to set wants_to_die? */
220 purple_account_disconnect(purple_connection_get_account(gc)); 222 purple_account_disconnect(purple_connection_get_account(gc));
221 break; 223 break;
222 224
223 case SILC_CLIENT_CONN_ERROR: 225 case SILC_CLIENT_CONN_ERROR:
224 purple_connection_error(gc, _("Error during connecting to SILC Server")); 226 purple_connection_error_reason(gc, PURPLE_REASON_NETWORK_ERROR,
227 _("Error during connecting to SILC Server"));
225 g_unlink(silcpurple_session_file(purple_account_get_username(sg->account))); 228 g_unlink(silcpurple_session_file(purple_account_get_username(sg->account)));
226 break; 229 break;
227 230
228 case SILC_CLIENT_CONN_ERROR_KE: 231 case SILC_CLIENT_CONN_ERROR_KE:
229 purple_connection_error(gc, _("Key Exchange failed")); 232 purple_connection_error_reason(gc, PURPLE_REASON_ENCRYPTION_ERROR,
233 _("Key Exchange failed"));
230 break; 234 break;
231 235
232 case SILC_CLIENT_CONN_ERROR_AUTH: 236 case SILC_CLIENT_CONN_ERROR_AUTH:
233 purple_connection_error(gc, _("Authentication failed")); 237 purple_connection_error_reason(gc, PURPLE_REASON_AUTHENTICATION_FAILED,
238 _("Authentication failed"));
234 break; 239 break;
235 240
236 case SILC_CLIENT_CONN_ERROR_RESUME: 241 case SILC_CLIENT_CONN_ERROR_RESUME:
237 purple_connection_error(gc, 242 purple_connection_error_reason(gc, PURPLE_REASON_OTHER_ERROR,
238 _("Resuming detached session failed. " 243 _("Resuming detached session failed. "
239 "Press Reconnect to create new connection.")); 244 "Press Reconnect to create new connection."));
240 g_unlink(silcpurple_session_file(purple_account_get_username(sg->account))); 245 g_unlink(silcpurple_session_file(purple_account_get_username(sg->account)));
241 break; 246 break;
242 247
243 case SILC_CLIENT_CONN_ERROR_TIMEOUT: 248 case SILC_CLIENT_CONN_ERROR_TIMEOUT:
244 purple_connection_error(gc, _("Connection Timeout")); 249 purple_connection_error_reason(gc, PURPLE_REASON_NETWORK_ERROR,
250 _("Connection Timeout"));
245 break; 251 break;
246 } 252 }
247 253
248 /* Error */ 254 /* Error */
249 sg->conn = NULL; 255 sg->conn = NULL;
260 const char *dfile; 266 const char *dfile;
261 267
262 sg = gc->proto_data; 268 sg = gc->proto_data;
263 269
264 if (status != SILC_SOCKET_OK) { 270 if (status != SILC_SOCKET_OK) {
265 purple_connection_error(gc, _("Connection failed")); 271 purple_connection_error_reason(gc, PURPLE_REASON_NETWORK_ERROR,
272 _("Connection failed"));
266 silc_pkcs_public_key_free(sg->public_key); 273 silc_pkcs_public_key_free(sg->public_key);
267 silc_pkcs_private_key_free(sg->private_key); 274 silc_pkcs_private_key_free(sg->private_key);
268 silc_free(sg); 275 silc_free(sg);
269 gc->proto_data = NULL; 276 gc->proto_data = NULL;
270 return; 277 return;
306 g_return_if_fail(gc != NULL); 313 g_return_if_fail(gc != NULL);
307 314
308 sg = gc->proto_data; 315 sg = gc->proto_data;
309 316
310 if (source < 0) { 317 if (source < 0) {
311 purple_connection_error(gc, _("Connection failed")); 318 purple_connection_error_reason(gc, PURPLE_REASON_NETWORK_ERROR,
319 _("Connection failed"));
312 silc_pkcs_public_key_free(sg->public_key); 320 silc_pkcs_public_key_free(sg->public_key);
313 silc_pkcs_private_key_free(sg->private_key); 321 silc_pkcs_private_key_free(sg->private_key);
314 silc_free(sg); 322 silc_free(sg);
315 gc->proto_data = NULL; 323 gc->proto_data = NULL;
316 return; 324 return;
347 g_snprintf(prd, sizeof(prd), "%s" G_DIR_SEPARATOR_S "private_key.prv", silcpurple_silcdir()); 355 g_snprintf(prd, sizeof(prd), "%s" G_DIR_SEPARATOR_S "private_key.prv", silcpurple_silcdir());
348 if (!silc_load_key_pair((char *)purple_account_get_string(account, "public-key", pkd), 356 if (!silc_load_key_pair((char *)purple_account_get_string(account, "public-key", pkd),
349 (char *)purple_account_get_string(account, "private-key", prd), 357 (char *)purple_account_get_string(account, "private-key", prd),
350 (gc->password == NULL) ? "" : gc->password, 358 (gc->password == NULL) ? "" : gc->password,
351 &sg->public_key, &sg->private_key)) { 359 &sg->public_key, &sg->private_key)) {
352 g_snprintf(pkd, sizeof(pkd), _("Could not load SILC key pair")); 360 purple_connection_error_reason(gc, PURPLE_REASON_OTHER_ERROR,
353 purple_connection_error(gc, pkd); 361 _("Could not load SILC key pair"));
354 gc->proto_data = NULL; 362 gc->proto_data = NULL;
355 silc_free(sg); 363 silc_free(sg);
356 return; 364 return;
357 } 365 }
358 366
361 purple_account_get_string(account, "server", 369 purple_account_get_string(account, "server",
362 "silc.silcnet.org"), 370 "silc.silcnet.org"),
363 purple_account_get_int(account, "port", 706), 371 purple_account_get_int(account, "port", 706),
364 silcpurple_login_connected, gc) == NULL) 372 silcpurple_login_connected, gc) == NULL)
365 { 373 {
366 purple_connection_error(gc, _("Unable to create connection")); 374 purple_connection_error_reason(gc, PURPLE_REASON_NETWORK_ERROR,
375 _("Unable to create connection"));
367 gc->proto_data = NULL; 376 gc->proto_data = NULL;
368 silc_free(sg); 377 silc_free(sg);
369 return; 378 return;
370 } 379 }
371 } 380 }
390 strcat(params.nickname_format, "%n#a"); 399 strcat(params.nickname_format, "%n#a");
391 400
392 /* Allocate SILC client */ 401 /* Allocate SILC client */
393 client = silc_client_alloc(&ops, &params, gc, NULL); 402 client = silc_client_alloc(&ops, &params, gc, NULL);
394 if (!client) { 403 if (!client) {
395 purple_connection_error(gc, _("Out of memory")); 404 purple_connection_error_reason(gc, PURPLE_REASON_OTHER_ERROR,
405 _("Out of memory"));
396 return; 406 return;
397 } 407 }
398 408
399 /* Get username, real name and local hostname for SILC library */ 409 /* Get username, real name and local hostname for SILC library */
400 if (!purple_account_get_username(account)) 410 if (!purple_account_get_username(account))
433 443
434 /* Init SILC client */ 444 /* Init SILC client */
435 if (!silc_client_init(client, username, hostname, realname, 445 if (!silc_client_init(client, username, hostname, realname,
436 silcpurple_running, account)) { 446 silcpurple_running, account)) {
437 gc->wants_to_die = TRUE; 447 gc->wants_to_die = TRUE;
438 purple_connection_error(gc, _("Cannot initialize SILC protocol")); 448 purple_connection_error_reason(gc, PURPLE_REASON_OTHER_ERROR,
449 _("Cannot initialize SILC protocol"));
439 return; 450 return;
440 } 451 }
441 452
442 /* Check the ~/.silc dir and create it, and new key pair if necessary. */ 453 /* Check the ~/.silc dir and create it, and new key pair if necessary. */
443 if (!silcpurple_check_silc_dir(gc)) { 454 if (!silcpurple_check_silc_dir(gc)) {
444 gc->wants_to_die = TRUE; 455 gc->wants_to_die = TRUE;
445 purple_connection_error(gc, _("Error loading SILC key pair")); 456 purple_connection_error_reason(gc, PURPLE_REASON_OTHER_ERROR,
457 _("Error loading SILC key pair"));
446 return; 458 return;
447 } 459 }
448 460
449 /* Schedule SILC using Glib's event loop */ 461 /* Schedule SILC using Glib's event loop */
450 scheduler = purple_timeout_add(300, (GSourceFunc)silcpurple_scheduler, client); 462 scheduler = purple_timeout_add(300, (GSourceFunc)silcpurple_scheduler, client);