2007-12-21 16:51:42 +00:00
|
|
|
/*
|
2014-01-19 01:09:44 +00:00
|
|
|
* This file Copyright (C) 2009-2014 Mnemosyne LLC
|
2007-12-21 16:51:42 +00:00
|
|
|
*
|
2014-01-21 03:10:30 +00:00
|
|
|
* It may be used under the GNU GPL versions 2 or 3
|
2014-01-19 01:09:44 +00:00
|
|
|
* or any future license endorsed by Mnemosyne LLC.
|
2007-12-21 16:51:42 +00:00
|
|
|
*
|
2008-02-26 21:58:58 +00:00
|
|
|
* $Id$
|
2007-12-21 16:51:42 +00:00
|
|
|
*/
|
|
|
|
|
2010-01-20 23:58:09 +00:00
|
|
|
#include <errno.h> /* EINVAL */
|
2014-07-08 00:08:43 +00:00
|
|
|
|
2007-12-21 16:51:42 +00:00
|
|
|
#include "transmission.h"
|
2014-07-08 00:08:43 +00:00
|
|
|
#include "file.h"
|
2009-11-24 02:16:31 +00:00
|
|
|
#include "magnet.h"
|
2012-12-05 17:29:46 +00:00
|
|
|
#include "session.h" /* tr_sessionFindTorrentFile () */
|
|
|
|
#include "torrent.h" /* tr_ctorGetSave () */
|
2009-04-02 20:43:42 +00:00
|
|
|
#include "utils.h" /* tr_new0 */
|
2012-12-14 04:34:42 +00:00
|
|
|
#include "variant.h"
|
2007-12-21 16:51:42 +00:00
|
|
|
|
|
|
|
struct optional_args
|
|
|
|
{
|
2011-03-22 15:19:54 +00:00
|
|
|
bool isSet_paused;
|
|
|
|
bool isSet_connected;
|
|
|
|
bool isSet_downloadDir;
|
2007-12-21 16:51:42 +00:00
|
|
|
|
2011-03-22 15:19:54 +00:00
|
|
|
bool isPaused;
|
2008-09-23 19:11:04 +00:00
|
|
|
uint16_t peerLimit;
|
2008-10-14 03:54:57 +00:00
|
|
|
char * downloadDir;
|
2007-12-21 16:51:42 +00:00
|
|
|
};
|
|
|
|
|
2008-05-23 20:04:41 +00:00
|
|
|
/** Opaque class used when instantiating torrents.
|
2008-09-23 19:11:04 +00:00
|
|
|
* @ingroup tr_ctor */
|
2007-12-21 16:51:42 +00:00
|
|
|
struct tr_ctor
|
|
|
|
{
|
2008-12-13 23:17:36 +00:00
|
|
|
const tr_session * session;
|
2011-03-22 15:19:54 +00:00
|
|
|
bool saveInOurTorrentsDir;
|
|
|
|
bool doDelete;
|
2007-12-21 16:51:42 +00:00
|
|
|
|
2010-02-02 07:48:03 +00:00
|
|
|
tr_priority_t bandwidthPriority;
|
2011-03-22 15:19:54 +00:00
|
|
|
bool isSet_metainfo;
|
|
|
|
bool isSet_delete;
|
2013-08-24 18:18:38 +00:00
|
|
|
tr_variant metainfo;
|
2008-09-23 19:11:04 +00:00
|
|
|
char * sourceFile;
|
2007-12-21 16:51:42 +00:00
|
|
|
|
2008-09-23 19:11:04 +00:00
|
|
|
struct optional_args optionalArgs[2];
|
2009-04-02 20:43:42 +00:00
|
|
|
|
2011-03-15 04:22:47 +00:00
|
|
|
char * cookies;
|
2009-10-21 05:03:10 +00:00
|
|
|
char * incompleteDir;
|
|
|
|
|
2009-04-02 20:43:42 +00:00
|
|
|
tr_file_index_t * want;
|
|
|
|
tr_file_index_t wantSize;
|
|
|
|
tr_file_index_t * notWant;
|
|
|
|
tr_file_index_t notWantSize;
|
|
|
|
tr_file_index_t * low;
|
|
|
|
tr_file_index_t lowSize;
|
|
|
|
tr_file_index_t * normal;
|
|
|
|
tr_file_index_t normalSize;
|
|
|
|
tr_file_index_t * high;
|
|
|
|
tr_file_index_t highSize;
|
2007-12-21 16:51:42 +00:00
|
|
|
};
|
|
|
|
|
2007-12-21 22:18:40 +00:00
|
|
|
/***
|
|
|
|
****
|
|
|
|
***/
|
2007-12-21 16:51:42 +00:00
|
|
|
|
2008-02-13 02:24:12 +00:00
|
|
|
static void
|
2012-12-05 17:29:46 +00:00
|
|
|
setSourceFile (tr_ctor * ctor,
|
|
|
|
const char * sourceFile)
|
2008-02-13 02:24:12 +00:00
|
|
|
{
|
2012-12-05 17:29:46 +00:00
|
|
|
tr_free (ctor->sourceFile);
|
|
|
|
ctor->sourceFile = tr_strdup (sourceFile);
|
2008-02-13 02:24:12 +00:00
|
|
|
}
|
|
|
|
|
2007-12-21 16:51:42 +00:00
|
|
|
static void
|
2012-12-05 17:29:46 +00:00
|
|
|
clearMetainfo (tr_ctor * ctor)
|
2007-12-21 16:51:42 +00:00
|
|
|
{
|
2012-12-05 17:29:46 +00:00
|
|
|
if (ctor->isSet_metainfo)
|
2008-09-23 19:11:04 +00:00
|
|
|
{
|
2013-08-24 18:18:38 +00:00
|
|
|
ctor->isSet_metainfo = false;
|
2012-12-14 04:34:42 +00:00
|
|
|
tr_variantFree (&ctor->metainfo);
|
2007-12-21 16:51:42 +00:00
|
|
|
}
|
2008-02-13 02:24:12 +00:00
|
|
|
|
2012-12-05 17:29:46 +00:00
|
|
|
setSourceFile (ctor, NULL);
|
2007-12-21 16:51:42 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
int
|
2012-12-05 17:29:46 +00:00
|
|
|
tr_ctorSetMetainfo (tr_ctor * ctor,
|
2008-09-23 19:11:04 +00:00
|
|
|
const uint8_t * metainfo,
|
2012-12-05 17:29:46 +00:00
|
|
|
size_t len)
|
2007-12-21 16:51:42 +00:00
|
|
|
{
|
|
|
|
int err;
|
2008-09-23 19:11:04 +00:00
|
|
|
|
2012-12-05 17:29:46 +00:00
|
|
|
clearMetainfo (ctor);
|
2012-12-14 04:34:42 +00:00
|
|
|
err = tr_variantFromBenc (&ctor->metainfo, metainfo, len);
|
2007-12-21 22:18:40 +00:00
|
|
|
ctor->isSet_metainfo = !err;
|
2007-12-21 16:51:42 +00:00
|
|
|
return err;
|
|
|
|
}
|
|
|
|
|
2008-02-13 02:24:12 +00:00
|
|
|
const char*
|
2012-12-05 17:29:46 +00:00
|
|
|
tr_ctorGetSourceFile (const tr_ctor * ctor)
|
2008-02-13 02:24:12 +00:00
|
|
|
{
|
|
|
|
return ctor->sourceFile;
|
|
|
|
}
|
|
|
|
|
2009-11-24 02:16:31 +00:00
|
|
|
int
|
2012-12-05 17:29:46 +00:00
|
|
|
tr_ctorSetMetainfoFromMagnetLink (tr_ctor * ctor, const char * magnet_link)
|
2009-11-24 02:16:31 +00:00
|
|
|
{
|
|
|
|
int err;
|
2012-12-05 17:29:46 +00:00
|
|
|
tr_magnet_info * magnet_info = tr_magnetParse (magnet_link);
|
2010-02-02 22:45:22 +00:00
|
|
|
|
2012-12-05 17:29:46 +00:00
|
|
|
if (magnet_info == NULL)
|
2010-02-02 22:45:22 +00:00
|
|
|
err = -1;
|
|
|
|
else {
|
2015-12-25 11:34:35 +00:00
|
|
|
size_t len;
|
2012-12-14 04:34:42 +00:00
|
|
|
tr_variant tmp;
|
2010-02-02 22:45:22 +00:00
|
|
|
char * str;
|
2009-11-24 02:16:31 +00:00
|
|
|
|
2012-12-05 17:29:46 +00:00
|
|
|
tr_magnetCreateMetainfo (magnet_info, &tmp);
|
2012-12-14 04:34:42 +00:00
|
|
|
str = tr_variantToStr (&tmp, TR_VARIANT_FMT_BENC, &len);
|
2012-12-05 17:29:46 +00:00
|
|
|
err = tr_ctorSetMetainfo (ctor, (const uint8_t*)str, len);
|
2009-11-24 02:16:31 +00:00
|
|
|
|
2012-12-05 17:29:46 +00:00
|
|
|
tr_free (str);
|
2012-12-14 04:34:42 +00:00
|
|
|
tr_variantFree (&tmp);
|
2012-12-05 17:29:46 +00:00
|
|
|
tr_magnetFree (magnet_info);
|
2010-02-02 22:45:22 +00:00
|
|
|
}
|
2009-11-24 02:16:31 +00:00
|
|
|
|
|
|
|
return err;
|
|
|
|
}
|
|
|
|
|
2007-12-21 16:51:42 +00:00
|
|
|
int
|
2012-12-05 17:29:46 +00:00
|
|
|
tr_ctorSetMetainfoFromFile (tr_ctor * ctor,
|
|
|
|
const char * filename)
|
2007-12-21 16:51:42 +00:00
|
|
|
{
|
2007-12-21 22:18:40 +00:00
|
|
|
uint8_t * metainfo;
|
2008-09-23 19:11:04 +00:00
|
|
|
size_t len;
|
|
|
|
int err;
|
2007-12-21 16:51:42 +00:00
|
|
|
|
2015-04-11 10:51:59 +00:00
|
|
|
metainfo = tr_loadFile (filename, &len, NULL);
|
2012-12-05 17:29:46 +00:00
|
|
|
if (metainfo && len)
|
|
|
|
err = tr_ctorSetMetainfo (ctor, metainfo, len);
|
2008-09-23 19:11:04 +00:00
|
|
|
else
|
|
|
|
{
|
2012-12-05 17:29:46 +00:00
|
|
|
clearMetainfo (ctor);
|
2007-12-21 16:51:42 +00:00
|
|
|
err = 1;
|
|
|
|
}
|
|
|
|
|
2012-12-05 17:29:46 +00:00
|
|
|
setSourceFile (ctor, filename);
|
2008-02-13 02:24:12 +00:00
|
|
|
|
2008-01-03 16:01:29 +00:00
|
|
|
/* if no `name' field was set, then set it from the filename */
|
2012-12-05 17:29:46 +00:00
|
|
|
if (ctor->isSet_metainfo)
|
2008-09-23 19:11:04 +00:00
|
|
|
{
|
2012-12-14 04:34:42 +00:00
|
|
|
tr_variant * info;
|
2012-12-22 20:35:19 +00:00
|
|
|
if (tr_variantDictFindDict (&ctor->metainfo, TR_KEY_info, &info))
|
2008-09-23 19:11:04 +00:00
|
|
|
{
|
2008-08-21 14:57:59 +00:00
|
|
|
const char * name;
|
2012-12-22 20:35:19 +00:00
|
|
|
if (!tr_variantDictFindStr (info, TR_KEY_name_utf_8, &name, NULL))
|
|
|
|
if (!tr_variantDictFindStr (info, TR_KEY_name, &name, NULL))
|
2008-08-21 14:57:59 +00:00
|
|
|
name = NULL;
|
2012-12-05 17:29:46 +00:00
|
|
|
if (!name || !*name)
|
2008-09-23 19:11:04 +00:00
|
|
|
{
|
2014-07-08 00:08:43 +00:00
|
|
|
char * base = tr_sys_path_basename (filename, NULL);
|
2012-12-22 20:35:19 +00:00
|
|
|
tr_variantDictAddStr (info, TR_KEY_name, base);
|
2012-12-05 17:29:46 +00:00
|
|
|
tr_free (base);
|
2008-01-03 16:01:29 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2012-12-05 17:29:46 +00:00
|
|
|
tr_free (metainfo);
|
2007-12-21 16:51:42 +00:00
|
|
|
return err;
|
|
|
|
}
|
|
|
|
|
|
|
|
int
|
2012-12-05 17:29:46 +00:00
|
|
|
tr_ctorSetMetainfoFromHash (tr_ctor * ctor,
|
|
|
|
const char * hashString)
|
2007-12-21 16:51:42 +00:00
|
|
|
{
|
2008-09-23 19:11:04 +00:00
|
|
|
int err;
|
2008-04-14 14:39:13 +00:00
|
|
|
const char * filename;
|
2007-12-21 16:51:42 +00:00
|
|
|
|
2012-12-05 17:29:46 +00:00
|
|
|
filename = tr_sessionFindTorrentFile (ctor->session, hashString);
|
|
|
|
if (!filename)
|
2008-10-03 04:49:06 +00:00
|
|
|
err = EINVAL;
|
2008-04-14 14:39:13 +00:00
|
|
|
else
|
2012-12-05 17:29:46 +00:00
|
|
|
err = tr_ctorSetMetainfoFromFile (ctor, filename);
|
2007-12-21 16:51:42 +00:00
|
|
|
|
|
|
|
return err;
|
|
|
|
}
|
|
|
|
|
|
|
|
/***
|
|
|
|
****
|
|
|
|
***/
|
|
|
|
|
2009-04-02 20:43:42 +00:00
|
|
|
void
|
2012-12-05 17:29:46 +00:00
|
|
|
tr_ctorSetFilePriorities (tr_ctor * ctor,
|
2009-04-02 20:43:42 +00:00
|
|
|
const tr_file_index_t * files,
|
|
|
|
tr_file_index_t fileCount,
|
2012-12-05 17:29:46 +00:00
|
|
|
tr_priority_t priority)
|
2009-04-02 20:43:42 +00:00
|
|
|
{
|
|
|
|
tr_file_index_t ** myfiles;
|
|
|
|
tr_file_index_t * mycount;
|
|
|
|
|
2012-12-05 17:29:46 +00:00
|
|
|
switch (priority) {
|
2009-04-02 20:43:42 +00:00
|
|
|
case TR_PRI_LOW: myfiles = &ctor->low; mycount = &ctor->lowSize; break;
|
|
|
|
case TR_PRI_HIGH: myfiles = &ctor->high; mycount = &ctor->highSize; break;
|
2009-05-13 15:54:04 +00:00
|
|
|
default /*TR_PRI_NORMAL*/: myfiles = &ctor->normal; mycount = &ctor->normalSize; break;
|
2009-04-02 20:43:42 +00:00
|
|
|
}
|
|
|
|
|
2012-12-05 17:29:46 +00:00
|
|
|
tr_free (*myfiles);
|
|
|
|
*myfiles = tr_memdup (files, sizeof (tr_file_index_t)*fileCount);
|
2009-04-02 20:43:42 +00:00
|
|
|
*mycount = fileCount;
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
2012-12-05 17:29:46 +00:00
|
|
|
tr_ctorInitTorrentPriorities (const tr_ctor * ctor, tr_torrent * tor)
|
2009-04-02 20:43:42 +00:00
|
|
|
{
|
|
|
|
tr_file_index_t i;
|
|
|
|
|
2012-12-05 17:29:46 +00:00
|
|
|
for (i=0; i<ctor->lowSize; ++i)
|
|
|
|
tr_torrentInitFilePriority (tor, ctor->low[i], TR_PRI_LOW);
|
|
|
|
for (i=0; i<ctor->normalSize; ++i)
|
|
|
|
tr_torrentInitFilePriority (tor, ctor->normal[i], TR_PRI_NORMAL);
|
|
|
|
for (i=0; i<ctor->highSize; ++i)
|
|
|
|
tr_torrentInitFilePriority (tor, ctor->high[i], TR_PRI_HIGH);
|
2009-04-02 20:43:42 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
void
|
2012-12-05 17:29:46 +00:00
|
|
|
tr_ctorSetFilesWanted (tr_ctor * ctor,
|
2009-04-02 20:43:42 +00:00
|
|
|
const tr_file_index_t * files,
|
|
|
|
tr_file_index_t fileCount,
|
2012-12-05 17:29:46 +00:00
|
|
|
bool wanted)
|
2009-04-02 20:43:42 +00:00
|
|
|
{
|
|
|
|
tr_file_index_t ** myfiles = wanted ? &ctor->want : &ctor->notWant;
|
|
|
|
tr_file_index_t * mycount = wanted ? &ctor->wantSize : &ctor->notWantSize;
|
|
|
|
|
2012-12-05 17:29:46 +00:00
|
|
|
tr_free (*myfiles);
|
|
|
|
*myfiles = tr_memdup (files, sizeof (tr_file_index_t)*fileCount);
|
2009-04-02 20:43:42 +00:00
|
|
|
*mycount = fileCount;
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
2012-12-05 17:29:46 +00:00
|
|
|
tr_ctorInitTorrentWanted (const tr_ctor * ctor, tr_torrent * tor)
|
2009-04-02 20:43:42 +00:00
|
|
|
{
|
2012-12-05 17:29:46 +00:00
|
|
|
if (ctor->notWantSize)
|
|
|
|
tr_torrentInitFileDLs (tor, ctor->notWant, ctor->notWantSize, false);
|
|
|
|
if (ctor->wantSize)
|
|
|
|
tr_torrentInitFileDLs (tor, ctor->want, ctor->wantSize, true);
|
2009-04-02 20:43:42 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
/***
|
|
|
|
****
|
|
|
|
***/
|
|
|
|
|
2008-02-13 02:24:12 +00:00
|
|
|
void
|
2012-12-05 17:29:46 +00:00
|
|
|
tr_ctorSetDeleteSource (tr_ctor * ctor, bool deleteSource)
|
2008-02-13 02:24:12 +00:00
|
|
|
{
|
2013-08-24 18:08:38 +00:00
|
|
|
assert (tr_isBool (deleteSource));
|
|
|
|
|
|
|
|
ctor->doDelete = deleteSource;
|
|
|
|
ctor->isSet_delete = true;
|
2008-02-13 02:24:12 +00:00
|
|
|
}
|
|
|
|
|
2015-05-31 22:13:31 +00:00
|
|
|
bool
|
2012-12-05 17:29:46 +00:00
|
|
|
tr_ctorGetDeleteSource (const tr_ctor * ctor, bool * setme)
|
2008-02-13 02:24:12 +00:00
|
|
|
{
|
2015-05-31 22:13:31 +00:00
|
|
|
bool ret = true;
|
2008-02-13 02:24:12 +00:00
|
|
|
|
2012-12-05 17:29:46 +00:00
|
|
|
if (!ctor->isSet_delete)
|
2015-05-31 22:13:31 +00:00
|
|
|
ret = false;
|
2012-12-05 17:29:46 +00:00
|
|
|
else if (setme)
|
2015-05-31 22:13:31 +00:00
|
|
|
*setme = ctor->doDelete;
|
2008-02-13 02:24:12 +00:00
|
|
|
|
2015-05-31 22:13:31 +00:00
|
|
|
return ret;
|
2008-02-13 02:24:12 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
/***
|
|
|
|
****
|
|
|
|
***/
|
|
|
|
|
2007-12-22 17:30:31 +00:00
|
|
|
void
|
2012-12-05 17:29:46 +00:00
|
|
|
tr_ctorSetSave (tr_ctor * ctor, bool saveInOurTorrentsDir)
|
2007-12-22 17:30:31 +00:00
|
|
|
{
|
2013-08-24 18:08:38 +00:00
|
|
|
assert (tr_isBool (saveInOurTorrentsDir));
|
|
|
|
|
|
|
|
ctor->saveInOurTorrentsDir = saveInOurTorrentsDir;
|
2007-12-22 17:30:31 +00:00
|
|
|
}
|
|
|
|
|
2015-05-31 22:13:31 +00:00
|
|
|
bool
|
2012-12-05 17:29:46 +00:00
|
|
|
tr_ctorGetSave (const tr_ctor * ctor)
|
2007-12-22 17:30:31 +00:00
|
|
|
{
|
|
|
|
return ctor && ctor->saveInOurTorrentsDir;
|
|
|
|
}
|
|
|
|
|
2007-12-21 16:51:42 +00:00
|
|
|
void
|
2012-12-05 17:29:46 +00:00
|
|
|
tr_ctorSetPaused (tr_ctor * ctor,
|
2008-09-23 19:11:04 +00:00
|
|
|
tr_ctorMode mode,
|
2012-12-05 17:29:46 +00:00
|
|
|
bool isPaused)
|
2007-12-21 16:51:42 +00:00
|
|
|
{
|
2013-08-24 18:08:38 +00:00
|
|
|
struct optional_args * args;
|
2008-09-23 19:11:04 +00:00
|
|
|
|
2013-08-24 18:08:38 +00:00
|
|
|
assert (ctor != NULL);
|
|
|
|
assert ((mode == TR_FALLBACK) || (mode == TR_FORCE));
|
|
|
|
assert (tr_isBool (isPaused));
|
|
|
|
|
|
|
|
args = &ctor->optionalArgs[mode];
|
|
|
|
args->isSet_paused = true;
|
|
|
|
args->isPaused = isPaused;
|
2007-12-21 16:51:42 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
void
|
2012-12-05 17:29:46 +00:00
|
|
|
tr_ctorSetPeerLimit (tr_ctor * ctor,
|
2008-09-23 19:11:04 +00:00
|
|
|
tr_ctorMode mode,
|
2012-12-05 17:29:46 +00:00
|
|
|
uint16_t peerLimit)
|
2007-12-21 16:51:42 +00:00
|
|
|
{
|
2013-08-24 18:08:38 +00:00
|
|
|
struct optional_args * args;
|
|
|
|
|
|
|
|
assert (ctor != NULL);
|
|
|
|
assert ((mode == TR_FALLBACK) || (mode == TR_FORCE));
|
2008-09-23 19:11:04 +00:00
|
|
|
|
2013-08-24 18:08:38 +00:00
|
|
|
args = &ctor->optionalArgs[mode];
|
|
|
|
args->isSet_connected = true;
|
2008-05-12 16:33:17 +00:00
|
|
|
args->peerLimit = peerLimit;
|
2007-12-21 16:51:42 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
void
|
2012-12-05 17:29:46 +00:00
|
|
|
tr_ctorSetDownloadDir (tr_ctor * ctor,
|
2008-09-23 19:11:04 +00:00
|
|
|
tr_ctorMode mode,
|
2012-12-05 17:29:46 +00:00
|
|
|
const char * directory)
|
2007-12-21 16:51:42 +00:00
|
|
|
{
|
2013-08-24 18:08:38 +00:00
|
|
|
struct optional_args * args;
|
2008-09-23 19:11:04 +00:00
|
|
|
|
2013-08-24 18:08:38 +00:00
|
|
|
assert (ctor != NULL);
|
|
|
|
assert ((mode == TR_FALLBACK) || (mode == TR_FORCE));
|
|
|
|
|
|
|
|
args = &ctor->optionalArgs[mode];
|
2012-12-05 17:29:46 +00:00
|
|
|
tr_free (args->downloadDir);
|
2008-10-14 17:57:44 +00:00
|
|
|
args->downloadDir = NULL;
|
2013-08-24 18:08:38 +00:00
|
|
|
args->isSet_downloadDir = false;
|
2008-10-14 03:54:57 +00:00
|
|
|
|
2012-12-05 17:29:46 +00:00
|
|
|
if (directory && *directory)
|
2008-09-23 19:11:04 +00:00
|
|
|
{
|
2013-08-24 18:08:38 +00:00
|
|
|
args->isSet_downloadDir = true;
|
2012-12-05 17:29:46 +00:00
|
|
|
args->downloadDir = tr_strdup (directory);
|
2008-06-11 23:40:27 +00:00
|
|
|
}
|
2007-12-21 16:51:42 +00:00
|
|
|
}
|
|
|
|
|
2009-10-21 05:03:10 +00:00
|
|
|
void
|
2012-12-05 17:29:46 +00:00
|
|
|
tr_ctorSetIncompleteDir (tr_ctor * ctor, const char * directory)
|
2009-10-21 05:03:10 +00:00
|
|
|
{
|
2012-12-05 17:29:46 +00:00
|
|
|
tr_free (ctor->incompleteDir);
|
|
|
|
ctor->incompleteDir = tr_strdup (directory);
|
2009-10-21 05:03:10 +00:00
|
|
|
}
|
|
|
|
|
2015-05-31 22:13:31 +00:00
|
|
|
bool
|
2012-12-05 17:29:46 +00:00
|
|
|
tr_ctorGetPeerLimit (const tr_ctor * ctor,
|
2008-09-23 19:11:04 +00:00
|
|
|
tr_ctorMode mode,
|
2012-12-05 17:29:46 +00:00
|
|
|
uint16_t * setmeCount)
|
2007-12-21 16:51:42 +00:00
|
|
|
{
|
2015-05-31 22:13:31 +00:00
|
|
|
bool ret = true;
|
2007-12-21 16:51:42 +00:00
|
|
|
const struct optional_args * args = &ctor->optionalArgs[mode];
|
2007-12-21 22:18:40 +00:00
|
|
|
|
2012-12-05 17:29:46 +00:00
|
|
|
if (!args->isSet_connected)
|
2015-05-31 22:13:31 +00:00
|
|
|
ret = false;
|
2012-12-05 17:29:46 +00:00
|
|
|
else if (setmeCount)
|
2008-05-12 16:33:17 +00:00
|
|
|
*setmeCount = args->peerLimit;
|
2007-12-21 22:18:40 +00:00
|
|
|
|
2015-05-31 22:13:31 +00:00
|
|
|
return ret;
|
2007-12-21 16:51:42 +00:00
|
|
|
}
|
|
|
|
|
2015-05-31 22:13:31 +00:00
|
|
|
bool
|
2012-12-05 17:29:46 +00:00
|
|
|
tr_ctorGetPaused (const tr_ctor * ctor, tr_ctorMode mode, bool * setmeIsPaused)
|
2007-12-21 16:51:42 +00:00
|
|
|
{
|
2015-05-31 22:13:31 +00:00
|
|
|
bool ret = true;
|
2007-12-21 16:51:42 +00:00
|
|
|
const struct optional_args * args = &ctor->optionalArgs[mode];
|
2007-12-21 22:18:40 +00:00
|
|
|
|
2012-12-05 17:29:46 +00:00
|
|
|
if (!args->isSet_paused)
|
2015-05-31 22:13:31 +00:00
|
|
|
ret = false;
|
2012-12-05 17:29:46 +00:00
|
|
|
else if (setmeIsPaused)
|
2013-08-24 18:08:38 +00:00
|
|
|
*setmeIsPaused = args->isPaused;
|
2007-12-21 22:18:40 +00:00
|
|
|
|
2015-05-31 22:13:31 +00:00
|
|
|
return ret;
|
2007-12-21 16:51:42 +00:00
|
|
|
}
|
|
|
|
|
2015-05-31 22:13:31 +00:00
|
|
|
bool
|
2012-12-05 17:29:46 +00:00
|
|
|
tr_ctorGetDownloadDir (const tr_ctor * ctor,
|
2008-09-23 19:11:04 +00:00
|
|
|
tr_ctorMode mode,
|
2012-12-05 17:29:46 +00:00
|
|
|
const char ** setmeDownloadDir)
|
2007-12-21 16:51:42 +00:00
|
|
|
{
|
2015-05-31 22:13:31 +00:00
|
|
|
bool ret = true;
|
2007-12-21 16:51:42 +00:00
|
|
|
const struct optional_args * args = &ctor->optionalArgs[mode];
|
2007-12-21 22:18:40 +00:00
|
|
|
|
2012-12-05 17:29:46 +00:00
|
|
|
if (!args->isSet_downloadDir)
|
2015-05-31 22:13:31 +00:00
|
|
|
ret = false;
|
2012-12-05 17:29:46 +00:00
|
|
|
else if (setmeDownloadDir)
|
2008-05-18 16:44:30 +00:00
|
|
|
*setmeDownloadDir = args->downloadDir;
|
2007-12-21 22:18:40 +00:00
|
|
|
|
2015-05-31 22:13:31 +00:00
|
|
|
return ret;
|
2007-12-21 16:51:42 +00:00
|
|
|
}
|
|
|
|
|
2015-05-31 22:13:31 +00:00
|
|
|
bool
|
2012-12-05 17:29:46 +00:00
|
|
|
tr_ctorGetIncompleteDir (const tr_ctor * ctor,
|
|
|
|
const char ** setmeIncompleteDir)
|
2009-10-21 05:03:10 +00:00
|
|
|
{
|
2015-05-31 22:13:31 +00:00
|
|
|
bool ret = true;
|
2009-10-21 05:03:10 +00:00
|
|
|
|
2012-12-05 17:29:46 +00:00
|
|
|
if (ctor->incompleteDir == NULL)
|
2015-05-31 22:13:31 +00:00
|
|
|
ret = false;
|
2009-10-21 05:03:10 +00:00
|
|
|
else
|
|
|
|
*setmeIncompleteDir = ctor->incompleteDir;
|
|
|
|
|
2015-05-31 22:13:31 +00:00
|
|
|
return ret;
|
2009-10-21 05:03:10 +00:00
|
|
|
}
|
|
|
|
|
2015-05-31 22:13:31 +00:00
|
|
|
bool
|
2012-12-05 17:29:46 +00:00
|
|
|
tr_ctorGetMetainfo (const tr_ctor * ctor,
|
2012-12-14 04:34:42 +00:00
|
|
|
const tr_variant ** setme)
|
2007-12-21 16:51:42 +00:00
|
|
|
{
|
2015-05-31 22:13:31 +00:00
|
|
|
bool ret = true;
|
2007-12-21 22:18:40 +00:00
|
|
|
|
2012-12-05 17:29:46 +00:00
|
|
|
if (!ctor->isSet_metainfo)
|
2015-05-31 22:13:31 +00:00
|
|
|
ret = false;
|
2012-12-05 17:29:46 +00:00
|
|
|
else if (setme)
|
2008-02-13 02:24:12 +00:00
|
|
|
*setme = &ctor->metainfo;
|
2007-12-21 22:18:40 +00:00
|
|
|
|
2015-05-31 22:13:31 +00:00
|
|
|
return ret;
|
2007-12-21 22:18:40 +00:00
|
|
|
}
|
|
|
|
|
2009-04-02 17:30:29 +00:00
|
|
|
tr_session*
|
2012-12-05 17:29:46 +00:00
|
|
|
tr_ctorGetSession (const tr_ctor * ctor)
|
2009-04-02 17:30:29 +00:00
|
|
|
{
|
|
|
|
return (tr_session*) ctor->session;
|
|
|
|
}
|
|
|
|
|
2007-12-21 22:18:40 +00:00
|
|
|
/***
|
|
|
|
****
|
|
|
|
***/
|
|
|
|
|
2011-03-22 15:19:54 +00:00
|
|
|
static bool
|
2012-12-05 17:29:46 +00:00
|
|
|
isPriority (int i)
|
2010-02-02 07:48:03 +00:00
|
|
|
{
|
|
|
|
return (i==TR_PRI_LOW) || (i==TR_PRI_NORMAL) || (i==TR_PRI_HIGH);
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
2012-12-05 17:29:46 +00:00
|
|
|
tr_ctorSetBandwidthPriority (tr_ctor * ctor, tr_priority_t priority)
|
2010-02-02 07:48:03 +00:00
|
|
|
{
|
2012-12-05 17:29:46 +00:00
|
|
|
if (isPriority (priority))
|
2010-02-02 07:48:03 +00:00
|
|
|
ctor->bandwidthPriority = priority;
|
|
|
|
}
|
|
|
|
|
|
|
|
tr_priority_t
|
2012-12-05 17:29:46 +00:00
|
|
|
tr_ctorGetBandwidthPriority (const tr_ctor * ctor)
|
2010-02-02 07:48:03 +00:00
|
|
|
{
|
|
|
|
return ctor->bandwidthPriority;
|
|
|
|
}
|
|
|
|
|
|
|
|
/***
|
|
|
|
****
|
|
|
|
***/
|
|
|
|
|
2007-12-21 22:18:40 +00:00
|
|
|
tr_ctor*
|
2012-12-05 17:29:46 +00:00
|
|
|
tr_ctorNew (const tr_session * session)
|
2007-12-21 22:18:40 +00:00
|
|
|
{
|
2012-12-05 17:29:46 +00:00
|
|
|
tr_ctor * ctor = tr_new0 (struct tr_ctor, 1);
|
2008-09-23 19:11:04 +00:00
|
|
|
|
2008-12-13 23:17:36 +00:00
|
|
|
ctor->session = session;
|
2010-02-02 07:48:03 +00:00
|
|
|
ctor->bandwidthPriority = TR_PRI_NORMAL;
|
2012-12-05 17:29:46 +00:00
|
|
|
if (session != NULL)
|
2010-04-23 14:13:18 +00:00
|
|
|
{
|
2012-12-05 17:29:46 +00:00
|
|
|
tr_ctorSetDeleteSource (ctor, tr_sessionGetDeleteSource (session));
|
|
|
|
tr_ctorSetPaused (ctor, TR_FALLBACK, tr_sessionGetPaused (session));
|
|
|
|
tr_ctorSetPeerLimit (ctor, TR_FALLBACK, session->peerLimitPerTorrent);
|
2013-02-09 04:05:03 +00:00
|
|
|
tr_ctorSetDownloadDir (ctor, TR_FALLBACK, tr_sessionGetDownloadDir(session));
|
2009-04-02 17:30:29 +00:00
|
|
|
}
|
2012-12-05 17:29:46 +00:00
|
|
|
tr_ctorSetSave (ctor, true);
|
2007-12-21 22:18:40 +00:00
|
|
|
return ctor;
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
2012-12-05 17:29:46 +00:00
|
|
|
tr_ctorFree (tr_ctor * ctor)
|
|
|
|
{
|
|
|
|
clearMetainfo (ctor);
|
|
|
|
tr_free (ctor->optionalArgs[1].downloadDir);
|
|
|
|
tr_free (ctor->optionalArgs[0].downloadDir);
|
|
|
|
tr_free (ctor->incompleteDir);
|
|
|
|
tr_free (ctor->want);
|
|
|
|
tr_free (ctor->notWant);
|
|
|
|
tr_free (ctor->low);
|
|
|
|
tr_free (ctor->high);
|
|
|
|
tr_free (ctor->normal);
|
|
|
|
tr_free (ctor);
|
2007-12-21 16:51:42 +00:00
|
|
|
}
|