evolution-data-server/bnc-179350.patch

555 lines
18 KiB
Diff

Index: camel/providers/groupwise/camel-groupwise-folder.c
===================================================================
RCS file: /cvs/gnome/evolution-data-server/camel/providers/groupwise/camel-groupwise-folder.c,v
retrieving revision 1.114.2.12
diff -u -r1.114.2.12 camel-groupwise-folder.c
--- camel/providers/groupwise/camel-groupwise-folder.c 6 Jun 2006 19:51:03 -0000 1.114.2.12
+++ camel/providers/groupwise/camel-groupwise-folder.c 8 Jun 2006 15:32:24 -0000
@@ -63,15 +63,6 @@
#define GROUPWISE_BULK_DELETE_LIMIT 100
static CamelOfflineFolderClass *parent_class = NULL;
-struct _CamelGroupwiseFolderPrivate {
-
-#ifdef ENABLE_THREADS
- EMutex *search_lock; /* for locking the search object */
- EMutex *cache_lock; /* for locking the cache object */
-#endif
-
-};
-
/*prototypes*/
static void groupwise_transfer_messages_to (CamelFolder *source,
GPtrArray *uids,
@@ -94,9 +85,7 @@
#define d(x)
static CamelMimeMessage *
-groupwise_folder_get_message( CamelFolder *folder,
- const char *uid,
- CamelException *ex )
+groupwise_folder_get_message (CamelFolder *folder, const char *uid, CamelException *ex)
{
CamelMimeMessage *msg = NULL;
CamelGroupwiseFolder *gw_folder = CAMEL_GROUPWISE_FOLDER(folder);
@@ -107,11 +96,10 @@
EGwConnectionStatus status;
EGwConnection *cnc;
EGwItem *item;
- CamelStream *stream, *cache_stream;
+ CamelStream *stream;
int errno;
/* see if it is there in cache */
-
mi = (CamelGroupwiseMessageInfo *) camel_folder_summary_uid (folder->summary, uid);
if (mi == NULL) {
camel_exception_setv(ex, CAMEL_EXCEPTION_FOLDER_INVALID_UID,
@@ -119,41 +107,38 @@
return NULL;
}
- cache_stream = camel_data_cache_get (gw_folder->cache, "cache", uid, ex);
- stream = camel_stream_mem_new ();
- if (cache_stream) {
+ CAMEL_SERVICE_LOCK (folder->parent_store, connect_lock);
+
+ if ((stream = camel_data_cache_get (gw_folder->cache, "cache", uid, ex))) {
msg = camel_mime_message_new ();
- camel_stream_reset (stream);
- camel_stream_write_to_stream (cache_stream, stream);
- camel_stream_reset (stream);
if (camel_data_wrapper_construct_from_stream ((CamelDataWrapper *) msg, stream) == -1) {
if (errno == EINTR) {
camel_exception_setv (ex, CAMEL_EXCEPTION_USER_CANCEL, _("User cancelled"));
camel_object_unref (msg);
- camel_object_unref (cache_stream);
camel_object_unref (stream);
camel_message_info_free (&mi->info);
+ CAMEL_SERVICE_UNLOCK (folder->parent_store, connect_lock);
return NULL;
- } else {
- camel_exception_setv (ex, CAMEL_EXCEPTION_SYSTEM, _("Cannot get message %s: %s"),
- uid, g_strerror (errno));
- camel_object_unref (msg);
- msg = NULL;
}
+
+ camel_exception_setv (ex, CAMEL_EXCEPTION_SYSTEM, _("Cannot get message %s: %s"),
+ uid, g_strerror (errno));
+ camel_object_unref (stream);
+ camel_object_unref (msg);
+ msg = NULL;
+ } else {
+ camel_object_unref (stream);
+ camel_message_info_free (&mi->info);
+ CAMEL_SERVICE_UNLOCK (folder->parent_store, connect_lock);
+ return msg;
}
- camel_object_unref (cache_stream);
- }
- camel_object_unref (stream);
-
- if (msg != NULL) {
- camel_message_info_free (&mi->info);
- return msg;
}
if (((CamelOfflineStore *) gw_store)->state == CAMEL_OFFLINE_STORE_NETWORK_UNAVAIL) {
camel_exception_set (ex, CAMEL_EXCEPTION_SERVICE_UNAVAILABLE,
_("This message is not available in offline mode."));
camel_message_info_free (&mi->info);
+ CAMEL_SERVICE_UNLOCK (folder->parent_store, connect_lock);
return NULL;
}
@@ -162,6 +147,7 @@
camel_exception_set (ex, CAMEL_EXCEPTION_SERVICE_UNAVAILABLE,
_("This message is not available in offline mode."));
camel_message_info_free (&mi->info);
+ CAMEL_SERVICE_UNLOCK (folder->parent_store, connect_lock);
return NULL;
}
@@ -173,6 +159,7 @@
g_free (container_id);
camel_exception_set (ex, CAMEL_EXCEPTION_SERVICE_INVALID, _("Could not get message"));
camel_message_info_free (&mi->info);
+ CAMEL_SERVICE_UNLOCK (folder->parent_store, connect_lock);
return NULL;
}
@@ -181,30 +168,30 @@
camel_exception_set (ex, CAMEL_EXCEPTION_SERVICE_INVALID, _("Could not get message"));
g_free (container_id);
camel_message_info_free (&mi->info);
-
+ CAMEL_SERVICE_UNLOCK (folder->parent_store, connect_lock);
return NULL;
}
- if (msg)
- camel_medium_set_header (CAMEL_MEDIUM (msg), "X-Evolution-Source", groupwise_base_url_lookup (priv));
+ camel_medium_set_header (CAMEL_MEDIUM (msg), "X-Evolution-Source", groupwise_base_url_lookup (priv));
- if(!strcmp (folder->full_name, "Sent Items"))
+ if (!strcmp (folder->full_name, "Sent Items"))
goto end; /*Dont cache if its sent items, since we need to Track Status*/
/* add to cache */
- CAMEL_GROUPWISE_FOLDER_LOCK (folder, cache_lock);
- if ((cache_stream = camel_data_cache_add (gw_folder->cache, "cache", uid, NULL))) {
- if (camel_data_wrapper_write_to_stream ((CamelDataWrapper *) msg, cache_stream) == -1
- || camel_stream_flush (cache_stream) == -1)
+ if ((stream = camel_data_cache_add (gw_folder->cache, "cache", uid, NULL))) {
+ if (camel_data_wrapper_write_to_stream ((CamelDataWrapper *) msg, stream) == -1
+ || camel_stream_flush (stream) == -1)
camel_data_cache_remove (gw_folder->cache, "cache", uid, NULL);
- camel_object_unref (cache_stream);
+ camel_object_unref (stream);
}
-
- CAMEL_GROUPWISE_FOLDER_UNLOCK (folder, cache_lock);
end:
+
camel_message_info_free (&mi->info);
g_free (container_id);
+
+ CAMEL_SERVICE_UNLOCK (folder->parent_store, connect_lock);
+
return msg;
}
@@ -411,18 +398,20 @@
summary_path = g_strdup_printf ("%s/summary", folder_dir);
- CAMEL_GROUPWISE_FOLDER_LOCK (folder, cache_lock);
+ CAMEL_SERVICE_LOCK (folder->parent_store, connect_lock);
+
g_free (gw_folder->cache->path);
gw_folder->cache->path = g_strdup (folder_dir);
- CAMEL_GROUPWISE_FOLDER_UNLOCK (folder, cache_lock);
-
+
((CamelFolderClass *)parent_class)->rename(folder, new);
camel_folder_summary_set_filename (folder->summary, summary_path);
-
+
state_file = g_strdup_printf ("%s/cmeta", folder_dir);
camel_object_set(folder, NULL, CAMEL_OBJECT_STATE_FILE, state_file, NULL);
g_free (state_file);
-
+
+ CAMEL_SERVICE_UNLOCK (folder->parent_store, connect_lock);
+
g_free (summary_path);
g_free (folder_dir);
}
@@ -433,10 +422,12 @@
CamelGroupwiseFolder *gw_folder = CAMEL_GROUPWISE_FOLDER(folder);
GPtrArray *matches;
- CAMEL_GROUPWISE_FOLDER_LOCK(folder, search_lock);
+ CAMEL_SERVICE_LOCK (folder->parent_store, connect_lock);
+
camel_folder_search_set_folder (gw_folder->search, folder);
matches = camel_folder_search_search(gw_folder->search, expression, NULL, ex);
- CAMEL_GROUPWISE_FOLDER_UNLOCK(gw_folder, search_lock);
+
+ CAMEL_SERVICE_UNLOCK (folder->parent_store, connect_lock);
return matches;
}
@@ -450,12 +441,12 @@
if (uids->len == 0)
return g_ptr_array_new();
- CAMEL_GROUPWISE_FOLDER_LOCK(folder, search_lock);
-
+ CAMEL_SERVICE_LOCK (folder->parent_store, connect_lock);
+
camel_folder_search_set_folder(gw_folder->search, folder);
matches = camel_folder_search_search(gw_folder->search, expression, uids, ex);
- CAMEL_GROUPWISE_FOLDER_UNLOCK(gw_folder, search_lock);
+ CAMEL_SERVICE_UNLOCK (folder->parent_store, connect_lock);
return matches;
}
@@ -467,12 +458,11 @@
g_return_if_fail (gw_folder->search);
- CAMEL_GROUPWISE_FOLDER_LOCK(folder, search_lock);
+ CAMEL_SERVICE_LOCK (folder->parent_store, connect_lock);
camel_folder_search_free_result (gw_folder->search, uids);
-
- CAMEL_GROUPWISE_FOLDER_UNLOCK(gw_folder, search_lock);
+ CAMEL_SERVICE_UNLOCK (folder->parent_store, connect_lock);
}
/******************* functions specific to Junk Mail Handling**************/
@@ -596,31 +586,29 @@
EGwConnectionStatus status;
EGwConnection *cnc;
int count, i;
-
GList *deleted_items, *deleted_head = NULL;
deleted_items = NULL;
-
-
+
+ CAMEL_SERVICE_LOCK (gw_store, connect_lock);
+
if (((CamelOfflineStore *) gw_store)->state == CAMEL_OFFLINE_STORE_NETWORK_UNAVAIL ||
((CamelService *)gw_store)->status == CAMEL_SERVICE_DISCONNECTED) {
groupwise_sync_summary (folder, ex);
+ CAMEL_SERVICE_UNLOCK (gw_store, connect_lock);
return;
}
cnc = cnc_lookup (priv);
container_id = camel_groupwise_store_container_id_lookup (gw_store, folder->full_name) ;
-
- CAMEL_SERVICE_LOCK (gw_store, connect_lock);
+
if (!camel_groupwise_store_connected (gw_store, ex)) {
CAMEL_SERVICE_UNLOCK (gw_store, connect_lock);
camel_exception_clear (ex);
return;
}
- CAMEL_SERVICE_UNLOCK (gw_store, connect_lock);
-
+
count = camel_folder_summary_count (folder->summary);
- CAMEL_GROUPWISE_FOLDER_LOCK (folder, cache_lock);
for (i=0 ; i <count ; i++) {
guint32 flags = 0;
info = camel_folder_summary_index (folder->summary, i);
@@ -659,17 +647,13 @@
}
if (g_list_length (deleted_items) == GROUPWISE_BULK_DELETE_LIMIT ) {
- CAMEL_SERVICE_LOCK (gw_store, connect_lock);
status = e_gw_connection_remove_items (cnc, container_id, deleted_items);
- CAMEL_SERVICE_UNLOCK (gw_store, connect_lock);
if (status == E_GW_CONNECTION_STATUS_OK) {
char *uid;
while (deleted_items) {
uid = (char *)deleted_items->data;
- CAMEL_GROUPWISE_FOLDER_LOCK (folder, cache_lock);
camel_folder_summary_remove_uid (folder->summary, uid);
camel_data_cache_remove(gw_folder->cache, "cache", uid, ex);
- CAMEL_GROUPWISE_FOLDER_UNLOCK (folder, cache_lock);
deleted_items = g_list_next (deleted_items);
count -= GROUPWISE_BULK_DELETE_LIMIT;
i -= GROUPWISE_BULK_DELETE_LIMIT;
@@ -681,19 +665,15 @@
}
camel_message_info_free (info);
}
- CAMEL_GROUPWISE_FOLDER_UNLOCK (folder, cache_lock);
+
if (deleted_items) {
- CAMEL_SERVICE_LOCK (gw_store, connect_lock);
status = e_gw_connection_remove_items (cnc, container_id, deleted_items);
- CAMEL_SERVICE_UNLOCK (gw_store, connect_lock);
if (status == E_GW_CONNECTION_STATUS_OK) {
char *uid;
while (deleted_items) {
uid = (char *)deleted_items->data;
- CAMEL_GROUPWISE_FOLDER_LOCK (folder, cache_lock);
camel_folder_summary_remove_uid (folder->summary, uid);
camel_data_cache_remove(gw_folder->cache, "cache", uid, ex);
- CAMEL_GROUPWISE_FOLDER_UNLOCK (folder, cache_lock);
deleted_items = g_list_next (deleted_items);
count -= GROUPWISE_BULK_DELETE_LIMIT;
i -= GROUPWISE_BULK_DELETE_LIMIT;
@@ -702,23 +682,17 @@
g_list_free (deleted_head);
}
- if (read_items && g_list_length (read_items)) {
- CAMEL_SERVICE_LOCK (gw_store, connect_lock);
+ if (read_items && g_list_length (read_items))
e_gw_connection_mark_read (cnc, read_items);
- CAMEL_SERVICE_UNLOCK (gw_store, connect_lock);
- }
-
+
if (expunge) {
- CAMEL_SERVICE_LOCK (gw_store, connect_lock);
status = e_gw_connection_purge_deleted_items (cnc);
- if (status == E_GW_CONNECTION_STATUS_OK) {
+ if (status == E_GW_CONNECTION_STATUS_OK)
g_message ("Purged deleted items in %s", folder->name);
- }
- CAMEL_SERVICE_UNLOCK (gw_store, connect_lock);
}
-
- CAMEL_SERVICE_LOCK (gw_store, connect_lock);
+
groupwise_sync_summary (folder, ex);
+
CAMEL_SERVICE_UNLOCK (gw_store, connect_lock);
}
@@ -732,7 +706,6 @@
char *summary_file, *state_file, *journal_file;
char *short_name;
-
folder = CAMEL_FOLDER (camel_object_new(camel_groupwise_folder_get_type ()) );
gw_folder = CAMEL_GROUPWISE_FOLDER(folder);
@@ -1063,7 +1036,7 @@
gw_update_cache (folder, list, ex, FALSE);
}
}
-
+
CAMEL_SERVICE_UNLOCK (gw_store, connect_lock);
is_locked = FALSE;
@@ -1097,7 +1070,6 @@
end1:
if (is_locked)
CAMEL_SERVICE_UNLOCK (gw_store, connect_lock);
- return;
}
static void
@@ -1318,7 +1290,6 @@
mail_msg = groupwise_folder_item_to_msg (folder, item, ex);
if (mail_msg)
camel_medium_set_header (CAMEL_MEDIUM (mail_msg), "X-Evolution-Source", groupwise_base_url_lookup (priv));
- CAMEL_GROUPWISE_FOLDER_LOCK (folder, cache_lock);
if ((cache_stream = camel_data_cache_add (gw_folder->cache, "cache", id, NULL))) {
if (camel_data_wrapper_write_to_stream ((CamelDataWrapper *) mail_msg, cache_stream) == -1 || camel_stream_flush (cache_stream) == -1)
camel_data_cache_remove (gw_folder->cache, "cache", id, NULL);
@@ -1326,7 +1297,6 @@
}
camel_object_unref (mail_msg);
- CAMEL_GROUPWISE_FOLDER_UNLOCK (folder, cache_lock);
}
/******************** Caching stuff ends *************************/
i++;
@@ -1720,6 +1690,7 @@
static void
gw_update_all_items ( CamelFolder *folder, GList *item_list, CamelException *ex)
{
+ CamelGroupwiseStore *gw_store = CAMEL_GROUPWISE_STORE (folder->parent_store);
CamelGroupwiseFolder *gw_folder = CAMEL_GROUPWISE_FOLDER (folder);
GPtrArray *summary = NULL;
int index = 0;
@@ -1741,11 +1712,11 @@
temp = g_list_find_custom (item_list, (const char *)info->uid, (GCompareFunc) strcmp);
}
if (!temp) {
- CAMEL_GROUPWISE_FOLDER_LOCK (folder, cache_lock);
+ CAMEL_SERVICE_LOCK (gw_store, connect_lock);
camel_folder_summary_remove_uid (folder->summary, info->uid);
camel_data_cache_remove (gw_folder->cache, "cache", info->uid, ex);
camel_folder_change_info_remove_uid (changes, info->uid);
- CAMEL_GROUPWISE_FOLDER_UNLOCK (folder, cache_lock);
+ CAMEL_SERVICE_UNLOCK (gw_store, connect_lock);
} else {
item_list = g_list_delete_link (item_list, temp);
}
@@ -1754,8 +1725,6 @@
camel_object_trigger_event (folder, "folder_changed", changes);
if (item_list) {
- CamelGroupwiseStore *gw_store = CAMEL_GROUPWISE_STORE (folder->parent_store);
-
CAMEL_SERVICE_LOCK (gw_store, connect_lock);
gw_update_cache (folder, item_list, ex, TRUE);
CAMEL_SERVICE_UNLOCK (gw_store, connect_lock);
@@ -1801,6 +1770,7 @@
cnc = cnc_lookup (priv);
CAMEL_SERVICE_LOCK (folder->parent_store, connect_lock);
+
/*Get the container id*/
container_id = camel_groupwise_store_container_id_lookup (gw_store, folder->full_name) ;
@@ -1974,15 +1944,15 @@
int i, max;
gboolean delete = FALSE;
GList *deleted_items, *deleted_head = NULL;
-
deleted_items = NULL;
cnc = cnc_lookup (priv);
if (!cnc)
return;
-
+
+ CAMEL_SERVICE_LOCK (groupwise_store, connect_lock);
+
if (!strcmp (folder->full_name, "Trash")) {
- CAMEL_SERVICE_LOCK (groupwise_store, connect_lock);
status = e_gw_connection_purge_deleted_items (cnc);
if (status == E_GW_CONNECTION_STATUS_OK) {
camel_folder_freeze (folder);
@@ -1997,7 +1967,7 @@
changes = camel_folder_change_info_new ();
container_id = g_strdup (camel_groupwise_store_container_id_lookup (groupwise_store, folder->full_name)) ;
-
+
max = camel_folder_summary_count (folder->summary);
for (i = 0; i < max; i++) {
info = camel_folder_summary_index (folder->summary, i);
@@ -2013,18 +1983,14 @@
}
if (g_list_length (deleted_items) == GROUPWISE_BULK_DELETE_LIMIT ) {
/* Read the FIXME below */
- CAMEL_SERVICE_LOCK (groupwise_store, connect_lock);
status = e_gw_connection_remove_items (cnc, container_id, deleted_items);
- CAMEL_SERVICE_UNLOCK (groupwise_store, connect_lock);
if (status == E_GW_CONNECTION_STATUS_OK) {
char *uid;
while (deleted_items) {
uid = (char *)deleted_items->data;
- CAMEL_GROUPWISE_FOLDER_LOCK (folder, cache_lock);
camel_folder_change_info_remove_uid (changes, uid);
camel_folder_summary_remove_uid (folder->summary, uid);
camel_data_cache_remove(gw_folder->cache, "cache", uid, ex);
- CAMEL_GROUPWISE_FOLDER_UNLOCK (folder, cache_lock);
deleted_items = g_list_next (deleted_items);
max -= GROUPWISE_BULK_DELETE_LIMIT;
i -= GROUPWISE_BULK_DELETE_LIMIT;
@@ -2038,18 +2004,14 @@
if (deleted_items) {
/* FIXME: Put these in a function and reuse it inside the above loop, here and in groupwise_sync*/
- CAMEL_SERVICE_LOCK (groupwise_store, connect_lock);
status = e_gw_connection_remove_items (cnc, container_id, deleted_items);
- CAMEL_SERVICE_UNLOCK (groupwise_store, connect_lock);
if (status == E_GW_CONNECTION_STATUS_OK) {
char *uid;
while (deleted_items) {
uid = (char *)deleted_items->data;
- CAMEL_GROUPWISE_FOLDER_LOCK (folder, cache_lock);
camel_folder_change_info_remove_uid (changes, uid);
camel_folder_summary_remove_uid (folder->summary, uid);
camel_data_cache_remove(gw_folder->cache, "cache", uid, ex);
- CAMEL_GROUPWISE_FOLDER_UNLOCK (folder, cache_lock);
deleted_items = g_list_next (deleted_items);
}
}
@@ -2063,6 +2025,8 @@
g_free (container_id);
camel_folder_change_info_free (changes);
+
+ CAMEL_SERVICE_UNLOCK (groupwise_store, connect_lock);
}
@@ -2093,18 +2057,11 @@
CamelGroupwiseFolder *gw_folder = CAMEL_GROUPWISE_FOLDER (object);
CamelFolder *folder = CAMEL_FOLDER (object);
-
folder->permanent_flags = CAMEL_MESSAGE_ANSWERED | CAMEL_MESSAGE_DELETED |
CAMEL_MESSAGE_DRAFT | CAMEL_MESSAGE_FLAGGED | CAMEL_MESSAGE_SEEN;
folder->folder_flags = CAMEL_FOLDER_HAS_SUMMARY_CAPABILITY | CAMEL_FOLDER_HAS_SEARCH_CAPABILITY;
- gw_folder->priv = g_malloc0 (sizeof(*gw_folder->priv));
-
-#ifdef ENABLE_THREADS
- gw_folder->priv->search_lock = e_mutex_new(E_MUTEX_SIMPLE);
- gw_folder->priv->cache_lock = e_mutex_new(E_MUTEX_REC);
-#endif
gw_folder->need_rescan = TRUE;
}
@@ -2112,21 +2069,17 @@
camel_groupwise_folder_finalize (CamelObject *object)
{
CamelGroupwiseFolder *gw_folder = CAMEL_GROUPWISE_FOLDER (object);
-
- if (gw_folder->priv)
- g_free(gw_folder->priv);
+
if (gw_folder->cache)
camel_object_unref (gw_folder->cache);
if (gw_folder->search)
camel_object_unref (gw_folder->search);
-
}
CamelType
camel_groupwise_folder_get_type (void)
{
static CamelType camel_groupwise_folder_type = CAMEL_INVALID_TYPE;
-
if (camel_groupwise_folder_type == CAMEL_INVALID_TYPE) {
camel_groupwise_folder_type =
Index: camel/providers/groupwise/camel-groupwise-folder.h
===================================================================
RCS file: /cvs/gnome/evolution-data-server/camel/providers/groupwise/camel-groupwise-folder.h,v
retrieving revision 1.8
diff -u -r1.8 camel-groupwise-folder.h
--- camel/providers/groupwise/camel-groupwise-folder.h 31 Aug 2005 04:26:07 -0000 1.8
+++ camel/providers/groupwise/camel-groupwise-folder.h 8 Jun 2006 15:32:24 -0000
@@ -54,8 +54,6 @@
struct _CamelGroupwiseFolder {
CamelOfflineFolder parent_object;
- struct _CamelGroupwiseFolderPrivate *priv;
-
CamelFolderSearch *search;
CamelOfflineJournal *journal;