//============================================================================= // // 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 * 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) { TQString szOut; TQString szNam = d->name(); KviTQString::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")); \ TQString 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; \ TQString 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 \ TQString 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 \ TQString 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 \ TQString 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 @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 @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 @syntax: torrent.start @description: Starts downloading of 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], [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 @syntax: torrent.stop @description: Stops downloading of 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], [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 @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 @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 @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 @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 @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 @description: Sets the torrent client interface to be used by the torrent interface module. 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) { TQString 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 @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; g_pDescriptorList->setAutoDelete(true); #ifdef COMPILE_TDE_SUPPORT g_pDescriptorList->append(new KviKTorrentDCOPInterfaceDescriptor); #endif // COMPILE_TDE_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) { tqDebug("torrent module ctrl"); /* if(kvi_strEqualCI(operation,"getAvailableMediaPlayers")) { // we expect param to be a pointer to TQStringList TQStringList * l = (TQStringList *)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 )