xref: /aosp_15_r20/external/mdnsresponder/mDNSWindows/DLLX/DNSSDService.cpp (revision 48a54d368dc4fa860885eef7b70b6c53499e7c25)
1*48a54d36SAndroid Build Coastguard Worker /* -*- Mode: C; tab-width: 4 -*-
2*48a54d36SAndroid Build Coastguard Worker  *
3*48a54d36SAndroid Build Coastguard Worker  * Copyright (c) 2009 Apple Computer, Inc. All rights reserved.
4*48a54d36SAndroid Build Coastguard Worker  *
5*48a54d36SAndroid Build Coastguard Worker  * Licensed under the Apache License, Version 2.0 (the "License");
6*48a54d36SAndroid Build Coastguard Worker  * you may not use this file except in compliance with the License.
7*48a54d36SAndroid Build Coastguard Worker  * You may obtain a copy of the License at
8*48a54d36SAndroid Build Coastguard Worker  *
9*48a54d36SAndroid Build Coastguard Worker  *     http://www.apache.org/licenses/LICENSE-2.0
10*48a54d36SAndroid Build Coastguard Worker  *
11*48a54d36SAndroid Build Coastguard Worker  * Unless required by applicable law or agreed to in writing, software
12*48a54d36SAndroid Build Coastguard Worker  * distributed under the License is distributed on an "AS IS" BASIS,
13*48a54d36SAndroid Build Coastguard Worker  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14*48a54d36SAndroid Build Coastguard Worker  * See the License for the specific language governing permissions and
15*48a54d36SAndroid Build Coastguard Worker  * limitations under the License.
16*48a54d36SAndroid Build Coastguard Worker  */
17*48a54d36SAndroid Build Coastguard Worker 
18*48a54d36SAndroid Build Coastguard Worker 
19*48a54d36SAndroid Build Coastguard Worker 
20*48a54d36SAndroid Build Coastguard Worker #pragma warning(disable:4995)
21*48a54d36SAndroid Build Coastguard Worker 
22*48a54d36SAndroid Build Coastguard Worker 
23*48a54d36SAndroid Build Coastguard Worker 
24*48a54d36SAndroid Build Coastguard Worker #include "stdafx.h"
25*48a54d36SAndroid Build Coastguard Worker 
26*48a54d36SAndroid Build Coastguard Worker #include <strsafe.h>
27*48a54d36SAndroid Build Coastguard Worker 
28*48a54d36SAndroid Build Coastguard Worker #include "DNSSDService.h"
29*48a54d36SAndroid Build Coastguard Worker 
30*48a54d36SAndroid Build Coastguard Worker #include "DNSSDEventManager.h"
31*48a54d36SAndroid Build Coastguard Worker 
32*48a54d36SAndroid Build Coastguard Worker #include "DNSSDRecord.h"
33*48a54d36SAndroid Build Coastguard Worker 
34*48a54d36SAndroid Build Coastguard Worker #include "TXTRecord.h"
35*48a54d36SAndroid Build Coastguard Worker 
36*48a54d36SAndroid Build Coastguard Worker #include "StringServices.h"
37*48a54d36SAndroid Build Coastguard Worker 
38*48a54d36SAndroid Build Coastguard Worker #include <DebugServices.h>
39*48a54d36SAndroid Build Coastguard Worker 
40*48a54d36SAndroid Build Coastguard Worker 
41*48a54d36SAndroid Build Coastguard Worker 
42*48a54d36SAndroid Build Coastguard Worker 
43*48a54d36SAndroid Build Coastguard Worker 
44*48a54d36SAndroid Build Coastguard Worker #define WM_SOCKET (WM_APP + 100)
45*48a54d36SAndroid Build Coastguard Worker 
46*48a54d36SAndroid Build Coastguard Worker 
47*48a54d36SAndroid Build Coastguard Worker 
48*48a54d36SAndroid Build Coastguard Worker 
49*48a54d36SAndroid Build Coastguard Worker 
50*48a54d36SAndroid Build Coastguard Worker // CDNSSDService
51*48a54d36SAndroid Build Coastguard Worker 
52*48a54d36SAndroid Build Coastguard Worker 
53*48a54d36SAndroid Build Coastguard Worker 
54*48a54d36SAndroid Build Coastguard Worker BOOL						CDNSSDService::m_registeredWindowClass	= FALSE;
55*48a54d36SAndroid Build Coastguard Worker 
56*48a54d36SAndroid Build Coastguard Worker HWND						CDNSSDService::m_hiddenWindow			= NULL;
57*48a54d36SAndroid Build Coastguard Worker 
58*48a54d36SAndroid Build Coastguard Worker CDNSSDService::SocketMap	CDNSSDService::m_socketMap;
59*48a54d36SAndroid Build Coastguard Worker 
60*48a54d36SAndroid Build Coastguard Worker 
61*48a54d36SAndroid Build Coastguard Worker 
62*48a54d36SAndroid Build Coastguard Worker 
63*48a54d36SAndroid Build Coastguard Worker 
FinalConstruct()64*48a54d36SAndroid Build Coastguard Worker HRESULT CDNSSDService::FinalConstruct()
65*48a54d36SAndroid Build Coastguard Worker 
66*48a54d36SAndroid Build Coastguard Worker {
67*48a54d36SAndroid Build Coastguard Worker 
68*48a54d36SAndroid Build Coastguard Worker 	DNSServiceErrorType	err	= 0;
69*48a54d36SAndroid Build Coastguard Worker 
70*48a54d36SAndroid Build Coastguard Worker 	HRESULT				hr	= S_OK;
71*48a54d36SAndroid Build Coastguard Worker 
72*48a54d36SAndroid Build Coastguard Worker 
73*48a54d36SAndroid Build Coastguard Worker 
74*48a54d36SAndroid Build Coastguard Worker 	m_isPrimary = TRUE;
75*48a54d36SAndroid Build Coastguard Worker 
76*48a54d36SAndroid Build Coastguard Worker 	err = DNSServiceCreateConnection( &m_primary );
77*48a54d36SAndroid Build Coastguard Worker 
78*48a54d36SAndroid Build Coastguard Worker 	require_action( !err, exit, hr = E_FAIL );
79*48a54d36SAndroid Build Coastguard Worker 
80*48a54d36SAndroid Build Coastguard Worker 
81*48a54d36SAndroid Build Coastguard Worker 
82*48a54d36SAndroid Build Coastguard Worker 	if ( !m_hiddenWindow )
83*48a54d36SAndroid Build Coastguard Worker 
84*48a54d36SAndroid Build Coastguard Worker 	{
85*48a54d36SAndroid Build Coastguard Worker 
86*48a54d36SAndroid Build Coastguard Worker 		TCHAR windowClassName[ 256 ];
87*48a54d36SAndroid Build Coastguard Worker 
88*48a54d36SAndroid Build Coastguard Worker 
89*48a54d36SAndroid Build Coastguard Worker 
90*48a54d36SAndroid Build Coastguard Worker 		StringCchPrintf( windowClassName, sizeof( windowClassName ) / sizeof( TCHAR ), TEXT( "Bonjour Hidden Window %d" ), GetProcessId( NULL ) );
91*48a54d36SAndroid Build Coastguard Worker 
92*48a54d36SAndroid Build Coastguard Worker 
93*48a54d36SAndroid Build Coastguard Worker 
94*48a54d36SAndroid Build Coastguard Worker 		if ( !m_registeredWindowClass )
95*48a54d36SAndroid Build Coastguard Worker 
96*48a54d36SAndroid Build Coastguard Worker 		{
97*48a54d36SAndroid Build Coastguard Worker 
98*48a54d36SAndroid Build Coastguard Worker 			WNDCLASS	wc;
99*48a54d36SAndroid Build Coastguard Worker 
100*48a54d36SAndroid Build Coastguard Worker 			ATOM		atom;
101*48a54d36SAndroid Build Coastguard Worker 
102*48a54d36SAndroid Build Coastguard Worker 
103*48a54d36SAndroid Build Coastguard Worker 
104*48a54d36SAndroid Build Coastguard Worker 			wc.style			= 0;
105*48a54d36SAndroid Build Coastguard Worker 
106*48a54d36SAndroid Build Coastguard Worker 			wc.lpfnWndProc		= WndProc;
107*48a54d36SAndroid Build Coastguard Worker 
108*48a54d36SAndroid Build Coastguard Worker 			wc.cbClsExtra		= 0;
109*48a54d36SAndroid Build Coastguard Worker 
110*48a54d36SAndroid Build Coastguard Worker 			wc.cbWndExtra		= 0;
111*48a54d36SAndroid Build Coastguard Worker 
112*48a54d36SAndroid Build Coastguard Worker 			wc.hInstance		= NULL;
113*48a54d36SAndroid Build Coastguard Worker 
114*48a54d36SAndroid Build Coastguard Worker 			wc.hIcon			= NULL;
115*48a54d36SAndroid Build Coastguard Worker 
116*48a54d36SAndroid Build Coastguard Worker 			wc.hCursor			= NULL;
117*48a54d36SAndroid Build Coastguard Worker 
118*48a54d36SAndroid Build Coastguard Worker 			wc.hbrBackground	= NULL;
119*48a54d36SAndroid Build Coastguard Worker 
120*48a54d36SAndroid Build Coastguard Worker 			wc.lpszMenuName		= NULL;
121*48a54d36SAndroid Build Coastguard Worker 
122*48a54d36SAndroid Build Coastguard Worker 			wc.lpszClassName	= windowClassName;
123*48a54d36SAndroid Build Coastguard Worker 
124*48a54d36SAndroid Build Coastguard Worker 
125*48a54d36SAndroid Build Coastguard Worker 
126*48a54d36SAndroid Build Coastguard Worker 			atom = RegisterClass(&wc);
127*48a54d36SAndroid Build Coastguard Worker 
128*48a54d36SAndroid Build Coastguard Worker 			require_action( atom != NULL, exit, hr = E_FAIL );
129*48a54d36SAndroid Build Coastguard Worker 
130*48a54d36SAndroid Build Coastguard Worker 
131*48a54d36SAndroid Build Coastguard Worker 
132*48a54d36SAndroid Build Coastguard Worker 			m_registeredWindowClass = TRUE;
133*48a54d36SAndroid Build Coastguard Worker 
134*48a54d36SAndroid Build Coastguard Worker 		}
135*48a54d36SAndroid Build Coastguard Worker 
136*48a54d36SAndroid Build Coastguard Worker 
137*48a54d36SAndroid Build Coastguard Worker 
138*48a54d36SAndroid Build Coastguard Worker 		m_hiddenWindow = CreateWindow( windowClassName, windowClassName, WS_OVERLAPPED, 0, 0, 0, 0, NULL, NULL, GetModuleHandle( NULL ), NULL );
139*48a54d36SAndroid Build Coastguard Worker 
140*48a54d36SAndroid Build Coastguard Worker 		require_action( m_hiddenWindow != NULL, exit, hr = E_FAIL );
141*48a54d36SAndroid Build Coastguard Worker 
142*48a54d36SAndroid Build Coastguard Worker 	}
143*48a54d36SAndroid Build Coastguard Worker 
144*48a54d36SAndroid Build Coastguard Worker 
145*48a54d36SAndroid Build Coastguard Worker 
146*48a54d36SAndroid Build Coastguard Worker 	err = WSAAsyncSelect( DNSServiceRefSockFD( m_primary ), m_hiddenWindow, WM_SOCKET, FD_READ );
147*48a54d36SAndroid Build Coastguard Worker 
148*48a54d36SAndroid Build Coastguard Worker 	require_action( !err, exit, hr = E_FAIL );
149*48a54d36SAndroid Build Coastguard Worker 
150*48a54d36SAndroid Build Coastguard Worker 
151*48a54d36SAndroid Build Coastguard Worker 
152*48a54d36SAndroid Build Coastguard Worker 	m_socketMap[ DNSServiceRefSockFD( m_primary ) ] = this;
153*48a54d36SAndroid Build Coastguard Worker 
154*48a54d36SAndroid Build Coastguard Worker 
155*48a54d36SAndroid Build Coastguard Worker 
156*48a54d36SAndroid Build Coastguard Worker exit:
157*48a54d36SAndroid Build Coastguard Worker 
158*48a54d36SAndroid Build Coastguard Worker 
159*48a54d36SAndroid Build Coastguard Worker 
160*48a54d36SAndroid Build Coastguard Worker 	return hr;
161*48a54d36SAndroid Build Coastguard Worker 
162*48a54d36SAndroid Build Coastguard Worker }
163*48a54d36SAndroid Build Coastguard Worker 
164*48a54d36SAndroid Build Coastguard Worker 
165*48a54d36SAndroid Build Coastguard Worker 
166*48a54d36SAndroid Build Coastguard Worker 
167*48a54d36SAndroid Build Coastguard Worker 
FinalRelease()168*48a54d36SAndroid Build Coastguard Worker void CDNSSDService::FinalRelease()
169*48a54d36SAndroid Build Coastguard Worker 
170*48a54d36SAndroid Build Coastguard Worker {
171*48a54d36SAndroid Build Coastguard Worker 
172*48a54d36SAndroid Build Coastguard Worker 	dlog( kDebugLevelTrace, "FinalRelease()\n" );
173*48a54d36SAndroid Build Coastguard Worker 
174*48a54d36SAndroid Build Coastguard Worker 	Stop();
175*48a54d36SAndroid Build Coastguard Worker 
176*48a54d36SAndroid Build Coastguard Worker }
177*48a54d36SAndroid Build Coastguard Worker 
178*48a54d36SAndroid Build Coastguard Worker 
179*48a54d36SAndroid Build Coastguard Worker 
180*48a54d36SAndroid Build Coastguard Worker 
181*48a54d36SAndroid Build Coastguard Worker 
EnumerateDomains(DNSSDFlags flags,ULONG ifIndex,IDNSSDEventManager * eventManager,IDNSSDService ** service)182*48a54d36SAndroid Build Coastguard Worker STDMETHODIMP CDNSSDService::EnumerateDomains(DNSSDFlags flags, ULONG ifIndex, IDNSSDEventManager *eventManager, IDNSSDService **service)
183*48a54d36SAndroid Build Coastguard Worker 
184*48a54d36SAndroid Build Coastguard Worker {
185*48a54d36SAndroid Build Coastguard Worker 
186*48a54d36SAndroid Build Coastguard Worker 	CComObject<CDNSSDService>	*	object	= NULL;
187*48a54d36SAndroid Build Coastguard Worker 
188*48a54d36SAndroid Build Coastguard Worker 	DNSServiceRef					subord	= NULL;
189*48a54d36SAndroid Build Coastguard Worker 
190*48a54d36SAndroid Build Coastguard Worker 	DNSServiceErrorType				err		= 0;
191*48a54d36SAndroid Build Coastguard Worker 
192*48a54d36SAndroid Build Coastguard Worker 	HRESULT							hr		= 0;
193*48a54d36SAndroid Build Coastguard Worker 
194*48a54d36SAndroid Build Coastguard Worker 
195*48a54d36SAndroid Build Coastguard Worker 
196*48a54d36SAndroid Build Coastguard Worker 	check( m_primary );
197*48a54d36SAndroid Build Coastguard Worker 
198*48a54d36SAndroid Build Coastguard Worker 
199*48a54d36SAndroid Build Coastguard Worker 
200*48a54d36SAndroid Build Coastguard Worker 	// Initialize
201*48a54d36SAndroid Build Coastguard Worker 
202*48a54d36SAndroid Build Coastguard Worker 	*service = NULL;
203*48a54d36SAndroid Build Coastguard Worker 
204*48a54d36SAndroid Build Coastguard Worker 
205*48a54d36SAndroid Build Coastguard Worker 
206*48a54d36SAndroid Build Coastguard Worker 	try
207*48a54d36SAndroid Build Coastguard Worker 
208*48a54d36SAndroid Build Coastguard Worker 	{
209*48a54d36SAndroid Build Coastguard Worker 
210*48a54d36SAndroid Build Coastguard Worker 		object = new CComObject<CDNSSDService>();
211*48a54d36SAndroid Build Coastguard Worker 
212*48a54d36SAndroid Build Coastguard Worker 	}
213*48a54d36SAndroid Build Coastguard Worker 
214*48a54d36SAndroid Build Coastguard Worker 	catch ( ... )
215*48a54d36SAndroid Build Coastguard Worker 
216*48a54d36SAndroid Build Coastguard Worker 	{
217*48a54d36SAndroid Build Coastguard Worker 
218*48a54d36SAndroid Build Coastguard Worker 		object = NULL;
219*48a54d36SAndroid Build Coastguard Worker 
220*48a54d36SAndroid Build Coastguard Worker 	}
221*48a54d36SAndroid Build Coastguard Worker 
222*48a54d36SAndroid Build Coastguard Worker 
223*48a54d36SAndroid Build Coastguard Worker 
224*48a54d36SAndroid Build Coastguard Worker 	require_action( object != NULL, exit, err = kDNSServiceErr_NoMemory );
225*48a54d36SAndroid Build Coastguard Worker 
226*48a54d36SAndroid Build Coastguard Worker 	object->AddRef();
227*48a54d36SAndroid Build Coastguard Worker 
228*48a54d36SAndroid Build Coastguard Worker 
229*48a54d36SAndroid Build Coastguard Worker 
230*48a54d36SAndroid Build Coastguard Worker 	subord = m_primary;
231*48a54d36SAndroid Build Coastguard Worker 
232*48a54d36SAndroid Build Coastguard Worker 	err = DNSServiceEnumerateDomains( &subord, flags | kDNSServiceFlagsShareConnection, ifIndex, ( DNSServiceDomainEnumReply ) &DomainEnumReply, object );
233*48a54d36SAndroid Build Coastguard Worker 
234*48a54d36SAndroid Build Coastguard Worker 	require_noerr( err, exit );
235*48a54d36SAndroid Build Coastguard Worker 
236*48a54d36SAndroid Build Coastguard Worker 
237*48a54d36SAndroid Build Coastguard Worker 
238*48a54d36SAndroid Build Coastguard Worker 	object->SetPrimaryRef( m_primary );
239*48a54d36SAndroid Build Coastguard Worker 
240*48a54d36SAndroid Build Coastguard Worker 	object->SetSubordRef( subord );
241*48a54d36SAndroid Build Coastguard Worker 
242*48a54d36SAndroid Build Coastguard Worker 	object->SetEventManager( eventManager );
243*48a54d36SAndroid Build Coastguard Worker 
244*48a54d36SAndroid Build Coastguard Worker 
245*48a54d36SAndroid Build Coastguard Worker 
246*48a54d36SAndroid Build Coastguard Worker 	*service = object;
247*48a54d36SAndroid Build Coastguard Worker 
248*48a54d36SAndroid Build Coastguard Worker 
249*48a54d36SAndroid Build Coastguard Worker 
250*48a54d36SAndroid Build Coastguard Worker exit:
251*48a54d36SAndroid Build Coastguard Worker 
252*48a54d36SAndroid Build Coastguard Worker 
253*48a54d36SAndroid Build Coastguard Worker 
254*48a54d36SAndroid Build Coastguard Worker 	if ( err && object )
255*48a54d36SAndroid Build Coastguard Worker 
256*48a54d36SAndroid Build Coastguard Worker 	{
257*48a54d36SAndroid Build Coastguard Worker 
258*48a54d36SAndroid Build Coastguard Worker 		object->Release();
259*48a54d36SAndroid Build Coastguard Worker 
260*48a54d36SAndroid Build Coastguard Worker 	}
261*48a54d36SAndroid Build Coastguard Worker 
262*48a54d36SAndroid Build Coastguard Worker 
263*48a54d36SAndroid Build Coastguard Worker 
264*48a54d36SAndroid Build Coastguard Worker 	return err;
265*48a54d36SAndroid Build Coastguard Worker 
266*48a54d36SAndroid Build Coastguard Worker }
267*48a54d36SAndroid Build Coastguard Worker 
268*48a54d36SAndroid Build Coastguard Worker 
269*48a54d36SAndroid Build Coastguard Worker 
270*48a54d36SAndroid Build Coastguard Worker 
271*48a54d36SAndroid Build Coastguard Worker 
Browse(DNSSDFlags flags,ULONG ifIndex,BSTR regtype,BSTR domain,IDNSSDEventManager * eventManager,IDNSSDService ** service)272*48a54d36SAndroid Build Coastguard Worker STDMETHODIMP CDNSSDService::Browse(DNSSDFlags flags, ULONG ifIndex, BSTR regtype, BSTR domain, IDNSSDEventManager* eventManager, IDNSSDService** service )
273*48a54d36SAndroid Build Coastguard Worker 
274*48a54d36SAndroid Build Coastguard Worker {
275*48a54d36SAndroid Build Coastguard Worker 
276*48a54d36SAndroid Build Coastguard Worker 	CComObject<CDNSSDService>	*	object		= NULL;
277*48a54d36SAndroid Build Coastguard Worker 
278*48a54d36SAndroid Build Coastguard Worker 	std::string						regtypeUTF8;
279*48a54d36SAndroid Build Coastguard Worker 
280*48a54d36SAndroid Build Coastguard Worker 	std::string						domainUTF8;
281*48a54d36SAndroid Build Coastguard Worker 
282*48a54d36SAndroid Build Coastguard Worker 	DNSServiceRef					subord		= NULL;
283*48a54d36SAndroid Build Coastguard Worker 
284*48a54d36SAndroid Build Coastguard Worker 	DNSServiceErrorType				err			= 0;
285*48a54d36SAndroid Build Coastguard Worker 
286*48a54d36SAndroid Build Coastguard Worker 	HRESULT							hr			= 0;
287*48a54d36SAndroid Build Coastguard Worker 
288*48a54d36SAndroid Build Coastguard Worker 	BOOL							ok;
289*48a54d36SAndroid Build Coastguard Worker 
290*48a54d36SAndroid Build Coastguard Worker 
291*48a54d36SAndroid Build Coastguard Worker 
292*48a54d36SAndroid Build Coastguard Worker 	check( m_primary );
293*48a54d36SAndroid Build Coastguard Worker 
294*48a54d36SAndroid Build Coastguard Worker 
295*48a54d36SAndroid Build Coastguard Worker 
296*48a54d36SAndroid Build Coastguard Worker 	// Initialize
297*48a54d36SAndroid Build Coastguard Worker 
298*48a54d36SAndroid Build Coastguard Worker 	*service = NULL;
299*48a54d36SAndroid Build Coastguard Worker 
300*48a54d36SAndroid Build Coastguard Worker 
301*48a54d36SAndroid Build Coastguard Worker 
302*48a54d36SAndroid Build Coastguard Worker 	// Convert BSTR params to utf8
303*48a54d36SAndroid Build Coastguard Worker 
304*48a54d36SAndroid Build Coastguard Worker 	ok = BSTRToUTF8( regtype, regtypeUTF8 );
305*48a54d36SAndroid Build Coastguard Worker 
306*48a54d36SAndroid Build Coastguard Worker 	require_action( ok, exit, err = kDNSServiceErr_BadParam );
307*48a54d36SAndroid Build Coastguard Worker 
308*48a54d36SAndroid Build Coastguard Worker 	ok = BSTRToUTF8( domain, domainUTF8 );
309*48a54d36SAndroid Build Coastguard Worker 
310*48a54d36SAndroid Build Coastguard Worker 	require_action( ok, exit, err = kDNSServiceErr_BadParam );
311*48a54d36SAndroid Build Coastguard Worker 
312*48a54d36SAndroid Build Coastguard Worker 
313*48a54d36SAndroid Build Coastguard Worker 
314*48a54d36SAndroid Build Coastguard Worker 	try
315*48a54d36SAndroid Build Coastguard Worker 
316*48a54d36SAndroid Build Coastguard Worker 	{
317*48a54d36SAndroid Build Coastguard Worker 
318*48a54d36SAndroid Build Coastguard Worker 		object = new CComObject<CDNSSDService>();
319*48a54d36SAndroid Build Coastguard Worker 
320*48a54d36SAndroid Build Coastguard Worker 	}
321*48a54d36SAndroid Build Coastguard Worker 
322*48a54d36SAndroid Build Coastguard Worker 	catch ( ... )
323*48a54d36SAndroid Build Coastguard Worker 
324*48a54d36SAndroid Build Coastguard Worker 	{
325*48a54d36SAndroid Build Coastguard Worker 
326*48a54d36SAndroid Build Coastguard Worker 		object = NULL;
327*48a54d36SAndroid Build Coastguard Worker 
328*48a54d36SAndroid Build Coastguard Worker 	}
329*48a54d36SAndroid Build Coastguard Worker 
330*48a54d36SAndroid Build Coastguard Worker 
331*48a54d36SAndroid Build Coastguard Worker 
332*48a54d36SAndroid Build Coastguard Worker 	require_action( object != NULL, exit, err = kDNSServiceErr_NoMemory );
333*48a54d36SAndroid Build Coastguard Worker 
334*48a54d36SAndroid Build Coastguard Worker 	object->AddRef();
335*48a54d36SAndroid Build Coastguard Worker 
336*48a54d36SAndroid Build Coastguard Worker 
337*48a54d36SAndroid Build Coastguard Worker 
338*48a54d36SAndroid Build Coastguard Worker 	subord = m_primary;
339*48a54d36SAndroid Build Coastguard Worker 
340*48a54d36SAndroid Build Coastguard Worker 	err = DNSServiceBrowse( &subord, flags | kDNSServiceFlagsShareConnection, ifIndex, regtypeUTF8.c_str(), ( domainUTF8.size() > 0 ) ? domainUTF8.c_str() : NULL, ( DNSServiceBrowseReply ) &BrowseReply, object );
341*48a54d36SAndroid Build Coastguard Worker 
342*48a54d36SAndroid Build Coastguard Worker 	require_noerr( err, exit );
343*48a54d36SAndroid Build Coastguard Worker 
344*48a54d36SAndroid Build Coastguard Worker 
345*48a54d36SAndroid Build Coastguard Worker 
346*48a54d36SAndroid Build Coastguard Worker 	object->SetPrimaryRef( m_primary );
347*48a54d36SAndroid Build Coastguard Worker 
348*48a54d36SAndroid Build Coastguard Worker 	object->SetSubordRef( subord );
349*48a54d36SAndroid Build Coastguard Worker 
350*48a54d36SAndroid Build Coastguard Worker 	object->SetEventManager( eventManager );
351*48a54d36SAndroid Build Coastguard Worker 
352*48a54d36SAndroid Build Coastguard Worker 
353*48a54d36SAndroid Build Coastguard Worker 
354*48a54d36SAndroid Build Coastguard Worker 	*service = object;
355*48a54d36SAndroid Build Coastguard Worker 
356*48a54d36SAndroid Build Coastguard Worker 
357*48a54d36SAndroid Build Coastguard Worker 
358*48a54d36SAndroid Build Coastguard Worker exit:
359*48a54d36SAndroid Build Coastguard Worker 
360*48a54d36SAndroid Build Coastguard Worker 
361*48a54d36SAndroid Build Coastguard Worker 
362*48a54d36SAndroid Build Coastguard Worker 	if ( err && object )
363*48a54d36SAndroid Build Coastguard Worker 
364*48a54d36SAndroid Build Coastguard Worker 	{
365*48a54d36SAndroid Build Coastguard Worker 
366*48a54d36SAndroid Build Coastguard Worker 		object->Release();
367*48a54d36SAndroid Build Coastguard Worker 
368*48a54d36SAndroid Build Coastguard Worker 	}
369*48a54d36SAndroid Build Coastguard Worker 
370*48a54d36SAndroid Build Coastguard Worker 
371*48a54d36SAndroid Build Coastguard Worker 
372*48a54d36SAndroid Build Coastguard Worker 	return err;
373*48a54d36SAndroid Build Coastguard Worker 
374*48a54d36SAndroid Build Coastguard Worker }
375*48a54d36SAndroid Build Coastguard Worker 
376*48a54d36SAndroid Build Coastguard Worker 
377*48a54d36SAndroid Build Coastguard Worker 
378*48a54d36SAndroid Build Coastguard Worker 
379*48a54d36SAndroid Build Coastguard Worker 
Resolve(DNSSDFlags flags,ULONG ifIndex,BSTR serviceName,BSTR regType,BSTR domain,IDNSSDEventManager * eventManager,IDNSSDService ** service)380*48a54d36SAndroid Build Coastguard Worker STDMETHODIMP CDNSSDService::Resolve(DNSSDFlags flags, ULONG ifIndex, BSTR serviceName, BSTR regType, BSTR domain, IDNSSDEventManager* eventManager, IDNSSDService** service)
381*48a54d36SAndroid Build Coastguard Worker 
382*48a54d36SAndroid Build Coastguard Worker {
383*48a54d36SAndroid Build Coastguard Worker 
384*48a54d36SAndroid Build Coastguard Worker 	CComObject<CDNSSDService>	*	object			= NULL;
385*48a54d36SAndroid Build Coastguard Worker 
386*48a54d36SAndroid Build Coastguard Worker 	std::string						serviceNameUTF8;
387*48a54d36SAndroid Build Coastguard Worker 
388*48a54d36SAndroid Build Coastguard Worker 	std::string						regTypeUTF8;
389*48a54d36SAndroid Build Coastguard Worker 
390*48a54d36SAndroid Build Coastguard Worker 	std::string						domainUTF8;
391*48a54d36SAndroid Build Coastguard Worker 
392*48a54d36SAndroid Build Coastguard Worker 	DNSServiceRef					subord			= NULL;
393*48a54d36SAndroid Build Coastguard Worker 
394*48a54d36SAndroid Build Coastguard Worker 	DNSServiceErrorType				err				= 0;
395*48a54d36SAndroid Build Coastguard Worker 
396*48a54d36SAndroid Build Coastguard Worker 	HRESULT							hr				= 0;
397*48a54d36SAndroid Build Coastguard Worker 
398*48a54d36SAndroid Build Coastguard Worker 	BOOL							ok;
399*48a54d36SAndroid Build Coastguard Worker 
400*48a54d36SAndroid Build Coastguard Worker 
401*48a54d36SAndroid Build Coastguard Worker 
402*48a54d36SAndroid Build Coastguard Worker 	check( m_primary );
403*48a54d36SAndroid Build Coastguard Worker 
404*48a54d36SAndroid Build Coastguard Worker 
405*48a54d36SAndroid Build Coastguard Worker 
406*48a54d36SAndroid Build Coastguard Worker 	// Initialize
407*48a54d36SAndroid Build Coastguard Worker 
408*48a54d36SAndroid Build Coastguard Worker 	*service = NULL;
409*48a54d36SAndroid Build Coastguard Worker 
410*48a54d36SAndroid Build Coastguard Worker 
411*48a54d36SAndroid Build Coastguard Worker 
412*48a54d36SAndroid Build Coastguard Worker 	// Convert BSTR params to utf8
413*48a54d36SAndroid Build Coastguard Worker 
414*48a54d36SAndroid Build Coastguard Worker 	ok = BSTRToUTF8( serviceName, serviceNameUTF8 );
415*48a54d36SAndroid Build Coastguard Worker 
416*48a54d36SAndroid Build Coastguard Worker 	require_action( ok, exit, err = kDNSServiceErr_BadParam );
417*48a54d36SAndroid Build Coastguard Worker 
418*48a54d36SAndroid Build Coastguard Worker 	ok = BSTRToUTF8( regType, regTypeUTF8 );
419*48a54d36SAndroid Build Coastguard Worker 
420*48a54d36SAndroid Build Coastguard Worker 	require_action( ok, exit, err = kDNSServiceErr_BadParam );
421*48a54d36SAndroid Build Coastguard Worker 
422*48a54d36SAndroid Build Coastguard Worker 	ok = BSTRToUTF8( domain, domainUTF8 );
423*48a54d36SAndroid Build Coastguard Worker 
424*48a54d36SAndroid Build Coastguard Worker 	require_action( ok, exit, err = kDNSServiceErr_BadParam );
425*48a54d36SAndroid Build Coastguard Worker 
426*48a54d36SAndroid Build Coastguard Worker 
427*48a54d36SAndroid Build Coastguard Worker 
428*48a54d36SAndroid Build Coastguard Worker 	try
429*48a54d36SAndroid Build Coastguard Worker 
430*48a54d36SAndroid Build Coastguard Worker 	{
431*48a54d36SAndroid Build Coastguard Worker 
432*48a54d36SAndroid Build Coastguard Worker 		object = new CComObject<CDNSSDService>();
433*48a54d36SAndroid Build Coastguard Worker 
434*48a54d36SAndroid Build Coastguard Worker 	}
435*48a54d36SAndroid Build Coastguard Worker 
436*48a54d36SAndroid Build Coastguard Worker 	catch ( ... )
437*48a54d36SAndroid Build Coastguard Worker 
438*48a54d36SAndroid Build Coastguard Worker 	{
439*48a54d36SAndroid Build Coastguard Worker 
440*48a54d36SAndroid Build Coastguard Worker 		object = NULL;
441*48a54d36SAndroid Build Coastguard Worker 
442*48a54d36SAndroid Build Coastguard Worker 	}
443*48a54d36SAndroid Build Coastguard Worker 
444*48a54d36SAndroid Build Coastguard Worker 
445*48a54d36SAndroid Build Coastguard Worker 
446*48a54d36SAndroid Build Coastguard Worker 	require_action( object != NULL, exit, err = kDNSServiceErr_NoMemory );
447*48a54d36SAndroid Build Coastguard Worker 
448*48a54d36SAndroid Build Coastguard Worker 	object->AddRef();
449*48a54d36SAndroid Build Coastguard Worker 
450*48a54d36SAndroid Build Coastguard Worker 
451*48a54d36SAndroid Build Coastguard Worker 
452*48a54d36SAndroid Build Coastguard Worker 	subord = m_primary;
453*48a54d36SAndroid Build Coastguard Worker 
454*48a54d36SAndroid Build Coastguard Worker 	err = DNSServiceResolve( &subord, flags | kDNSServiceFlagsShareConnection, ifIndex, serviceNameUTF8.c_str(), regTypeUTF8.c_str(), domainUTF8.c_str(), ( DNSServiceResolveReply ) &ResolveReply, object );
455*48a54d36SAndroid Build Coastguard Worker 
456*48a54d36SAndroid Build Coastguard Worker 	require_noerr( err, exit );
457*48a54d36SAndroid Build Coastguard Worker 
458*48a54d36SAndroid Build Coastguard Worker 
459*48a54d36SAndroid Build Coastguard Worker 
460*48a54d36SAndroid Build Coastguard Worker 	object->SetPrimaryRef( m_primary );
461*48a54d36SAndroid Build Coastguard Worker 
462*48a54d36SAndroid Build Coastguard Worker 	object->SetSubordRef( subord );
463*48a54d36SAndroid Build Coastguard Worker 
464*48a54d36SAndroid Build Coastguard Worker 	object->SetEventManager( eventManager );
465*48a54d36SAndroid Build Coastguard Worker 
466*48a54d36SAndroid Build Coastguard Worker 
467*48a54d36SAndroid Build Coastguard Worker 
468*48a54d36SAndroid Build Coastguard Worker 	*service = object;
469*48a54d36SAndroid Build Coastguard Worker 
470*48a54d36SAndroid Build Coastguard Worker 
471*48a54d36SAndroid Build Coastguard Worker 
472*48a54d36SAndroid Build Coastguard Worker exit:
473*48a54d36SAndroid Build Coastguard Worker 
474*48a54d36SAndroid Build Coastguard Worker 
475*48a54d36SAndroid Build Coastguard Worker 
476*48a54d36SAndroid Build Coastguard Worker 	if ( err && object )
477*48a54d36SAndroid Build Coastguard Worker 
478*48a54d36SAndroid Build Coastguard Worker 	{
479*48a54d36SAndroid Build Coastguard Worker 
480*48a54d36SAndroid Build Coastguard Worker 		object->Release();
481*48a54d36SAndroid Build Coastguard Worker 
482*48a54d36SAndroid Build Coastguard Worker 	}
483*48a54d36SAndroid Build Coastguard Worker 
484*48a54d36SAndroid Build Coastguard Worker 
485*48a54d36SAndroid Build Coastguard Worker 
486*48a54d36SAndroid Build Coastguard Worker 	return err;
487*48a54d36SAndroid Build Coastguard Worker 
488*48a54d36SAndroid Build Coastguard Worker }
489*48a54d36SAndroid Build Coastguard Worker 
490*48a54d36SAndroid Build Coastguard Worker 
491*48a54d36SAndroid Build Coastguard Worker 
492*48a54d36SAndroid Build Coastguard Worker 
493*48a54d36SAndroid Build Coastguard Worker 
Register(DNSSDFlags flags,ULONG ifIndex,BSTR serviceName,BSTR regType,BSTR domain,BSTR host,USHORT port,ITXTRecord * record,IDNSSDEventManager * eventManager,IDNSSDService ** service)494*48a54d36SAndroid Build Coastguard Worker STDMETHODIMP CDNSSDService::Register(DNSSDFlags flags, ULONG ifIndex, BSTR serviceName, BSTR regType, BSTR domain, BSTR host, USHORT port, ITXTRecord *record, IDNSSDEventManager *eventManager, IDNSSDService **service)
495*48a54d36SAndroid Build Coastguard Worker 
496*48a54d36SAndroid Build Coastguard Worker {
497*48a54d36SAndroid Build Coastguard Worker 
498*48a54d36SAndroid Build Coastguard Worker 	CComObject<CDNSSDService>	*	object			= NULL;
499*48a54d36SAndroid Build Coastguard Worker 
500*48a54d36SAndroid Build Coastguard Worker 	std::string						serviceNameUTF8;
501*48a54d36SAndroid Build Coastguard Worker 
502*48a54d36SAndroid Build Coastguard Worker 	std::string						regTypeUTF8;
503*48a54d36SAndroid Build Coastguard Worker 
504*48a54d36SAndroid Build Coastguard Worker 	std::string						domainUTF8;
505*48a54d36SAndroid Build Coastguard Worker 
506*48a54d36SAndroid Build Coastguard Worker 	std::string						hostUTF8;
507*48a54d36SAndroid Build Coastguard Worker 
508*48a54d36SAndroid Build Coastguard Worker 	const void					*	txtRecord		= NULL;
509*48a54d36SAndroid Build Coastguard Worker 
510*48a54d36SAndroid Build Coastguard Worker 	uint16_t						txtLen			= 0;
511*48a54d36SAndroid Build Coastguard Worker 
512*48a54d36SAndroid Build Coastguard Worker 	DNSServiceRef					subord			= NULL;
513*48a54d36SAndroid Build Coastguard Worker 
514*48a54d36SAndroid Build Coastguard Worker 	DNSServiceErrorType				err				= 0;
515*48a54d36SAndroid Build Coastguard Worker 
516*48a54d36SAndroid Build Coastguard Worker 	HRESULT							hr				= 0;
517*48a54d36SAndroid Build Coastguard Worker 
518*48a54d36SAndroid Build Coastguard Worker 	BOOL							ok;
519*48a54d36SAndroid Build Coastguard Worker 
520*48a54d36SAndroid Build Coastguard Worker 
521*48a54d36SAndroid Build Coastguard Worker 
522*48a54d36SAndroid Build Coastguard Worker 	check( m_primary );
523*48a54d36SAndroid Build Coastguard Worker 
524*48a54d36SAndroid Build Coastguard Worker 
525*48a54d36SAndroid Build Coastguard Worker 
526*48a54d36SAndroid Build Coastguard Worker 	// Initialize
527*48a54d36SAndroid Build Coastguard Worker 
528*48a54d36SAndroid Build Coastguard Worker 	*service = NULL;
529*48a54d36SAndroid Build Coastguard Worker 
530*48a54d36SAndroid Build Coastguard Worker 
531*48a54d36SAndroid Build Coastguard Worker 
532*48a54d36SAndroid Build Coastguard Worker 	// Convert BSTR params to utf8
533*48a54d36SAndroid Build Coastguard Worker 
534*48a54d36SAndroid Build Coastguard Worker 	ok = BSTRToUTF8( serviceName, serviceNameUTF8 );
535*48a54d36SAndroid Build Coastguard Worker 
536*48a54d36SAndroid Build Coastguard Worker 	require_action( ok, exit, err = kDNSServiceErr_BadParam );
537*48a54d36SAndroid Build Coastguard Worker 
538*48a54d36SAndroid Build Coastguard Worker 	ok = BSTRToUTF8( regType, regTypeUTF8 );
539*48a54d36SAndroid Build Coastguard Worker 
540*48a54d36SAndroid Build Coastguard Worker 	require_action( ok, exit, err = kDNSServiceErr_BadParam );
541*48a54d36SAndroid Build Coastguard Worker 
542*48a54d36SAndroid Build Coastguard Worker 	ok = BSTRToUTF8( domain, domainUTF8 );
543*48a54d36SAndroid Build Coastguard Worker 
544*48a54d36SAndroid Build Coastguard Worker 	require_action( ok, exit, err = kDNSServiceErr_BadParam );
545*48a54d36SAndroid Build Coastguard Worker 
546*48a54d36SAndroid Build Coastguard Worker 	ok = BSTRToUTF8( host, hostUTF8 );
547*48a54d36SAndroid Build Coastguard Worker 
548*48a54d36SAndroid Build Coastguard Worker 	require_action( ok, exit, err = kDNSServiceErr_BadParam );
549*48a54d36SAndroid Build Coastguard Worker 
550*48a54d36SAndroid Build Coastguard Worker 
551*48a54d36SAndroid Build Coastguard Worker 
552*48a54d36SAndroid Build Coastguard Worker 	try
553*48a54d36SAndroid Build Coastguard Worker 
554*48a54d36SAndroid Build Coastguard Worker 	{
555*48a54d36SAndroid Build Coastguard Worker 
556*48a54d36SAndroid Build Coastguard Worker 		object = new CComObject<CDNSSDService>();
557*48a54d36SAndroid Build Coastguard Worker 
558*48a54d36SAndroid Build Coastguard Worker 	}
559*48a54d36SAndroid Build Coastguard Worker 
560*48a54d36SAndroid Build Coastguard Worker 	catch ( ... )
561*48a54d36SAndroid Build Coastguard Worker 
562*48a54d36SAndroid Build Coastguard Worker 	{
563*48a54d36SAndroid Build Coastguard Worker 
564*48a54d36SAndroid Build Coastguard Worker 		object = NULL;
565*48a54d36SAndroid Build Coastguard Worker 
566*48a54d36SAndroid Build Coastguard Worker 	}
567*48a54d36SAndroid Build Coastguard Worker 
568*48a54d36SAndroid Build Coastguard Worker 
569*48a54d36SAndroid Build Coastguard Worker 
570*48a54d36SAndroid Build Coastguard Worker 	require_action( object != NULL, exit, err = kDNSServiceErr_NoMemory );
571*48a54d36SAndroid Build Coastguard Worker 
572*48a54d36SAndroid Build Coastguard Worker 	object->AddRef();
573*48a54d36SAndroid Build Coastguard Worker 
574*48a54d36SAndroid Build Coastguard Worker 
575*48a54d36SAndroid Build Coastguard Worker 
576*48a54d36SAndroid Build Coastguard Worker 	if ( record )
577*48a54d36SAndroid Build Coastguard Worker 
578*48a54d36SAndroid Build Coastguard Worker 	{
579*48a54d36SAndroid Build Coastguard Worker 
580*48a54d36SAndroid Build Coastguard Worker 		CComObject< CTXTRecord > * realTXTRecord;
581*48a54d36SAndroid Build Coastguard Worker 
582*48a54d36SAndroid Build Coastguard Worker 
583*48a54d36SAndroid Build Coastguard Worker 
584*48a54d36SAndroid Build Coastguard Worker 		realTXTRecord = ( CComObject< CTXTRecord >* ) record;
585*48a54d36SAndroid Build Coastguard Worker 
586*48a54d36SAndroid Build Coastguard Worker 
587*48a54d36SAndroid Build Coastguard Worker 
588*48a54d36SAndroid Build Coastguard Worker 		txtRecord	= realTXTRecord->GetBytes();
589*48a54d36SAndroid Build Coastguard Worker 
590*48a54d36SAndroid Build Coastguard Worker 		txtLen		= realTXTRecord->GetLen();
591*48a54d36SAndroid Build Coastguard Worker 
592*48a54d36SAndroid Build Coastguard Worker 	}
593*48a54d36SAndroid Build Coastguard Worker 
594*48a54d36SAndroid Build Coastguard Worker 
595*48a54d36SAndroid Build Coastguard Worker 
596*48a54d36SAndroid Build Coastguard Worker 	subord = m_primary;
597*48a54d36SAndroid Build Coastguard Worker 
598*48a54d36SAndroid Build Coastguard Worker 	err = DNSServiceRegister( &subord, flags | kDNSServiceFlagsShareConnection, ifIndex, serviceNameUTF8.c_str(), regTypeUTF8.c_str(), ( domainUTF8.size() > 0 ) ? domainUTF8.c_str() : NULL, hostUTF8.c_str(), htons( port ), txtLen, txtRecord, ( DNSServiceRegisterReply ) &RegisterReply, object );
599*48a54d36SAndroid Build Coastguard Worker 
600*48a54d36SAndroid Build Coastguard Worker 	require_noerr( err, exit );
601*48a54d36SAndroid Build Coastguard Worker 
602*48a54d36SAndroid Build Coastguard Worker 
603*48a54d36SAndroid Build Coastguard Worker 
604*48a54d36SAndroid Build Coastguard Worker 	object->SetPrimaryRef( m_primary );
605*48a54d36SAndroid Build Coastguard Worker 
606*48a54d36SAndroid Build Coastguard Worker 	object->SetSubordRef( subord );
607*48a54d36SAndroid Build Coastguard Worker 
608*48a54d36SAndroid Build Coastguard Worker 	object->SetEventManager( eventManager );
609*48a54d36SAndroid Build Coastguard Worker 
610*48a54d36SAndroid Build Coastguard Worker 
611*48a54d36SAndroid Build Coastguard Worker 
612*48a54d36SAndroid Build Coastguard Worker 	*service = object;
613*48a54d36SAndroid Build Coastguard Worker 
614*48a54d36SAndroid Build Coastguard Worker 
615*48a54d36SAndroid Build Coastguard Worker 
616*48a54d36SAndroid Build Coastguard Worker exit:
617*48a54d36SAndroid Build Coastguard Worker 
618*48a54d36SAndroid Build Coastguard Worker 
619*48a54d36SAndroid Build Coastguard Worker 
620*48a54d36SAndroid Build Coastguard Worker 	if ( err && object )
621*48a54d36SAndroid Build Coastguard Worker 
622*48a54d36SAndroid Build Coastguard Worker 	{
623*48a54d36SAndroid Build Coastguard Worker 
624*48a54d36SAndroid Build Coastguard Worker 		object->Release();
625*48a54d36SAndroid Build Coastguard Worker 
626*48a54d36SAndroid Build Coastguard Worker 	}
627*48a54d36SAndroid Build Coastguard Worker 
628*48a54d36SAndroid Build Coastguard Worker 
629*48a54d36SAndroid Build Coastguard Worker 
630*48a54d36SAndroid Build Coastguard Worker 	return err;
631*48a54d36SAndroid Build Coastguard Worker 
632*48a54d36SAndroid Build Coastguard Worker }
633*48a54d36SAndroid Build Coastguard Worker 
634*48a54d36SAndroid Build Coastguard Worker 
635*48a54d36SAndroid Build Coastguard Worker 
636*48a54d36SAndroid Build Coastguard Worker 
637*48a54d36SAndroid Build Coastguard Worker 
QueryRecord(DNSSDFlags flags,ULONG ifIndex,BSTR fullname,DNSSDRRType rrtype,DNSSDRRClass rrclass,IDNSSDEventManager * eventManager,IDNSSDService ** service)638*48a54d36SAndroid Build Coastguard Worker STDMETHODIMP CDNSSDService::QueryRecord(DNSSDFlags flags, ULONG ifIndex, BSTR fullname, DNSSDRRType rrtype, DNSSDRRClass rrclass, IDNSSDEventManager *eventManager, IDNSSDService **service)
639*48a54d36SAndroid Build Coastguard Worker 
640*48a54d36SAndroid Build Coastguard Worker {
641*48a54d36SAndroid Build Coastguard Worker 
642*48a54d36SAndroid Build Coastguard Worker 	CComObject<CDNSSDService>	*	object			= NULL;
643*48a54d36SAndroid Build Coastguard Worker 
644*48a54d36SAndroid Build Coastguard Worker 	DNSServiceRef					subord			= NULL;
645*48a54d36SAndroid Build Coastguard Worker 
646*48a54d36SAndroid Build Coastguard Worker 	std::string						fullNameUTF8;
647*48a54d36SAndroid Build Coastguard Worker 
648*48a54d36SAndroid Build Coastguard Worker 	DNSServiceErrorType				err				= 0;
649*48a54d36SAndroid Build Coastguard Worker 
650*48a54d36SAndroid Build Coastguard Worker 	HRESULT							hr				= 0;
651*48a54d36SAndroid Build Coastguard Worker 
652*48a54d36SAndroid Build Coastguard Worker 	BOOL							ok;
653*48a54d36SAndroid Build Coastguard Worker 
654*48a54d36SAndroid Build Coastguard Worker 
655*48a54d36SAndroid Build Coastguard Worker 
656*48a54d36SAndroid Build Coastguard Worker 	check( m_primary );
657*48a54d36SAndroid Build Coastguard Worker 
658*48a54d36SAndroid Build Coastguard Worker 
659*48a54d36SAndroid Build Coastguard Worker 
660*48a54d36SAndroid Build Coastguard Worker 	// Initialize
661*48a54d36SAndroid Build Coastguard Worker 
662*48a54d36SAndroid Build Coastguard Worker 	*service = NULL;
663*48a54d36SAndroid Build Coastguard Worker 
664*48a54d36SAndroid Build Coastguard Worker 
665*48a54d36SAndroid Build Coastguard Worker 
666*48a54d36SAndroid Build Coastguard Worker 	// Convert BSTR params to utf8
667*48a54d36SAndroid Build Coastguard Worker 
668*48a54d36SAndroid Build Coastguard Worker 	ok = BSTRToUTF8( fullname, fullNameUTF8 );
669*48a54d36SAndroid Build Coastguard Worker 
670*48a54d36SAndroid Build Coastguard Worker 	require_action( ok, exit, err = kDNSServiceErr_BadParam );
671*48a54d36SAndroid Build Coastguard Worker 
672*48a54d36SAndroid Build Coastguard Worker 
673*48a54d36SAndroid Build Coastguard Worker 
674*48a54d36SAndroid Build Coastguard Worker 	try
675*48a54d36SAndroid Build Coastguard Worker 
676*48a54d36SAndroid Build Coastguard Worker 	{
677*48a54d36SAndroid Build Coastguard Worker 
678*48a54d36SAndroid Build Coastguard Worker 		object = new CComObject<CDNSSDService>();
679*48a54d36SAndroid Build Coastguard Worker 
680*48a54d36SAndroid Build Coastguard Worker 	}
681*48a54d36SAndroid Build Coastguard Worker 
682*48a54d36SAndroid Build Coastguard Worker 	catch ( ... )
683*48a54d36SAndroid Build Coastguard Worker 
684*48a54d36SAndroid Build Coastguard Worker 	{
685*48a54d36SAndroid Build Coastguard Worker 
686*48a54d36SAndroid Build Coastguard Worker 		object = NULL;
687*48a54d36SAndroid Build Coastguard Worker 
688*48a54d36SAndroid Build Coastguard Worker 	}
689*48a54d36SAndroid Build Coastguard Worker 
690*48a54d36SAndroid Build Coastguard Worker 
691*48a54d36SAndroid Build Coastguard Worker 
692*48a54d36SAndroid Build Coastguard Worker 	require_action( object != NULL, exit, err = kDNSServiceErr_NoMemory );
693*48a54d36SAndroid Build Coastguard Worker 
694*48a54d36SAndroid Build Coastguard Worker 	object->AddRef();
695*48a54d36SAndroid Build Coastguard Worker 
696*48a54d36SAndroid Build Coastguard Worker 
697*48a54d36SAndroid Build Coastguard Worker 
698*48a54d36SAndroid Build Coastguard Worker 	subord = m_primary;
699*48a54d36SAndroid Build Coastguard Worker 
700*48a54d36SAndroid Build Coastguard Worker 	err = DNSServiceQueryRecord( &subord, flags | kDNSServiceFlagsShareConnection, ifIndex, fullNameUTF8.c_str(), ( uint16_t ) rrtype, ( uint16_t ) rrclass, ( DNSServiceQueryRecordReply ) &QueryRecordReply, object );
701*48a54d36SAndroid Build Coastguard Worker 
702*48a54d36SAndroid Build Coastguard Worker 	require_noerr( err, exit );
703*48a54d36SAndroid Build Coastguard Worker 
704*48a54d36SAndroid Build Coastguard Worker 
705*48a54d36SAndroid Build Coastguard Worker 
706*48a54d36SAndroid Build Coastguard Worker 	object->SetPrimaryRef( m_primary );
707*48a54d36SAndroid Build Coastguard Worker 
708*48a54d36SAndroid Build Coastguard Worker 	object->SetSubordRef( subord );
709*48a54d36SAndroid Build Coastguard Worker 
710*48a54d36SAndroid Build Coastguard Worker 	object->SetEventManager( eventManager );
711*48a54d36SAndroid Build Coastguard Worker 
712*48a54d36SAndroid Build Coastguard Worker 
713*48a54d36SAndroid Build Coastguard Worker 
714*48a54d36SAndroid Build Coastguard Worker 	*service = object;
715*48a54d36SAndroid Build Coastguard Worker 
716*48a54d36SAndroid Build Coastguard Worker 
717*48a54d36SAndroid Build Coastguard Worker 
718*48a54d36SAndroid Build Coastguard Worker exit:
719*48a54d36SAndroid Build Coastguard Worker 
720*48a54d36SAndroid Build Coastguard Worker 
721*48a54d36SAndroid Build Coastguard Worker 
722*48a54d36SAndroid Build Coastguard Worker 	if ( err && object )
723*48a54d36SAndroid Build Coastguard Worker 
724*48a54d36SAndroid Build Coastguard Worker 	{
725*48a54d36SAndroid Build Coastguard Worker 
726*48a54d36SAndroid Build Coastguard Worker 		object->Release();
727*48a54d36SAndroid Build Coastguard Worker 
728*48a54d36SAndroid Build Coastguard Worker 	}
729*48a54d36SAndroid Build Coastguard Worker 
730*48a54d36SAndroid Build Coastguard Worker 
731*48a54d36SAndroid Build Coastguard Worker 
732*48a54d36SAndroid Build Coastguard Worker 	return err;
733*48a54d36SAndroid Build Coastguard Worker 
734*48a54d36SAndroid Build Coastguard Worker }
735*48a54d36SAndroid Build Coastguard Worker 
736*48a54d36SAndroid Build Coastguard Worker 
737*48a54d36SAndroid Build Coastguard Worker 
738*48a54d36SAndroid Build Coastguard Worker 
739*48a54d36SAndroid Build Coastguard Worker 
RegisterRecord(DNSSDFlags flags,ULONG ifIndex,BSTR fullName,DNSSDRRType rrtype,DNSSDRRClass rrclass,VARIANT rdata,ULONG ttl,IDNSSDEventManager * eventManager,IDNSSDRecord ** record)740*48a54d36SAndroid Build Coastguard Worker STDMETHODIMP CDNSSDService::RegisterRecord(DNSSDFlags flags, ULONG ifIndex, BSTR fullName, DNSSDRRType rrtype, DNSSDRRClass rrclass, VARIANT rdata, ULONG ttl, IDNSSDEventManager* eventManager, IDNSSDRecord** record)
741*48a54d36SAndroid Build Coastguard Worker 
742*48a54d36SAndroid Build Coastguard Worker {
743*48a54d36SAndroid Build Coastguard Worker 
744*48a54d36SAndroid Build Coastguard Worker 	CComObject<CDNSSDRecord>	*	object			= NULL;
745*48a54d36SAndroid Build Coastguard Worker 
746*48a54d36SAndroid Build Coastguard Worker 	DNSRecordRef					rref			= NULL;
747*48a54d36SAndroid Build Coastguard Worker 
748*48a54d36SAndroid Build Coastguard Worker 	std::string						fullNameUTF8;
749*48a54d36SAndroid Build Coastguard Worker 
750*48a54d36SAndroid Build Coastguard Worker 	std::vector< BYTE >				byteArray;
751*48a54d36SAndroid Build Coastguard Worker 
752*48a54d36SAndroid Build Coastguard Worker 	const void					*	byteArrayPtr	= NULL;
753*48a54d36SAndroid Build Coastguard Worker 
754*48a54d36SAndroid Build Coastguard Worker 	DNSServiceErrorType				err				= 0;
755*48a54d36SAndroid Build Coastguard Worker 
756*48a54d36SAndroid Build Coastguard Worker 	HRESULT							hr				= 0;
757*48a54d36SAndroid Build Coastguard Worker 
758*48a54d36SAndroid Build Coastguard Worker 	BOOL							ok;
759*48a54d36SAndroid Build Coastguard Worker 
760*48a54d36SAndroid Build Coastguard Worker 
761*48a54d36SAndroid Build Coastguard Worker 
762*48a54d36SAndroid Build Coastguard Worker 	check( m_primary );
763*48a54d36SAndroid Build Coastguard Worker 
764*48a54d36SAndroid Build Coastguard Worker 
765*48a54d36SAndroid Build Coastguard Worker 
766*48a54d36SAndroid Build Coastguard Worker 	// Initialize
767*48a54d36SAndroid Build Coastguard Worker 
768*48a54d36SAndroid Build Coastguard Worker 	*object = NULL;
769*48a54d36SAndroid Build Coastguard Worker 
770*48a54d36SAndroid Build Coastguard Worker 
771*48a54d36SAndroid Build Coastguard Worker 
772*48a54d36SAndroid Build Coastguard Worker 	// Convert BSTR params to utf8
773*48a54d36SAndroid Build Coastguard Worker 
774*48a54d36SAndroid Build Coastguard Worker 	ok = BSTRToUTF8( fullName, fullNameUTF8 );
775*48a54d36SAndroid Build Coastguard Worker 
776*48a54d36SAndroid Build Coastguard Worker 	require_action( ok, exit, err = kDNSServiceErr_BadParam );
777*48a54d36SAndroid Build Coastguard Worker 
778*48a54d36SAndroid Build Coastguard Worker 
779*48a54d36SAndroid Build Coastguard Worker 
780*48a54d36SAndroid Build Coastguard Worker 	// Convert the VARIANT
781*48a54d36SAndroid Build Coastguard Worker 
782*48a54d36SAndroid Build Coastguard Worker 	ok = VariantToByteArray( &rdata, byteArray );
783*48a54d36SAndroid Build Coastguard Worker 
784*48a54d36SAndroid Build Coastguard Worker 	require_action( ok, exit, err = kDNSServiceErr_Unknown );
785*48a54d36SAndroid Build Coastguard Worker 
786*48a54d36SAndroid Build Coastguard Worker 
787*48a54d36SAndroid Build Coastguard Worker 
788*48a54d36SAndroid Build Coastguard Worker 	try
789*48a54d36SAndroid Build Coastguard Worker 
790*48a54d36SAndroid Build Coastguard Worker 	{
791*48a54d36SAndroid Build Coastguard Worker 
792*48a54d36SAndroid Build Coastguard Worker 		object = new CComObject<CDNSSDRecord>();
793*48a54d36SAndroid Build Coastguard Worker 
794*48a54d36SAndroid Build Coastguard Worker 	}
795*48a54d36SAndroid Build Coastguard Worker 
796*48a54d36SAndroid Build Coastguard Worker 	catch ( ... )
797*48a54d36SAndroid Build Coastguard Worker 
798*48a54d36SAndroid Build Coastguard Worker 	{
799*48a54d36SAndroid Build Coastguard Worker 
800*48a54d36SAndroid Build Coastguard Worker 		object = NULL;
801*48a54d36SAndroid Build Coastguard Worker 
802*48a54d36SAndroid Build Coastguard Worker 	}
803*48a54d36SAndroid Build Coastguard Worker 
804*48a54d36SAndroid Build Coastguard Worker 
805*48a54d36SAndroid Build Coastguard Worker 
806*48a54d36SAndroid Build Coastguard Worker 	require_action( object != NULL, exit, err = kDNSServiceErr_NoMemory );
807*48a54d36SAndroid Build Coastguard Worker 
808*48a54d36SAndroid Build Coastguard Worker 	object->AddRef();
809*48a54d36SAndroid Build Coastguard Worker 
810*48a54d36SAndroid Build Coastguard Worker 
811*48a54d36SAndroid Build Coastguard Worker 
812*48a54d36SAndroid Build Coastguard Worker 	err = DNSServiceRegisterRecord( m_primary, &rref, flags, ifIndex, fullNameUTF8.c_str(), rrtype, rrclass, ( uint16_t ) byteArray.size(), byteArray.size() > 0 ? &byteArray[ 0 ] : NULL, ttl, &RegisterRecordReply, object );
813*48a54d36SAndroid Build Coastguard Worker 
814*48a54d36SAndroid Build Coastguard Worker 	require_noerr( err, exit );
815*48a54d36SAndroid Build Coastguard Worker 
816*48a54d36SAndroid Build Coastguard Worker 
817*48a54d36SAndroid Build Coastguard Worker 
818*48a54d36SAndroid Build Coastguard Worker 	object->SetServiceObject( this );
819*48a54d36SAndroid Build Coastguard Worker 
820*48a54d36SAndroid Build Coastguard Worker 	object->SetRecordRef( rref );
821*48a54d36SAndroid Build Coastguard Worker 
822*48a54d36SAndroid Build Coastguard Worker 	this->SetEventManager( eventManager );
823*48a54d36SAndroid Build Coastguard Worker 
824*48a54d36SAndroid Build Coastguard Worker 
825*48a54d36SAndroid Build Coastguard Worker 
826*48a54d36SAndroid Build Coastguard Worker 	*record = object;
827*48a54d36SAndroid Build Coastguard Worker 
828*48a54d36SAndroid Build Coastguard Worker 
829*48a54d36SAndroid Build Coastguard Worker 
830*48a54d36SAndroid Build Coastguard Worker exit:
831*48a54d36SAndroid Build Coastguard Worker 
832*48a54d36SAndroid Build Coastguard Worker 
833*48a54d36SAndroid Build Coastguard Worker 
834*48a54d36SAndroid Build Coastguard Worker 	if ( err && object )
835*48a54d36SAndroid Build Coastguard Worker 
836*48a54d36SAndroid Build Coastguard Worker 	{
837*48a54d36SAndroid Build Coastguard Worker 
838*48a54d36SAndroid Build Coastguard Worker 		object->Release();
839*48a54d36SAndroid Build Coastguard Worker 
840*48a54d36SAndroid Build Coastguard Worker 	}
841*48a54d36SAndroid Build Coastguard Worker 
842*48a54d36SAndroid Build Coastguard Worker 
843*48a54d36SAndroid Build Coastguard Worker 
844*48a54d36SAndroid Build Coastguard Worker 	return err;
845*48a54d36SAndroid Build Coastguard Worker 
846*48a54d36SAndroid Build Coastguard Worker }
847*48a54d36SAndroid Build Coastguard Worker 
848*48a54d36SAndroid Build Coastguard Worker 
849*48a54d36SAndroid Build Coastguard Worker 
850*48a54d36SAndroid Build Coastguard Worker 
851*48a54d36SAndroid Build Coastguard Worker 
AddRecord(DNSSDFlags flags,DNSSDRRType rrtype,VARIANT rdata,ULONG ttl,IDNSSDRecord ** record)852*48a54d36SAndroid Build Coastguard Worker STDMETHODIMP CDNSSDService::AddRecord(DNSSDFlags flags, DNSSDRRType rrtype, VARIANT rdata, ULONG ttl, IDNSSDRecord ** record)
853*48a54d36SAndroid Build Coastguard Worker 
854*48a54d36SAndroid Build Coastguard Worker {
855*48a54d36SAndroid Build Coastguard Worker 
856*48a54d36SAndroid Build Coastguard Worker 	CComObject<CDNSSDRecord>	*	object			= NULL;
857*48a54d36SAndroid Build Coastguard Worker 
858*48a54d36SAndroid Build Coastguard Worker 	DNSRecordRef					rref			= NULL;
859*48a54d36SAndroid Build Coastguard Worker 
860*48a54d36SAndroid Build Coastguard Worker 	std::vector< BYTE >				byteArray;
861*48a54d36SAndroid Build Coastguard Worker 
862*48a54d36SAndroid Build Coastguard Worker 	const void					*	byteArrayPtr	= NULL;
863*48a54d36SAndroid Build Coastguard Worker 
864*48a54d36SAndroid Build Coastguard Worker 	DNSServiceErrorType				err				= 0;
865*48a54d36SAndroid Build Coastguard Worker 
866*48a54d36SAndroid Build Coastguard Worker 	HRESULT							hr				= 0;
867*48a54d36SAndroid Build Coastguard Worker 
868*48a54d36SAndroid Build Coastguard Worker 	BOOL							ok;
869*48a54d36SAndroid Build Coastguard Worker 
870*48a54d36SAndroid Build Coastguard Worker 
871*48a54d36SAndroid Build Coastguard Worker 
872*48a54d36SAndroid Build Coastguard Worker 	check( m_primary );
873*48a54d36SAndroid Build Coastguard Worker 
874*48a54d36SAndroid Build Coastguard Worker 
875*48a54d36SAndroid Build Coastguard Worker 
876*48a54d36SAndroid Build Coastguard Worker 	// Initialize
877*48a54d36SAndroid Build Coastguard Worker 
878*48a54d36SAndroid Build Coastguard Worker 	*object = NULL;
879*48a54d36SAndroid Build Coastguard Worker 
880*48a54d36SAndroid Build Coastguard Worker 
881*48a54d36SAndroid Build Coastguard Worker 
882*48a54d36SAndroid Build Coastguard Worker 	// Convert the VARIANT
883*48a54d36SAndroid Build Coastguard Worker 
884*48a54d36SAndroid Build Coastguard Worker 	ok = VariantToByteArray( &rdata, byteArray );
885*48a54d36SAndroid Build Coastguard Worker 
886*48a54d36SAndroid Build Coastguard Worker 	require_action( ok, exit, err = kDNSServiceErr_Unknown );
887*48a54d36SAndroid Build Coastguard Worker 
888*48a54d36SAndroid Build Coastguard Worker 
889*48a54d36SAndroid Build Coastguard Worker 
890*48a54d36SAndroid Build Coastguard Worker 	try
891*48a54d36SAndroid Build Coastguard Worker 
892*48a54d36SAndroid Build Coastguard Worker 	{
893*48a54d36SAndroid Build Coastguard Worker 
894*48a54d36SAndroid Build Coastguard Worker 		object = new CComObject<CDNSSDRecord>();
895*48a54d36SAndroid Build Coastguard Worker 
896*48a54d36SAndroid Build Coastguard Worker 	}
897*48a54d36SAndroid Build Coastguard Worker 
898*48a54d36SAndroid Build Coastguard Worker 	catch ( ... )
899*48a54d36SAndroid Build Coastguard Worker 
900*48a54d36SAndroid Build Coastguard Worker 	{
901*48a54d36SAndroid Build Coastguard Worker 
902*48a54d36SAndroid Build Coastguard Worker 		object = NULL;
903*48a54d36SAndroid Build Coastguard Worker 
904*48a54d36SAndroid Build Coastguard Worker 	}
905*48a54d36SAndroid Build Coastguard Worker 
906*48a54d36SAndroid Build Coastguard Worker 
907*48a54d36SAndroid Build Coastguard Worker 
908*48a54d36SAndroid Build Coastguard Worker 	require_action( object != NULL, exit, err = kDNSServiceErr_NoMemory );
909*48a54d36SAndroid Build Coastguard Worker 
910*48a54d36SAndroid Build Coastguard Worker 	object->AddRef();
911*48a54d36SAndroid Build Coastguard Worker 
912*48a54d36SAndroid Build Coastguard Worker 
913*48a54d36SAndroid Build Coastguard Worker 
914*48a54d36SAndroid Build Coastguard Worker 	err = DNSServiceAddRecord( m_primary, &rref, flags, rrtype, ( uint16_t ) byteArray.size(), byteArray.size() > 0 ? &byteArray[ 0 ] : NULL, ttl );
915*48a54d36SAndroid Build Coastguard Worker 
916*48a54d36SAndroid Build Coastguard Worker 	require_noerr( err, exit );
917*48a54d36SAndroid Build Coastguard Worker 
918*48a54d36SAndroid Build Coastguard Worker 
919*48a54d36SAndroid Build Coastguard Worker 
920*48a54d36SAndroid Build Coastguard Worker 	object->SetServiceObject( this );
921*48a54d36SAndroid Build Coastguard Worker 
922*48a54d36SAndroid Build Coastguard Worker 	object->SetRecordRef( rref );
923*48a54d36SAndroid Build Coastguard Worker 
924*48a54d36SAndroid Build Coastguard Worker 
925*48a54d36SAndroid Build Coastguard Worker 
926*48a54d36SAndroid Build Coastguard Worker 	*record = object;
927*48a54d36SAndroid Build Coastguard Worker 
928*48a54d36SAndroid Build Coastguard Worker 
929*48a54d36SAndroid Build Coastguard Worker 
930*48a54d36SAndroid Build Coastguard Worker exit:
931*48a54d36SAndroid Build Coastguard Worker 
932*48a54d36SAndroid Build Coastguard Worker 
933*48a54d36SAndroid Build Coastguard Worker 
934*48a54d36SAndroid Build Coastguard Worker 	if ( err && object )
935*48a54d36SAndroid Build Coastguard Worker 
936*48a54d36SAndroid Build Coastguard Worker 	{
937*48a54d36SAndroid Build Coastguard Worker 
938*48a54d36SAndroid Build Coastguard Worker 		object->Release();
939*48a54d36SAndroid Build Coastguard Worker 
940*48a54d36SAndroid Build Coastguard Worker 	}
941*48a54d36SAndroid Build Coastguard Worker 
942*48a54d36SAndroid Build Coastguard Worker 
943*48a54d36SAndroid Build Coastguard Worker 
944*48a54d36SAndroid Build Coastguard Worker 	return err;
945*48a54d36SAndroid Build Coastguard Worker 
946*48a54d36SAndroid Build Coastguard Worker }
947*48a54d36SAndroid Build Coastguard Worker 
948*48a54d36SAndroid Build Coastguard Worker 
949*48a54d36SAndroid Build Coastguard Worker 
ReconfirmRecord(DNSSDFlags flags,ULONG ifIndex,BSTR fullName,DNSSDRRType rrtype,DNSSDRRClass rrclass,VARIANT rdata)950*48a54d36SAndroid Build Coastguard Worker STDMETHODIMP CDNSSDService::ReconfirmRecord(DNSSDFlags flags, ULONG ifIndex, BSTR fullName, DNSSDRRType rrtype, DNSSDRRClass rrclass, VARIANT rdata)
951*48a54d36SAndroid Build Coastguard Worker 
952*48a54d36SAndroid Build Coastguard Worker {
953*48a54d36SAndroid Build Coastguard Worker 
954*48a54d36SAndroid Build Coastguard Worker 	std::string						fullNameUTF8;
955*48a54d36SAndroid Build Coastguard Worker 
956*48a54d36SAndroid Build Coastguard Worker 	std::vector< BYTE >				byteArray;
957*48a54d36SAndroid Build Coastguard Worker 
958*48a54d36SAndroid Build Coastguard Worker 	const void					*	byteArrayPtr	= NULL;
959*48a54d36SAndroid Build Coastguard Worker 
960*48a54d36SAndroid Build Coastguard Worker 	DNSServiceErrorType				err				= 0;
961*48a54d36SAndroid Build Coastguard Worker 
962*48a54d36SAndroid Build Coastguard Worker 	HRESULT							hr				= 0;
963*48a54d36SAndroid Build Coastguard Worker 
964*48a54d36SAndroid Build Coastguard Worker 	BOOL							ok;
965*48a54d36SAndroid Build Coastguard Worker 
966*48a54d36SAndroid Build Coastguard Worker 
967*48a54d36SAndroid Build Coastguard Worker 
968*48a54d36SAndroid Build Coastguard Worker 	// Convert BSTR params to utf8
969*48a54d36SAndroid Build Coastguard Worker 
970*48a54d36SAndroid Build Coastguard Worker 	ok = BSTRToUTF8( fullName, fullNameUTF8 );
971*48a54d36SAndroid Build Coastguard Worker 
972*48a54d36SAndroid Build Coastguard Worker 	require_action( ok, exit, err = kDNSServiceErr_BadParam );
973*48a54d36SAndroid Build Coastguard Worker 
974*48a54d36SAndroid Build Coastguard Worker 
975*48a54d36SAndroid Build Coastguard Worker 
976*48a54d36SAndroid Build Coastguard Worker 	// Convert the VARIANT
977*48a54d36SAndroid Build Coastguard Worker 
978*48a54d36SAndroid Build Coastguard Worker 	ok = VariantToByteArray( &rdata, byteArray );
979*48a54d36SAndroid Build Coastguard Worker 
980*48a54d36SAndroid Build Coastguard Worker 	require_action( ok, exit, err = kDNSServiceErr_Unknown );
981*48a54d36SAndroid Build Coastguard Worker 
982*48a54d36SAndroid Build Coastguard Worker 
983*48a54d36SAndroid Build Coastguard Worker 
984*48a54d36SAndroid Build Coastguard Worker 	err = DNSServiceReconfirmRecord( flags, ifIndex, fullNameUTF8.c_str(), rrtype, rrclass, ( uint16_t ) byteArray.size(), byteArray.size() > 0 ? &byteArray[ 0 ] : NULL );
985*48a54d36SAndroid Build Coastguard Worker 
986*48a54d36SAndroid Build Coastguard Worker 	require_noerr( err, exit );
987*48a54d36SAndroid Build Coastguard Worker 
988*48a54d36SAndroid Build Coastguard Worker 
989*48a54d36SAndroid Build Coastguard Worker 
990*48a54d36SAndroid Build Coastguard Worker exit:
991*48a54d36SAndroid Build Coastguard Worker 
992*48a54d36SAndroid Build Coastguard Worker 
993*48a54d36SAndroid Build Coastguard Worker 
994*48a54d36SAndroid Build Coastguard Worker 	return err;
995*48a54d36SAndroid Build Coastguard Worker 
996*48a54d36SAndroid Build Coastguard Worker }
997*48a54d36SAndroid Build Coastguard Worker 
998*48a54d36SAndroid Build Coastguard Worker 
999*48a54d36SAndroid Build Coastguard Worker 
1000*48a54d36SAndroid Build Coastguard Worker 
1001*48a54d36SAndroid Build Coastguard Worker 
GetProperty(BSTR prop,VARIANT * value)1002*48a54d36SAndroid Build Coastguard Worker STDMETHODIMP CDNSSDService::GetProperty(BSTR prop, VARIANT * value )
1003*48a54d36SAndroid Build Coastguard Worker 
1004*48a54d36SAndroid Build Coastguard Worker {
1005*48a54d36SAndroid Build Coastguard Worker 
1006*48a54d36SAndroid Build Coastguard Worker 	std::string			propUTF8;
1007*48a54d36SAndroid Build Coastguard Worker 
1008*48a54d36SAndroid Build Coastguard Worker 	std::vector< BYTE >	byteArray;
1009*48a54d36SAndroid Build Coastguard Worker 
1010*48a54d36SAndroid Build Coastguard Worker 	SAFEARRAY		*	psa			= NULL;
1011*48a54d36SAndroid Build Coastguard Worker 
1012*48a54d36SAndroid Build Coastguard Worker 	BYTE			*	pData		= NULL;
1013*48a54d36SAndroid Build Coastguard Worker 
1014*48a54d36SAndroid Build Coastguard Worker 	uint32_t			elems		= 0;
1015*48a54d36SAndroid Build Coastguard Worker 
1016*48a54d36SAndroid Build Coastguard Worker 	DNSServiceErrorType	err			= 0;
1017*48a54d36SAndroid Build Coastguard Worker 
1018*48a54d36SAndroid Build Coastguard Worker 	BOOL				ok = TRUE;
1019*48a54d36SAndroid Build Coastguard Worker 
1020*48a54d36SAndroid Build Coastguard Worker 
1021*48a54d36SAndroid Build Coastguard Worker 
1022*48a54d36SAndroid Build Coastguard Worker 	// Convert BSTR params to utf8
1023*48a54d36SAndroid Build Coastguard Worker 
1024*48a54d36SAndroid Build Coastguard Worker 	ok = BSTRToUTF8( prop, propUTF8 );
1025*48a54d36SAndroid Build Coastguard Worker 
1026*48a54d36SAndroid Build Coastguard Worker 	require_action( ok, exit, err = kDNSServiceErr_BadParam );
1027*48a54d36SAndroid Build Coastguard Worker 
1028*48a54d36SAndroid Build Coastguard Worker 
1029*48a54d36SAndroid Build Coastguard Worker 
1030*48a54d36SAndroid Build Coastguard Worker 	// Setup the byte array
1031*48a54d36SAndroid Build Coastguard Worker 
1032*48a54d36SAndroid Build Coastguard Worker 	require_action( V_VT( value ) == ( VT_ARRAY|VT_UI1 ), exit, err = kDNSServiceErr_Unknown );
1033*48a54d36SAndroid Build Coastguard Worker 
1034*48a54d36SAndroid Build Coastguard Worker 	psa = V_ARRAY( value );
1035*48a54d36SAndroid Build Coastguard Worker 
1036*48a54d36SAndroid Build Coastguard Worker 	require_action( psa, exit, err = kDNSServiceErr_Unknown );
1037*48a54d36SAndroid Build Coastguard Worker 
1038*48a54d36SAndroid Build Coastguard Worker 	require_action( SafeArrayGetDim( psa ) == 1, exit, err = kDNSServiceErr_Unknown );
1039*48a54d36SAndroid Build Coastguard Worker 
1040*48a54d36SAndroid Build Coastguard Worker 	byteArray.reserve( psa->rgsabound[0].cElements );
1041*48a54d36SAndroid Build Coastguard Worker 
1042*48a54d36SAndroid Build Coastguard Worker 	byteArray.assign( byteArray.capacity(), 0 );
1043*48a54d36SAndroid Build Coastguard Worker 
1044*48a54d36SAndroid Build Coastguard Worker 	elems = ( uint32_t ) byteArray.capacity();
1045*48a54d36SAndroid Build Coastguard Worker 
1046*48a54d36SAndroid Build Coastguard Worker 
1047*48a54d36SAndroid Build Coastguard Worker 
1048*48a54d36SAndroid Build Coastguard Worker 	// Call the function and package the return value in the Variant
1049*48a54d36SAndroid Build Coastguard Worker 
1050*48a54d36SAndroid Build Coastguard Worker 	err = DNSServiceGetProperty( propUTF8.c_str(), &byteArray[ 0 ], &elems );
1051*48a54d36SAndroid Build Coastguard Worker 
1052*48a54d36SAndroid Build Coastguard Worker 	require_noerr( err, exit );
1053*48a54d36SAndroid Build Coastguard Worker 
1054*48a54d36SAndroid Build Coastguard Worker 	ok = ByteArrayToVariant( &byteArray[ 0 ], elems, value );
1055*48a54d36SAndroid Build Coastguard Worker 
1056*48a54d36SAndroid Build Coastguard Worker 	require_action( ok, exit, err = kDNSSDError_Unknown );
1057*48a54d36SAndroid Build Coastguard Worker 
1058*48a54d36SAndroid Build Coastguard Worker 
1059*48a54d36SAndroid Build Coastguard Worker 
1060*48a54d36SAndroid Build Coastguard Worker exit:
1061*48a54d36SAndroid Build Coastguard Worker 
1062*48a54d36SAndroid Build Coastguard Worker 
1063*48a54d36SAndroid Build Coastguard Worker 
1064*48a54d36SAndroid Build Coastguard Worker 	if ( psa )
1065*48a54d36SAndroid Build Coastguard Worker 
1066*48a54d36SAndroid Build Coastguard Worker 	{
1067*48a54d36SAndroid Build Coastguard Worker 
1068*48a54d36SAndroid Build Coastguard Worker 		SafeArrayUnaccessData( psa );
1069*48a54d36SAndroid Build Coastguard Worker 
1070*48a54d36SAndroid Build Coastguard Worker 		psa = NULL;
1071*48a54d36SAndroid Build Coastguard Worker 
1072*48a54d36SAndroid Build Coastguard Worker 	}
1073*48a54d36SAndroid Build Coastguard Worker 
1074*48a54d36SAndroid Build Coastguard Worker 
1075*48a54d36SAndroid Build Coastguard Worker 
1076*48a54d36SAndroid Build Coastguard Worker 	return err;
1077*48a54d36SAndroid Build Coastguard Worker 
1078*48a54d36SAndroid Build Coastguard Worker }
1079*48a54d36SAndroid Build Coastguard Worker 
1080*48a54d36SAndroid Build Coastguard Worker 
1081*48a54d36SAndroid Build Coastguard Worker 
GetAddrInfo(DNSSDFlags flags,ULONG ifIndex,DNSSDAddressFamily addressFamily,BSTR hostName,IDNSSDEventManager * eventManager,IDNSSDService ** service)1082*48a54d36SAndroid Build Coastguard Worker STDMETHODIMP CDNSSDService::GetAddrInfo(DNSSDFlags flags, ULONG ifIndex, DNSSDAddressFamily addressFamily, BSTR hostName, IDNSSDEventManager *eventManager, IDNSSDService **service)
1083*48a54d36SAndroid Build Coastguard Worker 
1084*48a54d36SAndroid Build Coastguard Worker {
1085*48a54d36SAndroid Build Coastguard Worker 
1086*48a54d36SAndroid Build Coastguard Worker 	CComObject<CDNSSDService>	*	object			= NULL;
1087*48a54d36SAndroid Build Coastguard Worker 
1088*48a54d36SAndroid Build Coastguard Worker 	DNSServiceRef					subord			= NULL;
1089*48a54d36SAndroid Build Coastguard Worker 
1090*48a54d36SAndroid Build Coastguard Worker 	std::string						hostNameUTF8;
1091*48a54d36SAndroid Build Coastguard Worker 
1092*48a54d36SAndroid Build Coastguard Worker 	DNSServiceErrorType				err				= 0;
1093*48a54d36SAndroid Build Coastguard Worker 
1094*48a54d36SAndroid Build Coastguard Worker 	HRESULT							hr				= 0;
1095*48a54d36SAndroid Build Coastguard Worker 
1096*48a54d36SAndroid Build Coastguard Worker 	BOOL							ok;
1097*48a54d36SAndroid Build Coastguard Worker 
1098*48a54d36SAndroid Build Coastguard Worker 
1099*48a54d36SAndroid Build Coastguard Worker 
1100*48a54d36SAndroid Build Coastguard Worker 	check( m_primary );
1101*48a54d36SAndroid Build Coastguard Worker 
1102*48a54d36SAndroid Build Coastguard Worker 
1103*48a54d36SAndroid Build Coastguard Worker 
1104*48a54d36SAndroid Build Coastguard Worker 	// Initialize
1105*48a54d36SAndroid Build Coastguard Worker 
1106*48a54d36SAndroid Build Coastguard Worker 	*service = NULL;
1107*48a54d36SAndroid Build Coastguard Worker 
1108*48a54d36SAndroid Build Coastguard Worker 
1109*48a54d36SAndroid Build Coastguard Worker 
1110*48a54d36SAndroid Build Coastguard Worker 	// Convert BSTR params to utf8
1111*48a54d36SAndroid Build Coastguard Worker 
1112*48a54d36SAndroid Build Coastguard Worker 	ok = BSTRToUTF8( hostName, hostNameUTF8 );
1113*48a54d36SAndroid Build Coastguard Worker 
1114*48a54d36SAndroid Build Coastguard Worker 	require_action( ok, exit, err = kDNSServiceErr_BadParam );
1115*48a54d36SAndroid Build Coastguard Worker 
1116*48a54d36SAndroid Build Coastguard Worker 
1117*48a54d36SAndroid Build Coastguard Worker 
1118*48a54d36SAndroid Build Coastguard Worker 	try
1119*48a54d36SAndroid Build Coastguard Worker 
1120*48a54d36SAndroid Build Coastguard Worker 	{
1121*48a54d36SAndroid Build Coastguard Worker 
1122*48a54d36SAndroid Build Coastguard Worker 		object = new CComObject<CDNSSDService>();
1123*48a54d36SAndroid Build Coastguard Worker 
1124*48a54d36SAndroid Build Coastguard Worker 	}
1125*48a54d36SAndroid Build Coastguard Worker 
1126*48a54d36SAndroid Build Coastguard Worker 	catch ( ... )
1127*48a54d36SAndroid Build Coastguard Worker 
1128*48a54d36SAndroid Build Coastguard Worker 	{
1129*48a54d36SAndroid Build Coastguard Worker 
1130*48a54d36SAndroid Build Coastguard Worker 		object = NULL;
1131*48a54d36SAndroid Build Coastguard Worker 
1132*48a54d36SAndroid Build Coastguard Worker 	}
1133*48a54d36SAndroid Build Coastguard Worker 
1134*48a54d36SAndroid Build Coastguard Worker 
1135*48a54d36SAndroid Build Coastguard Worker 
1136*48a54d36SAndroid Build Coastguard Worker 	require_action( object != NULL, exit, err = kDNSServiceErr_NoMemory );
1137*48a54d36SAndroid Build Coastguard Worker 
1138*48a54d36SAndroid Build Coastguard Worker 	object->AddRef();
1139*48a54d36SAndroid Build Coastguard Worker 
1140*48a54d36SAndroid Build Coastguard Worker 
1141*48a54d36SAndroid Build Coastguard Worker 
1142*48a54d36SAndroid Build Coastguard Worker 	subord = m_primary;
1143*48a54d36SAndroid Build Coastguard Worker 
1144*48a54d36SAndroid Build Coastguard Worker 	err = DNSServiceGetAddrInfo( &subord, flags | kDNSServiceFlagsShareConnection, ifIndex, addressFamily, hostNameUTF8.c_str(), ( DNSServiceGetAddrInfoReply ) &GetAddrInfoReply, object );
1145*48a54d36SAndroid Build Coastguard Worker 
1146*48a54d36SAndroid Build Coastguard Worker 	require_noerr( err, exit );
1147*48a54d36SAndroid Build Coastguard Worker 
1148*48a54d36SAndroid Build Coastguard Worker 
1149*48a54d36SAndroid Build Coastguard Worker 
1150*48a54d36SAndroid Build Coastguard Worker 	object->SetPrimaryRef( m_primary );
1151*48a54d36SAndroid Build Coastguard Worker 
1152*48a54d36SAndroid Build Coastguard Worker 	object->SetSubordRef( subord );
1153*48a54d36SAndroid Build Coastguard Worker 
1154*48a54d36SAndroid Build Coastguard Worker 	object->SetEventManager( eventManager );
1155*48a54d36SAndroid Build Coastguard Worker 
1156*48a54d36SAndroid Build Coastguard Worker 
1157*48a54d36SAndroid Build Coastguard Worker 
1158*48a54d36SAndroid Build Coastguard Worker 	*service = object;
1159*48a54d36SAndroid Build Coastguard Worker 
1160*48a54d36SAndroid Build Coastguard Worker 
1161*48a54d36SAndroid Build Coastguard Worker 
1162*48a54d36SAndroid Build Coastguard Worker exit:
1163*48a54d36SAndroid Build Coastguard Worker 
1164*48a54d36SAndroid Build Coastguard Worker 
1165*48a54d36SAndroid Build Coastguard Worker 
1166*48a54d36SAndroid Build Coastguard Worker 	if ( err && object )
1167*48a54d36SAndroid Build Coastguard Worker 
1168*48a54d36SAndroid Build Coastguard Worker 	{
1169*48a54d36SAndroid Build Coastguard Worker 
1170*48a54d36SAndroid Build Coastguard Worker 		object->Release();
1171*48a54d36SAndroid Build Coastguard Worker 
1172*48a54d36SAndroid Build Coastguard Worker 	}
1173*48a54d36SAndroid Build Coastguard Worker 
1174*48a54d36SAndroid Build Coastguard Worker 
1175*48a54d36SAndroid Build Coastguard Worker 
1176*48a54d36SAndroid Build Coastguard Worker 	return err;
1177*48a54d36SAndroid Build Coastguard Worker 
1178*48a54d36SAndroid Build Coastguard Worker }
1179*48a54d36SAndroid Build Coastguard Worker 
1180*48a54d36SAndroid Build Coastguard Worker 
1181*48a54d36SAndroid Build Coastguard Worker 
1182*48a54d36SAndroid Build Coastguard Worker 
1183*48a54d36SAndroid Build Coastguard Worker 
NATPortMappingCreate(DNSSDFlags flags,ULONG ifIndex,DNSSDAddressFamily addressFamily,DNSSDProtocol protocol,USHORT internalPort,USHORT externalPort,ULONG ttl,IDNSSDEventManager * eventManager,IDNSSDService ** service)1184*48a54d36SAndroid Build Coastguard Worker STDMETHODIMP CDNSSDService::NATPortMappingCreate(DNSSDFlags flags, ULONG ifIndex, DNSSDAddressFamily addressFamily, DNSSDProtocol protocol, USHORT internalPort, USHORT externalPort, ULONG ttl, IDNSSDEventManager *eventManager, IDNSSDService **service)
1185*48a54d36SAndroid Build Coastguard Worker 
1186*48a54d36SAndroid Build Coastguard Worker {
1187*48a54d36SAndroid Build Coastguard Worker 
1188*48a54d36SAndroid Build Coastguard Worker 	CComObject<CDNSSDService>	*	object			= NULL;
1189*48a54d36SAndroid Build Coastguard Worker 
1190*48a54d36SAndroid Build Coastguard Worker 	DNSServiceRef					subord			= NULL;
1191*48a54d36SAndroid Build Coastguard Worker 
1192*48a54d36SAndroid Build Coastguard Worker 	DNSServiceProtocol				prot			= 0;
1193*48a54d36SAndroid Build Coastguard Worker 
1194*48a54d36SAndroid Build Coastguard Worker 	DNSServiceErrorType				err				= 0;
1195*48a54d36SAndroid Build Coastguard Worker 
1196*48a54d36SAndroid Build Coastguard Worker 	HRESULT							hr				= 0;
1197*48a54d36SAndroid Build Coastguard Worker 
1198*48a54d36SAndroid Build Coastguard Worker 
1199*48a54d36SAndroid Build Coastguard Worker 
1200*48a54d36SAndroid Build Coastguard Worker 	check( m_primary );
1201*48a54d36SAndroid Build Coastguard Worker 
1202*48a54d36SAndroid Build Coastguard Worker 
1203*48a54d36SAndroid Build Coastguard Worker 
1204*48a54d36SAndroid Build Coastguard Worker 	// Initialize
1205*48a54d36SAndroid Build Coastguard Worker 
1206*48a54d36SAndroid Build Coastguard Worker 	*service = NULL;
1207*48a54d36SAndroid Build Coastguard Worker 
1208*48a54d36SAndroid Build Coastguard Worker 
1209*48a54d36SAndroid Build Coastguard Worker 
1210*48a54d36SAndroid Build Coastguard Worker 	try
1211*48a54d36SAndroid Build Coastguard Worker 
1212*48a54d36SAndroid Build Coastguard Worker 	{
1213*48a54d36SAndroid Build Coastguard Worker 
1214*48a54d36SAndroid Build Coastguard Worker 		object = new CComObject<CDNSSDService>();
1215*48a54d36SAndroid Build Coastguard Worker 
1216*48a54d36SAndroid Build Coastguard Worker 	}
1217*48a54d36SAndroid Build Coastguard Worker 
1218*48a54d36SAndroid Build Coastguard Worker 	catch ( ... )
1219*48a54d36SAndroid Build Coastguard Worker 
1220*48a54d36SAndroid Build Coastguard Worker 	{
1221*48a54d36SAndroid Build Coastguard Worker 
1222*48a54d36SAndroid Build Coastguard Worker 		object = NULL;
1223*48a54d36SAndroid Build Coastguard Worker 
1224*48a54d36SAndroid Build Coastguard Worker 	}
1225*48a54d36SAndroid Build Coastguard Worker 
1226*48a54d36SAndroid Build Coastguard Worker 
1227*48a54d36SAndroid Build Coastguard Worker 
1228*48a54d36SAndroid Build Coastguard Worker 	require_action( object != NULL, exit, err = kDNSServiceErr_NoMemory );
1229*48a54d36SAndroid Build Coastguard Worker 
1230*48a54d36SAndroid Build Coastguard Worker 	object->AddRef();
1231*48a54d36SAndroid Build Coastguard Worker 
1232*48a54d36SAndroid Build Coastguard Worker 
1233*48a54d36SAndroid Build Coastguard Worker 
1234*48a54d36SAndroid Build Coastguard Worker 	prot = ( addressFamily | protocol );
1235*48a54d36SAndroid Build Coastguard Worker 
1236*48a54d36SAndroid Build Coastguard Worker 
1237*48a54d36SAndroid Build Coastguard Worker 
1238*48a54d36SAndroid Build Coastguard Worker 	subord = m_primary;
1239*48a54d36SAndroid Build Coastguard Worker 
1240*48a54d36SAndroid Build Coastguard Worker 	err = DNSServiceNATPortMappingCreate( &subord, flags | kDNSServiceFlagsShareConnection, ifIndex, prot, htons( internalPort ), htons( externalPort ), ttl, ( DNSServiceNATPortMappingReply ) &NATPortMappingReply, object );
1241*48a54d36SAndroid Build Coastguard Worker 
1242*48a54d36SAndroid Build Coastguard Worker 	require_noerr( err, exit );
1243*48a54d36SAndroid Build Coastguard Worker 
1244*48a54d36SAndroid Build Coastguard Worker 
1245*48a54d36SAndroid Build Coastguard Worker 
1246*48a54d36SAndroid Build Coastguard Worker 	object->SetPrimaryRef( m_primary );
1247*48a54d36SAndroid Build Coastguard Worker 
1248*48a54d36SAndroid Build Coastguard Worker 	object->SetSubordRef( subord );
1249*48a54d36SAndroid Build Coastguard Worker 
1250*48a54d36SAndroid Build Coastguard Worker 	object->SetEventManager( eventManager );
1251*48a54d36SAndroid Build Coastguard Worker 
1252*48a54d36SAndroid Build Coastguard Worker 
1253*48a54d36SAndroid Build Coastguard Worker 
1254*48a54d36SAndroid Build Coastguard Worker 	*service = object;
1255*48a54d36SAndroid Build Coastguard Worker 
1256*48a54d36SAndroid Build Coastguard Worker 
1257*48a54d36SAndroid Build Coastguard Worker 
1258*48a54d36SAndroid Build Coastguard Worker exit:
1259*48a54d36SAndroid Build Coastguard Worker 
1260*48a54d36SAndroid Build Coastguard Worker 
1261*48a54d36SAndroid Build Coastguard Worker 
1262*48a54d36SAndroid Build Coastguard Worker 	if ( err && object )
1263*48a54d36SAndroid Build Coastguard Worker 
1264*48a54d36SAndroid Build Coastguard Worker 	{
1265*48a54d36SAndroid Build Coastguard Worker 
1266*48a54d36SAndroid Build Coastguard Worker 		object->Release();
1267*48a54d36SAndroid Build Coastguard Worker 
1268*48a54d36SAndroid Build Coastguard Worker 	}
1269*48a54d36SAndroid Build Coastguard Worker 
1270*48a54d36SAndroid Build Coastguard Worker 
1271*48a54d36SAndroid Build Coastguard Worker 
1272*48a54d36SAndroid Build Coastguard Worker 	return err;
1273*48a54d36SAndroid Build Coastguard Worker 
1274*48a54d36SAndroid Build Coastguard Worker }
1275*48a54d36SAndroid Build Coastguard Worker 
1276*48a54d36SAndroid Build Coastguard Worker 
1277*48a54d36SAndroid Build Coastguard Worker 
1278*48a54d36SAndroid Build Coastguard Worker 
1279*48a54d36SAndroid Build Coastguard Worker 
Stop(void)1280*48a54d36SAndroid Build Coastguard Worker STDMETHODIMP CDNSSDService::Stop(void)
1281*48a54d36SAndroid Build Coastguard Worker 
1282*48a54d36SAndroid Build Coastguard Worker {
1283*48a54d36SAndroid Build Coastguard Worker 
1284*48a54d36SAndroid Build Coastguard Worker 	if ( !m_stopped )
1285*48a54d36SAndroid Build Coastguard Worker 
1286*48a54d36SAndroid Build Coastguard Worker 	{
1287*48a54d36SAndroid Build Coastguard Worker 
1288*48a54d36SAndroid Build Coastguard Worker 		m_stopped = TRUE;
1289*48a54d36SAndroid Build Coastguard Worker 
1290*48a54d36SAndroid Build Coastguard Worker 
1291*48a54d36SAndroid Build Coastguard Worker 
1292*48a54d36SAndroid Build Coastguard Worker 		dlog( kDebugLevelTrace, "Stop()\n" );
1293*48a54d36SAndroid Build Coastguard Worker 
1294*48a54d36SAndroid Build Coastguard Worker 
1295*48a54d36SAndroid Build Coastguard Worker 
1296*48a54d36SAndroid Build Coastguard Worker 		if ( m_isPrimary && m_primary )
1297*48a54d36SAndroid Build Coastguard Worker 
1298*48a54d36SAndroid Build Coastguard Worker 		{
1299*48a54d36SAndroid Build Coastguard Worker 
1300*48a54d36SAndroid Build Coastguard Worker 			SocketMap::iterator it;
1301*48a54d36SAndroid Build Coastguard Worker 
1302*48a54d36SAndroid Build Coastguard Worker 
1303*48a54d36SAndroid Build Coastguard Worker 
1304*48a54d36SAndroid Build Coastguard Worker 			if ( m_hiddenWindow )
1305*48a54d36SAndroid Build Coastguard Worker 
1306*48a54d36SAndroid Build Coastguard Worker 			{
1307*48a54d36SAndroid Build Coastguard Worker 
1308*48a54d36SAndroid Build Coastguard Worker 				WSAAsyncSelect( DNSServiceRefSockFD( m_primary ), m_hiddenWindow, 0, 0 );
1309*48a54d36SAndroid Build Coastguard Worker 
1310*48a54d36SAndroid Build Coastguard Worker 			}
1311*48a54d36SAndroid Build Coastguard Worker 
1312*48a54d36SAndroid Build Coastguard Worker 
1313*48a54d36SAndroid Build Coastguard Worker 
1314*48a54d36SAndroid Build Coastguard Worker 			it = m_socketMap.find( DNSServiceRefSockFD( m_primary ) );
1315*48a54d36SAndroid Build Coastguard Worker 
1316*48a54d36SAndroid Build Coastguard Worker 
1317*48a54d36SAndroid Build Coastguard Worker 
1318*48a54d36SAndroid Build Coastguard Worker 			if ( it != m_socketMap.end() )
1319*48a54d36SAndroid Build Coastguard Worker 
1320*48a54d36SAndroid Build Coastguard Worker 			{
1321*48a54d36SAndroid Build Coastguard Worker 
1322*48a54d36SAndroid Build Coastguard Worker 				m_socketMap.erase( it );
1323*48a54d36SAndroid Build Coastguard Worker 
1324*48a54d36SAndroid Build Coastguard Worker 			}
1325*48a54d36SAndroid Build Coastguard Worker 
1326*48a54d36SAndroid Build Coastguard Worker 
1327*48a54d36SAndroid Build Coastguard Worker 
1328*48a54d36SAndroid Build Coastguard Worker 			DNSServiceRefDeallocate( m_primary );
1329*48a54d36SAndroid Build Coastguard Worker 
1330*48a54d36SAndroid Build Coastguard Worker 			m_primary = NULL;
1331*48a54d36SAndroid Build Coastguard Worker 
1332*48a54d36SAndroid Build Coastguard Worker 		}
1333*48a54d36SAndroid Build Coastguard Worker 
1334*48a54d36SAndroid Build Coastguard Worker 		else if ( m_subord )
1335*48a54d36SAndroid Build Coastguard Worker 
1336*48a54d36SAndroid Build Coastguard Worker 		{
1337*48a54d36SAndroid Build Coastguard Worker 
1338*48a54d36SAndroid Build Coastguard Worker 			DNSServiceRefDeallocate( m_subord );
1339*48a54d36SAndroid Build Coastguard Worker 
1340*48a54d36SAndroid Build Coastguard Worker 			m_subord = NULL;
1341*48a54d36SAndroid Build Coastguard Worker 
1342*48a54d36SAndroid Build Coastguard Worker 		}
1343*48a54d36SAndroid Build Coastguard Worker 
1344*48a54d36SAndroid Build Coastguard Worker 
1345*48a54d36SAndroid Build Coastguard Worker 
1346*48a54d36SAndroid Build Coastguard Worker 		if ( m_eventManager != NULL )
1347*48a54d36SAndroid Build Coastguard Worker 
1348*48a54d36SAndroid Build Coastguard Worker 		{
1349*48a54d36SAndroid Build Coastguard Worker 
1350*48a54d36SAndroid Build Coastguard Worker 			m_eventManager->Release();
1351*48a54d36SAndroid Build Coastguard Worker 
1352*48a54d36SAndroid Build Coastguard Worker 			m_eventManager = NULL;
1353*48a54d36SAndroid Build Coastguard Worker 
1354*48a54d36SAndroid Build Coastguard Worker 		}
1355*48a54d36SAndroid Build Coastguard Worker 
1356*48a54d36SAndroid Build Coastguard Worker 	}
1357*48a54d36SAndroid Build Coastguard Worker 
1358*48a54d36SAndroid Build Coastguard Worker 
1359*48a54d36SAndroid Build Coastguard Worker 
1360*48a54d36SAndroid Build Coastguard Worker 	return S_OK;
1361*48a54d36SAndroid Build Coastguard Worker 
1362*48a54d36SAndroid Build Coastguard Worker }
1363*48a54d36SAndroid Build Coastguard Worker 
1364*48a54d36SAndroid Build Coastguard Worker 
1365*48a54d36SAndroid Build Coastguard Worker 
1366*48a54d36SAndroid Build Coastguard Worker 
1367*48a54d36SAndroid Build Coastguard Worker 
1368*48a54d36SAndroid Build Coastguard Worker void DNSSD_API
DomainEnumReply(DNSServiceRef sdRef,DNSServiceFlags flags,uint32_t ifIndex,DNSServiceErrorType errorCode,const char * replyDomainUTF8,void * context)1369*48a54d36SAndroid Build Coastguard Worker CDNSSDService::DomainEnumReply
1370*48a54d36SAndroid Build Coastguard Worker     (
1371*48a54d36SAndroid Build Coastguard Worker     DNSServiceRef                       sdRef,
1372*48a54d36SAndroid Build Coastguard Worker     DNSServiceFlags                     flags,
1373*48a54d36SAndroid Build Coastguard Worker     uint32_t                            ifIndex,
1374*48a54d36SAndroid Build Coastguard Worker     DNSServiceErrorType                 errorCode,
1375*48a54d36SAndroid Build Coastguard Worker     const char                          *replyDomainUTF8,
1376*48a54d36SAndroid Build Coastguard Worker     void                                *context
1377*48a54d36SAndroid Build Coastguard Worker     )
1378*48a54d36SAndroid Build Coastguard Worker 
1379*48a54d36SAndroid Build Coastguard Worker {
1380*48a54d36SAndroid Build Coastguard Worker 
1381*48a54d36SAndroid Build Coastguard Worker 	CComObject<CDNSSDService>	* service		= NULL;
1382*48a54d36SAndroid Build Coastguard Worker 
1383*48a54d36SAndroid Build Coastguard Worker 	CDNSSDEventManager			* eventManager	= NULL;
1384*48a54d36SAndroid Build Coastguard Worker 
1385*48a54d36SAndroid Build Coastguard Worker 	int err = 0;
1386*48a54d36SAndroid Build Coastguard Worker 
1387*48a54d36SAndroid Build Coastguard Worker 
1388*48a54d36SAndroid Build Coastguard Worker 
1389*48a54d36SAndroid Build Coastguard Worker 	service = ( CComObject< CDNSSDService>* ) context;
1390*48a54d36SAndroid Build Coastguard Worker 
1391*48a54d36SAndroid Build Coastguard Worker 	require_action( service, exit, err = kDNSServiceErr_Unknown );
1392*48a54d36SAndroid Build Coastguard Worker 
1393*48a54d36SAndroid Build Coastguard Worker 
1394*48a54d36SAndroid Build Coastguard Worker 
1395*48a54d36SAndroid Build Coastguard Worker 	if ( service->ShouldHandleReply( errorCode, eventManager ) )
1396*48a54d36SAndroid Build Coastguard Worker 
1397*48a54d36SAndroid Build Coastguard Worker 	{
1398*48a54d36SAndroid Build Coastguard Worker 
1399*48a54d36SAndroid Build Coastguard Worker 		CComBSTR replyDomain;
1400*48a54d36SAndroid Build Coastguard Worker 
1401*48a54d36SAndroid Build Coastguard Worker 		BOOL ok;
1402*48a54d36SAndroid Build Coastguard Worker 
1403*48a54d36SAndroid Build Coastguard Worker 
1404*48a54d36SAndroid Build Coastguard Worker 
1405*48a54d36SAndroid Build Coastguard Worker 		ok = UTF8ToBSTR( replyDomainUTF8, replyDomain );
1406*48a54d36SAndroid Build Coastguard Worker 
1407*48a54d36SAndroid Build Coastguard Worker 		require_action( ok, exit, err = kDNSServiceErr_Unknown );
1408*48a54d36SAndroid Build Coastguard Worker 
1409*48a54d36SAndroid Build Coastguard Worker 
1410*48a54d36SAndroid Build Coastguard Worker 
1411*48a54d36SAndroid Build Coastguard Worker 		if ( flags & kDNSServiceFlagsAdd )
1412*48a54d36SAndroid Build Coastguard Worker 
1413*48a54d36SAndroid Build Coastguard Worker 		{
1414*48a54d36SAndroid Build Coastguard Worker 
1415*48a54d36SAndroid Build Coastguard Worker 			eventManager->Fire_DomainFound( service, ( DNSSDFlags ) flags, ifIndex, replyDomain );
1416*48a54d36SAndroid Build Coastguard Worker 
1417*48a54d36SAndroid Build Coastguard Worker 		}
1418*48a54d36SAndroid Build Coastguard Worker 
1419*48a54d36SAndroid Build Coastguard Worker 		else
1420*48a54d36SAndroid Build Coastguard Worker 
1421*48a54d36SAndroid Build Coastguard Worker 		{
1422*48a54d36SAndroid Build Coastguard Worker 
1423*48a54d36SAndroid Build Coastguard Worker 			eventManager->Fire_DomainLost( service, ( DNSSDFlags ) flags, ifIndex, replyDomain );
1424*48a54d36SAndroid Build Coastguard Worker 
1425*48a54d36SAndroid Build Coastguard Worker 		}
1426*48a54d36SAndroid Build Coastguard Worker 
1427*48a54d36SAndroid Build Coastguard Worker 	}
1428*48a54d36SAndroid Build Coastguard Worker 
1429*48a54d36SAndroid Build Coastguard Worker 
1430*48a54d36SAndroid Build Coastguard Worker 
1431*48a54d36SAndroid Build Coastguard Worker exit:
1432*48a54d36SAndroid Build Coastguard Worker 
1433*48a54d36SAndroid Build Coastguard Worker 
1434*48a54d36SAndroid Build Coastguard Worker 
1435*48a54d36SAndroid Build Coastguard Worker 	return;
1436*48a54d36SAndroid Build Coastguard Worker 
1437*48a54d36SAndroid Build Coastguard Worker }
1438*48a54d36SAndroid Build Coastguard Worker 
1439*48a54d36SAndroid Build Coastguard Worker 
1440*48a54d36SAndroid Build Coastguard Worker 
1441*48a54d36SAndroid Build Coastguard Worker 
1442*48a54d36SAndroid Build Coastguard Worker 
1443*48a54d36SAndroid Build Coastguard Worker void DNSSD_API
BrowseReply(DNSServiceRef sdRef,DNSServiceFlags flags,uint32_t ifIndex,DNSServiceErrorType errorCode,const char * serviceNameUTF8,const char * regTypeUTF8,const char * replyDomainUTF8,void * context)1444*48a54d36SAndroid Build Coastguard Worker CDNSSDService::BrowseReply
1445*48a54d36SAndroid Build Coastguard Worker 		(
1446*48a54d36SAndroid Build Coastguard Worker 		DNSServiceRef                       sdRef,
1447*48a54d36SAndroid Build Coastguard Worker 		DNSServiceFlags                     flags,
1448*48a54d36SAndroid Build Coastguard Worker 		uint32_t                            ifIndex,
1449*48a54d36SAndroid Build Coastguard Worker 		DNSServiceErrorType                 errorCode,
1450*48a54d36SAndroid Build Coastguard Worker 		const char                          *serviceNameUTF8,
1451*48a54d36SAndroid Build Coastguard Worker 		const char                          *regTypeUTF8,
1452*48a54d36SAndroid Build Coastguard Worker 		const char                          *replyDomainUTF8,
1453*48a54d36SAndroid Build Coastguard Worker 		void                                *context
1454*48a54d36SAndroid Build Coastguard Worker 		)
1455*48a54d36SAndroid Build Coastguard Worker 
1456*48a54d36SAndroid Build Coastguard Worker {
1457*48a54d36SAndroid Build Coastguard Worker 
1458*48a54d36SAndroid Build Coastguard Worker 	CComObject<CDNSSDService>	* service		= NULL;
1459*48a54d36SAndroid Build Coastguard Worker 
1460*48a54d36SAndroid Build Coastguard Worker 	CDNSSDEventManager			* eventManager	= NULL;
1461*48a54d36SAndroid Build Coastguard Worker 
1462*48a54d36SAndroid Build Coastguard Worker 	int err = 0;
1463*48a54d36SAndroid Build Coastguard Worker 
1464*48a54d36SAndroid Build Coastguard Worker 
1465*48a54d36SAndroid Build Coastguard Worker 
1466*48a54d36SAndroid Build Coastguard Worker 	service = ( CComObject< CDNSSDService>* ) context;
1467*48a54d36SAndroid Build Coastguard Worker 
1468*48a54d36SAndroid Build Coastguard Worker 	require_action( service, exit, err = kDNSServiceErr_Unknown );
1469*48a54d36SAndroid Build Coastguard Worker 
1470*48a54d36SAndroid Build Coastguard Worker 
1471*48a54d36SAndroid Build Coastguard Worker 
1472*48a54d36SAndroid Build Coastguard Worker 	if ( service->ShouldHandleReply( errorCode, eventManager ) )
1473*48a54d36SAndroid Build Coastguard Worker 
1474*48a54d36SAndroid Build Coastguard Worker 	{
1475*48a54d36SAndroid Build Coastguard Worker 
1476*48a54d36SAndroid Build Coastguard Worker 		CComBSTR	serviceName;
1477*48a54d36SAndroid Build Coastguard Worker 
1478*48a54d36SAndroid Build Coastguard Worker 		CComBSTR	regType;
1479*48a54d36SAndroid Build Coastguard Worker 
1480*48a54d36SAndroid Build Coastguard Worker 		CComBSTR	replyDomain;
1481*48a54d36SAndroid Build Coastguard Worker 
1482*48a54d36SAndroid Build Coastguard Worker 
1483*48a54d36SAndroid Build Coastguard Worker 
1484*48a54d36SAndroid Build Coastguard Worker 		UTF8ToBSTR( serviceNameUTF8, serviceName );
1485*48a54d36SAndroid Build Coastguard Worker 
1486*48a54d36SAndroid Build Coastguard Worker 		UTF8ToBSTR( regTypeUTF8, regType );
1487*48a54d36SAndroid Build Coastguard Worker 
1488*48a54d36SAndroid Build Coastguard Worker 		UTF8ToBSTR( replyDomainUTF8, replyDomain );
1489*48a54d36SAndroid Build Coastguard Worker 
1490*48a54d36SAndroid Build Coastguard Worker 
1491*48a54d36SAndroid Build Coastguard Worker 
1492*48a54d36SAndroid Build Coastguard Worker 		if ( flags & kDNSServiceFlagsAdd )
1493*48a54d36SAndroid Build Coastguard Worker 
1494*48a54d36SAndroid Build Coastguard Worker 		{
1495*48a54d36SAndroid Build Coastguard Worker 
1496*48a54d36SAndroid Build Coastguard Worker 			eventManager->Fire_ServiceFound( service, ( DNSSDFlags ) flags, ifIndex, serviceName, regType, replyDomain );
1497*48a54d36SAndroid Build Coastguard Worker 
1498*48a54d36SAndroid Build Coastguard Worker 		}
1499*48a54d36SAndroid Build Coastguard Worker 
1500*48a54d36SAndroid Build Coastguard Worker 		else
1501*48a54d36SAndroid Build Coastguard Worker 
1502*48a54d36SAndroid Build Coastguard Worker 		{
1503*48a54d36SAndroid Build Coastguard Worker 
1504*48a54d36SAndroid Build Coastguard Worker 			eventManager->Fire_ServiceLost( service, ( DNSSDFlags ) flags, ifIndex, serviceName, regType, replyDomain );
1505*48a54d36SAndroid Build Coastguard Worker 
1506*48a54d36SAndroid Build Coastguard Worker 		}
1507*48a54d36SAndroid Build Coastguard Worker 
1508*48a54d36SAndroid Build Coastguard Worker 	}
1509*48a54d36SAndroid Build Coastguard Worker 
1510*48a54d36SAndroid Build Coastguard Worker 
1511*48a54d36SAndroid Build Coastguard Worker 
1512*48a54d36SAndroid Build Coastguard Worker exit:
1513*48a54d36SAndroid Build Coastguard Worker 
1514*48a54d36SAndroid Build Coastguard Worker 
1515*48a54d36SAndroid Build Coastguard Worker 
1516*48a54d36SAndroid Build Coastguard Worker 	return;
1517*48a54d36SAndroid Build Coastguard Worker 
1518*48a54d36SAndroid Build Coastguard Worker }
1519*48a54d36SAndroid Build Coastguard Worker 
1520*48a54d36SAndroid Build Coastguard Worker 
1521*48a54d36SAndroid Build Coastguard Worker 
1522*48a54d36SAndroid Build Coastguard Worker 
1523*48a54d36SAndroid Build Coastguard Worker 
1524*48a54d36SAndroid Build Coastguard Worker void DNSSD_API
1525*48a54d36SAndroid Build Coastguard Worker 
ResolveReply(DNSServiceRef sdRef,DNSServiceFlags flags,uint32_t ifIndex,DNSServiceErrorType errorCode,const char * fullNameUTF8,const char * hostNameUTF8,uint16_t port,uint16_t txtLen,const unsigned char * txtRecord,void * context)1526*48a54d36SAndroid Build Coastguard Worker CDNSSDService::ResolveReply
1527*48a54d36SAndroid Build Coastguard Worker 
1528*48a54d36SAndroid Build Coastguard Worker 		(
1529*48a54d36SAndroid Build Coastguard Worker 		DNSServiceRef                       sdRef,
1530*48a54d36SAndroid Build Coastguard Worker 		DNSServiceFlags                     flags,
1531*48a54d36SAndroid Build Coastguard Worker 		uint32_t                            ifIndex,
1532*48a54d36SAndroid Build Coastguard Worker 		DNSServiceErrorType                 errorCode,
1533*48a54d36SAndroid Build Coastguard Worker 		const char                          *fullNameUTF8,
1534*48a54d36SAndroid Build Coastguard Worker 		const char                          *hostNameUTF8,
1535*48a54d36SAndroid Build Coastguard Worker 		uint16_t                            port,
1536*48a54d36SAndroid Build Coastguard Worker 		uint16_t                            txtLen,
1537*48a54d36SAndroid Build Coastguard Worker 		const unsigned char                 *txtRecord,
1538*48a54d36SAndroid Build Coastguard Worker 		void                                *context
1539*48a54d36SAndroid Build Coastguard Worker 
1540*48a54d36SAndroid Build Coastguard Worker 		)
1541*48a54d36SAndroid Build Coastguard Worker 
1542*48a54d36SAndroid Build Coastguard Worker {
1543*48a54d36SAndroid Build Coastguard Worker 
1544*48a54d36SAndroid Build Coastguard Worker 	CComObject<CDNSSDService>	* service		= NULL;
1545*48a54d36SAndroid Build Coastguard Worker 
1546*48a54d36SAndroid Build Coastguard Worker 	CDNSSDEventManager			* eventManager	= NULL;
1547*48a54d36SAndroid Build Coastguard Worker 
1548*48a54d36SAndroid Build Coastguard Worker 	int err = 0;
1549*48a54d36SAndroid Build Coastguard Worker 
1550*48a54d36SAndroid Build Coastguard Worker 
1551*48a54d36SAndroid Build Coastguard Worker 
1552*48a54d36SAndroid Build Coastguard Worker 	service = ( CComObject< CDNSSDService>* ) context;
1553*48a54d36SAndroid Build Coastguard Worker 
1554*48a54d36SAndroid Build Coastguard Worker 	require_action( service, exit, err = kDNSServiceErr_Unknown );
1555*48a54d36SAndroid Build Coastguard Worker 
1556*48a54d36SAndroid Build Coastguard Worker 
1557*48a54d36SAndroid Build Coastguard Worker 
1558*48a54d36SAndroid Build Coastguard Worker 	if ( service->ShouldHandleReply( errorCode, eventManager ) )
1559*48a54d36SAndroid Build Coastguard Worker 
1560*48a54d36SAndroid Build Coastguard Worker 	{
1561*48a54d36SAndroid Build Coastguard Worker 
1562*48a54d36SAndroid Build Coastguard Worker 		CComBSTR					fullName;
1563*48a54d36SAndroid Build Coastguard Worker 
1564*48a54d36SAndroid Build Coastguard Worker 		CComBSTR					hostName;
1565*48a54d36SAndroid Build Coastguard Worker 
1566*48a54d36SAndroid Build Coastguard Worker 		CComBSTR					regType;
1567*48a54d36SAndroid Build Coastguard Worker 
1568*48a54d36SAndroid Build Coastguard Worker 		CComBSTR					replyDomain;
1569*48a54d36SAndroid Build Coastguard Worker 
1570*48a54d36SAndroid Build Coastguard Worker 		CComObject< CTXTRecord >*	record;
1571*48a54d36SAndroid Build Coastguard Worker 
1572*48a54d36SAndroid Build Coastguard Worker 		BOOL						ok;
1573*48a54d36SAndroid Build Coastguard Worker 
1574*48a54d36SAndroid Build Coastguard Worker 
1575*48a54d36SAndroid Build Coastguard Worker 
1576*48a54d36SAndroid Build Coastguard Worker 		ok = UTF8ToBSTR( fullNameUTF8, fullName );
1577*48a54d36SAndroid Build Coastguard Worker 
1578*48a54d36SAndroid Build Coastguard Worker 		require_action( ok, exit, err = kDNSServiceErr_Unknown );
1579*48a54d36SAndroid Build Coastguard Worker 
1580*48a54d36SAndroid Build Coastguard Worker 		ok = UTF8ToBSTR( hostNameUTF8, hostName );
1581*48a54d36SAndroid Build Coastguard Worker 
1582*48a54d36SAndroid Build Coastguard Worker 		require_action( ok, exit, err = kDNSServiceErr_Unknown );
1583*48a54d36SAndroid Build Coastguard Worker 
1584*48a54d36SAndroid Build Coastguard Worker 
1585*48a54d36SAndroid Build Coastguard Worker 
1586*48a54d36SAndroid Build Coastguard Worker 		try
1587*48a54d36SAndroid Build Coastguard Worker 
1588*48a54d36SAndroid Build Coastguard Worker 		{
1589*48a54d36SAndroid Build Coastguard Worker 
1590*48a54d36SAndroid Build Coastguard Worker 			record = new CComObject<CTXTRecord>();
1591*48a54d36SAndroid Build Coastguard Worker 
1592*48a54d36SAndroid Build Coastguard Worker 		}
1593*48a54d36SAndroid Build Coastguard Worker 
1594*48a54d36SAndroid Build Coastguard Worker 		catch ( ... )
1595*48a54d36SAndroid Build Coastguard Worker 
1596*48a54d36SAndroid Build Coastguard Worker 		{
1597*48a54d36SAndroid Build Coastguard Worker 
1598*48a54d36SAndroid Build Coastguard Worker 			record = NULL;
1599*48a54d36SAndroid Build Coastguard Worker 
1600*48a54d36SAndroid Build Coastguard Worker 		}
1601*48a54d36SAndroid Build Coastguard Worker 
1602*48a54d36SAndroid Build Coastguard Worker 
1603*48a54d36SAndroid Build Coastguard Worker 
1604*48a54d36SAndroid Build Coastguard Worker 		require_action( record, exit, err = kDNSServiceErr_NoMemory );
1605*48a54d36SAndroid Build Coastguard Worker 
1606*48a54d36SAndroid Build Coastguard Worker 		record->AddRef();
1607*48a54d36SAndroid Build Coastguard Worker 
1608*48a54d36SAndroid Build Coastguard Worker 
1609*48a54d36SAndroid Build Coastguard Worker 
1610*48a54d36SAndroid Build Coastguard Worker 		if ( txtLen > 0 )
1611*48a54d36SAndroid Build Coastguard Worker 
1612*48a54d36SAndroid Build Coastguard Worker 		{
1613*48a54d36SAndroid Build Coastguard Worker 
1614*48a54d36SAndroid Build Coastguard Worker 			record->SetBytes( txtRecord, txtLen );
1615*48a54d36SAndroid Build Coastguard Worker 
1616*48a54d36SAndroid Build Coastguard Worker 		}
1617*48a54d36SAndroid Build Coastguard Worker 
1618*48a54d36SAndroid Build Coastguard Worker 
1619*48a54d36SAndroid Build Coastguard Worker 
1620*48a54d36SAndroid Build Coastguard Worker 		eventManager->Fire_ServiceResolved( service, ( DNSSDFlags ) flags, ifIndex, fullName, hostName, ntohs( port ), record );
1621*48a54d36SAndroid Build Coastguard Worker 
1622*48a54d36SAndroid Build Coastguard Worker 	}
1623*48a54d36SAndroid Build Coastguard Worker 
1624*48a54d36SAndroid Build Coastguard Worker 
1625*48a54d36SAndroid Build Coastguard Worker 
1626*48a54d36SAndroid Build Coastguard Worker exit:
1627*48a54d36SAndroid Build Coastguard Worker 
1628*48a54d36SAndroid Build Coastguard Worker 
1629*48a54d36SAndroid Build Coastguard Worker 
1630*48a54d36SAndroid Build Coastguard Worker 	return;
1631*48a54d36SAndroid Build Coastguard Worker 
1632*48a54d36SAndroid Build Coastguard Worker }
1633*48a54d36SAndroid Build Coastguard Worker 
1634*48a54d36SAndroid Build Coastguard Worker 
1635*48a54d36SAndroid Build Coastguard Worker 
1636*48a54d36SAndroid Build Coastguard Worker 
1637*48a54d36SAndroid Build Coastguard Worker 
1638*48a54d36SAndroid Build Coastguard Worker void DNSSD_API
RegisterReply(DNSServiceRef sdRef,DNSServiceFlags flags,DNSServiceErrorType errorCode,const char * serviceNameUTF8,const char * regTypeUTF8,const char * domainUTF8,void * context)1639*48a54d36SAndroid Build Coastguard Worker CDNSSDService::RegisterReply
1640*48a54d36SAndroid Build Coastguard Worker 		(
1641*48a54d36SAndroid Build Coastguard Worker 		DNSServiceRef                       sdRef,
1642*48a54d36SAndroid Build Coastguard Worker 		DNSServiceFlags                     flags,
1643*48a54d36SAndroid Build Coastguard Worker 		DNSServiceErrorType                 errorCode,
1644*48a54d36SAndroid Build Coastguard Worker 		const char                          *serviceNameUTF8,
1645*48a54d36SAndroid Build Coastguard Worker 		const char                          *regTypeUTF8,
1646*48a54d36SAndroid Build Coastguard Worker 		const char                          *domainUTF8,
1647*48a54d36SAndroid Build Coastguard Worker 		void                                *context
1648*48a54d36SAndroid Build Coastguard Worker 		)
1649*48a54d36SAndroid Build Coastguard Worker 
1650*48a54d36SAndroid Build Coastguard Worker {
1651*48a54d36SAndroid Build Coastguard Worker 
1652*48a54d36SAndroid Build Coastguard Worker 	CComObject<CDNSSDService>	* service		= NULL;
1653*48a54d36SAndroid Build Coastguard Worker 
1654*48a54d36SAndroid Build Coastguard Worker 	CDNSSDEventManager			* eventManager	= NULL;
1655*48a54d36SAndroid Build Coastguard Worker 
1656*48a54d36SAndroid Build Coastguard Worker 	int err = 0;
1657*48a54d36SAndroid Build Coastguard Worker 
1658*48a54d36SAndroid Build Coastguard Worker 
1659*48a54d36SAndroid Build Coastguard Worker 
1660*48a54d36SAndroid Build Coastguard Worker 	service = ( CComObject< CDNSSDService>* ) context;
1661*48a54d36SAndroid Build Coastguard Worker 
1662*48a54d36SAndroid Build Coastguard Worker 	require_action( service, exit, err = kDNSServiceErr_Unknown );
1663*48a54d36SAndroid Build Coastguard Worker 
1664*48a54d36SAndroid Build Coastguard Worker 
1665*48a54d36SAndroid Build Coastguard Worker 
1666*48a54d36SAndroid Build Coastguard Worker 	if ( service->ShouldHandleReply( errorCode, eventManager ) )
1667*48a54d36SAndroid Build Coastguard Worker 
1668*48a54d36SAndroid Build Coastguard Worker 	{
1669*48a54d36SAndroid Build Coastguard Worker 
1670*48a54d36SAndroid Build Coastguard Worker 		CComBSTR					serviceName;
1671*48a54d36SAndroid Build Coastguard Worker 
1672*48a54d36SAndroid Build Coastguard Worker 		CComBSTR					regType;
1673*48a54d36SAndroid Build Coastguard Worker 
1674*48a54d36SAndroid Build Coastguard Worker 		CComBSTR					domain;
1675*48a54d36SAndroid Build Coastguard Worker 
1676*48a54d36SAndroid Build Coastguard Worker 		BOOL						ok;
1677*48a54d36SAndroid Build Coastguard Worker 
1678*48a54d36SAndroid Build Coastguard Worker 
1679*48a54d36SAndroid Build Coastguard Worker 
1680*48a54d36SAndroid Build Coastguard Worker 		ok = UTF8ToBSTR( serviceNameUTF8, serviceName );
1681*48a54d36SAndroid Build Coastguard Worker 
1682*48a54d36SAndroid Build Coastguard Worker 		require_action( ok, exit, err = kDNSServiceErr_Unknown );
1683*48a54d36SAndroid Build Coastguard Worker 
1684*48a54d36SAndroid Build Coastguard Worker 		ok = UTF8ToBSTR( regTypeUTF8, regType );
1685*48a54d36SAndroid Build Coastguard Worker 
1686*48a54d36SAndroid Build Coastguard Worker 		require_action( ok, exit, err = kDNSServiceErr_Unknown );
1687*48a54d36SAndroid Build Coastguard Worker 
1688*48a54d36SAndroid Build Coastguard Worker 		ok = UTF8ToBSTR( domainUTF8, domain );
1689*48a54d36SAndroid Build Coastguard Worker 
1690*48a54d36SAndroid Build Coastguard Worker 		require_action( ok, exit, err = kDNSServiceErr_Unknown );
1691*48a54d36SAndroid Build Coastguard Worker 
1692*48a54d36SAndroid Build Coastguard Worker 
1693*48a54d36SAndroid Build Coastguard Worker 
1694*48a54d36SAndroid Build Coastguard Worker 		eventManager->Fire_ServiceRegistered( service, ( DNSSDFlags ) flags, serviceName, regType, domain );
1695*48a54d36SAndroid Build Coastguard Worker 
1696*48a54d36SAndroid Build Coastguard Worker 	}
1697*48a54d36SAndroid Build Coastguard Worker 
1698*48a54d36SAndroid Build Coastguard Worker 
1699*48a54d36SAndroid Build Coastguard Worker 
1700*48a54d36SAndroid Build Coastguard Worker exit:
1701*48a54d36SAndroid Build Coastguard Worker 
1702*48a54d36SAndroid Build Coastguard Worker 
1703*48a54d36SAndroid Build Coastguard Worker 
1704*48a54d36SAndroid Build Coastguard Worker 	return;
1705*48a54d36SAndroid Build Coastguard Worker 
1706*48a54d36SAndroid Build Coastguard Worker }
1707*48a54d36SAndroid Build Coastguard Worker 
1708*48a54d36SAndroid Build Coastguard Worker 
1709*48a54d36SAndroid Build Coastguard Worker 
1710*48a54d36SAndroid Build Coastguard Worker 
1711*48a54d36SAndroid Build Coastguard Worker 
1712*48a54d36SAndroid Build Coastguard Worker void DNSSD_API
QueryRecordReply(DNSServiceRef sdRef,DNSServiceFlags flags,uint32_t ifIndex,DNSServiceErrorType errorCode,const char * fullNameUTF8,uint16_t rrtype,uint16_t rrclass,uint16_t rdlen,const void * rdata,uint32_t ttl,void * context)1713*48a54d36SAndroid Build Coastguard Worker CDNSSDService::QueryRecordReply
1714*48a54d36SAndroid Build Coastguard Worker 		(
1715*48a54d36SAndroid Build Coastguard Worker 		DNSServiceRef                       sdRef,
1716*48a54d36SAndroid Build Coastguard Worker 		DNSServiceFlags                     flags,
1717*48a54d36SAndroid Build Coastguard Worker 		uint32_t                            ifIndex,
1718*48a54d36SAndroid Build Coastguard Worker 		DNSServiceErrorType                 errorCode,
1719*48a54d36SAndroid Build Coastguard Worker 		const char                          *fullNameUTF8,
1720*48a54d36SAndroid Build Coastguard Worker 		uint16_t                            rrtype,
1721*48a54d36SAndroid Build Coastguard Worker 		uint16_t                            rrclass,
1722*48a54d36SAndroid Build Coastguard Worker 		uint16_t                            rdlen,
1723*48a54d36SAndroid Build Coastguard Worker 		const void                          *rdata,
1724*48a54d36SAndroid Build Coastguard Worker 		uint32_t                            ttl,
1725*48a54d36SAndroid Build Coastguard Worker 		void                                *context
1726*48a54d36SAndroid Build Coastguard Worker 		)
1727*48a54d36SAndroid Build Coastguard Worker 
1728*48a54d36SAndroid Build Coastguard Worker {
1729*48a54d36SAndroid Build Coastguard Worker 
1730*48a54d36SAndroid Build Coastguard Worker 	CComObject<CDNSSDService>	* service		= NULL;
1731*48a54d36SAndroid Build Coastguard Worker 
1732*48a54d36SAndroid Build Coastguard Worker 	CDNSSDEventManager			* eventManager	= NULL;
1733*48a54d36SAndroid Build Coastguard Worker 
1734*48a54d36SAndroid Build Coastguard Worker 	int err = 0;
1735*48a54d36SAndroid Build Coastguard Worker 
1736*48a54d36SAndroid Build Coastguard Worker 
1737*48a54d36SAndroid Build Coastguard Worker 
1738*48a54d36SAndroid Build Coastguard Worker 	service = ( CComObject< CDNSSDService>* ) context;
1739*48a54d36SAndroid Build Coastguard Worker 
1740*48a54d36SAndroid Build Coastguard Worker 	require_action( service, exit, err = kDNSServiceErr_Unknown );
1741*48a54d36SAndroid Build Coastguard Worker 
1742*48a54d36SAndroid Build Coastguard Worker 
1743*48a54d36SAndroid Build Coastguard Worker 
1744*48a54d36SAndroid Build Coastguard Worker 	if ( service->ShouldHandleReply( errorCode, eventManager ) )
1745*48a54d36SAndroid Build Coastguard Worker 
1746*48a54d36SAndroid Build Coastguard Worker 	{
1747*48a54d36SAndroid Build Coastguard Worker 
1748*48a54d36SAndroid Build Coastguard Worker 		CComBSTR	fullName;
1749*48a54d36SAndroid Build Coastguard Worker 
1750*48a54d36SAndroid Build Coastguard Worker 		VARIANT		var;
1751*48a54d36SAndroid Build Coastguard Worker 
1752*48a54d36SAndroid Build Coastguard Worker 		BOOL		ok;
1753*48a54d36SAndroid Build Coastguard Worker 
1754*48a54d36SAndroid Build Coastguard Worker 
1755*48a54d36SAndroid Build Coastguard Worker 
1756*48a54d36SAndroid Build Coastguard Worker 		ok = UTF8ToBSTR( fullNameUTF8, fullName );
1757*48a54d36SAndroid Build Coastguard Worker 
1758*48a54d36SAndroid Build Coastguard Worker 		require_action( ok, exit, err = kDNSServiceErr_Unknown );
1759*48a54d36SAndroid Build Coastguard Worker 
1760*48a54d36SAndroid Build Coastguard Worker 		ok = ByteArrayToVariant( rdata, rdlen, &var );
1761*48a54d36SAndroid Build Coastguard Worker 
1762*48a54d36SAndroid Build Coastguard Worker 		require_action( ok, exit, err = kDNSServiceErr_Unknown );
1763*48a54d36SAndroid Build Coastguard Worker 
1764*48a54d36SAndroid Build Coastguard Worker 
1765*48a54d36SAndroid Build Coastguard Worker 
1766*48a54d36SAndroid Build Coastguard Worker 		eventManager->Fire_QueryRecordAnswered( service, ( DNSSDFlags ) flags, ifIndex, fullName, ( DNSSDRRType ) rrtype, ( DNSSDRRClass ) rrclass, var, ttl );
1767*48a54d36SAndroid Build Coastguard Worker 
1768*48a54d36SAndroid Build Coastguard Worker 	}
1769*48a54d36SAndroid Build Coastguard Worker 
1770*48a54d36SAndroid Build Coastguard Worker 
1771*48a54d36SAndroid Build Coastguard Worker 
1772*48a54d36SAndroid Build Coastguard Worker exit:
1773*48a54d36SAndroid Build Coastguard Worker 
1774*48a54d36SAndroid Build Coastguard Worker 
1775*48a54d36SAndroid Build Coastguard Worker 
1776*48a54d36SAndroid Build Coastguard Worker 	return;
1777*48a54d36SAndroid Build Coastguard Worker 
1778*48a54d36SAndroid Build Coastguard Worker }
1779*48a54d36SAndroid Build Coastguard Worker 
1780*48a54d36SAndroid Build Coastguard Worker 
1781*48a54d36SAndroid Build Coastguard Worker 
1782*48a54d36SAndroid Build Coastguard Worker 
1783*48a54d36SAndroid Build Coastguard Worker 
1784*48a54d36SAndroid Build Coastguard Worker void DNSSD_API
GetAddrInfoReply(DNSServiceRef sdRef,DNSServiceFlags flags,uint32_t ifIndex,DNSServiceErrorType errorCode,const char * hostNameUTF8,const struct sockaddr * rawAddress,uint32_t ttl,void * context)1785*48a54d36SAndroid Build Coastguard Worker CDNSSDService::GetAddrInfoReply
1786*48a54d36SAndroid Build Coastguard Worker 		(
1787*48a54d36SAndroid Build Coastguard Worker 		DNSServiceRef                    sdRef,
1788*48a54d36SAndroid Build Coastguard Worker 		DNSServiceFlags                  flags,
1789*48a54d36SAndroid Build Coastguard Worker 		uint32_t                         ifIndex,
1790*48a54d36SAndroid Build Coastguard Worker 		DNSServiceErrorType              errorCode,
1791*48a54d36SAndroid Build Coastguard Worker 		const char                       *hostNameUTF8,
1792*48a54d36SAndroid Build Coastguard Worker 		const struct sockaddr            *rawAddress,
1793*48a54d36SAndroid Build Coastguard Worker 		uint32_t                         ttl,
1794*48a54d36SAndroid Build Coastguard Worker 		void                             *context
1795*48a54d36SAndroid Build Coastguard Worker 		)
1796*48a54d36SAndroid Build Coastguard Worker 
1797*48a54d36SAndroid Build Coastguard Worker {
1798*48a54d36SAndroid Build Coastguard Worker 
1799*48a54d36SAndroid Build Coastguard Worker 	CComObject<CDNSSDService>	* service		= NULL;
1800*48a54d36SAndroid Build Coastguard Worker 
1801*48a54d36SAndroid Build Coastguard Worker 	CDNSSDEventManager			* eventManager	= NULL;
1802*48a54d36SAndroid Build Coastguard Worker 
1803*48a54d36SAndroid Build Coastguard Worker 	int err = 0;
1804*48a54d36SAndroid Build Coastguard Worker 
1805*48a54d36SAndroid Build Coastguard Worker 
1806*48a54d36SAndroid Build Coastguard Worker 
1807*48a54d36SAndroid Build Coastguard Worker 	service = ( CComObject< CDNSSDService>* ) context;
1808*48a54d36SAndroid Build Coastguard Worker 
1809*48a54d36SAndroid Build Coastguard Worker 	require_action( service, exit, err = kDNSServiceErr_Unknown );
1810*48a54d36SAndroid Build Coastguard Worker 
1811*48a54d36SAndroid Build Coastguard Worker 
1812*48a54d36SAndroid Build Coastguard Worker 
1813*48a54d36SAndroid Build Coastguard Worker 	if ( service->ShouldHandleReply( errorCode, eventManager ) )
1814*48a54d36SAndroid Build Coastguard Worker 
1815*48a54d36SAndroid Build Coastguard Worker 	{
1816*48a54d36SAndroid Build Coastguard Worker 
1817*48a54d36SAndroid Build Coastguard Worker 		CComBSTR			hostName;
1818*48a54d36SAndroid Build Coastguard Worker 
1819*48a54d36SAndroid Build Coastguard Worker 		DWORD				sockaddrLen;
1820*48a54d36SAndroid Build Coastguard Worker 
1821*48a54d36SAndroid Build Coastguard Worker 		DNSSDAddressFamily	addressFamily;
1822*48a54d36SAndroid Build Coastguard Worker 
1823*48a54d36SAndroid Build Coastguard Worker 		char				addressUTF8[INET6_ADDRSTRLEN];
1824*48a54d36SAndroid Build Coastguard Worker 
1825*48a54d36SAndroid Build Coastguard Worker 		DWORD				addressLen = sizeof( addressUTF8 );
1826*48a54d36SAndroid Build Coastguard Worker 
1827*48a54d36SAndroid Build Coastguard Worker 		CComBSTR			address;
1828*48a54d36SAndroid Build Coastguard Worker 
1829*48a54d36SAndroid Build Coastguard Worker 		BOOL				ok;
1830*48a54d36SAndroid Build Coastguard Worker 
1831*48a54d36SAndroid Build Coastguard Worker 
1832*48a54d36SAndroid Build Coastguard Worker 
1833*48a54d36SAndroid Build Coastguard Worker 		ok = UTF8ToBSTR( hostNameUTF8, hostName );
1834*48a54d36SAndroid Build Coastguard Worker 
1835*48a54d36SAndroid Build Coastguard Worker 		require_action( ok, exit, err = kDNSServiceErr_Unknown );
1836*48a54d36SAndroid Build Coastguard Worker 
1837*48a54d36SAndroid Build Coastguard Worker 
1838*48a54d36SAndroid Build Coastguard Worker 
1839*48a54d36SAndroid Build Coastguard Worker 		switch ( rawAddress->sa_family )
1840*48a54d36SAndroid Build Coastguard Worker 
1841*48a54d36SAndroid Build Coastguard Worker 		{
1842*48a54d36SAndroid Build Coastguard Worker 
1843*48a54d36SAndroid Build Coastguard Worker 			case AF_INET:
1844*48a54d36SAndroid Build Coastguard Worker 
1845*48a54d36SAndroid Build Coastguard Worker 			{
1846*48a54d36SAndroid Build Coastguard Worker 
1847*48a54d36SAndroid Build Coastguard Worker 				addressFamily	= kDNSSDAddressFamily_IPv4;
1848*48a54d36SAndroid Build Coastguard Worker 
1849*48a54d36SAndroid Build Coastguard Worker 				sockaddrLen		= sizeof( sockaddr_in );
1850*48a54d36SAndroid Build Coastguard Worker 
1851*48a54d36SAndroid Build Coastguard Worker 			}
1852*48a54d36SAndroid Build Coastguard Worker 
1853*48a54d36SAndroid Build Coastguard Worker 			break;
1854*48a54d36SAndroid Build Coastguard Worker 
1855*48a54d36SAndroid Build Coastguard Worker 
1856*48a54d36SAndroid Build Coastguard Worker 
1857*48a54d36SAndroid Build Coastguard Worker 			case AF_INET6:
1858*48a54d36SAndroid Build Coastguard Worker 
1859*48a54d36SAndroid Build Coastguard Worker 			{
1860*48a54d36SAndroid Build Coastguard Worker 
1861*48a54d36SAndroid Build Coastguard Worker 				addressFamily	= kDNSSDAddressFamily_IPv6;
1862*48a54d36SAndroid Build Coastguard Worker 
1863*48a54d36SAndroid Build Coastguard Worker 				sockaddrLen		= sizeof( sockaddr_in6 );
1864*48a54d36SAndroid Build Coastguard Worker 
1865*48a54d36SAndroid Build Coastguard Worker 			}
1866*48a54d36SAndroid Build Coastguard Worker 
1867*48a54d36SAndroid Build Coastguard Worker 			break;
1868*48a54d36SAndroid Build Coastguard Worker 
1869*48a54d36SAndroid Build Coastguard Worker 		}
1870*48a54d36SAndroid Build Coastguard Worker 
1871*48a54d36SAndroid Build Coastguard Worker 
1872*48a54d36SAndroid Build Coastguard Worker 
1873*48a54d36SAndroid Build Coastguard Worker 		err = WSAAddressToStringA( ( LPSOCKADDR ) rawAddress, sockaddrLen, NULL, addressUTF8, &addressLen );
1874*48a54d36SAndroid Build Coastguard Worker 
1875*48a54d36SAndroid Build Coastguard Worker 		require_noerr( err, exit );
1876*48a54d36SAndroid Build Coastguard Worker 
1877*48a54d36SAndroid Build Coastguard Worker 		ok = UTF8ToBSTR( addressUTF8, address );
1878*48a54d36SAndroid Build Coastguard Worker 
1879*48a54d36SAndroid Build Coastguard Worker 		require_action( ok, exit, err = kDNSServiceErr_Unknown );
1880*48a54d36SAndroid Build Coastguard Worker 
1881*48a54d36SAndroid Build Coastguard Worker 
1882*48a54d36SAndroid Build Coastguard Worker 
1883*48a54d36SAndroid Build Coastguard Worker 		eventManager->Fire_AddressFound( service, ( DNSSDFlags ) flags, ifIndex, hostName, addressFamily, address, ttl );
1884*48a54d36SAndroid Build Coastguard Worker 
1885*48a54d36SAndroid Build Coastguard Worker 	}
1886*48a54d36SAndroid Build Coastguard Worker 
1887*48a54d36SAndroid Build Coastguard Worker 
1888*48a54d36SAndroid Build Coastguard Worker 
1889*48a54d36SAndroid Build Coastguard Worker exit:
1890*48a54d36SAndroid Build Coastguard Worker 
1891*48a54d36SAndroid Build Coastguard Worker 
1892*48a54d36SAndroid Build Coastguard Worker 
1893*48a54d36SAndroid Build Coastguard Worker 	return;
1894*48a54d36SAndroid Build Coastguard Worker 
1895*48a54d36SAndroid Build Coastguard Worker }
1896*48a54d36SAndroid Build Coastguard Worker 
1897*48a54d36SAndroid Build Coastguard Worker 
1898*48a54d36SAndroid Build Coastguard Worker 
1899*48a54d36SAndroid Build Coastguard Worker 
1900*48a54d36SAndroid Build Coastguard Worker 
1901*48a54d36SAndroid Build Coastguard Worker void DNSSD_API
NATPortMappingReply(DNSServiceRef sdRef,DNSServiceFlags flags,uint32_t ifIndex,DNSServiceErrorType errorCode,uint32_t externalAddress,DNSServiceProtocol protocol,uint16_t internalPort,uint16_t externalPort,uint32_t ttl,void * context)1902*48a54d36SAndroid Build Coastguard Worker CDNSSDService::NATPortMappingReply
1903*48a54d36SAndroid Build Coastguard Worker     (
1904*48a54d36SAndroid Build Coastguard Worker     DNSServiceRef                    sdRef,
1905*48a54d36SAndroid Build Coastguard Worker     DNSServiceFlags                  flags,
1906*48a54d36SAndroid Build Coastguard Worker     uint32_t                         ifIndex,
1907*48a54d36SAndroid Build Coastguard Worker     DNSServiceErrorType              errorCode,
1908*48a54d36SAndroid Build Coastguard Worker     uint32_t                         externalAddress,   /* four byte IPv4 address in network byte order */
1909*48a54d36SAndroid Build Coastguard Worker     DNSServiceProtocol               protocol,
1910*48a54d36SAndroid Build Coastguard Worker     uint16_t                         internalPort,
1911*48a54d36SAndroid Build Coastguard Worker     uint16_t                         externalPort,      /* may be different than the requested port     */
1912*48a54d36SAndroid Build Coastguard Worker     uint32_t                         ttl,               /* may be different than the requested ttl      */
1913*48a54d36SAndroid Build Coastguard Worker     void                             *context
1914*48a54d36SAndroid Build Coastguard Worker     )
1915*48a54d36SAndroid Build Coastguard Worker 
1916*48a54d36SAndroid Build Coastguard Worker {
1917*48a54d36SAndroid Build Coastguard Worker 
1918*48a54d36SAndroid Build Coastguard Worker 	CComObject<CDNSSDService>	* service		= NULL;
1919*48a54d36SAndroid Build Coastguard Worker 
1920*48a54d36SAndroid Build Coastguard Worker 	CDNSSDEventManager			* eventManager	= NULL;
1921*48a54d36SAndroid Build Coastguard Worker 
1922*48a54d36SAndroid Build Coastguard Worker 	int err = 0;
1923*48a54d36SAndroid Build Coastguard Worker 
1924*48a54d36SAndroid Build Coastguard Worker 
1925*48a54d36SAndroid Build Coastguard Worker 
1926*48a54d36SAndroid Build Coastguard Worker 	service = ( CComObject< CDNSSDService>* ) context;
1927*48a54d36SAndroid Build Coastguard Worker 
1928*48a54d36SAndroid Build Coastguard Worker 	require_action( service, exit, err = kDNSServiceErr_Unknown );
1929*48a54d36SAndroid Build Coastguard Worker 
1930*48a54d36SAndroid Build Coastguard Worker 
1931*48a54d36SAndroid Build Coastguard Worker 
1932*48a54d36SAndroid Build Coastguard Worker 	if ( service->ShouldHandleReply( errorCode, eventManager ) )
1933*48a54d36SAndroid Build Coastguard Worker 
1934*48a54d36SAndroid Build Coastguard Worker 	{
1935*48a54d36SAndroid Build Coastguard Worker 
1936*48a54d36SAndroid Build Coastguard Worker 		eventManager->Fire_MappingCreated( service, ( DNSSDFlags ) flags, ifIndex, externalAddress, ( DNSSDAddressFamily ) ( protocol & 0x8 ), ( DNSSDProtocol ) ( protocol & 0x80 ), ntohs( internalPort ), ntohs( externalPort ), ttl  );
1937*48a54d36SAndroid Build Coastguard Worker 
1938*48a54d36SAndroid Build Coastguard Worker 	}
1939*48a54d36SAndroid Build Coastguard Worker 
1940*48a54d36SAndroid Build Coastguard Worker 
1941*48a54d36SAndroid Build Coastguard Worker 
1942*48a54d36SAndroid Build Coastguard Worker exit:
1943*48a54d36SAndroid Build Coastguard Worker 
1944*48a54d36SAndroid Build Coastguard Worker 
1945*48a54d36SAndroid Build Coastguard Worker 
1946*48a54d36SAndroid Build Coastguard Worker 	return;
1947*48a54d36SAndroid Build Coastguard Worker 
1948*48a54d36SAndroid Build Coastguard Worker }
1949*48a54d36SAndroid Build Coastguard Worker 
1950*48a54d36SAndroid Build Coastguard Worker 
1951*48a54d36SAndroid Build Coastguard Worker 
1952*48a54d36SAndroid Build Coastguard Worker 
1953*48a54d36SAndroid Build Coastguard Worker 
1954*48a54d36SAndroid Build Coastguard Worker void DNSSD_API
RegisterRecordReply(DNSServiceRef sdRef,DNSRecordRef RecordRef,DNSServiceFlags flags,DNSServiceErrorType errorCode,void * context)1955*48a54d36SAndroid Build Coastguard Worker CDNSSDService::RegisterRecordReply
1956*48a54d36SAndroid Build Coastguard Worker 		(
1957*48a54d36SAndroid Build Coastguard Worker 		DNSServiceRef		sdRef,
1958*48a54d36SAndroid Build Coastguard Worker 		DNSRecordRef		RecordRef,
1959*48a54d36SAndroid Build Coastguard Worker 		DNSServiceFlags		flags,
1960*48a54d36SAndroid Build Coastguard Worker 		DNSServiceErrorType	errorCode,
1961*48a54d36SAndroid Build Coastguard Worker 		void				*context
1962*48a54d36SAndroid Build Coastguard Worker 		)
1963*48a54d36SAndroid Build Coastguard Worker 
1964*48a54d36SAndroid Build Coastguard Worker {
1965*48a54d36SAndroid Build Coastguard Worker 
1966*48a54d36SAndroid Build Coastguard Worker 	CComObject<CDNSSDRecord>	* record		= NULL;
1967*48a54d36SAndroid Build Coastguard Worker 
1968*48a54d36SAndroid Build Coastguard Worker 	CDNSSDService				* service		= NULL;
1969*48a54d36SAndroid Build Coastguard Worker 
1970*48a54d36SAndroid Build Coastguard Worker 	CDNSSDEventManager			* eventManager	= NULL;
1971*48a54d36SAndroid Build Coastguard Worker 
1972*48a54d36SAndroid Build Coastguard Worker 	int err = 0;
1973*48a54d36SAndroid Build Coastguard Worker 
1974*48a54d36SAndroid Build Coastguard Worker 
1975*48a54d36SAndroid Build Coastguard Worker 
1976*48a54d36SAndroid Build Coastguard Worker 	record = ( CComObject< CDNSSDRecord >* ) context;
1977*48a54d36SAndroid Build Coastguard Worker 
1978*48a54d36SAndroid Build Coastguard Worker 	require_action( record, exit, err = kDNSServiceErr_Unknown );
1979*48a54d36SAndroid Build Coastguard Worker 
1980*48a54d36SAndroid Build Coastguard Worker 	service = record->GetServiceObject();
1981*48a54d36SAndroid Build Coastguard Worker 
1982*48a54d36SAndroid Build Coastguard Worker 	require_action( service, exit, err = kDNSServiceErr_Unknown );
1983*48a54d36SAndroid Build Coastguard Worker 
1984*48a54d36SAndroid Build Coastguard Worker 
1985*48a54d36SAndroid Build Coastguard Worker 
1986*48a54d36SAndroid Build Coastguard Worker 	if ( service->ShouldHandleReply( errorCode, eventManager ) )
1987*48a54d36SAndroid Build Coastguard Worker 
1988*48a54d36SAndroid Build Coastguard Worker 	{
1989*48a54d36SAndroid Build Coastguard Worker 
1990*48a54d36SAndroid Build Coastguard Worker 		eventManager->Fire_RecordRegistered( record, ( DNSSDFlags ) flags );
1991*48a54d36SAndroid Build Coastguard Worker 
1992*48a54d36SAndroid Build Coastguard Worker 	}
1993*48a54d36SAndroid Build Coastguard Worker 
1994*48a54d36SAndroid Build Coastguard Worker 
1995*48a54d36SAndroid Build Coastguard Worker 
1996*48a54d36SAndroid Build Coastguard Worker exit:
1997*48a54d36SAndroid Build Coastguard Worker 
1998*48a54d36SAndroid Build Coastguard Worker 
1999*48a54d36SAndroid Build Coastguard Worker 
2000*48a54d36SAndroid Build Coastguard Worker 	return;
2001*48a54d36SAndroid Build Coastguard Worker 
2002*48a54d36SAndroid Build Coastguard Worker }
2003*48a54d36SAndroid Build Coastguard Worker 
2004*48a54d36SAndroid Build Coastguard Worker 
2005*48a54d36SAndroid Build Coastguard Worker 
2006*48a54d36SAndroid Build Coastguard Worker 
2007*48a54d36SAndroid Build Coastguard Worker 
2008*48a54d36SAndroid Build Coastguard Worker BOOL
2009*48a54d36SAndroid Build Coastguard Worker 
ShouldHandleReply(DNSServiceErrorType errorCode,CDNSSDEventManager * & eventManager)2010*48a54d36SAndroid Build Coastguard Worker CDNSSDService::ShouldHandleReply( DNSServiceErrorType errorCode, CDNSSDEventManager *& eventManager )
2011*48a54d36SAndroid Build Coastguard Worker 
2012*48a54d36SAndroid Build Coastguard Worker {
2013*48a54d36SAndroid Build Coastguard Worker 
2014*48a54d36SAndroid Build Coastguard Worker 	BOOL ok = FALSE;
2015*48a54d36SAndroid Build Coastguard Worker 
2016*48a54d36SAndroid Build Coastguard Worker 
2017*48a54d36SAndroid Build Coastguard Worker 
2018*48a54d36SAndroid Build Coastguard Worker 	if ( !this->Stopped() )
2019*48a54d36SAndroid Build Coastguard Worker 
2020*48a54d36SAndroid Build Coastguard Worker 	{
2021*48a54d36SAndroid Build Coastguard Worker 
2022*48a54d36SAndroid Build Coastguard Worker 		eventManager = this->GetEventManager();
2023*48a54d36SAndroid Build Coastguard Worker 
2024*48a54d36SAndroid Build Coastguard Worker 		require_action( eventManager, exit, ok = FALSE );
2025*48a54d36SAndroid Build Coastguard Worker 
2026*48a54d36SAndroid Build Coastguard Worker 
2027*48a54d36SAndroid Build Coastguard Worker 
2028*48a54d36SAndroid Build Coastguard Worker 		if ( !errorCode )
2029*48a54d36SAndroid Build Coastguard Worker 
2030*48a54d36SAndroid Build Coastguard Worker 		{
2031*48a54d36SAndroid Build Coastguard Worker 
2032*48a54d36SAndroid Build Coastguard Worker 			ok = TRUE;
2033*48a54d36SAndroid Build Coastguard Worker 
2034*48a54d36SAndroid Build Coastguard Worker 		}
2035*48a54d36SAndroid Build Coastguard Worker 
2036*48a54d36SAndroid Build Coastguard Worker 		else
2037*48a54d36SAndroid Build Coastguard Worker 
2038*48a54d36SAndroid Build Coastguard Worker 		{
2039*48a54d36SAndroid Build Coastguard Worker 
2040*48a54d36SAndroid Build Coastguard Worker 			eventManager->Fire_OperationFailed( this, ( DNSSDError ) errorCode );
2041*48a54d36SAndroid Build Coastguard Worker 
2042*48a54d36SAndroid Build Coastguard Worker 		}
2043*48a54d36SAndroid Build Coastguard Worker 
2044*48a54d36SAndroid Build Coastguard Worker 	}
2045*48a54d36SAndroid Build Coastguard Worker 
2046*48a54d36SAndroid Build Coastguard Worker 
2047*48a54d36SAndroid Build Coastguard Worker 
2048*48a54d36SAndroid Build Coastguard Worker exit:
2049*48a54d36SAndroid Build Coastguard Worker 
2050*48a54d36SAndroid Build Coastguard Worker 
2051*48a54d36SAndroid Build Coastguard Worker 
2052*48a54d36SAndroid Build Coastguard Worker 	return ok;
2053*48a54d36SAndroid Build Coastguard Worker 
2054*48a54d36SAndroid Build Coastguard Worker }
2055*48a54d36SAndroid Build Coastguard Worker 
2056*48a54d36SAndroid Build Coastguard Worker 
2057*48a54d36SAndroid Build Coastguard Worker 
2058*48a54d36SAndroid Build Coastguard Worker 
2059*48a54d36SAndroid Build Coastguard Worker 
2060*48a54d36SAndroid Build Coastguard Worker LRESULT CALLBACK
2061*48a54d36SAndroid Build Coastguard Worker 
WndProc(HWND hWnd,UINT msg,WPARAM wParam,LPARAM lParam)2062*48a54d36SAndroid Build Coastguard Worker CDNSSDService::WndProc( HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam )
2063*48a54d36SAndroid Build Coastguard Worker 
2064*48a54d36SAndroid Build Coastguard Worker {
2065*48a54d36SAndroid Build Coastguard Worker 
2066*48a54d36SAndroid Build Coastguard Worker 	if ( msg == WM_SOCKET )
2067*48a54d36SAndroid Build Coastguard Worker 
2068*48a54d36SAndroid Build Coastguard Worker 	{
2069*48a54d36SAndroid Build Coastguard Worker 
2070*48a54d36SAndroid Build Coastguard Worker 		SocketMap::iterator it;
2071*48a54d36SAndroid Build Coastguard Worker 
2072*48a54d36SAndroid Build Coastguard Worker 
2073*48a54d36SAndroid Build Coastguard Worker 
2074*48a54d36SAndroid Build Coastguard Worker 		it = m_socketMap.find( ( SOCKET ) wParam );
2075*48a54d36SAndroid Build Coastguard Worker 
2076*48a54d36SAndroid Build Coastguard Worker 		check( it != m_socketMap.end() );
2077*48a54d36SAndroid Build Coastguard Worker 
2078*48a54d36SAndroid Build Coastguard Worker 
2079*48a54d36SAndroid Build Coastguard Worker 
2080*48a54d36SAndroid Build Coastguard Worker 		if ( it != m_socketMap.end() )
2081*48a54d36SAndroid Build Coastguard Worker 
2082*48a54d36SAndroid Build Coastguard Worker 		{
2083*48a54d36SAndroid Build Coastguard Worker 
2084*48a54d36SAndroid Build Coastguard Worker 			DNSServiceProcessResult( it->second->m_primary );
2085*48a54d36SAndroid Build Coastguard Worker 
2086*48a54d36SAndroid Build Coastguard Worker 		}
2087*48a54d36SAndroid Build Coastguard Worker 
2088*48a54d36SAndroid Build Coastguard Worker 	}
2089*48a54d36SAndroid Build Coastguard Worker 
2090*48a54d36SAndroid Build Coastguard Worker 
2091*48a54d36SAndroid Build Coastguard Worker 
2092*48a54d36SAndroid Build Coastguard Worker 	return DefWindowProc(hWnd, msg, wParam, lParam);;
2093*48a54d36SAndroid Build Coastguard Worker 
2094*48a54d36SAndroid Build Coastguard Worker }
2095*48a54d36SAndroid Build Coastguard Worker 
2096