diff --git a/examples/c++/qt/advanced-with-c++-api/qtsail.cpp b/examples/c++/qt/advanced-with-c++-api/qtsail.cpp index 80685c6a..2bbdb650 100644 --- a/examples/c++/qt/advanced-with-c++-api/qtsail.cpp +++ b/examples/c++/qt/advanced-with-c++-api/qtsail.cpp @@ -160,6 +160,7 @@ sail_status_t QtSail::saveImage(const QString &path, const QImage &qimage) sail::image_output image_output(path.toLocal8Bit().constData()); image_output.with(save_options); SAIL_TRY(image_output.next_frame(image)); + SAIL_TRY(image_output.finish()); return SAIL_OK; } diff --git a/src/bindings/c++/image_input-c++.cpp b/src/bindings/c++/image_input-c++.cpp index 3e4043ab..48346cc8 100644 --- a/src/bindings/c++/image_input-c++.cpp +++ b/src/bindings/c++/image_input-c++.cpp @@ -116,7 +116,7 @@ image_input::image_input(sail::abstract_io &abstract_io) image_input::~image_input() { if (d) { - SAIL_TRY_OR_SUPPRESS(sail_stop_loading(d->state)); + finish(); } } @@ -179,6 +179,17 @@ image image_input::next_frame() return image; } +sail_status_t image_input::finish() +{ + sail_status_t saved_status = SAIL_OK; + SAIL_TRY_OR_EXECUTE(sail_stop_loading(d->state), + /* on error */ saved_status = __sail_error_result); + + d->state = nullptr; + + return saved_status; +} + std::tuple image_input::probe() { const sail_codec_info *sail_codec_info; diff --git a/src/bindings/c++/image_input-c++.h b/src/bindings/c++/image_input-c++.h index b90f4ffe..4485bcb2 100644 --- a/src/bindings/c++/image_input-c++.h +++ b/src/bindings/c++/image_input-c++.h @@ -79,7 +79,7 @@ class SAIL_EXPORT image_input explicit image_input(sail::abstract_io &abstract_io); /* - * Stops loading and destroys the image input. + * Finishes loading and destroys the image input. */ ~image_input(); @@ -118,6 +118,13 @@ class SAIL_EXPORT image_input */ image next_frame(); + /* + * Finishes loading and closes the I/O stream. Call to finish() is optional. + * + * Returns SAIL_OK on success. + */ + sail_status_t finish(); + /* * Loads the image and returns its properties without pixels and the corresponding * codec info. diff --git a/src/bindings/c++/image_output-c++.cpp b/src/bindings/c++/image_output-c++.cpp index 08be925c..c21b6bde 100644 --- a/src/bindings/c++/image_output-c++.cpp +++ b/src/bindings/c++/image_output-c++.cpp @@ -111,7 +111,7 @@ image_output::image_output(sail::abstract_io &abstract_io, const sail::codec_inf image_output::~image_output() { if (d) { - SAIL_TRY_OR_SUPPRESS(sail_stop_saving(d->state)); + finish(); } } @@ -162,4 +162,15 @@ sail_status_t image_output::next_frame(const sail::image &image) return SAIL_OK; } +sail_status_t image_output::finish() +{ + sail_status_t saved_status = SAIL_OK; + SAIL_TRY_OR_EXECUTE(sail_stop_saving(d->state), + /* on error */ saved_status = __sail_error_result); + + d->state = nullptr; + + return saved_status; +} + } diff --git a/src/bindings/c++/image_output-c++.h b/src/bindings/c++/image_output-c++.h index 18ab54d4..72f2c5ec 100644 --- a/src/bindings/c++/image_output-c++.h +++ b/src/bindings/c++/image_output-c++.h @@ -78,7 +78,7 @@ class SAIL_EXPORT image_output image_output(sail::abstract_io &abstract_io, const sail::codec_info &codec_info); /* - * Stops saving and destroys the image output. + * Finishes saving and destroys the image output. */ ~image_output(); @@ -112,6 +112,14 @@ class SAIL_EXPORT image_output */ sail_status_t next_frame(const sail::image &image); + /* + * Finishes saving and closes the I/O stream. Call to finish() is recommended + * if you want to ensure the I/O stream is flushed and closed successfully. + * + * Returns SAIL_OK on success. + */ + sail_status_t finish(); + private: class pimpl; std::unique_ptr d;