73 lines
		
	
	
	
		
			1.6 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			73 lines
		
	
	
	
		
			1.6 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
 | |
| */
 | |
| #pragma once
 | |
| 
 | |
| #include "storage/storage_file_lock.h"
 | |
| #include "storage/storage_encryption.h"
 | |
| #include "base/bytes.h"
 | |
| #include "base/optional.h"
 | |
| 
 | |
| namespace Storage {
 | |
| 
 | |
| class File {
 | |
| public:
 | |
| 	enum class Mode {
 | |
| 		Read,
 | |
| 		ReadAppend,
 | |
| 		Write,
 | |
| 	};
 | |
| 	enum class Result {
 | |
| 		Failed,
 | |
| 		LockFailed,
 | |
| 		WrongKey,
 | |
| 		Success,
 | |
| 	};
 | |
| 	Result open(const QString &path, Mode mode, const EncryptionKey &key);
 | |
| 
 | |
| 	size_type read(bytes::span bytes);
 | |
| 	bool write(bytes::span bytes);
 | |
| 
 | |
| 	size_type readWithPadding(bytes::span bytes);
 | |
| 	bool writeWithPadding(bytes::span bytes);
 | |
| 
 | |
| 	bool flush();
 | |
| 
 | |
| 	bool isOpen() const;
 | |
| 	int64 size() const;
 | |
| 	int64 offset() const;
 | |
| 	bool seek(int64 offset);
 | |
| 
 | |
| 	void close();
 | |
| 
 | |
| 	static bool Move(const QString &from, const QString &to);
 | |
| 
 | |
| private:
 | |
| 	Result attemptOpen(Mode mode, const EncryptionKey &key);
 | |
| 	Result attemptOpenForRead(const EncryptionKey &key);
 | |
| 	Result attemptOpenForReadAppend(const EncryptionKey &key);
 | |
| 	Result attemptOpenForWrite(const EncryptionKey &key);
 | |
| 
 | |
| 	bool writeHeader(const EncryptionKey &key);
 | |
| 	Result readHeader(const EncryptionKey &key);
 | |
| 
 | |
| 	size_type readPlain(bytes::span bytes);
 | |
| 	size_type writePlain(bytes::const_span bytes);
 | |
| 	void decrypt(bytes::span bytes);
 | |
| 	void encrypt(bytes::span bytes);
 | |
| 	void decryptBack(bytes::span bytes);
 | |
| 
 | |
| 	QFile _data;
 | |
| 	FileLock _lock;
 | |
| 	int64 _encryptionOffset = 0;
 | |
| 	int64 _dataSize = 0;
 | |
| 
 | |
| 	std::optional<CtrState> _state;
 | |
| 
 | |
| };
 | |
| 
 | |
| } // namespace Storage
 | 
