tdesktop/Telegram/SourceFiles/storage/storage_encrypted_file.h

74 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