diff options
author | Jeffrey Stedfast <fejj@ximian.com> | 2001-09-23 23:33:18 +0000 |
---|---|---|
committer | Jeffrey Stedfast <fejj@src.gnome.org> | 2001-09-23 23:33:18 +0000 |
commit | 0ae4719920072166f7e666a7e11ffd6f395d16a5 (patch) | |
tree | 39c8a69890dc8e383ec19b7e3dc1850fbcdfb96f | |
parent | 9fb47f943bb738bad5cdaafcd1cfd339bb7f07f0 (diff) | |
download | gmime-0ae4719920072166f7e666a7e11ffd6f395d16a5.tar.gz |
Seek to the position we think we're at before attempting to write, and
2001-09-23 Jeffrey Stedfast <fejj@ximian.com>
* gmime-stream-fs.c (stream_write): Seek to the position we think
we're at before attempting to write, and increment the stream
position after the write.
* gmime-stream-file.c (stream_write): Seek to the position we
think we're at... this is just in case we are or have substreams
that might have read or written in the meantime. Also remember to
increment the stream position after the write.
(stream_eos): Only return feof() if our end boundary is unlimited.
* gmime-stream-mem.c (stream_write): Start writing data at
stream->position rather always appending it to the end of the mem
stream. Also don't go writing past the end boundary if it's set.
(stream_length): Use a relative bound_end.
(stream_seek): Same.
(stream_eos): Here too.
(stream_write): And here.
(stream_read): And here.
(stream_substream): Correctly set the bounds.
(g_mime_stream_mem_new): Here too.
(g_mime_stream_mem_new_with_byte_array): And here.
(g_mime_stream_mem_new_with_buffer): Same.
(g_mime_stream_mem_set_byte_array): And finally here.
-rw-r--r-- | ChangeLog | 26 | ||||
-rw-r--r-- | gmime-stream-file.c | 20 | ||||
-rw-r--r-- | gmime-stream-fs.c | 18 | ||||
-rw-r--r-- | gmime-stream-mem.c | 72 | ||||
-rw-r--r-- | gmime/gmime-stream-file.c | 20 | ||||
-rw-r--r-- | gmime/gmime-stream-fs.c | 18 | ||||
-rw-r--r-- | gmime/gmime-stream-mem.c | 72 |
7 files changed, 190 insertions, 56 deletions
@@ -1,3 +1,29 @@ +2001-09-23 Jeffrey Stedfast <fejj@ximian.com> + + * gmime-stream-fs.c (stream_write): Seek to the position we think + we're at before attempting to write, and increment the stream + position after the write. + + * gmime-stream-file.c (stream_write): Seek to the position we + think we're at... this is just in case we are or have substreams + that might have read or written in the meantime. Also remember to + increment the stream position after the write. + (stream_eos): Only return feof() if our end boundary is unlimited. + + * gmime-stream-mem.c (stream_write): Start writing data at + stream->position rather always appending it to the end of the mem + stream. Also don't go writing past the end boundary if it's set. + (stream_length): Use a relative bound_end. + (stream_seek): Same. + (stream_eos): Here too. + (stream_write): And here. + (stream_read): And here. + (stream_substream): Correctly set the bounds. + (g_mime_stream_mem_new): Here too. + (g_mime_stream_mem_new_with_byte_array): And here. + (g_mime_stream_mem_new_with_buffer): Same. + (g_mime_stream_mem_set_byte_array): And finally here. + 2001-09-22 Jeffrey Stedfast <fejj@ximian.com> * test-streams.c: New test suite for streams. diff --git a/gmime-stream-file.c b/gmime-stream-file.c index bb889a8f..a6d8901d 100644 --- a/gmime-stream-file.c +++ b/gmime-stream-file.c @@ -64,7 +64,7 @@ stream_read (GMimeStream *stream, char *buf, size_t len) GMimeStreamFile *fstream = (GMimeStreamFile *) stream; ssize_t nread; - if (stream->bound_end != -1 && stream->position > stream->bound_end) + if (stream->bound_end != -1 && stream->position >= stream->bound_end) return -1; if (stream->bound_end != -1) @@ -85,14 +85,23 @@ static ssize_t stream_write (GMimeStream *stream, char *buf, size_t len) { GMimeStreamFile *fstream = (GMimeStreamFile *) stream; + ssize_t nwritten; - if (stream->bound_end == -1 && stream->position > stream->bound_end) + if (stream->bound_end != -1 && stream->position >= stream->bound_end) return -1; if (stream->bound_end != -1) len = MIN (stream->bound_end - stream->position, len); - return fwrite (buf, 1, len, fstream->fp); + /* make sure we are at the right position */ + fseek (fstream->fp, stream->position, SEEK_SET); + + nwritten = fwrite (buf, 1, len, fstream->fp); + + if (nwritten > 0) + stream->position += nwritten; + + return nwritten; } static int @@ -127,7 +136,10 @@ stream_eos (GMimeStream *stream) g_return_val_if_fail (fstream->fp != NULL, TRUE); - return feof (fstream->fp) ? TRUE : FALSE; + if (stream->bound_end == -1) + return feof (fstream->fp) ? TRUE : FALSE; + else + return stream->position >= stream->bound_end; } static int diff --git a/gmime-stream-fs.c b/gmime-stream-fs.c index 2645e78e..26098776 100644 --- a/gmime-stream-fs.c +++ b/gmime-stream-fs.c @@ -69,7 +69,7 @@ stream_read (GMimeStream *stream, char *buf, size_t len) GMimeStreamFs *fstream = (GMimeStreamFs *) stream; ssize_t nread; - if (stream->bound_end != -1 && stream->position > stream->bound_end) + if (stream->bound_end != -1 && stream->position >= stream->bound_end) return -1; if (stream->bound_end != -1) @@ -94,21 +94,27 @@ static ssize_t stream_write (GMimeStream *stream, char *buf, size_t len) { GMimeStreamFs *fstream = (GMimeStreamFs *) stream; - ssize_t written = 0, n; + ssize_t nwritten = 0, n; - if (stream->bound_end == -1 && stream->position > stream->bound_end) + if (stream->bound_end != -1 && stream->position >= stream->bound_end) return -1; if (stream->bound_end != -1) len = MIN (stream->bound_end - stream->position, len); + /* make sure we are at the right position */ + lseek (fstream->fd, stream->position, SEEK_SET); + do { - n = write (fstream->fd, buf + written, len - written); + n = write (fstream->fd, buf + nwritten, len - nwritten); if (n > 0) - written += n; + nwritten += n; } while (n == -1 && errno == EINTR); - return written; + if (nwritten > 0) + stream->position += nwritten; + + return nwritten; } static int diff --git a/gmime-stream-mem.c b/gmime-stream-mem.c index 53daf584..5eb3203e 100644 --- a/gmime-stream-mem.c +++ b/gmime-stream-mem.c @@ -60,11 +60,14 @@ static ssize_t stream_read (GMimeStream *stream, char *buf, size_t len) { GMimeStreamMem *mem = (GMimeStreamMem *) stream; + off_t bound_end; ssize_t n; - g_return_val_if_fail (stream->position <= stream->bound_end, -1); + g_return_val_if_fail (mem->buffer != NULL, -1); + + bound_end = stream->bound_end != -1 ? stream->bound_end : mem->buffer->len; - n = MIN (stream->bound_end - stream->position, len); + n = MIN (bound_end - stream->position, len); if (n > 0) { memcpy (buf, mem->buffer->data + stream->position, n); stream->position += n; @@ -77,11 +80,23 @@ static ssize_t stream_write (GMimeStream *stream, char *buf, size_t len) { GMimeStreamMem *mem = (GMimeStreamMem *) stream; + off_t bound_end; + ssize_t n; - g_byte_array_append (mem->buffer, buf, len); - stream->bound_end = mem->buffer->len; + g_return_val_if_fail (mem->buffer != NULL, -1); - return len; + if (stream->bound_end == -1 && stream->position + len > mem->buffer->len) + g_byte_array_set_size (mem->buffer, stream->position + len); + + bound_end = stream->bound_end != -1 ? stream->bound_end : mem->buffer->len; + + n = MIN (bound_end - stream->position, len); + if (n > 0) { + memcpy (mem->buffer->data + stream->position, buf, n); + stream->position += n; + } + + return n; } static int @@ -95,7 +110,7 @@ stream_close (GMimeStream *stream) { GMimeStreamMem *mem = (GMimeStreamMem *) stream; - if (mem->owner) + if (mem->owner && mem->buffer) g_byte_array_free (mem->buffer, TRUE); mem->buffer = NULL; @@ -108,8 +123,13 @@ static gboolean stream_eos (GMimeStream *stream) { GMimeStreamMem *mem = (GMimeStreamMem *) stream; + off_t bound_end; + + g_return_val_if_fail (mem->buffer != NULL, TRUE); - return mem->buffer ? stream->position >= stream->bound_end : TRUE; + bound_end = stream->bound_end != -1 ? stream->bound_end : mem->buffer->len; + + return mem->buffer ? stream->position >= bound_end : TRUE; } static int @@ -117,6 +137,8 @@ stream_reset (GMimeStream *stream) { GMimeStreamMem *mem = (GMimeStreamMem *) stream; + g_return_val_if_fail (mem->buffer != NULL, -1); + stream->position = stream->bound_start; return 0; @@ -126,22 +148,25 @@ static off_t stream_seek (GMimeStream *stream, off_t offset, GMimeSeekWhence whence) { GMimeStreamMem *mem = (GMimeStreamMem *) stream; + off_t bound_end; g_return_val_if_fail (mem->buffer != NULL, -1); + bound_end = stream->bound_end != -1 ? stream->bound_end : mem->buffer->len; + switch (whence) { case GMIME_STREAM_SEEK_SET: - stream->position = MIN (offset + stream->bound_start, stream->bound_end); + stream->position = MIN (offset + stream->bound_start, bound_end); break; case GMIME_STREAM_SEEK_END: - stream->position = MAX (offset + stream->bound_end, 0); + stream->position = MAX (offset + bound_end, 0); break; case GMIME_STREAM_SEEK_CUR: stream->position += offset; if (stream->position < stream->bound_start) stream->position = stream->bound_start; - else if (stream->position > stream->bound_end) - stream->position = stream->bound_end; + else if (stream->position > bound_end) + stream->position = bound_end; } return 0; @@ -150,13 +175,24 @@ stream_seek (GMimeStream *stream, off_t offset, GMimeSeekWhence whence) static off_t stream_tell (GMimeStream *stream) { + GMimeStreamMem *mem = (GMimeStreamMem *) stream; + + g_return_val_if_fail (mem->buffer != NULL, -1); + return stream->position - stream->bound_start; } static ssize_t stream_length (GMimeStream *stream) { - return stream->bound_end - stream->bound_start; + GMimeStreamMem *mem = GMIME_STREAM_MEM (stream); + off_t bound_end; + + g_return_val_if_fail (mem->buffer != NULL, -1); + + bound_end = stream->bound_end != -1 ? stream->bound_end : mem->buffer->len; + + return bound_end - stream->bound_start; } static GMimeStream * @@ -188,7 +224,7 @@ g_mime_stream_mem_new (void) mem->owner = TRUE; mem->buffer = g_byte_array_new (); - g_mime_stream_construct (GMIME_STREAM (mem), &template, GMIME_STREAM_MEM_TYPE, 0, 0); + g_mime_stream_construct (GMIME_STREAM (mem), &template, GMIME_STREAM_MEM_TYPE, 0, -1); return GMIME_STREAM (mem); } @@ -209,7 +245,7 @@ g_mime_stream_mem_new_with_byte_array (GByteArray *array) mem->owner = TRUE; mem->buffer = array; - g_mime_stream_construct (GMIME_STREAM (mem), &template, GMIME_STREAM_MEM_TYPE, 0, array->len); + g_mime_stream_construct (GMIME_STREAM (mem), &template, GMIME_STREAM_MEM_TYPE, 0, -1); return GMIME_STREAM (mem); } @@ -227,13 +263,13 @@ g_mime_stream_mem_new_with_buffer (const char *buffer, size_t len) { GMimeStreamMem *mem; - mem = g_new0 (GMimeStreamMem, 1); + mem = g_new (GMimeStreamMem, 1); mem->owner = TRUE; mem->buffer = g_byte_array_new (); g_byte_array_append (mem->buffer, buffer, len); - g_mime_stream_construct (GMIME_STREAM (mem), &template, GMIME_STREAM_MEM_TYPE, 0, len); + g_mime_stream_construct (GMIME_STREAM (mem), &template, GMIME_STREAM_MEM_TYPE, 0, -1); return GMIME_STREAM (mem); } @@ -261,9 +297,9 @@ g_mime_stream_mem_set_byte_array (GMimeStreamMem *mem, GByteArray *array) mem->buffer = array; mem->owner = FALSE; - stream = (GMimeStream *) mem; + stream = GMIME_STREAM (mem); stream->position = 0; stream->bound_start = 0; - stream->bound_end = array->len; + stream->bound_end = -1; } diff --git a/gmime/gmime-stream-file.c b/gmime/gmime-stream-file.c index bb889a8f..a6d8901d 100644 --- a/gmime/gmime-stream-file.c +++ b/gmime/gmime-stream-file.c @@ -64,7 +64,7 @@ stream_read (GMimeStream *stream, char *buf, size_t len) GMimeStreamFile *fstream = (GMimeStreamFile *) stream; ssize_t nread; - if (stream->bound_end != -1 && stream->position > stream->bound_end) + if (stream->bound_end != -1 && stream->position >= stream->bound_end) return -1; if (stream->bound_end != -1) @@ -85,14 +85,23 @@ static ssize_t stream_write (GMimeStream *stream, char *buf, size_t len) { GMimeStreamFile *fstream = (GMimeStreamFile *) stream; + ssize_t nwritten; - if (stream->bound_end == -1 && stream->position > stream->bound_end) + if (stream->bound_end != -1 && stream->position >= stream->bound_end) return -1; if (stream->bound_end != -1) len = MIN (stream->bound_end - stream->position, len); - return fwrite (buf, 1, len, fstream->fp); + /* make sure we are at the right position */ + fseek (fstream->fp, stream->position, SEEK_SET); + + nwritten = fwrite (buf, 1, len, fstream->fp); + + if (nwritten > 0) + stream->position += nwritten; + + return nwritten; } static int @@ -127,7 +136,10 @@ stream_eos (GMimeStream *stream) g_return_val_if_fail (fstream->fp != NULL, TRUE); - return feof (fstream->fp) ? TRUE : FALSE; + if (stream->bound_end == -1) + return feof (fstream->fp) ? TRUE : FALSE; + else + return stream->position >= stream->bound_end; } static int diff --git a/gmime/gmime-stream-fs.c b/gmime/gmime-stream-fs.c index 2645e78e..26098776 100644 --- a/gmime/gmime-stream-fs.c +++ b/gmime/gmime-stream-fs.c @@ -69,7 +69,7 @@ stream_read (GMimeStream *stream, char *buf, size_t len) GMimeStreamFs *fstream = (GMimeStreamFs *) stream; ssize_t nread; - if (stream->bound_end != -1 && stream->position > stream->bound_end) + if (stream->bound_end != -1 && stream->position >= stream->bound_end) return -1; if (stream->bound_end != -1) @@ -94,21 +94,27 @@ static ssize_t stream_write (GMimeStream *stream, char *buf, size_t len) { GMimeStreamFs *fstream = (GMimeStreamFs *) stream; - ssize_t written = 0, n; + ssize_t nwritten = 0, n; - if (stream->bound_end == -1 && stream->position > stream->bound_end) + if (stream->bound_end != -1 && stream->position >= stream->bound_end) return -1; if (stream->bound_end != -1) len = MIN (stream->bound_end - stream->position, len); + /* make sure we are at the right position */ + lseek (fstream->fd, stream->position, SEEK_SET); + do { - n = write (fstream->fd, buf + written, len - written); + n = write (fstream->fd, buf + nwritten, len - nwritten); if (n > 0) - written += n; + nwritten += n; } while (n == -1 && errno == EINTR); - return written; + if (nwritten > 0) + stream->position += nwritten; + + return nwritten; } static int diff --git a/gmime/gmime-stream-mem.c b/gmime/gmime-stream-mem.c index 53daf584..5eb3203e 100644 --- a/gmime/gmime-stream-mem.c +++ b/gmime/gmime-stream-mem.c @@ -60,11 +60,14 @@ static ssize_t stream_read (GMimeStream *stream, char *buf, size_t len) { GMimeStreamMem *mem = (GMimeStreamMem *) stream; + off_t bound_end; ssize_t n; - g_return_val_if_fail (stream->position <= stream->bound_end, -1); + g_return_val_if_fail (mem->buffer != NULL, -1); + + bound_end = stream->bound_end != -1 ? stream->bound_end : mem->buffer->len; - n = MIN (stream->bound_end - stream->position, len); + n = MIN (bound_end - stream->position, len); if (n > 0) { memcpy (buf, mem->buffer->data + stream->position, n); stream->position += n; @@ -77,11 +80,23 @@ static ssize_t stream_write (GMimeStream *stream, char *buf, size_t len) { GMimeStreamMem *mem = (GMimeStreamMem *) stream; + off_t bound_end; + ssize_t n; - g_byte_array_append (mem->buffer, buf, len); - stream->bound_end = mem->buffer->len; + g_return_val_if_fail (mem->buffer != NULL, -1); - return len; + if (stream->bound_end == -1 && stream->position + len > mem->buffer->len) + g_byte_array_set_size (mem->buffer, stream->position + len); + + bound_end = stream->bound_end != -1 ? stream->bound_end : mem->buffer->len; + + n = MIN (bound_end - stream->position, len); + if (n > 0) { + memcpy (mem->buffer->data + stream->position, buf, n); + stream->position += n; + } + + return n; } static int @@ -95,7 +110,7 @@ stream_close (GMimeStream *stream) { GMimeStreamMem *mem = (GMimeStreamMem *) stream; - if (mem->owner) + if (mem->owner && mem->buffer) g_byte_array_free (mem->buffer, TRUE); mem->buffer = NULL; @@ -108,8 +123,13 @@ static gboolean stream_eos (GMimeStream *stream) { GMimeStreamMem *mem = (GMimeStreamMem *) stream; + off_t bound_end; + + g_return_val_if_fail (mem->buffer != NULL, TRUE); - return mem->buffer ? stream->position >= stream->bound_end : TRUE; + bound_end = stream->bound_end != -1 ? stream->bound_end : mem->buffer->len; + + return mem->buffer ? stream->position >= bound_end : TRUE; } static int @@ -117,6 +137,8 @@ stream_reset (GMimeStream *stream) { GMimeStreamMem *mem = (GMimeStreamMem *) stream; + g_return_val_if_fail (mem->buffer != NULL, -1); + stream->position = stream->bound_start; return 0; @@ -126,22 +148,25 @@ static off_t stream_seek (GMimeStream *stream, off_t offset, GMimeSeekWhence whence) { GMimeStreamMem *mem = (GMimeStreamMem *) stream; + off_t bound_end; g_return_val_if_fail (mem->buffer != NULL, -1); + bound_end = stream->bound_end != -1 ? stream->bound_end : mem->buffer->len; + switch (whence) { case GMIME_STREAM_SEEK_SET: - stream->position = MIN (offset + stream->bound_start, stream->bound_end); + stream->position = MIN (offset + stream->bound_start, bound_end); break; case GMIME_STREAM_SEEK_END: - stream->position = MAX (offset + stream->bound_end, 0); + stream->position = MAX (offset + bound_end, 0); break; case GMIME_STREAM_SEEK_CUR: stream->position += offset; if (stream->position < stream->bound_start) stream->position = stream->bound_start; - else if (stream->position > stream->bound_end) - stream->position = stream->bound_end; + else if (stream->position > bound_end) + stream->position = bound_end; } return 0; @@ -150,13 +175,24 @@ stream_seek (GMimeStream *stream, off_t offset, GMimeSeekWhence whence) static off_t stream_tell (GMimeStream *stream) { + GMimeStreamMem *mem = (GMimeStreamMem *) stream; + + g_return_val_if_fail (mem->buffer != NULL, -1); + return stream->position - stream->bound_start; } static ssize_t stream_length (GMimeStream *stream) { - return stream->bound_end - stream->bound_start; + GMimeStreamMem *mem = GMIME_STREAM_MEM (stream); + off_t bound_end; + + g_return_val_if_fail (mem->buffer != NULL, -1); + + bound_end = stream->bound_end != -1 ? stream->bound_end : mem->buffer->len; + + return bound_end - stream->bound_start; } static GMimeStream * @@ -188,7 +224,7 @@ g_mime_stream_mem_new (void) mem->owner = TRUE; mem->buffer = g_byte_array_new (); - g_mime_stream_construct (GMIME_STREAM (mem), &template, GMIME_STREAM_MEM_TYPE, 0, 0); + g_mime_stream_construct (GMIME_STREAM (mem), &template, GMIME_STREAM_MEM_TYPE, 0, -1); return GMIME_STREAM (mem); } @@ -209,7 +245,7 @@ g_mime_stream_mem_new_with_byte_array (GByteArray *array) mem->owner = TRUE; mem->buffer = array; - g_mime_stream_construct (GMIME_STREAM (mem), &template, GMIME_STREAM_MEM_TYPE, 0, array->len); + g_mime_stream_construct (GMIME_STREAM (mem), &template, GMIME_STREAM_MEM_TYPE, 0, -1); return GMIME_STREAM (mem); } @@ -227,13 +263,13 @@ g_mime_stream_mem_new_with_buffer (const char *buffer, size_t len) { GMimeStreamMem *mem; - mem = g_new0 (GMimeStreamMem, 1); + mem = g_new (GMimeStreamMem, 1); mem->owner = TRUE; mem->buffer = g_byte_array_new (); g_byte_array_append (mem->buffer, buffer, len); - g_mime_stream_construct (GMIME_STREAM (mem), &template, GMIME_STREAM_MEM_TYPE, 0, len); + g_mime_stream_construct (GMIME_STREAM (mem), &template, GMIME_STREAM_MEM_TYPE, 0, -1); return GMIME_STREAM (mem); } @@ -261,9 +297,9 @@ g_mime_stream_mem_set_byte_array (GMimeStreamMem *mem, GByteArray *array) mem->buffer = array; mem->owner = FALSE; - stream = (GMimeStream *) mem; + stream = GMIME_STREAM (mem); stream->position = 0; stream->bound_start = 0; - stream->bound_end = array->len; + stream->bound_end = -1; } |