summaryrefslogtreecommitdiffstats
path: root/plugins/upnp/upnpprefwidget.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'plugins/upnp/upnpprefwidget.cpp')
-rw-r--r--plugins/upnp/upnpprefwidget.cpp253
1 files changed, 253 insertions, 0 deletions
diff --git a/plugins/upnp/upnpprefwidget.cpp b/plugins/upnp/upnpprefwidget.cpp
new file mode 100644
index 0000000..43e2aec
--- /dev/null
+++ b/plugins/upnp/upnpprefwidget.cpp
@@ -0,0 +1,253 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Joris Guisson *
+ * joris.guisson@gmail.com *
+ * *
+ * 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 <klistview.h>
+#include <kmessagebox.h>
+#include <kpushbutton.h>
+#include <torrent/udptrackersocket.h>
+#include <torrent/globals.h>
+#include <torrent/server.h>
+#include <kademlia/dhtbase.h>
+#include "upnpprefwidget.h"
+#include <util/log.h>
+#include <util/error.h>
+#include <util/waitjob.h>
+#include <util/httprequest.h>
+#include <torrent/globals.h>
+#include "upnppluginsettings.h"
+
+using namespace bt;
+
+namespace kt
+{
+ UPnPPrefWidget::UPnPPrefWidget(QWidget* parent, const char* name, WFlags fl)
+ : UPnPWidget(parent,name,fl)
+ {
+ def_router = 0;
+ connect(m_forward_btn,SIGNAL(clicked()),this,SLOT(onForwardBtnClicked()));
+ connect(m_undo_forward_btn,SIGNAL(clicked()),this,SLOT(onUndoForwardBtnClicked()));
+ connect(m_rescan,SIGNAL(clicked()),this,SLOT(onRescanClicked()));
+ bt::Globals::instance().getPortList().setListener(this);
+ }
+
+ UPnPPrefWidget::~UPnPPrefWidget()
+ {
+ bt::Globals::instance().getPortList().setListener(0);
+ }
+
+ void UPnPPrefWidget::shutdown(bt::WaitJob* job)
+ {
+ if (!def_router)
+ return;
+
+ net::PortList & pl = bt::Globals::instance().getPortList();
+ if (pl.count() == 0)
+ return;
+
+ for (net::PortList::iterator i = pl.begin(); i != pl.end();i++)
+ {
+ net::Port & p = *i;
+ if (p.forward)
+ def_router->undoForward(p,job);
+ }
+ }
+
+
+ void UPnPPrefWidget::addDevice(UPnPRouter* r)
+ {
+ connect(r,SIGNAL(updateGUI()),this,SLOT(updatePortMappings()));
+ KListViewItem* item = new KListViewItem(m_device_list,r->getDescription().friendlyName);
+ item->setMultiLinesEnabled(true);
+ itemmap[item] = r;
+ // if we have discovered the default device or there is none
+ // forward it's ports
+ QString def_dev = UPnPPluginSettings::defaultDevice();
+ if (def_dev == r->getServer() || def_dev.length() == 0)
+ {
+ Out(SYS_PNP|LOG_DEBUG) << "Doing default port mappings ..." << endl;
+ UPnPPluginSettings::setDefaultDevice(r->getServer());
+ UPnPPluginSettings::writeConfig();
+
+ try
+ {
+ net::PortList & pl = bt::Globals::instance().getPortList();
+
+ for (net::PortList::iterator i = pl.begin(); i != pl.end();i++)
+ {
+ net::Port & p = *i;
+ if (p.forward)
+ r->forward(p);
+ }
+
+ def_router = r;
+ }
+ catch (Error & e)
+ {
+ KMessageBox::error(this,e.toString());
+ }
+ }
+ }
+
+ void UPnPPrefWidget::onForwardBtnClicked()
+ {
+ KListViewItem* item = (KListViewItem*)m_device_list->currentItem();;
+ if (!item)
+ return;
+
+ UPnPRouter* r = itemmap[item];
+ if (!r)
+ return;
+
+ try
+ {
+ net::PortList & pl = bt::Globals::instance().getPortList();
+
+ for (net::PortList::iterator i = pl.begin(); i != pl.end();i++)
+ {
+ net::Port & p = *i;
+ if (p.forward)
+ r->forward(p);
+ }
+
+ QString def_dev = UPnPPluginSettings::defaultDevice();
+ if (def_dev != r->getServer())
+ {
+ UPnPPluginSettings::setDefaultDevice(r->getServer());
+ UPnPPluginSettings::writeConfig();
+ def_router = r;
+ }
+
+ }
+ catch (Error & e)
+ {
+ KMessageBox::error(this,e.toString());
+ }
+ }
+
+ void UPnPPrefWidget::onRescanClicked()
+ {
+ // clear the list and emit the signal
+ rescan();
+ }
+
+ void UPnPPrefWidget::onUndoForwardBtnClicked()
+ {
+ KListViewItem* item = (KListViewItem*)m_device_list->currentItem();;
+ if (!item)
+ return;
+
+ UPnPRouter* r = itemmap[item];
+ if (!r)
+ return;
+
+ try
+ {
+ net::PortList & pl = bt::Globals::instance().getPortList();
+
+ for (net::PortList::iterator i = pl.begin(); i != pl.end();i++)
+ {
+ net::Port & p = *i;
+ if (p.forward)
+ r->undoForward(p,false);
+ }
+
+ QString def_dev = UPnPPluginSettings::defaultDevice();
+ if (def_dev == r->getServer())
+ {
+ UPnPPluginSettings::setDefaultDevice(QString::null);
+ UPnPPluginSettings::writeConfig();
+ def_router = 0;
+ }
+ }
+ catch (Error & e)
+ {
+ KMessageBox::error(this,e.toString());
+ }
+ }
+
+
+ void UPnPPrefWidget::updatePortMappings()
+ {
+ // update all port mappings
+ QMap<KListViewItem*,UPnPRouter*>::iterator i = itemmap.begin();
+ while (i != itemmap.end())
+ {
+ UPnPRouter* r = i.data();
+ KListViewItem* item = i.key();
+ QString msg,services;
+ QValueList<UPnPRouter::Forwarding>::iterator j = r->beginPortMappings();
+ while (j != r->endPortMappings())
+ {
+ UPnPRouter::Forwarding & f = *j;
+ if (!f.pending_req)
+ {
+ msg += QString::number(f.port.number) + " (";
+ QString prot = (f.port.proto == net::UDP ? "UDP" : "TCP");
+ msg += prot + ")";
+ if (f.service->servicetype.contains("WANPPPConnection"))
+ services += "PPP";
+ else
+ services += "IP";
+ }
+ j++;
+ if (j != r->endPortMappings())
+ {
+ msg += "\n";
+ services += "\n";
+ }
+ }
+ item->setText(1,msg);
+ item->setText(2,services);
+ i++;
+ }
+ }
+
+
+ void UPnPPrefWidget::portAdded(const net::Port & port)
+ {
+ try
+ {
+ if (def_router && port.forward)
+ def_router->forward(port);
+ }
+ catch (Error & e)
+ {
+ Out(SYS_PNP|LOG_DEBUG) << "Error : " << e.toString() << endl;
+ }
+ }
+
+ void UPnPPrefWidget::portRemoved(const net::Port & port)
+ {
+ try
+ {
+ if (def_router && port.forward)
+ def_router->undoForward(port,false);
+ }
+ catch (Error & e)
+ {
+ Out(SYS_PNP|LOG_DEBUG) << "Error : " << e.toString() << endl;
+ }
+ }
+}
+
+
+
+#include "upnpprefwidget.moc"
+