Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/mapsme/omim.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorvng <viktor.govako@gmail.com>2012-10-27 14:43:47 +0400
committerAlex Zolotarev <alex@maps.me>2015-09-23 01:46:19 +0300
commit67801f0fb8f25656f0960cefab1ad485a710cbf1 (patch)
tree01dd44508a1e075262f706ebfa92e3da936686a1 /platform
parent4d2d784943e2bb74735e203d5cc3629f68da9735 (diff)
Fix exception catching in download resume.
Diffstat (limited to 'platform')
-rw-r--r--platform/chunks_download_strategy.cpp6
-rw-r--r--platform/http_request.cpp40
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