summaryrefslogtreecommitdiff
path: root/src/cairo-output-stream.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/cairo-output-stream.c')
-rw-r--r--src/cairo-output-stream.c43
1 files changed, 37 insertions, 6 deletions
diff --git a/src/cairo-output-stream.c b/src/cairo-output-stream.c
index c31c2da5..9a58aac2 100644
--- a/src/cairo-output-stream.c
+++ b/src/cairo-output-stream.c
@@ -70,9 +70,11 @@
void
_cairo_output_stream_init (cairo_output_stream_t *stream,
cairo_output_stream_write_func_t write_func,
+ cairo_output_stream_flush_func_t flush_func,
cairo_output_stream_close_func_t close_func)
{
stream->write_func = write_func;
+ stream->flush_func = flush_func;
stream->close_func = close_func;
stream->position = 0;
stream->status = CAIRO_STATUS_SUCCESS;
@@ -87,6 +89,7 @@ _cairo_output_stream_fini (cairo_output_stream_t *stream)
const cairo_output_stream_t _cairo_output_stream_nil = {
NULL, /* write_func */
+ NULL, /* flush_func */
NULL, /* close_func */
0, /* position */
CAIRO_STATUS_NO_MEMORY,
@@ -95,6 +98,7 @@ const cairo_output_stream_t _cairo_output_stream_nil = {
static const cairo_output_stream_t _cairo_output_stream_nil_write_error = {
NULL, /* write_func */
+ NULL, /* flush_func */
NULL, /* close_func */
0, /* position */
CAIRO_STATUS_WRITE_ERROR,
@@ -148,7 +152,8 @@ _cairo_output_stream_create (cairo_write_func_t write_func,
return (cairo_output_stream_t *) &_cairo_output_stream_nil;
}
- _cairo_output_stream_init (&stream->base, closure_write, closure_close);
+ _cairo_output_stream_init (&stream->base,
+ closure_write, NULL, closure_close);
stream->write_func = write_func;
stream->close_func = close_func;
stream->closure = closure;
@@ -173,13 +178,37 @@ _cairo_output_stream_create_in_error (cairo_status_t status)
return (cairo_output_stream_t *) &_cairo_output_stream_nil;
}
- _cairo_output_stream_init (stream, NULL, NULL);
+ _cairo_output_stream_init (stream, NULL, NULL, NULL);
stream->status = status;
return stream;
}
cairo_status_t
+_cairo_output_stream_flush (cairo_output_stream_t *stream)
+{
+ cairo_status_t status;
+
+ if (stream->closed)
+ return stream->status;
+
+ if (stream == &_cairo_output_stream_nil ||
+ stream == &_cairo_output_stream_nil_write_error)
+ {
+ return stream->status;
+ }
+
+ if (stream->flush_func) {
+ status = stream->flush_func (stream);
+ /* Don't overwrite a pre-existing status failure. */
+ if (stream->status == CAIRO_STATUS_SUCCESS)
+ stream->status = status;
+ }
+
+ return stream->status;
+}
+
+cairo_status_t
_cairo_output_stream_close (cairo_output_stream_t *stream)
{
cairo_status_t status;
@@ -574,7 +603,8 @@ _cairo_output_stream_create_for_file (FILE *file)
return (cairo_output_stream_t *) &_cairo_output_stream_nil;
}
- _cairo_output_stream_init (&stream->base, stdio_write, stdio_flush);
+ _cairo_output_stream_init (&stream->base,
+ stdio_write, stdio_flush, stdio_flush);
stream->file = file;
return &stream->base;
@@ -608,7 +638,8 @@ _cairo_output_stream_create_for_filename (const char *filename)
return (cairo_output_stream_t *) &_cairo_output_stream_nil;
}
- _cairo_output_stream_init (&stream->base, stdio_write, stdio_close);
+ _cairo_output_stream_init (&stream->base,
+ stdio_write, stdio_flush, stdio_close);
stream->file = file;
return &stream->base;
@@ -650,7 +681,7 @@ _cairo_memory_stream_create (void)
return (cairo_output_stream_t *) &_cairo_output_stream_nil;
}
- _cairo_output_stream_init (&stream->base, memory_write, memory_close);
+ _cairo_output_stream_init (&stream->base, memory_write, NULL, memory_close);
_cairo_array_init (&stream->array, 1);
return &stream->base;
@@ -727,7 +758,7 @@ _cairo_null_stream_create (void)
return (cairo_output_stream_t *) &_cairo_output_stream_nil;
}
- _cairo_output_stream_init (stream, null_write, NULL);
+ _cairo_output_stream_init (stream, null_write, NULL, NULL);
return stream;
}