On Fri, 2006-07-14 at 19:23 +0200, Philip Van Hoof wrote: > While the x86 handles unaligned access, ARM doesn't. The patch will not > work on architectures that don't handle unaligned access. > > I will try to fix it, but I don't have a lot experience in this field.
Second attempt to introduce data alignment. It's still getting Killed on the Nokia 770 ARM device. Regretfully I don't have a debugger for that device. In my hexeditor it looks like all of the summary file is now aligned to 4 bytes (or at least something is aligned to 4 bytes). There's also no dmesg message on the device when the kill happens. Could use some assistance from an expert in this field ;-) (I'm not) -- Philip Van Hoof, software developer at x-tend home: me at pvanhoof dot be gnome: pvanhoof at gnome dot org work: vanhoof at x-tend dot be http://www.pvanhoof.be - http://www.x-tend.be
? camel-mime-tables.c ? providers/groupwise/.deps ? providers/groupwise/.libs ? providers/groupwise/camel-groupwise-folder.lo ? providers/groupwise/camel-groupwise-journal.lo ? providers/groupwise/camel-groupwise-provider.lo ? providers/groupwise/camel-groupwise-store-summary.lo ? providers/groupwise/camel-groupwise-store.lo ? providers/groupwise/camel-groupwise-summary.lo ? providers/groupwise/camel-groupwise-transport.lo ? providers/groupwise/camel-groupwise-utils.lo ? providers/groupwise/libcamelgroupwise.la ? providers/hula/.deps ? providers/hula/.libs ? providers/hula/camel-hula-provider.lo ? providers/hula/libcamelhula.la Index: camel-file-utils.c =================================================================== RCS file: /cvs/gnome/evolution-data-server/camel/camel-file-utils.c,v retrieving revision 1.17 diff -u -p -r1.17 camel-file-utils.c --- camel-file-utils.c 2 Jun 2006 00:52:29 -0000 1.17 +++ camel-file-utils.c 15 Jul 2006 10:18:26 -0000 @@ -49,135 +49,120 @@ #define IO_TIMEOUT (60*4) + /** - * camel_file_util_encode_uint32: + * camel_file_util_encode_fixed_int32: * @out: file to output to * @value: value to output * - * Utility function to save an uint32 to a file. + * Encode a gint32, performing no compression, but converting + * to network order. * * Return value: 0 on success, -1 on error. **/ int -camel_file_util_encode_uint32 (FILE *out, guint32 value) +camel_file_util_encode_fixed_int32 (FILE *out, gint32 value) { - int i; + guint32 save; - for (i = 28; i > 0; i -= 7) { - if (value >= (1 << i)) { - unsigned int c = (value >> i) & 0x7f; - if (fputc (c, out) == -1) - return -1; - } - } - return fputc (value | 0x80, out); + save = g_htonl (value); + if (fwrite (&save, sizeof (save), 1, out) != 1) + return -1; + return 0; } /** - * camel_file_util_decode_uint32: + * camel_file_util_decode_fixed_int32: * @in: file to read from * @dest: pointer to a variable to store the value in * - * Retrieve an encoded uint32 from a file. + * Retrieve a gint32. * - * Return value: 0 on success, -1 on error. @*dest will contain the - * decoded value. + * Return value: 0 on success, -1 on error. **/ int -camel_file_util_decode_uint32 (FILE *in, guint32 *dest) +camel_file_util_decode_fixed_int32 (FILE *in, gint32 *dest) { - guint32 value = 0; - int v; + guint32 save; - /* until we get the last byte, keep decoding 7 bits at a time */ - while ( ((v = fgetc (in)) & 0x80) == 0 && v!=EOF) { - value |= v; - value <<= 7; - } - if (v == EOF) { - *dest = value >> 7; + if (fread (&save, sizeof (save), 1, in) == 1) { + *dest = g_ntohl (save); + return 0; + } else { return -1; } - *dest = value | (v & 0x7f); - - return 0; } /** - * camel_file_util_encode_fixed_int32: + * camel_file_util_encode_uint32: * @out: file to output to * @value: value to output * - * Encode a gint32, performing no compression, but converting - * to network order. + * Utility function to save an uint32 to a file. * * Return value: 0 on success, -1 on error. **/ int -camel_file_util_encode_fixed_int32 (FILE *out, gint32 value) +camel_file_util_encode_uint32 (FILE *out, guint32 value) { - guint32 save; - - save = g_htonl (value); - if (fwrite (&save, sizeof (save), 1, out) != 1) - return -1; - return 0; + return camel_file_util_encode_fixed_int32 (out, value); } /** - * camel_file_util_decode_fixed_int32: + * camel_file_util_decode_uint32: * @in: file to read from * @dest: pointer to a variable to store the value in * - * Retrieve a gint32. + * Retrieve an encoded uint32 from a file. * - * Return value: 0 on success, -1 on error. + * Return value: 0 on success, -1 on error. @*dest will contain the + * decoded value. **/ int -camel_file_util_decode_fixed_int32 (FILE *in, gint32 *dest) +camel_file_util_decode_uint32 (FILE *in, guint32 *dest) { - guint32 save; + return camel_file_util_decode_fixed_int32 (in, (gint32*)dest); +} - if (fread (&save, sizeof (save), 1, in) == 1) { - *dest = g_ntohl (save); - return 0; - } else { - return -1; - } + +unsigned char* +camel_file_util_mmap_decode_uint32 (unsigned char *start, guint32 *dest, gboolean is_string) +{ + guint32 value = 0; + unsigned char *retval; + guint32 *ptr32 = (guint32*)start; + + value = g_ntohl (*ptr32); ptr32++; + start = (unsigned char*) ptr32; + retval = start; + + *dest = value; + return retval; } -#define CFU_ENCODE_T(type) \ -int \ -camel_file_util_encode_##type(FILE *out, type value) \ -{ \ - int i; \ - \ - for (i = sizeof (type) - 1; i >= 0; i--) { \ - if (fputc((value >> (i * 8)) & 0xff, out) == -1) \ - return -1; \ - } \ - return 0; \ +#define CFU_ENCODE_T(type) \ +int \ +camel_file_util_encode_##type(FILE *out, type value) \ +{ \ + return camel_file_util_encode_fixed_int32 (out, (guint32) value); \ } -#define CFU_DECODE_T(type) \ -int \ -camel_file_util_decode_##type(FILE *in, type *dest) \ -{ \ - type save = 0; \ - int i = sizeof(type) - 1; \ - int v = EOF; \ - \ - while (i >= 0 && (v = fgetc (in)) != EOF) { \ - save |= ((type)v) << (i * 8); \ - i--; \ - } \ - *dest = save; \ - if (v == EOF) \ - return -1; \ - return 0; \ +#define CFU_DECODE_T(type) \ +int \ +camel_file_util_decode_##type(FILE *in, type *dest) \ +{ \ + return camel_file_util_decode_fixed_int32 (in, (gint32*) dest); \ +} + + +#define MMAP_DECODE_T(type) \ +unsigned char* \ +camel_file_util_mmap_decode_##type(unsigned char *start, type *dest) \ +{ \ + return camel_file_util_mmap_decode_uint32 (start, (guint32*) dest, FALSE); \ } @@ -202,6 +187,7 @@ CFU_ENCODE_T(time_t) * Return value: 0 on success, -1 on error. **/ CFU_DECODE_T(time_t) +MMAP_DECODE_T(time_t) /** * camel_file_util_encode_off_t: @@ -225,6 +211,7 @@ CFU_ENCODE_T(off_t) * Return value: 0 on success, -1 on failure. **/ CFU_DECODE_T(off_t) +MMAP_DECODE_T(off_t) /** * camel_file_util_encode_size_t: @@ -248,6 +235,7 @@ CFU_ENCODE_T(size_t) * Return value: 0 on success, -1 on failure. **/ CFU_DECODE_T(size_t) +MMAP_DECODE_T(size_t) /** @@ -262,18 +250,34 @@ CFU_DECODE_T(size_t) int camel_file_util_encode_string (FILE *out, const char *str) { - register int len; + register int lena, len; if (str == NULL) - return camel_file_util_encode_uint32 (out, 1); - - if ((len = strlen (str)) > 65536) - len = 65536; - - if (camel_file_util_encode_uint32 (out, len+1) == -1) - return -1; - if (len == 0 || fwrite (str, len, 1, out) == 1) + { + if (camel_file_util_encode_uint32 (out, 0) == -1) + return -1; + return 0; + } + + lena = len = strlen (str) + 1; + + if (lena % G_MEM_ALIGN) + lena += G_MEM_ALIGN - (lena % G_MEM_ALIGN); + + if (camel_file_util_encode_uint32 (out, lena) == -1) + return -1; + + if (fwrite (str, len, 1, out) == 1) + { + if (lena > len) + { + if (fwrite ("\0\0\0\0\0\0\0\0", lena-len, 1, out) == 1) + return 0; + else return -1; + } + } + return -1; } @@ -298,12 +302,6 @@ camel_file_util_decode_string (FILE *in, return -1; } - len--; - if (len > 65536) { - *str = NULL; - return -1; - } - ret = g_malloc (len+1); if (len > 0 && fread (ret, len, 1, in) != 1) { g_free (ret); @@ -313,6 +311,7 @@ camel_file_util_decode_string (FILE *in, ret[len] = 0; *str = ret; + return 0; } Index: camel-file-utils.h =================================================================== RCS file: /cvs/gnome/evolution-data-server/camel/camel-file-utils.h,v retrieving revision 1.11 diff -u -p -r1.11 camel-file-utils.h --- camel-file-utils.h 10 Jan 2006 07:56:46 -0000 1.11 +++ camel-file-utils.h 15 Jul 2006 10:18:26 -0000 @@ -46,6 +46,7 @@ int camel_file_util_encode_fixed_int32 ( int camel_file_util_decode_fixed_int32 (FILE *in, gint32 *); int camel_file_util_encode_uint32 (FILE *out, guint32); int camel_file_util_decode_uint32 (FILE *in, guint32 *); + int camel_file_util_encode_time_t (FILE *out, time_t); int camel_file_util_decode_time_t (FILE *in, time_t *); int camel_file_util_encode_off_t (FILE *out, off_t); @@ -54,6 +55,11 @@ int camel_file_util_encode_size_t (FILE int camel_file_util_decode_size_t (FILE *in, size_t *); int camel_file_util_encode_string (FILE *out, const char *); int camel_file_util_decode_string (FILE *in, char **); + +unsigned char* camel_file_util_mmap_decode_time_t(unsigned char *start, time_t *dest); +unsigned char* camel_file_util_mmap_decode_off_t(unsigned char *start, off_t *dest); +unsigned char* camel_file_util_mmap_decode_size_t(unsigned char *start, size_t *dest); +unsigned char* camel_file_util_mmap_decode_uint32 (unsigned char *start, guint32 *dest, gboolean is_string); char *camel_file_util_safe_filename (const char *name); Index: camel-folder-summary.c =================================================================== RCS file: /cvs/gnome/evolution-data-server/camel/camel-folder-summary.c,v retrieving revision 1.149 diff -u -p -r1.149 camel-folder-summary.c --- camel-folder-summary.c 6 Jul 2006 19:43:46 -0000 1.149 +++ camel-folder-summary.c 15 Jul 2006 10:18:30 -0000 @@ -50,6 +50,7 @@ #include "camel-stream-null.h" #include "camel-stream-filter.h" #include "camel-string-utils.h" +#include "camel-disco-folder.h" #include "libedataserver/md5-utils.h" #include "libedataserver/e-memory.h" @@ -66,15 +67,15 @@ static pthread_mutex_t info_lock = PTHRE /* this should probably be conditional on it existing */ #define USE_BSEARCH -#define d(x) +#define d(x) #define io(x) /* io debug */ -#define w(x) +#define w(x) #if 0 extern int strdup_count, malloc_count, free_count; #endif -#define CAMEL_FOLDER_SUMMARY_VERSION (13) +#define CAMEL_FOLDER_SUMMARY_VERSION (15) #define _PRIVATE(o) (((CamelFolderSummary *)(o))->priv) @@ -86,13 +87,13 @@ struct _node { static struct _node *my_list_append(struct _node **list, struct _node *n); static int my_list_size(struct _node **list); -static int summary_header_load(CamelFolderSummary *, FILE *); -static int summary_header_save(CamelFolderSummary *, FILE *); +static int summary_header_load(CamelFolderSummary *, FILE *in); +static int summary_header_save(CamelFolderSummary *, FILE *out); static CamelMessageInfo * message_info_new_from_header(CamelFolderSummary *, struct _camel_header_raw *); static CamelMessageInfo * message_info_new_from_parser(CamelFolderSummary *, CamelMimeParser *); static CamelMessageInfo * message_info_new_from_message(CamelFolderSummary *s, CamelMimeMessage *msg); -static CamelMessageInfo * message_info_load(CamelFolderSummary *, FILE *); +static CamelMessageInfo * message_info_load(CamelFolderSummary *, FILE *in); static int message_info_save(CamelFolderSummary *, FILE *, CamelMessageInfo *); static void message_info_free(CamelFolderSummary *, CamelMessageInfo *); @@ -138,6 +139,7 @@ camel_folder_summary_init (CamelFolderSu s->time = 0; s->nextuid = 1; + s->messages = g_ptr_array_new(); s->messages_uid = g_hash_table_new(g_str_hash, g_str_equal); @@ -160,6 +162,11 @@ camel_folder_summary_finalize (CamelObje struct _CamelFolderSummaryPrivate *p; CamelFolderSummary *s = (CamelFolderSummary *)obj; + + if (s->file) + g_mapped_file_free (s->file); + s->file = NULL; + p = _PRIVATE(obj); camel_folder_summary_clear(s); @@ -236,7 +243,7 @@ camel_folder_summary_new (struct _CamelF CamelFolderSummary *new = CAMEL_FOLDER_SUMMARY ( camel_object_new (camel_folder_summary_get_type ())); new->folder = folder; - + return new; } @@ -504,17 +511,24 @@ perform_content_info_load(CamelFolderSum int i; guint32 count; CamelMessageContentInfo *ci, *part; + unsigned char *ptrchr = s->filepos; ci = ((CamelFolderSummaryClass *)(CAMEL_OBJECT_GET_CLASS(s)))->content_info_load(s, in); + if (ci == NULL) return NULL; - if (camel_file_util_decode_uint32(in, &count) == -1 || count > 500) { + ptrchr = s->filepos; + ptrchr = camel_file_util_mmap_decode_uint32 ((unsigned char*)ptrchr, &count, FALSE); + s->filepos = ptrchr; + + if (count > 500) { camel_folder_summary_content_info_free(s, ci); return NULL; } for (i=0;i<count;i++) { + part = perform_content_info_load(s, in); if (part) { my_list_append((struct _node **)&ci->childs, (struct _node *)part); @@ -540,31 +554,34 @@ perform_content_info_load(CamelFolderSum int camel_folder_summary_load(CamelFolderSummary *s) { - FILE *in; int i; CamelMessageInfo *mi; - if (s->summary_path == NULL) - return 0; - in = g_fopen(s->summary_path, "rb"); - if (in == NULL) - return -1; + if (s->summary_path == NULL || !g_file_test (s->summary_path, G_FILE_TEST_EXISTS | G_FILE_TEST_IS_REGULAR)) + return 0; CAMEL_SUMMARY_LOCK(s, io_lock); - if ( ((CamelFolderSummaryClass *)(CAMEL_OBJECT_GET_CLASS(s)))->summary_header_load(s, in) == -1) + + if (!s->file) + s->file = g_mapped_file_new (s->summary_path, FALSE, NULL); + + s->filepos = g_mapped_file_get_contents (s->file); + + if ( ((CamelFolderSummaryClass *)(CAMEL_OBJECT_GET_CLASS(s)))->summary_header_load(s, NULL) == -1) goto error; /* now read in each message ... */ for (i=0;i<s->saved_count;i++) { - mi = ((CamelFolderSummaryClass *)(CAMEL_OBJECT_GET_CLASS(s)))->message_info_load(s, in); + mi = ((CamelFolderSummaryClass *)(CAMEL_OBJECT_GET_CLASS(s)))->message_info_load(s, NULL); if (mi == NULL) goto error; /* FIXME: this should be done differently, how i don't know */ + if (s->build_content) { - ((CamelMessageInfoBase *)mi)->content = perform_content_info_load(s, in); + ((CamelMessageInfoBase *)mi)->content = perform_content_info_load(s, NULL); if (((CamelMessageInfoBase *)mi)->content == NULL) { camel_message_info_free(mi); goto error; @@ -574,13 +591,12 @@ camel_folder_summary_load(CamelFolderSum camel_folder_summary_add(s, mi); } + CAMEL_SUMMARY_UNLOCK(s, io_lock); - - if (fclose (in) != 0) - return -1; s->flags &= ~CAMEL_SUMMARY_DIRTY; + return 0; error: @@ -588,7 +604,6 @@ error: g_warning ("Cannot load summary file: `%s': %s", s->summary_path, g_strerror (errno)); CAMEL_SUMMARY_UNLOCK(s, io_lock); - fclose (in); s->flags |= ~CAMEL_SUMMARY_DIRTY; return -1; @@ -646,6 +661,7 @@ camel_folder_summary_save(CamelFolderSum fd = g_open(path, O_RDWR|O_CREAT|O_TRUNC|O_BINARY, 0600); if (fd == -1) return -1; + out = fdopen(fd, "wb"); if (out == NULL) { i = errno; @@ -678,10 +694,11 @@ camel_folder_summary_save(CamelFolderSum if (fflush (out) != 0 || fsync (fileno (out)) == -1) goto exception; + + CAMEL_SUMMARY_UNLOCK(s, io_lock); fclose (out); - - CAMEL_SUMMARY_UNLOCK(s, io_lock); + #ifdef G_OS_WIN32 g_unlink(s->summary_path); @@ -694,19 +711,21 @@ camel_folder_summary_save(CamelFolderSum } s->flags &= ~CAMEL_SUMMARY_DIRTY; + return 0; exception: + + CAMEL_SUMMARY_UNLOCK(s, io_lock); i = errno; fclose (out); - - CAMEL_SUMMARY_UNLOCK(s, io_lock); - + g_unlink (path); errno = i; + return -1; } @@ -724,22 +743,24 @@ camel_folder_summary_save(CamelFolderSum int camel_folder_summary_header_load(CamelFolderSummary *s) { - FILE *in; int ret; - if (s->summary_path == NULL) + if (s->summary_path == NULL || !g_file_test (s->summary_path, G_FILE_TEST_EXISTS | G_FILE_TEST_IS_REGULAR)) return 0; - in = g_fopen(s->summary_path, "rb"); - if (in == NULL) - return -1; - CAMEL_SUMMARY_LOCK(s, io_lock); - ret = ((CamelFolderSummaryClass *)(CAMEL_OBJECT_GET_CLASS(s)))->summary_header_load(s, in); - CAMEL_SUMMARY_UNLOCK(s, io_lock); + + if (!s->file) + s->file = g_mapped_file_new (s->summary_path, FALSE, NULL); + + s->filepos = g_mapped_file_get_contents (s->file); + + + ret = ((CamelFolderSummaryClass *)(CAMEL_OBJECT_GET_CLASS(s)))->summary_header_load(s, NULL); - fclose(in); s->flags &= ~CAMEL_SUMMARY_DIRTY; + CAMEL_SUMMARY_UNLOCK(s, io_lock); + return ret; } @@ -748,11 +769,15 @@ summary_assign_uid(CamelFolderSummary *s { const char *uid; CamelMessageInfo *mi; + CamelMessageInfoBase *bi = (CamelMessageInfoBase*)info; uid = camel_message_info_uid(info); if (uid == NULL || uid[0] == 0) { - g_free(info->uid); + + if (bi->uid_needs_free || bi->needs_free) + g_free(info->uid); uid = info->uid = camel_folder_summary_next_uid_string(s); + bi->uid_needs_free = TRUE; } CAMEL_SUMMARY_LOCK(s, summary_lock); @@ -762,8 +787,13 @@ summary_assign_uid(CamelFolderSummary *s if (mi == info) return 0; d(printf ("Trying to insert message with clashing uid (%s). new uid re-assigned", camel_message_info_uid(info))); - g_free(info->uid); + + + if (bi->uid_needs_free || bi->needs_free) + g_free(info->uid); uid = info->uid = camel_folder_summary_next_uid_string(s); + bi->uid_needs_free = TRUE; + camel_message_info_set_flags(info, CAMEL_MESSAGE_FOLDER_FLAGGED, CAMEL_MESSAGE_FOLDER_FLAGGED); CAMEL_SUMMARY_LOCK(s, summary_lock); } @@ -1302,12 +1332,28 @@ camel_folder_summary_encode_token(FILE * if (token != -1) { return camel_file_util_encode_uint32(out, token+1); } else { - if (camel_file_util_encode_uint32(out, len+32) == -1) - return -1; - if (fwrite(str, len, 1, out) != 1) + int lena; + + lena = len = len + 1; + + if (lena % G_MEM_ALIGN) + lena += G_MEM_ALIGN - (lena % G_MEM_ALIGN); + + if (camel_file_util_encode_uint32(out, lena+32) == -1) return -1; + + if (fwrite (str, len, 1, out) == 1) + { + if (lena > len) + { + if (fwrite ("\0\0\0\0\0\0\0\0", lena-len, 1, out) == 1) + return 0; + else return -1; + } + } } } + return 0; } @@ -1322,24 +1368,22 @@ camel_folder_summary_encode_token(FILE * * Returns %0 on success or %-1 on fail **/ int -camel_folder_summary_decode_token(FILE *in, char **str) +camel_folder_summary_decode_token(CamelFolderSummary *s, FILE *in, char **str) { char *ret; guint32 len; + unsigned char *ptrchr = s->filepos; io(printf("Decode token ...\n")); - - if (camel_file_util_decode_uint32(in, &len) == -1) { - io(printf ("Could not decode token from file")); - *str = NULL; - return -1; - } + + ptrchr = camel_file_util_mmap_decode_uint32 ((unsigned char*)ptrchr, &len, FALSE); if (len<32) { + if (len <= 0) { ret = NULL; } else if (len<= tokens_len) { - ret = g_strdup(tokens[len-1]); + ret = tokens[len-1]; } else { io(printf ("Invalid token encountered: %d", len)); *str = NULL; @@ -1350,17 +1394,17 @@ camel_folder_summary_decode_token(FILE * *str = NULL; return -1; } else { + len -= 32; - ret = g_malloc(len+1); - if (len > 0 && fread(ret, len, 1, in) != 1) { - g_free(ret); - *str = NULL; - return -1; - } - ret[len]=0; + + if (len != 0) + ret = (char*)ptrchr; + else ret = NULL; + + ptrchr += len; } - io(printf("Token = '%s'\n", ret)); + s->filepos = ptrchr; *str = ret; return 0; @@ -1392,40 +1436,46 @@ my_list_size(struct _node **list) static int summary_header_load(CamelFolderSummary *s, FILE *in) { - fseek(in, 0, SEEK_SET); + time_t *ptrt; + gint32 *ptr32 = s->filepos; - io(printf("Loading header\n")); + s->version = g_ntohl (*ptr32); ptr32++; - if (camel_file_util_decode_fixed_int32(in, &s->version) == -1) - return -1; + io(printf("Loading header %d", (s->version&0xff))); - /* Legacy version check, before version 12 we have no upgrade knowledge */ + /* Legacy version check, before version 13 we have no upgrade knowledge */ if ((s->version > 0xff) && (s->version & 0xff) < 12) { io(printf ("Summary header version mismatch")); errno = EINVAL; return -1; } - if (!(s->version < 0x100 && s->version >= 13)) - io(printf("Loading legacy summary\n")); - else - io(printf("loading new-format summary\n")); + /* Check for MMAPable file */ + if (s->version != CAMEL_FOLDER_SUMMARY_VERSION) + { + /* Put a summary-file-upgrader here */ - /* legacy version */ - if (camel_file_util_decode_fixed_int32(in, &s->flags) == -1 - || camel_file_util_decode_fixed_int32(in, &s->nextuid) == -1 - || camel_file_util_decode_time_t(in, &s->time) == -1 - || camel_file_util_decode_fixed_int32(in, &s->saved_count) == -1) { + errno = EINVAL; return -1; } - /* version 13 */ - if (s->version < 0x100 && s->version >= 13 - && (camel_file_util_decode_fixed_int32(in, &s->unread_count) == -1 - || camel_file_util_decode_fixed_int32(in, &s->deleted_count) == -1 - || camel_file_util_decode_fixed_int32(in, &s->junk_count) == -1)) { - return -1; + s->flags = g_ntohl (*ptr32); ptr32++; + s->nextuid = g_ntohl (*ptr32); ptr32++; + + ptrt = (time_t*)ptr32; + s->time = (time_t)g_ntohl (*ptrt); ptrt++; + ptr32 = (gint32*)ptrt; + + s->saved_count = g_ntohl (*ptr32); ptr32++; + + + if (s->version < 0x100 && s->version >= 13) { + s->unread_count = g_ntohl (*ptr32); ptr32++; + s->deleted_count = g_ntohl (*ptr32); ptr32++; + s->junk_count = g_ntohl (*ptr32); ptr32++; } + + s->filepos = ptr32; return 0; } @@ -1559,6 +1609,7 @@ summary_format_string (struct _camel_hea const char *text; text = camel_header_raw_find (&h, name, NULL); + if (text) { while (isspace ((unsigned) *text)) text++; @@ -1588,8 +1639,9 @@ camel_folder_summary_content_info_new(Ca s->content_info_chunks = e_memchunk_new(32, s->content_info_size); ci = e_memchunk_alloc(s->content_info_chunks); CAMEL_SUMMARY_UNLOCK(s, alloc_lock); - + ci->needs_free = FALSE; memset(ci, 0, s->content_info_size); + return ci; } @@ -1608,6 +1660,8 @@ message_info_new_from_header(CamelFolder mi = (CamelMessageInfoBase *)camel_message_info_new(s); + mi->needs_free = TRUE; + if ((content = camel_header_raw_find(&h, "Content-Type", NULL)) && (ct = camel_content_type_decode(content)) && (charset = camel_content_type_param(ct, "charset")) @@ -1624,17 +1678,32 @@ message_info_new_from_header(CamelFolder if (ct) camel_content_type_unref(ct); - - mi->subject = camel_pstring_add (subject, TRUE); - mi->from = camel_pstring_add (from, TRUE); - mi->to = camel_pstring_add (to, TRUE); - mi->cc = camel_pstring_add (cc, TRUE); - mi->mlist = camel_pstring_add (mlist, TRUE); - + + if (subject) + mi->subject = camel_pstring_add (subject, TRUE); + else mi->subject = NULL; + + if (from) + mi->from = camel_pstring_add (from, TRUE); + else mi->from = NULL; + + if (to) + mi->to = camel_pstring_add (to, TRUE); + else mi->to = NULL; + + if (cc) + mi->cc = camel_pstring_add (cc, TRUE); + else mi->cc = NULL; + + if (mlist) + mi->mlist = camel_pstring_add (mlist, TRUE); + else mi->mlist = NULL; + mi->user_flags = NULL; mi->user_tags = NULL; mi->date_sent = camel_header_decode_date(camel_header_raw_find(&h, "date", NULL), NULL); received = camel_header_raw_find(&h, "received", NULL); + if (received) received = strrchr(received, ';'); if (received) @@ -1681,84 +1750,128 @@ message_info_new_from_header(CamelFolder return (CamelMessageInfo *)mi; } + static CamelMessageInfo * message_info_load(CamelFolderSummary *s, FILE *in) { CamelMessageInfoBase *mi; - guint count; - int i; - char *subject, *from, *to, *cc, *mlist, *uid; + guint count, len, slen; + unsigned char *ptrchr = s->filepos; + gint32 *ptr32; unsigned int i; mi = (CamelMessageInfoBase *)camel_message_info_new(s); + mi->needs_free = FALSE; + io(printf("Loading message info\n")); - camel_file_util_decode_string(in, &uid); - camel_file_util_decode_uint32(in, &mi->flags); - camel_file_util_decode_uint32(in, &mi->size); - camel_file_util_decode_time_t(in, &mi->date_sent); - camel_file_util_decode_time_t(in, &mi->date_received); - camel_file_util_decode_string(in, &subject); - camel_file_util_decode_string(in, &from); - camel_file_util_decode_string(in, &to); - camel_file_util_decode_string(in, &cc); - camel_file_util_decode_string(in, &mlist); - - mi->uid = uid; - mi->subject = camel_pstring_add (subject, TRUE); - mi->from = camel_pstring_add (from, TRUE); - mi->to = camel_pstring_add (to, TRUE); - mi->cc = camel_pstring_add (cc, TRUE); - mi->mlist = camel_pstring_add (mlist, TRUE); - + ptrchr = camel_file_util_mmap_decode_uint32 (ptrchr, &len, TRUE); + if (!ptrchr) return NULL; + + if (len) mi->uid = (char*)ptrchr; + ptrchr += len; + + ptrchr = camel_file_util_mmap_decode_uint32 (ptrchr, &mi->flags, FALSE); + if (!ptrchr) return NULL; + + ptrchr = camel_file_util_mmap_decode_uint32 (ptrchr, &mi->size, FALSE); + if (!ptrchr) return NULL; + + ptrchr = camel_file_util_mmap_decode_time_t (ptrchr, &mi->date_sent); + ptrchr = camel_file_util_mmap_decode_time_t (ptrchr, &mi->date_received); + + ptrchr = camel_file_util_mmap_decode_uint32 (ptrchr, &len, TRUE); + if (!ptrchr) return NULL; + + if (len) mi->subject = (const char*)ptrchr; + slen = strlen(mi->subject); + ptrchr += len; + + ptrchr = camel_file_util_mmap_decode_uint32 (ptrchr, &len, TRUE); + if (!ptrchr) return NULL; + + if (len) mi->from = (const char*)ptrchr; + ptrchr += len; + + ptrchr = camel_file_util_mmap_decode_uint32 (ptrchr, &len, TRUE); + if (!ptrchr) return NULL; + + if (len) mi->to = (const char*)ptrchr; + ptrchr += len; + + ptrchr = camel_file_util_mmap_decode_uint32 (ptrchr, &len, TRUE); + if (!ptrchr) return NULL; + + if (len) mi->cc = (const char*)ptrchr; + ptrchr += len; + + ptrchr = camel_file_util_mmap_decode_uint32 (ptrchr, &len, TRUE); + if (!ptrchr) return NULL; + + if (len) mi->mlist = (const char*)ptrchr; + ptrchr += len; + mi->content = NULL; - camel_file_util_decode_fixed_int32(in, &mi->message_id.id.part.hi); - camel_file_util_decode_fixed_int32(in, &mi->message_id.id.part.lo); + ptr32 = (gint32*) ptrchr; - if (camel_file_util_decode_uint32(in, &count) == -1 || count > 500) - goto error; + mi->message_id.id.part.hi = g_ntohl (*ptr32); ptr32++; + mi->message_id.id.part.lo = g_ntohl (*ptr32); ptr32++; - if (count > 0) { - mi->references = g_malloc(sizeof(*mi->references) + ((count-1) * sizeof(mi->references->references[0]))); - mi->references->size = count; - for (i=0;i<count;i++) { - camel_file_util_decode_fixed_int32(in, &mi->references->references[i].id.part.hi); - camel_file_util_decode_fixed_int32(in, &mi->references->references[i].id.part.lo); - } + ptrchr = (unsigned char*) ptr32; + ptrchr = camel_file_util_mmap_decode_uint32 (ptrchr, &count, FALSE); + if (!ptrchr) return NULL; + + ptr32 = (gint32*) ptrchr; + + mi->references = g_malloc(sizeof(*mi->references) + ((count-1) * sizeof(mi->references->references[0]))); + mi->references->size = count; + + for (i=0;i<count;i++) { + mi->references->references[i].id.part.hi = g_ntohl (*ptr32); ptr32++; + mi->references->references[i].id.part.lo = g_ntohl (*ptr32); ptr32++; } - if (camel_file_util_decode_uint32(in, &count) == -1 || count > 500) - goto error; + ptrchr = (unsigned char*) ptr32; + ptrchr = camel_file_util_mmap_decode_uint32 (ptrchr, &count, FALSE); + if (!ptrchr) return NULL; for (i=0;i<count;i++) { - char *name; - if (camel_file_util_decode_string(in, &name) == -1 || name == NULL) - goto error; + char *name = NULL; + + ptrchr = camel_file_util_mmap_decode_uint32 (ptrchr, &len, TRUE); + if (len) name = (char*) ptrchr; + ptrchr += len; + camel_flag_set(&mi->user_flags, name, TRUE); - g_free(name); } - if (camel_file_util_decode_uint32(in, &count) == -1 || count > 500) - goto error; + ptrchr = camel_file_util_mmap_decode_uint32 (ptrchr, &count, FALSE); + if (!ptrchr) return NULL; for (i=0;i<count;i++) { - char *name, *value; - if (camel_file_util_decode_string(in, &name) == -1 || name == NULL - || camel_file_util_decode_string(in, &value) == -1) - goto error; + char *name = NULL, *value = NULL; + + ptrchr = camel_file_util_mmap_decode_uint32 (ptrchr, &len, TRUE); + if (!ptrchr) return NULL; + + if (len) name = (char*)ptrchr; + ptrchr += len; + + ptrchr = camel_file_util_mmap_decode_uint32 (ptrchr, &len, TRUE); + if (!ptrchr) return NULL; + + if (len) value =(char*) ptrchr; + ptrchr += len; + camel_tag_set(&mi->user_tags, name, value); - g_free(name); - g_free(value); } - if (!ferror(in)) - return (CamelMessageInfo *)mi; -error: - camel_message_info_free((CamelMessageInfo *)mi); + s->filepos = (void*) ptrchr; + + return (CamelMessageInfo *)mi; - return NULL; } static int @@ -1821,15 +1934,33 @@ message_info_free(CamelFolderSummary *s, { CamelMessageInfoBase *mi = (CamelMessageInfoBase *)info; - g_free(mi->uid); - camel_pstring_free(mi->subject); - camel_pstring_free(mi->from); - camel_pstring_free(mi->to); - camel_pstring_free(mi->cc); - camel_pstring_free(mi->mlist); + if (mi->needs_free) + { + g_free(mi->uid); + + if (mi->subject) + camel_pstring_free(mi->subject); + + if (mi->from) + camel_pstring_free(mi->from); + + if (mi->to) + camel_pstring_free(mi->to); + + if (mi->cc) + camel_pstring_free(mi->cc); + + if (mi->mlist) + camel_pstring_free(mi->mlist); + + camel_flag_list_free(&mi->user_flags); + camel_tag_list_free(&mi->user_tags); + + } else if (mi->uid_needs_free) + g_free (mi->uid); + g_free(mi->references); - camel_flag_list_free(&mi->user_flags); - camel_tag_list_free(&mi->user_tags); + if (s) e_memchunk_free(s->message_info_chunks, mi); else @@ -1843,8 +1974,10 @@ content_info_new_from_header(CamelFolder const char *charset; ci = camel_folder_summary_content_info_new (s); + ci->needs_free = TRUE; charset = e_iconv_locale_charset (); + ci->id = camel_header_msgid_decode (camel_header_raw_find (&h, "content-id", NULL)); ci->description = camel_header_decode_string (camel_header_raw_find (&h, "content-description", NULL), charset); ci->encoding = camel_content_transfer_encoding_decode (camel_header_raw_find (&h, "content-transfer-encoding", NULL)); @@ -1861,57 +1994,56 @@ content_info_load(CamelFolderSummary *s, guint32 count, i; CamelContentType *ct; + unsigned char *ptrchr = s->filepos; + io(printf("Loading content info\n")); ci = camel_folder_summary_content_info_new(s); - - camel_folder_summary_decode_token(in, &type); - camel_folder_summary_decode_token(in, &subtype); + ci->needs_free = FALSE; + + camel_folder_summary_decode_token(s, in, &type); + camel_folder_summary_decode_token(s, in, &subtype); + ct = camel_content_type_new(type, subtype); - g_free(type); /* can this be removed? */ - g_free(subtype); - if (camel_file_util_decode_uint32(in, &count) == -1 || count > 500) - goto error; + + ptrchr = s->filepos; + ptrchr = camel_file_util_mmap_decode_uint32 ((unsigned char*)ptrchr, &count, FALSE); + s->filepos = ptrchr; for (i=0;i<count;i++) { char *name, *value; - camel_folder_summary_decode_token(in, &name); - camel_folder_summary_decode_token(in, &value); - if (!(name && value)) - goto error; + + camel_folder_summary_decode_token(s, in, &name); + camel_folder_summary_decode_token(s, in, &value); - camel_content_type_set_param(ct, name, value); - /* TODO: do this so we dont have to double alloc/free */ - g_free(name); - g_free(value); + camel_content_type_set_param (ct, name, value); } - ci->type = ct; - camel_folder_summary_decode_token(in, &ci->id); - camel_folder_summary_decode_token(in, &ci->description); - camel_folder_summary_decode_token(in, &ci->encoding); + ci->type = ct; - camel_file_util_decode_uint32(in, &ci->size); + camel_folder_summary_decode_token(s, in, &ci->id); + camel_folder_summary_decode_token(s, in, &ci->description); + camel_folder_summary_decode_token(s, in, &ci->encoding); + + ptrchr = s->filepos; + ptrchr = camel_file_util_mmap_decode_uint32 ((unsigned char*)ptrchr, &ci->size, FALSE); + s->filepos = ptrchr; ci->childs = NULL; - if (!ferror(in)) - return ci; - - error: - camel_folder_summary_content_info_free(s, ci); - return NULL; + return ci; } static int content_info_save(CamelFolderSummary *s, FILE *out, CamelMessageContentInfo *ci) { - CamelContentType *ct; + CamelContentType *ct=NULL; struct _camel_header_param *hp; io(printf("Saving content info\n")); ct = ci->type; + if (ct) { camel_folder_summary_encode_token(out, ct->type); camel_folder_summary_encode_token(out, ct->subtype); @@ -1937,9 +2069,14 @@ static void content_info_free(CamelFolderSummary *s, CamelMessageContentInfo *ci) { camel_content_type_unref(ci->type); - g_free(ci->id); - g_free(ci->description); - g_free(ci->encoding); + + if (ci->needs_free) + { + g_free (ci->id); + g_free (ci->description); + g_free (ci->encoding); + } + e_memchunk_free(s->content_info_chunks, ci); } @@ -2693,6 +2830,8 @@ message_info_clone(CamelFolderSummary *s to->refcount = 1; /* NB: We don't clone the uid */ + + from->needs_free = TRUE; to->subject = camel_pstring_strdup(from->subject); to->from = camel_pstring_strdup(from->from); Index: camel-folder-summary.h =================================================================== RCS file: /cvs/gnome/evolution-data-server/camel/camel-folder-summary.h,v retrieving revision 1.86 diff -u -p -r1.86 camel-folder-summary.h --- camel-folder-summary.h 31 Aug 2005 04:21:56 -0000 1.86 +++ camel-folder-summary.h 15 Jul 2006 10:18:30 -0000 @@ -59,6 +59,7 @@ struct _CamelMessageContentInfo { char *description; char *encoding; /* this should be an enum?? */ guint32 size; + gboolean needs_free; }; /* system flag bits */ @@ -178,6 +179,7 @@ struct _CamelMessageInfoBase { /* tree of content description - NULL if it is not available */ CamelMessageContentInfo *content; + gboolean needs_free, uid_needs_free; }; /* probably do this as well, removing CamelFolderChangeInfo and interfaces @@ -224,6 +226,9 @@ struct _CamelFolderSummary { GHashTable *messages_uid; /* CamelMessageInfo's by uid */ struct _CamelFolder *folder; /* parent folder, for events */ + + GMappedFile *file; + void *filepos; }; struct _CamelFolderSummaryClass { @@ -277,6 +282,9 @@ struct _CamelFolderSummaryClass { CamelType camel_folder_summary_get_type (void); CamelFolderSummary *camel_folder_summary_new (struct _CamelFolder *folder); +unsigned char* +decode_uint32 (unsigned char *start, guint32 *dest, gboolean is_string); + void camel_folder_summary_set_filename(CamelFolderSummary *summary, const char *filename); void camel_folder_summary_set_index(CamelFolderSummary *summary, CamelIndex *index); void camel_folder_summary_set_build_content(CamelFolderSummary *summary, gboolean state); @@ -329,7 +337,7 @@ void camel_folder_summary_array_free(Cam /* basically like strings, but certain keywords can be compressed and de-cased */ int camel_folder_summary_encode_token(FILE *out, const char *str); -int camel_folder_summary_decode_token(FILE *in, char **str); +int camel_folder_summary_decode_token(CamelFolderSummary *s,FILE *in, char **str); /* message flag operations */ gboolean camel_flag_get(CamelFlag **list, const char *name); Index: camel-object.c =================================================================== RCS file: /cvs/gnome/evolution-data-server/camel/camel-object.c,v retrieving revision 1.60 diff -u -p -r1.60 camel-object.c --- camel-object.c 12 Apr 2006 19:14:13 -0000 1.60 +++ camel-object.c 15 Jul 2006 10:18:33 -0000 @@ -580,7 +580,7 @@ cobject_state_write(CamelObject *obj, FI res = 0; abort: - for (i=0;i<argv->argc;i++) { +/* for (i=0;i<argv->argc;i++) { CamelArg *arg = &argv->argv[i]; if ((argv->argv[i].tag & CAMEL_ARG_TYPE) == CAMEL_ARG_STR) @@ -595,7 +595,7 @@ abort: if (meta) camel_object_free(obj, CAMEL_OBJECT_METADATA, meta); - +*/ return res; } Index: providers/groupwise/camel-groupwise-summary.c =================================================================== RCS file: /cvs/gnome/evolution-data-server/camel/providers/groupwise/camel-groupwise-summary.c,v retrieving revision 1.11 diff -u -p -r1.11 camel-groupwise-summary.c --- providers/groupwise/camel-groupwise-summary.c 20 Apr 2006 07:47:21 -0000 1.11 +++ providers/groupwise/camel-groupwise-summary.c 15 Jul 2006 10:18:34 -0000 @@ -156,16 +156,23 @@ static int gw_summary_header_load (CamelFolderSummary *s, FILE *in) { CamelGroupwiseSummary *ims = CAMEL_GROUPWISE_SUMMARY (s); + gint32 *ptr32 = s->filepos; + unsigned char *ptrchr; + gint len; if (camel_groupwise_summary_parent->summary_header_load (s, in) == -1) return -1 ; - if (camel_file_util_decode_fixed_int32(in, &ims->version) == -1 - || camel_file_util_decode_fixed_int32(in, &ims->validity) == -1) - return -1; - - if (camel_file_util_decode_string (in, &ims->time_string) == -1) - return -1; + ims->version = g_ntohl (*ptr32); ptr32++; + ims->validity = g_ntohl (*ptr32); ptr32++; + ptrchr = (unsigned char*)ptr32; + + ptrchr = camel_file_util_mmap_decode_uint32 (ptrchr, &len, TRUE); + if (len) ims->time_string = (const char*)ptrchr; + ptrchr += len; + + s->filepos = ptrchr; + return 0 ; } @@ -191,18 +198,16 @@ gw_message_info_load (CamelFolderSummary CamelMessageInfo *info ; CamelGroupwiseMessageInfo *gw_info ; - info = camel_groupwise_summary_parent->message_info_load(s,in) ; if (info) { + unsigned char *ptrchr = s->filepos; gw_info = (CamelGroupwiseMessageInfo*) info ; - if (camel_file_util_decode_uint32 (in, &gw_info->server_flags) == -1) - goto error ; + + ptrchr = camel_file_util_mmap_decode_uint32 (ptrchr, &gw_info->server_flags, FALSE); + s->filepos = ptrchr; } return info ; -error: - camel_message_info_free (info) ; - return NULL ; } @@ -309,6 +314,7 @@ camel_gw_summary_add_offline (CamelFolde mi->info.size = camel_message_info_size(info); mi->info.uid = g_strdup (uid); + mi->info.uid_needs_free = TRUE; camel_folder_summary_add (summary, (CamelMessageInfo *)mi); @@ -321,6 +327,8 @@ camel_gw_summary_add_offline_uncached (C mi = camel_message_info_clone(info); mi->info.uid = g_strdup(uid); + mi->info.uid_needs_free = TRUE; + camel_folder_summary_add (summary, (CamelMessageInfo *)mi); } Index: providers/imap/camel-imap-folder.c =================================================================== RCS file: /cvs/gnome/evolution-data-server/camel/providers/imap/camel-imap-folder.c,v retrieving revision 1.361 diff -u -p -r1.361 camel-imap-folder.c --- providers/imap/camel-imap-folder.c 19 May 2006 15:25:08 -0000 1.361 +++ providers/imap/camel-imap-folder.c 15 Jul 2006 10:18:38 -0000 @@ -2296,6 +2296,7 @@ add_message_from_data (CamelFolder *fold } mi = (CamelImapMessageInfo *)camel_folder_summary_info_new_from_message (folder->summary, msg); + camel_object_unref (CAMEL_OBJECT (msg)); if ((idate = g_datalist_get_data (&data, "INTERNALDATE"))) @@ -2511,8 +2512,11 @@ imap_update_summary (CamelFolder *folder } uid = g_datalist_get_data (&data, "UID"); + + /* This strdup() might not get freed since the mmap() patch! */ if (uid) mi->info.uid = g_strdup (uid); + flags = GPOINTER_TO_INT (g_datalist_get_data (&data, "FLAGS")); if (flags) { ((CamelImapMessageInfo *)mi)->server_flags = flags; Index: providers/imap/camel-imap-store-summary.c =================================================================== RCS file: /cvs/gnome/evolution-data-server/camel/providers/imap/camel-imap-store-summary.c,v retrieving revision 1.18 diff -u -p -r1.18 camel-imap-store-summary.c --- providers/imap/camel-imap-store-summary.c 12 Apr 2006 19:14:14 -0000 1.18 +++ providers/imap/camel-imap-store-summary.c 15 Jul 2006 10:18:39 -0000 @@ -469,27 +469,44 @@ namespace_load(CamelStoreSummary *s, FIL guint32 sep = '/'; ns = g_malloc0(sizeof(*ns)); - if (camel_file_util_decode_string(in, &ns->path) == -1 - || camel_file_util_decode_string(in, &ns->full_name) == -1 - || camel_file_util_decode_uint32(in, &sep) == -1) { - namespace_free(s, ns); - ns = NULL; - } else { - ns->sep = sep; - } + + if (camel_file_util_decode_string(in, &ns->path) == -1) + goto nserror; + + if (camel_file_util_decode_string(in, &ns->full_name) == -1) + goto nserror; + + if (camel_file_util_decode_uint32(in, &sep) == -1) + goto nserror; + + ns->sep = sep; return ns; + + nserror: + + namespace_free(s, ns); + return NULL; } static int namespace_save(CamelStoreSummary *s, FILE *in, CamelImapStoreNamespace *ns) { - if (camel_file_util_encode_string(in, ns->path) == -1 - || camel_file_util_encode_string(in, ns->full_name) == -1 - || camel_file_util_encode_uint32(in, (guint32)ns->sep) == -1) - return -1; + if (camel_file_util_encode_string(in, ns->path) == -1) + goto serr; + + if (camel_file_util_encode_string(in, ns->full_name) == -1) + goto serr; + + if (camel_file_util_encode_uint32(in, (guint32)ns->sep) == -1) + goto serr; return 0; + + serr: + printf ("Error happend while writing\n"); + return -1; + } static int Index: providers/imap/camel-imap-summary.c =================================================================== RCS file: /cvs/gnome/evolution-data-server/camel/providers/imap/camel-imap-summary.c,v retrieving revision 1.25 diff -u -p -r1.25 camel-imap-summary.c --- providers/imap/camel-imap-summary.c 31 Aug 2005 04:26:02 -0000 1.25 +++ providers/imap/camel-imap-summary.c 15 Jul 2006 10:18:39 -0000 @@ -148,28 +148,34 @@ static int summary_header_load (CamelFolderSummary *s, FILE *in) { CamelImapSummary *ims = CAMEL_IMAP_SUMMARY (s); + gint32 *ptr32; if (camel_imap_summary_parent->summary_header_load (s, in) == -1) return -1; /* Legacy version */ if (s->version == 0x30c) - return camel_file_util_decode_uint32(in, &ims->validity); + { + unsigned char* ptrchr = s->filepos; + ptrchr = camel_file_util_mmap_decode_uint32 (ptrchr, &ims->validity, FALSE); + s->filepos = ptrchr; + return 0; + } /* Version 1 */ - if (camel_file_util_decode_fixed_int32(in, &ims->version) == -1) - return -1; + ptr32 = s->filepos; + ims->version = g_ntohl (*ptr32); ptr32++; + s->filepos = ptr32; if (ims->version == 2) { /* Version 2: for compat with version 2 of the imap4 summary files */ int have_mlist; - - if (camel_file_util_decode_fixed_int32 (in, &have_mlist) == -1) - return -1; + have_mlist = g_ntohl (*ptr32); ptr32++; + s->filepos = ptr32; } - - if (camel_file_util_decode_fixed_int32(in, &ims->validity) == -1) - return -1; + + ims->validity = g_ntohl (*ptr32); ptr32++; + s->filepos = ptr32; if (ims->version > CAMEL_IMAP_SUMMARY_VERSION) { g_warning("Unkown summary version\n"); @@ -212,19 +218,15 @@ message_info_load (CamelFolderSummary *s CamelImapMessageInfo *iinfo; info = camel_imap_summary_parent->message_info_load (s, in); - if (info) { - iinfo = (CamelImapMessageInfo *)info; - - if (camel_file_util_decode_uint32 (in, &iinfo->server_flags) == -1) - goto error; + if (info) { + unsigned char* ptrchr = s->filepos; + ptrchr = camel_file_util_mmap_decode_uint32 (ptrchr, &iinfo->server_flags, FALSE); + s->filepos = ptrchr; label_to_flags(iinfo); } return info; -error: - camel_message_info_free(info); - return NULL; } static int @@ -254,10 +256,22 @@ info_set_user_tag(CamelMessageInfo *info static CamelMessageContentInfo * content_info_load (CamelFolderSummary *s, FILE *in) { - if (fgetc (in)) - return camel_imap_summary_parent->content_info_load (s, in); - else - return camel_folder_summary_content_info_new (s); + unsigned char* ptrchr = s->filepos; + CamelMessageContentInfo *retval; + + if (*ptrchr == 1) { + ptrchr++; + s->filepos = ptrchr; + + retval = camel_imap_summary_parent->content_info_load (s, in); + } else { + ptrchr++; + s->filepos = ptrchr; + + retval = camel_folder_summary_content_info_new (s); + } + + return retval; } static int @@ -298,6 +312,8 @@ camel_imap_summary_add_offline (CamelFol } mi->info.size = camel_message_info_size(info); + + mi->info.uid_needs_free = TRUE; mi->info.uid = g_strdup (uid); label_to_flags(mi); @@ -312,7 +328,9 @@ camel_imap_summary_add_offline_uncached CamelImapMessageInfo *mi; mi = camel_message_info_clone(info); + mi->info.uid = g_strdup(uid); + mi->info.uid_needs_free = TRUE; label_to_flags(mi); Index: providers/imap4/camel-imap4-summary.c =================================================================== RCS file: /cvs/gnome/evolution-data-server/camel/providers/imap4/camel-imap4-summary.c,v retrieving revision 1.46 diff -u -p -r1.46 camel-imap4-summary.c --- providers/imap4/camel-imap4-summary.c 18 May 2006 15:28:10 -0000 1.46 +++ providers/imap4/camel-imap4-summary.c 15 Jul 2006 10:18:41 -0000 @@ -146,13 +146,14 @@ static int imap4_header_load (CamelFolderSummary *summary, FILE *fin) { CamelIMAP4Summary *imap4_summary = (CamelIMAP4Summary *) summary; + gint32 *ptr32 = summary->filepos; if (CAMEL_FOLDER_SUMMARY_CLASS (parent_class)->summary_header_load (summary, fin) == -1) return -1; - if (camel_file_util_decode_fixed_int32 (fin, &imap4_summary->version) == -1) - return -1; - + imap4_summary->version = g_ntohl (*ptr32); ptr32++; + summary->filepos = ptr32; + if (imap4_summary->version > CAMEL_IMAP4_SUMMARY_VERSION) { g_warning ("Unknown IMAP4 summary version\n"); errno = EINVAL; @@ -162,9 +163,8 @@ imap4_header_load (CamelFolderSummary *s if (imap4_summary->version == 2) { /* check that we have Mailing-List info */ int have_mlist; - - if (camel_file_util_decode_fixed_int32 (fin, &have_mlist) == -1) - return -1; + + have_mlist = g_ntohl (*ptr32); ptr32++; if (have_mlist) summary->flags |= CAMEL_IMAP4_SUMMARY_HAVE_MLIST; @@ -172,8 +172,8 @@ imap4_header_load (CamelFolderSummary *s summary->flags ^= CAMEL_IMAP4_SUMMARY_HAVE_MLIST; } - if (camel_file_util_decode_fixed_int32 (fin, &imap4_summary->uidvalidity) == -1) - return -1; + imap4_summary->uidvalidity = g_ntohl (*ptr32); ptr32++; + summary->filepos = ptr32; return 0; } @@ -492,6 +492,9 @@ decode_envelope (CamelIMAP4Engine *engin /* subject */ if (envelope_decode_nstring (engine, &nstring, TRUE, ex) == -1) goto exception; + + iinfo->info.needs_free = TRUE; + iinfo->info.subject = camel_pstring_strdup (nstring); g_free(nstring); @@ -992,8 +995,11 @@ untagged_fetch_all (CamelIMAP4Engine *en g_assert_not_reached (); } } else { - g_free (info->uid); + if (((CamelMessageInfoBase*)info)->uid_needs_free) + g_free (info->uid); info->uid = g_strdup (uid); + ((CamelMessageInfoBase*)info)->uid_needs_free = TRUE; + g_hash_table_insert (fetch->uid_hash, (void *) camel_message_info_uid (info), envelope); changed |= IMAP4_FETCH_UID; } @@ -1063,9 +1069,12 @@ untagged_fetch_all (CamelIMAP4Engine *en h = camel_mime_parser_headers_raw (parser); /* find our mailing-list header */ - mlist = camel_header_raw_check_mailing_list (&h); - iinfo->info.mlist = camel_pstring_strdup (mlist); - g_free (mlist); + + /* This introduces a problem for the mmap() implementation */ + + // mlist = camel_header_raw_check_mailing_list (&h); + // iinfo->info.mlist = camel_pstring_strdup (mlist); + // g_free (mlist); /* check if we possibly have attachments */ if ((str = camel_header_raw_find (&h, "Content-Type", NULL))) { @@ -1249,22 +1258,17 @@ imap4_message_info_load (CamelFolderSumm { CamelIMAP4MessageInfo *minfo; CamelMessageInfo *info; - + unsigned char *ptrchr = summary->filepos; + if (!(info = CAMEL_FOLDER_SUMMARY_CLASS (parent_class)->message_info_load (summary, fin))) return NULL; minfo = (CamelIMAP4MessageInfo *) info; - if (camel_file_util_decode_uint32 (fin, &minfo->server_flags) == -1) - goto exception; - + ptrchr = camel_file_util_mmap_decode_uint32 (ptrchr, &minfo->server_flags, FALSE); + summary->filepos = ptrchr; + return info; - - exception: - - camel_message_info_free(info); - - return NULL; } static int Index: providers/imapp/camel-imapp-summary.c =================================================================== RCS file: /cvs/gnome/evolution-data-server/camel/providers/imapp/camel-imapp-summary.c,v retrieving revision 1.4 diff -u -p -r1.4 camel-imapp-summary.c --- providers/imapp/camel-imapp-summary.c 31 Aug 2005 04:26:05 -0000 1.4 +++ providers/imapp/camel-imapp-summary.c 15 Jul 2006 10:18:41 -0000 @@ -115,17 +115,27 @@ static int summary_header_load(CamelFolderSummary *s, FILE *in) { CamelIMAPPSummary *ims = CAMEL_IMAPP_SUMMARY(s); + unsigned char *ptrchr = s->filepos; + gint32 *ptr32; if (camel_imapp_summary_parent->summary_header_load(s, in) == -1) return -1; /* Legacy version */ if (s->version == 0x100c) - return camel_file_util_decode_uint32(in, &ims->uidvalidity); + { + ptrchr = camel_file_util_mmap_decode_uint32 (ptrchr, &ims->uidvalidity, FALSE); + s->filepos = ptrchr; - if (camel_file_util_decode_fixed_int32(in, &ims->version) == -1 - || camel_file_util_decode_fixed_int32(in, &ims->uidvalidity) == -1) - return -1; + return 0; + } + + ptr32 = s->filepos; + + ims->version = g_ntohl (*ptr32); ptr32++; + ims->uidvalidity = g_ntohl (*ptr32); ptr32++; + + s->filepos = ptr32; if (ims->version > CAMEL_IMAPP_SUMMARY_VERSION) { g_warning("Unkown summary version\n"); @@ -160,16 +170,14 @@ message_info_load(CamelFolderSummary *s, info = camel_imapp_summary_parent->message_info_load(s, in); if (info) { + unsigned char *ptrchr = s->filepos; iinfo =(CamelIMAPPMessageInfo *)info; - if (camel_file_util_decode_uint32(in, &iinfo->server_flags) == -1) - goto error; + ptrchr = camel_file_util_mmap_decode_uint32 (ptrchr, &iinfo->server_flags, FALSE); + s->filepos = ptrchr; } return info; -error: - camel_message_info_free(info); - return NULL; } static int Index: providers/local/camel-local-summary.c =================================================================== RCS file: /cvs/gnome/evolution-data-server/camel/providers/local/camel-local-summary.c,v retrieving revision 1.34 diff -u -p -r1.34 camel-local-summary.c --- providers/local/camel-local-summary.c 9 Jun 2006 01:21:53 -0000 1.34 +++ providers/local/camel-local-summary.c 15 Jul 2006 10:18:42 -0000 @@ -593,6 +593,7 @@ static int summary_header_load(CamelFolderSummary *s, FILE *in) { CamelLocalSummary *cls = (CamelLocalSummary *)s; + gint32 *ptr32 = s->filepos; /* We dont actually add our own headers, but version that we don't anyway */ @@ -604,7 +605,12 @@ summary_header_load(CamelFolderSummary * return 0; /* otherwise load the version number */ - return camel_file_util_decode_fixed_int32(in, &cls->version); + + ptr32 = s->filepos; + cls->version = g_ntohl (*ptr32); ptr32++; + s->filepos = ptr32; + + return 0; } static int Index: providers/local/camel-mbox-summary.c =================================================================== RCS file: /cvs/gnome/evolution-data-server/camel/providers/local/camel-mbox-summary.c,v retrieving revision 1.60 diff -u -p -r1.60 camel-mbox-summary.c --- providers/local/camel-mbox-summary.c 15 Jun 2006 11:16:25 -0000 1.60 +++ providers/local/camel-mbox-summary.c 15 Jul 2006 10:18:44 -0000 @@ -233,22 +233,32 @@ mbox_summary_encode_x_evolution (CamelLo } } + + static int summary_header_load(CamelFolderSummary *s, FILE *in) { CamelMboxSummary *mbs = CAMEL_MBOX_SUMMARY(s); + gint32 *ptr32; + unsigned char *ptrchr; if (((CamelFolderSummaryClass *)camel_mbox_summary_parent)->summary_header_load(s, in) == -1) return -1; /* legacy version */ if (s->version == 0x120c) - return camel_file_util_decode_uint32(in, (guint32 *) &mbs->folder_size); + { + unsigned char* ptrchr = s->filepos; + ptrchr = camel_file_util_mmap_decode_uint32 (ptrchr, &mbs->folder_size, FALSE); + s->filepos = ptrchr; + } /* version 1 */ - if (camel_file_util_decode_fixed_int32(in, &mbs->version) == -1 - || camel_file_util_decode_size_t(in, &mbs->folder_size) == -1) - return -1; + ptr32 = s->filepos; + mbs->version = g_ntohl (*ptr32); ptr32++; + ptrchr = (unsigned char*)ptr32; + ptrchr = camel_file_util_mmap_decode_size_t (ptrchr, &mbs->folder_size); + s->filepos = ptrchr; return 0; } @@ -361,6 +371,7 @@ message_info_new_from_parser(CamelFolder return mi; } + static CamelMessageInfo * message_info_load(CamelFolderSummary *s, FILE *in) { @@ -371,17 +382,16 @@ message_info_load(CamelFolderSummary *s, mi = ((CamelFolderSummaryClass *)camel_mbox_summary_parent)->message_info_load(s, in); if (mi) { CamelMboxMessageInfo *mbi = (CamelMboxMessageInfo *)mi; - - if (camel_file_util_decode_off_t(in, &mbi->frompos) == -1) - goto error; + + unsigned char *ptrchr = s->filepos; + ptrchr = camel_file_util_mmap_decode_off_t (ptrchr, &mbi->frompos); + s->filepos = ptrchr; } return mi; -error: - camel_message_info_free(mi); - return NULL; } + static int message_info_save(CamelFolderSummary *s, FILE *out, CamelMessageInfo *mi) { @@ -390,7 +400,7 @@ message_info_save(CamelFolderSummary *s, io(printf("saving mbox message info\n")); if (((CamelFolderSummaryClass *)camel_mbox_summary_parent)->message_info_save(s, out, mi) == -1 - || camel_file_util_encode_off_t(out, mbi->frompos) == -1) + || camel_file_util_encode_off_t (out, mbi->frompos) == -1) return -1; return 0; Index: providers/nntp/camel-nntp-summary.c =================================================================== RCS file: /cvs/gnome/evolution-data-server/camel/providers/nntp/camel-nntp-summary.c,v retrieving revision 1.23 diff -u -p -r1.23 camel-nntp-summary.c --- providers/nntp/camel-nntp-summary.c 9 Jun 2006 01:21:53 -0000 1.23 +++ providers/nntp/camel-nntp-summary.c 15 Jul 2006 10:18:44 -0000 @@ -162,18 +162,23 @@ static int summary_header_load(CamelFolderSummary *s, FILE *in) { CamelNNTPSummary *cns = CAMEL_NNTP_SUMMARY(s); + gint32 *ptr32 = s->filepos; + unsigned char *ptrchr = s->filepos; if (((CamelFolderSummaryClass *)camel_nntp_summary_parent)->summary_header_load(s, in) == -1) return -1; /* Legacy version */ if (s->version == 0x20c) { - camel_file_util_decode_fixed_int32(in, &cns->high); - return camel_file_util_decode_fixed_int32(in, &cns->low); + cns->high = g_ntohl (*ptr32); ptr32++; + cns->low = g_ntohl (*ptr32); ptr32++; + s->filepos = ptr32; + + return 0; } - if (camel_file_util_decode_fixed_int32(in, &cns->version) == -1) - return -1; + cns->version = g_ntohl (*ptr32); ptr32++; + s->filepos = ptr32; if (cns->version > CAMEL_NNTP_SUMMARY_VERSION) { g_warning("Unknown NNTP summary version"); @@ -181,9 +186,10 @@ summary_header_load(CamelFolderSummary * return -1; } - if (camel_file_util_decode_fixed_int32(in, &cns->high) == -1 - || camel_file_util_decode_fixed_int32(in, &cns->low) == -1) - return -1; + cns->high = g_ntohl (*ptr32); ptr32++; + cns->low = g_ntohl (*ptr32); ptr32++; + + s->filepos = ptr32; return 0; }
_______________________________________________ Evolution-hackers mailing list Evolution-hackers@gnome.org http://mail.gnome.org/mailman/listinfo/evolution-hackers