From f2f8b14047c5b0f3a41338440c63ca3f9a591427 Mon Sep 17 00:00:00 2001 From: Nils Maier Date: Fri, 1 Mar 2013 16:07:16 +0100 Subject: 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. --- src/SessionSerializer.cc | 62 +++++++++++++++++++++++++++++++++++++++--------- 1 file changed, 51 insertions(+), 11 deletions(-) (limited to 'src/SessionSerializer.cc') 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 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