diff deps/Platinum/Source/Core/PltUPnP.cpp @ 0:3425707ddbf6

Initial import (hopefully this mercurial stuff works...)
author fraserofthenight
date Mon, 06 Jul 2009 08:06:28 -0700
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/deps/Platinum/Source/Core/PltUPnP.cpp	Mon Jul 06 08:06:28 2009 -0700
@@ -0,0 +1,259 @@
+/*****************************************************************
+|
+|   Platinum - UPnP Engine
+|
+| Copyright (c) 2004-2008, Plutinosoft, LLC.
+| All rights reserved.
+| http://www.plutinosoft.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.
+|
+| OEMs, ISVs, VARs and other distributors that combine and 
+| distribute commercially licensed software with Platinum software
+| and do not wish to distribute the source code for the commercially
+| licensed software under version 2, or (at your option) any later
+| version, of the GNU General Public License (the "GPL") must enter
+| into a commercial license agreement with Plutinosoft, LLC.
+| 
+| 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; see the file LICENSE.txt. If not, write to
+| the Free Software Foundation, Inc., 
+| 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
+| http://www.gnu.org/licenses/gpl-2.0.html
+|
+****************************************************************/
+
+/*----------------------------------------------------------------------
+|   includes
++---------------------------------------------------------------------*/
+#include "Neptune.h"
+#include "PltVersion.h"
+#include "PltUPnP.h"
+#include "PltDeviceHost.h"
+#include "PltCtrlPoint.h"
+#include "PltSsdp.h"
+
+NPT_SET_LOCAL_LOGGER("platinum.core.upnp")
+
+/*----------------------------------------------------------------------
+|   PLT_UPnP_CtrlPointStartIterator class
++---------------------------------------------------------------------*/
+class PLT_UPnP_CtrlPointStartIterator
+{
+public:
+    PLT_UPnP_CtrlPointStartIterator(PLT_SsdpListenTask* listen_task) :
+        m_ListenTask(listen_task)  {}
+    virtual ~PLT_UPnP_CtrlPointStartIterator() {}
+
+    NPT_Result operator()(PLT_CtrlPointReference& ctrl_point) const {
+        NPT_CHECK_SEVERE(ctrl_point->Start(m_ListenTask));
+        return NPT_SUCCESS;
+    }
+
+private:
+    PLT_SsdpListenTask* m_ListenTask;
+};
+
+/*----------------------------------------------------------------------
+|   PLT_UPnP_CtrlPointStopIterator class
++---------------------------------------------------------------------*/
+class PLT_UPnP_CtrlPointStopIterator
+{
+public:
+    PLT_UPnP_CtrlPointStopIterator(PLT_SsdpListenTask* listen_task) :
+        m_ListenTask(listen_task)  {}
+    virtual ~PLT_UPnP_CtrlPointStopIterator() {}
+
+    NPT_Result operator()(PLT_CtrlPointReference& ctrl_point) const {
+        return ctrl_point->Stop(m_ListenTask);
+    }
+
+
+private:
+    PLT_SsdpListenTask* m_ListenTask;
+};
+
+/*----------------------------------------------------------------------
+|   PLT_UPnP_DeviceStartIterator class
++---------------------------------------------------------------------*/
+class PLT_UPnP_DeviceStartIterator
+{
+public:
+    PLT_UPnP_DeviceStartIterator(PLT_SsdpListenTask* listen_task) :
+        m_ListenTask(listen_task)  {}
+    virtual ~PLT_UPnP_DeviceStartIterator() {}
+
+    NPT_Result operator()(PLT_DeviceHostReference& device_host) const {
+        NPT_CHECK_SEVERE(device_host->Start(m_ListenTask));
+        return NPT_SUCCESS;
+    }
+
+private:
+    PLT_SsdpListenTask* m_ListenTask;
+};
+
+/*----------------------------------------------------------------------
+|   PLT_UPnP_DeviceStopIterator class
++---------------------------------------------------------------------*/
+class PLT_UPnP_DeviceStopIterator
+{
+public:
+    PLT_UPnP_DeviceStopIterator(PLT_SsdpListenTask* listen_task) :
+        m_ListenTask(listen_task)  {}
+    virtual ~PLT_UPnP_DeviceStopIterator() {}
+
+    NPT_Result operator()(PLT_DeviceHostReference& device_host) const {
+        return device_host->Stop(m_ListenTask);
+    }
+
+
+private:
+    PLT_SsdpListenTask* m_ListenTask;
+};
+
+/*----------------------------------------------------------------------
+|   PLT_UPnP::PLT_UPnP
++---------------------------------------------------------------------*/
+PLT_UPnP::PLT_UPnP(NPT_UInt32 port, bool multicast /* = true */) :
+    m_Started(false),
+    m_Port(port),
+    m_Multicast(multicast),
+    m_SsdpListenTask(NULL)
+{
+    NPT_HttpClient::m_UserAgentHeader = "Platinum/" PLT_PLATINUM_VERSION_STRING;
+    NPT_HttpServer::m_ServerHeader    = "UPnP/1.0, Platinum/" PLT_PLATINUM_VERSION_STRING;
+}
+    
+/*----------------------------------------------------------------------
+|   PLT_UPnP::~PLT_UPnP
++---------------------------------------------------------------------*/
+PLT_UPnP::~PLT_UPnP()
+{
+    Stop();
+
+    m_CtrlPoints.Clear();
+    m_Devices.Clear();
+}
+
+/*----------------------------------------------------------------------
+|   PLT_UPnP::Start()
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_UPnP::Start()
+{
+    NPT_LOG_INFO("Starting UPnP...");
+
+    NPT_AutoLock lock(m_Lock);
+
+    if (m_Started == true) return NPT_FAILURE;
+
+    NPT_Socket* socket = m_Multicast?new NPT_UdpMulticastSocket(): new NPT_UdpSocket();
+    NPT_CHECK_SEVERE(socket->Bind(NPT_SocketAddress(NPT_IpAddress::Any, m_Port)));
+
+    /* create the ssdp listener */
+    m_SsdpListenTask = new PLT_SsdpListenTask(socket, m_Multicast);
+    NPT_CHECK_SEVERE(m_TaskManager.StartTask(m_SsdpListenTask));
+
+    /* start devices & ctrlpoints */
+    m_CtrlPoints.Apply(PLT_UPnP_CtrlPointStartIterator(m_SsdpListenTask));
+    m_Devices.Apply(PLT_UPnP_DeviceStartIterator(m_SsdpListenTask));
+
+    m_Started = true;
+    return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+|   PLT_UPnP::Stop
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_UPnP::Stop()
+{
+    NPT_AutoLock lock(m_Lock);
+
+    if (m_Started == false) return NPT_FAILURE;
+
+    NPT_LOG_INFO("Stopping UPnP...");
+
+    // Stop ctrlpoints and devices first
+    m_CtrlPoints.Apply(PLT_UPnP_CtrlPointStopIterator(m_SsdpListenTask));
+    m_Devices.Apply(PLT_UPnP_DeviceStopIterator(m_SsdpListenTask));
+
+    m_TaskManager.StopAllTasks();
+    m_SsdpListenTask = NULL;
+
+    m_Started = false;
+    return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+|   PLT_UPnP::AddDevice
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_UPnP::AddDevice(PLT_DeviceHostReference& device)
+{
+    NPT_AutoLock lock(m_Lock);
+
+    if (m_Started) {
+        NPT_LOG_INFO("Starting Device...");
+        NPT_CHECK_SEVERE(device->Start(m_SsdpListenTask));
+    }
+
+    m_Devices.Add(device);
+    return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+|   PLT_UPnP::RemoveDevice
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_UPnP::RemoveDevice(PLT_DeviceHostReference& device)
+{
+    NPT_AutoLock lock(m_Lock);
+
+    if (m_Started) {
+        device->Stop(m_SsdpListenTask);
+    }
+
+    return m_Devices.Remove(device);
+}
+
+/*----------------------------------------------------------------------
+|   PLT_UPnP::AddCtrlPoint
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_UPnP::AddCtrlPoint(PLT_CtrlPointReference& ctrl_point)
+{
+    NPT_AutoLock lock(m_Lock);
+
+    if (m_Started) {
+        NPT_LOG_INFO("Starting Ctrlpoint...");
+        NPT_CHECK_SEVERE(ctrl_point->Start(m_SsdpListenTask));
+    }
+
+    m_CtrlPoints.Add(ctrl_point);
+    return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+|   PLT_UPnP::RemoveCtrlPoint
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_UPnP::RemoveCtrlPoint(PLT_CtrlPointReference& ctrl_point)
+{
+    NPT_AutoLock lock(m_Lock);
+
+    if (m_Started) {
+        ctrl_point->Stop(m_SsdpListenTask);
+    }
+
+    return m_CtrlPoints.Remove(ctrl_point);
+}
+