aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--mail/ChangeLog23
-rw-r--r--mail/em-folder-selector.c11
-rw-r--r--mail/em-folder-tree-model.c77
-rw-r--r--mail/em-folder-tree-model.h4
-rw-r--r--mail/em-folder-tree.c141
-rw-r--r--mail/importers/evolution-mbox-importer.c5
-rw-r--r--mail/importers/evolution-outlook-importer.c31
-rw-r--r--mail/mail-component.c18
-rw-r--r--mail/mail-folder-cache.c28
9 files changed, 170 insertions, 168 deletions
diff --git a/mail/ChangeLog b/mail/ChangeLog
index e03c70bb72..96c941fb12 100644
--- a/mail/ChangeLog
+++ b/mail/ChangeLog
@@ -1,3 +1,12 @@
+2004-05-26 Not Zed <NotZed@Ximian.com>
+
+ * importers/evolution-mbox-importer.c (create_control_fn): set the
+ default selection to inbox.
+
+ * importers/evolution-outlook-importer.c (folder_selected)
+ (create_control_fn): copied from mbox importer. fixes a crash &
+ lets you choose the target folder.
+
2004-05-25 Jeffrey Stedfast <fejj@novell.com>
* mail-errors.xml: a few fixes.
@@ -9,6 +18,20 @@
2004-05-25 Not Zed <NotZed@Ximian.com>
+ * mail-component.c (mc_add_local_store_done): removed, now
+ redundant.
+
+ * em-folder-tree.c (em_folder_tree_set_selected): fix for path changes.
+
+ * em-folder-tree-model.c (em_folder_tree_model_set_unread_count):
+ change to use full name rather than path name.
+
+ * em-folder-tree-model.h: renamed path_hash to full_hash.
+
+ * em-folder-tree-model.c (folder_subscribed): dont use
+ g_path_get_dirname here, it is os dependent, we want / always.
+ (full_hash_free): rename from path_hash free.
+
* em-folder-view.c (emfv_popup_menu[]): disable add sender to
addressbook bar if it is also disabled. #58955.
diff --git a/mail/em-folder-selector.c b/mail/em-folder-selector.c
index d317635ee1..4d2c771f86 100644
--- a/mail/em-folder-selector.c
+++ b/mail/em-folder-selector.c
@@ -357,8 +357,15 @@ em_folder_selector_get_selected_uri (EMFolderSelector *emfs)
camel_url_set_fragment (url, newpath);
} else {
- newpath = g_strdup_printf("%s/%s", (url->path == NULL || strcmp(url->path, "/") == 0) ? "":url->path, name);
+ char *path;
+
+ path = g_strdup_printf("%s/%s", (url->path == NULL || strcmp(url->path, "/") == 0) ? "":url->path, name);
camel_url_set_path(url, newpath);
+ if (path[0] == '/') {
+ newpath = g_strdup(path+1);
+ g_free(path);
+ } else
+ newpath = path;
}
g_free (emfs->selected_path);
@@ -406,7 +413,7 @@ em_folder_selector_get_selected_path (EMFolderSelector *emfs)
char *newpath;
name = gtk_entry_get_text (emfs->name_entry);
- if (strcmp (path, "/") != 0)
+ if (strcmp (path, "") != 0)
newpath = g_strdup_printf ("%s/%s", path, name);
else
newpath = g_strdup_printf ("/%s", name);
diff --git a/mail/em-folder-tree-model.c b/mail/em-folder-tree-model.c
index 571ac3042b..fe0f902234 100644
--- a/mail/em-folder-tree-model.c
+++ b/mail/em-folder-tree-model.c
@@ -238,7 +238,7 @@ em_folder_tree_model_init (EMFolderTreeModel *model)
}
static void
-path_hash_free (gpointer key, gpointer value, gpointer user_data)
+full_hash_free (gpointer key, gpointer value, gpointer user_data)
{
g_free (key);
gtk_tree_row_reference_free (value);
@@ -256,7 +256,7 @@ store_info_free (struct _EMFolderTreeModelStoreInfo *si)
g_free (si->display_name);
camel_object_unref (si->store);
gtk_tree_row_reference_free (si->row);
- g_hash_table_foreach (si->path_hash, path_hash_free, NULL);
+ g_hash_table_foreach (si->full_hash, full_hash_free, NULL);
g_free (si);
}
@@ -430,7 +430,7 @@ em_folder_tree_model_set_folder_info (EMFolderTreeModel *model, GtkTreeIter *ite
gtk_tree_path_free (path);
g_hash_table_insert (model->uri_hash, g_strdup (fi->uri), uri_row);
- g_hash_table_insert (si->path_hash, g_strdup (fi->path), path_row);
+ g_hash_table_insert (si->full_hash, g_strdup (fi->full_name), path_row);
/* HACK: if we have the folder, and its the outbox folder, we need the total count, not unread */
/* This is duplicated in mail-folder-cache too, should perhaps be functionised */
@@ -454,7 +454,7 @@ em_folder_tree_model_set_folder_info (EMFolderTreeModel *model, GtkTreeIter *ite
gtk_tree_store_set ((GtkTreeStore *) model, iter,
COL_STRING_DISPLAY_NAME, fi->name,
COL_POINTER_CAMEL_STORE, si->store,
- COL_STRING_FOLDER_PATH, fi->path,
+ COL_STRING_FULL_NAME, fi->full_name,
COL_STRING_URI, fi->uri,
COL_UINT_UNREAD, unread,
COL_UINT_FLAGS, fi->flags,
@@ -468,7 +468,7 @@ em_folder_tree_model_set_folder_info (EMFolderTreeModel *model, GtkTreeIter *ite
gtk_tree_store_set ((GtkTreeStore *) model, &sub,
COL_STRING_DISPLAY_NAME, _("Loading..."),
COL_POINTER_CAMEL_STORE, NULL,
- COL_STRING_FOLDER_PATH, NULL,
+ COL_STRING_FULL_NAME, NULL,
COL_BOOL_LOAD_SUBDIRS, FALSE,
COL_BOOL_IS_STORE, FALSE,
COL_STRING_URI, NULL,
@@ -515,26 +515,25 @@ folder_subscribed (CamelStore *store, CamelFolderInfo *fi, EMFolderTreeModel *mo
GtkTreeIter parent, iter;
GtkTreePath *path;
gboolean load;
- char *dirname;
-
+ char *dirname, *p;
+
if (!(si = g_hash_table_lookup (model->store_hash, store)))
goto done;
/* make sure we don't already know about it? */
- if (g_hash_table_lookup (si->path_hash, fi->path))
+ if (g_hash_table_lookup (si->full_hash, fi->full_name))
goto done;
/* get our parent folder's path */
- if (!(dirname = g_path_get_dirname (fi->path)))
- goto done;
-
- if (!strcmp (dirname, "/")) {
+ dirname = alloca(strlen(fi->full_name)+1);
+ strcpy(dirname, fi->full_name);
+ p = strrchr(dirname, '/');
+ if (p == NULL) {
/* user subscribed to a toplevel folder */
row = si->row;
- g_free (dirname);
} else {
- row = g_hash_table_lookup (si->path_hash, dirname);
- g_free (dirname);
+ *p = 0;
+ row = g_hash_table_lookup (si->full_hash, dirname);
/* if row is NULL, don't bother adding to the tree,
* when the user expands enough nodes - it will be
@@ -560,8 +559,8 @@ folder_subscribed (CamelStore *store, CamelFolderInfo *fi, EMFolderTreeModel *mo
gtk_tree_store_append ((GtkTreeStore *) model, &iter, &parent);
em_folder_tree_model_set_folder_info (model, &iter, si, fi, TRUE);
-
- g_signal_emit (model, signals[FOLDER_ADDED], 0, fi->path, fi->uri);
+
+ g_signal_emit (model, signals[FOLDER_ADDED], 0, fi->full_name, fi->uri);
done:
@@ -590,7 +589,7 @@ folder_unsubscribed (CamelStore *store, CamelFolderInfo *fi, EMFolderTreeModel *
if (!(si = g_hash_table_lookup (model->store_hash, store)))
goto done;
- if (!(row = g_hash_table_lookup (si->path_hash, fi->path)))
+ if (!(row = g_hash_table_lookup (si->full_hash, fi->full_name)))
goto done;
path = gtk_tree_row_reference_get_path (row);
@@ -621,7 +620,7 @@ static void
folder_created_cb (CamelStore *store, void *event_data, EMFolderTreeModel *model)
{
CamelFolderInfo *fi;
-
+
/* we only want created events to do more work if we don't support subscriptions */
if (camel_store_supports_subscriptions (store))
return;
@@ -657,12 +656,8 @@ folder_renamed (CamelStore *store, CamelRenameInfo *info, EMFolderTreeModel *mod
if (!(si = g_hash_table_lookup (model->store_hash, store)))
goto done;
- parent = g_strdup_printf ("/%s", info->old_base);
- if (!(row = g_hash_table_lookup (si->path_hash, parent))) {
- g_free (parent);
+ if (!(row = g_hash_table_lookup (si->full_hash, info->old_base)))
goto done;
- }
- g_free (parent);
path = gtk_tree_row_reference_get_path (row);
if (!(gtk_tree_model_get_iter ((GtkTreeModel *) model, &iter, path))) {
@@ -672,15 +667,15 @@ folder_renamed (CamelStore *store, CamelRenameInfo *info, EMFolderTreeModel *mod
em_folder_tree_model_remove_folders (model, si, &iter);
- parent = g_strdup (info->new->path);
+ parent = g_strdup(info->new->full_name);
p = strrchr(parent, '/');
- g_assert(p);
- *p = 0;
- if (parent == p) {
+ if (p)
+ *p = 0;
+ if (p == NULL || parent == p) {
/* renamed to a toplevel folder on the store */
path = gtk_tree_row_reference_get_path (si->row);
} else {
- if (!(row = g_hash_table_lookup (si->path_hash, parent))) {
+ if (!(row = g_hash_table_lookup (si->full_hash, parent))) {
/* NOTE: this should never happen, but I
* suppose if it does in reality, we can add
* code here to add the missing nodes to the
@@ -753,7 +748,7 @@ em_folder_tree_model_add_store (EMFolderTreeModel *model, CamelStore *store, con
gtk_tree_store_set ((GtkTreeStore *) model, &iter,
COL_STRING_DISPLAY_NAME, display_name,
COL_POINTER_CAMEL_STORE, store,
- COL_STRING_FOLDER_PATH, "/",
+ COL_STRING_FULL_NAME, "",
COL_BOOL_LOAD_SUBDIRS, TRUE,
COL_BOOL_IS_STORE, TRUE,
COL_STRING_URI, uri, -1);
@@ -767,7 +762,7 @@ em_folder_tree_model_add_store (EMFolderTreeModel *model, CamelStore *store, con
si->store = store;
si->account = account;
si->row = row;
- si->path_hash = g_hash_table_new (g_str_hash, g_str_equal);
+ si->full_hash = g_hash_table_new (g_str_hash, g_str_equal);
g_hash_table_insert (model->store_hash, store, si);
g_hash_table_insert (model->account_hash, account, si);
@@ -777,7 +772,7 @@ em_folder_tree_model_add_store (EMFolderTreeModel *model, CamelStore *store, con
gtk_tree_store_set ((GtkTreeStore *) model, &iter,
COL_STRING_DISPLAY_NAME, _("Loading..."),
COL_POINTER_CAMEL_STORE, NULL,
- COL_STRING_FOLDER_PATH, NULL,
+ COL_STRING_FULL_NAME, NULL,
COL_BOOL_LOAD_SUBDIRS, FALSE,
COL_BOOL_IS_STORE, FALSE,
COL_STRING_URI, NULL,
@@ -850,11 +845,11 @@ em_folder_tree_model_remove_folders (EMFolderTreeModel *model, struct _EMFolderT
}
gtk_tree_model_get ((GtkTreeModel *) model, toplevel, COL_STRING_URI, &uri,
- COL_STRING_FOLDER_PATH, &folder_path,
+ COL_STRING_FULL_NAME, &folder_path,
COL_BOOL_IS_STORE, &is_store, -1);
- if (folder_path && (row = g_hash_table_lookup (si->path_hash, folder_path))) {
- g_hash_table_remove (si->path_hash, folder_path);
+ if (folder_path && (row = g_hash_table_lookup (si->full_hash, folder_path))) {
+ g_hash_table_remove (si->full_hash, folder_path);
gtk_tree_row_reference_free (row);
}
@@ -929,7 +924,7 @@ em_folder_tree_model_get_expanded (EMFolderTreeModel *model, const char *key)
if (p[-1] == '/')
p[-1] = '\0';
p = NULL;
-
+
do {
if ((p = strchr (name, '/')))
*p = '\0';
@@ -947,7 +942,7 @@ em_folder_tree_model_get_expanded (EMFolderTreeModel *model, const char *key)
name = p ? p + 1 : NULL;
} while (name && node);
-
+
return FALSE;
}
@@ -1061,7 +1056,7 @@ em_folder_tree_model_expand_foreach (EMFolderTreeModel *model, EMFTModelExpandFu
}
void
-em_folder_tree_model_set_unread_count (EMFolderTreeModel *model, CamelStore *store, const char *path, int unread)
+em_folder_tree_model_set_unread_count (EMFolderTreeModel *model, CamelStore *store, const char *full, int unread)
{
struct _EMFolderTreeModelStoreInfo *si;
GtkTreeRowReference *row;
@@ -1070,9 +1065,9 @@ em_folder_tree_model_set_unread_count (EMFolderTreeModel *model, CamelStore *sto
g_return_if_fail (EM_IS_FOLDER_TREE_MODEL (model));
g_return_if_fail (CAMEL_IS_STORE (store));
- g_return_if_fail (path != NULL);
+ g_return_if_fail (full != NULL);
- u(printf("set unread count %p '%s' %d\n", store, path, unread));
+ u(printf("set unread count %p '%s' %d\n", store, full, unread));
if (unread < 0)
unread = 0;
@@ -1082,7 +1077,7 @@ em_folder_tree_model_set_unread_count (EMFolderTreeModel *model, CamelStore *sto
return;
}
- if (!(row = g_hash_table_lookup (si->path_hash, path))) {
+ if (!(row = g_hash_table_lookup (si->full_hash, full))) {
u(printf(" can't find row\n"));
return;
}
diff --git a/mail/em-folder-tree-model.h b/mail/em-folder-tree-model.h
index c6beb52ee1..83d2490c36 100644
--- a/mail/em-folder-tree-model.h
+++ b/mail/em-folder-tree-model.h
@@ -52,7 +52,7 @@ typedef struct _EMFolderTreeModelStoreInfo EMFolderTreeModelStoreInfo;
enum {
COL_STRING_DISPLAY_NAME, /* string that appears in the tree */
COL_POINTER_CAMEL_STORE, /* CamelStore object */
- COL_STRING_FOLDER_PATH, /* if node is a folder, the full path of the folder */
+ COL_STRING_FULL_NAME, /* if node is a folder, the full path name of the folder, no leading / */
COL_STRING_URI, /* the uri to get the store or folder object */
COL_UINT_UNREAD, /* unread count */
COL_UINT_FLAGS, /* FolderInfo.flags */
@@ -68,7 +68,7 @@ enum {
struct _EMFolderTreeModelStoreInfo {
CamelStore *store;
GtkTreeRowReference *row;
- GHashTable *path_hash; /* maps CamelFolderInfo::path's to GtkTreeRowReferences */
+ GHashTable *full_hash; /* maps CamelFolderInfo::full_name's to GtkTreeRowReferences */
EAccount *account;
char *display_name;
diff --git a/mail/em-folder-tree.c b/mail/em-folder-tree.c
index a424250707..b2b78418b2 100644
--- a/mail/em-folder-tree.c
+++ b/mail/em-folder-tree.c
@@ -272,17 +272,17 @@ render_pixbuf (GtkTreeViewColumn *column, GtkCellRenderer *renderer,
initialised = TRUE;
}
- gtk_tree_model_get (model, iter, COL_STRING_FOLDER_PATH, &path,
+ gtk_tree_model_get (model, iter, COL_STRING_FULL_NAME, &path,
COL_BOOL_IS_STORE, &is_store, -1);
if (!is_store && path != NULL) {
- if (!strcasecmp (path, "/Inbox"))
+ if (!g_ascii_strcasecmp (path, "Inbox"))
pixbuf = folder_icons[FOLDER_ICON_INBOX];
- else if (!strcasecmp (path, "/Outbox"))
+ else if (!g_ascii_strcasecmp (path, "Outbox"))
pixbuf = folder_icons[FOLDER_ICON_OUTBOX];
- else if (*path == '/' && !strcasecmp (path + 1, CAMEL_VTRASH_NAME))
+ else if (!strcmp (path, CAMEL_VTRASH_NAME))
pixbuf = folder_icons[FOLDER_ICON_TRASH];
- else if (*path == '/' && !strcasecmp (path + 1, CAMEL_VJUNK_NAME))
+ else if (!strcmp(path, CAMEL_VJUNK_NAME))
pixbuf = folder_icons[FOLDER_ICON_JUNK];
else
pixbuf = folder_icons[FOLDER_ICON_NORMAL];
@@ -546,7 +546,7 @@ emft_expand_node (EMFolderTreeModel *model, const char *key, EMFolderTree *emft)
camel_object_unref (store);
if (p != NULL) {
- if (!(row = g_hash_table_lookup (si->path_hash, p)))
+ if (!(row = g_hash_table_lookup (si->full_hash, p)))
return;
} else
row = si->row;
@@ -565,19 +565,19 @@ emft_maybe_expand_row (EMFolderTreeModel *model, GtkTreePath *tree_path, GtkTree
char *path, *key;
gtk_tree_model_get ((GtkTreeModel *) model, iter,
- COL_STRING_FOLDER_PATH, &path,
+ COL_STRING_FULL_NAME, &path,
COL_POINTER_CAMEL_STORE, &store,
-1);
si = g_hash_table_lookup (model->store_hash, store);
if ((account = mail_config_get_account_by_name (si->display_name))) {
- key = g_strdup_printf ("%s%s", account->uid, path);
+ key = g_strdup_printf ("%s/%s", account->uid, path);
} else if (CAMEL_IS_VEE_STORE (store)) {
/* vfolder store */
- key = g_strdup_printf ("vfolder%s", path);
+ key = g_strdup_printf ("vfolder/%s", path);
} else {
/* local store */
- key = g_strdup_printf ("local%s", path);
+ key = g_strdup_printf ("local/%s", path);
}
if (em_folder_tree_model_get_expanded (model, key)) {
@@ -630,12 +630,11 @@ tree_drag_data_delete(GtkWidget *widget, GdkDragContext *context, EMFolderTree *
{
struct _EMFolderTreePrivate *priv = emft->priv;
GtkTreePath *src_path;
- const char *full_name;
gboolean is_store;
CamelStore *store;
CamelException ex;
GtkTreeIter iter;
- char *path;
+ char *full_name;
if (!priv->drag_row || (src_path = gtk_tree_row_reference_get_path (priv->drag_row)))
return;
@@ -645,14 +644,12 @@ tree_drag_data_delete(GtkWidget *widget, GdkDragContext *context, EMFolderTree *
gtk_tree_model_get((GtkTreeModel *)priv->model, &iter,
COL_POINTER_CAMEL_STORE, &store,
- COL_STRING_FOLDER_PATH, &path,
+ COL_STRING_FULL_NAME, &full_name,
COL_BOOL_IS_STORE, &is_store, -1);
if (is_store)
goto fail;
- full_name = path[0] == '/' ? path + 1 : path;
-
camel_exception_init(&ex);
camel_store_delete_folder(store, full_name, &ex);
if (camel_exception_is_set(&ex))
@@ -666,12 +663,11 @@ tree_drag_data_get(GtkWidget *widget, GdkDragContext *context, GtkSelectionData
{
struct _EMFolderTreePrivate *priv = emft->priv;
GtkTreePath *src_path;
- const char *full_name;
CamelFolder *folder;
CamelStore *store;
CamelException ex;
GtkTreeIter iter;
- char *path, *uri;
+ char *full_name, *uri;
if (!priv->drag_row || !(src_path = gtk_tree_row_reference_get_path(priv->drag_row)))
return;
@@ -681,15 +677,13 @@ tree_drag_data_get(GtkWidget *widget, GdkDragContext *context, GtkSelectionData
gtk_tree_model_get((GtkTreeModel *)priv->model, &iter,
COL_POINTER_CAMEL_STORE, &store,
- COL_STRING_FOLDER_PATH, &path,
+ COL_STRING_FULL_NAME, &full_name,
COL_STRING_URI, &uri, -1);
/* make sure user isn't trying to drag on a placeholder row */
- if (path == NULL)
+ if (full_name == NULL)
goto fail;
- full_name = path[0] == '/' ? path + 1 : path;
-
camel_exception_init(&ex);
switch (info) {
@@ -968,14 +962,11 @@ tree_drag_data_received(GtkWidget *widget, GdkDragContext *context, int x, int y
GtkTreeViewDropPosition pos;
GtkTreePath *dest_path;
struct _DragDataReceivedAsync *m;
- const char *full_name;
CamelStore *store;
GtkTreeIter iter;
- char *path;
+ char *full_name;
int i;
- printf("drag data received, action %d\n", context->action);
-
if (!gtk_tree_view_get_dest_row_at_pos (priv->treeview, x, y, &dest_path, &pos))
return;
@@ -992,16 +983,14 @@ tree_drag_data_received(GtkWidget *widget, GdkDragContext *context, int x, int y
gtk_tree_model_get((GtkTreeModel *)priv->model, &iter,
COL_POINTER_CAMEL_STORE, &store,
- COL_STRING_FOLDER_PATH, &path, -1);
+ COL_STRING_FULL_NAME, &full_name, -1);
/* make sure user isn't try to drop on a placeholder row */
- if (path == NULL) {
+ if (full_name == NULL) {
gtk_drag_finish (context, FALSE, FALSE, GDK_CURRENT_TIME);
return;
}
- full_name = path[0] == '/' ? path + 1 : path;
-
m = mail_msg_new (&emft_drop_async_op, NULL, sizeof (struct _DragDataReceivedAsync));
m->context = context;
g_object_ref(context);
@@ -1067,7 +1056,7 @@ emft_drop_target(EMFolderTree *emft, GdkDragContext *context, GtkTreePath *path)
return GDK_NONE;
gtk_tree_model_get((GtkTreeModel *)p->model, &iter, COL_BOOL_IS_STORE, &is_store,
- COL_STRING_FOLDER_PATH, &folder_path,
+ COL_STRING_FULL_NAME, &folder_path,
COL_POINTER_CAMEL_STORE, &dstore,
COL_STRING_URI, &uri, -1);
@@ -1077,8 +1066,6 @@ emft_drop_target(EMFolderTree *emft, GdkDragContext *context, GtkTreePath *path)
/* Check for special destinations */
if (uri && folder_path) {
- folder_path = folder_path[0] == '/' ? folder_path + 1 : folder_path;
-
#if 0
/* only allow copying/moving folders (not messages) into the local Outbox */
if (dstore == local && !strcmp (folder_path, "Outbox")) {
@@ -1503,7 +1490,7 @@ get_selected_uris_path_iterate (GtkTreeModel *model, GtkTreePath *treepath, GtkT
GList **list = (GList **) data;
char *path;
- gtk_tree_model_get (model, iter, COL_STRING_FOLDER_PATH, &path, -1);
+ gtk_tree_model_get (model, iter, COL_STRING_FULL_NAME, &path, -1);
*list = g_list_append (*list, g_strdup (path));
}
@@ -1692,19 +1679,19 @@ emft_update_model_expanded_state (struct _EMFolderTreePrivate *priv, GtkTreeIter
char *path, *key;
gtk_tree_model_get ((GtkTreeModel *) priv->model, iter,
- COL_STRING_FOLDER_PATH, &path,
+ COL_STRING_FULL_NAME, &path,
COL_POINTER_CAMEL_STORE, &store,
-1);
si = g_hash_table_lookup (priv->model->store_hash, store);
if ((account = mail_config_get_account_by_name (si->display_name))) {
- key = g_strdup_printf ("%s%s", account->uid, path);
+ key = g_strdup_printf ("%s/%s", account->uid, path);
} else if (CAMEL_IS_VEE_STORE (store)) {
/* vfolder store */
- key = g_strdup_printf ("vfolder%s", path);
+ key = g_strdup_printf ("vfolder/%s", path);
} else {
/* local store */
- key = g_strdup_printf ("local%s", path);
+ key = g_strdup_printf ("local/%s", path);
}
em_folder_tree_model_set_expanded (priv->model, key, expanded);
@@ -1718,14 +1705,13 @@ emft_tree_row_expanded (GtkTreeView *treeview, GtkTreeIter *root, GtkTreePath *t
struct _EMFolderTreeGetFolderInfo *m;
GtkTreeModel *model;
CamelStore *store;
- const char *top;
gboolean load;
char *path;
model = gtk_tree_view_get_model (treeview);
gtk_tree_model_get (model, root,
- COL_STRING_FOLDER_PATH, &path,
+ COL_STRING_FULL_NAME, &path,
COL_POINTER_CAMEL_STORE, &store,
COL_BOOL_LOAD_SUBDIRS, &load,
-1);
@@ -1737,18 +1723,13 @@ emft_tree_row_expanded (GtkTreeView *treeview, GtkTreeIter *root, GtkTreePath *t
return;
}
- if (!path || !strcmp (path, "/"))
- top = NULL;
- else
- top = path + 1;
-
m = mail_msg_new (&get_folder_info_op, NULL, sizeof (struct _EMFolderTreeGetFolderInfo));
m->root = gtk_tree_row_reference_new (model, tree_path);
camel_object_ref (store);
m->store = store;
m->emft = emft;
g_object_ref(emft);
- m->top = g_strdup (top);
+ m->top = g_strdup (path);
m->flags = CAMEL_STORE_FOLDER_INFO_RECURSIVE;
m->select_uri = NULL;
@@ -1779,7 +1760,7 @@ emft_tree_row_activated (GtkTreeView *treeview, GtkTreePath *tree_path, GtkTreeV
if (!gtk_tree_model_get_iter (model, &iter, tree_path))
return;
- gtk_tree_model_get (model, &iter, COL_STRING_FOLDER_PATH, &path,
+ gtk_tree_model_get (model, &iter, COL_STRING_FULL_NAME, &path,
COL_STRING_URI, &uri, COL_UINT_FLAGS, &flags, -1);
g_free (priv->selected_uri);
@@ -2329,16 +2310,14 @@ emft_popup_delete_rec (CamelStore *store, CamelFolderInfo *fi, CamelException *e
}
static void
-emft_popup_delete_folders (CamelStore *store, const char *path, CamelException *ex)
+emft_popup_delete_folders (CamelStore *store, const char *full_name, CamelException *ex)
{
guint32 flags = CAMEL_STORE_FOLDER_INFO_RECURSIVE | CAMEL_STORE_FOLDER_INFO_FAST;
- const char *full_name;
CamelFolderInfo *fi;
if (camel_store_supports_subscriptions (store))
flags |= CAMEL_STORE_FOLDER_INFO_SUBSCRIBED;
- full_name = path[0] == '/' ? path + 1 : path;
fi = camel_store_get_folder_info (store, full_name, flags, ex);
if (camel_exception_is_set (ex))
return;
@@ -2392,7 +2371,7 @@ emft_popup_delete_response (GtkWidget *dialog, guint response, EMFolderTree *emf
if (!emft_selection_get_selected (selection, &model, &iter))
return;
- gtk_tree_model_get (model, &iter, COL_STRING_FOLDER_PATH, &path,
+ gtk_tree_model_get (model, &iter, COL_STRING_FULL_NAME, &path,
COL_POINTER_CAMEL_STORE, &store, -1);
camel_exception_init (&ex);
@@ -2413,18 +2392,16 @@ emft_popup_delete_folder (GtkWidget *item, EMFolderTree *emft)
GtkTreeModel *model;
GtkTreeIter iter;
GtkWidget *dialog;
- const char *full_name;
- char *path;
+ char *full_name;
selection = gtk_tree_view_get_selection (priv->treeview);
if (!emft_selection_get_selected (selection, &model, &iter))
return;
- gtk_tree_model_get (model, &iter, COL_POINTER_CAMEL_STORE, &store, COL_STRING_FOLDER_PATH, &path, -1);
+ gtk_tree_model_get (model, &iter, COL_POINTER_CAMEL_STORE, &store, COL_STRING_FULL_NAME, &full_name, -1);
local = mail_component_peek_local_store (NULL);
- full_name = path[0] == '/' ? path + 1 : path;
if (store == local && is_special_local_folder (full_name)) {
e_error_run(NULL, "mail:no-delete-spethal-folder", full_name, NULL);
return;
@@ -2440,9 +2417,9 @@ static void
emft_popup_rename_folder (GtkWidget *item, EMFolderTree *emft)
{
struct _EMFolderTreePrivate *priv = emft->priv;
- char *prompt, *folder_path, *name, *new_name, *uri;
+ char *prompt, *full_name, *name, *new_name, *uri;
GtkTreeSelection *selection;
- const char *full_name, *p;
+ const char *p;
CamelStore *local, *store;
gboolean done = FALSE;
GtkTreeModel *model;
@@ -2455,13 +2432,11 @@ emft_popup_rename_folder (GtkWidget *item, EMFolderTree *emft)
if (!emft_selection_get_selected (selection, &model, &iter))
return;
- gtk_tree_model_get (model, &iter, COL_STRING_FOLDER_PATH, &folder_path,
+ gtk_tree_model_get (model, &iter, COL_STRING_FULL_NAME, &full_name,
COL_STRING_DISPLAY_NAME, &name,
COL_POINTER_CAMEL_STORE, &store,
COL_STRING_URI, &uri, -1);
- full_name = folder_path[0] == '/' ? folder_path + 1 : folder_path;
-
/* don't allow user to rename one of the special local folders */
if (store == local && is_special_local_folder (full_name)) {
e_error_run((GtkWindow *)gtk_widget_get_toplevel((GtkWidget *)emft),
@@ -2571,7 +2546,6 @@ emft_tree_button_press (GtkTreeView *treeview, GdkEventButton *event, EMFolderTr
{
GtkTreeSelection *selection;
CamelStore *local, *store;
- const char *folder_name;
EMPopupTarget *target;
GtkTreePath *tree_path;
GtkTreeModel *model;
@@ -2580,7 +2554,7 @@ emft_tree_button_press (GtkTreeView *treeview, GdkEventButton *event, EMFolderTr
guint32 info_flags = 0;
guint32 flags = 0;
gboolean isstore;
- char *uri, *path;
+ char *uri, *full_name;
GtkMenu *menu;
EMPopup *emp;
int i;
@@ -2608,10 +2582,10 @@ emft_tree_button_press (GtkTreeView *treeview, GdkEventButton *event, EMFolderTr
return FALSE;
gtk_tree_model_get (model, &iter, COL_POINTER_CAMEL_STORE, &store,
- COL_STRING_URI, &uri, COL_STRING_FOLDER_PATH, &path,
+ COL_STRING_URI, &uri, COL_STRING_FULL_NAME, &full_name,
COL_BOOL_IS_STORE, &isstore, -1);
- if (path == NULL)
+ if (full_name == NULL)
return FALSE;
if (isstore)
@@ -2621,14 +2595,12 @@ emft_tree_button_press (GtkTreeView *treeview, GdkEventButton *event, EMFolderTr
local = mail_component_peek_local_store (NULL);
- folder_name = path[0] == '/' ? path + 1 : path;
-
/* don't allow deletion of special local folders */
- if (!(store == local && is_special_local_folder (folder_name)))
+ if (!(store == local && is_special_local_folder (full_name)))
flags |= EM_POPUP_FOLDER_DELETE;
/* hack for vTrash/vJunk */
- if (!strcmp (folder_name, CAMEL_VTRASH_NAME) || !strcmp (folder_name, CAMEL_VJUNK_NAME))
+ if (!strcmp (full_name, CAMEL_VTRASH_NAME) || !strcmp (full_name, CAMEL_VJUNK_NAME))
info_flags |= CAMEL_FOLDER_VIRTUAL | CAMEL_FOLDER_NOINFERIORS;
/* handle right-click by opening a context menu */
@@ -2671,7 +2643,7 @@ emft_tree_selection_changed (GtkTreeSelection *selection, EMFolderTree *emft)
if (!emft_selection_get_selected (selection, &model, &iter))
return;
- gtk_tree_model_get (model, &iter, COL_STRING_FOLDER_PATH, &path,
+ gtk_tree_model_get (model, &iter, COL_STRING_FULL_NAME, &path,
COL_STRING_URI, &uri, COL_UINT_FLAGS, &flags, -1);
g_free (priv->selected_uri);
@@ -2695,7 +2667,6 @@ em_folder_tree_set_selected (EMFolderTree *emft, const char *uri)
GtkTreePath *tree_path;
CamelStore *store;
CamelException ex;
- const char *top;
char *path, *p;
CamelURL *url;
@@ -2720,17 +2691,16 @@ em_folder_tree_set_selected (EMFolderTree *emft, const char *uri)
}
if (((CamelService *) store)->provider->url_flags & CAMEL_URL_FRAGMENT_IS_PATH)
- path = g_strdup_printf ("/%s", url->fragment ? url->fragment : "");
+ path = url->fragment;
else
- path = g_strdup (url->path ? url->path : "/");
-
- top = path[0] == '/' ? path + 1 : path;
+ path = url->path && url->path[0]=='/' ? url->path+1:url->path;
+ path = g_strdup(path?path:"");
camel_url_free (url);
- if (!strcmp (path, "/"))
+ if (path[0] == 0)
row = si->row;
- if (row || (row = g_hash_table_lookup (si->path_hash, path))) {
+ if (row || (row = g_hash_table_lookup (si->full_hash, path))) {
/* the folder-info node has already been loaded */
tree_path = gtk_tree_row_reference_get_path (row);
gtk_tree_view_expand_to_path (priv->treeview, tree_path);
@@ -2749,37 +2719,34 @@ em_folder_tree_set_selected (EMFolderTree *emft, const char *uri)
if (*p == '/') {
*p = '\0';
- if ((row = g_hash_table_lookup (si->path_hash, path)))
+ if ((row = g_hash_table_lookup (si->full_hash, path)))
break;
}
p--;
}
- if (row == NULL) {
- /* none of the folders of the desired store have been loaded yet */
- row = si->row;
- top = NULL;
- }
-
/* FIXME: this gets all the subfolders of our first loaded
* parent folder - ideally we'd only get what we needed, but
* it's probably not worth the effort */
m = mail_msg_new (&get_folder_info_op, NULL, sizeof (struct _EMFolderTreeGetFolderInfo));
- m->root = gtk_tree_row_reference_copy (row);
m->store = store;
m->emft = emft;
g_object_ref(emft);
- m->top = top ? g_strdup (top) : NULL;
+ if (row) {
+ m->top = path;
+ m->root = gtk_tree_row_reference_copy(row);
+ } else {
+ g_free(path);
+ m->root = gtk_tree_row_reference_copy(si->row);
+ }
+
m->flags = CAMEL_STORE_FOLDER_INFO_FAST | CAMEL_STORE_FOLDER_INFO_RECURSIVE;
m->select_uri = g_strdup (uri);
- g_free (path);
-
e_thread_put (mail_thread_new, (EMsg *) m);
}
-
const char *
em_folder_tree_get_selected_uri (EMFolderTree *emft)
{
diff --git a/mail/importers/evolution-mbox-importer.c b/mail/importers/evolution-mbox-importer.c
index 9e08bf2087..94b8403e28 100644
--- a/mail/importers/evolution-mbox-importer.c
+++ b/mail/importers/evolution-mbox-importer.c
@@ -111,13 +111,14 @@ create_control_fn(EvolutionImporter *importer, Bonobo_Control *control, void *da
{
GtkWidget *hbox, *w;
- hbox = gtk_hbox_new(FALSE, FALSE);
+ hbox = gtk_hbox_new(FALSE, 0);
w = gtk_label_new(_("Destination folder:"));
gtk_box_pack_start((GtkBox *)hbox, w, FALSE, TRUE, 6);
w = em_folder_selection_button_new(_("Select folder"), _("Select folder to import into"));
- /* set selection to Inbox? */
+ em_folder_selection_button_set_selection((EMFolderSelectionButton *)w,
+ mail_component_get_folder_uri(NULL, MAIL_COMPONENT_FOLDER_INBOX));
g_signal_connect(w, "selected", G_CALLBACK(folder_selected), data);
gtk_box_pack_start((GtkBox *)hbox, w, FALSE, TRUE, 6);
diff --git a/mail/importers/evolution-outlook-importer.c b/mail/importers/evolution-outlook-importer.c
index a2c6d035e6..83f5c241a2 100644
--- a/mail/importers/evolution-outlook-importer.c
+++ b/mail/importers/evolution-outlook-importer.c
@@ -113,6 +113,35 @@ process_item_fn(EvolutionImporter *eimporter, CORBA_Object listener, void *data,
/* EvolutionImporterFactory methods */
+static void
+folder_selected(EMFolderSelectionButton *button, OutlookImporter *importer)
+{
+ g_free(importer->uri);
+ importer->uri = g_strdup(em_folder_selection_button_get_selection(button));
+}
+
+static void
+create_control_fn(EvolutionImporter *importer, Bonobo_Control *control, void *data)
+{
+ GtkWidget *hbox, *w;
+
+ hbox = gtk_hbox_new(FALSE, 0);
+
+ w = gtk_label_new(_("Destination folder:"));
+ gtk_box_pack_start((GtkBox *)hbox, w, FALSE, TRUE, 6);
+
+ w = em_folder_selection_button_new(_("Select folder"), _("Select folder to import into"));
+ em_folder_selection_button_set_selection((EMFolderSelectionButton *)w,
+ mail_component_get_folder_uri(NULL, MAIL_COMPONENT_FOLDER_INBOX));
+ g_signal_connect(w, "selected", G_CALLBACK(folder_selected), data);
+ gtk_box_pack_start((GtkBox *)hbox, w, FALSE, TRUE, 6);
+
+ gtk_widget_show_all(hbox);
+
+ /* Another weird-arsed shell api */
+ *control = BONOBO_OBJREF(bonobo_control_new(hbox));
+}
+
static gboolean
support_format_fn(EvolutionImporter *importer, const char *filename, void *data)
{
@@ -252,7 +281,7 @@ outlook_importer_new(void)
oli = g_new0 (OutlookImporter, 1);
oli->status_lock = g_mutex_new();
- importer = evolution_importer_new (NULL, support_format_fn, load_file_fn, process_item_fn, NULL, oli);
+ importer = evolution_importer_new (create_control_fn, support_format_fn, load_file_fn, process_item_fn, NULL, oli);
g_object_weak_ref((GObject *)importer, importer_destroy_cb, oli);
return BONOBO_OBJECT (importer);
diff --git a/mail/mail-component.c b/mail/mail-component.c
index 11ecbb9ca4..ebe949d5b5 100644
--- a/mail/mail-component.c
+++ b/mail/mail-component.c
@@ -182,23 +182,9 @@ mc_add_store(MailComponent *component, CamelStore *store, const char *name, void
}
static void
-mc_add_local_store_done(CamelStore *store, CamelFolderInfo *info, void *data)
-{
- /*MailComponent *mc = data;*/
- int i;
-
-#if 0
- for (i=0;i<sizeof(mc_default_folders)/sizeof(mc_default_folders[0]);i++) {
- if (mc_default_folders[i].folder)
- mail_note_folder(mc_default_folders[i].folder);
- }
-#endif
-}
-
-static void
mc_add_local_store(CamelStore *store, const char *name, MailComponent *mc)
{
- mc_add_store(mc, store, name, mc_add_local_store_done);
+ mc_add_store(mc, store, name, NULL);
camel_object_unref(store);
g_object_unref(mc);
}
@@ -331,7 +317,7 @@ mc_startup(MailComponent *mc)
static void
folder_selected_cb (EMFolderTree *emft, const char *path, const char *uri, guint32 flags, EMFolderView *view)
{
- if ((flags & CAMEL_FOLDER_NOSELECT) || !path || !strcmp (path, "/"))
+ if ((flags & CAMEL_FOLDER_NOSELECT) || !path || !strcmp (path, ""))
em_folder_view_set_folder (view, NULL, NULL);
else
em_folder_view_set_folder_uri (view, uri);
diff --git a/mail/mail-folder-cache.c b/mail/mail-folder-cache.c
index 4f2e3b20d2..43071e45f9 100644
--- a/mail/mail-folder-cache.c
+++ b/mail/mail-folder-cache.c
@@ -66,7 +66,6 @@ static pthread_mutex_t info_lock = PTHREAD_MUTEX_INITIALIZER;
struct _folder_info {
struct _store_info *store_info; /* 'parent' link */
- char *path; /* shell path */
char *full_name; /* full name of folder/folderinfo */
char *uri; /* uri of folder */
@@ -86,9 +85,9 @@ struct _folder_update {
unsigned int unsub:1; /* unsubcribing? */
unsigned int new:1; /* new mail arrived? */
- char *path;
+ char *full_name;
char *uri;
- char *oldpath;
+ char *oldfull;
char *olduri;
int unread;
@@ -134,11 +133,11 @@ static int count_trash = FALSE;
static void
free_update(struct _folder_update *up)
{
- g_free(up->path);
+ g_free(up->full_name);
g_free(up->uri);
if (up->store)
camel_object_unref(up->store);
- g_free(up->oldpath);
+ g_free(up->oldfull);
g_free(up->olduri);
g_free(up);
}
@@ -221,7 +220,7 @@ real_flush_updates(void *o, void *event_data, void *data)
}
/* update unread counts */
- em_folder_tree_model_set_unread_count (model, up->store, up->path, up->unread);
+ em_folder_tree_model_set_unread_count (model, up->store, up->full_name, up->unread);
/* new mail notification */
if (notify_type == -1) {
@@ -277,7 +276,7 @@ unset_folder_info(struct _folder_info *mfi, int delete, int unsub)
up->delete = delete;
up->unsub = unsub;
up->store = mfi->store_info->store;
- up->path = g_strdup (mfi->path);
+ up->full_name = g_strdup (mfi->full_name);
camel_object_ref(up->store);
up->uri = g_strdup(mfi->uri);
@@ -289,7 +288,6 @@ unset_folder_info(struct _folder_info *mfi, int delete, int unsub)
static void
free_folder_info(struct _folder_info *mfi)
{
- g_free(mfi->path);
g_free(mfi->full_name);
g_free(mfi->uri);
g_free(mfi);
@@ -356,7 +354,7 @@ update_1folder(struct _folder_info *mfi, int new, CamelFolderInfo *info)
return;
up = g_malloc0(sizeof(*up));
- up->path = g_strdup(mfi->path);
+ up->full_name = g_strdup(mfi->full_name);
up->unread = unread;
up->new = new ? 1 : 0;
up->store = mfi->store_info->store;
@@ -377,7 +375,6 @@ setup_folder(CamelFolderInfo *fi, struct _store_info *si)
} else {
/*d(printf("Adding new folder: %s (%s) %d unread\n", fi->path, fi->url, fi->unread_message_count));*/
mfi = g_malloc0(sizeof(*mfi));
- mfi->path = g_strdup(fi->path);
mfi->full_name = g_strdup(fi->full_name);
mfi->uri = g_strdup(fi->uri);
mfi->store_info = si;
@@ -387,7 +384,7 @@ setup_folder(CamelFolderInfo *fi, struct _store_info *si)
g_hash_table_insert(si->folders_uri, mfi->uri, mfi);
up = g_malloc0(sizeof(*up));
- up->path = g_strdup(mfi->path);
+ up->full_name = g_strdup(mfi->full_name);
up->uri = g_strdup(fi->uri);
up->unread = (fi->unread==-1)?0:fi->unread;
up->store = si->store;
@@ -581,14 +578,12 @@ rename_folders(struct _store_info *si, const char *oldbase, const char *newbase,
if (mfi) {
d(printf("Found old folder '%s' renaming to '%s'\n", mfi->full_name, fi->full_name));
- up->oldpath = mfi->path;
+ up->oldfull = mfi->full_name;
up->olduri = mfi->uri;
/* Its a rename op */
g_hash_table_remove(si->folders, mfi->full_name);
g_hash_table_remove(si->folders, mfi->uri);
- g_free(mfi->full_name);
- mfi->path = g_strdup(fi->path);
mfi->full_name = g_strdup(fi->full_name);
mfi->uri = g_strdup(fi->uri);
mfi->flags = fi->flags;
@@ -599,7 +594,6 @@ rename_folders(struct _store_info *si, const char *oldbase, const char *newbase,
d(printf("Rename found a new folder? old '%s' new '%s'\n", old, fi->full_name));
/* Its a new op */
mfi = g_malloc0(sizeof(*mfi));
- mfi->path = g_strdup(fi->path);
mfi->full_name = g_strdup(fi->full_name);
mfi->uri = g_strdup(fi->uri);
mfi->store_info = si;
@@ -611,7 +605,7 @@ rename_folders(struct _store_info *si, const char *oldbase, const char *newbase,
g_free(old);
- up->path = g_strdup(mfi->path);
+ up->full_name = g_strdup(mfi->full_name);
up->uri = g_strdup(mfi->uri);
up->unread = fi->unread==-1?0:fi->unread;
up->store = si->store;
@@ -649,7 +643,7 @@ folder_cmp(const void *ap, const void *bp)
const CamelFolderInfo *a = ((CamelFolderInfo **)ap)[0];
const CamelFolderInfo *b = ((CamelFolderInfo **)bp)[0];
- return strcmp(a->path, b->path);
+ return strcmp(a->full_name, b->full_name);
}
static void