⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main-window-callbacks.c

📁 一个功能全面的电子邮件客户端
💻 C
📖 第 1 页 / 共 5 页
字号:
		GTK_CLIST (clist)->sort_type=GTK_SORT_DESCENDING;	} else {		GTK_CLIST (clist)->sort_type=GTK_SORT_ASCENDING;	}	gtk_clist_freeze (GTK_CLIST(clist));	gtk_clist_set_sort_column (GTK_CLIST(clist), column);#if 1	if((column==4)||(column==5))		gtk_clist_set_compare_func (GTK_CLIST (clist), (GtkCListCompareFunc) new_clist_sort_func);	else		gtk_clist_set_compare_func (GTK_CLIST (clist), (GtkCListCompareFunc) NULL);#endif	gtk_clist_sort (GTK_CLIST (clist));	message_clist_reset_shading (clist);	gtk_clist_thaw (GTK_CLIST (clist));}char *parsedate(char *date) {	char *text[7] = {NULL};	char *timebuf = NULL;	char *buffer = NULL;	int add, month;	char *cs;	add = 0;	text[0] = cut_string(date, ' ', 1, 1);	if (!isdigit(*text[0]))		add = 1;	if (add) {		cs = cut_string(date, ' ', 1, 2);		text[0] = cut_string(cs,' ',2,1);		free (cs);	} else {		text[0] = cut_string(date, ' ', 1, 1);	}	cs = cut_string(date, ' ', 1, 2+add);	text[1] = cut_string(cs,' ',2,1+add); // month	free (cs);	cs = cut_string(date, ' ', 1, 3+add);	text[2] = cut_string(cs,' ',2,2+add); // year	free (cs);	cs = cut_string(date, ' ', 1, 4+add);	timebuf = cut_string(cs,' ',2,3+add); // time	free (cs);	text[3] = cut_string(timebuf, ':', 1, 1); // hour	cs = cut_string(timebuf, ':', 1, 2);	text[4] = cut_string(cs,':',2,1); // minute	free (cs);	text[5] = cut_string(timebuf, ':', 2, 2); // day	text[6] = cut_string(date, ' ', 2, 4+add);	if((strncasecmp(text[1],"Jan",3)==0))		month=10;	else if((strncasecmp(text[1],"Feb",3)==0))		month=11;	else if((strncasecmp(text[1],"Mar",3)==0))		month=12;	else if((strncasecmp(text[1],"Apr",3)==0))		month=13;	else if((strncasecmp(text[1],"May",3)==0))		month=14;	else if((strncasecmp(text[1],"Jun",3)==0))		month=15;	else if((strncasecmp(text[1],"Jul",3)==0))		month=16;	else if((strncasecmp(text[1],"Aug",3)==0))		month=17;	else if((strncasecmp(text[1],"Sep",3)==0))		month=18;	else if((strncasecmp(text[1],"Oct",3)==0))		month=19;	else if((strncasecmp(text[1],"Nov",3)==0))		month=20;	else if((strncasecmp(text[1],"Dec",3)==0))		month=21;	else		month=0;	buffer=(char *)malloc(255*sizeof(char));	snprintf(buffer,255,"%s%d%s%s%s%s",text[2],month,text[0], text[3], text[4], text[5]);	if (text[0]) free (text[0]);	if (text[1]) free (text[1]);	if (text[2]) free (text[2]);	if (text[3]) free (text[3]);	if (text[4]) free (text[4]);	if (text[5]) free (text[5]);	if (text[6]) free (text[6]);	if (timebuf) free (timebuf);	return buffer;}gint new_clist_sort_func (GtkCList *clist, gconstpointer *ptr1, gconstpointer *ptr2) {	GtkCListRow *row1 = (GtkCListRow *) ptr1;	GtkCListRow *row2 = (GtkCListRow *) ptr2;	char *text1 = GTK_CELL_TEXT (row1->cell[clist->sort_column])->text;	char *text2 = GTK_CELL_TEXT (row2->cell[clist->sort_column])->text;	char *one, *two;	int retval;	if (!text2)		return (text1 != NULL);	if (!text1)		return -1;	one = parsedate(text1);	two = parsedate(text2);	if (!two)                return (one != NULL);        if (!one)                return -1;	retval = strcmp(one,two);	if (one) free (one);	if (two) free (two);	return retval;}void message_resend (GtkWidget *widget, gpointer data) {	Message *msg=(Message *)data;	Header_Info *info;	char *body, *header, *recipline;	PopAccount *pop=seek_popaccount (seek_popaccount_by_name (tm_globs->default_account));	int length=0;	if (!msg) { 		insert_error (_("Message was not sent successfully\n"));		return;	}	body=message_load (folder_seek (folder_seek_by_name (msg->rfolder)), msg);	header=message_load_head (folder_seek (folder_seek_by_name (msg->rfolder)), msg);	info=parse_header (header);	free (header);	if (!info->to) {		insert_error (_("Message has no To line and cannot be resent\n"));		return;	}	length+=strlen (info->to);	if (info->cc) length+=strlen (info->cc);	if (info->bcc) length+=strlen (info->bcc);	recipline=(char *)calloc (length+1, 1);	sprintf (recipline, "%s", info->to);	if (info->cc) sprintf (recipline, "%s,%s", recipline, info->cc);	if (info->bcc) sprintf (recipline, "%s,%s", recipline, info->bcc);	new_fork_send_message (pop, NULL, recipline);#if DEBUG	printf( "I'm pretty sure this is currently broken!!!\n" ) ;	printf( "I'm pretty sure this is currently broken!!!\n" ) ;	printf( "I'm pretty sure this is currently broken!!!\n" ) ;	printf( "I'm pretty sure this is currently broken!!!\n" ) ;#endif	tm_globs->send_timeout=gtk_timeout_add  (750, (GtkFunction)send_message_timeout, NULL);	free (body);	destroy_hinfo (info);}void clicked_on_attachment (GtkWidget *widget, gint row, gint column, GdkEventButton *event, gpointer data) {	GtkCList *clist=GTK_CLIST (widget);	Message *message=tm_globs->msg_selected;	if (message) {	char *tmpat, *msg, *retmsg;	Attachment *att=gtk_clist_get_row_data (clist, row);	Attachment *att2;	if (!event) 		return;	if ((event->type==5) && (event->button==1)) {		if (!data) {			msg=message_load (folder_seek (folder_seek_by_name (message->rfolder)), message);		} else {			msg=strdup((char *)data);		}		tmpat=mime_get_attachment (msg, att);		att2=(Attachment *)calloc (1, sizeof (Attachment));		att2->name=strdup ("dummyatt");		retmsg=mime_process (tmpat, att2, 1);		free (tmpat);/*		att3=att2->next;		free (att2->name);		free (att2);*/		if ( (retmsg) && (retmsg[0]!='\0') ) {			create_docsource_stream (strdup(retmsg));			free (retmsg);			retmsg=NULL;		}		attachments_destroy (att2);		if (msg) free (msg);		if (retmsg) free (retmsg);	}	}}void clicked_on_attachment_event (GtkWidget *widget, GdkEventButton *event,                                   gpointer data) {	GtkWidget *popup;	int row, column;	Attachment *att;	gtk_clist_get_selection_info (GTK_CLIST (widget), event->x, event->y, &row, &column);	att=gtk_clist_get_row_data (GTK_CLIST (widget), row);	if (row < GTK_CLIST (widget)->rows && row >= 0) {		if (event->button==3) {			gtk_clist_select_row (GTK_CLIST (widget), row, 0);			popup=mime_popup_new (att);			gtk_menu_popup (GTK_MENU (popup), NULL, NULL, NULL, NULL, 3, 0);		}	}}void attachment_save (GtkWidget *widget, gpointer data) {		Message *msg=tm_globs->msg_selected;	if(msg) {	Attachment *att=(Attachment *)data;	char *message;	char *matt;	message=message_load (folder_seek(folder_seek_by_name(msg->rfolder)), msg);	matt=mime_get_attachment (message, att);	if (message) free (message);	message_save_body (NULL, (gpointer *)matt);//	if (matt) free (matt);	}}void attachment_view (GtkWidget *widget, gpointer data) {	Message *msg=tm_globs->msg_selected;	if (msg) {	Attachment *att=(Attachment *)data;	Attachment *att2=(Attachment *)calloc (1, sizeof(Attachment));	char *message=message_load (folder_seek(folder_seek_by_name(msg->rfolder)), msg);	char *matt=mime_get_attachment (message, att);	int hsize=message_hsize (matt);	char *head=(char *)calloc(hsize+2, sizeof(char));	char *retmsg;	char *tmpmsg;	Header_Info *hinfo;	memmove (head, matt, hsize);	hinfo=parse_header (head);	free (head);	if (message) free (message);	if (hinfo) {		if (strncasecmp (hinfo->content_type, "message/rfc822", 14)==0) {			tmpmsg=strdup(matt+hsize);			message_window_new_stream (tmpmsg);		} else if (strncasecmp (hinfo->content_type, "multipart/digest", 16)==0) {			digest_window_create_stream (strdup(matt));		} else if (mime_handle (hinfo->content_type)==MIMEHANDLE_EXT) {			message_use_ext_prog (NULL, strdup (matt));		} else {			retmsg=mime_process (matt, att2, 1);			if (retmsg[0]!='\0')				create_docsource_stream (retmsg);		}	}	if (matt) free (matt);	free (att2);	destroy_hinfo (hinfo);	}}void attachment_view_source (GtkWidget *widget, gpointer data) {	Message *msg=tm_globs->msg_selected;	if(msg) {	Attachment *att=(Attachment *)data;	char *message=message_load (folder_seek(folder_seek_by_name(msg->rfolder)), msg);	char *matt=mime_get_attachment (message, att);	int hsize=message_hsize (matt);	char *head=(char *)calloc(hsize+2, sizeof(char));	Header_Info *hinfo;#if DEBUG > 1	printf ("hsize=%d\n", hsize);#endif	memmove (head, matt, hsize);	hinfo=parse_header (head);	free (head);	if (message) free (message);	if (hinfo) {		create_docsource_stream (strdup(matt));	}	if (matt) free (matt);	destroy_hinfo (hinfo);	}}void attachment_open_with (GtkWidget *widget, gpointer data) {//	Message *msg=tm_globs->msg_selected;//	Attachment *att=(Attachment *)data;#if DEBUG > 1	printf ("Viewing attachment with external progam\n");#endif}void message_print_stream (char *stream) {	int fd;	char *buf = (char *)malloc (2048 * sizeof (char));	char *message;	int flags = tm_globs->flags;	Attachment *att = (Attachment *) calloc (1, sizeof (Attachment));	g_return_if_fail (stream != NULL);	att->mtype = strdup ("dummyatt");	tm_globs->flags &=~SHOW_ALL_HEADER;	tm_globs->flags |=SHOW_SOME_HEADER;	message = mime_process (stream, att, 0);	tm_globs->flags = flags;#if DEBUG > 4	printf ("====== BEGIN printed message =======\n%s\n======= END printed message =======\n", message);#endif	mkdir ("/tmp/tradeclient", S_IREAD | S_IWRITE | S_IEXEC);	fd=open ("/tmp/tradeclient/print-tmp", O_CREAT | O_TRUNC | O_WRONLY, S_IRUSR | S_IWUSR);	if (fd<0) {		perror ("Cannot open /tmp/tradeclient/print-tmp");		return;	}	write (fd, message, strlen (stream));	close (fd);	snprintf(buf, 2048, "%s /tmp/tradeclient/print-tmp", tm_globs->printer);	system (buf);		if (message) free (message);	if (att->mtype) free (att->mtype);	if (att) free (att);	free (buf);	unlink ("/tmp/tradeclient/print-tmp");}void message_print (GtkWidget *widget, gpointer data) {	Message *msg=tm_globs->msg_selected;	Folder *fl;	char *full_message;	if (!msg) 		return;	fl=folder_seek (folder_seek_by_name (msg->rfolder));	full_message=message_load (fl, msg);	insert_message ("Printing Message ... ");	message_print_stream (full_message);	free (full_message);	insert_message ("Done!\n");}#define getnaddr(p,ret,pos,tmps) tmps=strchr(p+pos, ',');\                                 if (tmps) {\                                 	ret=(char *)calloc (tmps-(p+pos)+2, sizeof(char));\                                 	memmove (ret, p+pos, tmps-(p+pos));\                                 	pos+=tmps-(p+pos)+1;\                                 } else {\                                 	ret=(char *)calloc (strlen (p+pos), sizeof(char));\                                 	memmove (ret, p+pos, strlen (p+pos));\                                 	pos+=strlen (p+pos);\                                 }void reply_to_all_stream (char *message) {	int hsize;	Header_Info *hinfo;	char *tmp, *head;	GtkWidget *window;	GtkTree *tree;	GtkWidget *body=NULL;	GtkWidget *subject;	GtkCList *clist2;	char *cl_data[3];	RecipSignalData *recip ;	ADDRESS *adrlist = NIL, *adrseek = NIL;	char adrbuffer[4096];	AFS *afs;	window=make_new_message_window (NULL, NULL);	tree=GTK_TREE (lw (window, "recip_tree"));	gtk_tree_clear_items (tree, 0, g_list_length (tree->children));	body=lookup_widget (window, "body_textbox"); // fixes your problems	hsize=message_hsize (message);	head=(char *)calloc (hsize+2, sizeof(char));	memmove (head, message, hsize);	hinfo=parse_header (head);	free (head);	recip = calloc( 1, sizeof(RecipSignalData) ) ;	if (!(tm_globs->flags & REPLY_NONE)) {		if (tm_globs->flags & REPLY_QUOTED) {			tmp=message_get_reply_quoted_stream (message);			gtk_text_insert (GTK_TEXT (body), NULL, NULL, NULL, tmp, -1);			free (tmp);		} else {			clist2=GTK_CLIST (lw (window, "attachment_clist"));			afs=(AFS *)calloc (1, sizeof (AFS));			afs->data=strdup (message);			afs->type=strdup ("message/rfc822");			cl_data[0]=strdup ("message/rfc822");			cl_data[1]=strdup ("Original Message");			cl_data[2]=(char *)calloc (20, sizeof (char));			snprintf (cl_data[2], 19, "%lu", (unsigned long)strlen (message));

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -