feat: add editDate to RPC (#1056)
* feat: add tr_stat.infoDate to note tr_info changes The last time during this session that any tr_info field changed (e.g. trackers/filenames edited or magnet torrent got metadata). RPC clients can monitor this to know when to reload fields which don't usually change.
This commit is contained in:
parent
c62cb35fd4
commit
44fc571a67
|
@ -190,6 +190,7 @@
|
||||||
downloadedEver | number | tr_stat
|
downloadedEver | number | tr_stat
|
||||||
downloadLimit | number | tr_torrent
|
downloadLimit | number | tr_torrent
|
||||||
downloadLimited | boolean | tr_torrent
|
downloadLimited | boolean | tr_torrent
|
||||||
|
editDate | number | tr_stat
|
||||||
error | number | tr_stat
|
error | number | tr_stat
|
||||||
errorString | string | tr_stat
|
errorString | string | tr_stat
|
||||||
eta | number | tr_stat
|
eta | number | tr_stat
|
||||||
|
@ -806,6 +807,7 @@
|
||||||
| | yes | session-get | new arg "session-id"
|
| | yes | session-get | new arg "session-id"
|
||||||
| | yes | torrent-get | new arg "labels"
|
| | yes | torrent-get | new arg "labels"
|
||||||
| | yes | torrent-set | new arg "labels"
|
| | yes | torrent-set | new arg "labels"
|
||||||
|
| | yes | torrent-set | new arg "editDate"
|
||||||
| | yes | torrent-get | new arg "format"
|
| | yes | torrent-get | new arg "format"
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -105,6 +105,7 @@ static struct tr_key_struct const my_static[] =
|
||||||
Q("dropped"),
|
Q("dropped"),
|
||||||
Q("dropped6"),
|
Q("dropped6"),
|
||||||
Q("e"),
|
Q("e"),
|
||||||
|
Q("editDate"),
|
||||||
Q("encoding"),
|
Q("encoding"),
|
||||||
Q("encryption"),
|
Q("encryption"),
|
||||||
Q("error"),
|
Q("error"),
|
||||||
|
|
|
@ -105,6 +105,7 @@ enum
|
||||||
TR_KEY_dropped,
|
TR_KEY_dropped,
|
||||||
TR_KEY_dropped6,
|
TR_KEY_dropped6,
|
||||||
TR_KEY_e,
|
TR_KEY_e,
|
||||||
|
TR_KEY_editDate,
|
||||||
TR_KEY_encoding,
|
TR_KEY_encoding,
|
||||||
TR_KEY_encryption,
|
TR_KEY_encryption,
|
||||||
TR_KEY_error,
|
TR_KEY_error,
|
||||||
|
|
|
@ -641,6 +641,10 @@ static void initField(tr_torrent* const tor, tr_info const* const inf, tr_stat c
|
||||||
tr_variantInitInt(initme, st->id);
|
tr_variantInitInt(initme, st->id);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case TR_KEY_editDate:
|
||||||
|
tr_variantInitInt(initme, st->editDate);
|
||||||
|
break;
|
||||||
|
|
||||||
case TR_KEY_isFinished:
|
case TR_KEY_isFinished:
|
||||||
tr_variantInitBool(initme, st->finished);
|
tr_variantInitBool(initme, st->finished);
|
||||||
break;
|
break;
|
||||||
|
|
|
@ -340,6 +340,7 @@ void tr_torrentSetMetadataPiece(tr_torrent* tor, int piece, void const* data, in
|
||||||
tor->isStopping = true;
|
tor->isStopping = true;
|
||||||
tor->magnetVerify = true;
|
tor->magnetVerify = true;
|
||||||
tor->startAfterVerify = true;
|
tor->startAfterVerify = true;
|
||||||
|
tr_torrentMarkEdited(tor);
|
||||||
}
|
}
|
||||||
else /* drat. */
|
else /* drat. */
|
||||||
{
|
{
|
||||||
|
|
|
@ -1191,6 +1191,8 @@ void tr_torrentSetDownloadDir(tr_torrent* tor, char const* path)
|
||||||
{
|
{
|
||||||
tr_free(tor->downloadDir);
|
tr_free(tor->downloadDir);
|
||||||
tor->downloadDir = tr_strdup(path);
|
tor->downloadDir = tr_strdup(path);
|
||||||
|
|
||||||
|
tr_torrentMarkEdited(tor);
|
||||||
tr_torrentSetDirty(tor);
|
tr_torrentSetDirty(tor);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1406,6 +1408,7 @@ tr_stat const* tr_torrentStat(tr_torrent* tor)
|
||||||
s->activityDate = tor->activityDate;
|
s->activityDate = tor->activityDate;
|
||||||
s->addedDate = tor->addedDate;
|
s->addedDate = tor->addedDate;
|
||||||
s->doneDate = tor->doneDate;
|
s->doneDate = tor->doneDate;
|
||||||
|
s->editDate = tor->editDate;
|
||||||
s->startDate = tor->startDate;
|
s->startDate = tor->startDate;
|
||||||
s->secondsSeeding = tor->secondsSeeding;
|
s->secondsSeeding = tor->secondsSeeding;
|
||||||
s->secondsDownloading = tor->secondsDownloading;
|
s->secondsDownloading = tor->secondsDownloading;
|
||||||
|
@ -2862,6 +2865,7 @@ bool tr_torrentSetAnnounceList(tr_torrent* tor, tr_tracker_info const* trackers_
|
||||||
tor->info.trackerCount = tmpInfo.trackerCount;
|
tor->info.trackerCount = tmpInfo.trackerCount;
|
||||||
tmpInfo.trackers = swap.trackers;
|
tmpInfo.trackers = swap.trackers;
|
||||||
tmpInfo.trackerCount = swap.trackerCount;
|
tmpInfo.trackerCount = swap.trackerCount;
|
||||||
|
tr_torrentMarkEdited(tor);
|
||||||
|
|
||||||
tr_metainfoFree(&tmpInfo);
|
tr_metainfoFree(&tmpInfo);
|
||||||
tr_variantToFile(&metainfo, TR_VARIANT_FMT_BENC, tor->info.torrent);
|
tr_variantToFile(&metainfo, TR_VARIANT_FMT_BENC, tor->info.torrent);
|
||||||
|
@ -4005,6 +4009,7 @@ static void torrentRenamePath(void* vdata)
|
||||||
tor->info.name = tr_strdup(newname);
|
tor->info.name = tr_strdup(newname);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
tr_torrentMarkEdited(tor);
|
||||||
tr_torrentSetDirty(tor);
|
tr_torrentSetDirty(tor);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -191,11 +191,12 @@ struct tr_torrent
|
||||||
uint64_t etaULSpeedCalculatedAt;
|
uint64_t etaULSpeedCalculatedAt;
|
||||||
unsigned int etaULSpeed_Bps;
|
unsigned int etaULSpeed_Bps;
|
||||||
|
|
||||||
time_t addedDate;
|
|
||||||
time_t activityDate;
|
time_t activityDate;
|
||||||
time_t doneDate;
|
time_t addedDate;
|
||||||
time_t startDate;
|
|
||||||
time_t anyDate;
|
time_t anyDate;
|
||||||
|
time_t doneDate;
|
||||||
|
time_t editDate;
|
||||||
|
time_t startDate;
|
||||||
|
|
||||||
int secondsDownloading;
|
int secondsDownloading;
|
||||||
int secondsSeeding;
|
int secondsSeeding;
|
||||||
|
@ -349,6 +350,14 @@ static inline void tr_torrentSetDirty(tr_torrent* tor)
|
||||||
tor->isDirty = true;
|
tor->isDirty = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* note that the torrent's tr_info just changed */
|
||||||
|
static inline void tr_torrentMarkEdited(tr_torrent* tor)
|
||||||
|
{
|
||||||
|
TR_ASSERT(tr_isTorrent(tor));
|
||||||
|
|
||||||
|
tor->editDate = tr_time();
|
||||||
|
}
|
||||||
|
|
||||||
uint32_t tr_getBlockSize(uint32_t pieceSize);
|
uint32_t tr_getBlockSize(uint32_t pieceSize);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -1828,6 +1828,12 @@ typedef struct tr_stat
|
||||||
/** The last time we uploaded or downloaded piece data on this torrent. */
|
/** The last time we uploaded or downloaded piece data on this torrent. */
|
||||||
time_t activityDate;
|
time_t activityDate;
|
||||||
|
|
||||||
|
/** The last time during this session that a rarely-changing field
|
||||||
|
changed -- e.g. any tr_info field (trackers, filenames, name)
|
||||||
|
or download directory. RPC clients can monitor this to know when
|
||||||
|
to reload fields that rarely change. */
|
||||||
|
time_t editDate;
|
||||||
|
|
||||||
/** Number of seconds since the last activity (or since started).
|
/** Number of seconds since the last activity (or since started).
|
||||||
-1 if activity is not seeding or downloading. */
|
-1 if activity is not seeding or downloading. */
|
||||||
int idleSecs;
|
int idleSecs;
|
||||||
|
|
|
@ -399,6 +399,12 @@ void Application::quitLater()
|
||||||
QTimer::singleShot(0, this, SLOT(quit()));
|
QTimer::singleShot(0, this, SLOT(quit()));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Application::onTorrentsEdited(torrent_ids_t const& ids)
|
||||||
|
{
|
||||||
|
// the backend's tr_info has changed, so reload those fields
|
||||||
|
mySession->initTorrents(ids);
|
||||||
|
}
|
||||||
|
|
||||||
QStringList Application::getNames(torrent_ids_t const& ids) const
|
QStringList Application::getNames(torrent_ids_t const& ids) const
|
||||||
{
|
{
|
||||||
QStringList names;
|
QStringList names;
|
||||||
|
|
|
@ -18,6 +18,7 @@
|
||||||
class AddData;
|
class AddData;
|
||||||
class Prefs;
|
class Prefs;
|
||||||
class Session;
|
class Session;
|
||||||
|
class Torrent;
|
||||||
class TorrentModel;
|
class TorrentModel;
|
||||||
class MainWindow;
|
class MainWindow;
|
||||||
class WatchDir;
|
class WatchDir;
|
||||||
|
@ -41,11 +42,12 @@ public slots:
|
||||||
private slots:
|
private slots:
|
||||||
void consentGiven(int result);
|
void consentGiven(int result);
|
||||||
void onSessionSourceChanged();
|
void onSessionSourceChanged();
|
||||||
void refreshPref(int key);
|
|
||||||
void refreshTorrents();
|
|
||||||
void onTorrentsAdded(torrent_ids_t const& torrents);
|
void onTorrentsAdded(torrent_ids_t const& torrents);
|
||||||
void onTorrentsCompleted(torrent_ids_t const& torrents);
|
void onTorrentsCompleted(torrent_ids_t const& torrents);
|
||||||
|
void onTorrentsEdited(torrent_ids_t const& torrents);
|
||||||
void onTorrentsNeedInfo(torrent_ids_t const& torrents);
|
void onTorrentsNeedInfo(torrent_ids_t const& torrents);
|
||||||
|
void refreshPref(int key);
|
||||||
|
void refreshTorrents();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void maybeUpdateBlocklist();
|
void maybeUpdateBlocklist();
|
||||||
|
|
|
@ -310,6 +310,12 @@ void DetailsDialog::getNewData()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void DetailsDialog::onTorrentEdited(torrent_ids_t const& /*ids*/)
|
||||||
|
{
|
||||||
|
// FIXME
|
||||||
|
// refreshDetailInfo({ tor.id() });
|
||||||
|
}
|
||||||
|
|
||||||
void DetailsDialog::onTorrentsChanged(torrent_ids_t const& ids)
|
void DetailsDialog::onTorrentsChanged(torrent_ids_t const& ids)
|
||||||
{
|
{
|
||||||
if (myHavePendingRefresh)
|
if (myHavePendingRefresh)
|
||||||
|
|
|
@ -59,10 +59,11 @@ private:
|
||||||
private slots:
|
private slots:
|
||||||
void refresh();
|
void refresh();
|
||||||
void refreshPref(int key);
|
void refreshPref(int key);
|
||||||
|
|
||||||
void onTorrentsChanged(torrent_ids_t const& ids);
|
|
||||||
void onTimer();
|
void onTimer();
|
||||||
|
|
||||||
|
void onTorrentEdited(torrent_ids_t const& ids);
|
||||||
|
void onTorrentsChanged(torrent_ids_t const& ids);
|
||||||
|
|
||||||
// Tracker tab
|
// Tracker tab
|
||||||
void onTrackerSelectionChanged();
|
void onTrackerSelectionChanged();
|
||||||
void onAddTrackerClicked();
|
void onAddTrackerClicked();
|
||||||
|
|
|
@ -646,10 +646,16 @@ bool Torrent::update(tr_quark const* keys, tr_variant** values, size_t n)
|
||||||
case QVariant::DateTime:
|
case QVariant::DateTime:
|
||||||
{
|
{
|
||||||
int64_t val;
|
int64_t val;
|
||||||
|
if (tr_variantGetInt(child, &val) && val &&
|
||||||
if (tr_variantGetInt(child, &val) && val)
|
setTime(property_index, time_t(val)))
|
||||||
{
|
{
|
||||||
changed |= setTime(property_index, time_t(val));
|
changed = true;
|
||||||
|
|
||||||
|
if (key == TR_KEY_editDate)
|
||||||
|
{
|
||||||
|
// FIXME
|
||||||
|
// emit torrentEdited(*this);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
break;
|
break;
|
||||||
|
|
|
@ -180,6 +180,7 @@ public:
|
||||||
PEERS,
|
PEERS,
|
||||||
BANDWIDTH_PRIORITY,
|
BANDWIDTH_PRIORITY,
|
||||||
QUEUE_POSITION,
|
QUEUE_POSITION,
|
||||||
|
EDIT_DATE,
|
||||||
//
|
//
|
||||||
PROPERTY_COUNT
|
PROPERTY_COUNT
|
||||||
};
|
};
|
||||||
|
|
|
@ -59,6 +59,7 @@ signals:
|
||||||
void torrentsAdded(torrent_ids_t const&);
|
void torrentsAdded(torrent_ids_t const&);
|
||||||
void torrentsChanged(torrent_ids_t const&);
|
void torrentsChanged(torrent_ids_t const&);
|
||||||
void torrentsCompleted(torrent_ids_t const&);
|
void torrentsCompleted(torrent_ids_t const&);
|
||||||
|
void torrentsEdited(torrent_ids_t const&);
|
||||||
void torrentsNeedInfo(torrent_ids_t const&);
|
void torrentsNeedInfo(torrent_ids_t const&);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
Loading…
Reference in New Issue