summaryrefslogtreecommitdiffstats
path: root/plugins/webinterface/php_interface.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'plugins/webinterface/php_interface.cpp')
-rw-r--r--plugins/webinterface/php_interface.cpp486
1 files changed, 486 insertions, 0 deletions
diff --git a/plugins/webinterface/php_interface.cpp b/plugins/webinterface/php_interface.cpp
new file mode 100644
index 0000000..8ee7d0b
--- /dev/null
+++ b/plugins/webinterface/php_interface.cpp
@@ -0,0 +1,486 @@
+ /***************************************************************************
+ * Copyright (C) 2006 by Diego R. Brogna *
+ * *
+ * 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 option) 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 <kio/global.h>
+#include <kglobal.h>
+#include <klocale.h>
+
+#include <net/socketmonitor.h>
+#include <torrent/choker.h>
+#include <torrent/udptrackersocket.h>
+#include <kademlia/dhtbase.h>
+#include <torrent/server.h>
+#include <util/log.h>
+#include <interfaces/functions.h>
+
+#include "php_interface.h"
+
+using namespace bt;
+
+namespace kt
+{
+ extern QString DataDir();
+
+ using bt::FIRST_PRIORITY;
+ using bt::NORMAL_PRIORITY;
+ using bt::LAST_PRIORITY;
+ using bt::EXCLUDED;
+
+
+ QString BytesToString2(Uint64 bytes,int precision = 2)
+ {
+ KLocale* loc = KGlobal::locale();
+ if (bytes >= 1024 * 1024 * 1024)
+ return QString("%1 GB").arg(loc->formatNumber(bytes / TO_GIG,precision < 0 ? 2 : precision));
+ else if (bytes >= 1024*1024)
+ return QString("%1 MB").arg(loc->formatNumber(bytes / TO_MEG,precision < 0 ? 1 : precision));
+ else if (bytes >= 1024)
+ return QString("%1 KB").arg(loc->formatNumber(bytes / TO_KB,precision < 0 ? 1 : precision));
+ else
+ return QString("%1 B").arg(bytes);
+ }
+
+ QString KBytesPerSecToString2(double speed,int precision = 2)
+ {
+ KLocale* loc = KGlobal::locale();
+ return QString("%1 KB/s").arg(loc->formatNumber(speed,precision));
+ }
+
+ /************************
+ *PhpCodeGenerator *
+ ************************/
+ PhpCodeGenerator::PhpCodeGenerator(CoreInterface *c)
+ {
+ core=c;
+ }
+
+ /*Generate php code
+ * function downloadStatus()
+ * {
+ * return array( ... );
+ * }
+ */
+ void PhpCodeGenerator::downloadStatus(QTextStream & out)
+ {
+ TorrentStats stats;
+ //Priority file_priority;
+ QString status;
+ out << "function downloadStatus()\n{\nreturn array(";
+
+ QPtrList<TorrentInterface>::iterator i= core->getQueueManager()->begin();
+ for(int k=0; i != core->getQueueManager()->end(); i++, k++)
+ {
+ if (k > 0)
+ out << ",\n";
+
+ stats=(*i)->getStats();
+ out << QString("\n%1 => array(").arg(k);
+
+ out << QString("\"imported_bytes\" => %1,\n").arg(stats.imported_bytes);
+ out << QString("\"bytes_downloaded\" => \"%1\",\n").arg(BytesToString2(stats.bytes_downloaded));
+ out << QString("\"bytes_uploaded\" => \"%1\",\n").arg(BytesToString2(stats.bytes_uploaded));
+ out << QString("\"bytes_left\" => %1,\n").arg(stats.bytes_left);
+ out << QString("\"bytes_left_to_download\" => %1,\n").arg(stats.bytes_left_to_download);
+ out << QString("\"total_bytes\" => \"%1\",\n").arg(BytesToString2(stats.total_bytes));
+ out << QString("\"total_bytes_to_download\" => %1,\n").arg(stats.total_bytes_to_download);
+ out << QString("\"download_rate\" => \"%1\",\n").arg(KBytesPerSecToString2(stats.download_rate / 1024.0));
+ out << QString("\"upload_rate\" => \"%1\",\n").arg(KBytesPerSecToString2(stats.upload_rate / 1024.0));
+ out << QString("\"num_peers\" => %1,\n").arg(stats.num_peers);
+ out << QString("\"num_chunks_downloading\" => %1,\n").arg(stats.num_chunks_downloading);
+ out << QString("\"total_chunks\" => %1,\n").arg(stats.total_chunks);
+ out << QString("\"num_chunks_downloaded\" => %1,\n").arg(stats.num_chunks_downloaded);
+ out << QString("\"num_chunks_excluded\" => %1,\n").arg(stats.num_chunks_excluded);
+ out << QString("\"chunk_size\" => %1,\n").arg(stats.chunk_size);
+ out << QString("\"seeders_total\" => %1,\n").arg(stats.seeders_total);
+ out << QString("\"seeders_connected_to\" => %1,\n").arg(stats.seeders_connected_to);
+ out << QString("\"leechers_total\" => %1,\n").arg(stats.leechers_total);
+ out << QString("\"leechers_connected_to\" => %1,\n").arg(stats.leechers_connected_to);
+ out << QString("\"status\" => %1,\n").arg(stats.status);
+ out << QString("\"running\" => %1,\n").arg(stats.running);
+ out << QString("\"trackerstatus\" => \"%1\",\n").arg(stats.trackerstatus.replace("\\", "\\\\").replace("\"", "\\\"").replace("$", "\\$"));
+ out << QString("\"session_bytes_downloaded\" => %1,\n").arg(stats.session_bytes_downloaded);
+ out << QString("\"session_bytes_uploaded\" => %1,\n").arg(stats.session_bytes_uploaded);
+ out << QString("\"trk_bytes_downloaded\" => %1,\n").arg(stats.trk_bytes_downloaded);
+ out << QString("\"trk_bytes_uploaded\" => %1,\n").arg(stats.trk_bytes_uploaded);
+ out << QString("\"torrent_name\" => \"%1\",\n").arg(stats.torrent_name.replace("\\", "\\\\").replace("\"", "\\\"").replace("$", "\\$"));
+ out << QString("\"output_path\" => \"%1\",\n").arg(stats.output_path.replace("\\", "\\\\").replace("\"", "\\\"").replace("$", "\\$"));
+ out << QString("\"stopped_by_error\" => \"%1\",\n").arg(stats.stopped_by_error);
+ out << QString("\"completed\" => \"%1\",\n").arg(stats.completed);
+ out << QString("\"user_controlled\" => \"%1\",\n").arg(stats.user_controlled);
+ out << QString("\"max_share_ratio\" => %1,\n").arg(stats.max_share_ratio);
+ out << QString("\"priv_torrent\" => \"%1\",\n").arg(stats.priv_torrent);
+ out << QString("\"num_files\" => \"%1\",\n").arg((*i)->getNumFiles());
+ out << QString("\"files\" => array(");
+ out << flush;
+ if (stats.multi_file_torrent)
+ {
+ //for loop to add each file+status to "files" array
+ for (Uint32 j = 0;j < (*i)->getNumFiles();j++)
+ {
+ if (j > 0)
+ out << ",\n";
+
+ TorrentFileInterface & file = (*i)->getTorrentFile(j);
+ out << QString("\"%1\" => array(\n").arg(j);
+ out << QString("\"name\" => \"%1\",\n").arg(file.getPath());
+ out << QString("\"size\" => \"%1\",\n").arg(KIO::convertSize(file.getSize()));
+ out << QString("\"perc_done\" => \"%1\",\n").arg(file.getDownloadPercentage());
+ out << QString("\"status\" => \"%1\"\n").arg(file.getPriority());
+ out << QString(")\n");
+ out << flush;
+ }
+ }
+
+ out << ")\n";
+ out << ")\n";
+ }
+
+ out << ");\n}\n";
+ }
+
+ /*Generate php code
+ * function globalStatus()
+ * {
+ * return array( ... );
+ * }
+ */
+ void PhpCodeGenerator::globalInfo(QTextStream & out)
+ {
+ out << "function globalInfo()\n{\nreturn array(";
+ CurrentStats stats=core->getStats();
+
+ out << QString("\"download_speed\" => \"%1\",").arg(KBytesPerSecToString2(stats.download_speed / 1024.0));
+ out << QString("\"upload_speed\" => \"%1\",").arg(KBytesPerSecToString2(stats.upload_speed / 1024.0));
+ out << QString("\"bytes_downloaded\" => \"%1\",").arg(stats.bytes_downloaded);
+ out << QString("\"bytes_uploaded\" => \"%1\",").arg(stats.bytes_uploaded);
+ out << QString("\"max_download_speed\" => \"%1\",").arg(core->getMaxDownloadSpeed());
+ out << QString("\"max_upload_speed\" => \"%1\",").arg(core->getMaxUploadSpeed());
+ out << QString("\"max_downloads\" => \"%1\",").arg(Settings::maxDownloads());
+ out << QString("\"max_seeds\"=> \"%1\",").arg(Settings::maxSeeds());
+ out << QString("\"dht_support\" => \"%1\",").arg(Settings::dhtSupport());
+ out << QString("\"use_encryption\" => \"%1\"").arg(Settings::useEncryption());
+ out << ");\n}\n";
+ }
+
+
+ /************************
+ *PhpActionExec *
+ ************************/
+ PhpActionExec::PhpActionExec(CoreInterface *c)
+ {
+ core=c;
+ }
+
+ bool PhpActionExec::exec(KURL & url,bool & shutdown)
+ {
+ bool ret = false;
+ shutdown = false;
+ int separator_loc;
+ QString parse;
+ QString torrent_num;
+ QString file_num;
+ KURL redirected_url;
+ redirected_url.setPath(url.path());
+
+ const QMap<QString, QString> & params = url.queryItems();
+ QMap<QString, QString>::ConstIterator it;
+
+ for ( it = params.begin(); it != params.end(); ++it )
+ {
+ // Out(SYS_WEB| LOG_DEBUG) << "exec " << it.key().latin1() << endl;
+ switch(it.key()[0])
+ {
+ case 'd':
+ if(it.key()=="dht")
+ {
+ if(it.data()=="start")
+ {
+ Settings::setDhtSupport(true);
+ }
+ else
+ {
+ Settings::setDhtSupport(false);
+ }
+
+ dht::DHTBase & ht = Globals::instance().getDHT();
+ if (Settings::dhtSupport() && !ht.isRunning())
+ {
+ ht.start(kt::DataDir() + "dht_table",kt::DataDir() + "dht_key",Settings::dhtPort());
+ ret = true;
+ }
+ else if (!Settings::dhtSupport() && ht.isRunning())
+ {
+ ht.stop();
+ ret = true;
+ }
+ else if (Settings::dhtSupport() && ht.getPort() != Settings::dhtPort())
+ {
+ ht.stop();
+ ht.start(kt::DataDir() + "dht_table",kt::DataDir() + "dht_key",Settings::dhtPort());
+ ret = true;
+ }
+ }
+ break;
+ case 'e':
+ if(it.key()=="encription")
+ {
+ if(it.data()=="start")
+ {
+ Settings::setUseEncryption(true);
+ }
+ else
+ {
+ Settings::setUseEncryption(false);
+ }
+
+ if (Settings::useEncryption())
+ {
+ Globals::instance().getServer().enableEncryption(Settings::allowUnencryptedConnections());
+ }
+ else
+ {
+ Globals::instance().getServer().disableEncryption();
+ }
+ ret = true;
+ }
+ break;
+ case 'f':
+ //parse argument into torrent number and file number
+ separator_loc=it.data().find('-');
+ parse=it.data();
+ torrent_num.append(parse.left(separator_loc));
+ file_num.append(parse.right(parse.length()-(separator_loc+1)));
+
+ if(it.key()=="file_lp")
+ {
+ QPtrList<TorrentInterface>::iterator i= core->getQueueManager()->begin();
+ for(int k=0; i != core->getQueueManager()->end(); i++, k++)
+ {
+ if(torrent_num.toInt()==k)
+ {
+ TorrentFileInterface & file = (*i)->getTorrentFile(file_num.toInt());
+ file.setPriority(LAST_PRIORITY);
+ ret = true;
+ break;
+ }
+ }
+ }
+ else if(it.key()=="file_np")
+ {
+ QPtrList<TorrentInterface>::iterator i= core->getQueueManager()->begin();
+ for(int k=0; i != core->getQueueManager()->end(); i++, k++)
+ {
+ if(torrent_num.toInt()==k)
+ {
+ TorrentFileInterface & file = (*i)->getTorrentFile(file_num.toInt());
+ file.setPriority(NORMAL_PRIORITY);
+ ret = true;
+ break;
+ }
+ }
+ }
+ else if(it.key()=="file_hp")
+ {
+ QPtrList<TorrentInterface>::iterator i= core->getQueueManager()->begin();
+ for(int k=0; i != core->getQueueManager()->end(); i++, k++)
+ {
+ if(torrent_num.toInt()==k)
+ {
+ TorrentFileInterface & file = (*i)->getTorrentFile(file_num.toInt());
+ file.setPriority(FIRST_PRIORITY);
+ ret = true;
+ break;
+ }
+ }
+ }
+ else if(it.key()=="file_stop")
+ {
+ QPtrList<TorrentInterface>::iterator i= core->getQueueManager()->begin();
+ for(int k=0; i != core->getQueueManager()->end(); i++, k++)
+ {
+ if(torrent_num.toInt()==k)
+ {
+ TorrentFileInterface & file = (*i)->getTorrentFile(file_num.toInt());
+ file.setPriority(ONLY_SEED_PRIORITY);
+ ret = true;
+ break;
+ }
+ }
+ }
+ break;
+ case 'g':
+ if(it.key()=="global_connection")
+ {
+ Settings::setMaxTotalConnections(it.data().toInt());
+ PeerManager::setMaxTotalConnections(Settings::maxTotalConnections());
+ ret = true;
+ }
+ break;
+ case 'l':
+ if(it.key()=="load_torrent" && it.data().length() > 0)
+ {
+ core->loadSilently(KURL::decode_string(it.data()));
+ ret = true;
+ }
+ break;
+ case 'm':
+ if(it.key()=="maximum_downloads")
+ {
+ core->setMaxDownloads(it.data().toInt());
+ Settings::setMaxDownloads(it.data().toInt());
+ ret = true;
+ }
+ else if(it.key()=="maximum_seeds")
+ {
+ core->setMaxSeeds(it.data().toInt());
+ Settings::setMaxSeeds(it.data().toInt());
+ ret = true;
+ }
+ else if(it.key()=="maximum_connection_per_torrent")
+ {
+ PeerManager::setMaxConnections(it.data().toInt());
+ Settings::setMaxConnections(it.data().toInt());
+ ret = true;
+ }
+ else if(it.key()=="maximum_upload_rate")
+ {
+ Settings::setMaxUploadRate(it.data().toInt());
+ core->setMaxUploadSpeed(Settings::maxUploadRate());
+ net::SocketMonitor::setUploadCap( Settings::maxUploadRate() * 1024);
+ ret = true;
+ }
+ else if(it.key()=="maximum_download_rate")
+ {
+ Settings::setMaxDownloadRate(it.data().toInt());
+ core->setMaxDownloadSpeed(Settings::maxDownloadRate());
+ net::SocketMonitor::setDownloadCap(Settings::maxDownloadRate()*1024);
+ ret = true;
+ }
+ else if(it.key()=="maximum_share_ratio")
+ {
+ Settings::setMaxRatio(it.data().toInt());
+ ret = true;
+ }
+ break;
+ case 'n':
+ if(it.key()=="number_of_upload_slots")
+ {
+ Settings::setNumUploadSlots(it.data().toInt());
+ Choker::setNumUploadSlots(Settings::numUploadSlots());
+ ret = true;
+ }
+ break;
+ case 'p':
+ if(it.key()=="port")
+ {
+ Settings::setPort(it.data().toInt());
+ core->changePort(Settings::port());
+ }
+ else if(it.key()=="port_udp_tracker")
+ {
+ Settings::setUdpTrackerPort(it.data().toInt());
+ UDPTrackerSocket::setPort(Settings::udpTrackerPort());
+ ret = true;
+ }
+ break;
+ case 'q':
+ if(it.key()=="quit" && !it.data().isEmpty())
+ {
+ shutdown = true;
+ ret = true;
+ }
+ break;
+ case 'r':
+ if(it.key()=="remove")
+ {
+ QPtrList<TorrentInterface>::iterator i= core->getQueueManager()->begin();
+ for(int k=0; i != core->getQueueManager()->end(); i++, k++)
+ {
+ if(it.data().toInt()==k)
+ {
+ core->remove((*i), false);
+ ret = true;
+ break;
+ }
+ }
+ }
+ break;
+ case 's':
+ if(it.key()=="stopall" && !it.data().isEmpty())
+ {
+ core->stopAll(3);
+ }
+ else if(it.key()=="startall" && !it.data().isEmpty())
+ {
+ core->startAll(3);
+ }
+ else if(it.key()=="stop")
+ {
+ QPtrList<TorrentInterface>::iterator i= core->getQueueManager()->begin();
+ for(int k=0; i != core->getQueueManager()->end(); i++, k++)
+ {
+ if(it.data().toInt()==k)
+ {
+ (*i)->stop(true);
+ ret = true;
+ break;
+ }
+ }
+ }
+ else if(it.key()=="start")
+ {
+ QPtrList<TorrentInterface>::iterator i= core->getQueueManager()->begin();
+ for(int k=0; i != core->getQueueManager()->end(); i++, k++)
+ {
+ if(it.data().toInt()==k)
+ {
+ (*i)->start();
+ ret = true;
+ break;
+ }
+ }
+ }
+ break;
+
+ default:
+ // add unknown query items to the redirected url
+ // we don't add the keys above, because if the user presses refresh
+ // the same action will be taken again
+ redirected_url.addQueryItem(it.key(),it.data());
+ break;
+ }
+ Settings::writeConfig();
+ }
+
+ if (ret)
+ url = redirected_url;
+
+ return ret;
+ }
+
+ /************************
+ *PhpInterface *
+ ************************/
+ PhpInterface::PhpInterface(CoreInterface *c):PhpCodeGenerator(c), PhpActionExec(c)
+ {
+
+ }
+
+}