Revision 292

src/imap.c (revision 292)
84 84
static void	 imap_folder_destroy	(Folder		*folder);
85 85

  
86 86
static Session *imap_session_new	(PrefsAccount	*account);
87
static gint imap_session_connect	(IMAPSession	*session);
88
static gint imap_session_reconnect	(IMAPSession	*session);
87 89
static void imap_session_destroy	(Session	*session);
88 90
/* static void imap_session_destroy_all	(void); */
89 91

  
......
455 457
		log_warning(_("IMAP4 connection to %s has been"
456 458
			      " disconnected. Reconnecting...\n"),
457 459
			    folder->account->recv_server);
458
		session_destroy(rfolder->session);
459
		rfolder->session = imap_session_new(folder->account);
460
		if (rfolder->session)
460
		if (imap_session_reconnect(IMAP_SESSION(rfolder->session))
461
		    == IMAP_SUCCESS)
461 462
			imap_parse_namespace(IMAP_SESSION(rfolder->session),
462 463
					     IMAP_FOLDER(folder));
464
		else {
465
			session_destroy(rfolder->session);
466
			rfolder->session = NULL;
467
		}
463 468
	}
464 469

  
465 470
	return IMAP_SESSION(rfolder->session);
......
526 531
static Session *imap_session_new(PrefsAccount *account)
527 532
{
528 533
	IMAPSession *session;
529
	SockInfo *sock;
530
	gchar *pass;
531 534
	gushort port;
532 535

  
533 536
	g_return_val_if_fail(account != NULL, NULL);
534 537
	g_return_val_if_fail(account->recv_server != NULL, NULL);
535 538
	g_return_val_if_fail(account->userid != NULL, NULL);
536 539

  
537
	pass = account->passwd;
538
	if (!pass) {
539
		gchar *tmp_pass;
540
		tmp_pass = input_dialog_query_password(account->recv_server,
541
						       account->userid);
542
		if (!tmp_pass)
543
			return NULL;
544
		Xstrdup_a(pass, tmp_pass, {g_free(tmp_pass); return NULL;});
545
		g_free(tmp_pass);
546
	}
547

  
548 540
#if USE_SSL
549 541
	port = account->set_imapport ? account->imapport
550 542
		: account->ssl_imap == SSL_TUNNEL ? IMAPS_PORT : IMAP4_PORT;
......
552 544
	port = account->set_imapport ? account->imapport : IMAP4_PORT;
553 545
#endif
554 546

  
555
	log_message(_("creating IMAP4 connection to %s:%d ...\n"),
556
		    account->recv_server, port);
557

  
558
#if USE_SSL
559
	if ((sock = imap_open(account->recv_server, port,
560
				   account->ssl_imap)) == NULL)
561
#else
562
	if ((sock = imap_open(account->recv_server, port)) == NULL)
563
#endif
564
		return NULL;
565

  
566 547
	session = g_new0(IMAPSession, 1);
567 548

  
568 549
	session_init(SESSION(session));
569 550

  
570 551
	SESSION(session)->type             = SESSION_IMAP;
552
	SESSION(session)->sock             = NULL;
571 553
	SESSION(session)->server           = g_strdup(account->recv_server);
572
	SESSION(session)->sock             = sock;
554
	SESSION(session)->port             = port;
555
#if USE_SSL
556
	SESSION(session)->ssl_type         = account->ssl_imap;
557
#endif
573 558
	SESSION(session)->last_access_time = time(NULL);
574
	SESSION(session)->data             = NULL;
559
	SESSION(session)->data             = account;
575 560

  
576 561
	SESSION(session)->destroy          = imap_session_destroy;
577 562

  
......
581 566

  
582 567
	session_list = g_list_append(session_list, session);
583 568

  
584
	if (imap_greeting(session) != IMAP_SUCCESS) {
569
	if (imap_session_connect(session) != IMAP_SUCCESS) {
585 570
		session_destroy(SESSION(session));
586 571
		return NULL;
587 572
	}
588 573

  
589
	if (imap_cmd_capability(session) != IMAP_SUCCESS) {
590
		session_destroy(SESSION(session));
591
		return NULL;
574
	return SESSION(session);
575
}
576

  
577
static gint imap_session_connect(IMAPSession *session)
578
{
579
	SockInfo *sock;
580
	PrefsAccount *account;
581
	gchar *pass;
582

  
583
	g_return_val_if_fail(session != NULL, IMAP_ERROR);
584

  
585
	account = (PrefsAccount *)(SESSION(session)->data);
586

  
587
	log_message(_("creating IMAP4 connection to %s:%d ...\n"),
588
		    SESSION(session)->server, SESSION(session)->port);
589

  
590
	pass = account->passwd;
591
	if (!pass) {
592
		gchar *tmp_pass;
593
		tmp_pass = input_dialog_query_password(account->recv_server,
594
						       account->userid);
595
		if (!tmp_pass)
596
			return IMAP_ERROR;
597
		Xstrdup_a(pass, tmp_pass,
598
			  {g_free(tmp_pass); return IMAP_ERROR;});
599
		g_free(tmp_pass);
592 600
	}
601

  
602
#if USE_SSL
603
	if ((sock = imap_open(SESSION(session)->server, SESSION(session)->port,
604
			      SESSION(session)->ssl_type)) == NULL)
605
#else
606
	if ((sock = imap_open(SESSION(session)->server, SESSION(session)->port))
607
	    == NULL)
608
#endif
609
		return IMAP_ERROR;
610

  
611
	SESSION(session)->sock = sock;
612

  
613
	if (imap_greeting(session) != IMAP_SUCCESS)
614
		return IMAP_ERROR;
615
	if (imap_cmd_capability(session) != IMAP_SUCCESS)
616
		return IMAP_ERROR;
617

  
593 618
	if (imap_has_capability(session, "UIDPLUS"))
594 619
		session->uidplus = TRUE;
595 620

  
......
601 626
		ok = imap_cmd_starttls(session);
602 627
		if (ok != IMAP_SUCCESS) {
603 628
			log_warning(_("Can't start TLS session.\n"));
604
			session_destroy(SESSION(session));
605
			return NULL;
629
			return IMAP_ERROR;
606 630
		}
607
		if (!ssl_init_socket_with_method(sock, SSL_METHOD_TLSv1)) {
608
			session_destroy(SESSION(session));
609
			return NULL;
610
		}
631
		if (!ssl_init_socket_with_method(sock, SSL_METHOD_TLSv1))
632
			return IMAP_SOCKET;
611 633
	}
612 634
#endif
613 635

  
......
615 637
	    imap_auth(session, account->userid, pass, account->imap_auth_type)
616 638
	    != IMAP_SUCCESS) {
617 639
		imap_cmd_logout(session);
618
		session_destroy(SESSION(session));
619
		return NULL;
640
		return IMAP_AUTHFAIL;
620 641
	}
621 642

  
622
	return SESSION(session);
643
	return IMAP_SUCCESS;
623 644
}
624 645

  
646
static gint imap_session_reconnect(IMAPSession *session)
647
{
648
	g_return_val_if_fail(session != NULL, IMAP_ERROR);
649

  
650
	session_disconnect(SESSION(session));
651

  
652
	imap_capability_free(session);
653
	session->uidplus = FALSE;
654
	g_free(session->mbox);
655
	session->mbox = NULL;
656
	session->authenticated = FALSE;
657
	SESSION(session)->state = SESSION_READY;
658

  
659
	return imap_session_connect(session);
660
}
661

  
625 662
static void imap_session_destroy(Session *session)
626 663
{
627 664
	imap_capability_free(IMAP_SESSION(session));
......
3259 3296
	GArray *array;
3260 3297
	gchar *str;
3261 3298
	gchar *p, *ep;
3299
	gint i;
3262 3300
	guint32 uid;
3263 3301

  
3264 3302
	g_return_val_if_fail(criteria != NULL, IMAP_ERROR);
......
3269 3307
	imap_cmd_gen_send(session, "UID SEARCH %s", criteria);
3270 3308
	if ((ok = imap_cmd_ok(session, argbuf)) != IMAP_SUCCESS) THROW(ok);
3271 3309

  
3272
	str = search_array_str(argbuf, "SEARCH");
3273
	if (!str) THROW(IMAP_ERROR);
3274

  
3275 3310
	array = g_array_new(FALSE, FALSE, sizeof(guint32));
3276 3311

  
3277
	p = str + strlen("SEARCH");
3312
	for (i = 0; i < argbuf->len; i++) {
3313
		str = g_ptr_array_index(argbuf, i);
3314
		if (strncmp(str, "SEARCH", 6) != 0)
3315
			continue;
3278 3316

  
3279
	while (*p != '\0') {
3280
		uid = strtoul(p, &ep, 10);
3281
		if (p < ep && uid > 0) {
3282
			g_array_append_val(array, uid);
3283
			p = ep;
3284
		} else
3285
			break;
3317
		p = str + 6;
3318
		while (*p != '\0') {
3319
			uid = strtoul(p, &ep, 10);
3320
			if (p < ep && uid > 0) {
3321
				g_array_append_val(array, uid);
3322
				p = ep;
3323
			} else
3324
				break;
3325
		}
3286 3326
	}
3287 3327

  
3288 3328
	*result = array;
src/procmsg.h (revision 292)
128 128
#define MSG_IS_ENCRYPTED(msg)		(((msg).tmp_flags & MSG_ENCRYPTED) != 0)
129 129
#define MSG_IS_IMAP(msg)		(((msg).tmp_flags & MSG_IMAP) != 0)
130 130
#define MSG_IS_NEWS(msg)		(((msg).tmp_flags & MSG_NEWS) != 0)
131
#define MSG_IS_SIGNED(msg)		(((msg).tmp_flags & MSG_SIGNED) != 0)
131 132
#define MSG_IS_MIME(msg)		(((msg).tmp_flags & MSG_MIME) != 0)
132 133
#define MSG_IS_INVALID(msg)		(((msg).tmp_flags & MSG_INVALID) != 0)
133 134
#define MSG_IS_RECEIVED(msg)		(((msg).tmp_flags & MSG_RECEIVED) != 0)
ChangeLog.ja (revision 292)
1
2005-05-27
2

  
3
	* src/imap.c: ????³???˰????? Session ???Ö¥??????Ȥ??˲õ¤·¤Ê¤??褦??
4
	  ????(?ĥ꡼?Υ??????????˺???³??ȯ???????Ȥ??˥????å??夹???Τ?
5
	  ????)??
6
	  imap_cmd_search(): ?ǽ??α??ú¤·¤«Ç§???????Ƥ??ʤ??ä??Ð¥???????
7
	  (Hanno Meyer-Thurow ???? thanks)??
8
	* src/procmsg.h: MSG_IS_SIGNED() ?ޥ??????ɲá?
9

  
1 10
2005-05-26
2 11

  
3 12
	* src/main.c: app_will_exit(): ??λ???? tmp ?ǥ??쥯?ȥ????õ
ChangeLog (revision 292)
1
2005-05-27
2

  
3
	* src/imap.c: don't destroy the previous Session object when
4
	  reconnecting (fixed crash when reconnection happened while scanning
5
	  tree).
6
	  imap_cmd_search(): fixed a bug that only the first response was
7
	  recognized (thanks to Hanno Meyer-Thurow).
8
	* src/procmsg.h: added MSG_IS_SIGNED() macro.
9

  
1 10
2005-05-26
2 11

  
3 12
	* src/main.c: app_will_exit(): cleanup tmp directory when exit.

Also available in: Unified diff