//============================================================================= // // File : igdcontrolpoint.cpp // Creation date : Fri Aug 08 18:00:00 2008 GMT by Fabio Bas // // This file is part of the KVIrc IRC client distribution // Copyright (C) 2008 Fabio Bas (ctrlaltca at gmail dot 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. // // Original Copyright follows: //============================================================================= /*************************************************************************** igdcontrolpoint.cpp - description ------------------- begin : Mon Jul 25 2005 copyright : (C) 2005 by Diederik van der Boor email : vdboor --at-- codingdomain.com ***************************************************************************/ #include #include "igdcontrolpoint.h" #include "RootService.h" #include "WanConnectionService.h" namespace UPnP { #define WanIpConnectionType "urn:schemas-upnp-org:service:WANIPConnection:1" #define WanPPPConnectionType "urn:schemas-upnp-org:service:WANPPPConnection:1" // The constructor IgdControlPoint::IgdControlPoint(const QString & hostname, int port, const QString & rootUrl) : QObject(), m_bGatewayAvailable(false), m_iIgdPort(0), m_pRootService(nullptr), m_pWanConnectionService(nullptr) { qDebug() << "CREATED UPnP::IgdControlPoint: created control point" << " url='" << hostname << ":" << port << "/" << rootUrl << "'." << Qt::endl; qDebug() << "UPnP::IgdControlPoint: querying services..." << Qt::endl; // Store device url m_szIgdHostname = hostname; m_iIgdPort = port; // Query the device for it's services m_pRootService = new RootService(m_szIgdHostname, m_iIgdPort, rootUrl); connect(m_pRootService, SIGNAL(queryFinished(bool)), this, SLOT(slotDeviceQueried(bool))); } // The destructor IgdControlPoint::~IgdControlPoint() { delete m_pRootService; delete m_pWanConnectionService; qDebug() << "DESTROYED UPnP::IgdControlPoint [host=" << m_szIgdHostname << ", port=" << m_iIgdPort << "]" << Qt::endl; } // Return the external IP address QString IgdControlPoint::getExternalIpAddress() const { // Do not expose wanConnectionService_; if(m_pWanConnectionService != nullptr) { return m_pWanConnectionService->getExternalIpAddress(); } else { return QString(); } } // Initialize the control point void IgdControlPoint::initialize() { m_pRootService->queryDevice(); } // Return true if a controlable gateway is available bool IgdControlPoint::isGatewayAvailable() { return m_bGatewayAvailable; } // The IGD was queried for it's services void IgdControlPoint::slotDeviceQueried(bool error) { if(!error) { ServiceParameters params = m_pRootService->getServiceByType(WanIpConnectionType); if(params.controlUrl.isNull()) params = m_pRootService->getServiceByType(WanPPPConnectionType); if(!params.controlUrl.isNull()) { m_bGatewayAvailable = true; qDebug() << "UPnP::IgdControlPoint: WAN/IP connection service found, " << "querying service '" << params.serviceId << "' for external IP address..." << Qt::endl; // Call the service m_pWanConnectionService = new WanConnectionService(params); connect(m_pWanConnectionService, SIGNAL(queryFinished(bool)), this, SLOT(slotWanQueryFinished(bool))); m_pWanConnectionService->queryExternalIpAddress(); } else { qDebug() << "UPnP::IgdControlPoint: no PPP/IP connection service found :(" << Qt::endl; } } } // A WAN connection query was finished void IgdControlPoint::slotWanQueryFinished(bool error) { if(!error) { qDebug() << "IgdControlPoint: UPnP gateway device found." << Qt::endl; } else { // Just started, the request for the external IP failed. This should succeed, abort portation qDebug() << "Requesting external IP address failed, leaving UPnP gateway device untouched." << Qt::endl; } } // Return the external IP address void IgdControlPoint::addPortMapping(const QString & protocol, const QString & remoteHost, int externalPort, const QString & internalClient, int internalPort, const QString & description, bool enabled, int leaseDuration) { // Do not expose wanConnectionService_; if(m_pWanConnectionService != nullptr) { m_pWanConnectionService->addPortMapping(protocol, remoteHost, externalPort, internalClient, internalPort, description, enabled, leaseDuration); } } // Delete a port mapping void IgdControlPoint::deletePortMapping(const QString & protocol, const QString & remoteHost, int externalPort) { // Do not expose wanConnectionService_; if(m_pWanConnectionService != nullptr) { m_pWanConnectionService->deletePortMapping(protocol, remoteHost, externalPort); } } } // End of namespace