diff --git a/src/base/bittorrent/session.cpp b/src/base/bittorrent/session.cpp index 26371c8e9..875afba45 100644 --- a/src/base/bittorrent/session.cpp +++ b/src/base/bittorrent/session.cpp @@ -4580,8 +4580,9 @@ void Session::handleFileErrorAlert(const lt::file_error_alert *p) if (!torrent) return; - const TorrentID id = torrent->id(); + torrent->handleAlert(p); + const TorrentID id = torrent->id(); if (!m_recentErroredTorrents.contains(id)) { m_recentErroredTorrents.insert(id); diff --git a/src/base/bittorrent/torrentimpl.cpp b/src/base/bittorrent/torrentimpl.cpp index ecb44432e..04a41dced 100644 --- a/src/base/bittorrent/torrentimpl.cpp +++ b/src/base/bittorrent/torrentimpl.cpp @@ -1005,7 +1005,13 @@ QString TorrentImpl::error() const return QString::fromStdString(m_nativeStatus.errc.message()); if (m_nativeStatus.flags & lt::torrent_flags::upload_mode) - return tr("There's not enough space on disk. Torrent is currently in \"upload only\" mode."); + { + const QString writeErrorStr = tr("Couldn't write to file."); + const QString uploadModeStr = tr("Torrent is currently in \"upload only\" mode."); + const QString errorMessage = QString::fromLocal8Bit(m_lastFileError.error.message().c_str()); + + return writeErrorStr + QLatin1Char(' ') + errorMessage + QLatin1String(". ") + uploadModeStr; + } return {}; } @@ -1922,6 +1928,11 @@ void TorrentImpl::handleFileCompletedAlert(const lt::file_completed_alert *p) } } +void TorrentImpl::handleFileErrorAlert(const lt::file_error_alert *p) +{ + m_lastFileError = {p->error, p->op}; +} + #if (LIBTORRENT_VERSION_NUM >= 20003) void TorrentImpl::handleFilePrioAlert(const lt::file_prio_alert *) { @@ -1981,6 +1992,9 @@ void TorrentImpl::handleAlert(const lt::alert *a) case lt::file_completed_alert::alert_type: handleFileCompletedAlert(static_cast(a)); break; + case lt::file_error_alert::alert_type: + handleFileErrorAlert(static_cast(a)); + break; case lt::torrent_finished_alert::alert_type: handleTorrentFinishedAlert(static_cast(a)); break; diff --git a/src/base/bittorrent/torrentimpl.h b/src/base/bittorrent/torrentimpl.h index 59e0d7ac6..7fd3fad22 100644 --- a/src/base/bittorrent/torrentimpl.h +++ b/src/base/bittorrent/torrentimpl.h @@ -78,6 +78,12 @@ namespace BitTorrent HandleMetadata }; + struct FileErrorInfo + { + lt::error_code error; + lt::operation_t operation; + }; + class TorrentImpl final : public QObject, public Torrent { Q_DISABLE_COPY(TorrentImpl) @@ -255,6 +261,7 @@ namespace BitTorrent void handleFastResumeRejectedAlert(const lt::fastresume_rejected_alert *p); void handleFileCompletedAlert(const lt::file_completed_alert *p); + void handleFileErrorAlert(const lt::file_error_alert *p); #if (LIBTORRENT_VERSION_NUM >= 20003) void handleFilePrioAlert(const lt::file_prio_alert *p); #endif @@ -310,6 +317,7 @@ namespace BitTorrent QHash> m_oldPath; QHash> m_trackerPeerCounts; + FileErrorInfo m_lastFileError; // Persistent data QString m_name;