summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMatthew Barnes <mbarnes@redhat.com>2011-01-18 21:27:37 -0500
committerMatthew Barnes <mbarnes@redhat.com>2011-01-18 21:37:26 -0500
commitee21a86b6ea8b84962d878924b2daeb5e3d2087b (patch)
tree08a2816784b117fbfc88e4dae3a4f83c424e09de
parente1420460dd77ac74e9b71161ade1ba00bc755f1e (diff)
downloadevolution-data-server-ee21a86b6ea8b84962d878924b2daeb5e3d2087b.tar.gz
Treat empty cache files as nonexistent.
For some reason, cached mail message files are sometimes winding up as zero-length files. Still need to figure out how this is happening, but in the meantime teach Camel to disregard zero-length cache files.
-rw-r--r--camel/camel-data-cache.c9
-rw-r--r--camel/providers/imapx/camel-imapx-server.c39
2 files changed, 23 insertions, 25 deletions
diff --git a/camel/camel-data-cache.c b/camel/camel-data-cache.c
index f33b9b06c..a72604ce5 100644
--- a/camel/camel-data-cache.c
+++ b/camel/camel-data-cache.c
@@ -420,8 +420,13 @@ camel_data_cache_get (CamelDataCache *cdc,
real = data_cache_path(cdc, FALSE, path, key);
stream = camel_object_bag_reserve(cdc->priv->busy_bag, real);
if (!stream) {
- stream = camel_stream_fs_new_with_name (
- real, O_RDWR, 0600, error);
+ struct stat st;
+
+ /* Return NULL if the file is empty. */
+ if (g_stat (real, &st) == 0 && st.st_size > 0)
+ stream = camel_stream_fs_new_with_name (
+ real, O_RDWR, 0600, error);
+
if (stream)
camel_object_bag_add(cdc->priv->busy_bag, real, stream);
else
diff --git a/camel/providers/imapx/camel-imapx-server.c b/camel/providers/imapx/camel-imapx-server.c
index bde402675..179252d08 100644
--- a/camel/providers/imapx/camel-imapx-server.c
+++ b/camel/providers/imapx/camel-imapx-server.c
@@ -5014,19 +5014,11 @@ imapx_server_get_message (CamelIMAPXServer *is, CamelFolder *folder, CamelOperat
CamelStream *stream = NULL, *tmp_stream;
CamelIMAPXFolder *ifolder = (CamelIMAPXFolder *) folder;
CamelIMAPXJob *job;
- gchar *cache_file = NULL;
CamelMessageInfo *mi;
gboolean registered;
EFlag *flag = NULL;
gboolean success;
- cache_file = camel_data_cache_get_filename (ifolder->cache, "cur", uid, NULL);
- if (g_file_test (cache_file, G_FILE_TEST_EXISTS)) {
- g_free (cache_file);
- return NULL;
- }
- g_free (cache_file);
-
QUEUE_LOCK (is);
if ((job = imapx_is_job_in_queue (is, folder, IMAPX_JOB_GET_MESSAGE, uid))) {
@@ -5039,11 +5031,11 @@ imapx_server_get_message (CamelIMAPXServer *is, CamelFolder *folder, CamelOperat
e_flag_wait (flag);
- stream = camel_data_cache_get (ifolder->cache, "cur", uid, NULL);
- if (!stream)
- g_set_error (
- error, CAMEL_IMAPX_ERROR, 1,
- "Could not retrieve the message");
+ stream = camel_data_cache_get (
+ ifolder->cache, "cur", uid, error);
+ if (stream == NULL)
+ g_prefix_error (
+ error, "Could not retrieve the message: ");
return stream;
}
@@ -5116,12 +5108,17 @@ camel_imapx_server_sync_message (CamelIMAPXServer *is, CamelFolder *folder, cons
gchar *cache_file = NULL;
CamelIMAPXFolder *ifolder = (CamelIMAPXFolder *) folder;
CamelStream *stream;
+ gboolean is_cached;
+ struct stat st;
+
+ /* Check if the cache file already exists and is non-empty. */
+ cache_file = camel_data_cache_get_filename (
+ ifolder->cache, "cur", uid, NULL);
+ is_cached = (g_stat (cache_file, &st) == 0 && st.st_size > 0);
+ g_free (cache_file);
- cache_file = camel_data_cache_get_filename (ifolder->cache, "cur", uid, NULL);
- if (g_file_test (cache_file, G_FILE_TEST_EXISTS)) {
- g_free (cache_file);
+ if (is_cached)
return TRUE;
- }
stream = imapx_server_get_message (is, folder, NULL, uid, IMAPX_PRIORITY_SYNC_MESSAGE, error);
@@ -5172,13 +5169,9 @@ camel_imapx_server_append_message(CamelIMAPXServer *is, CamelFolder *folder, Cam
/* chen cleanup this later */
uid = imapx_get_temp_uid ();
- stream = camel_data_cache_add (ifolder->cache, "new", uid, NULL);
+ stream = camel_data_cache_add (ifolder->cache, "new", uid, error);
if (stream == NULL) {
- g_set_error (
- error, G_IO_ERROR,
- g_io_error_from_errno (errno),
- _("Cannot create spool file: %s"),
- g_strerror (errno));
+ g_prefix_error (error, _("Cannot create spool file: "));
g_free (uid);
return FALSE;
}