• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /* -*- Mode: C; tab-width: 4 -*-
2  *
3  * Copyright (c) 2009 Apple Computer, Inc. All rights reserved.
4  *
5  * Licensed under the Apache License, Version 2.0 (the "License");
6  * you may not use this file except in compliance with the License.
7  * You may obtain a copy of the License at
8  *
9  *     http://www.apache.org/licenses/LICENSE-2.0
10  *
11  * Unless required by applicable law or agreed to in writing, software
12  * distributed under the License is distributed on an "AS IS" BASIS,
13  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14  * See the License for the specific language governing permissions and
15  * limitations under the License.
16  */
17 
18 
19 
20 #pragma once
21 
22 #include "resource.h"       // main symbols
23 
24 
25 
26 #include "DLLX.h"
27 
28 #include "DNSSDEventManager.h"
29 
30 #include <CommonServices.h>
31 
32 #include <DebugServices.h>
33 
34 #include <dns_sd.h>
35 
36 #include <map>
37 
38 
39 
40 
41 
42 #if defined(_WIN32_WCE) && !defined(_CE_DCOM) && !defined(_CE_ALLOW_SINGLE_THREADED_OBJECTS_IN_MTA)
43 
44 #error "Single-threaded COM objects are not properly supported on Windows CE platform, such as the Windows Mobile platforms that do not include full DCOM support. Define _CE_ALLOW_SINGLE_THREADED_OBJECTS_IN_MTA to force ATL to support creating single-thread COM object's and allow use of it's single-threaded COM object implementations. The threading model in your rgs file was set to 'Free' as that is the only threading model supported in non DCOM Windows CE platforms."
45 
46 #endif
47 
48 
49 
50 
51 
52 
53 
54 // CDNSSDService
55 
56 
57 
58 class ATL_NO_VTABLE CDNSSDService :
59 
60 	public CComObjectRootEx<CComSingleThreadModel>,
61 
62 	public CComCoClass<CDNSSDService, &CLSID_DNSSDService>,
63 
64 	public IDispatchImpl<IDNSSDService, &IID_IDNSSDService, &LIBID_Bonjour, /*wMajor =*/ 1, /*wMinor =*/ 0>
65 
66 {
67 
68 public:
69 
70 
71 
72 	typedef CComObjectRootEx<CComSingleThreadModel> Super;
73 
74 
75 
CDNSSDService()76 	CDNSSDService()
77 
78 	:
79 
80 		m_isPrimary( FALSE ),
81 
82 		m_eventManager( NULL ),
83 
84 		m_stopped( FALSE ),
85 
86 		m_primary( NULL ),
87 
88 		m_subord( NULL )
89 
90 	{
91 
92 	}
93 
94 
95 
96 DECLARE_REGISTRY_RESOURCEID(IDR_DNSSDSERVICE)
97 
98 
99 
100 
101 
102 BEGIN_COM_MAP(CDNSSDService)
103 
104 	COM_INTERFACE_ENTRY(IDNSSDService)
105 
106 	COM_INTERFACE_ENTRY(IDispatch)
107 
108 END_COM_MAP()
109 
110 
111 
112 	DECLARE_PROTECT_FINAL_CONSTRUCT()
113 
114 
115 
116 	HRESULT
117 
118 	FinalConstruct();
119 
120 
121 
122 	void
123 
124 	FinalRelease();
125 
126 
127 
128 public:
129 
130 
131 
132 	inline DNSServiceRef
133 
GetPrimaryRef()134 	GetPrimaryRef()
135 
136 	{
137 
138 		return m_primary;
139 
140 	}
141 
142 
143 
144 	inline void
145 
SetPrimaryRef(DNSServiceRef primary)146 	SetPrimaryRef( DNSServiceRef primary )
147 
148 	{
149 
150 		m_primary = primary;
151 
152 	}
153 
154 
155 
156 	inline DNSServiceRef
157 
GetSubordRef()158 	GetSubordRef()
159 
160 	{
161 
162 		return m_subord;
163 
164 	}
165 
166 
167 
168 	inline void
169 
SetSubordRef(DNSServiceRef subord)170 	SetSubordRef( DNSServiceRef subord )
171 
172 	{
173 
174 		m_subord = subord;
175 
176 	}
177 
178 
179 
180 	inline CDNSSDEventManager*
181 
GetEventManager()182 	GetEventManager()
183 
184 	{
185 
186 		return m_eventManager;
187 
188 	}
189 
190 
191 
192 	inline void
193 
SetEventManager(IDNSSDEventManager * eventManager)194 	SetEventManager( IDNSSDEventManager * eventManager )
195 
196 	{
197 
198 		if ( m_eventManager )
199 
200 		{
201 
202 			m_eventManager->Release();
203 
204 			m_eventManager = NULL;
205 
206 		}
207 
208 
209 
210 		if ( eventManager )
211 
212 		{
213 
214 			m_eventManager = dynamic_cast< CDNSSDEventManager* >( eventManager );
215 
216 			check( m_eventManager );
217 
218 			m_eventManager->AddRef();
219 
220 		}
221 
222 	}
223 
224 
225 
226 	inline BOOL
227 
Stopped()228 	Stopped()
229 
230 	{
231 
232 		return m_stopped;
233 
234 	}
235 
236 
237 
238 private:
239 
240 
241 
242 	static void DNSSD_API
243 	DomainEnumReply
244 		(
245 		DNSServiceRef                       sdRef,
246 		DNSServiceFlags                     flags,
247 		uint32_t                            ifIndex,
248 		DNSServiceErrorType                 errorCode,
249 		const char                          *replyDomain,
250 		void                                *context
251 		);
252 
253 
254 
255 	static void DNSSD_API
256 	BrowseReply
257 		(
258 		DNSServiceRef                       sdRef,
259 		DNSServiceFlags                     flags,
260 		uint32_t                            interfaceIndex,
261 		DNSServiceErrorType                 errorCode,
262 		const char                          *serviceName,
263 		const char                          *regtype,
264 		const char                          *replyDomain,
265 		void                                *context
266 		);
267 
268 
269 
270 	static void DNSSD_API
271 
272 	ResolveReply
273 
274 		(
275 		DNSServiceRef                       sdRef,
276 		DNSServiceFlags                     flags,
277 		uint32_t                            interfaceIndex,
278 		DNSServiceErrorType                 errorCode,
279 		const char                          *fullname,
280 		const char                          *hosttarget,
281 		uint16_t                            port,
282 		uint16_t                            txtLen,
283 		const unsigned char                 *txtRecord,
284 		void                                *context
285 
286 		);
287 
288 
289 
290 	static void DNSSD_API
291 	RegisterReply
292 		(
293 		DNSServiceRef                       sdRef,
294 		DNSServiceFlags                     flags,
295 		DNSServiceErrorType                 errorCode,
296 		const char                          *name,
297 		const char                          *regtype,
298 		const char                          *domain,
299 		void                                *context
300 		);
301 
302 
303 
304 	static void DNSSD_API
305 	QueryRecordReply
306 		(
307 		DNSServiceRef                       sdRef,
308 		DNSServiceFlags                     flags,
309 		uint32_t                            interfaceIndex,
310 		DNSServiceErrorType                 errorCode,
311 		const char                          *fullname,
312 		uint16_t                            rrtype,
313 		uint16_t                            rrclass,
314 		uint16_t                            rdlen,
315 		const void                          *rdata,
316 		uint32_t                            ttl,
317 		void                                *context
318 		);
319 
320 
321 
322 	static void DNSSD_API
323     GetAddrInfoReply
324 		(
325 		DNSServiceRef                    sdRef,
326 		DNSServiceFlags                  flags,
327 		uint32_t                         interfaceIndex,
328 		DNSServiceErrorType              errorCode,
329 		const char                       *hostname,
330 		const struct sockaddr            *address,
331 		uint32_t                         ttl,
332 		void                             *context
333 		);
334 
335 
336 
337 	static void DNSSD_API
338 	NATPortMappingReply
339 		(
340 		DNSServiceRef                    sdRef,
341 		DNSServiceFlags                  flags,
342 		uint32_t                         interfaceIndex,
343 		DNSServiceErrorType              errorCode,
344 		uint32_t                         externalAddress,   /* four byte IPv4 address in network byte order */
345 		DNSServiceProtocol               protocol,
346 		uint16_t                         internalPort,
347 		uint16_t                         externalPort,      /* may be different than the requested port     */
348 		uint32_t                         ttl,               /* may be different than the requested ttl      */
349 		void                             *context
350 		);
351 
352 
353 
354 	static void DNSSD_API
355 	RegisterRecordReply
356 		(
357 		DNSServiceRef                       sdRef,
358 		DNSRecordRef                        RecordRef,
359 		DNSServiceFlags                     flags,
360 		DNSServiceErrorType                 errorCode,
361 		void                                *context
362 		);
363 
364 
365 
366 	inline BOOL
367 
368 	ShouldHandleReply( DNSServiceErrorType errorCode, CDNSSDEventManager *& eventManager );
369 
370 
371 
372 	static LRESULT CALLBACK
373 
374 	WndProc( HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam );
375 
376 
377 
378 	typedef std::map< SOCKET, CDNSSDService* > SocketMap;
379 
380 
381 
382 	static BOOL				m_registeredWindowClass;
383 
384 	static HWND				m_hiddenWindow;
385 
386 	static SocketMap		m_socketMap;
387 
388 	CDNSSDEventManager	*	m_eventManager;
389 
390 	BOOL					m_stopped;
391 
392 	BOOL					m_isPrimary;
393 
394 	DNSServiceRef			m_primary;
395 
396 	DNSServiceRef			m_subord;
397 
398 public:
399 
400 	STDMETHOD(EnumerateDomains)(DNSSDFlags flags, ULONG ifIndex, IDNSSDEventManager *eventManager, IDNSSDService **service);
401 
402 	STDMETHOD(Browse)(DNSSDFlags flags, ULONG interfaceIndex, BSTR regtype, BSTR domain, IDNSSDEventManager* eventManager, IDNSSDService** sdref);
403 
404 	STDMETHOD(Resolve)(DNSSDFlags flags, ULONG ifIndex, BSTR serviceName, BSTR regType, BSTR domain, IDNSSDEventManager* eventManager, IDNSSDService** service);
405 
406 	STDMETHOD(Register)(DNSSDFlags flags, ULONG ifIndex, BSTR name, BSTR regType, BSTR domain, BSTR host, USHORT port, ITXTRecord *record, IDNSSDEventManager *eventManager, IDNSSDService **service);
407 
408 	STDMETHOD(QueryRecord)(DNSSDFlags flags, ULONG ifIndex, BSTR fullname, DNSSDRRType rrtype, DNSSDRRClass rrclass, IDNSSDEventManager *eventManager, IDNSSDService **service);
409 
410 	STDMETHOD(RegisterRecord)(DNSSDFlags flags, ULONG ifIndex, BSTR fullname, DNSSDRRType rrtype, DNSSDRRClass rrclass, VARIANT rdata, ULONG ttl, IDNSSDEventManager* eventManager, IDNSSDRecord** record);
411 
412 	STDMETHOD(AddRecord)(DNSSDFlags flags, DNSSDRRType rrtype, VARIANT rdata, ULONG ttl, IDNSSDRecord ** record);
413 
414 	STDMETHOD(ReconfirmRecord)(DNSSDFlags flags, ULONG ifIndex, BSTR fullname, DNSSDRRType rrtype, DNSSDRRClass rrclass, VARIANT rdata);
415 
416 	STDMETHOD(GetProperty)(BSTR prop, VARIANT * value);
417 
418 	STDMETHOD(GetAddrInfo)(DNSSDFlags flags, ULONG ifIndex, DNSSDAddressFamily addressFamily, BSTR hostname, IDNSSDEventManager *eventManager, IDNSSDService **service);
419 
420 	STDMETHOD(NATPortMappingCreate)(DNSSDFlags flags, ULONG ifIndex, DNSSDAddressFamily addressFamily, DNSSDProtocol protocol, USHORT internalPort, USHORT externalPort, ULONG ttl, IDNSSDEventManager *eventManager, IDNSSDService **service);
421 
422 	STDMETHOD(Stop)(void);
423 
424 };
425 
426 
427 
428 OBJECT_ENTRY_AUTO(__uuidof(DNSSDService), CDNSSDService)
429 
430