[core] bug fix. Don't download UpToDate map file if we try download only routing

This commit is contained in:
ExMix 2014-10-15 14:30:54 +03:00 committed by Alex Zolotarev
parent d903a7fa28
commit b466c3834f
2 changed files with 87 additions and 44 deletions

View file

@ -54,7 +54,7 @@ namespace storage
: m_index(index), m_init(opt), m_left(opt)
{
m_pFile = &(storage.CountryByIndex(index).GetFile());
m_current = (m_init & TMapOptions::EMapOnly ? TMapOptions::EMapOnly : TMapOptions::ECarRouting);
m_current = (m_init & TMapOptions::ECarRouting ? TMapOptions::ECarRouting : TMapOptions::EMapOnly);
}
void Storage::QueuedCountry::AddOptions(TMapOptions opt)
@ -75,22 +75,40 @@ namespace storage
if (m_current == m_left)
return false;
if (m_current == TMapOptions::EMapOnly)
m_left = m_current = TMapOptions::ECarRouting;
else
m_left = m_current = TMapOptions::EMapOnly;
/// if m_current != m_left than we download map and routing
/// routing already downloaded and we need to download map
ASSERT(m_current == TMapOptions::ECarRouting, ());
m_left = m_current = TMapOptions::EMapOnly;
return true;
}
bool Storage::QueuedCountry::Correct()
bool Storage::QueuedCountry::Correct(TStatus currentStatus)
{
if ((m_init & TMapOptions::ECarRouting) &&
(m_pFile->GetFileSize(TMapOptions::ECarRouting) == 0))
ASSERT(currentStatus != TStatus::EDownloadFailed, ());
ASSERT(currentStatus != TStatus::EOutOfMemFailed, ());
ASSERT(currentStatus != TStatus::EInQueue, ());
ASSERT(currentStatus != TStatus::EDownloading, ());
ASSERT(currentStatus != TStatus::EUnknown, ());
if (m_init == TMapOptions::EMapOnly && currentStatus == TStatus::EOnDisk)
return false;
#ifdef DEBUG
if (currentStatus == TStatus::EOnDiskOutOfDate && m_init == TMapOptions::EMapOnly)
ASSERT(m_pFile->GetFileSize(TMapOptions::ECarRouting) == 0, ());
#endif
if (m_init & TMapOptions::ECarRouting)
{
if (m_init & TMapOptions::EMapOnly)
m_init = m_left = m_current = TMapOptions::EMapOnly;
else
return false;
ASSERT(m_init & TMapOptions::EMapOnly, ());
if (currentStatus == TStatus::EOnDisk)
{
if (m_pFile->GetFileSize(TMapOptions::ECarRouting) == 0)
m_init = m_left = m_current = TMapOptions::ECarRouting;
else
return false;
}
}
return true;
@ -234,35 +252,7 @@ namespace storage
TStatus Storage::CountryStatusEx(TIndex const & index) const
{
TStatus res = CountryStatus(index);
if (res == TStatus::EUnknown)
{
Country const & c = CountryByIndex(index);
LocalAndRemoteSizeT const size = c.Size(TMapOptions::EMapOnly);
if (size.first == 0)
return TStatus::ENotDownloaded;
if (size.second == 0)
return TStatus::EUnknown;
res = TStatus::EOnDisk;
if (size.first != size.second)
{
/// @todo Do better version check, not just size comparison.
// Additional check for .ready file.
// Use EOnDisk status if it's good, or EOnDiskOutOfDate otherwise.
Platform const & pl = GetPlatform();
string const fName = c.GetFile().GetFileWithExt(TMapOptions::EMapOnly) + READY_FILE_EXTENSION;
uint64_t sz = 0;
if (!pl.GetFileSizeByFullPath(pl.WritablePathForFile(fName), sz) || sz != size.second)
res = TStatus::EOnDiskOutOfDate;
}
}
return res;
return CountryStatusFull(index, CountryStatus(index));
}
void Storage::CountryStatusEx(TIndex const & index, TStatus & status, TMapOptions & options) const
@ -282,6 +272,7 @@ namespace storage
void Storage::DownloadCountry(TIndex const & index, TMapOptions opt)
{
ASSERT(opt == TMapOptions::EMapOnly || opt == TMapOptions::EMapWithCarRouting, ());
// check if we already downloading this country
auto const found = find(m_queue.begin(), m_queue.end(), index);
if (found != m_queue.end())
@ -297,9 +288,9 @@ namespace storage
// add it into the queue
QueuedCountry cnt(*this, index, opt);
if (!cnt.Correct())
if (!cnt.Correct(CountryStatusWithoutFailed(index)))
return;
m_queue.push_back(QueuedCountry(*this, index, opt));
m_queue.push_back(cnt);
// and start download if necessary
if (m_queue.size() == 1)
@ -573,4 +564,52 @@ namespace storage
for (size_t i = 0; i < fList.size(); ++i)
res.push_back(&CountryByIndex(FindIndexByFile(fList[i])));
}
TStatus Storage::CountryStatusWithoutFailed(TIndex const & index) const
{
// first, check if we already downloading this country or have in in the queue
auto const found = find(m_queue.begin(), m_queue.end(), index);
if (found != m_queue.end())
{
if (found == m_queue.begin())
return TStatus::EDownloading;
else
return TStatus::EInQueue;
}
return CountryStatusFull(index, TStatus::EUnknown);
}
TStatus Storage::CountryStatusFull(TIndex const & index, TStatus const status) const
{
if (status != TStatus::EUnknown)
return status;
TStatus res = status;
Country const & c = CountryByIndex(index);
LocalAndRemoteSizeT const size = c.Size(TMapOptions::EMapOnly);
if (size.first == 0)
return TStatus::ENotDownloaded;
if (size.second == 0)
return TStatus::EUnknown;
res = TStatus::EOnDisk;
if (size.first != size.second)
{
/// @todo Do better version check, not just size comparison.
// Additional check for .ready file.
// Use EOnDisk status if it's good, or EOnDiskOutOfDate otherwise.
Platform const & pl = GetPlatform();
string const fName = c.GetFile().GetFileWithExt(TMapOptions::EMapOnly) + READY_FILE_EXTENSION;
uint64_t sz = 0;
if (!pl.GetFileSizeByFullPath(pl.WritablePathForFile(fName), sz) || sz != size.second)
res = TStatus::EOnDiskOutOfDate;
}
return res;
}
}

View file

@ -41,7 +41,7 @@ namespace storage
void AddOptions(TMapOptions opt);
bool MoveNextFile();
bool Correct();
bool Correct(TStatus currentStatus);
TIndex const & GetIndex() const { return m_index; }
TMapOptions GetInitOptions() const { return m_init; }
@ -146,6 +146,10 @@ namespace storage
int64_t GetCurrentDataVersion() const { return m_currentVersion; }
private:
TStatus CountryStatusWithoutFailed(TIndex const & index) const;
TStatus CountryStatusFull(TIndex const & index, TStatus const status) const;
//@{
private:
guides::GuidesManager m_guideManager;