Well, I figured out why you're getting alignment problems... you're using int* pointers to decode stuff. You need to use a char*
Secondly, your code is just really gross: - Why do you have a filepos pointer? it's completely unnecessary. - Why do you use a ptr32 thing? That's gross. There are far cleaner ways of doing this... it's also the source of your alignment problems. - Why do you have ::needs_free and ::uid_needs_free? Please find another way to do this. This is a horrible hack. Attached you'll find the beginnings of a much cleaner implementation of the mmap approach. -- Jeffrey Stedfast Evolution Hacker - Novell, Inc. [EMAIL PROTECTED] - www.novell.com
? camel-gpg-context.c.gpg ? camel-mime-tables.c ? camel_folder_summary_with_mmap_fixes11.txt ? const-charset-map.patch ? mmap.patch ? pgp-filter.patch ? pstring.patch ? providers/imap4/272058.patch ? providers/imap4/imap4-sockopt.patch ? providers/local/largefile-mbox.patch ? providers/pop3/pop3-folder.c Index: camel-file-utils.c =================================================================== RCS file: /cvs/gnome/evolution-data-server/camel/camel-file-utils.c,v retrieving revision 1.17 diff -u -r1.17 camel-file-utils.c --- camel-file-utils.c 2 Jun 2006 00:52:29 -0000 1.17 +++ camel-file-utils.c 19 Jul 2006 20:32:13 -0000 @@ -262,18 +262,18 @@ int camel_file_util_encode_string (FILE *out, const char *str) { - register int len; - - if (str == NULL) - return camel_file_util_encode_uint32 (out, 1); + size_t len; - if ((len = strlen (str)) > 65536) - len = 65536; + if (str == NULL) + return camel_file_util_encode_size_t (out, 0); - if (camel_file_util_encode_uint32 (out, len+1) == -1) + len = strlen (str); + if (camel_file_util_encode_size_t (out, len + 1) == -1) return -1; - if (len == 0 || fwrite (str, len, 1, out) == 1) + + if (fwrite (str, len + 1, 1, out) == 1) return 0; + return -1; } @@ -290,29 +290,317 @@ int camel_file_util_decode_string (FILE *in, char **str) { - guint32 len; - register char *ret; - - if (camel_file_util_decode_uint32 (in, &len) == -1) { + size_t len; + + if (camel_file_util_decode_size_t (in, &len) == -1) { *str = NULL; return -1; } - - len--; - if (len > 65536) { + + if (len == 0) { + *str = NULL; + return 0; + } + + if (!(*str = g_try_malloc (len))) { *str = NULL; return -1; } - - ret = g_malloc (len+1); - if (len > 0 && fread (ret, len, 1, in) != 1) { - g_free (ret); + + if (fread (*str, len, 1, in) != 1) { + g_free (*str); *str = NULL; return -1; } + + return 0; +} + + +/** + * camel_mmap_util_encode_uint32: + * @out: file to output to + * @value: value to output + * + * Utility function to save an uint32 to a file. + * + * Return value: 0 on success, -1 on error. + **/ +int +camel_mmap_util_encode_uint32 (char **out, guint32 value) +{ + char *outptr = *out; + unsigned char c; + int i; + + for (i = 28; i > 0; i -= 7) { + if (value >= (1 << i)) { + c = (value >> i) & 0x7f; + *outptr++ = c; + } + } + + c = value & 0x7f; + *outptr++ = c | 0x80; + + *out = outptr; + + return 0; +} + + +/** + * camel_mmap_util_decode_uint32: + * @in: file to read from + * @dest: pointer to a variable to store the value in + * + * Retrieve an encoded uint32 from a file. + * + * Return value: 0 on success, -1 on error. @*dest will contain the + * decoded value. + **/ +int +camel_mmap_util_decode_uint32 (const char **in, guint32 *dest) +{ + const char *inptr = *in; + guint32 value = 0; + unsigned char v; + + /* until we get the last byte, keep decoding 7 bits at a time */ + while (((v = *inptr++) & 0x80) == 0) { + value |= v; + value <<= 7; + } + + *dest = value | (v & 0x7f); + *in = inptr; + + return 0; +} + + +/** + * camel_mmap_util_encode_fixed_int32: + * @out: file to output to + * @value: value to output + * + * Encode a gint32, performing no compression, but converting + * to network order. + * + * Return value: 0 on success, -1 on error. + **/ +int +camel_mmap_util_encode_fixed_int32 (char **out, gint32 value) +{ + gint32 save; + + save = GINT32_TO_LE (value); + memcpy (*out, &save, sizeof (gint32)); + *out = *out + sizeof (gint32); + + return 0; +} + + +/** + * camel_mmap_util_decode_fixed_int32: + * @in: file to read from + * @dest: pointer to a variable to store the value in + * + * Retrieve a gint32. + * + * Return value: 0 on success, -1 on error. + **/ +int +camel_mmap_util_decode_fixed_int32 (const char **in, gint32 *dest) +{ + const char *inptr = *in; + gint32 value = 0; + int i; + + for (i = 0; i < sizeof (guint32); i++, inptr++, value <<= 8) + value |= *inptr; + + *dest = GUINT32_FROM_LE (value); + *in = inptr; + + return 0; +} + +#define MMAP_ENCODE_T(type) \ +int \ +camel_mmap_util_encode_##type(char **out, type value) \ +{ \ + type save; \ + \ + switch (sizeof (type)) { \ + case 4: \ + save = GUINT32_TO_LE (value); \ + break; \ + case 8: \ + save = GUINT64_TO_LE (value); \ + break; \ + default: \ + save = value; \ + } \ + \ + memcpy (*out, &save, sizeof (type)); \ + *out = *out + sizeof (type); \ + \ + return 0; \ +} + +#define MMAP_DECODE_T(type) \ +int \ +camel_mmap_util_decode_##type(const char **in, type *dest) \ +{ \ + const char *inptr = *in; \ + type value = 0; \ + int i; \ + \ + for (i = 0; i < sizeof (type); i++, inptr++, value <<= 8) \ + value |= *inptr; \ + \ + switch (sizeof (type)) { \ + case 4: \ + *dest = GUINT32_FROM_LE (value); \ + break; \ + case 8: \ + *dest = GUINT64_FROM_LE (value); \ + break; \ + default: \ + *dest = value; \ + } \ + \ + *in = inptr; \ + \ + return 0; \ +} + + +/** + * camel_mmap_util_encode_time_t: + * @out: file to output to + * @value: value to output + * + * Encode a time_t value to the file. + * + * Return value: 0 on success, -1 on error. + **/ +MMAP_ENCODE_T(time_t) + +/** + * camel_mmap_util_decode_time_t: + * @in: file to read from + * @dest: pointer to a variable to store the value in + * + * Decode a time_t value. + * + * Return value: 0 on success, -1 on error. + **/ +MMAP_DECODE_T(time_t) + +/** + * camel_mmap_util_encode_off_t: + * @out: file to output to + * @value: value to output + * + * Encode an off_t type. + * + * Return value: 0 on success, -1 on error. + **/ +MMAP_ENCODE_T(off_t) + + +/** + * camel_mmap_util_decode_off_t: + * @in: file to read from + * @dest: pointer to a variable to put the value in + * + * Decode an off_t type. + * + * Return value: 0 on success, -1 on failure. + **/ +MMAP_DECODE_T(off_t) + +/** + * camel_mmap_util_encode_size_t: + * @out: file to output to + * @value: value to output + * + * Encode an size_t type. + * + * Return value: 0 on success, -1 on error. + **/ +MMAP_ENCODE_T(size_t) + - ret[len] = 0; - *str = ret; +/** + * camel_mmap_util_decode_size_t: + * @in: file to read from + * @dest: pointer to a variable to put the value in + * + * Decode an size_t type. + * + * Return value: 0 on success, -1 on failure. + **/ +MMAP_DECODE_T(size_t) + + +/** + * camel_mmap_util_encode_string: + * @out: file to output to + * @str: value to output + * + * Encode a normal string and save it in the output file. + * + * Return value: 0 on success, -1 on error. + **/ +int +camel_mmap_util_encode_string (char **out, const char *str) +{ + size_t len; + + if (str == NULL) + return camel_mmap_util_encode_size_t (out, 0); + + len = strlen (str); + if (camel_mmap_util_encode_size_t (out, len + 1) == -1) + return -1; + + memcpy (*out, str, len + 1); + *out = *out + len + 1; + + return 0; +} + + +/** + * camel_mmap_util_decode_string: + * @in: file to read from + * @str: pointer to a variable to store the value in + * + * Decode a normal string from the input file. + * + * Return value: 0 on success, -1 on error. + **/ +int +camel_mmap_util_decode_string (const char **in, const char **str) +{ + size_t len; + + if (camel_mmap_util_decode_size_t (in, &len) == -1) { + *str = NULL; + return -1; + } + + if (len != 0) { + *str = *in; + *in = *in + len; + } else { + *str = NULL; + } + return 0; } @@ -334,7 +622,7 @@ #else const char *unsafe_chars = "/?()'*"; #endif - + if (name == NULL) return NULL; Index: camel-file-utils.h =================================================================== RCS file: /cvs/gnome/evolution-data-server/camel/camel-file-utils.h,v retrieving revision 1.11 diff -u -r1.11 camel-file-utils.h --- camel-file-utils.h 10 Jan 2006 07:56:46 -0000 1.11 +++ camel-file-utils.h 19 Jul 2006 20:32:13 -0000 @@ -55,6 +55,19 @@ int camel_file_util_encode_string (FILE *out, const char *); int camel_file_util_decode_string (FILE *in, char **); +int camel_mmap_util_encode_fixed_int32 (char **out, gint32); +int camel_mmap_util_decode_fixed_int32 (const char **in, gint32 *); +int camel_mmap_util_encode_uint32 (char **out, guint32); +int camel_mmap_util_decode_uint32 (const char **in, guint32 *); +int camel_mmap_util_encode_time_t (char **out, time_t); +int camel_mmap_util_decode_time_t (const char **in, time_t *); +int camel_mmap_util_encode_off_t (char **out, off_t); +int camel_mmap_util_decode_off_t (const char **in, off_t *); +int camel_mmap_util_encode_size_t (char **out, size_t); +int camel_mmap_util_decode_size_t (const char **in, size_t *); +int camel_mmap_util_encode_string (char **out, const char *); +int camel_mmap_util_decode_string (const char **in, const char **); + char *camel_file_util_safe_filename (const char *name); /* Code that intends to be portable to Win32 should use camel_read() Index: camel-folder-summary.c =================================================================== RCS file: /cvs/gnome/evolution-data-server/camel/camel-folder-summary.c,v retrieving revision 1.149 diff -u -r1.149 camel-folder-summary.c --- camel-folder-summary.c 6 Jul 2006 19:43:46 -0000 1.149 +++ camel-folder-summary.c 19 Jul 2006 20:32:13 -0000 @@ -137,7 +137,9 @@ s->flags = 0; s->time = 0; s->nextuid = 1; - + + s->map = NULL; + s->messages = g_ptr_array_new(); s->messages_uid = g_hash_table_new(g_str_hash, g_str_equal); @@ -150,7 +152,7 @@ static void free_o_name(void *key, void *value, void *data) { - camel_object_unref((CamelObject *)value); + camel_object_unref (value); g_free(key); } @@ -161,7 +163,10 @@ CamelFolderSummary *s = (CamelFolderSummary *)obj; p = _PRIVATE(obj); - + + if (s->map) + g_mapped_file_free (s->map); + camel_folder_summary_clear(s); g_ptr_array_free(s->messages, TRUE); g_hash_table_destroy(s->messages_uid); @@ -177,22 +182,22 @@ e_memchunk_destroy(s->content_info_chunks); if (p->filter_index) - camel_object_unref((CamelObject *)p->filter_index); + camel_object_unref (p->filter_index); if (p->filter_64) - camel_object_unref((CamelObject *)p->filter_64); + camel_object_unref (p->filter_64); if (p->filter_qp) - camel_object_unref((CamelObject *)p->filter_qp); + camel_object_unref (p->filter_qp); if (p->filter_uu) - camel_object_unref((CamelObject *)p->filter_uu); + camel_object_unref (p->filter_uu); if (p->filter_save) - camel_object_unref((CamelObject *)p->filter_save); + camel_object_unref (p->filter_save); if (p->filter_html) - camel_object_unref((CamelObject *)p->filter_html); + camel_object_unref (p->filter_html); if (p->filter_stream) - camel_object_unref((CamelObject *)p->filter_stream); + camel_object_unref (p->filter_stream); if (p->index) - camel_object_unref((CamelObject *)p->index); + camel_object_unref (p->index); g_mutex_free(p->summary_lock); g_mutex_free(p->io_lock); @@ -499,24 +504,22 @@ /* loads the content descriptions, recursively */ static CamelMessageContentInfo * -perform_content_info_load(CamelFolderSummary *s, FILE *in) +perform_content_info_load(CamelFolderSummary *s, const char **in) { - int i; - guint32 count; CamelMessageContentInfo *ci, *part; - - ci = ((CamelFolderSummaryClass *)(CAMEL_OBJECT_GET_CLASS(s)))->content_info_load(s, in); - if (ci == NULL) + guint32 count; + int i; + + if (!(ci = ((CamelFolderSummaryClass *)(CAMEL_OBJECT_GET_CLASS(s)))->content_info_load(s, in))) return NULL; - + if (camel_file_util_decode_uint32(in, &count) == -1 || 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) { + for (i = 0; i < count; i++) { + if ((part = perform_content_info_load(s, in))) { my_list_append((struct _node **)&ci->childs, (struct _node *)part); part->parent = ci; } else { @@ -525,6 +528,7 @@ return NULL; } } + return ci; } @@ -540,57 +544,61 @@ int camel_folder_summary_load(CamelFolderSummary *s) { - FILE *in; - int i; CamelMessageInfo *mi; - + const char *inptr; + int i; + if (s->summary_path == NULL) return 0; - - in = g_fopen(s->summary_path, "rb"); - if (in == NULL) + + if ((fd = g_open (s->summary_path, O_RDWR, 0)) == -1) return -1; - + CAMEL_SUMMARY_LOCK(s, io_lock); - if ( ((CamelFolderSummaryClass *)(CAMEL_OBJECT_GET_CLASS(s)))->summary_header_load(s, in) == -1) + + if (!s->map && !(s->map = g_mapped_file_new (s->summary_path, FALSE, NULL))) { + CAMEL_SUMMARY_UNLOCK (s, io_lock); + return -1; + } + + inptr = g_mapped_file_get_contents (s->map); + + if (((CamelFolderSummaryClass *)(CAMEL_OBJECT_GET_CLASS(s)))->summary_header_load (s, &inptr) == -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); - - if (mi == NULL) + for (i = 0; i < s->saved_count; i++) { + if (!(mi = ((CamelFolderSummaryClass *)(CAMEL_OBJECT_GET_CLASS(s)))->message_info_load (s, &inptr))) 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); - if (((CamelMessageInfoBase *)mi)->content == NULL) { - camel_message_info_free(mi); + ((CamelMessageInfoBase *) mi)->content = perform_content_info_load (s, &inptr); + if (((CamelMessageInfoBase *) mi)->content == NULL) { + camel_message_info_free (mi); goto error; } } - - camel_folder_summary_add(s, mi); + + 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: if (errno != EINVAL) g_warning ("Cannot load summary file: `%s': %s", s->summary_path, g_strerror (errno)); + g_mapped_file_free (s->map); + s->map = NULL; + CAMEL_SUMMARY_UNLOCK(s, io_lock); - fclose (in); s->flags |= ~CAMEL_SUMMARY_DIRTY; - + return -1; } @@ -724,22 +732,24 @@ int camel_folder_summary_header_load(CamelFolderSummary *s) { - FILE *in; + const char *inptr; int ret; - + if (s->summary_path == NULL) 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); - fclose(in); + if (!s->map && !(s->map = g_mapped_file_new (s->summary_path, FALSE, NULL))) { + CAMEL_SUMMARY_UNLOCK (s, io_lock); + return -1; + } + + inptr = g_mapped_file_get_contents (s->map); + ret = ((CamelFolderSummaryClass *)(CAMEL_OBJECT_GET_CLASS (s)))->summary_header_load (s, &inptr); + CAMEL_SUMMARY_UNLOCK(s, io_lock); s->flags &= ~CAMEL_SUMMARY_DIRTY; + return ret; } @@ -1271,43 +1281,45 @@ int camel_folder_summary_encode_token(FILE *out, const char *str) { + int token = -1, i; + size_t len; + io(printf("Encoding token: '%s'\n", str)); - - if (str == NULL) { - return camel_file_util_encode_uint32(out, 0); - } else { - int len = strlen(str); - int i, token=-1; - - if (len <= 16) { - char lower[32]; - char **match; - - for (i=0;i<len;i++) - lower[i] = tolower(str[i]); - lower[i] = 0; + + if (str == NULL) + return camel_file_util_encode_uint32 (out, 0); + + len = strlen (str); + if (len <= 16) { + char lower[32]; + char **match; + + for (i=0;i<len;i++) + lower[i] = tolower(str[i]); + lower[i] = 0; #ifdef USE_BSEARCH - match = bsearch(lower, tokens, tokens_len, sizeof(char *), (int (*)(const void *, const void *))token_search_cmp); - if (match) - token = match-tokens; + match = bsearch(lower, tokens, tokens_len, sizeof(char *), (int (*)(const void *, const void *))token_search_cmp); + if (match) + token = match-tokens; #else - for (i=0;i<tokens_len;i++) { - if (!strcmp(tokens[i], lower)) { - token = i; - break; - } + for (i = 0; i < tokens_len; i++) { + if (!strcmp (tokens[i], lower)) { + token = i; + break; } -#endif - } - 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) - return -1; } +#endif } + + 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) + return -1; + } + return 0; } @@ -1390,13 +1402,11 @@ } static int -summary_header_load(CamelFolderSummary *s, FILE *in) +summary_header_load(CamelFolderSummary *s, const char **in) { - fseek(in, 0, SEEK_SET); - io(printf("Loading header\n")); - if (camel_file_util_decode_fixed_int32(in, &s->version) == -1) + if (camel_mmap_util_decode_fixed_int32(in, &s->version) == -1) return -1; /* Legacy version check, before version 12 we have no upgrade knowledge */ @@ -1412,18 +1422,18 @@ io(printf("loading new-format summary\n")); /* 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) { + if (camel_mmap_util_decode_fixed_int32(in, &s->flags) == -1 + || camel_mmap_util_decode_fixed_int32(in, &s->nextuid) == -1 + || camel_mmap_util_decode_time_t(in, &s->time) == -1 + || camel_mmap_util_decode_fixed_int32(in, &s->saved_count) == -1) { 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)) { + && (camel_mmap_util_decode_fixed_int32(in, &s->unread_count) == -1 + || camel_mmap_util_decode_fixed_int32(in, &s->deleted_count) == -1 + || camel_mmap_util_decode_fixed_int32(in, &s->junk_count) == -1)) { return -1; } @@ -1682,82 +1692,74 @@ } static CamelMessageInfo * -message_info_load(CamelFolderSummary *s, FILE *in) +message_info_load(CamelFolderSummary *s, const char **in) { CamelMessageInfoBase *mi; guint count; int i; - char *subject, *from, *to, *cc, *mlist, *uid; - + mi = (CamelMessageInfoBase *)camel_message_info_new(s); - + 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); + camel_mmap_util_decode_string (in, &mi->uid); + camel_mmap_util_decode_uint32 (in, &mi->flags); + camel_mmap_util_decode_uint32 (in, &mi->size); + camel_mmap_util_decode_time_t (in, &mi->date_sent); + camel_mmap_util_decode_time_t (in, &mi->date_received); + camel_mmap_util_decode_string (in, &mi->subject); + camel_mmap_util_decode_string (in, &mi->from); + camel_mmap_util_decode_string (in, &mi->to); + camel_mmap_util_decode_string (in, &mi->cc); + camel_mmap_util_decode_string (in, &mi->mlist); 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); - - if (camel_file_util_decode_uint32(in, &count) == -1 || count > 500) + + camel_mmap_util_decode_fixed_int32 (in, &mi->message_id.id.part.hi); + camel_mmap_util_decode_fixed_int32 (in, &mi->message_id.id.part.lo); + + if (camel_mmap_util_decode_uint32 (in, &count) == -1 || count > 500) goto error; - + 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); + for (i = 0; i < count; i++) { + camel_mmap_util_decode_fixed_int32 (in, &mi->references->references[i].id.part.hi); + camel_mmap_util_decode_fixed_int32 (in, &mi->references->references[i].id.part.lo); } } - - if (camel_file_util_decode_uint32(in, &count) == -1 || count > 500) + + if (camel_mmap_util_decode_uint32 (in, &count) == -1 || count > 500) goto error; - - for (i=0;i<count;i++) { + + for (i = 0; i < count; i++) { char *name; - if (camel_file_util_decode_string(in, &name) == -1 || name == NULL) + + if (camel_mmap_util_decode_string (in, &name) == -1 || name == NULL) goto error; - camel_flag_set(&mi->user_flags, name, TRUE); - g_free(name); + + camel_flag_set (&mi->user_flags, name, TRUE); } - - if (camel_file_util_decode_uint32(in, &count) == -1 || count > 500) + + if (camel_mmap_util_decode_uint32 (in, &count) == -1 || count > 500) goto error; - - for (i=0;i<count;i++) { + + 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) + + if (camel_mmap_util_decode_string (in, &name) == -1 || name == NULL + || camel_mmap_util_decode_string(in, &value) == -1) goto error; - camel_tag_set(&mi->user_tags, name, value); - g_free(name); - g_free(value); + + camel_tag_set (&mi->user_tags, name, value); } - - if (!ferror(in)) - return (CamelMessageInfo *)mi; - + + return (CamelMessageInfo *) mi; + error: camel_message_info_free((CamelMessageInfo *)mi); - + return NULL; } Index: camel-folder-summary.h =================================================================== RCS file: /cvs/gnome/evolution-data-server/camel/camel-folder-summary.h,v retrieving revision 1.86 diff -u -r1.86 camel-folder-summary.h --- camel-folder-summary.h 31 Aug 2005 04:21:56 -0000 1.86 +++ camel-folder-summary.h 19 Jul 2006 20:32:13 -0000 @@ -219,7 +219,9 @@ char *summary_path; gboolean build_content; /* do we try and parse/index the content, or not? */ - + + GMappedFile *map; + GPtrArray *messages; /* CamelMessageInfo's */ GHashTable *messages_uid; /* CamelMessageInfo's by uid */
_______________________________________________ Evolution-hackers mailing list Evolution-hackers@gnome.org http://mail.gnome.org/mailman/listinfo/evolution-hackers