OK, new patch attached. * Philip Van Hoof <spam pvanhoof be> [2008-11-13 15:50:56 +0100]: > I know that the existing code didn't do this either, but please use > g_build_filename instead of hardcoding the directory separator as '/' > for new code and patches. > > On Thu, 2008-11-13 at 15:25 +0100, Thomas Guillem wrote: > > Hi, > > > > The attached patch change cache filename in order to be compatible with > > FAT32 Partions, like we discussed on IRC. > > > > Is it OK ? > > > > Regards, > > _______________________________________________ > > tinymail-devel-list mailing list > > tinymail-devel-list gnome org > > http://mail.gnome.org/mailman/listinfo/tinymail-devel-list > -- > Philip Van Hoof, freelance software developer > home: me at pvanhoof dot be > gnome: pvanhoof at gnome dot org > http://pvanhoof.be/blog > http://codeminded.be > -- Thomas Guillem - http://tomoueb.com Etudiant en GI03 (Génie Informatique) à l'UTBM (http://www.utbm.fr)
Index: libtinymail-camel/camel-lite/camel/providers/imap/camel-imap-message-cache.c =================================================================== --- libtinymail-camel/camel-lite/camel/providers/imap/camel-imap-message-cache.c (revision 3801) +++ libtinymail-camel/camel-lite/camel/providers/imap/camel-imap-message-cache.c (working copy) @@ -260,7 +260,6 @@ CamelStream *stream; int fd; -#ifdef G_OS_WIN32 /* Trailing periods in file names are silently dropped on * Win32, argh. The code in this file requires the period to * be there. So in case part_spec is empty, use a tilde (just @@ -268,7 +267,6 @@ */ if (!*part_spec) part_spec = "~"; -#endif *path = g_strdup_printf ("%s/%s.%s", cache->path, uid, part_spec); *key = strrchr (*path, '/') + 1; stream = g_hash_table_lookup (cache->parts, *key); @@ -343,18 +341,42 @@ return insert_finish (cache, uid, path, key, stream); } +static gchar* +cachefile_get(const char *path, const char *uid, const char *part_spec) +{ + gchar *file; + if (part_spec && *part_spec) { + file = g_build_filename(path, uid, part_spec); + } else { + char tmp [512]; + + snprintf(tmp, 512, "%s.~", uid); + file = g_build_filename(path, tmp, NULL); + if (!g_file_test(tmp, G_FILE_TEST_IS_REGULAR)) { + /* Test if old cache file exists (like "uid."*/ + int len = strlen(file); + file [len -1] = '\0'; + if (!g_file_test(file, G_FILE_TEST_IS_REGULAR)) { + file [len -1] = '~'; + } + } + } + return file; +} + void camel_imap_message_cache_set_flags (const gchar *folder_dir, CamelMessageInfoBase *mi) { - char mystring [512]; + gchar *cachefile; if( !folder_dir ){ return; } + cachefile = cachefile_get(folder_dir, mi->uid, NULL); + if (g_file_test (cachefile, G_FILE_TEST_IS_REGULAR)) + { + char mystring [512]; - snprintf (mystring, 512, "%s/%s.", folder_dir, mi->uid); - if (g_file_test (mystring, G_FILE_TEST_IS_REGULAR)) - { mi->flags |= CAMEL_MESSAGE_CACHED; snprintf (mystring, 512, "%s/%s.partial", folder_dir, mi->uid); if (g_file_test (mystring, G_FILE_TEST_IS_REGULAR)) @@ -365,6 +387,7 @@ mi->flags &= ~CAMEL_MESSAGE_CACHED; mi->flags &= ~CAMEL_MESSAGE_PARTIAL; } + g_free(cachefile); } gboolean @@ -557,12 +580,7 @@ if (uid[0] == 0) return NULL; -#ifdef G_OS_WIN32 - /* See comment in insert_setup() */ - if (!*part_spec) - part_spec = "~"; -#endif - path = g_strdup_printf ("%s/%s.%s", cache->path, uid, part_spec); + path = cachefile_get(cache->path, uid, part_spec); key = strrchr (path, '/') + 1; stream = g_hash_table_lookup (cache->parts, key); @@ -735,8 +753,8 @@ void camel_imap_message_cache_replace_cache (CamelImapMessageCache *cache, const char *uid, const char *part_spec, const char *dest_uid, const char *dest_part_spec) { - gchar *real = g_strdup_printf ("%s/%s.%s", cache->path, uid, (part_spec)?part_spec:""); - gchar *dest_real = g_strdup_printf ("%s/%s.%s", cache->path, dest_uid, (dest_part_spec)?dest_part_spec:""); + gchar *real = cachefile_get(cache->path, uid, part_spec); + gchar *dest_real = cachefile_get(cache->path, dest_uid, dest_part_spec); rename (dest_real, real); @@ -747,9 +765,13 @@ void camel_imap_message_cache_delete_attachments (CamelImapMessageCache *cache, const char *uid) { + char filename [512]; + CamelStream *in = camel_imap_message_cache_get (cache, uid, "", NULL); - gchar *real1 = g_strdup_printf ("%s/%s.", cache->path, uid); - gchar *real = g_strdup_printf ("%s.tmp", real1); + gchar *real1 = cachefile_get(cache->path, uid, NULL); + + snprintf(filename, 512, "%s.tmp", uid); + gchar *real = g_build_filename (cache->path, filename, NULL); CamelStream *to = camel_stream_fs_new_with_name (real, O_RDWR|O_CREAT|O_TRUNC, 0600); int n; Index: ChangeLog =================================================================== --- ChangeLog (revision 3801) +++ ChangeLog (working copy) @@ -1,3 +1,10 @@ +2008-11-13 Thomas Guillem <thomas guillem gmail com> + + * libtinymail-camel/camel-lite/camel/providers/imap/camel-imap-message-cache.c: + Change the default cache filename from "uid." to "uid.~" in order to + keep compatibility with FAT32 partitions. (a FAT32 file can't end with '.') + Old cache files ("uid.") are still compatible. + 2008-11-10 Jose Dapena Paz <jdapena igalia com> Complete rework of the lock behavior of Tinymail
Attachment:
pgphywTMrbJ6t.pgp
Description: PGP signature