summaryrefslogtreecommitdiffstats
path: root/src/modules/torrent/libkvitorrent.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/modules/torrent/libkvitorrent.cpp')
-rw-r--r--src/modules/torrent/libkvitorrent.cpp904
1 files changed, 904 insertions, 0 deletions
diff --git a/src/modules/torrent/libkvitorrent.cpp b/src/modules/torrent/libkvitorrent.cpp
new file mode 100644
index 00000000..9a929483
--- /dev/null
+++ b/src/modules/torrent/libkvitorrent.cpp
@@ -0,0 +1,904 @@
+//=============================================================================
+//
+// File : libkvitorrent.cpp
+// Creation date : Fri Jan 1 15:42:25 2007 GMT by Alexander Stillich
+//
+// This file is part of the KVirc irc client distribution
+// Copyright (C) 2001-2005 Szymon Stefanek (pragma at kvirc dot net)
+//
+// This program is FREE software. You can redistribute it and/or
+// modify it under the terms of the GNU General Public License
+// as published by the Free Software Foundation; either version 2
+// of the License, or (at your opinion) any later version.
+//
+// This program is distributed in the HOPE that it will be USEFUL,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+// See the GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with this program. If not, write to the Free Software Foundation,
+// Inc. ,51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+//
+//=============================================================================
+
+#include "kvi_module.h"
+#include "kvi_options.h"
+#include "kvi_frame.h"
+
+#include "tc_interface.h"
+#include "tc_ktorrentdcopinterface.h"
+#include "tc_statusbarapplet.h"
+
+#include "kvi_locale.h"
+#include "kvi_out.h"
+
+
+static KviPointerList<KviTorrentInterfaceDescriptor> * g_pDescriptorList = 0;
+
+static KviTorrentInterface *auto_detect_torrent_client(KviWindow * pOut = 0)
+{
+ int iBest = 0;
+ KviTorrentInterface * pBest = 0;
+ KviTorrentInterfaceDescriptor * d;
+ KviTorrentInterfaceDescriptor * pDBest = 0;
+
+ for (d=g_pDescriptorList->first(); d!=0; d=g_pDescriptorList->next())
+ {
+ // instance gets deleted by descriptor later
+ KviTorrentInterface *i = d->instance();
+ if (i)
+ {
+ int iScore = i->detect();
+ if(iScore > iBest)
+ {
+ iBest = iScore;
+ pBest = i;
+ pDBest = d;
+ }
+
+ if(pOut)
+ {
+ pOut->output(KVI_OUT_TORRENT,
+ __tr2qs_ctx("Trying torrent client interface \"%Q\": score %d", "torrent"),
+ &d->name(),
+ iScore);
+ }
+ }
+ }
+
+/* if(iBest < 90)
+ {
+ if(pOut)
+ pOut->outputNoFmt(KVI_OUT_MULTIMEDIA,__tr2qs_ctx("Not sure about the results, trying a second, more agressive detection pass","mediaplayer"));
+ // no sure player found... try again with a destructive test
+ for(d = g_pDescriptorList->first();d;d = g_pDescriptorList->next())
+ {
+ KviMediaPlayerInterface * i = d->instance();
+ if(i)
+ {
+ int iScore = i->detect(true);
+ if(iScore > iBest)
+ {
+ iBest = iScore;
+ pBest = i;
+ pDBest = d;
+ }
+ if(pOut)
+ {
+ QString szOut;
+ QString szNam = d->name();
+ KviQString::sprintf(szOut,__tr2qs_ctx("Trying media player interface \"%Q\": score %d","mediaplayer"),&(szNam),iScore);
+ pOut->output(KVI_OUT_MULTIMEDIA,szOut);
+ }
+ }
+ }
+ }
+*/
+ if(pDBest)
+ {
+ KVI_OPTION_STRING(KviOption_stringPreferredTorrentClient) = pDBest->name();
+ if(pOut)
+ pOut->output(KVI_OUT_TORRENT,
+ __tr2qs_ctx("Choosing torrent client interface \"%Q\"", "torrent"),
+ &pDBest->name());
+
+ } else
+ {
+ if(pOut)
+ pOut->outputNoFmt(KVI_OUT_TORRENT,
+ __tr2qs_ctx("Seems that there is no usable torrent client on this machine", "torrent"));
+ }
+
+ return pBest;
+}
+
+#define TC_KVS_FAIL_ON_NO_INTERFACE \
+ if (!KviTorrentInterface::selected()) \
+ { \
+ c->warning(__tr2qs_ctx("No torrent client interface selected. Try /torrent.detect", "torrent")); \
+ return true; \
+ }
+
+#define TC_KVS_COMMAND(__name) static bool torrent_kvs_cmd_ ## __name (KviKvsModuleCommandCall * c)
+#define TC_KVS_FUNCTION(__name) static bool torrent_kvs_fnc_ ## __name (KviKvsModuleFunctionCall * c)
+
+#define TC_KVS_COMMAND_ERROR \
+ if (!c->hasSwitch('q',"quiet")) \
+ { \
+ c->warning(__tr2qs_ctx("The selected torrent client interface failed to execute the requested function", "torrent")); \
+ QString tmp = __tr2qs_ctx("Last interface error: ", "torrent"); \
+ tmp += KviTorrentInterface::selected()->lastError(); \
+ c->warning(tmp); \
+ } \
+
+#define TC_KVS_SIMPLE_COMMAND(__name, __ifacecommand) \
+ TC_KVS_COMMAND(__name) \
+ { \
+ KVSM_PARAMETERS_BEGIN(c) \
+ KVSM_PARAMETERS_END(c) \
+ \
+ TC_KVS_FAIL_ON_NO_INTERFACE \
+ \
+ if (!KviTorrentInterface::selected()->__ifacecommand()) \
+ { \
+ TC_KVS_COMMAND_ERROR \
+ } \
+ return true; \
+ }
+
+#define TC_KVS_INT_COMMAND(__name, __ifacecommand, __argname) \
+ TC_KVS_COMMAND(__name) \
+ { \
+ kvs_int_t arg; \
+ KVSM_PARAMETERS_BEGIN(c) \
+ KVSM_PARAMETER(__argname, KVS_PT_INT, 0, arg) \
+ KVSM_PARAMETERS_END(c) \
+ \
+ TC_KVS_FAIL_ON_NO_INTERFACE \
+ \
+ if (!KviTorrentInterface::selected()->__ifacecommand(arg)) \
+ { \
+ TC_KVS_COMMAND_ERROR \
+ } \
+ return true; \
+ }
+
+#define TC_KVS_INT_INT_STRING_COMMAND(__name, __ifacecommand, __argname1, __argname2, __argname3) \
+ TC_KVS_COMMAND(__name) \
+ { \
+ kvs_int_t arg1; \
+ kvs_int_t arg2; \
+ QString arg3; \
+ KVSM_PARAMETERS_BEGIN(c) \
+ KVSM_PARAMETER(__argname1, KVS_PT_INT, 0, arg1) \
+ KVSM_PARAMETER(__argname2, KVS_PT_INT, 0, arg2) \
+ KVSM_PARAMETER(__argname3, KVS_PT_STRING, 0, arg3) \
+ KVSM_PARAMETERS_END(c) \
+ \
+ TC_KVS_FAIL_ON_NO_INTERFACE \
+ \
+ if (!KviTorrentInterface::selected()->__ifacecommand(arg1, arg2, arg3)) \
+ { \
+ TC_KVS_COMMAND_ERROR \
+ } \
+ return true; \
+ }
+
+// TODO: error handling for functions
+
+#define TC_KVS_STRINGRET_FUNCTION(__name, __ifacecommand) \
+ TC_KVS_FUNCTION(__name) \
+ { \
+ TC_KVS_FAIL_ON_NO_INTERFACE \
+ QString szRet = KviTorrentInterface::selected()->__ifacecommand(); \
+ c->returnValue()->setString(szRet); \
+ return true; \
+ }
+
+#define TC_KVS_INTRET_FUNCTION(__name, __ifacecommand) \
+ TC_KVS_FUNCTION(__name) \
+ { \
+ TC_KVS_FAIL_ON_NO_INTERFACE \
+ kvs_int_t ret = KviTorrentInterface::selected()->__ifacecommand(); \
+ c->returnValue()->setInteger(ret); \
+ return true; \
+ }
+
+#define TC_KVS_FLOATRET_FUNCTION(__name, __ifacecommand) \
+ TC_KVS_FUNCTION(__name) \
+ { \
+ TC_KVS_FAIL_ON_NO_INTERFACE \
+ kvs_real_t ret = KviTorrentInterface::selected()->__ifacecommand(); \
+ c->returnValue()->setReal(ret); \
+ return true; \
+ }
+
+#define TC_KVS_INTRET_INT_FUNCTION(__name, __ifacecommand, __argname) \
+ TC_KVS_FUNCTION(__name) \
+ { \
+ kvs_int_t arg; \
+ KVSM_PARAMETERS_BEGIN(c) \
+ KVSM_PARAMETER(__argname, KVS_PT_INT, 0, arg) \
+ KVSM_PARAMETERS_END(c) \
+ TC_KVS_FAIL_ON_NO_INTERFACE \
+ kvs_int_t ret = KviTorrentInterface::selected()->__ifacecommand(arg); \
+ c->returnValue()->setInteger(ret); \
+ return true; \
+ }
+
+#define TC_KVS_STRINGRET_INT_FUNCTION(__name, __ifacecommand, __argname) \
+ TC_KVS_FUNCTION(__name) \
+ { \
+ kvs_int_t arg; \
+ KVSM_PARAMETERS_BEGIN(c) \
+ KVSM_PARAMETER(__argname, KVS_PT_INT, 0, arg) \
+ KVSM_PARAMETERS_END(c) \
+ TC_KVS_FAIL_ON_NO_INTERFACE \
+ QString szRet = KviTorrentInterface::selected()->__ifacecommand(arg); \
+ c->returnValue()->setString(szRet); \
+ return true; \
+ }
+
+#define TC_KVS_STRINGRET_INT_INT_FUNCTION(__name, __ifacecommand, __argname1, __argname2) \
+ TC_KVS_FUNCTION(__name) \
+ { \
+ kvs_int_t arg1; \
+ kvs_int_t arg2; \
+ KVSM_PARAMETERS_BEGIN(c) \
+ KVSM_PARAMETER(__argname1, KVS_PT_INT, 0, arg1) \
+ KVSM_PARAMETER(__argname2, KVS_PT_INT, 0, arg2) \
+ KVSM_PARAMETERS_END(c) \
+ TC_KVS_FAIL_ON_NO_INTERFACE \
+ QString szRet = KviTorrentInterface::selected()->__ifacecommand(arg1, arg2); \
+ c->returnValue()->setString(szRet); \
+ return true; \
+ }
+
+#define TC_KVS_INTRET_INT_INT_FUNCTION(__name, __ifacecommand, __argname1, __argname2) \
+ TC_KVS_FUNCTION(__name) \
+ { \
+ kvs_int_t arg1; \
+ kvs_int_t arg2; \
+ KVSM_PARAMETERS_BEGIN(c) \
+ KVSM_PARAMETER(__argname1, KVS_PT_INT, 0, arg1) \
+ KVSM_PARAMETER(__argname2, KVS_PT_INT, 0, arg2) \
+ KVSM_PARAMETERS_END(c) \
+ TC_KVS_FAIL_ON_NO_INTERFACE \
+ kvs_int_t ret = KviTorrentInterface::selected()->__ifacecommand(arg1, arg2); \
+ c->returnValue()->setInteger(ret); \
+ return true; \
+ }
+
+TC_KVS_COMMAND(detect)
+{
+ KviTorrentInterface::select(auto_detect_torrent_client(c->hasSwitch('q',"quiet") ? 0 : c->window()));
+ return true;
+}
+
+/*
+ @doc: torrent.maxUploadSpeed
+ @type:
+ function
+ @title:
+ $torrent.maxUploadSpeed
+ @short:
+ Returns maximum upload speed set in client.
+ @syntax:
+ $torrent.maxUploadSpeed()
+ @description:
+ Returns maximum upload speed set in client.
+ Take a look at the [module:torrent]torrent client documentation[/module]
+ for more details about how it works.[br]
+ @seealso:
+ [module:torrent]torrent client documentation[/module],
+*/
+TC_KVS_INTRET_FUNCTION(maxUploadSpeed, maxUploadSpeed)
+
+
+/*
+ @doc: torrent.maxDownloadSpeed
+ @type:
+ function
+ @title:
+ $torrent.maxDownloadSpeed
+ @short:
+ Returns maximum download speed set in client.
+ @syntax:
+ $torrent.maxDownloadSpeed()
+ @description:
+ Returns maximum download speed set in client.
+ Take a look at the [module:torrent]torrent client documentation[/module]
+ for more details about how it works.[br]
+ @seealso:
+ [module:torrent]torrent client documentation[/module],
+*/
+TC_KVS_INTRET_FUNCTION(maxDownloadSpeed, maxDownloadSpeed)
+
+/*
+ @doc: torrent.setMaxUploadSpeed
+ @type:
+ command
+ @title:
+ torrent.setMaxUploadSpeed
+ @short:
+ Sets maximum upload speed
+ @syntax:
+ torrent.setMaxUploadSpeed <kbytes_per_sec>
+ @description:
+ Sets maximum upload speed
+ Take a look at the [module:torrent]torrent client documentation[/module]
+ for more details about how it works.[br]
+ @seealso:
+ [module:torrent]torrent client documentation[/module],
+*/
+TC_KVS_INT_COMMAND(setMaxUploadSpeed, setMaxUploadSpeed, "kbytes_per_sec")
+
+/*
+ @doc: torrent.setMaxDownloadSpeed
+ @type:
+ command
+ @title:
+ torrent.setMaxDownloadSpeed
+ @short:
+ Sets maximum download speed
+ @syntax:
+ torrent.setMaxDownloadSpeed <kbytes_per_sec>
+ @description:
+ Sets maximum download speed
+ Take a look at the [module:torrent]torrent client documentation[/module]
+ for more details about how it works.[br]
+ @seealso:
+ [module:torrent]torrent client documentation[/module],
+*/
+TC_KVS_INT_COMMAND(setMaxDownloadSpeed, setMaxDownloadSpeed, "kbytes_per_sec")
+
+/*
+ @doc: torrent.speedUp
+ @type:
+ function
+ @title:
+ $torrent.speedUp
+ @short:
+ Returns current total upload speed
+ @syntax:
+ $torrent.speedUp()
+ @description:
+ Returns current total upload speed
+ Take a look at the [module:torrent]torrent client documentation[/module]
+ for more details about how it works.[br]
+ @seealso:
+ [module:torrent]torrent client documentation[/module],
+*/
+TC_KVS_FLOATRET_FUNCTION(speedUp, speedUp)
+
+/*
+ @doc: torrent.speedDown
+ @type:
+ function
+ @title:
+ $torrent.speedDown
+ @short:
+ Returns current total download speed
+ @syntax:
+ $torrent.speedDown()
+ @description:
+ Returns current total download speed
+ Take a look at the [module:torrent]torrent client documentation[/module]
+ for more details about how it works.[br]
+ @seealso:
+ [module:torrent]torrent client documentation[/module],
+*/
+TC_KVS_FLOATRET_FUNCTION(speedDown, speedDown)
+
+/*
+ @doc: torrent.trafficUp
+ @type:
+ function
+ @title:
+ $torrent.trafficUp
+ @short:
+ Returns the total number of bytes uploaded
+ @syntax:
+ $torrent.trafficUp()
+ @description:
+ Returns the total number of bytes uploaded
+ Take a look at the [module:torrent]torrent client documentation[/module]
+ for more details about how it works.[br]
+ @seealso:
+ [module:torrent]torrent client documentation[/module],
+*/
+TC_KVS_FLOATRET_FUNCTION(trafficUp, trafficUp)
+
+/*
+ @doc: torrent.trafficDown
+ @type:
+ function
+ @title:
+ $torrent.trafficDown
+ @short:
+ Returns the total number of bytes download
+ @syntax:
+ $torrent.trafficDown()
+ @description:
+ Returns the total number of bytes download
+ Take a look at the [module:torrent]torrent client documentation[/module]
+ for more details about how it works.[br]
+ @seealso:
+ [module:torrent]torrent client documentation[/module],
+*/
+TC_KVS_FLOATRET_FUNCTION(trafficDown, trafficDown)
+
+/*
+ @doc: torrent.count
+ @type:
+ function
+ @title:
+ $torrent.count
+ @short:
+ Returns number of torrents in client
+ @syntax:
+ $torrent.name()
+ @description:
+ Returns number of torrents in client
+ Take a look at the [module:torrent]torrent client documentation[/module]
+ for more details about how it works.[br]
+ @seealso:
+ [module:torrent]torrent client documentation[/module],
+*/
+TC_KVS_INTRET_FUNCTION(count, count)
+
+/*
+ @doc: torrent.name
+ @type:
+ function
+ @title:
+ $torrent.name
+ @short:
+ Returns torrent name as displayed in client
+ @syntax:
+ $torrent.name(torrent_number)
+ @description:
+ Returns torrent name as displayed in client
+ Take a look at the [module:torrent]torrent client documentation[/module]
+ for more details about how it works.[br]
+ @seealso:
+ [module:torrent]torrent client documentation[/module],
+*/
+TC_KVS_STRINGRET_INT_FUNCTION(name, name, "torrent_number")
+
+/*
+ @doc: torrent.start
+ @type:
+ command
+ @title:
+ torrent.start
+ @short:
+ Starts downloading of torrent <torrent_number>
+ @syntax:
+ torrent.start <torrent_number>
+ @description:
+ Starts downloading of torrent <torrent_number>
+ Take a look at the [module:torrent]torrent client documentation[/module]
+ for more details about how it works.[br]
+ @seealso:
+ [module:torrent]torrent client documentation[/module],
+ [cmd]torrent.stop[/cmd], [cmd]torrent.stopAll[/cmd],
+ [cmd]torrent.startAll[/cmd]
+*/
+TC_KVS_INT_COMMAND(start, start, "torrent_number")
+
+/*
+ @doc: torrent.stop
+ @type:
+ command
+ @title:
+ torrent.stop
+ @short:
+ Stops downloading of torrent <torrent_number>
+ @syntax:
+ torrent.stop <torrent_number>
+ @description:
+ Stops downloading of torrent <torrent_number>
+ Take a look at the [module:torrent]torrent client documentation[/module]
+ for more details about how it works.[br]
+ @seealso:
+ [module:torrent]torrent client documentation[/module],
+ [cmd]torrent.stopAll[/cmd], [cmd]torrent.startAll[/cmd],
+ [cmd]torrent.start[/cmd]
+*/
+TC_KVS_INT_COMMAND(stop, stop, "torrent_number")
+
+/*
+ @doc: torrent.announce
+ @type:
+ command
+ @title:
+ torrent.announce
+ @short:
+ Manually announces torrent to tracker
+ @syntax:
+ torrent.announce <torrent_number>
+ @description:
+ Manually announces torrent to tracker
+ Take a look at the [module:torrent]torrent client documentation[/module]
+ for more details about how it works.[br]
+ @seealso:
+ [module:torrent]torrent client documentation[/module],
+*/
+TC_KVS_INT_COMMAND(announce, announce, "torrent_number")
+
+/*
+ @doc: torrent.fileCount
+ @type:
+ function
+ @title:
+ $torrent.fileCount
+ @short:
+ Returns the number of files in a torrent.
+ @syntax:
+ $torrent.fileCount <torrent_number>
+ @description:
+ Returns the number of files in a torrent.
+ Take a look at the [module:torrent]torrent client documentation[/module]
+ for more details about how it works.[br]
+ @seealso:
+ [module:torrent]torrent client documentation[/module],
+*/
+TC_KVS_INTRET_INT_FUNCTION(fileCount, fileCount, "torrent_number")
+
+/*
+ @doc: torrent.fileName
+ @type:
+ function
+ @title:
+ $torrent.fileName
+ @short:
+ Returns the name of a file in a torrent.
+ @syntax:
+ $torrent.fileName <torrent_number> <file_number>
+ @description:
+ Returns the name of a file in a torrent.
+ Take a look at the [module:torrent]torrent client documentation[/module]
+ for more details about how it works.[br]
+ @seealso:
+ [module:torrent]torrent client documentation[/module],
+*/
+TC_KVS_STRINGRET_INT_INT_FUNCTION(fileName, fileName, "torrent_number", "file_number")
+
+/*
+ @doc: torrent.filePriority
+ @type:
+ function
+ @title:
+ $torrent.filePriority
+ @short:
+ Returns the priority of a file in a torrent.
+ @syntax:
+ $torrent.filePriority <torrent_number> <file_number>
+ @description:
+ Returns the priority of a file in a torrent.
+ Take a look at the [module:torrent]torrent client documentation[/module]
+ for more details about how it works.[br]
+ @seealso:
+ [module:torrent]torrent client documentation[/module],
+*/
+TC_KVS_STRINGRET_INT_INT_FUNCTION(filePriority, filePriority, "torrent_number", "file_number")
+
+/*
+ @doc: torrent.setFilePriority
+ @type:
+ command
+ @title:
+ torrent.setFilePriority
+ @short:
+ Sets the priority of a file in a torrent.
+ @syntax:
+ torrent.setFilePriority <torrent_number> <file_number>
+ @description:
+ Sets the priority of a file in a torrent.
+ Take a look at the [module:torrent]torrent client documentation[/module]
+ for more details about how it works.[br]
+ @seealso:
+ [module:torrent]torrent client documentation[/module],
+*/
+TC_KVS_INT_INT_STRING_COMMAND(setFilePriority, setFilePriority, "torrent_number", "file_number", "priority")
+
+/*
+ @doc: torrent.startAll
+ @type:
+ command
+ @title:
+ torrent.startAll
+ @short:
+ Starts downloading of all torrents
+ @syntax:
+ torrent.startAll
+ @description:
+ Starts downloading of all torrents
+ Take a look at the [module:torrent]torrent client documentation[/module]
+ for more details about how it works.[br]
+ @seealso:
+ [module:torrent]torrent client documentation[/module],
+ [cmd]torrent.stopAll[/cmd], [cmd]torrent.start[/cmd],
+ [cmd]torrent.stop[/cmd]
+*/
+
+TC_KVS_SIMPLE_COMMAND(startAll, startAll)
+
+/*
+ @doc: torrent.stopAll
+ @type:
+ command
+ @title:
+ torrent.stopAll
+ @short:
+ Stops downloading of all torrents
+ @syntax:
+ torrent.stopAll
+ @description:
+ Stops downloading of all torrents
+ Take a look at the [module:torrent]torrent client documentation[/module]
+ for more details about how it works.[br]
+ @seealso:
+ [module:torrent]torrent client documentation[/module],
+ [cmd]torrent.startAll[/cmd], [cmd]torrent.start[/cmd],
+ [cmd]torrent.stop[/cmd]
+*/
+
+TC_KVS_SIMPLE_COMMAND(stopAll, stopAll)
+
+
+/*
+ @doc: torrent.list
+ @type:
+ function
+ @title:
+ torrent.list
+ @short:
+ Returns a list of all torrents
+ @syntax:
+ $torrent.list()
+ @description:
+ Returns a list of all torrents
+ Take a look at the [module:torrent]torrent client documentation[/module]
+ for more details about how it works.[br]
+ @seealso:
+ [module:torrent]torrent client documentation[/module],
+ [cmd]torrent.startAll[/cmd], [cmd]torrent.start[/cmd],
+ [cmd]torrent.stop[/cmd]
+*/
+
+//MP_KVS_SIMPLE_COMMAND(list,list)
+
+/*
+ @doc: torrent.setClient
+ @type:
+ command
+ @title:
+ torrent.setClient
+ @short:
+ Sets the torrent client interface
+ @syntax:
+ torrent.setClient <client_name>
+ @description:
+ Sets the torrent client interface to be used by the
+ torrent interface module. <interface_name> must be one
+ of the client names returned by [cmd]torrent.clientList[/cmd]
+ Take a look at the [module:torrent]torrent client documentation[/module]
+ for more details about how it works.[br]
+ @seealso:
+ [module:torrent]torrent client documentation[/module],
+ [cmd]torrent.detect[/cmd], [fnc]$torrent.client[/fnc]
+*/
+
+TC_KVS_COMMAND(setClient)
+{
+ QString client;
+
+ KVSM_PARAMETERS_BEGIN(c)
+ KVSM_PARAMETER("client", KVS_PT_STRING, 0, client)
+ KVSM_PARAMETERS_END(c)
+
+ for (KviTorrentInterfaceDescriptor *d = g_pDescriptorList->first(); d; d=g_pDescriptorList->next())
+ {
+ if (d->name() == client)
+ {
+ KviTorrentInterface::select(d->instance());
+ KVI_OPTION_STRING(KviOption_stringPreferredTorrentClient) = client;
+
+ if (!c->hasSwitch('q',"quiet"))
+ c->window()->output(KVI_OUT_TORRENT,
+ __tr2qs_ctx("Using client interface \"%Q\".", "torrent"),
+ &client);
+ return true;
+ }
+ }
+
+ if (!c->hasSwitch('q',"quiet"))
+ c->window()->output(KVI_OUT_TORRENT,
+ __tr2qs_ctx("Invalid client interface \"%Q\"!", "torrent"),
+ &client);
+
+ return false;
+}
+
+
+/*
+ @doc: torrent.client
+ @type:
+ function
+ @title:
+ $torrent.client
+ @short:
+ Returns the currently set torrent client interface
+ @syntax:
+ $torrent.client()
+ @description:
+ Returns the currently set torrent client interface.
+ Take a look at the [module:torrent]torrent client documentation[/module]
+ for more details about how it works.[br]
+ @seealso:
+ [module:torrent]torrent client documentation[/module],
+ [cmd]torrent.detect[/cmd], [cmd]torrent.setClient[/cmd]
+*/
+TC_KVS_FUNCTION(client)
+{
+ c->returnValue()->setString(KVI_OPTION_STRING(KviOption_stringPreferredTorrentClient));
+ return true;
+}
+
+/*
+ @doc: torrent.clientList
+ @type:
+ function
+ @title:
+ $torrent.clientList
+ @short:
+ Returns a list of all supported clients.
+ @syntax:
+ $torrent.clientList()
+ @description:
+ Returns a list of all supported clients.
+ Take a look at the [module:torrent]torrent client documentation[/module]
+ for more details about how it works.[br]
+ @seealso:
+ [module:torrent]torrent client documentation[/module],
+ [cmd]torrent.detect[/cmd], [cmd]torrent.setClient[/cmd],
+ [cmd]torrent.client[/cmd]
+*/
+TC_KVS_FUNCTION(clientList)
+{
+ KviKvsArray *pArray = new KviKvsArray();
+ int id=0;
+
+ for (KviTorrentInterfaceDescriptor *d=g_pDescriptorList->first(); d; d=g_pDescriptorList->next())
+ pArray->set(id++, new KviKvsVariant(d->name()));
+
+ c->returnValue()->setArray(pArray);
+ return true;
+}
+
+/*
+ @doc: torrent.state
+ @type:
+ function
+ @title:
+ $torrent.state
+ @short:
+ Returns state of torrent (Stopped, Stalled, Seeding, Downloading)
+ @syntax:
+ $torrent.state <torrent_number>
+ @description:
+ Returns state of torrent (Stopped, Stalled, Seeding, Downloading)
+ Take a look at the [module:torrent]torrent client documentation[/module]
+ for more details about how it works.[br]
+ @seealso:
+ [module:torrent]torrent client documentation[/module],
+*/
+TC_KVS_STRINGRET_INT_FUNCTION(state, state, "torrent_number")
+
+static bool torrent_module_init(KviModule *m)
+{
+ #define TC_KVS_REGCMD(__name,__stringname) KVSM_REGISTER_SIMPLE_COMMAND(m, __stringname, torrent_kvs_cmd_ ## __name)
+ #define TC_KVS_REGFNC(__name,__stringname) KVSM_REGISTER_FUNCTION(m, __stringname, torrent_kvs_fnc_ ## __name)
+
+ TC_KVS_REGCMD(detect, "detect");
+ TC_KVS_REGCMD(setClient, "setClient");
+ TC_KVS_REGCMD(start, "start")
+ TC_KVS_REGCMD(stop, "stop")
+ TC_KVS_REGCMD(announce, "announce")
+ TC_KVS_REGCMD(startAll, "startAll")
+ TC_KVS_REGCMD(stopAll, "stopAll")
+ TC_KVS_REGCMD(setMaxUploadSpeed, "setMaxUploadSpeed")
+ TC_KVS_REGCMD(setMaxDownloadSpeed, "setMaxDownloadSpeed")
+ TC_KVS_REGCMD(setFilePriority, "setFilePriority")
+ TC_KVS_REGFNC(client, "client")
+ TC_KVS_REGFNC(clientList, "clientList")
+ TC_KVS_REGFNC(maxUploadSpeed, "maxUploadSpeed")
+ TC_KVS_REGFNC(maxDownloadSpeed, "maxDownloadSpeed")
+ TC_KVS_REGFNC(speedUp, "speedUp")
+ TC_KVS_REGFNC(speedDown, "speedDown")
+ TC_KVS_REGFNC(trafficUp, "trafficUp")
+ TC_KVS_REGFNC(trafficDown, "trafficDown")
+ TC_KVS_REGFNC(count, "count")
+ TC_KVS_REGFNC(name, "name")
+ TC_KVS_REGFNC(state, "state")
+ TC_KVS_REGFNC(fileCount, "fileCount")
+ TC_KVS_REGFNC(fileName, "fileName")
+ TC_KVS_REGFNC(filePriority, "filePriority")
+
+ g_pDescriptorList = new KviPointerList<KviTorrentInterfaceDescriptor>;
+ g_pDescriptorList->setAutoDelete(true);
+
+#ifdef COMPILE_KDE_SUPPORT
+ g_pDescriptorList->append(new KviKTorrentDCOPInterfaceDescriptor);
+#endif // COMPILE_KDE_SUPPORT
+
+ KviTorrentInterface::select(0);
+
+ if (g_pFrame->mainStatusBar())
+ KviTorrentStatusBarApplet::selfRegister(g_pFrame->mainStatusBar());
+
+
+ if(KVI_OPTION_STRING(KviOption_stringPreferredMediaPlayer) == "auto")
+ {
+ KviTorrentInterface::select(auto_detect_torrent_client());
+
+ } else
+ {
+ for (KviTorrentInterfaceDescriptor *d=g_pDescriptorList->first(); d; d=g_pDescriptorList->next())
+ {
+ if (d->name() == KVI_OPTION_STRING(KviOption_stringPreferredTorrentClient))
+ KviTorrentInterface::select(d->instance());
+ }
+ }
+
+ return true;
+}
+
+static bool torrent_module_cleanup( KviModule * m )
+{
+ delete g_pDescriptorList;
+ return true;
+}
+
+static bool torrent_module_can_unload( KviModule * m )
+{
+ return true;
+}
+
+static bool torrent_module_ctrl(KviModule * m,const char * operation,void * param)
+{
+ debug("torrent module ctrl");
+/* if(kvi_strEqualCI(operation,"getAvailableMediaPlayers"))
+ {
+ // we expect param to be a pointer to QStringList
+ QStringList * l = (QStringList *)param;
+ for(KviMediaPlayerInterfaceDescriptor * d = g_pDescriptorList->first();d;d = g_pDescriptorList->next())
+ {
+ l->append(d->name());
+ }
+ return true;
+ }
+ if(kvi_strEqualCI(operation,"detectMediaPlayer"))
+ {
+ auto_detect_player(0);
+ return true;
+ }
+*/
+ return false;
+}
+
+
+
+KVIRC_MODULE(
+ "torrent",
+ "1.0.0",
+ "Copyright (C) 2007 Alexander Stillich (torque at pltn dot org)",
+ "Interface to various torrent clients",
+ torrent_module_init,
+ torrent_module_can_unload,
+ torrent_module_ctrl,
+ torrent_module_cleanup
+)