121 lines
		
	
	
	
		
			2.9 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			121 lines
		
	
	
	
		
			2.9 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| /*
 | |
| This file is part of Telegram Desktop,
 | |
| the official desktop application for the Telegram messaging service.
 | |
| 
 | |
| For license and copyright information please follow this link:
 | |
| https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
 | |
| */
 | |
| #include "core/file_location.h"
 | |
| 
 | |
| #include "platform/platform_file_bookmark.h"
 | |
| #include "logs.h"
 | |
| 
 | |
| #include <QtCore/QFileInfo>
 | |
| 
 | |
| namespace Core {
 | |
| namespace {
 | |
| 
 | |
| const auto kInMediaCacheLocation = u"*media_cache*"_q;
 | |
| 
 | |
| } // namespace
 | |
| 
 | |
| ReadAccessEnabler::ReadAccessEnabler(const Platform::FileBookmark *bookmark)
 | |
| : _bookmark(bookmark)
 | |
| , _failed(_bookmark ? !_bookmark->enable() : false) {
 | |
| }
 | |
| 
 | |
| ReadAccessEnabler::ReadAccessEnabler(
 | |
| 	const std::shared_ptr<Platform::FileBookmark> &bookmark)
 | |
| : _bookmark(bookmark.get())
 | |
| , _failed(_bookmark ? !_bookmark->enable() : false) {
 | |
| }
 | |
| 
 | |
| ReadAccessEnabler::~ReadAccessEnabler() {
 | |
| 	if (_bookmark && !_failed) _bookmark->disable();
 | |
| }
 | |
| 
 | |
| FileLocation::FileLocation(const QString &name) : fname(name) {
 | |
| 	if (fname.isEmpty() || fname == kInMediaCacheLocation) {
 | |
| 		size = 0;
 | |
| 	} else {
 | |
| 		setBookmark(Platform::PathBookmark(name));
 | |
| 
 | |
| 		QFileInfo f(name);
 | |
| 		if (f.exists()) {
 | |
| 			qint64 s = f.size();
 | |
| 			if (s > INT_MAX) {
 | |
| 				fname = QString();
 | |
| 				_bookmark = nullptr;
 | |
| 				size = 0;
 | |
| 			} else {
 | |
| 				modified = f.lastModified();
 | |
| 				size = qint32(s);
 | |
| 			}
 | |
| 		} else {
 | |
| 			fname = QString();
 | |
| 			_bookmark = nullptr;
 | |
| 			size = 0;
 | |
| 		}
 | |
| 	}
 | |
| }
 | |
| 
 | |
| FileLocation FileLocation::InMediaCacheLocation() {
 | |
| 	return FileLocation(kInMediaCacheLocation);
 | |
| }
 | |
| 
 | |
| bool FileLocation::check() const {
 | |
| 	if (fname.isEmpty() || fname == kInMediaCacheLocation) {
 | |
| 		return false;
 | |
| 	}
 | |
| 
 | |
| 	ReadAccessEnabler enabler(_bookmark);
 | |
| 	if (enabler.failed()) {
 | |
| 		const_cast<FileLocation*>(this)->_bookmark = nullptr;
 | |
| 	}
 | |
| 
 | |
| 	QFileInfo f(name());
 | |
| 	if (!f.isReadable()) return false;
 | |
| 
 | |
| 	quint64 s = f.size();
 | |
| 	if (s > INT_MAX) {
 | |
| 		DEBUG_LOG(("File location check: Wrong size %1").arg(s));
 | |
| 		return false;
 | |
| 	}
 | |
| 
 | |
| 	if (qint32(s) != size) {
 | |
| 		DEBUG_LOG(("File location check: Wrong size %1 when should be %2").arg(s).arg(size));
 | |
| 		return false;
 | |
| 	}
 | |
| 	auto realModified = f.lastModified();
 | |
| 	if (realModified != modified) {
 | |
| 		DEBUG_LOG(("File location check: Wrong last modified time %1 when should be %2").arg(realModified.toMSecsSinceEpoch()).arg(modified.toMSecsSinceEpoch()));
 | |
| 		return false;
 | |
| 	}
 | |
| 	return true;
 | |
| }
 | |
| 
 | |
| const QString &FileLocation::name() const {
 | |
| 	return _bookmark ? _bookmark->name(fname) : fname;
 | |
| }
 | |
| 
 | |
| QByteArray FileLocation::bookmark() const {
 | |
| 	return _bookmark ? _bookmark->bookmark() : QByteArray();
 | |
| }
 | |
| 
 | |
| bool FileLocation::inMediaCache() const {
 | |
| 	return (fname == kInMediaCacheLocation);
 | |
| }
 | |
| 
 | |
| void FileLocation::setBookmark(const QByteArray &bm) {
 | |
| 	_bookmark.reset(bm.isEmpty() ? nullptr : new Platform::FileBookmark(bm));
 | |
| }
 | |
| 
 | |
| bool FileLocation::accessEnable() const {
 | |
| 	return isEmpty() ? false : (_bookmark ? _bookmark->enable() : true);
 | |
| }
 | |
| 
 | |
| void FileLocation::accessDisable() const {
 | |
| 	return _bookmark ? _bookmark->disable() : (void)0;
 | |
| }
 | |
| 
 | |
| } // namespace Core
 | 
