mirror of
https://github.com/qbittorrent/qBittorrent.git
synced 2025-12-20 15:37:26 -06:00
committed by
GitHub
parent
3b744c3dba
commit
3de2a9f486
@@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
* Bittorrent Client using Qt and libtorrent.
|
* Bittorrent Client using Qt and libtorrent.
|
||||||
* Copyright (C) 2017-2024 Vladimir Golovnev <glassez@yandex.ru>
|
* Copyright (C) 2017-2025 Vladimir Golovnev <glassez@yandex.ru>
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or
|
* This program is free software; you can redistribute it and/or
|
||||||
* modify it under the terms of the GNU General Public License
|
* modify it under the terms of the GNU General Public License
|
||||||
@@ -34,53 +34,16 @@
|
|||||||
#include "base/utils/fs.h"
|
#include "base/utils/fs.h"
|
||||||
#include "base/utils/io.h"
|
#include "base/utils/io.h"
|
||||||
|
|
||||||
QHash<Path, std::weak_ptr<QFile>> AsyncFileStorage::m_reservedPaths;
|
|
||||||
QReadWriteLock AsyncFileStorage::m_reservedPathsLock;
|
|
||||||
|
|
||||||
AsyncFileStorage::AsyncFileStorage(const Path &storageFolderPath, QObject *parent)
|
AsyncFileStorage::AsyncFileStorage(const Path &storageFolderPath, QObject *parent)
|
||||||
: QObject(parent)
|
: QObject(parent)
|
||||||
, m_storageDir(storageFolderPath)
|
, m_storageDir(storageFolderPath)
|
||||||
{
|
{
|
||||||
Q_ASSERT(m_storageDir.isAbsolute());
|
Q_ASSERT(m_storageDir.isAbsolute());
|
||||||
|
|
||||||
const Path lockFilePath = m_storageDir / Path(u"storage.lock"_s);
|
|
||||||
|
|
||||||
{
|
|
||||||
const QReadLocker readLocker {&m_reservedPathsLock};
|
|
||||||
m_lockFile = m_reservedPaths.value(lockFilePath).lock();
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!m_lockFile)
|
|
||||||
{
|
|
||||||
const QWriteLocker writeLocker {&m_reservedPathsLock};
|
|
||||||
if (std::weak_ptr<QFile> &lockFile = m_reservedPaths[lockFilePath]; lockFile.expired()) [[likely]]
|
|
||||||
{
|
|
||||||
if (!Utils::Fs::mkpath(m_storageDir))
|
if (!Utils::Fs::mkpath(m_storageDir))
|
||||||
throw AsyncFileStorageError(tr("Could not create directory '%1'.").arg(m_storageDir.toString()));
|
throw AsyncFileStorageError(tr("Could not create directory '%1'.").arg(m_storageDir.toString()));
|
||||||
|
|
||||||
auto lockFileDeleter = [](QFile *file)
|
|
||||||
{
|
|
||||||
file->close();
|
|
||||||
file->remove();
|
|
||||||
delete file;
|
|
||||||
};
|
|
||||||
m_lockFile = std::shared_ptr<QFile>(new QFile(lockFilePath.data()), std::move(lockFileDeleter));
|
|
||||||
|
|
||||||
// TODO: This folder locking approach does not work for UNIX systems. Implement it.
|
|
||||||
if (!m_lockFile->open(QFile::WriteOnly))
|
|
||||||
throw AsyncFileStorageError(m_lockFile->errorString());
|
|
||||||
|
|
||||||
lockFile = m_lockFile;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
m_lockFile = lockFile.lock();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
AsyncFileStorage::~AsyncFileStorage() = default;
|
|
||||||
|
|
||||||
void AsyncFileStorage::store(const Path &filePath, const QByteArray &data)
|
void AsyncFileStorage::store(const Path &filePath, const QByteArray &data)
|
||||||
{
|
{
|
||||||
QMetaObject::invokeMethod(this, [this, data, filePath] { store_impl(filePath, data); }, Qt::QueuedConnection);
|
QMetaObject::invokeMethod(this, [this, data, filePath] { store_impl(filePath, data); }, Qt::QueuedConnection);
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
* Bittorrent Client using Qt and libtorrent.
|
* Bittorrent Client using Qt and libtorrent.
|
||||||
* Copyright (C) 2017-2024 Vladimir Golovnev <glassez@yandex.ru>
|
* Copyright (C) 2017-2025 Vladimir Golovnev <glassez@yandex.ru>
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or
|
* This program is free software; you can redistribute it and/or
|
||||||
* modify it under the terms of the GNU General Public License
|
* modify it under the terms of the GNU General Public License
|
||||||
@@ -28,12 +28,7 @@
|
|||||||
|
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include <memory>
|
|
||||||
|
|
||||||
#include <QFile>
|
|
||||||
#include <QHash>
|
|
||||||
#include <QObject>
|
#include <QObject>
|
||||||
#include <QReadWriteLock>
|
|
||||||
|
|
||||||
#include "base/exceptions.h"
|
#include "base/exceptions.h"
|
||||||
#include "base/path.h"
|
#include "base/path.h"
|
||||||
@@ -51,7 +46,6 @@ class AsyncFileStorage final : public QObject
|
|||||||
|
|
||||||
public:
|
public:
|
||||||
explicit AsyncFileStorage(const Path &storageFolderPath, QObject *parent = nullptr);
|
explicit AsyncFileStorage(const Path &storageFolderPath, QObject *parent = nullptr);
|
||||||
~AsyncFileStorage() override;
|
|
||||||
|
|
||||||
void store(const Path &filePath, const QByteArray &data);
|
void store(const Path &filePath, const QByteArray &data);
|
||||||
|
|
||||||
@@ -64,8 +58,4 @@ private:
|
|||||||
Q_INVOKABLE void store_impl(const Path &fileName, const QByteArray &data);
|
Q_INVOKABLE void store_impl(const Path &fileName, const QByteArray &data);
|
||||||
|
|
||||||
Path m_storageDir;
|
Path m_storageDir;
|
||||||
std::shared_ptr<QFile> m_lockFile;
|
|
||||||
|
|
||||||
static QHash<Path, std::weak_ptr<QFile>> m_reservedPaths;
|
|
||||||
static QReadWriteLock m_reservedPathsLock;
|
|
||||||
};
|
};
|
||||||
|
|||||||
Reference in New Issue
Block a user