/* Copyright (C) 2013 PCMan This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ #include "saveimagejob.h" #include "mainwindow.h" #include #include #include using namespace LxImage; SaveImageJob::SaveImageJob(const QImage & image, const Fm::FilePath & filePath): path_{filePath}, image_{image}, failed_{true} { } SaveImageJob::~SaveImageJob() { } // This is called from the worker thread, not main thread void SaveImageJob::exec() { const Fm::CStrPtr f = path_.baseName(); char const * format = f.get(); format = strrchr(format, '.'); if(format) // use filename extension as the image format ++format; QBuffer imageBuffer; image_.save(&imageBuffer, format); // save the image to buffer GFileOutputStream* fileStream = nullptr; Fm::GErrorPtr error; ErrorAction act = ErrorAction::RETRY; while (act == ErrorAction::RETRY && !isCancelled()) { error.reset(); if (nullptr == (fileStream = g_file_replace(path_.gfile().get(), NULL, false, G_FILE_CREATE_NONE, cancellable().get(), &error))) { act = emitError(error); continue; } // the file stream is successfually opened if (!isCancelled()) { GOutputStream* outputStream = G_OUTPUT_STREAM(fileStream); g_output_stream_write_all(outputStream, imageBuffer.data().constData(), imageBuffer.size(), NULL, cancellable().get(), &error); g_output_stream_close(outputStream, NULL, NULL); if (!error) { // successfully written failed_ = false; break; // successfully written } act = emitError(error); } } }