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
 |