summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJeffrey Stedfast <fejj@ximian.com>2001-09-23 23:33:18 +0000
committerJeffrey Stedfast <fejj@src.gnome.org>2001-09-23 23:33:18 +0000
commit0ae4719920072166f7e666a7e11ffd6f395d16a5 (patch)
tree39c8a69890dc8e383ec19b7e3dc1850fbcdfb96f
parent9fb47f943bb738bad5cdaafcd1cfd339bb7f07f0 (diff)
downloadgmime-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--ChangeLog26
-rw-r--r--gmime-stream-file.c20
-rw-r--r--gmime-stream-fs.c18
-rw-r--r--gmime-stream-mem.c72
-rw-r--r--gmime/gmime-stream-file.c20
-rw-r--r--gmime/gmime-stream-fs.c18
-rw-r--r--gmime/gmime-stream-mem.c72
7 files changed, 190 insertions, 56 deletions
diff --git a/ChangeLog b/ChangeLog
index b62a4de1..a2475e8b 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -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;
}