Fix for SPE-688 (crash when saving zip to low disk space)
This commit is contained in:
parent
dd3c485965
commit
a16e419138
2 changed files with 22 additions and 5 deletions
|
@ -227,29 +227,35 @@ public:
|
||||||
inline void save(const std::string& path) {
|
inline void save(const std::string& path) {
|
||||||
try {
|
try {
|
||||||
LayerWriter<LyrFmt> writer(path);
|
LayerWriter<LyrFmt> writer(path);
|
||||||
|
if(!writer.is_ok()) return;
|
||||||
|
|
||||||
std::string project = writer.get_name();
|
std::string project = writer.get_name();
|
||||||
|
|
||||||
writer.next_entry("config.ini");
|
writer.next_entry("config.ini");
|
||||||
|
if(!writer.is_ok()) return;
|
||||||
|
|
||||||
writer << createIniContent(project);
|
writer << createIniContent(project);
|
||||||
|
|
||||||
for(unsigned i = 0; i < m_layers_rst.size(); i++) {
|
for(unsigned i = 0; i < m_layers_rst.size() && writer.is_ok(); i++)
|
||||||
|
{
|
||||||
if(m_layers_rst[i].second.rdbuf()->in_avail() > 0) {
|
if(m_layers_rst[i].second.rdbuf()->in_avail() > 0) {
|
||||||
char lyrnum[6];
|
char lyrnum[6];
|
||||||
std::sprintf(lyrnum, "%.5d", i);
|
std::sprintf(lyrnum, "%.5d", i);
|
||||||
auto zfilename = project + lyrnum + ".png";
|
auto zfilename = project + lyrnum + ".png";
|
||||||
writer.next_entry(zfilename);
|
writer.next_entry(zfilename);
|
||||||
|
|
||||||
|
if(!writer.is_ok()) break;
|
||||||
|
|
||||||
writer << m_layers_rst[i].second.str();
|
writer << m_layers_rst[i].second.str();
|
||||||
// writer << m_layers_rst[i].second.rdbuf();
|
// writer << m_layers_rst[i].second.rdbuf();
|
||||||
// we can keep the date for later calls of this method
|
// we can keep the date for later calls of this method
|
||||||
//m_layers_rst[i].second.str("");
|
//m_layers_rst[i].second.str("");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
writer.close();
|
|
||||||
} catch(std::exception& e) {
|
} catch(std::exception& e) {
|
||||||
BOOST_LOG_TRIVIAL(error) << e.what();
|
BOOST_LOG_TRIVIAL(error) << e.what();
|
||||||
return;
|
// Rethrow the exception
|
||||||
|
throw;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -113,10 +113,17 @@ public:
|
||||||
zipstream(zipfile),
|
zipstream(zipfile),
|
||||||
pngstream(zipstream)
|
pngstream(zipstream)
|
||||||
{
|
{
|
||||||
if(!zipfile.IsOk())
|
if(!is_ok())
|
||||||
throw std::runtime_error("Cannot create zip file.");
|
throw std::runtime_error("Cannot create zip file.");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
~LayerWriter() {
|
||||||
|
// In case of an error (disk space full) zipstream destructor would
|
||||||
|
// crash.
|
||||||
|
pngstream.clear();
|
||||||
|
zipstream.CloseEntry();
|
||||||
|
}
|
||||||
|
|
||||||
inline void next_entry(const std::string& fname) {
|
inline void next_entry(const std::string& fname) {
|
||||||
zipstream.PutNextEntry(fname);
|
zipstream.PutNextEntry(fname);
|
||||||
}
|
}
|
||||||
|
@ -129,6 +136,10 @@ public:
|
||||||
pngstream << arg; return *this;
|
pngstream << arg; return *this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool is_ok() const {
|
||||||
|
return pngstream.good() && zipstream.IsOk() && zipfile.IsOk();
|
||||||
|
}
|
||||||
|
|
||||||
inline void close() {
|
inline void close() {
|
||||||
zipstream.Close();
|
zipstream.Close();
|
||||||
zipfile.Close();
|
zipfile.Close();
|
||||||
|
|
Loading…
Reference in a new issue