comparison libpurple/protocols/irc/irc.c @ 20812:88aa557b997f

propagate from branch 'im.pidgin.pidgin' (head 017296ee954fb91349806c809983c916842603da) to branch 'im.pidgin.cpw.resiak.disconnectreason' (head 8648cc67b0f11cdb0c5d48a703bca11b56606a16)
author Will Thompson <will.thompson@collabora.co.uk>
date Sun, 07 Oct 2007 10:28:32 +0000
parents 682543aced31
children efa448405f3d
comparison
equal deleted inserted replaced
20811:368d79355aba 20812:88aa557b997f
121 ret = do_send(irc, irc->outbuf->outptr, writelen); 121 ret = do_send(irc, irc->outbuf->outptr, writelen);
122 122
123 if (ret < 0 && errno == EAGAIN) 123 if (ret < 0 && errno == EAGAIN)
124 return; 124 return;
125 else if (ret <= 0) { 125 else if (ret <= 0) {
126 purple_connection_error(purple_account_get_connection(irc->account), 126 PurpleConnection *gc = purple_account_get_connection(irc->account);
127 _("Server has disconnected")); 127 purple_connection_error_reason (gc, PURPLE_REASON_NETWORK_ERROR,
128 _("Server has disconnected"));
128 return; 129 return;
129 } 130 }
130 131
131 purple_circ_buffer_mark_read(irc->outbuf, ret); 132 purple_circ_buffer_mark_read(irc->outbuf, ret);
132 133
159 } 160 }
160 161
161 /* purple_debug(PURPLE_DEBUG_MISC, "irc", "sent%s: %s", 162 /* purple_debug(PURPLE_DEBUG_MISC, "irc", "sent%s: %s",
162 irc->gsc ? " (ssl)" : "", tosend); */ 163 irc->gsc ? " (ssl)" : "", tosend); */
163 if (ret <= 0 && errno != EAGAIN) { 164 if (ret <= 0 && errno != EAGAIN) {
164 purple_connection_error(purple_account_get_connection(irc->account), 165 PurpleConnection *gc = purple_account_get_connection(irc->account);
165 _("Server has disconnected")); 166 purple_connection_error_reason (gc, PURPLE_REASON_NETWORK_ERROR,
167 _("Server has disconnected"));
166 } else if (ret < buflen) { 168 } else if (ret < buflen) {
167 if (ret < 0) 169 if (ret < 0)
168 ret = 0; 170 ret = 0;
169 if (!irc->writeh) 171 if (!irc->writeh)
170 irc->writeh = purple_input_add( 172 irc->writeh = purple_input_add(
293 295
294 gc = purple_account_get_connection(account); 296 gc = purple_account_get_connection(account);
295 gc->flags |= PURPLE_CONNECTION_NO_NEWLINES; 297 gc->flags |= PURPLE_CONNECTION_NO_NEWLINES;
296 298
297 if (strpbrk(username, " \t\v\r\n") != NULL) { 299 if (strpbrk(username, " \t\v\r\n") != NULL) {
298 purple_connection_error(gc, _("IRC nicks may not contain whitespace")); 300 gc->wants_to_die = TRUE;
301 purple_connection_error_reason (gc, PURPLE_REASON_INVALID_SETTINGS,
302 _("IRC nicks may not contain whitespace"));
299 return; 303 return;
300 } 304 }
301 305
302 gc->proto_data = irc = g_new0(struct irc_conn, 1); 306 gc->proto_data = irc = g_new0(struct irc_conn, 1);
303 irc->fd = -1; 307 irc->fd = -1;
322 if (purple_ssl_is_supported()) { 326 if (purple_ssl_is_supported()) {
323 irc->gsc = purple_ssl_connect(account, irc->server, 327 irc->gsc = purple_ssl_connect(account, irc->server,
324 purple_account_get_int(account, "port", IRC_DEFAULT_SSL_PORT), 328 purple_account_get_int(account, "port", IRC_DEFAULT_SSL_PORT),
325 irc_login_cb_ssl, irc_ssl_connect_failure, gc); 329 irc_login_cb_ssl, irc_ssl_connect_failure, gc);
326 } else { 330 } else {
327 purple_connection_error(gc, _("SSL support unavailable")); 331 gc->wants_to_die = TRUE;
332 purple_connection_error_reason (gc, PURPLE_REASON_NO_SSL_SUPPORT,
333 _("SSL support unavailable"));
328 return; 334 return;
329 } 335 }
330 } 336 }
331 337
332 if (!irc->gsc) { 338 if (!irc->gsc) {
333 339
334 if (purple_proxy_connect(gc, account, irc->server, 340 if (purple_proxy_connect(gc, account, irc->server,
335 purple_account_get_int(account, "port", IRC_DEFAULT_PORT), 341 purple_account_get_int(account, "port", IRC_DEFAULT_PORT),
336 irc_login_cb, gc) == NULL) 342 irc_login_cb, gc) == NULL)
337 { 343 {
338 purple_connection_error(gc, _("Couldn't create socket")); 344 purple_connection_error_reason (gc, PURPLE_REASON_NETWORK_ERROR,
345 _("Couldn't create socket"));
339 return; 346 return;
340 } 347 }
341 } 348 }
342 } 349 }
343 350
350 int ret; 357 int ret;
351 358
352 if (pass && *pass) { 359 if (pass && *pass) {
353 buf = irc_format(irc, "vv", "PASS", pass); 360 buf = irc_format(irc, "vv", "PASS", pass);
354 if (irc_send(irc, buf) < 0) { 361 if (irc_send(irc, buf) < 0) {
355 /* purple_connection_error(gc, "Error sending password"); */
356 g_free(buf); 362 g_free(buf);
357 return FALSE; 363 return FALSE;
358 } 364 }
359 g_free(buf); 365 g_free(buf);
360 } 366 }
382 388
383 buf = irc_format(irc, "vvvv:", "USER", tmp ? tmp : username, hostname, irc->server, 389 buf = irc_format(irc, "vvvv:", "USER", tmp ? tmp : username, hostname, irc->server,
384 strlen(realname) ? realname : IRC_DEFAULT_ALIAS); 390 strlen(realname) ? realname : IRC_DEFAULT_ALIAS);
385 g_free(tmp); 391 g_free(tmp);
386 if (irc_send(irc, buf) < 0) { 392 if (irc_send(irc, buf) < 0) {
387 /* purple_connection_error(gc, "Error registering with server");*/
388 g_free(buf); 393 g_free(buf);
389 return FALSE; 394 return FALSE;
390 } 395 }
391 g_free(buf); 396 g_free(buf);
392 buf = irc_format(irc, "vn", "NICK", purple_connection_get_display_name(gc)); 397 buf = irc_format(irc, "vn", "NICK", purple_connection_get_display_name(gc));
393 if (irc_send(irc, buf) < 0) { 398 if (irc_send(irc, buf) < 0) {
394 /* purple_connection_error(gc, "Error sending nickname");*/
395 g_free(buf); 399 g_free(buf);
396 return FALSE; 400 return FALSE;
397 } 401 }
398 g_free(buf); 402 g_free(buf);
399 403
416 { 420 {
417 PurpleConnection *gc = data; 421 PurpleConnection *gc = data;
418 struct irc_conn *irc = gc->proto_data; 422 struct irc_conn *irc = gc->proto_data;
419 423
420 if (source < 0) { 424 if (source < 0) {
421 purple_connection_error(gc, _("Couldn't connect to host")); 425 purple_connection_error_reason (gc, PURPLE_REASON_NETWORK_ERROR,
426 _("Couldn't connect to host"));
422 return; 427 return;
423 } 428 }
424 429
425 irc->fd = source; 430 irc->fd = source;
426 431
436 PurpleConnection *gc = data; 441 PurpleConnection *gc = data;
437 struct irc_conn *irc = gc->proto_data; 442 struct irc_conn *irc = gc->proto_data;
438 443
439 irc->gsc = NULL; 444 irc->gsc = NULL;
440 445
441 purple_connection_error(gc, purple_ssl_strerror(error)); 446 purple_connection_ssl_error (gc, error);
442 } 447 }
443 448
444 static void irc_close(PurpleConnection *gc) 449 static void irc_close(PurpleConnection *gc)
445 { 450 {
446 struct irc_conn *irc = gc->proto_data; 451 struct irc_conn *irc = gc->proto_data;
604 609
605 if (len < 0 && errno == EAGAIN) { 610 if (len < 0 && errno == EAGAIN) {
606 /* Try again later */ 611 /* Try again later */
607 return; 612 return;
608 } else if (len < 0) { 613 } else if (len < 0) {
609 purple_connection_error(gc, _("Read error")); 614 purple_connection_error_reason (gc, PURPLE_REASON_NETWORK_ERROR,
615 _("Read error"));
610 return; 616 return;
611 } else if (len == 0) { 617 } else if (len == 0) {
612 purple_connection_error(gc, _("Server has disconnected")); 618 purple_connection_error_reason (gc, PURPLE_REASON_NETWORK_ERROR,
619 _("Server has disconnected"));
613 return; 620 return;
614 } 621 }
615 622
616 read_input(irc, len); 623 read_input(irc, len);
617 } 624 }
629 636
630 len = read(irc->fd, irc->inbuf + irc->inbufused, IRC_INITIAL_BUFSIZE - 1); 637 len = read(irc->fd, irc->inbuf + irc->inbufused, IRC_INITIAL_BUFSIZE - 1);
631 if (len < 0 && errno == EAGAIN) { 638 if (len < 0 && errno == EAGAIN) {
632 return; 639 return;
633 } else if (len < 0) { 640 } else if (len < 0) {
634 purple_connection_error(gc, _("Read error")); 641 purple_connection_error_reason (gc, PURPLE_REASON_NETWORK_ERROR,
642 _("Read error"));
635 return; 643 return;
636 } else if (len == 0) { 644 } else if (len == 0) {
637 purple_connection_error(gc, _("Server has disconnected")); 645 purple_connection_error_reason (gc, PURPLE_REASON_NETWORK_ERROR,
646 _("Server has disconnected"));
638 return; 647 return;
639 } 648 }
640 649
641 read_input(irc, len); 650 read_input(irc, len);
642 } 651 }