comparison 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
comparison
equal deleted inserted replaced
-1:000000000000 0:3425707ddbf6
1 /*****************************************************************
2 |
3 | Platinum - UPnP Engine
4 |
5 | Copyright (c) 2004-2008, Plutinosoft, LLC.
6 | All rights reserved.
7 | http://www.plutinosoft.com
8 |
9 | This program is free software; you can redistribute it and/or
10 | modify it under the terms of the GNU General Public License
11 | as published by the Free Software Foundation; either version 2
12 | of the License, or (at your option) any later version.
13 |
14 | OEMs, ISVs, VARs and other distributors that combine and
15 | distribute commercially licensed software with Platinum software
16 | and do not wish to distribute the source code for the commercially
17 | licensed software under version 2, or (at your option) any later
18 | version, of the GNU General Public License (the "GPL") must enter
19 | into a commercial license agreement with Plutinosoft, LLC.
20 |
21 | This program is distributed in the hope that it will be useful,
22 | but WITHOUT ANY WARRANTY; without even the implied warranty of
23 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
24 | GNU General Public License for more details.
25 |
26 | You should have received a copy of the GNU General Public License
27 | along with this program; see the file LICENSE.txt. If not, write to
28 | the Free Software Foundation, Inc.,
29 | 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
30 | http://www.gnu.org/licenses/gpl-2.0.html
31 |
32 ****************************************************************/
33
34 /*----------------------------------------------------------------------
35 | includes
36 +---------------------------------------------------------------------*/
37 #include "Neptune.h"
38 #include "PltVersion.h"
39 #include "PltUPnP.h"
40 #include "PltDeviceHost.h"
41 #include "PltCtrlPoint.h"
42 #include "PltSsdp.h"
43
44 NPT_SET_LOCAL_LOGGER("platinum.core.upnp")
45
46 /*----------------------------------------------------------------------
47 | PLT_UPnP_CtrlPointStartIterator class
48 +---------------------------------------------------------------------*/
49 class PLT_UPnP_CtrlPointStartIterator
50 {
51 public:
52 PLT_UPnP_CtrlPointStartIterator(PLT_SsdpListenTask* listen_task) :
53 m_ListenTask(listen_task) {}
54 virtual ~PLT_UPnP_CtrlPointStartIterator() {}
55
56 NPT_Result operator()(PLT_CtrlPointReference& ctrl_point) const {
57 NPT_CHECK_SEVERE(ctrl_point->Start(m_ListenTask));
58 return NPT_SUCCESS;
59 }
60
61 private:
62 PLT_SsdpListenTask* m_ListenTask;
63 };
64
65 /*----------------------------------------------------------------------
66 | PLT_UPnP_CtrlPointStopIterator class
67 +---------------------------------------------------------------------*/
68 class PLT_UPnP_CtrlPointStopIterator
69 {
70 public:
71 PLT_UPnP_CtrlPointStopIterator(PLT_SsdpListenTask* listen_task) :
72 m_ListenTask(listen_task) {}
73 virtual ~PLT_UPnP_CtrlPointStopIterator() {}
74
75 NPT_Result operator()(PLT_CtrlPointReference& ctrl_point) const {
76 return ctrl_point->Stop(m_ListenTask);
77 }
78
79
80 private:
81 PLT_SsdpListenTask* m_ListenTask;
82 };
83
84 /*----------------------------------------------------------------------
85 | PLT_UPnP_DeviceStartIterator class
86 +---------------------------------------------------------------------*/
87 class PLT_UPnP_DeviceStartIterator
88 {
89 public:
90 PLT_UPnP_DeviceStartIterator(PLT_SsdpListenTask* listen_task) :
91 m_ListenTask(listen_task) {}
92 virtual ~PLT_UPnP_DeviceStartIterator() {}
93
94 NPT_Result operator()(PLT_DeviceHostReference& device_host) const {
95 NPT_CHECK_SEVERE(device_host->Start(m_ListenTask));
96 return NPT_SUCCESS;
97 }
98
99 private:
100 PLT_SsdpListenTask* m_ListenTask;
101 };
102
103 /*----------------------------------------------------------------------
104 | PLT_UPnP_DeviceStopIterator class
105 +---------------------------------------------------------------------*/
106 class PLT_UPnP_DeviceStopIterator
107 {
108 public:
109 PLT_UPnP_DeviceStopIterator(PLT_SsdpListenTask* listen_task) :
110 m_ListenTask(listen_task) {}
111 virtual ~PLT_UPnP_DeviceStopIterator() {}
112
113 NPT_Result operator()(PLT_DeviceHostReference& device_host) const {
114 return device_host->Stop(m_ListenTask);
115 }
116
117
118 private:
119 PLT_SsdpListenTask* m_ListenTask;
120 };
121
122 /*----------------------------------------------------------------------
123 | PLT_UPnP::PLT_UPnP
124 +---------------------------------------------------------------------*/
125 PLT_UPnP::PLT_UPnP(NPT_UInt32 port, bool multicast /* = true */) :
126 m_Started(false),
127 m_Port(port),
128 m_Multicast(multicast),
129 m_SsdpListenTask(NULL)
130 {
131 NPT_HttpClient::m_UserAgentHeader = "Platinum/" PLT_PLATINUM_VERSION_STRING;
132 NPT_HttpServer::m_ServerHeader = "UPnP/1.0, Platinum/" PLT_PLATINUM_VERSION_STRING;
133 }
134
135 /*----------------------------------------------------------------------
136 | PLT_UPnP::~PLT_UPnP
137 +---------------------------------------------------------------------*/
138 PLT_UPnP::~PLT_UPnP()
139 {
140 Stop();
141
142 m_CtrlPoints.Clear();
143 m_Devices.Clear();
144 }
145
146 /*----------------------------------------------------------------------
147 | PLT_UPnP::Start()
148 +---------------------------------------------------------------------*/
149 NPT_Result
150 PLT_UPnP::Start()
151 {
152 NPT_LOG_INFO("Starting UPnP...");
153
154 NPT_AutoLock lock(m_Lock);
155
156 if (m_Started == true) return NPT_FAILURE;
157
158 NPT_Socket* socket = m_Multicast?new NPT_UdpMulticastSocket(): new NPT_UdpSocket();
159 NPT_CHECK_SEVERE(socket->Bind(NPT_SocketAddress(NPT_IpAddress::Any, m_Port)));
160
161 /* create the ssdp listener */
162 m_SsdpListenTask = new PLT_SsdpListenTask(socket, m_Multicast);
163 NPT_CHECK_SEVERE(m_TaskManager.StartTask(m_SsdpListenTask));
164
165 /* start devices & ctrlpoints */
166 m_CtrlPoints.Apply(PLT_UPnP_CtrlPointStartIterator(m_SsdpListenTask));
167 m_Devices.Apply(PLT_UPnP_DeviceStartIterator(m_SsdpListenTask));
168
169 m_Started = true;
170 return NPT_SUCCESS;
171 }
172
173 /*----------------------------------------------------------------------
174 | PLT_UPnP::Stop
175 +---------------------------------------------------------------------*/
176 NPT_Result
177 PLT_UPnP::Stop()
178 {
179 NPT_AutoLock lock(m_Lock);
180
181 if (m_Started == false) return NPT_FAILURE;
182
183 NPT_LOG_INFO("Stopping UPnP...");
184
185 // Stop ctrlpoints and devices first
186 m_CtrlPoints.Apply(PLT_UPnP_CtrlPointStopIterator(m_SsdpListenTask));
187 m_Devices.Apply(PLT_UPnP_DeviceStopIterator(m_SsdpListenTask));
188
189 m_TaskManager.StopAllTasks();
190 m_SsdpListenTask = NULL;
191
192 m_Started = false;
193 return NPT_SUCCESS;
194 }
195
196 /*----------------------------------------------------------------------
197 | PLT_UPnP::AddDevice
198 +---------------------------------------------------------------------*/
199 NPT_Result
200 PLT_UPnP::AddDevice(PLT_DeviceHostReference& device)
201 {
202 NPT_AutoLock lock(m_Lock);
203
204 if (m_Started) {
205 NPT_LOG_INFO("Starting Device...");
206 NPT_CHECK_SEVERE(device->Start(m_SsdpListenTask));
207 }
208
209 m_Devices.Add(device);
210 return NPT_SUCCESS;
211 }
212
213 /*----------------------------------------------------------------------
214 | PLT_UPnP::RemoveDevice
215 +---------------------------------------------------------------------*/
216 NPT_Result
217 PLT_UPnP::RemoveDevice(PLT_DeviceHostReference& device)
218 {
219 NPT_AutoLock lock(m_Lock);
220
221 if (m_Started) {
222 device->Stop(m_SsdpListenTask);
223 }
224
225 return m_Devices.Remove(device);
226 }
227
228 /*----------------------------------------------------------------------
229 | PLT_UPnP::AddCtrlPoint
230 +---------------------------------------------------------------------*/
231 NPT_Result
232 PLT_UPnP::AddCtrlPoint(PLT_CtrlPointReference& ctrl_point)
233 {
234 NPT_AutoLock lock(m_Lock);
235
236 if (m_Started) {
237 NPT_LOG_INFO("Starting Ctrlpoint...");
238 NPT_CHECK_SEVERE(ctrl_point->Start(m_SsdpListenTask));
239 }
240
241 m_CtrlPoints.Add(ctrl_point);
242 return NPT_SUCCESS;
243 }
244
245 /*----------------------------------------------------------------------
246 | PLT_UPnP::RemoveCtrlPoint
247 +---------------------------------------------------------------------*/
248 NPT_Result
249 PLT_UPnP::RemoveCtrlPoint(PLT_CtrlPointReference& ctrl_point)
250 {
251 NPT_AutoLock lock(m_Lock);
252
253 if (m_Started) {
254 ctrl_point->Stop(m_SsdpListenTask);
255 }
256
257 return m_CtrlPoints.Remove(ctrl_point);
258 }
259