diff options
author | vng <viktor.govako@gmail.com> | 2012-10-27 14:43:47 +0400 |
---|---|---|
committer | Alex Zolotarev <alex@maps.me> | 2015-09-23 01:46:19 +0300 |
commit | 67801f0fb8f25656f0960cefab1ad485a710cbf1 (patch) | |
tree | 01dd44508a1e075262f706ebfa92e3da936686a1 /platform | |
parent | 4d2d784943e2bb74735e203d5cc3629f68da9735 (diff) |
Fix exception catching in download resume.
Diffstat (limited to 'platform')
-rw-r--r-- | platform/chunks_download_strategy.cpp | 6 | ||||
-rw-r--r-- | platform/http_request.cpp | 40 |
2 files changed, 41 insertions, 5 deletions
diff --git a/platform/chunks_download_strategy.cpp b/platform/chunks_download_strategy.cpp index 042d94abd9..5c0cf1e281 100644 --- a/platform/chunks_download_strategy.cpp +++ b/platform/chunks_download_strategy.cpp @@ -73,7 +73,7 @@ void ChunksDownloadStrategy::SaveChunks(int64_t fileSize, string const & fName) w.Write(&m_chunks[0], sizeof(ChunkT) * m_chunks.size()); return; } - catch(FileWriter::Exception const & e) + catch (FileWriter::Exception const & e) { LOG(LERROR, (e.Msg())); } @@ -119,9 +119,9 @@ int64_t ChunksDownloadStrategy::LoadOrInitChunks( string const & fName, return downloadedSize; } } - catch(FileReader::Exception const & e) + catch (RootException const & e) { - // Usually - file not exists. + // Usually - file not exists. May be SourceOutOfBoundsException. LOG(LDEBUG, (e.Msg())); } diff --git a/platform/http_request.cpp b/platform/http_request.cpp index 6492cd0280..5cbc6158e7 100644 --- a/platform/http_request.cpp +++ b/platform/http_request.cpp @@ -247,11 +247,13 @@ public: CallbackT const & onFinish, CallbackT const & onProgress, int64_t chunkSize, bool doCleanProgressFiles) : HttpRequest(onFinish, onProgress), m_strategy(urls), m_filePath(filePath), - m_writer(new FileWriter(filePath + DOWNLOADING_FILE_EXTENSION, FileWriter::OP_WRITE_EXISTING)), m_goodChunksCount(0), m_doCleanProgressFiles(doCleanProgressFiles) { ASSERT ( !urls.empty(), () ); + // Open file here. Avoid throwing exceptions from constructor's initialization list. + m_writer.reset(new FileWriter(filePath + DOWNLOADING_FILE_EXTENSION, FileWriter::OP_WRITE_EXISTING)); + m_progress.first = m_strategy.LoadOrInitChunks(m_filePath + RESUME_FILE_EXTENSION, fileSize, chunkSize); m_progress.second = fileSize; @@ -310,11 +312,45 @@ HttpRequest * HttpRequest::PostJson(string const & url, string const & postData, return new MemoryHttpRequest(url, postData, onFinish, onProgress); } +namespace +{ + class ErrorHttpRequest : public HttpRequest + { + string m_filePath; + public: + ErrorHttpRequest(string const & filePath) + : HttpRequest(CallbackT(), CallbackT()), m_filePath(filePath) + { + m_status = EFailed; + } + + virtual string const & Data() const { return m_filePath; } + }; +} + HttpRequest * HttpRequest::GetFile(vector<string> const & urls, string const & filePath, int64_t fileSize, CallbackT const & onFinish, CallbackT const & onProgress, int64_t chunkSize, bool doCleanProgressFiles) { - return new FileHttpRequest(urls, filePath, fileSize, onFinish, onProgress, chunkSize, doCleanProgressFiles); + FileHttpRequest * p = 0; + try + { + p = new FileHttpRequest(urls, filePath, fileSize, onFinish, onProgress, chunkSize, doCleanProgressFiles); + } + catch (FileWriter::Exception const & e) + { + // Can't create file for writing. + LOG(LERROR, ("Can't create FileHttpRequest for", filePath, e.what())); + + delete p; + p = 0; + + // Mark the end of download with error. + ErrorHttpRequest error(filePath); + onFinish(error); + } + + return p; } } // namespace downloader |