[evolution] Check for vfolder stores by UID, not URI.
- From: Matthew Barnes <mbarnes src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [evolution] Check for vfolder stores by UID, not URI.
- Date: Wed, 25 May 2011 16:44:19 +0000 (UTC)
commit eb91ed9977ec15abc4481eeeffb581d772ef37ef
Author: Matthew Barnes <mbarnes redhat com>
Date: Wed May 25 12:14:32 2011 -0400
Check for vfolder stores by UID, not URI.
mail/em-folder-tree.c | 137 +++++++++++++++++++++++++-----------------------
mail/em-folder-utils.c | 19 +++----
2 files changed, 80 insertions(+), 76 deletions(-)
---
diff --git a/mail/em-folder-tree.c b/mail/em-folder-tree.c
index 9ad9d32..ab1273a 100644
--- a/mail/em-folder-tree.c
+++ b/mail/em-folder-tree.c
@@ -2244,13 +2244,19 @@ folder_tree_drop_target (EMFolderTree *folder_tree,
GdkDragAction *suggested_action)
{
EMFolderTreePrivate *p = folder_tree->priv;
- gchar *full_name = NULL, *uri = NULL, *src_uri = NULL;
- CamelStore *local, *sstore, *dstore;
+ gchar *dst_full_name = NULL;
+ gchar *src_full_name = NULL;
+ CamelStore *local;
+ CamelStore *dst_store;
+ CamelStore *src_store = NULL;
GdkAtom atom = GDK_NONE;
gboolean is_store;
GtkTreeModel *model;
GtkTreeIter iter;
GList *targets;
+ const gchar *uid;
+ gboolean src_is_vfolder;
+ gboolean dst_is_vfolder;
guint32 flags = 0;
/* This is a bit of a mess, but should handle all the cases properly */
@@ -2267,29 +2273,34 @@ folder_tree_drop_target (EMFolderTree *folder_tree,
gtk_tree_model_get (
model, &iter,
COL_BOOL_IS_STORE, &is_store,
- COL_STRING_FULL_NAME, &full_name,
- COL_UINT_FLAGS, &flags,
- COL_POINTER_CAMEL_STORE, &dstore,
- COL_STRING_URI, &uri, -1);
+ COL_POINTER_CAMEL_STORE, &dst_store,
+ COL_STRING_FULL_NAME, &dst_full_name,
+ COL_UINT_FLAGS, &flags, -1);
local = e_mail_local_get_store ();
+ uid = camel_service_get_uid (CAMEL_SERVICE (dst_store));
+ dst_is_vfolder = (g_strcmp0 (uid, "vfolder") == 0);
+
targets = gdk_drag_context_list_targets (context);
/* Check for special destinations */
- if (uri && full_name) {
- /* don't allow copying/moving into the UNMATCHED vfolder */
- if (!strncmp (uri, "vfolder:", 8) && !strcmp (full_name, CAMEL_UNMATCHED_NAME))
- goto done;
- /* don't allow copying/moving into a vTrash/vJunk folder */
- if (!strcmp (full_name, CAMEL_VTRASH_NAME)
- || !strcmp (full_name, CAMEL_VJUNK_NAME))
+ /* Don't allow copying/moving into the UNMATCHED vfolder. */
+ if (dst_is_vfolder)
+ if (g_strcmp0 (dst_full_name, CAMEL_UNMATCHED_NAME) == 0)
goto done;
- if (flags & CAMEL_FOLDER_NOSELECT)
- goto done;
- }
+ /* Don't allow copying/moving into a vTrash folder. */
+ if (g_strcmp0 (dst_full_name, CAMEL_VTRASH_NAME) == 0)
+ goto done;
+
+ /* Don't allow copying/moving into a vJunk folder. */
+ if (g_strcmp0 (dst_full_name, CAMEL_VJUNK_NAME) == 0)
+ goto done;
+
+ if (flags & CAMEL_FOLDER_NOSELECT)
+ goto done;
if (p->drag_row) {
GtkTreePath *src_path = gtk_tree_row_reference_get_path (p->drag_row);
@@ -2300,8 +2311,8 @@ folder_tree_drop_target (EMFolderTree *folder_tree,
if (gtk_tree_model_get_iter (model, &iter, src_path))
gtk_tree_model_get (
model, &iter,
- COL_POINTER_CAMEL_STORE, &sstore,
- COL_STRING_URI, &src_uri,
+ COL_POINTER_CAMEL_STORE, &src_store,
+ COL_STRING_FULL_NAME, &src_full_name,
COL_UINT_FLAGS, &src_flags, -1);
/* can't dnd onto itself or below itself - bad things happen,
@@ -2341,62 +2352,58 @@ folder_tree_drop_target (EMFolderTree *folder_tree,
}
/* Check for special sources, and vfolder stuff */
- if (src_uri) {
- CamelURL *url;
- gchar *url_path;
+ if (src_store != NULL && src_full_name != NULL) {
+
+ uid = camel_service_get_uid (CAMEL_SERVICE (src_store));
+ src_is_vfolder = (g_strcmp0 (uid, "vfolder") == 0);
/* FIXME: this is a total hack, but i think all we can do at present */
/* Check for dragging from special folders which can't be moved/copied */
- url = camel_url_new (src_uri, NULL);
- url_path = url->fragment?url->fragment:url->path;
- if (url_path && url_path[0]) {
- /* don't allow moving any of the the local special folders */
- if (sstore == local && is_special_local_folder (url_path)) {
- GdkAtom xfolder;
-
- camel_url_free (url);
-
- /* force copy for special local folders */
- *suggested_action = GDK_ACTION_COPY;
- *actions = GDK_ACTION_COPY;
- xfolder = drop_atoms[DND_DROP_TYPE_FOLDER];
- while (targets != NULL) {
- if (targets->data == (gpointer) xfolder) {
- atom = xfolder;
- goto done;
- }
- targets = targets->next;
+ /* Don't allow moving any of the the special local folders. */
+ if (src_store == local && is_special_local_folder (src_full_name)) {
+ GdkAtom xfolder;
+
+ /* force copy for special local folders */
+ *suggested_action = GDK_ACTION_COPY;
+ *actions = GDK_ACTION_COPY;
+ xfolder = drop_atoms[DND_DROP_TYPE_FOLDER];
+ while (targets != NULL) {
+ if (targets->data == (gpointer) xfolder) {
+ atom = xfolder;
+ goto done;
}
- goto done;
+ targets = targets->next;
}
- /* Don't allow copying/moving the UNMATCHED vfolder. */
- if (!strcmp (url->protocol, "vfolder") &&
- !strcmp (url_path, CAMEL_UNMATCHED_NAME)) {
- camel_url_free (url);
- goto done;
- }
+ goto done;
+ }
- /* Don't allow copying/moving any vTrash/vJunk
- * folder nor maildir 'inbox'. */
- if (strcmp (url_path, CAMEL_VTRASH_NAME) == 0
- || strcmp (url_path, CAMEL_VJUNK_NAME) == 0
- /* Dont allow drag from maildir 'inbox' */
- || strcmp(url_path, ".") == 0) {
- camel_url_free (url);
+ /* Don't allow copying/moving the UNMATCHED vfolder. */
+ if (src_is_vfolder)
+ if (g_strcmp0 (src_full_name, CAMEL_UNMATCHED_NAME) == 0)
goto done;
- }
- }
- camel_url_free (url);
- /* Search Folders can only be dropped into other Search Folders */
- if (strncmp(src_uri, "vfolder:", 8) == 0) {
+ /* Don't allow copying/moving any vTrash folder. */
+ if (g_strcmp0 (src_full_name, CAMEL_VTRASH_NAME) == 0)
+ goto done;
+
+ /* Don't allow copying/moving any vJunk folder. */
+ if (g_strcmp0 (src_full_name, CAMEL_VJUNK_NAME) == 0)
+ goto done;
+
+ /* Don't allow copying/moving any maildir 'inbox'. */
+ if (g_strcmp0 (src_full_name, ".") == 0)
+ goto done;
+
+ /* Search Folders can only be dropped into other
+ * Search Folders. */
+ if (src_is_vfolder) {
/* force move only for vfolders */
*suggested_action = GDK_ACTION_MOVE;
- if (uri && strncmp(uri, "vfolder:", 8) == 0) {
+ if (dst_is_vfolder) {
GdkAtom xfolder;
xfolder = drop_atoms[DND_DROP_TYPE_FOLDER];
@@ -2414,11 +2421,11 @@ folder_tree_drop_target (EMFolderTree *folder_tree,
}
}
- /* can't drag anything but a vfolder into a vfolder */
- if (uri && strncmp(uri, "vfolder:", 8) == 0)
+ /* Can't drag anything but a Search Folder into a Search Folder. */
+ if (dst_is_vfolder)
goto done;
- /* Now we either have a store or a normal folder */
+ /* Now we either have a store or a normal folder. */
if (is_store) {
GdkAtom xfolder;
@@ -2449,8 +2456,8 @@ folder_tree_drop_target (EMFolderTree *folder_tree,
done:
- g_free (full_name);
- g_free (uri);
+ g_free (dst_full_name);
+ g_free (src_full_name);
return atom;
}
diff --git a/mail/em-folder-utils.c b/mail/em-folder-utils.c
index 6bcf061..05fcb4b 100644
--- a/mail/em-folder-utils.c
+++ b/mail/em-folder-utils.c
@@ -405,26 +405,23 @@ emfu_copy_folder_exclude (EMFolderTree *tree,
gpointer data)
{
struct _copy_folder_data *cfd = data;
- CamelProvider *source_provider;
- CamelService *source_service;
+ CamelStore *store;
+ const gchar *uid;
gint fromvfolder, tovfolder;
- gchar *touri;
guint flags;
- gboolean is_store;
/* handles moving to/from vfolders */
- source_service = CAMEL_SERVICE (cfd->source_store);
- source_provider = camel_service_get_provider (source_service);
- fromvfolder = (g_strcmp0 (source_provider->protocol, "vfolder") == 0);
+ uid = camel_service_get_uid (CAMEL_SERVICE (cfd->source_store));
+ fromvfolder = (g_strcmp0 (uid, "vfolder") == 0);
gtk_tree_model_get (
model, iter,
- COL_STRING_URI, &touri,
COL_UINT_FLAGS, &flags,
- COL_BOOL_IS_STORE, &is_store, -1);
- tovfolder = strncmp(touri, "vfolder:", 8) == 0;
- g_free (touri);
+ COL_POINTER_CAMEL_STORE, &store, -1);
+
+ uid = camel_service_get_uid (CAMEL_SERVICE (store));
+ tovfolder = (g_strcmp0 (uid, "vfolder") == 0);
/* moving from vfolder to normal- not allowed */
if (fromvfolder && !tovfolder && cfd->delete)
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]