Fix FreeCAD#19588
This commit is contained in:
committed by
Benjamin Nauck
parent
ae08c322b2
commit
756e3789ce
@@ -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);
|
||||
|
||||
@@ -110,6 +110,9 @@ std::ostream& Writer::beginCharStream(CharStreamFormat format)
|
||||
filteredStream->push(Stream());
|
||||
*filteredStream << std::setprecision(std::numeric_limits<double>::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<char*>(bytes.data()), fileSize);
|
||||
Stream() << Base::base64_encode(bytes.data(), static_cast<unsigned int>(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();
|
||||
}
|
||||
|
||||
@@ -114,6 +114,7 @@ public:
|
||||
/** @name Error handling */
|
||||
//@{
|
||||
void addError(const std::string&);
|
||||
void checkErrNo();
|
||||
bool hasErrors() const;
|
||||
void clearErrors();
|
||||
std::vector<std::string> getErrors() const;
|
||||
|
||||
Reference in New Issue
Block a user