📄 natural-selection-0.3.diff
字号:
+ for (text = ba->data, end = text + ba->len; text < end; text++)+ if (!isspace ((unsigned char)*text))+ break;++ if (text >= end)+ g_byte_array_free (ba, TRUE);+ return NULL;+ */+ return ba;+}++static gboolean+my_add_part (CamelMimeMessage *msg, CamelMimePart *part, void *data)+{+ CamelContentType *cct;+ CamelDataWrapper *cdw;+ GByteArray *ba;+ int len;++ cct = camel_mime_part_get_content_type (part);+ if (header_content_type_is (cct, "text", "plain")) {+ cdw = camel_medium_get_content_object (CAMEL_MEDIUM (part));+ ba = my_get_data_wrapper_text (cdw);+ if (ba) {+ if (ba->len > 10000)+ len = 10000;+ else+ len = ba->len;+ protocol_c_part (pdata, "text", "UTF-8",+ (char *)ba->data, len);+ }+ g_byte_array_free (ba, FALSE);+ }++ return TRUE;+}++static int+my_open_message (CamelMimeMessage *msg)+{+ const char *text;+ int len;+ const CamelInternetAddress *iaddr;++ protocol_c_open (pdata);++ camel_mime_message_foreach_part (msg, my_add_part, pdata);++ text = camel_mime_message_get_subject (msg);+ len = strlen (text);+ if (len)+ protocol_c_part (pdata, "subject", "UTF-8", text, len);++ iaddr = camel_mime_message_get_from (msg);+ if (camel_internet_address_get (iaddr, 0, &text, NULL)) {+ len = strlen (text);+ if (len)+ protocol_c_part (pdata, "from", "UTF-8", text, len);+ }++ return 0;+}++int+select_initialize (void)+{+ pdata = protocol_c_new (15000, NULL);+ if (!pdata)+ return -1;++ htab = g_hash_table_new (g_direct_hash, g_direct_equal);+ folders = g_ptr_array_new ();++ return 0;+}++void+select_classify (CamelMimeMessage *message, SelectBar *sb)+{+ int *il;++ if (!pdata)+ return;++ if (!my_open_message (message)) {+ il = protocol_c_classify_rank (pdata, "0");+ protocol_c_close (pdata);+ } else+ il = NULL;++ if (il) {+ int i;++ if (il[0] == -1)+ i = 0;+ else if (il[1] == -1)+ i = 1;+ else if (il[2] == -1)+ i = 2;+ else+ i = 3;++ if (i > 0 && folders->len > 0)+ select_bar_set_button (sb, 0,+ g_ptr_array_index (folders,+ il[0]));+ else+ select_bar_set_button (sb, 0, NULL);+ if (i > 1 && folders->len > 1)+ select_bar_set_button (sb, 1,+ g_ptr_array_index (folders,+ il[1]));+ else+ select_bar_set_button (sb, 1, NULL);+ if (i > 2 && folders->len > 2)+ select_bar_set_button (sb, 2,+ g_ptr_array_index (folders,+ il[2]));+ else+ select_bar_set_button (sb, 2, NULL);++ free (il);+ } else {+ select_bar_set_button (sb, 0, NULL);+ select_bar_set_button (sb, 1, NULL);+ select_bar_set_button (sb, 2, NULL);+ }++ select_bar_update (sb);+}++void+select_learn (CamelMimeMessage *message, CamelFolder *folder)+{+ int box, *boxp;++ if (!pdata) { /* FIXME should initialize earlier */+ CamelStore *cs;+ int i;++ if (select_initialize ())+ return;++ protocol_c_open (pdata);+ i = protocol_c_get_integer (pdata, "nof");+ protocol_c_close (pdata);+ if (i < 1) {+ cs = camel_folder_get_parent_store (folder);+ select_learn_store (cs);+ camel_object_unref (CAMEL_OBJECT (cs));+ }+ return;+ }++ boxp = (int *)g_hash_table_lookup (htab, folder);+ if (!boxp) {+ boxp = (int *)g_malloc (sizeof(int));+ *boxp = folders->len;+ camel_object_ref (CAMEL_OBJECT (folder));+ g_hash_table_insert (htab, folder, boxp);+ g_ptr_array_add (folders, folder);+ }+ box = *boxp;++ if (my_open_message (message))+ return;++ if (protocol_c_learn (pdata, box))+ return;++ protocol_c_close (pdata);+}++static void+my_learn_folder (CamelFolder *folder)+{+ GPtrArray *gpa;+ int i;+ const char *sname;++ /* FIXME not nice */+ sname = camel_folder_get_name (folder);+ if (!strcmp (sname, "Inbox") || !strcmp (sname, "Outbox") ||+ !strcmp (sname, "Drafts"))+ return;++ gpa = camel_folder_get_uids (folder);+ for (i = 0; i < gpa->len && i < 50; i++) {+ CamelMimeMessage *message;++ message = camel_folder_get_message (folder,+ g_ptr_array_index (gpa, i),+ NULL);+ select_learn (message, folder);+ camel_object_unref (CAMEL_OBJECT (message));+ }+ g_ptr_array_free (gpa, FALSE);+}++void+select_learn_store (CamelStore *store)+{+ GPtrArray *gpa;+ int i;++ //CAMEL_STORE_LOCK (store, cache_lock);++ //void *camel_object_bag_get(CamelObjectBag *bag, const char *key);+ gpa = camel_object_bag_list(store->folders);+ for (i = 0; i < gpa->len; i++)+ my_learn_folder (g_ptr_array_index (gpa, i));+ g_ptr_array_free (gpa, FALSE);++ //CAMEL_STORE_UNLOCK (store, cache_lock);+}--- mail/select.h.orig 1970-01-01 01:00:00.000000000 +0100+++ mail/select.h 2003-02-13 17:32:12.000000000 +0100@@ -0,0 +1,20 @@+#ifndef SELECT_H+#define SELECT_H++#include "camel/camel-folder.h"+#include "camel/camel-mime-message.h"+#include "select-bar.h"++int+select_initialize (void);++void+select_learn (CamelMimeMessage *message, CamelFolder *folder);++void+select_classify (CamelMimeMessage *message, SelectBar *sb);++void+select_learn_store (CamelStore *store);++#endif--- mail/select-bar.c.orig 1970-01-01 01:00:00.000000000 +0100+++ mail/select-bar.c 2003-02-13 17:32:12.000000000 +0100@@ -0,0 +1,158 @@+/*+ * Copyright 2000,2001 Ximian, Inc. (www.ximian.com)+ *+ * This program is free software; you can redistribute it and/or+ * modify it under the terms of version 2 of the GNU General Public+ * License as published by the Free Software Foundation.+ *+ * This program is distributed in the hope that it will be useful,+ * but WITHOUT ANY WARRANTY; without even the implied warranty of+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the+ * GNU General Public License for more details.+ *+ * You should have received a copy of the GNU General Public License+ * along with this program; if not, write to the Free Software+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307+ * USA+ */++/**+ * @file+ * Classification select bar.+ *+ * @author Mikael Ylikoski+ * @date 2002+ */++#include <gtk/gtk.h>+#include <gal/util/e-util.h>+#include <string.h>+#include "camel/camel-folder.h"+#include "camel/camel-store.h" /* FIXME Should be included in mail-ops.h */+#include "mail-types.h"+#include "mail-ops.h"+#include "folder-browser.h"+#include "select-bar.h"++#define PARENT_TYPE (gtk_hbox_get_type ())++static GtkObjectClass *select_bar_parent_class;+++static void+select_bar_init (GtkObject *object)+{+ int i;+ SelectBar *select_bar = SELECT_BAR (object);++ for (i = 0; i < 3; i++) {+ select_bar->buttons[i] = NULL;+ select_bar->folders[i] = NULL;+ }+}++static void+select_bar_destroy (GtkObject *object)+{+ int i;+ SelectBar *sb = SELECT_BAR (object);++ for (i = 0; i < 3; i++) {+ if (sb->buttons[i])+ gtk_widget_destroy (sb->buttons[i]);+ if (sb->folders[i])+ camel_object_unref (CAMEL_OBJECT (sb->folders[i]));;+ }+ gtk_widget_destroy (sb->label);+ g_object_unref (GTK_OBJECT (sb->fb));+ select_bar_parent_class->destroy (object);+}++static void+select_bar_class_init (GtkObjectClass *object_class)+{+ object_class->destroy = select_bar_destroy;+ select_bar_parent_class = gtk_type_class (PARENT_TYPE);+}++GtkWidget *+select_bar_new (FolderBrowser *fb)+{+ SelectBar *select_bar;++ select_bar = g_object_new (select_bar_get_type (), NULL);+ g_object_ref (GTK_OBJECT (fb));+ select_bar->fb = fb;+ gtk_box_set_homogeneous (GTK_BOX (select_bar), FALSE);+ select_bar->label = gtk_label_new (_("Move to Folder"));+ gtk_widget_show (select_bar->label);+ gtk_box_pack_start (GTK_BOX (select_bar), select_bar->label,+ FALSE, FALSE, 5);++ return GTK_WIDGET (select_bar);+}++void+select_bar_set_button (SelectBar *sb, int button, CamelFolder *folder)+{+ if (sb->folders[button])+ camel_object_unref (CAMEL_OBJECT (sb->folders[button]));+ camel_object_ref (CAMEL_OBJECT (folder));+ sb->folders[button] = folder;+}++static void+select_cb (GtkWidget *widget, SelectBar *sb)+{+ int i;+ char* uri;+ GPtrArray *uids;++ for (i = 0; i < 3; i++)+ if (widget == sb->buttons[i])+ break;+ if (i == 3)+ return;++ uri = malloc ((strlen (sb->folders[i]->full_name) + 9) * sizeof(char));+ strcpy (uri, "file:///");+ strcat (uri, sb->folders[i]->full_name);++ uids = g_ptr_array_new ();+ g_ptr_array_add (uids, sb->fb->loaded_uid);+ mail_transfer_messages (sb->fb->folder, uids, TRUE, uri, 0,+ NULL, NULL);+ //g_ptr_array_free (uids, FALSE);+ free (uri);+}++int+select_bar_update (SelectBar *sb)+{+ const char *label;+ int i;++ for (i = 0; i < 3; i++) {+ if (sb->buttons[i])+ gtk_widget_destroy (sb->buttons[i]);+ if (!sb->folders[i])+ continue;+ label = camel_folder_get_name (sb->folders[i]);+ /* FIXME shorten label if too long */+ sb->buttons[i] = gtk_button_new_with_label (label);+ gtk_widget_show (sb->buttons[i]);+ gtk_box_pack_start (GTK_BOX (sb), sb->buttons[i],+ FALSE, FALSE, 5);+ g_signal_connect (GTK_OBJECT (sb->buttons[i]), "clicked",+ GTK_SIGNAL_FUNC (select_cb), sb);+ }+ if (!sb->folders[0])+ gtk_widget_hide (GTK_WIDGET (sb));+ else+ gtk_widget_show (GTK_WIDGET (sb));++ return 0;+}++E_MAKE_TYPE (select_bar, "SelectBar", SelectBar, select_bar_class_init,+ select_bar_init, PARENT_TYPE);--- mail/select-bar.h.orig 1970-01-01 01:00:00.000000000 +0100+++ mail/select-bar.h 2003-02-13 17:32:12.000000000 +0100@@ -0,0 +1,39 @@+#ifndef SELECT_BAR_H+#define SELECT_BAR_H++#include <gtk/gtkbutton.h>+#include <gtk/gtkhbox.h>+#include <gtk/gtklabel.h>++#include "camel/camel-folder.h"+#include "mail-types.h"++#define SELECT_BAR_TYPE (select_bar_get_type ())+#define SELECT_BAR(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), SELECT_BAR_TYPE, SelectBar))+#define SELECT_BAR_CLASS(k) (G_TYPE_CHECK_CLASS_CAST((k), SELECT_BAR_TYPE, SelectBarClass))+#define IS_SELECT_BAR(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), SELECT_BAR_TYPE))+#define IS_SELECT_BAR_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), SELECT_BAR_TYPE))++struct _SelectBar {+ GtkHBox parent;+ GtkWidget *label;+ GtkWidget *buttons[3];+ CamelFolder *folders[3];+ FolderBrowser *fb;+};++typedef struct {+ GtkHBoxClass parent_class;+} SelectBarClass;++GtkType select_bar_get_type (void);++GtkWidget *select_bar_new (FolderBrowser *fb);++void select_bar_set_button (SelectBar *sb,+ int button,+ CamelFolder *folder);++int select_bar_update (SelectBar *sb);++#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -