|
@@ -52,6 +52,10 @@
|
|
|
#include "OptionParser.h"
|
|
|
#include "OptionHandler.h"
|
|
|
|
|
|
+#if HAVE_ZLIB
|
|
|
+#include "GZipFile.h"
|
|
|
+#endif
|
|
|
+
|
|
|
namespace aria2 {
|
|
|
|
|
|
SessionSerializer::SessionSerializer
|
|
@@ -66,11 +70,20 @@ bool SessionSerializer::save(const std::string& filename) const
|
|
|
std::string tempFilename = filename;
|
|
|
tempFilename += "__temp";
|
|
|
{
|
|
|
- BufferedFile fp(tempFilename.c_str(), BufferedFile::WRITE);
|
|
|
- if(!fp) {
|
|
|
+ SharedHandle<BufferedFile> fp;
|
|
|
+#if HAVE_ZLIB
|
|
|
+ if (filename.compare(filename.length() - 3, 3, ".gz") == 0) {
|
|
|
+ fp.reset(new GZipFile(tempFilename.c_str(), BufferedFile::WRITE));
|
|
|
+ }
|
|
|
+ else
|
|
|
+#endif
|
|
|
+ {
|
|
|
+ fp.reset(new BufferedFile(tempFilename.c_str(), BufferedFile::WRITE));
|
|
|
+ }
|
|
|
+ if(!fp || !*fp) {
|
|
|
return false;
|
|
|
}
|
|
|
- if(!save(fp) || fp.close() == EOF) {
|
|
|
+ if(!save(*fp) || fp->close() == EOF) {
|
|
|
return false;
|
|
|
}
|
|
|
}
|
|
@@ -92,12 +105,36 @@ bool writeOption(BufferedFile& fp, const SharedHandle<Option>& op)
|
|
|
false, false);
|
|
|
for(std::vector<std::string>::const_iterator j = v.begin(),
|
|
|
eoj = v.end(); j != eoj; ++j) {
|
|
|
- if(fp.printf(" %s=%s\n", pref->k, (*j).c_str()) < 0) {
|
|
|
+ if (fp.write(" ", 1) != 1) {
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ if (fp.write(pref->k) == 0) {
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ if (fp.write("=", 1) != 1) {
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ if (!j->empty() && fp.write(j->c_str()) == 0) {
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ if (fp.write("\n", 1) != 1) {
|
|
|
return false;
|
|
|
}
|
|
|
}
|
|
|
} else {
|
|
|
- if(fp.printf(" %s=%s\n", pref->k, op->get(pref).c_str()) < 0) {
|
|
|
+ if (fp.write(" ", 1) != 1) {
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ if (fp.write(pref->k) == 0) {
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ if (fp.write("=", 1) != 1) {
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ if (fp.write(op->get(pref).c_str()) == 0) {
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ if (fp.write("\n", 1) != 1) {
|
|
|
return false;
|
|
|
}
|
|
|
}
|
|
@@ -152,14 +189,17 @@ bool writeDownloadResult
|
|
|
}
|
|
|
for(std::vector<std::string>::const_iterator i = uris.begin(),
|
|
|
eoi = uris.end(); i != eoi; ++i) {
|
|
|
- if(fp.printf("%s\t", (*i).c_str()) < 0) {
|
|
|
+ if (fp.write(i->c_str()) == 0 || fp.write("\t", 1) != 1) {
|
|
|
return false;
|
|
|
}
|
|
|
}
|
|
|
- if(fp.write("\n", 1) != 1) {
|
|
|
+ if(fp.write("\n gid=", 6) != 6) {
|
|
|
return false;
|
|
|
}
|
|
|
- if(fp.printf(" gid=%s\n", dr->gid->toHex().c_str()) < 0) {
|
|
|
+ if(fp.write(dr->gid->toHex().c_str()) == 0) {
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ if(fp.write("\n", 1) != 1) {
|
|
|
return false;
|
|
|
}
|
|
|
} else {
|
|
@@ -167,12 +207,12 @@ bool writeDownloadResult
|
|
|
return true;
|
|
|
} else {
|
|
|
metainfoCache.insert(mi->getGID());
|
|
|
- if(fp.printf("%s\n", mi->getUri().c_str()) < 0) {
|
|
|
+ if (fp.write(mi->getUri().c_str()) == 0 || fp.write("\n", 1) != 1) {
|
|
|
return false;
|
|
|
}
|
|
|
// For downloads generated by metadata (e.g., BitTorrent,
|
|
|
// Metalink), save gid of Metadata download.
|
|
|
- if(fp.printf(" gid=%s\n", GroupId::toHex(mi->getGID()).c_str()) < 0) {
|
|
|
+ if (fp.write(" gid=", 5) != 5 || fp.write(GroupId::toHex(mi->getGID()).c_str()) == 0 || fp.write("\n", 1) != 1) {
|
|
|
return false;
|
|
|
}
|
|
|
}
|
|
@@ -241,7 +281,7 @@ bool SessionSerializer::save(BufferedFile& fp) const
|
|
|
// PREF_PAUSE was removed from option, so save it here looking
|
|
|
// property separately.
|
|
|
if(rg->isPauseRequested()) {
|
|
|
- if(fp.printf(" %s=true\n", PREF_PAUSE->k) < 0) {
|
|
|
+ if (fp.write(" ", 1) != 1 || fp.write(PREF_PAUSE->k) == 0 || fp.write("\n", 1) != 1) {
|
|
|
return false;
|
|
|
}
|
|
|
}
|