Set torrent file's metainfo for magnets (#3322)
This commit is contained in:
parent
308ae8487a
commit
7f01ee52fe
|
@ -236,6 +236,40 @@ static void tr_buildMetainfoExceptInfoDict(tr_torrent_metainfo const& tm, tr_var
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool tr_torrentUseMetainfoFromFile(
|
||||||
|
tr_torrent* tor,
|
||||||
|
tr_torrent_metainfo const* metainfo,
|
||||||
|
char const* filename_in,
|
||||||
|
tr_error** error)
|
||||||
|
{
|
||||||
|
// add .torrent file
|
||||||
|
if (!tr_sys_path_copy(filename_in, tor->torrentFile(), error))
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// remove .magnet file
|
||||||
|
tr_sys_path_remove(tor->magnetFile());
|
||||||
|
|
||||||
|
// tor should keep this metainfo
|
||||||
|
tor->setMetainfo(*metainfo);
|
||||||
|
|
||||||
|
if (tor->incompleteMetadata)
|
||||||
|
{
|
||||||
|
incompleteMetadataFree(tor->incompleteMetadata);
|
||||||
|
tor->incompleteMetadata = nullptr;
|
||||||
|
}
|
||||||
|
tor->isStopping = true;
|
||||||
|
tor->magnetVerify = true;
|
||||||
|
if (tr_sessionGetPaused(tor->session))
|
||||||
|
{
|
||||||
|
tor->startAfterVerify = false;
|
||||||
|
}
|
||||||
|
tor->markEdited();
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
static bool useNewMetainfo(tr_torrent* tor, tr_incomplete_metadata const* m, tr_error** error)
|
static bool useNewMetainfo(tr_torrent* tor, tr_incomplete_metadata const* m, tr_error** error)
|
||||||
{
|
{
|
||||||
// test the info_dict checksum
|
// test the info_dict checksum
|
||||||
|
|
|
@ -16,6 +16,7 @@
|
||||||
#include "transmission.h"
|
#include "transmission.h"
|
||||||
|
|
||||||
struct tr_torrent;
|
struct tr_torrent;
|
||||||
|
struct tr_torrent_metainfo;
|
||||||
|
|
||||||
// defined by BEP #9
|
// defined by BEP #9
|
||||||
inline constexpr int METADATA_PIECE_SIZE = 1024 * 16;
|
inline constexpr int METADATA_PIECE_SIZE = 1024 * 16;
|
||||||
|
@ -29,3 +30,9 @@ bool tr_torrentGetNextMetadataRequest(tr_torrent* tor, time_t now, int* setme);
|
||||||
bool tr_torrentSetMetadataSizeHint(tr_torrent* tor, int64_t metadata_size);
|
bool tr_torrentSetMetadataSizeHint(tr_torrent* tor, int64_t metadata_size);
|
||||||
|
|
||||||
double tr_torrentGetMetadataPercent(tr_torrent const* tor);
|
double tr_torrentGetMetadataPercent(tr_torrent const* tor);
|
||||||
|
|
||||||
|
bool tr_torrentUseMetainfoFromFile(
|
||||||
|
tr_torrent* tor,
|
||||||
|
tr_torrent_metainfo const* metainfo,
|
||||||
|
char const* filename,
|
||||||
|
tr_error** error);
|
||||||
|
|
|
@ -111,6 +111,31 @@ tr_torrent* tr_torrentFindFromObfuscatedHash(tr_session* session, tr_sha1_digest
|
||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool tr_torrentSetMetainfoFromFile(tr_torrent* tor, tr_torrent_metainfo* metainfo, char const* filename)
|
||||||
|
{
|
||||||
|
if (tr_torrentHasMetadata(tor))
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
tr_error* error = nullptr;
|
||||||
|
tr_torrentUseMetainfoFromFile(tor, metainfo, filename, &error);
|
||||||
|
|
||||||
|
if (error != nullptr)
|
||||||
|
{
|
||||||
|
tor->setLocalError(fmt::format(
|
||||||
|
_("Couldn't use metaInfo from '{path}' for '{magnet}': {error} ({error_code})"),
|
||||||
|
fmt::arg("path", filename),
|
||||||
|
fmt::arg("magnet", tor->magnet()),
|
||||||
|
fmt::arg("error", error->message),
|
||||||
|
fmt::arg("error_code", error->code)));
|
||||||
|
tr_error_clear(&error);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
bool tr_torrent::isPieceTransferAllowed(tr_direction direction) const
|
bool tr_torrent::isPieceTransferAllowed(tr_direction direction) const
|
||||||
{
|
{
|
||||||
TR_ASSERT(tr_isDirection(direction));
|
TR_ASSERT(tr_isDirection(direction));
|
||||||
|
@ -816,8 +841,6 @@ static void torrentInit(tr_torrent* tor, tr_ctor const* ctor)
|
||||||
fmt::arg("error_code", error->code)));
|
fmt::arg("error_code", error->code)));
|
||||||
tr_error_clear(&error);
|
tr_error_clear(&error);
|
||||||
}
|
}
|
||||||
|
|
||||||
tr_error_clear(&error);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
tor->torrent_announcer = tr_announcerAddTorrent(tor, onTrackerResponse, nullptr);
|
tor->torrent_announcer = tr_announcerAddTorrent(tor, onTrackerResponse, nullptr);
|
||||||
|
|
|
@ -993,6 +993,13 @@ tr_torrent* tr_torrentFindFromMetainfo(tr_session*, tr_torrent_metainfo const*);
|
||||||
|
|
||||||
tr_torrent* tr_torrentFindFromMagnetLink(tr_session* session, char const* link);
|
tr_torrent* tr_torrentFindFromMagnetLink(tr_session* session, char const* link);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Set metainfo if possible.
|
||||||
|
* @return True if given metainfo was set.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
bool tr_torrentSetMetainfoFromFile(tr_torrent* torrent, tr_torrent_metainfo* metainfo, char const* filename);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @return this torrent's name.
|
* @return this torrent's name.
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -13,15 +13,9 @@
|
||||||
|
|
||||||
@class AddMagnetWindowController;
|
@class AddMagnetWindowController;
|
||||||
@class AddWindowController;
|
@class AddWindowController;
|
||||||
@class Badger;
|
|
||||||
@class DragOverlayWindow;
|
|
||||||
@class FilterBarController;
|
|
||||||
@class InfoWindowController;
|
|
||||||
@class MessageWindowController;
|
@class MessageWindowController;
|
||||||
@class PrefsController;
|
@class PrefsController;
|
||||||
@class StatusBarController;
|
|
||||||
@class Torrent;
|
@class Torrent;
|
||||||
@class URLSheetWindowController;
|
|
||||||
|
|
||||||
typedef NS_ENUM(unsigned int, addType) { //
|
typedef NS_ENUM(unsigned int, addType) { //
|
||||||
ADD_MANUAL,
|
ADD_MANUAL,
|
||||||
|
|
|
@ -1111,9 +1111,18 @@ static void removeKeRangerRansomware()
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (tr_torrentFindFromMetainfo(self.fLib, &metainfo) != nullptr) // dupe torrent
|
auto foundTorrent = tr_torrentFindFromMetainfo(self.fLib, &metainfo);
|
||||||
|
if (foundTorrent != nullptr) // dupe torrent
|
||||||
{
|
{
|
||||||
[self duplicateOpenAlert:@(metainfo.name().c_str())];
|
if (tr_torrentHasMetadata(foundTorrent))
|
||||||
|
{
|
||||||
|
[self duplicateOpenAlert:@(metainfo.name().c_str())];
|
||||||
|
}
|
||||||
|
// foundTorrent is a magnet, fill it with file's metainfo
|
||||||
|
else if (!tr_torrentSetMetainfoFromFile(foundTorrent, &metainfo, torrentPath.UTF8String))
|
||||||
|
{
|
||||||
|
[self duplicateOpenAlert:@(metainfo.name().c_str())];
|
||||||
|
}
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue