diff --git a/src/App/Document.cpp b/src/App/Document.cpp index e14c4c17ff..3b7e3c2ea7 100644 --- a/src/App/Document.cpp +++ b/src/App/Document.cpp @@ -2186,6 +2186,7 @@ bool Document::saveToFile(const char* filename) const // open extra scope to close ZipWriter properly { Base::ofstream file(tmp, std::ios::out | std::ios::binary); + Base::ZipWriter writer(file); if (!file.is_open()) { throw Base::FileException("Failed to open file", tmp); @@ -2211,9 +2212,12 @@ bool Document::saveToFile(const char* filename) const // write additional files writer.writeFiles(); - if (writer.hasErrors()) { - throw Base::FileException("Failed to write all data to file", tmp); + // retrieve Writer error strings + std::stringstream message; + message << "Failed to write all data to file "; + message << writer.getErrors().front(); + throw Base::FileException(message.str().c_str(), tmp); } GetApplication().signalSaveDocument(*this); diff --git a/src/Base/Writer.cpp b/src/Base/Writer.cpp index a068884923..beb58c530f 100644 --- a/src/Base/Writer.cpp +++ b/src/Base/Writer.cpp @@ -110,6 +110,9 @@ std::ostream& Writer::beginCharStream(CharStreamFormat format) filteredStream->push(Stream()); *filteredStream << std::setprecision(std::numeric_limits::digits10 + 1); } + + checkErrNo(); + return *CharStream; } @@ -121,6 +124,9 @@ std::ostream& Writer::endCharStream() Stream() << "]]>"; } } + + checkErrNo(); + return Stream(); } @@ -152,6 +158,8 @@ void Writer::insertAsciiFile(const char* FileName) Stream().put(ch); } Stream() << "]]>" << std::endl; + + checkErrNo(); } void Writer::insertBinFile(const char* FileName) @@ -170,6 +178,8 @@ void Writer::insertBinFile(const char* FileName) from.read(reinterpret_cast(bytes.data()), fileSize); Stream() << Base::base64_encode(bytes.data(), static_cast(fileSize)); Stream() << "]]>" << std::endl; + + checkErrNo(); } void Writer::setForceXML(bool on) @@ -231,6 +241,17 @@ void Writer::addError(const std::string& msg) Errors.push_back(msg); } +void Writer::checkErrNo() +{ + switch (errno) { + case ENOSPC: // No space left + case EROFS: // Read only + case ENODEV: // No such device + case EACCES: // Access denied + addError(strerror(errno)); + } +} + bool Writer::hasErrors() const { return (!Errors.empty()); @@ -324,6 +345,8 @@ void ZipWriter::putNextEntry(const char* file, const char* obj) Writer::putNextEntry(file, obj); ZipStream.putNextEntry(file); + + Writer::checkErrNo(); } void ZipWriter::writeFiles() @@ -360,6 +383,8 @@ void FileWriter::putNextEntry(const char* file, const char* obj) std::string fileName = DirName + "/" + file; this->FileStream.open(fileName.c_str(), std::ios::out | std::ios::binary); + + Writer::checkErrNo(); } bool FileWriter::shouldWrite(const std::string& /*name*/, const Base::Persistence* /*obj*/) const @@ -395,4 +420,6 @@ void FileWriter::writeFiles() index++; } + + Writer::checkErrNo(); } diff --git a/src/Base/Writer.h b/src/Base/Writer.h index 5211a0874b..9b0047d47b 100644 --- a/src/Base/Writer.h +++ b/src/Base/Writer.h @@ -114,6 +114,7 @@ public: /** @name Error handling */ //@{ void addError(const std::string&); + void checkErrNo(); bool hasErrors() const; void clearErrors(); std::vector getErrors() const;