Check for vfolder stores by UID, not URI.
This commit is contained in:
@ -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))
|
||||
|
||||
/* 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;
|
||||
|
||||
/* don't allow copying/moving into a vTrash/vJunk folder */
|
||||
if (!strcmp (full_name, CAMEL_VTRASH_NAME)
|
||||
|| !strcmp (full_name, CAMEL_VJUNK_NAME))
|
||||
goto done;
|
||||
/* Don't allow copying/moving into a vTrash folder. */
|
||||
if (g_strcmp0 (dst_full_name, CAMEL_VTRASH_NAME) == 0)
|
||||
goto done;
|
||||
|
||||
if (flags & CAMEL_FOLDER_NOSELECT)
|
||||
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);
|
||||
/* 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;
|
||||
}
|
||||
|
||||
targets = targets->next;
|
||||
/* 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;
|
||||
}
|
||||
|
||||
/* 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);
|
||||
goto done;
|
||||
}
|
||||
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 the UNMATCHED vfolder. */
|
||||
if (src_is_vfolder)
|
||||
if (g_strcmp0 (src_full_name, CAMEL_UNMATCHED_NAME) == 0)
|
||||
goto done;
|
||||
|
||||
/* 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;
|
||||
}
|
||||
|
||||
@ -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)
|
||||
|
||||
Reference in New Issue
Block a user