Fix local cache time limit setting storing.

Fixes #5611.
This commit is contained in:
John Preston 2019-03-14 13:20:52 +04:00
parent bfb6ecbac7
commit 0d888eea85
2 changed files with 32 additions and 27 deletions

View File

@ -557,9 +557,9 @@ void LocalStorageBox::setupLimits(not_null<Ui::VerticalLayout*> container) {
TimeLimit, TimeLimit,
LimitToValue(_timeLimit), LimitToValue(_timeLimit),
[=](not_null<Ui::LabelSimple*> label, size_type limit) { [=](not_null<Ui::LabelSimple*> label, size_type limit) {
const auto text = TimeLimitText(ValueToLimit(limit)); _timeLimit = ValueToLimit(limit);
const auto text = TimeLimitText(_timeLimit);
label->setText(lng_local_storage_time_limit(lt_limit, text)); label->setText(lng_local_storage_time_limit(lt_limit, text));
_timeLimit = limit;
limitsChanged(); limitsChanged();
}); });
} }
@ -594,7 +594,7 @@ void LocalStorageBox::save() {
update.totalTimeLimit = _timeLimit; update.totalTimeLimit = _timeLimit;
auto updateBig = Storage::Cache::Database::SettingsUpdate(); auto updateBig = Storage::Cache::Database::SettingsUpdate();
updateBig.totalSizeLimit = _mediaSizeLimit; updateBig.totalSizeLimit = _mediaSizeLimit;
update.totalTimeLimit = _timeLimit; updateBig.totalTimeLimit = _timeLimit;
Local::updateCacheSettings(update, updateBig); Local::updateCacheSettings(update, updateBig);
Auth().data().cache().updateSettings(update); Auth().data().cache().updateSettings(update);
closeBox(); closeBox();

View File

@ -186,9 +186,9 @@ struct FileReadDescriptor {
QDataStream stream; QDataStream stream;
~FileReadDescriptor() { ~FileReadDescriptor() {
if (version) { if (version) {
stream.setDevice(0); stream.setDevice(nullptr);
if (buffer.isOpen()) buffer.close(); if (buffer.isOpen()) buffer.close();
buffer.setBuffer(0); buffer.setBuffer(nullptr);
} }
} }
}; };
@ -212,9 +212,9 @@ struct EncryptedDescriptor {
QBuffer buffer; QBuffer buffer;
QDataStream stream; QDataStream stream;
void finish() { void finish() {
if (stream.device()) stream.setDevice(0); if (stream.device()) stream.setDevice(nullptr);
if (buffer.isOpen()) buffer.close(); if (buffer.isOpen()) buffer.close();
buffer.setBuffer(0); buffer.setBuffer(nullptr);
} }
~EncryptedDescriptor() { ~EncryptedDescriptor() {
finish(); finish();
@ -305,7 +305,7 @@ struct FileWriteDescriptor {
void finish() { void finish() {
if (!file.isOpen()) return; if (!file.isOpen()) return;
stream.setDevice(0); stream.setDevice(nullptr);
md5.feed(&dataSize, sizeof(dataSize)); md5.feed(&dataSize, sizeof(dataSize));
qint32 version = AppVersion; qint32 version = AppVersion;
@ -473,9 +473,9 @@ bool readEncryptedFile(FileReadDescriptor &result, const QString &name, FileOpti
EncryptedDescriptor data; EncryptedDescriptor data;
if (!decryptLocal(data, encrypted, key)) { if (!decryptLocal(data, encrypted, key)) {
result.stream.setDevice(0); result.stream.setDevice(nullptr);
if (result.buffer.isOpen()) result.buffer.close(); if (result.buffer.isOpen()) result.buffer.close();
result.buffer.setBuffer(0); result.buffer.setBuffer(nullptr);
result.data = QByteArray(); result.data = QByteArray();
result.version = 0; result.version = 0;
return false; return false;
@ -672,6 +672,14 @@ qint32 _cacheTotalTimeLimit = Database::Settings().totalTimeLimit;
qint64 _cacheBigFileTotalSizeLimit = Database::Settings().totalSizeLimit; qint64 _cacheBigFileTotalSizeLimit = Database::Settings().totalSizeLimit;
qint32 _cacheBigFileTotalTimeLimit = Database::Settings().totalTimeLimit; qint32 _cacheBigFileTotalTimeLimit = Database::Settings().totalTimeLimit;
bool NoTimeLimit(qint32 storedLimitValue) {
// This is a workaround for a bug in storing the cache time limit.
// See https://github.com/telegramdesktop/tdesktop/issues/5611
return !storedLimitValue
|| (storedLimitValue == qint32(std::numeric_limits<int32>::max()))
|| (storedLimitValue == qint32(std::numeric_limits<int64>::max()));
}
FileKey _exportSettingsKey = 0; FileKey _exportSettingsKey = 0;
FileKey _savedPeersKey = 0; FileKey _savedPeersKey = 0;
@ -1078,13 +1086,13 @@ bool _readSetting(quint32 blockId, QDataStream &stream, int version, ReadSetting
stream >> size >> time; stream >> size >> time;
if (!_checkStreamStatus(stream) if (!_checkStreamStatus(stream)
|| size <= Database::Settings().maxDataSize || size <= Database::Settings().maxDataSize
|| time < 0) { || (!NoTimeLimit(time) && time < 0)) {
return false; return false;
} }
_cacheTotalSizeLimit = size; _cacheTotalSizeLimit = size;
_cacheTotalTimeLimit = time; _cacheTotalTimeLimit = NoTimeLimit(time) ? 0 : time;
_cacheBigFileTotalSizeLimit = size; _cacheBigFileTotalSizeLimit = size;
_cacheBigFileTotalTimeLimit = time; _cacheBigFileTotalTimeLimit = NoTimeLimit(time) ? 0 : time;
} break; } break;
case dbiCacheSettings: { case dbiCacheSettings: {
@ -1094,15 +1102,15 @@ bool _readSetting(quint32 blockId, QDataStream &stream, int version, ReadSetting
if (!_checkStreamStatus(stream) if (!_checkStreamStatus(stream)
|| size <= Database::Settings().maxDataSize || size <= Database::Settings().maxDataSize
|| sizeBig <= Database::Settings().maxDataSize || sizeBig <= Database::Settings().maxDataSize
|| time < 0 || (!NoTimeLimit(time) && time < 0)
|| timeBig < 0) { || (!NoTimeLimit(timeBig) && timeBig < 0)) {
return false; return false;
} }
_cacheTotalSizeLimit = size; _cacheTotalSizeLimit = size;
_cacheTotalTimeLimit = time; _cacheTotalTimeLimit = NoTimeLimit(time) ? 0 : time;
_cacheBigFileTotalSizeLimit = sizeBig; _cacheBigFileTotalSizeLimit = sizeBig;
_cacheBigFileTotalTimeLimit = timeBig; _cacheBigFileTotalTimeLimit = NoTimeLimit(timeBig) ? 0 : timeBig;
} break; } break;
case dbiAnimationsDisabled: { case dbiAnimationsDisabled: {
@ -3269,21 +3277,18 @@ public:
, _data(doc->data()) , _data(doc->data())
, _wavemax(0) { , _wavemax(0) {
if (_data.isEmpty() && !_loc.accessEnable()) { if (_data.isEmpty() && !_loc.accessEnable()) {
_doc = 0; _doc = nullptr;
} }
} }
void process() { void process() override {
if (!_doc) return; if (!_doc) return;
_waveform = audioCountWaveform(_loc, _data); _waveform = audioCountWaveform(_loc, _data);
uchar wavemax = 0; _wavemax = _waveform.empty()
for (int32 i = 0, l = _waveform.size(); i < l; ++i) { ? char(0)
uchar waveat = _waveform.at(i); : *ranges::max_element(_waveform);
if (wavemax < waveat) wavemax = waveat;
}
_wavemax = wavemax;
} }
void finish() { void finish() override {
if (const auto voice = _doc ? _doc->voice() : nullptr) { if (const auto voice = _doc ? _doc->voice() : nullptr) {
if (!_waveform.isEmpty()) { if (!_waveform.isEmpty()) {
voice->waveform = _waveform; voice->waveform = _waveform;
@ -3300,7 +3305,7 @@ public:
Auth().data().requestDocumentViewRepaint(_doc); Auth().data().requestDocumentViewRepaint(_doc);
} }
} }
virtual ~CountWaveformTask() { ~CountWaveformTask() {
if (_data.isEmpty() && _doc) { if (_data.isEmpty() && _doc) {
_loc.accessDisable(); _loc.accessDisable();
} }