Mercurial > projects > hoofbaby
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 |