diff options
| author | Nils Maier <maierman@web.de> | 2013-03-01 16:07:16 +0100 |
|---|---|---|
| committer | Nils Maier <maierman@web.de> | 2013-03-02 15:48:26 +0100 |
| commit | f2f8b14047c5b0f3a41338440c63ca3f9a591427 (patch) | |
| tree | 06aeb2584b0d6e1db79b15acadb6612a9af2b590 /src/SessionSerializer.cc | |
| parent | b0556a7519af611f665ee5a6ccc1b514a0585bef (diff) | |
Support for gzipped -i and --save-session
Saved sessions may very large, as in hundreds and even thousands of
megabyte when dealing with large queues.
Add support to save and reload sessions to gzipped files, when libz is
available.
The session serializer will output gzipped contents when the file ends
with .gz, while the input file reader (UriListParser) will accept
whatever is thrown at it.
Diffstat (limited to 'src/SessionSerializer.cc')
| -rw-r--r-- | src/SessionSerializer.cc | 62 |
1 files changed, 51 insertions, 11 deletions
diff --git a/src/SessionSerializer.cc b/src/SessionSerializer.cc index 519cf338..6c4832f5 100644 --- a/src/SessionSerializer.cc +++ b/src/SessionSerializer.cc @@ -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; } } |
