From 6b132fe48a5fe75643cbff31b26f3d78e66da796 Mon Sep 17 00:00:00 2001 From: Not Zed Date: Thu, 29 Aug 2002 12:04:34 +0000 Subject: Change the case sensitive search of subject to expect case insensitive 2002-08-29 Not Zed * tests/folder/test3.c: Change the case sensitive search of subject to expect case insensitive results, as the behaviour has changed. (main): Made the search content before sync nonfatal. its something that needs to be fixed but not practical concern in evolution. * camel-block-file.c (block_file_validate_root): Only spit out the invalid root warnings if the file isn't empty. * camel-text-index.c (text_index_compress_nosync): Swap the path as well when we compress. * camel-mime-parser.c (folder_scan_content): Treat the end of file as a boundary if we're scanning From lines, and drop the last \n. (folder_scan_init_with_fd): Dont pre-read from the fd, and init eof. (folder_scan_init_with_stream): Similar. (folder_read): Handle eof, and set eof on 0 read. (folder_seek): Dont pre-read after a seek, and reset eof flag. (camel_mime_parser_init_with_fd): Fix doco, no pre-read occurs anymore. (camel_mime_parser_init_with_stream): Same. * providers/local/camel-mbox-summary.c (camel_mbox_summary_sync_mbox): Add a \n to end of content of each message, not at start. * providers/local/camel-mbox-folder.c (mbox_append_message): Instead of appending "\nFrom " to a mailbox, start with "From ", and append a \n after the message always. For better mutt/elm compatability. Also, unlock after we've stat'd. (mbox_append_message): Set the message's from_pos exactly as the mbox size. svn path=/trunk/; revision=17921 --- camel/ChangeLog | 36 +++++++++++ camel/camel-block-file.c | 23 ++++--- camel/camel-mime-parser.c | 98 +++++++++++------------------- camel/camel-text-index.c | 2 + camel/providers/local/camel-mbox-folder.c | 21 +++---- camel/providers/local/camel-mbox-summary.c | 12 ++++ camel/tests/folder/test3.c | 4 +- 7 files changed, 112 insertions(+), 84 deletions(-) (limited to 'camel') diff --git a/camel/ChangeLog b/camel/ChangeLog index 5175ad3b4f..c7183dd317 100644 --- a/camel/ChangeLog +++ b/camel/ChangeLog @@ -1,3 +1,39 @@ +2002-08-29 Not Zed + + * tests/folder/test3.c: Change the case sensitive search of + subject to expect case insensitive results, as the behaviour has + changed. + (main): Made the search content before sync nonfatal. its + something that needs to be fixed but not practical concern in + evolution. + + * camel-block-file.c (block_file_validate_root): Only spit out the + invalid root warnings if the file isn't empty. + + * camel-text-index.c (text_index_compress_nosync): Swap the path + as well when we compress. + + * camel-mime-parser.c (folder_scan_content): Treat the end of file + as a boundary if we're scanning From lines, and drop the last \n. + (folder_scan_init_with_fd): Dont pre-read from the fd, and init eof. + (folder_scan_init_with_stream): Similar. + (folder_read): Handle eof, and set eof on 0 read. + (folder_seek): Dont pre-read after a seek, and reset eof flag. + (camel_mime_parser_init_with_fd): Fix doco, no pre-read occurs + anymore. + (camel_mime_parser_init_with_stream): Same. + + * providers/local/camel-mbox-summary.c + (camel_mbox_summary_sync_mbox): Add a \n to end of content of each + message, not at start. + + * providers/local/camel-mbox-folder.c (mbox_append_message): + Instead of appending "\nFrom " to a mailbox, start with "From ", + and append a \n after the message always. For better mutt/elm + compatability. Also, unlock after we've stat'd. + (mbox_append_message): Set the message's from_pos exactly as the + mbox size. + 2002-08-28 Jeffrey Stedfast * camel-tcp-stream-openssl.c (stream_setsockopt): Fixed `set' to diff --git a/camel/camel-block-file.c b/camel/camel-block-file.c index bc485dd6e5..e61320b2ea 100644 --- a/camel/camel-block-file.c +++ b/camel/camel-block-file.c @@ -93,10 +93,11 @@ block_file_validate_root(CamelBlockFile *bs) { struct stat st; CamelBlockRoot *br; + int s; br = bs->root; - fstat(bs->fd, &st); + s = fstat(bs->fd, &st); d(printf("Validate root: '%s'\n", bs->path)); d(printf("version: %.8s (%.8s)\n", bs->root->version, bs->version)); @@ -117,15 +118,17 @@ block_file_validate_root(CamelBlockFile *bs) || st.st_size != br->last || br->free > st.st_size || (br->flags & CAMEL_BLOCK_FILE_SYNC) == 0) { - g_warning("Invalid root: '%s'", bs->path); - g_warning("version: %.8s (%.8s)", bs->root->version, bs->version); - g_warning("block size: %d (%d)%s", br->block_size, bs->block_size, - br->block_size != bs->block_size ? " BAD":" OK"); - g_warning("free: %ld (%d add size < %ld)%s", (long)br->free, br->free / bs->block_size * bs->block_size, (long)st.st_size, - (br->free > st.st_size) || (br->free % bs->block_size) != 0 ? " BAD":" OK"); - g_warning("last: %ld (%d and size: %ld)%s", (long)br->last, br->last / bs->block_size * bs->block_size, (long)st.st_size, - (br->last != st.st_size) || ((br->last % bs->block_size) != 0) ? " BAD": " OK"); - g_warning("flags: %s", (br->flags & CAMEL_BLOCK_FILE_SYNC)?"SYNC":"unSYNC"); + if (s != -1 && st.st_size > 0) { + g_warning("Invalid root: '%s'", bs->path); + g_warning("version: %.8s (%.8s)", bs->root->version, bs->version); + g_warning("block size: %d (%d)%s", br->block_size, bs->block_size, + br->block_size != bs->block_size ? " BAD":" OK"); + g_warning("free: %ld (%d add size < %ld)%s", (long)br->free, br->free / bs->block_size * bs->block_size, (long)st.st_size, + (br->free > st.st_size) || (br->free % bs->block_size) != 0 ? " BAD":" OK"); + g_warning("last: %ld (%d and size: %ld)%s", (long)br->last, br->last / bs->block_size * bs->block_size, (long)st.st_size, + (br->last != st.st_size) || ((br->last % bs->block_size) != 0) ? " BAD": " OK"); + g_warning("flags: %s", (br->flags & CAMEL_BLOCK_FILE_SYNC)?"SYNC":"unSYNC"); + } return -1; } diff --git a/camel/camel-mime-parser.c b/camel/camel-mime-parser.c index 4ecc945542..ed4f50ca46 100644 --- a/camel/camel-mime-parser.c +++ b/camel/camel-mime-parser.c @@ -228,6 +228,7 @@ struct _header_scan_state { unsigned int midline:1; /* are we mid-line interrupted? */ unsigned int scan_from:1; /* do we care about From lines? */ unsigned int scan_pre_from:1; /* do we return pre-from data? */ + unsigned int eof:1; /* reached eof? */ off_t start_of_from; /* where from started */ off_t start_of_headers; /* where headers started from the last scan */ @@ -572,9 +573,6 @@ camel_mime_parser_from_line(CamelMimeParser *m) * will be relative to the current file position of the file * descriptor. As a result, seekable descritors should * be seeked using the parser seek functions. - * - * An initial buffer will be read from the file descriptor - * immediately, although no parsing will occur. * * Return value: Returns -1 on error. **/ @@ -595,9 +593,6 @@ camel_mime_parser_init_with_fd(CamelMimeParser *m, int fd) * offsets will be relative to the current file position of * the stream. As a result, seekable streams should only * be seeked using the parser seek function. - * - * An initial buffer will be read from the stream - * immediately, although no parsing will occur. * * Return value: -1 on error. **/ @@ -965,7 +960,7 @@ folder_read(struct _header_scan_state *s) int len; int inoffset; - if (s->inptrinend-s->atleast) + if (s->inptrinend-s->atleast || s->eof) return s->inend-s->inptr; #ifdef PURIFY purify_watch_remove(inend_id); @@ -987,6 +982,7 @@ folder_read(struct _header_scan_state *s) s->seek += s->inptr - s->inbuf; s->inptr = s->inbuf; s->inend = s->inbuf+len+inoffset; + s->eof = (len == 0); r(printf("content = %d '%.*s'\n",s->inend - s->inptr, s->inend - s->inptr, s->inptr)); } else { s->ioerrno = errno?errno:EIO; @@ -1018,7 +1014,6 @@ static off_t folder_seek(struct _header_scan_state *s, off_t offset, int whence) { off_t newoffset; - int len; if (s->stream) { if (CAMEL_IS_SEEKABLE_STREAM(s->stream)) { @@ -1040,17 +1035,7 @@ folder_seek(struct _header_scan_state *s, off_t offset, int whence) s->seek = newoffset; s->inptr = s->inbuf; s->inend = s->inbuf; - if (s->stream) - len = camel_stream_read(s->stream, s->inbuf, SCAN_BUF); - else - len = read(s->fd, s->inbuf, SCAN_BUF); - if (len>=0) { - s->inend = s->inbuf+len; - s->inend[0] = '\n'; - } else { - newoffset = -1; - s->ioerrno = errno?errno:EIO; - } + s->eof = FALSE; } else { s->ioerrno = errno?errno:EIO; } @@ -1388,7 +1373,7 @@ folder_scan_content(struct _header_scan_state *s, int *lastone, char **data, int newatleast = 1; *lastone = FALSE; - c(printf("atleast = %d\n", s->atleast)); + c(printf("atleast = %d\n", newatleast)); do { s->atleast = newatleast; @@ -1428,7 +1413,7 @@ folder_scan_content(struct _header_scan_state *s, int *lastone, char **data, int } c(printf("ran out of input, dumping what i have (%d) bytes midline = %s\n", - inptr-start, s->midline?"TRUE":"FALSE")); + inptr-start, s->midline?"TRUE":"FALSE")); goto content; } newatleast = 1; @@ -1447,6 +1432,9 @@ folder_scan_content(struct _header_scan_state *s, int *lastone, char **data, int return NULL; content: + /* treat eof as the last boundary in From mode */ + if (s->scan_from && s->eof) + onboundary = TRUE; part = s->parts; normal_exit: s->atleast = atleast; @@ -1513,6 +1501,7 @@ folder_scan_init(void) s->midline = FALSE; s->scan_from = FALSE; s->scan_pre_from = FALSE; + s->eof = FALSE; s->filters = NULL; s->filterid = 1; @@ -1533,57 +1522,42 @@ drop_states(struct _header_scan_state *s) s->state = HSCAN_INITIAL; } +static void +folder_scan_reset(struct _header_scan_state *s) +{ + drop_states(s); + s->inend = s->inbuf; + s->inptr = s->inbuf; + s->inend[0] = '\n'; + if (s->fd != -1) { + close(s->fd); + s->fd = -1; + } + if (s->stream) { + camel_object_unref((CamelObject *)s->stream); + s->stream = NULL; + } + s->ioerrno = 0; + s->eof = FALSE; +} + static int folder_scan_init_with_fd(struct _header_scan_state *s, int fd) { - int len; + folder_scan_reset(s); + s->fd = fd; - len = read(fd, s->inbuf, SCAN_BUF); - if (len>=0) { - drop_states(s); - s->inend = s->inbuf+len; - s->inptr = s->inbuf; - s->inend[0] = '\n'; - if (s->fd != -1) - close(s->fd); - s->fd = fd; - if (s->stream) { - camel_object_unref((CamelObject *)s->stream); - s->stream = NULL; - } - s->ioerrno = 0; - return 0; - } else { - s->ioerrno = errno?errno:EIO; - return -1; - } + return 0; } static int folder_scan_init_with_stream(struct _header_scan_state *s, CamelStream *stream) { - int len; + folder_scan_reset(s); + s->stream = stream; + camel_object_ref((CamelObject *)stream); - len = camel_stream_read(stream, s->inbuf, SCAN_BUF); - if (len >= 0) { - drop_states(s); - s->inend = s->inbuf+len; - s->inptr = s->inbuf; - s->inend[0] = '\n'; - if (s->stream) - camel_object_unref((CamelObject *)s->stream); - s->stream = stream; - camel_object_ref((CamelObject *)stream); - if (s->fd != -1) { - close(s->fd); - s->fd = -1; - } - s->ioerrno = 0; - return 0; - } else { - s->ioerrno = errno?errno:EIO; - return -1; - } + return 0; } #define USE_FROM diff --git a/camel/camel-text-index.c b/camel/camel-text-index.c index 046c5a98de..3c490804fc 100644 --- a/camel/camel-text-index.c +++ b/camel/camel-text-index.c @@ -491,12 +491,14 @@ text_index_compress_nosync(CamelIndex *idx) #define myswap(a, b) { void *tmp = a; a = b; b = tmp; } /* Poke the private data across to the new object */ /* And change the fd's over, etc? */ + /* Yes: This is a hack */ myswap(newp->blocks, oldp->blocks); myswap(newp->links, oldp->links); myswap(newp->word_index, oldp->word_index); myswap(newp->word_hash, oldp->word_hash); myswap(newp->name_index, oldp->name_index); myswap(newp->name_hash, oldp->name_hash); + myswap(((CamelIndex *)newidx)->path, ((CamelIndex *)idx)->path); #undef myswap ret = 0; diff --git a/camel/providers/local/camel-mbox-folder.c b/camel/providers/local/camel-mbox-folder.c index 120f72e0bf..8d1fdfd543 100644 --- a/camel/providers/local/camel-mbox-folder.c +++ b/camel/providers/local/camel-mbox-folder.c @@ -217,7 +217,7 @@ mbox_append_message(CamelFolder *folder, CamelMimeMessage * message, const Camel } /* and we need to set the frompos/XEV explicitly */ - ((CamelMboxMessageInfo *)mi)->frompos = mbs->folder_size?mbs->folder_size+1:0; + ((CamelMboxMessageInfo *)mi)->frompos = mbs->folder_size; #if 0 xev = camel_local_summary_encode_x_evolution((CamelLocalSummary *)folder->summary, mi); if (xev) { @@ -228,24 +228,20 @@ mbox_append_message(CamelFolder *folder, CamelMimeMessage * message, const Camel } #endif - /* we must write this to the non-filtered stream ... prepend a \n if not at the start of the file */ + /* we must write this to the non-filtered stream ... */ fromline = camel_mbox_summary_build_from(((CamelMimePart *)message)->headers); - if (camel_stream_printf(output_stream, mbs->folder_size==0?"%s":"\n%s", fromline) == -1) + if (camel_stream_write(output_stream, fromline, strlen(fromline)) == -1) goto fail_write; - /* and write the content to the filtering stream, that translated '\nFrom' into '\n>From' */ + /* and write the content to the filtering stream, that translates '\nFrom' into '\n>From' */ filter_stream = (CamelStream *) camel_stream_filter_new_with_stream(output_stream); filter_from = (CamelMimeFilter *) camel_mime_filter_from_new(); camel_stream_filter_add((CamelStreamFilter *) filter_stream, filter_from); - if (camel_data_wrapper_write_to_stream((CamelDataWrapper *)message, filter_stream) == -1) + if (camel_data_wrapper_write_to_stream((CamelDataWrapper *)message, filter_stream) == -1 + || camel_stream_write(filter_stream, "\n", 1) == -1 + || camel_stream_close(filter_stream) == -1) goto fail_write; - if (camel_stream_close(filter_stream) == -1) - goto fail_write; - - /* unlock as soon as we can */ - camel_local_folder_unlock(lf); - /* filter stream ref's the output stream itself, so we need to unref it too */ camel_object_unref((CamelObject *)filter_from); camel_object_unref((CamelObject *)filter_stream); @@ -259,6 +255,9 @@ mbox_append_message(CamelFolder *folder, CamelMimeMessage * message, const Camel ((CamelFolderSummary *)mbs)->time = st.st_mtime; } + /* unlock as soon as we can */ + camel_local_folder_unlock(lf); + if (camel_folder_change_info_changed(lf->changes)) { camel_object_trigger_event((CamelObject *)folder, "folder_changed", lf->changes); camel_folder_change_info_clear(lf->changes); diff --git a/camel/providers/local/camel-mbox-summary.c b/camel/providers/local/camel-mbox-summary.c index f68709fc73..564914aa59 100644 --- a/camel/providers/local/camel-mbox-summary.c +++ b/camel/providers/local/camel-mbox-summary.c @@ -941,8 +941,10 @@ camel_mbox_summary_sync_mbox(CamelMboxSummary *cls, guint32 flags, CamelFolderCh lastdel = TRUE; } else { /* otherwise, the message is staying, copy its From_ line across */ +#if 0 if (i>0) write(fdout, "\n", 1); +#endif info->frompos = lseek(fdout, 0, SEEK_CUR); fromline = camel_mime_parser_from_line(mp); write(fdout, fromline, strlen(fromline)); @@ -993,6 +995,14 @@ camel_mbox_summary_sync_mbox(CamelMboxSummary *cls, guint32 flags, CamelFolderCh goto error; } } + + if (write(fdout, "\n", 1) != 1) { + camel_exception_setv(ex, CAMEL_EXCEPTION_SYSTEM, + _("Error writing to temp mailbox: %s"), + strerror(errno)); + goto error; + } + d(printf("we are now at %d, from = %d\n", (int)camel_mime_parser_tell(mp), (int)camel_mime_parser_tell_start_from(mp))); camel_mime_parser_unstep(mp); @@ -1001,9 +1011,11 @@ camel_mbox_summary_sync_mbox(CamelMboxSummary *cls, guint32 flags, CamelFolderCh } } +#if 0 /* if last was deleted, append the \n we removed */ if (lastdel && count > 0) write(fdout, "\n", 1); +#endif camel_object_unref((CamelObject *)mp); diff --git a/camel/tests/folder/test3.c b/camel/tests/folder/test3.c index 14be8ed570..1449821d91 100644 --- a/camel/tests/folder/test3.c +++ b/camel/tests/folder/test3.c @@ -73,7 +73,7 @@ static struct { { { 1, 1, 0 }, "(header-matches \"subject\" \"Test1 message99 subject\")" }, { { 100, 50, 0 }, "(header-contains \"subject\" \"subject\")" }, - { { 0, 0, 0 }, "(header-contains \"subject\" \"Subject\")" }, + { { 100, 50, 0 }, "(header-contains \"subject\" \"Subject\")" }, { { 100, 50, 0 }, "(body-contains \"content\")" }, { { 100, 50, 0 }, "(body-contains \"Content\")" }, @@ -251,9 +251,11 @@ int main(int argc, char **argv) camel_folder_free_uids(folder, uids); pull(); + camel_test_nonfatal("Index not guaranteed to be accurate before sync: should be fixed eventually"); push("Search before sync"); run_search(folder, 100); pull(); + camel_test_fatal(); push("syncing folder, searching"); camel_folder_sync(folder, FALSE, ex); -- cgit v1.2.3