xref: /aosp_15_r20/external/mdnsresponder/mDNSWindows/DLLX/DNSSD.cpp (revision 48a54d368dc4fa860885eef7b70b6c53499e7c25)
1*48a54d36SAndroid Build Coastguard Worker // DNSSD.cpp : Implementation of CDNSSD
2*48a54d36SAndroid Build Coastguard Worker 
3*48a54d36SAndroid Build Coastguard Worker #include "stdafx.h"
4*48a54d36SAndroid Build Coastguard Worker #include "DNSSD.h"
5*48a54d36SAndroid Build Coastguard Worker #include "DNSSDService.h"
6*48a54d36SAndroid Build Coastguard Worker #include "TXTRecord.h"
7*48a54d36SAndroid Build Coastguard Worker #include <dns_sd.h>
8*48a54d36SAndroid Build Coastguard Worker #include <CommonServices.h>
9*48a54d36SAndroid Build Coastguard Worker #include <DebugServices.h>
10*48a54d36SAndroid Build Coastguard Worker #include "StringServices.h"
11*48a54d36SAndroid Build Coastguard Worker 
12*48a54d36SAndroid Build Coastguard Worker 
13*48a54d36SAndroid Build Coastguard Worker // CDNSSD
14*48a54d36SAndroid Build Coastguard Worker 
Browse(DNSSDFlags flags,ULONG ifIndex,BSTR regtype,BSTR domain,IBrowseListener * listener,IDNSSDService ** browser)15*48a54d36SAndroid Build Coastguard Worker STDMETHODIMP CDNSSD::Browse(DNSSDFlags flags, ULONG ifIndex, BSTR regtype, BSTR domain, IBrowseListener* listener, IDNSSDService** browser )
16*48a54d36SAndroid Build Coastguard Worker {
17*48a54d36SAndroid Build Coastguard Worker 	CComObject<CDNSSDService>	*	object		= NULL;
18*48a54d36SAndroid Build Coastguard Worker 	std::string						regtypeUTF8;
19*48a54d36SAndroid Build Coastguard Worker 	std::string						domainUTF8;
20*48a54d36SAndroid Build Coastguard Worker 	DNSServiceRef					sref		= NULL;
21*48a54d36SAndroid Build Coastguard Worker 	DNSServiceErrorType				err			= 0;
22*48a54d36SAndroid Build Coastguard Worker 	HRESULT							hr			= 0;
23*48a54d36SAndroid Build Coastguard Worker 	BOOL							ok;
24*48a54d36SAndroid Build Coastguard Worker 
25*48a54d36SAndroid Build Coastguard Worker 	// Initialize
26*48a54d36SAndroid Build Coastguard Worker 	*browser = NULL;
27*48a54d36SAndroid Build Coastguard Worker 
28*48a54d36SAndroid Build Coastguard Worker 	// Convert BSTR params to utf8
29*48a54d36SAndroid Build Coastguard Worker 	ok = BSTRToUTF8( regtype, regtypeUTF8 );
30*48a54d36SAndroid Build Coastguard Worker 	require_action( ok, exit, err = kDNSServiceErr_BadParam );
31*48a54d36SAndroid Build Coastguard Worker 	ok = BSTRToUTF8( domain, domainUTF8 );
32*48a54d36SAndroid Build Coastguard Worker 	require_action( ok, exit, err = kDNSServiceErr_BadParam );
33*48a54d36SAndroid Build Coastguard Worker 
34*48a54d36SAndroid Build Coastguard Worker 	try
35*48a54d36SAndroid Build Coastguard Worker 	{
36*48a54d36SAndroid Build Coastguard Worker 		object = new CComObject<CDNSSDService>();
37*48a54d36SAndroid Build Coastguard Worker 	}
38*48a54d36SAndroid Build Coastguard Worker 	catch ( ... )
39*48a54d36SAndroid Build Coastguard Worker 	{
40*48a54d36SAndroid Build Coastguard Worker 		object = NULL;
41*48a54d36SAndroid Build Coastguard Worker 	}
42*48a54d36SAndroid Build Coastguard Worker 
43*48a54d36SAndroid Build Coastguard Worker 	require_action( object != NULL, exit, err = kDNSServiceErr_NoMemory );
44*48a54d36SAndroid Build Coastguard Worker 	hr = object->FinalConstruct();
45*48a54d36SAndroid Build Coastguard Worker 	require_action( hr == S_OK, exit, err = kDNSServiceErr_Unknown );
46*48a54d36SAndroid Build Coastguard Worker 	object->AddRef();
47*48a54d36SAndroid Build Coastguard Worker 
48*48a54d36SAndroid Build Coastguard Worker 	err = DNSServiceBrowse( &sref, flags, ifIndex, regtypeUTF8.c_str(), domainUTF8.c_str(), ( DNSServiceBrowseReply ) &BrowseReply, object );
49*48a54d36SAndroid Build Coastguard Worker 	require_noerr( err, exit );
50*48a54d36SAndroid Build Coastguard Worker 
51*48a54d36SAndroid Build Coastguard Worker 	object->SetServiceRef( sref );
52*48a54d36SAndroid Build Coastguard Worker 	object->SetListener( listener );
53*48a54d36SAndroid Build Coastguard Worker 
54*48a54d36SAndroid Build Coastguard Worker 	err = object->Run();
55*48a54d36SAndroid Build Coastguard Worker 	require_noerr( err, exit );
56*48a54d36SAndroid Build Coastguard Worker 
57*48a54d36SAndroid Build Coastguard Worker 	*browser = object;
58*48a54d36SAndroid Build Coastguard Worker 
59*48a54d36SAndroid Build Coastguard Worker exit:
60*48a54d36SAndroid Build Coastguard Worker 
61*48a54d36SAndroid Build Coastguard Worker 	if ( err && object )
62*48a54d36SAndroid Build Coastguard Worker 	{
63*48a54d36SAndroid Build Coastguard Worker 		object->Release();
64*48a54d36SAndroid Build Coastguard Worker 	}
65*48a54d36SAndroid Build Coastguard Worker 
66*48a54d36SAndroid Build Coastguard Worker 	return err;
67*48a54d36SAndroid Build Coastguard Worker }
68*48a54d36SAndroid Build Coastguard Worker 
69*48a54d36SAndroid Build Coastguard Worker 
Resolve(DNSSDFlags flags,ULONG ifIndex,BSTR serviceName,BSTR regType,BSTR domain,IResolveListener * listener,IDNSSDService ** service)70*48a54d36SAndroid Build Coastguard Worker STDMETHODIMP CDNSSD::Resolve(DNSSDFlags flags, ULONG ifIndex, BSTR serviceName, BSTR regType, BSTR domain, IResolveListener* listener, IDNSSDService** service)
71*48a54d36SAndroid Build Coastguard Worker {
72*48a54d36SAndroid Build Coastguard Worker 	CComObject<CDNSSDService>	*	object			= NULL;
73*48a54d36SAndroid Build Coastguard Worker 	std::string						serviceNameUTF8;
74*48a54d36SAndroid Build Coastguard Worker 	std::string						regTypeUTF8;
75*48a54d36SAndroid Build Coastguard Worker 	std::string						domainUTF8;
76*48a54d36SAndroid Build Coastguard Worker 	DNSServiceRef					sref			= NULL;
77*48a54d36SAndroid Build Coastguard Worker 	DNSServiceErrorType				err				= 0;
78*48a54d36SAndroid Build Coastguard Worker 	HRESULT							hr				= 0;
79*48a54d36SAndroid Build Coastguard Worker 	BOOL							ok;
80*48a54d36SAndroid Build Coastguard Worker 
81*48a54d36SAndroid Build Coastguard Worker 	// Initialize
82*48a54d36SAndroid Build Coastguard Worker 	*service = NULL;
83*48a54d36SAndroid Build Coastguard Worker 
84*48a54d36SAndroid Build Coastguard Worker 	// Convert BSTR params to utf8
85*48a54d36SAndroid Build Coastguard Worker 	ok = BSTRToUTF8( serviceName, serviceNameUTF8 );
86*48a54d36SAndroid Build Coastguard Worker 	require_action( ok, exit, err = kDNSServiceErr_BadParam );
87*48a54d36SAndroid Build Coastguard Worker 	ok = BSTRToUTF8( regType, regTypeUTF8 );
88*48a54d36SAndroid Build Coastguard Worker 	require_action( ok, exit, err = kDNSServiceErr_BadParam );
89*48a54d36SAndroid Build Coastguard Worker 	ok = BSTRToUTF8( domain, domainUTF8 );
90*48a54d36SAndroid Build Coastguard Worker 	require_action( ok, exit, err = kDNSServiceErr_BadParam );
91*48a54d36SAndroid Build Coastguard Worker 
92*48a54d36SAndroid Build Coastguard Worker 	try
93*48a54d36SAndroid Build Coastguard Worker 	{
94*48a54d36SAndroid Build Coastguard Worker 		object = new CComObject<CDNSSDService>();
95*48a54d36SAndroid Build Coastguard Worker 	}
96*48a54d36SAndroid Build Coastguard Worker 	catch ( ... )
97*48a54d36SAndroid Build Coastguard Worker 	{
98*48a54d36SAndroid Build Coastguard Worker 		object = NULL;
99*48a54d36SAndroid Build Coastguard Worker 	}
100*48a54d36SAndroid Build Coastguard Worker 
101*48a54d36SAndroid Build Coastguard Worker 	require_action( object != NULL, exit, err = kDNSServiceErr_NoMemory );
102*48a54d36SAndroid Build Coastguard Worker 	hr = object->FinalConstruct();
103*48a54d36SAndroid Build Coastguard Worker 	require_action( hr == S_OK, exit, err = kDNSServiceErr_Unknown );
104*48a54d36SAndroid Build Coastguard Worker 	object->AddRef();
105*48a54d36SAndroid Build Coastguard Worker 
106*48a54d36SAndroid Build Coastguard Worker 	err = DNSServiceResolve( &sref, flags, ifIndex, serviceNameUTF8.c_str(), regTypeUTF8.c_str(), domainUTF8.c_str(), ( DNSServiceResolveReply ) &ResolveReply, object );
107*48a54d36SAndroid Build Coastguard Worker 	require_noerr( err, exit );
108*48a54d36SAndroid Build Coastguard Worker 
109*48a54d36SAndroid Build Coastguard Worker 	object->SetServiceRef( sref );
110*48a54d36SAndroid Build Coastguard Worker 	object->SetListener( listener );
111*48a54d36SAndroid Build Coastguard Worker 
112*48a54d36SAndroid Build Coastguard Worker 	err = object->Run();
113*48a54d36SAndroid Build Coastguard Worker 	require_noerr( err, exit );
114*48a54d36SAndroid Build Coastguard Worker 
115*48a54d36SAndroid Build Coastguard Worker 	*service = object;
116*48a54d36SAndroid Build Coastguard Worker 
117*48a54d36SAndroid Build Coastguard Worker exit:
118*48a54d36SAndroid Build Coastguard Worker 
119*48a54d36SAndroid Build Coastguard Worker 	if ( err && object )
120*48a54d36SAndroid Build Coastguard Worker 	{
121*48a54d36SAndroid Build Coastguard Worker 		object->Release();
122*48a54d36SAndroid Build Coastguard Worker 	}
123*48a54d36SAndroid Build Coastguard Worker 
124*48a54d36SAndroid Build Coastguard Worker 	return err;
125*48a54d36SAndroid Build Coastguard Worker }
126*48a54d36SAndroid Build Coastguard Worker 
127*48a54d36SAndroid Build Coastguard Worker 
EnumerateDomains(DNSSDFlags flags,ULONG ifIndex,IDomainListener * listener,IDNSSDService ** service)128*48a54d36SAndroid Build Coastguard Worker STDMETHODIMP CDNSSD::EnumerateDomains(DNSSDFlags flags, ULONG ifIndex, IDomainListener *listener, IDNSSDService **service)
129*48a54d36SAndroid Build Coastguard Worker {
130*48a54d36SAndroid Build Coastguard Worker 	CComObject<CDNSSDService>	*	object			= NULL;
131*48a54d36SAndroid Build Coastguard Worker 	DNSServiceRef					sref			= NULL;
132*48a54d36SAndroid Build Coastguard Worker 	DNSServiceErrorType				err				= 0;
133*48a54d36SAndroid Build Coastguard Worker 	HRESULT							hr				= 0;
134*48a54d36SAndroid Build Coastguard Worker 
135*48a54d36SAndroid Build Coastguard Worker 	// Initialize
136*48a54d36SAndroid Build Coastguard Worker 	*service = NULL;
137*48a54d36SAndroid Build Coastguard Worker 
138*48a54d36SAndroid Build Coastguard Worker 	try
139*48a54d36SAndroid Build Coastguard Worker 	{
140*48a54d36SAndroid Build Coastguard Worker 		object = new CComObject<CDNSSDService>();
141*48a54d36SAndroid Build Coastguard Worker 	}
142*48a54d36SAndroid Build Coastguard Worker 	catch ( ... )
143*48a54d36SAndroid Build Coastguard Worker 	{
144*48a54d36SAndroid Build Coastguard Worker 		object = NULL;
145*48a54d36SAndroid Build Coastguard Worker 	}
146*48a54d36SAndroid Build Coastguard Worker 
147*48a54d36SAndroid Build Coastguard Worker 	require_action( object != NULL, exit, err = kDNSServiceErr_NoMemory );
148*48a54d36SAndroid Build Coastguard Worker 	hr = object->FinalConstruct();
149*48a54d36SAndroid Build Coastguard Worker 	require_action( hr == S_OK, exit, err = kDNSServiceErr_Unknown );
150*48a54d36SAndroid Build Coastguard Worker 	object->AddRef();
151*48a54d36SAndroid Build Coastguard Worker 
152*48a54d36SAndroid Build Coastguard Worker 	err = DNSServiceEnumerateDomains( &sref, flags, ifIndex, ( DNSServiceDomainEnumReply ) &DomainEnumReply, object );
153*48a54d36SAndroid Build Coastguard Worker 	require_noerr( err, exit );
154*48a54d36SAndroid Build Coastguard Worker 
155*48a54d36SAndroid Build Coastguard Worker 	object->SetServiceRef( sref );
156*48a54d36SAndroid Build Coastguard Worker 	object->SetListener( listener );
157*48a54d36SAndroid Build Coastguard Worker 
158*48a54d36SAndroid Build Coastguard Worker 	err = object->Run();
159*48a54d36SAndroid Build Coastguard Worker 	require_noerr( err, exit );
160*48a54d36SAndroid Build Coastguard Worker 
161*48a54d36SAndroid Build Coastguard Worker 	*service = object;
162*48a54d36SAndroid Build Coastguard Worker 
163*48a54d36SAndroid Build Coastguard Worker exit:
164*48a54d36SAndroid Build Coastguard Worker 
165*48a54d36SAndroid Build Coastguard Worker 	if ( err && object )
166*48a54d36SAndroid Build Coastguard Worker 	{
167*48a54d36SAndroid Build Coastguard Worker 		object->Release();
168*48a54d36SAndroid Build Coastguard Worker 	}
169*48a54d36SAndroid Build Coastguard Worker 
170*48a54d36SAndroid Build Coastguard Worker 	return err;
171*48a54d36SAndroid Build Coastguard Worker }
172*48a54d36SAndroid Build Coastguard Worker 
173*48a54d36SAndroid Build Coastguard Worker 
Register(DNSSDFlags flags,ULONG ifIndex,BSTR serviceName,BSTR regType,BSTR domain,BSTR host,USHORT port,ITXTRecord * record,IRegisterListener * listener,IDNSSDService ** service)174*48a54d36SAndroid Build Coastguard Worker STDMETHODIMP CDNSSD::Register(DNSSDFlags flags, ULONG ifIndex, BSTR serviceName, BSTR regType, BSTR domain, BSTR host, USHORT port, ITXTRecord *record, IRegisterListener *listener, IDNSSDService **service)
175*48a54d36SAndroid Build Coastguard Worker {
176*48a54d36SAndroid Build Coastguard Worker 	CComObject<CDNSSDService>	*	object			= NULL;
177*48a54d36SAndroid Build Coastguard Worker 	std::string						serviceNameUTF8;
178*48a54d36SAndroid Build Coastguard Worker 	std::string						regTypeUTF8;
179*48a54d36SAndroid Build Coastguard Worker 	std::string						domainUTF8;
180*48a54d36SAndroid Build Coastguard Worker 	std::string						hostUTF8;
181*48a54d36SAndroid Build Coastguard Worker 	const void					*	txtRecord		= NULL;
182*48a54d36SAndroid Build Coastguard Worker 	uint16_t						txtLen			= 0;
183*48a54d36SAndroid Build Coastguard Worker 	DNSServiceRef					sref			= NULL;
184*48a54d36SAndroid Build Coastguard Worker 	DNSServiceErrorType				err				= 0;
185*48a54d36SAndroid Build Coastguard Worker 	HRESULT							hr				= 0;
186*48a54d36SAndroid Build Coastguard Worker 	BOOL							ok;
187*48a54d36SAndroid Build Coastguard Worker 
188*48a54d36SAndroid Build Coastguard Worker 	// Initialize
189*48a54d36SAndroid Build Coastguard Worker 	*service = NULL;
190*48a54d36SAndroid Build Coastguard Worker 
191*48a54d36SAndroid Build Coastguard Worker 	// Convert BSTR params to utf8
192*48a54d36SAndroid Build Coastguard Worker 	ok = BSTRToUTF8( serviceName, serviceNameUTF8 );
193*48a54d36SAndroid Build Coastguard Worker 	require_action( ok, exit, err = kDNSServiceErr_BadParam );
194*48a54d36SAndroid Build Coastguard Worker 	ok = BSTRToUTF8( regType, regTypeUTF8 );
195*48a54d36SAndroid Build Coastguard Worker 	require_action( ok, exit, err = kDNSServiceErr_BadParam );
196*48a54d36SAndroid Build Coastguard Worker 	ok = BSTRToUTF8( domain, domainUTF8 );
197*48a54d36SAndroid Build Coastguard Worker 	require_action( ok, exit, err = kDNSServiceErr_BadParam );
198*48a54d36SAndroid Build Coastguard Worker 	ok = BSTRToUTF8( host, hostUTF8 );
199*48a54d36SAndroid Build Coastguard Worker 	require_action( ok, exit, err = kDNSServiceErr_BadParam );
200*48a54d36SAndroid Build Coastguard Worker 
201*48a54d36SAndroid Build Coastguard Worker 	try
202*48a54d36SAndroid Build Coastguard Worker 	{
203*48a54d36SAndroid Build Coastguard Worker 		object = new CComObject<CDNSSDService>();
204*48a54d36SAndroid Build Coastguard Worker 	}
205*48a54d36SAndroid Build Coastguard Worker 	catch ( ... )
206*48a54d36SAndroid Build Coastguard Worker 	{
207*48a54d36SAndroid Build Coastguard Worker 		object = NULL;
208*48a54d36SAndroid Build Coastguard Worker 	}
209*48a54d36SAndroid Build Coastguard Worker 
210*48a54d36SAndroid Build Coastguard Worker 	require_action( object != NULL, exit, err = kDNSServiceErr_NoMemory );
211*48a54d36SAndroid Build Coastguard Worker 	hr = object->FinalConstruct();
212*48a54d36SAndroid Build Coastguard Worker 	require_action( hr == S_OK, exit, err = kDNSServiceErr_Unknown );
213*48a54d36SAndroid Build Coastguard Worker 	object->AddRef();
214*48a54d36SAndroid Build Coastguard Worker 
215*48a54d36SAndroid Build Coastguard Worker 	if ( record )
216*48a54d36SAndroid Build Coastguard Worker 	{
217*48a54d36SAndroid Build Coastguard Worker 		CComObject< CTXTRecord > * realTXTRecord;
218*48a54d36SAndroid Build Coastguard Worker 
219*48a54d36SAndroid Build Coastguard Worker 		realTXTRecord = ( CComObject< CTXTRecord >* ) record;
220*48a54d36SAndroid Build Coastguard Worker 
221*48a54d36SAndroid Build Coastguard Worker 		txtRecord	= realTXTRecord->GetBytes();
222*48a54d36SAndroid Build Coastguard Worker 		txtLen		= realTXTRecord->GetLen();
223*48a54d36SAndroid Build Coastguard Worker 	}
224*48a54d36SAndroid Build Coastguard Worker 
225*48a54d36SAndroid Build Coastguard Worker 	err = DNSServiceRegister( &sref, flags, ifIndex, serviceNameUTF8.c_str(), regTypeUTF8.c_str(), domainUTF8.c_str(), hostUTF8.c_str(), port, txtLen, txtRecord, ( DNSServiceRegisterReply ) &RegisterReply, object );
226*48a54d36SAndroid Build Coastguard Worker 	require_noerr( err, exit );
227*48a54d36SAndroid Build Coastguard Worker 
228*48a54d36SAndroid Build Coastguard Worker 	object->SetServiceRef( sref );
229*48a54d36SAndroid Build Coastguard Worker 	object->SetListener( listener );
230*48a54d36SAndroid Build Coastguard Worker 
231*48a54d36SAndroid Build Coastguard Worker 	err = object->Run();
232*48a54d36SAndroid Build Coastguard Worker 	require_noerr( err, exit );
233*48a54d36SAndroid Build Coastguard Worker 
234*48a54d36SAndroid Build Coastguard Worker 	*service = object;
235*48a54d36SAndroid Build Coastguard Worker 
236*48a54d36SAndroid Build Coastguard Worker exit:
237*48a54d36SAndroid Build Coastguard Worker 
238*48a54d36SAndroid Build Coastguard Worker 	if ( err && object )
239*48a54d36SAndroid Build Coastguard Worker 	{
240*48a54d36SAndroid Build Coastguard Worker 		object->Release();
241*48a54d36SAndroid Build Coastguard Worker 	}
242*48a54d36SAndroid Build Coastguard Worker 
243*48a54d36SAndroid Build Coastguard Worker 	return err;
244*48a54d36SAndroid Build Coastguard Worker }
245*48a54d36SAndroid Build Coastguard Worker 
246*48a54d36SAndroid Build Coastguard Worker 
QueryRecord(DNSSDFlags flags,ULONG ifIndex,BSTR fullname,DNSSDRRType rrtype,DNSSDRRClass rrclass,IQueryRecordListener * listener,IDNSSDService ** service)247*48a54d36SAndroid Build Coastguard Worker STDMETHODIMP CDNSSD::QueryRecord(DNSSDFlags flags, ULONG ifIndex, BSTR fullname, DNSSDRRType rrtype, DNSSDRRClass rrclass, IQueryRecordListener *listener, IDNSSDService **service)
248*48a54d36SAndroid Build Coastguard Worker {
249*48a54d36SAndroid Build Coastguard Worker 	CComObject<CDNSSDService>	*	object			= NULL;
250*48a54d36SAndroid Build Coastguard Worker 	DNSServiceRef					sref			= NULL;
251*48a54d36SAndroid Build Coastguard Worker 	std::string						fullNameUTF8;
252*48a54d36SAndroid Build Coastguard Worker 	DNSServiceErrorType				err				= 0;
253*48a54d36SAndroid Build Coastguard Worker 	HRESULT							hr				= 0;
254*48a54d36SAndroid Build Coastguard Worker 	BOOL							ok;
255*48a54d36SAndroid Build Coastguard Worker 
256*48a54d36SAndroid Build Coastguard Worker 	// Initialize
257*48a54d36SAndroid Build Coastguard Worker 	*service = NULL;
258*48a54d36SAndroid Build Coastguard Worker 
259*48a54d36SAndroid Build Coastguard Worker 	// Convert BSTR params to utf8
260*48a54d36SAndroid Build Coastguard Worker 	ok = BSTRToUTF8( fullname, fullNameUTF8 );
261*48a54d36SAndroid Build Coastguard Worker 	require_action( ok, exit, err = kDNSServiceErr_BadParam );
262*48a54d36SAndroid Build Coastguard Worker 
263*48a54d36SAndroid Build Coastguard Worker 	try
264*48a54d36SAndroid Build Coastguard Worker 	{
265*48a54d36SAndroid Build Coastguard Worker 		object = new CComObject<CDNSSDService>();
266*48a54d36SAndroid Build Coastguard Worker 	}
267*48a54d36SAndroid Build Coastguard Worker 	catch ( ... )
268*48a54d36SAndroid Build Coastguard Worker 	{
269*48a54d36SAndroid Build Coastguard Worker 		object = NULL;
270*48a54d36SAndroid Build Coastguard Worker 	}
271*48a54d36SAndroid Build Coastguard Worker 
272*48a54d36SAndroid Build Coastguard Worker 	require_action( object != NULL, exit, err = kDNSServiceErr_NoMemory );
273*48a54d36SAndroid Build Coastguard Worker 	hr = object->FinalConstruct();
274*48a54d36SAndroid Build Coastguard Worker 	require_action( hr == S_OK, exit, err = kDNSServiceErr_Unknown );
275*48a54d36SAndroid Build Coastguard Worker 	object->AddRef();
276*48a54d36SAndroid Build Coastguard Worker 
277*48a54d36SAndroid Build Coastguard Worker 	err = DNSServiceQueryRecord( &sref, flags, ifIndex, fullNameUTF8.c_str(), ( uint16_t ) rrtype, ( uint16_t ) rrclass, ( DNSServiceQueryRecordReply ) &QueryRecordReply, object );
278*48a54d36SAndroid Build Coastguard Worker 	require_noerr( err, exit );
279*48a54d36SAndroid Build Coastguard Worker 
280*48a54d36SAndroid Build Coastguard Worker 	object->SetServiceRef( sref );
281*48a54d36SAndroid Build Coastguard Worker 	object->SetListener( listener );
282*48a54d36SAndroid Build Coastguard Worker 
283*48a54d36SAndroid Build Coastguard Worker 	err = object->Run();
284*48a54d36SAndroid Build Coastguard Worker 	require_noerr( err, exit );
285*48a54d36SAndroid Build Coastguard Worker 
286*48a54d36SAndroid Build Coastguard Worker 	*service = object;
287*48a54d36SAndroid Build Coastguard Worker 
288*48a54d36SAndroid Build Coastguard Worker exit:
289*48a54d36SAndroid Build Coastguard Worker 
290*48a54d36SAndroid Build Coastguard Worker 	if ( err && object )
291*48a54d36SAndroid Build Coastguard Worker 	{
292*48a54d36SAndroid Build Coastguard Worker 		object->Release();
293*48a54d36SAndroid Build Coastguard Worker 	}
294*48a54d36SAndroid Build Coastguard Worker 
295*48a54d36SAndroid Build Coastguard Worker 	return err;
296*48a54d36SAndroid Build Coastguard Worker }
297*48a54d36SAndroid Build Coastguard Worker 
298*48a54d36SAndroid Build Coastguard Worker 
GetAddrInfo(DNSSDFlags flags,ULONG ifIndex,DNSSDAddressFamily addressFamily,BSTR hostName,IGetAddrInfoListener * listener,IDNSSDService ** service)299*48a54d36SAndroid Build Coastguard Worker STDMETHODIMP CDNSSD::GetAddrInfo(DNSSDFlags flags, ULONG ifIndex, DNSSDAddressFamily addressFamily, BSTR hostName, IGetAddrInfoListener *listener, IDNSSDService **service)
300*48a54d36SAndroid Build Coastguard Worker {
301*48a54d36SAndroid Build Coastguard Worker 	CComObject<CDNSSDService>	*	object			= NULL;
302*48a54d36SAndroid Build Coastguard Worker 	DNSServiceRef					sref			= NULL;
303*48a54d36SAndroid Build Coastguard Worker 	std::string						hostNameUTF8;
304*48a54d36SAndroid Build Coastguard Worker 	DNSServiceErrorType				err				= 0;
305*48a54d36SAndroid Build Coastguard Worker 	HRESULT							hr				= 0;
306*48a54d36SAndroid Build Coastguard Worker 	BOOL							ok;
307*48a54d36SAndroid Build Coastguard Worker 
308*48a54d36SAndroid Build Coastguard Worker 	// Initialize
309*48a54d36SAndroid Build Coastguard Worker 	*service = NULL;
310*48a54d36SAndroid Build Coastguard Worker 
311*48a54d36SAndroid Build Coastguard Worker 	// Convert BSTR params to utf8
312*48a54d36SAndroid Build Coastguard Worker 	ok = BSTRToUTF8( hostName, hostNameUTF8 );
313*48a54d36SAndroid Build Coastguard Worker 	require_action( ok, exit, err = kDNSServiceErr_BadParam );
314*48a54d36SAndroid Build Coastguard Worker 
315*48a54d36SAndroid Build Coastguard Worker 	try
316*48a54d36SAndroid Build Coastguard Worker 	{
317*48a54d36SAndroid Build Coastguard Worker 		object = new CComObject<CDNSSDService>();
318*48a54d36SAndroid Build Coastguard Worker 	}
319*48a54d36SAndroid Build Coastguard Worker 	catch ( ... )
320*48a54d36SAndroid Build Coastguard Worker 	{
321*48a54d36SAndroid Build Coastguard Worker 		object = NULL;
322*48a54d36SAndroid Build Coastguard Worker 	}
323*48a54d36SAndroid Build Coastguard Worker 
324*48a54d36SAndroid Build Coastguard Worker 	require_action( object != NULL, exit, err = kDNSServiceErr_NoMemory );
325*48a54d36SAndroid Build Coastguard Worker 	hr = object->FinalConstruct();
326*48a54d36SAndroid Build Coastguard Worker 	require_action( hr == S_OK, exit, err = kDNSServiceErr_Unknown );
327*48a54d36SAndroid Build Coastguard Worker 	object->AddRef();
328*48a54d36SAndroid Build Coastguard Worker 
329*48a54d36SAndroid Build Coastguard Worker 	err = DNSServiceGetAddrInfo( &sref, flags, ifIndex, addressFamily, hostNameUTF8.c_str(), ( DNSServiceGetAddrInfoReply ) &GetAddrInfoReply, object );
330*48a54d36SAndroid Build Coastguard Worker 	require_noerr( err, exit );
331*48a54d36SAndroid Build Coastguard Worker 
332*48a54d36SAndroid Build Coastguard Worker 	object->SetServiceRef( sref );
333*48a54d36SAndroid Build Coastguard Worker 	object->SetListener( listener );
334*48a54d36SAndroid Build Coastguard Worker 
335*48a54d36SAndroid Build Coastguard Worker 	err = object->Run();
336*48a54d36SAndroid Build Coastguard Worker 	require_noerr( err, exit );
337*48a54d36SAndroid Build Coastguard Worker 
338*48a54d36SAndroid Build Coastguard Worker 	*service = object;
339*48a54d36SAndroid Build Coastguard Worker 
340*48a54d36SAndroid Build Coastguard Worker exit:
341*48a54d36SAndroid Build Coastguard Worker 
342*48a54d36SAndroid Build Coastguard Worker 	if ( err && object )
343*48a54d36SAndroid Build Coastguard Worker 	{
344*48a54d36SAndroid Build Coastguard Worker 		object->Release();
345*48a54d36SAndroid Build Coastguard Worker 	}
346*48a54d36SAndroid Build Coastguard Worker 
347*48a54d36SAndroid Build Coastguard Worker 	return err;
348*48a54d36SAndroid Build Coastguard Worker }
349*48a54d36SAndroid Build Coastguard Worker 
350*48a54d36SAndroid Build Coastguard Worker 
CreateConnection(IDNSSDService ** service)351*48a54d36SAndroid Build Coastguard Worker STDMETHODIMP CDNSSD::CreateConnection(IDNSSDService **service)
352*48a54d36SAndroid Build Coastguard Worker {
353*48a54d36SAndroid Build Coastguard Worker 	CComObject<CDNSSDService>	*	object	= NULL;
354*48a54d36SAndroid Build Coastguard Worker 	DNSServiceRef					sref	= NULL;
355*48a54d36SAndroid Build Coastguard Worker 	DNSServiceErrorType				err		= 0;
356*48a54d36SAndroid Build Coastguard Worker 	HRESULT							hr		= 0;
357*48a54d36SAndroid Build Coastguard Worker 
358*48a54d36SAndroid Build Coastguard Worker 	// Initialize
359*48a54d36SAndroid Build Coastguard Worker 	*service = NULL;
360*48a54d36SAndroid Build Coastguard Worker 
361*48a54d36SAndroid Build Coastguard Worker 	try
362*48a54d36SAndroid Build Coastguard Worker 	{
363*48a54d36SAndroid Build Coastguard Worker 		object = new CComObject<CDNSSDService>();
364*48a54d36SAndroid Build Coastguard Worker 	}
365*48a54d36SAndroid Build Coastguard Worker 	catch ( ... )
366*48a54d36SAndroid Build Coastguard Worker 	{
367*48a54d36SAndroid Build Coastguard Worker 		object = NULL;
368*48a54d36SAndroid Build Coastguard Worker 	}
369*48a54d36SAndroid Build Coastguard Worker 
370*48a54d36SAndroid Build Coastguard Worker 	require_action( object != NULL, exit, err = kDNSServiceErr_NoMemory );
371*48a54d36SAndroid Build Coastguard Worker 	hr = object->FinalConstruct();
372*48a54d36SAndroid Build Coastguard Worker 	require_action( hr == S_OK, exit, err = kDNSServiceErr_Unknown );
373*48a54d36SAndroid Build Coastguard Worker 	object->AddRef();
374*48a54d36SAndroid Build Coastguard Worker 
375*48a54d36SAndroid Build Coastguard Worker 	err = DNSServiceCreateConnection( &sref );
376*48a54d36SAndroid Build Coastguard Worker 	require_noerr( err, exit );
377*48a54d36SAndroid Build Coastguard Worker 
378*48a54d36SAndroid Build Coastguard Worker 	object->SetServiceRef( sref );
379*48a54d36SAndroid Build Coastguard Worker 
380*48a54d36SAndroid Build Coastguard Worker 	*service = object;
381*48a54d36SAndroid Build Coastguard Worker 
382*48a54d36SAndroid Build Coastguard Worker exit:
383*48a54d36SAndroid Build Coastguard Worker 
384*48a54d36SAndroid Build Coastguard Worker 	if ( err && object )
385*48a54d36SAndroid Build Coastguard Worker 	{
386*48a54d36SAndroid Build Coastguard Worker 		object->Release();
387*48a54d36SAndroid Build Coastguard Worker 	}
388*48a54d36SAndroid Build Coastguard Worker 
389*48a54d36SAndroid Build Coastguard Worker 	return err;
390*48a54d36SAndroid Build Coastguard Worker }
391*48a54d36SAndroid Build Coastguard Worker 
392*48a54d36SAndroid Build Coastguard Worker 
NATPortMappingCreate(DNSSDFlags flags,ULONG ifIndex,DNSSDAddressFamily addressFamily,DNSSDProtocol protocol,USHORT internalPort,USHORT externalPort,ULONG ttl,INATPortMappingListener * listener,IDNSSDService ** service)393*48a54d36SAndroid Build Coastguard Worker STDMETHODIMP CDNSSD::NATPortMappingCreate(DNSSDFlags flags, ULONG ifIndex, DNSSDAddressFamily addressFamily, DNSSDProtocol protocol, USHORT internalPort, USHORT externalPort, ULONG ttl, INATPortMappingListener *listener, IDNSSDService **service)
394*48a54d36SAndroid Build Coastguard Worker {
395*48a54d36SAndroid Build Coastguard Worker 	CComObject<CDNSSDService>	*	object			= NULL;
396*48a54d36SAndroid Build Coastguard Worker 	DNSServiceRef					sref			= NULL;
397*48a54d36SAndroid Build Coastguard Worker 	DNSServiceProtocol				prot			= 0;
398*48a54d36SAndroid Build Coastguard Worker 	DNSServiceErrorType				err				= 0;
399*48a54d36SAndroid Build Coastguard Worker 	HRESULT							hr				= 0;
400*48a54d36SAndroid Build Coastguard Worker 
401*48a54d36SAndroid Build Coastguard Worker 	// Initialize
402*48a54d36SAndroid Build Coastguard Worker 	*service = NULL;
403*48a54d36SAndroid Build Coastguard Worker 
404*48a54d36SAndroid Build Coastguard Worker 	try
405*48a54d36SAndroid Build Coastguard Worker 	{
406*48a54d36SAndroid Build Coastguard Worker 		object = new CComObject<CDNSSDService>();
407*48a54d36SAndroid Build Coastguard Worker 	}
408*48a54d36SAndroid Build Coastguard Worker 	catch ( ... )
409*48a54d36SAndroid Build Coastguard Worker 	{
410*48a54d36SAndroid Build Coastguard Worker 		object = NULL;
411*48a54d36SAndroid Build Coastguard Worker 	}
412*48a54d36SAndroid Build Coastguard Worker 
413*48a54d36SAndroid Build Coastguard Worker 	require_action( object != NULL, exit, err = kDNSServiceErr_NoMemory );
414*48a54d36SAndroid Build Coastguard Worker 	hr = object->FinalConstruct();
415*48a54d36SAndroid Build Coastguard Worker 	require_action( hr == S_OK, exit, err = kDNSServiceErr_Unknown );
416*48a54d36SAndroid Build Coastguard Worker 	object->AddRef();
417*48a54d36SAndroid Build Coastguard Worker 
418*48a54d36SAndroid Build Coastguard Worker 	prot = ( addressFamily | protocol );
419*48a54d36SAndroid Build Coastguard Worker 
420*48a54d36SAndroid Build Coastguard Worker 	err = DNSServiceNATPortMappingCreate( &sref, flags, ifIndex, prot, internalPort, externalPort, ttl, ( DNSServiceNATPortMappingReply ) &NATPortMappingReply, object );
421*48a54d36SAndroid Build Coastguard Worker 	require_noerr( err, exit );
422*48a54d36SAndroid Build Coastguard Worker 
423*48a54d36SAndroid Build Coastguard Worker 	object->SetServiceRef( sref );
424*48a54d36SAndroid Build Coastguard Worker 	object->SetListener( listener );
425*48a54d36SAndroid Build Coastguard Worker 
426*48a54d36SAndroid Build Coastguard Worker 	err = object->Run();
427*48a54d36SAndroid Build Coastguard Worker 	require_noerr( err, exit );
428*48a54d36SAndroid Build Coastguard Worker 
429*48a54d36SAndroid Build Coastguard Worker 	*service = object;
430*48a54d36SAndroid Build Coastguard Worker 
431*48a54d36SAndroid Build Coastguard Worker exit:
432*48a54d36SAndroid Build Coastguard Worker 
433*48a54d36SAndroid Build Coastguard Worker 	if ( err && object )
434*48a54d36SAndroid Build Coastguard Worker 	{
435*48a54d36SAndroid Build Coastguard Worker 		object->Release();
436*48a54d36SAndroid Build Coastguard Worker 	}
437*48a54d36SAndroid Build Coastguard Worker 
438*48a54d36SAndroid Build Coastguard Worker 	return err;
439*48a54d36SAndroid Build Coastguard Worker }
440*48a54d36SAndroid Build Coastguard Worker 
441*48a54d36SAndroid Build Coastguard Worker 
GetProperty(BSTR prop,VARIANT * value)442*48a54d36SAndroid Build Coastguard Worker STDMETHODIMP CDNSSD::GetProperty(BSTR prop, VARIANT * value )
443*48a54d36SAndroid Build Coastguard Worker {
444*48a54d36SAndroid Build Coastguard Worker 	std::string			propUTF8;
445*48a54d36SAndroid Build Coastguard Worker 	std::vector< BYTE >	byteArray;
446*48a54d36SAndroid Build Coastguard Worker 	SAFEARRAY		*	psa			= NULL;
447*48a54d36SAndroid Build Coastguard Worker 	BYTE			*	pData		= NULL;
448*48a54d36SAndroid Build Coastguard Worker 	uint32_t			elems		= 0;
449*48a54d36SAndroid Build Coastguard Worker 	DNSServiceErrorType	err			= 0;
450*48a54d36SAndroid Build Coastguard Worker 	BOOL				ok = TRUE;
451*48a54d36SAndroid Build Coastguard Worker 
452*48a54d36SAndroid Build Coastguard Worker 	// Convert BSTR params to utf8
453*48a54d36SAndroid Build Coastguard Worker 	ok = BSTRToUTF8( prop, propUTF8 );
454*48a54d36SAndroid Build Coastguard Worker 	require_action( ok, exit, err = kDNSServiceErr_BadParam );
455*48a54d36SAndroid Build Coastguard Worker 
456*48a54d36SAndroid Build Coastguard Worker 	// Setup the byte array
457*48a54d36SAndroid Build Coastguard Worker 	require_action( V_VT( value ) == ( VT_ARRAY|VT_UI1 ), exit, err = kDNSServiceErr_Unknown );
458*48a54d36SAndroid Build Coastguard Worker 	psa = V_ARRAY( value );
459*48a54d36SAndroid Build Coastguard Worker 	require_action( psa, exit, err = kDNSServiceErr_Unknown );
460*48a54d36SAndroid Build Coastguard Worker 	require_action( SafeArrayGetDim( psa ) == 1, exit, err = kDNSServiceErr_Unknown );
461*48a54d36SAndroid Build Coastguard Worker 	byteArray.reserve( psa->rgsabound[0].cElements );
462*48a54d36SAndroid Build Coastguard Worker 	byteArray.assign( byteArray.capacity(), 0 );
463*48a54d36SAndroid Build Coastguard Worker 	elems = ( uint32_t ) byteArray.capacity();
464*48a54d36SAndroid Build Coastguard Worker 
465*48a54d36SAndroid Build Coastguard Worker 	// Call the function and package the return value in the Variant
466*48a54d36SAndroid Build Coastguard Worker 	err = DNSServiceGetProperty( propUTF8.c_str(), &byteArray[ 0 ], &elems );
467*48a54d36SAndroid Build Coastguard Worker 	require_noerr( err, exit );
468*48a54d36SAndroid Build Coastguard Worker 	ok = ByteArrayToVariant( &byteArray[ 0 ], elems, value );
469*48a54d36SAndroid Build Coastguard Worker 	require_action( ok, exit, err = kDNSSDError_Unknown );
470*48a54d36SAndroid Build Coastguard Worker 
471*48a54d36SAndroid Build Coastguard Worker exit:
472*48a54d36SAndroid Build Coastguard Worker 
473*48a54d36SAndroid Build Coastguard Worker 	if ( psa )
474*48a54d36SAndroid Build Coastguard Worker 	{
475*48a54d36SAndroid Build Coastguard Worker 		SafeArrayUnaccessData( psa );
476*48a54d36SAndroid Build Coastguard Worker 		psa = NULL;
477*48a54d36SAndroid Build Coastguard Worker 	}
478*48a54d36SAndroid Build Coastguard Worker 
479*48a54d36SAndroid Build Coastguard Worker 	return err;
480*48a54d36SAndroid Build Coastguard Worker }
481*48a54d36SAndroid Build Coastguard Worker 
482*48a54d36SAndroid Build Coastguard Worker 
483*48a54d36SAndroid Build Coastguard Worker void DNSSD_API
DomainEnumReply(DNSServiceRef sdRef,DNSServiceFlags flags,uint32_t ifIndex,DNSServiceErrorType errorCode,const char * replyDomainUTF8,void * context)484*48a54d36SAndroid Build Coastguard Worker CDNSSD::DomainEnumReply
485*48a54d36SAndroid Build Coastguard Worker     (
486*48a54d36SAndroid Build Coastguard Worker     DNSServiceRef                       sdRef,
487*48a54d36SAndroid Build Coastguard Worker     DNSServiceFlags                     flags,
488*48a54d36SAndroid Build Coastguard Worker     uint32_t                            ifIndex,
489*48a54d36SAndroid Build Coastguard Worker     DNSServiceErrorType                 errorCode,
490*48a54d36SAndroid Build Coastguard Worker     const char                          *replyDomainUTF8,
491*48a54d36SAndroid Build Coastguard Worker     void                                *context
492*48a54d36SAndroid Build Coastguard Worker     )
493*48a54d36SAndroid Build Coastguard Worker {
494*48a54d36SAndroid Build Coastguard Worker 	CComObject<CDNSSDService> * service;
495*48a54d36SAndroid Build Coastguard Worker 	int err;
496*48a54d36SAndroid Build Coastguard Worker 
497*48a54d36SAndroid Build Coastguard Worker 	service = ( CComObject< CDNSSDService>* ) context;
498*48a54d36SAndroid Build Coastguard Worker 	require_action( service, exit, err = kDNSServiceErr_Unknown );
499*48a54d36SAndroid Build Coastguard Worker 
500*48a54d36SAndroid Build Coastguard Worker 	if ( !service->Stopped() )
501*48a54d36SAndroid Build Coastguard Worker 	{
502*48a54d36SAndroid Build Coastguard Worker 		IDomainListener	* listener;
503*48a54d36SAndroid Build Coastguard Worker 
504*48a54d36SAndroid Build Coastguard Worker 		listener = ( IDomainListener* ) service->GetListener();
505*48a54d36SAndroid Build Coastguard Worker 		require_action( listener, exit, err = kDNSServiceErr_Unknown );
506*48a54d36SAndroid Build Coastguard Worker 
507*48a54d36SAndroid Build Coastguard Worker 		if ( !errorCode )
508*48a54d36SAndroid Build Coastguard Worker 		{
509*48a54d36SAndroid Build Coastguard Worker 			CComBSTR replyDomain;
510*48a54d36SAndroid Build Coastguard Worker 
511*48a54d36SAndroid Build Coastguard Worker 			UTF8ToBSTR( replyDomainUTF8, replyDomain );
512*48a54d36SAndroid Build Coastguard Worker 
513*48a54d36SAndroid Build Coastguard Worker 			if ( flags & kDNSServiceFlagsAdd )
514*48a54d36SAndroid Build Coastguard Worker 			{
515*48a54d36SAndroid Build Coastguard Worker 				listener->DomainFound( service, ( DNSSDFlags ) flags, ifIndex, replyDomain );
516*48a54d36SAndroid Build Coastguard Worker 			}
517*48a54d36SAndroid Build Coastguard Worker 			else
518*48a54d36SAndroid Build Coastguard Worker 			{
519*48a54d36SAndroid Build Coastguard Worker 				listener->DomainLost( service, ( DNSSDFlags ) flags, ifIndex, replyDomain );
520*48a54d36SAndroid Build Coastguard Worker 			}
521*48a54d36SAndroid Build Coastguard Worker 		}
522*48a54d36SAndroid Build Coastguard Worker 		else
523*48a54d36SAndroid Build Coastguard Worker 		{
524*48a54d36SAndroid Build Coastguard Worker 			listener->EnumDomainsFailed( service, ( DNSSDError ) errorCode );
525*48a54d36SAndroid Build Coastguard Worker 		}
526*48a54d36SAndroid Build Coastguard Worker 	}
527*48a54d36SAndroid Build Coastguard Worker 
528*48a54d36SAndroid Build Coastguard Worker exit:
529*48a54d36SAndroid Build Coastguard Worker 
530*48a54d36SAndroid Build Coastguard Worker 	return;
531*48a54d36SAndroid Build Coastguard Worker }
532*48a54d36SAndroid Build Coastguard Worker 
533*48a54d36SAndroid Build Coastguard Worker 
534*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)535*48a54d36SAndroid Build Coastguard Worker CDNSSD::BrowseReply
536*48a54d36SAndroid Build Coastguard Worker 		(
537*48a54d36SAndroid Build Coastguard Worker 		DNSServiceRef                       sdRef,
538*48a54d36SAndroid Build Coastguard Worker 		DNSServiceFlags                     flags,
539*48a54d36SAndroid Build Coastguard Worker 		uint32_t                            ifIndex,
540*48a54d36SAndroid Build Coastguard Worker 		DNSServiceErrorType                 errorCode,
541*48a54d36SAndroid Build Coastguard Worker 		const char                          *serviceNameUTF8,
542*48a54d36SAndroid Build Coastguard Worker 		const char                          *regTypeUTF8,
543*48a54d36SAndroid Build Coastguard Worker 		const char                          *replyDomainUTF8,
544*48a54d36SAndroid Build Coastguard Worker 		void                                *context
545*48a54d36SAndroid Build Coastguard Worker 		)
546*48a54d36SAndroid Build Coastguard Worker {
547*48a54d36SAndroid Build Coastguard Worker 	CComObject<CDNSSDService> * service;
548*48a54d36SAndroid Build Coastguard Worker 	int err;
549*48a54d36SAndroid Build Coastguard Worker 
550*48a54d36SAndroid Build Coastguard Worker 	service = ( CComObject< CDNSSDService>* ) context;
551*48a54d36SAndroid Build Coastguard Worker 	require_action( service, exit, err = kDNSServiceErr_Unknown );
552*48a54d36SAndroid Build Coastguard Worker 
553*48a54d36SAndroid Build Coastguard Worker 	if ( !service->Stopped() )
554*48a54d36SAndroid Build Coastguard Worker 	{
555*48a54d36SAndroid Build Coastguard Worker 		IBrowseListener	* listener;
556*48a54d36SAndroid Build Coastguard Worker 
557*48a54d36SAndroid Build Coastguard Worker 		listener = ( IBrowseListener* ) service->GetListener();
558*48a54d36SAndroid Build Coastguard Worker 		require_action( listener, exit, err = kDNSServiceErr_Unknown );
559*48a54d36SAndroid Build Coastguard Worker 
560*48a54d36SAndroid Build Coastguard Worker 		if ( !errorCode )
561*48a54d36SAndroid Build Coastguard Worker 		{
562*48a54d36SAndroid Build Coastguard Worker 			CComBSTR	serviceName;
563*48a54d36SAndroid Build Coastguard Worker 			CComBSTR	regType;
564*48a54d36SAndroid Build Coastguard Worker 			CComBSTR	replyDomain;
565*48a54d36SAndroid Build Coastguard Worker 
566*48a54d36SAndroid Build Coastguard Worker 			UTF8ToBSTR( serviceNameUTF8, serviceName );
567*48a54d36SAndroid Build Coastguard Worker 			UTF8ToBSTR( regTypeUTF8, regType );
568*48a54d36SAndroid Build Coastguard Worker 			UTF8ToBSTR( replyDomainUTF8, replyDomain );
569*48a54d36SAndroid Build Coastguard Worker 
570*48a54d36SAndroid Build Coastguard Worker 			if ( flags & kDNSServiceFlagsAdd )
571*48a54d36SAndroid Build Coastguard Worker 			{
572*48a54d36SAndroid Build Coastguard Worker 				listener->ServiceFound( service, ( DNSSDFlags ) flags, ifIndex, serviceName, regType, replyDomain );
573*48a54d36SAndroid Build Coastguard Worker 			}
574*48a54d36SAndroid Build Coastguard Worker 			else
575*48a54d36SAndroid Build Coastguard Worker 			{
576*48a54d36SAndroid Build Coastguard Worker 				listener->ServiceLost( service, ( DNSSDFlags ) flags, ifIndex, serviceName, regType, replyDomain );
577*48a54d36SAndroid Build Coastguard Worker 			}
578*48a54d36SAndroid Build Coastguard Worker 		}
579*48a54d36SAndroid Build Coastguard Worker 		else
580*48a54d36SAndroid Build Coastguard Worker 		{
581*48a54d36SAndroid Build Coastguard Worker 			listener->BrowseFailed( service, ( DNSSDError ) errorCode );
582*48a54d36SAndroid Build Coastguard Worker 		}
583*48a54d36SAndroid Build Coastguard Worker 	}
584*48a54d36SAndroid Build Coastguard Worker 
585*48a54d36SAndroid Build Coastguard Worker exit:
586*48a54d36SAndroid Build Coastguard Worker 
587*48a54d36SAndroid Build Coastguard Worker 	return;
588*48a54d36SAndroid Build Coastguard Worker }
589*48a54d36SAndroid Build Coastguard Worker 
590*48a54d36SAndroid Build Coastguard Worker 
591*48a54d36SAndroid Build Coastguard Worker void DNSSD_API
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)592*48a54d36SAndroid Build Coastguard Worker CDNSSD::ResolveReply
593*48a54d36SAndroid Build Coastguard Worker 		(
594*48a54d36SAndroid Build Coastguard Worker 		DNSServiceRef                       sdRef,
595*48a54d36SAndroid Build Coastguard Worker 		DNSServiceFlags                     flags,
596*48a54d36SAndroid Build Coastguard Worker 		uint32_t                            ifIndex,
597*48a54d36SAndroid Build Coastguard Worker 		DNSServiceErrorType                 errorCode,
598*48a54d36SAndroid Build Coastguard Worker 		const char                          *fullNameUTF8,
599*48a54d36SAndroid Build Coastguard Worker 		const char                          *hostNameUTF8,
600*48a54d36SAndroid Build Coastguard Worker 		uint16_t                            port,
601*48a54d36SAndroid Build Coastguard Worker 		uint16_t                            txtLen,
602*48a54d36SAndroid Build Coastguard Worker 		const unsigned char                 *txtRecord,
603*48a54d36SAndroid Build Coastguard Worker 		void                                *context
604*48a54d36SAndroid Build Coastguard Worker 		)
605*48a54d36SAndroid Build Coastguard Worker {
606*48a54d36SAndroid Build Coastguard Worker 	CComObject<CDNSSDService> * service;
607*48a54d36SAndroid Build Coastguard Worker 	int err;
608*48a54d36SAndroid Build Coastguard Worker 
609*48a54d36SAndroid Build Coastguard Worker 	service = ( CComObject< CDNSSDService>* ) context;
610*48a54d36SAndroid Build Coastguard Worker 	require_action( service, exit, err = kDNSServiceErr_Unknown );
611*48a54d36SAndroid Build Coastguard Worker 
612*48a54d36SAndroid Build Coastguard Worker 	if ( !service->Stopped() )
613*48a54d36SAndroid Build Coastguard Worker 	{
614*48a54d36SAndroid Build Coastguard Worker 		IResolveListener * listener;
615*48a54d36SAndroid Build Coastguard Worker 
616*48a54d36SAndroid Build Coastguard Worker 		listener = ( IResolveListener* ) service->GetListener();
617*48a54d36SAndroid Build Coastguard Worker 		require_action( listener, exit, err = kDNSServiceErr_Unknown );
618*48a54d36SAndroid Build Coastguard Worker 
619*48a54d36SAndroid Build Coastguard Worker 		if ( !errorCode )
620*48a54d36SAndroid Build Coastguard Worker 		{
621*48a54d36SAndroid Build Coastguard Worker 			CComBSTR					fullName;
622*48a54d36SAndroid Build Coastguard Worker 			CComBSTR					hostName;
623*48a54d36SAndroid Build Coastguard Worker 			CComBSTR					regType;
624*48a54d36SAndroid Build Coastguard Worker 			CComBSTR					replyDomain;
625*48a54d36SAndroid Build Coastguard Worker 			CComObject< CTXTRecord >*	record;
626*48a54d36SAndroid Build Coastguard Worker 			BOOL						ok;
627*48a54d36SAndroid Build Coastguard Worker 
628*48a54d36SAndroid Build Coastguard Worker 			ok = UTF8ToBSTR( fullNameUTF8, fullName );
629*48a54d36SAndroid Build Coastguard Worker 			require_action( ok, exit, err = kDNSServiceErr_Unknown );
630*48a54d36SAndroid Build Coastguard Worker 			ok = UTF8ToBSTR( hostNameUTF8, hostName );
631*48a54d36SAndroid Build Coastguard Worker 			require_action( ok, exit, err = kDNSServiceErr_Unknown );
632*48a54d36SAndroid Build Coastguard Worker 
633*48a54d36SAndroid Build Coastguard Worker 			try
634*48a54d36SAndroid Build Coastguard Worker 			{
635*48a54d36SAndroid Build Coastguard Worker 				record = new CComObject<CTXTRecord>();
636*48a54d36SAndroid Build Coastguard Worker 			}
637*48a54d36SAndroid Build Coastguard Worker 			catch ( ... )
638*48a54d36SAndroid Build Coastguard Worker 			{
639*48a54d36SAndroid Build Coastguard Worker 				record = NULL;
640*48a54d36SAndroid Build Coastguard Worker 			}
641*48a54d36SAndroid Build Coastguard Worker 
642*48a54d36SAndroid Build Coastguard Worker 			require_action( record, exit, err = kDNSServiceErr_NoMemory );
643*48a54d36SAndroid Build Coastguard Worker 			record->AddRef();
644*48a54d36SAndroid Build Coastguard Worker 
645*48a54d36SAndroid Build Coastguard Worker 			char buf[ 64 ];
646*48a54d36SAndroid Build Coastguard Worker 			sprintf( buf, "txtLen = %d", txtLen );
647*48a54d36SAndroid Build Coastguard Worker 			OutputDebugStringA( buf );
648*48a54d36SAndroid Build Coastguard Worker 
649*48a54d36SAndroid Build Coastguard Worker 			if ( txtLen > 0 )
650*48a54d36SAndroid Build Coastguard Worker 			{
651*48a54d36SAndroid Build Coastguard Worker 				record->SetBytes( txtRecord, txtLen );
652*48a54d36SAndroid Build Coastguard Worker 			}
653*48a54d36SAndroid Build Coastguard Worker 
654*48a54d36SAndroid Build Coastguard Worker 			listener->ServiceResolved( service, ( DNSSDFlags ) flags, ifIndex, fullName, hostName, port, record );
655*48a54d36SAndroid Build Coastguard Worker 		}
656*48a54d36SAndroid Build Coastguard Worker 		else
657*48a54d36SAndroid Build Coastguard Worker 		{
658*48a54d36SAndroid Build Coastguard Worker 			listener->ResolveFailed( service, ( DNSSDError ) errorCode );
659*48a54d36SAndroid Build Coastguard Worker 		}
660*48a54d36SAndroid Build Coastguard Worker 	}
661*48a54d36SAndroid Build Coastguard Worker 
662*48a54d36SAndroid Build Coastguard Worker exit:
663*48a54d36SAndroid Build Coastguard Worker 
664*48a54d36SAndroid Build Coastguard Worker 	return;
665*48a54d36SAndroid Build Coastguard Worker }
666*48a54d36SAndroid Build Coastguard Worker 
667*48a54d36SAndroid Build Coastguard Worker 
668*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)669*48a54d36SAndroid Build Coastguard Worker CDNSSD::RegisterReply
670*48a54d36SAndroid Build Coastguard Worker 		(
671*48a54d36SAndroid Build Coastguard Worker 		DNSServiceRef                       sdRef,
672*48a54d36SAndroid Build Coastguard Worker 		DNSServiceFlags                     flags,
673*48a54d36SAndroid Build Coastguard Worker 		DNSServiceErrorType                 errorCode,
674*48a54d36SAndroid Build Coastguard Worker 		const char                          *serviceNameUTF8,
675*48a54d36SAndroid Build Coastguard Worker 		const char                          *regTypeUTF8,
676*48a54d36SAndroid Build Coastguard Worker 		const char                          *domainUTF8,
677*48a54d36SAndroid Build Coastguard Worker 		void                                *context
678*48a54d36SAndroid Build Coastguard Worker 		)
679*48a54d36SAndroid Build Coastguard Worker {
680*48a54d36SAndroid Build Coastguard Worker 	CComObject<CDNSSDService> * service;
681*48a54d36SAndroid Build Coastguard Worker 	int err;
682*48a54d36SAndroid Build Coastguard Worker 
683*48a54d36SAndroid Build Coastguard Worker 	service = ( CComObject< CDNSSDService>* ) context;
684*48a54d36SAndroid Build Coastguard Worker 	require_action( service, exit, err = kDNSServiceErr_Unknown );
685*48a54d36SAndroid Build Coastguard Worker 
686*48a54d36SAndroid Build Coastguard Worker 	if ( !service->Stopped() )
687*48a54d36SAndroid Build Coastguard Worker 	{
688*48a54d36SAndroid Build Coastguard Worker 		IRegisterListener * listener;
689*48a54d36SAndroid Build Coastguard Worker 
690*48a54d36SAndroid Build Coastguard Worker 		listener = ( IRegisterListener* ) service->GetListener();
691*48a54d36SAndroid Build Coastguard Worker 		require_action( listener, exit, err = kDNSServiceErr_Unknown );
692*48a54d36SAndroid Build Coastguard Worker 
693*48a54d36SAndroid Build Coastguard Worker 		if ( !errorCode )
694*48a54d36SAndroid Build Coastguard Worker 		{
695*48a54d36SAndroid Build Coastguard Worker 			CComBSTR					serviceName;
696*48a54d36SAndroid Build Coastguard Worker 			CComBSTR					regType;
697*48a54d36SAndroid Build Coastguard Worker 			CComBSTR					domain;
698*48a54d36SAndroid Build Coastguard Worker 			BOOL						ok;
699*48a54d36SAndroid Build Coastguard Worker 
700*48a54d36SAndroid Build Coastguard Worker 			ok = UTF8ToBSTR( serviceNameUTF8, serviceName );
701*48a54d36SAndroid Build Coastguard Worker 			require_action( ok, exit, err = kDNSServiceErr_Unknown );
702*48a54d36SAndroid Build Coastguard Worker 			ok = UTF8ToBSTR( regTypeUTF8, regType );
703*48a54d36SAndroid Build Coastguard Worker 			require_action( ok, exit, err = kDNSServiceErr_Unknown );
704*48a54d36SAndroid Build Coastguard Worker 			ok = UTF8ToBSTR( domainUTF8, domain );
705*48a54d36SAndroid Build Coastguard Worker 			require_action( ok, exit, err = kDNSServiceErr_Unknown );
706*48a54d36SAndroid Build Coastguard Worker 
707*48a54d36SAndroid Build Coastguard Worker 			listener->ServiceRegistered( service, ( DNSSDFlags ) flags, serviceName, regType, domain );
708*48a54d36SAndroid Build Coastguard Worker 		}
709*48a54d36SAndroid Build Coastguard Worker 		else
710*48a54d36SAndroid Build Coastguard Worker 		{
711*48a54d36SAndroid Build Coastguard Worker 			listener->ServiceRegisterFailed( service, ( DNSSDError ) errorCode );
712*48a54d36SAndroid Build Coastguard Worker 		}
713*48a54d36SAndroid Build Coastguard Worker 	}
714*48a54d36SAndroid Build Coastguard Worker 
715*48a54d36SAndroid Build Coastguard Worker exit:
716*48a54d36SAndroid Build Coastguard Worker 
717*48a54d36SAndroid Build Coastguard Worker 	return;
718*48a54d36SAndroid Build Coastguard Worker }
719*48a54d36SAndroid Build Coastguard Worker 
720*48a54d36SAndroid Build Coastguard Worker 
721*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)722*48a54d36SAndroid Build Coastguard Worker CDNSSD::QueryRecordReply
723*48a54d36SAndroid Build Coastguard Worker 		(
724*48a54d36SAndroid Build Coastguard Worker 		DNSServiceRef                       sdRef,
725*48a54d36SAndroid Build Coastguard Worker 		DNSServiceFlags                     flags,
726*48a54d36SAndroid Build Coastguard Worker 		uint32_t                            ifIndex,
727*48a54d36SAndroid Build Coastguard Worker 		DNSServiceErrorType                 errorCode,
728*48a54d36SAndroid Build Coastguard Worker 		const char                          *fullNameUTF8,
729*48a54d36SAndroid Build Coastguard Worker 		uint16_t                            rrtype,
730*48a54d36SAndroid Build Coastguard Worker 		uint16_t                            rrclass,
731*48a54d36SAndroid Build Coastguard Worker 		uint16_t                            rdlen,
732*48a54d36SAndroid Build Coastguard Worker 		const void                          *rdata,
733*48a54d36SAndroid Build Coastguard Worker 		uint32_t                            ttl,
734*48a54d36SAndroid Build Coastguard Worker 		void                                *context
735*48a54d36SAndroid Build Coastguard Worker 		)
736*48a54d36SAndroid Build Coastguard Worker {
737*48a54d36SAndroid Build Coastguard Worker 	CComObject<CDNSSDService> * service;
738*48a54d36SAndroid Build Coastguard Worker 	int err;
739*48a54d36SAndroid Build Coastguard Worker 
740*48a54d36SAndroid Build Coastguard Worker 	service = ( CComObject< CDNSSDService>* ) context;
741*48a54d36SAndroid Build Coastguard Worker 	require_action( service, exit, err = kDNSServiceErr_Unknown );
742*48a54d36SAndroid Build Coastguard Worker 
743*48a54d36SAndroid Build Coastguard Worker 	if ( !service->Stopped() )
744*48a54d36SAndroid Build Coastguard Worker 	{
745*48a54d36SAndroid Build Coastguard Worker 		IQueryRecordListener * listener;
746*48a54d36SAndroid Build Coastguard Worker 
747*48a54d36SAndroid Build Coastguard Worker 		listener = ( IQueryRecordListener* ) service->GetListener();
748*48a54d36SAndroid Build Coastguard Worker 		require_action( listener, exit, err = kDNSServiceErr_Unknown );
749*48a54d36SAndroid Build Coastguard Worker 
750*48a54d36SAndroid Build Coastguard Worker 		if ( !errorCode )
751*48a54d36SAndroid Build Coastguard Worker 		{
752*48a54d36SAndroid Build Coastguard Worker 			CComBSTR	fullName;
753*48a54d36SAndroid Build Coastguard Worker 			VARIANT		var;
754*48a54d36SAndroid Build Coastguard Worker 			BOOL		ok;
755*48a54d36SAndroid Build Coastguard Worker 
756*48a54d36SAndroid Build Coastguard Worker 			ok = UTF8ToBSTR( fullNameUTF8, fullName );
757*48a54d36SAndroid Build Coastguard Worker 			require_action( ok, exit, err = kDNSServiceErr_Unknown );
758*48a54d36SAndroid Build Coastguard Worker 			ok = ByteArrayToVariant( rdata, rdlen, &var );
759*48a54d36SAndroid Build Coastguard Worker 			require_action( ok, exit, err = kDNSServiceErr_Unknown );
760*48a54d36SAndroid Build Coastguard Worker 
761*48a54d36SAndroid Build Coastguard Worker 			listener->QueryRecordAnswered( service, ( DNSSDFlags ) flags, ifIndex, fullName, ( DNSSDRRType ) rrtype, ( DNSSDRRClass ) rrclass, var, ttl );
762*48a54d36SAndroid Build Coastguard Worker 		}
763*48a54d36SAndroid Build Coastguard Worker 		else
764*48a54d36SAndroid Build Coastguard Worker 		{
765*48a54d36SAndroid Build Coastguard Worker 			listener->QueryRecordFailed( service, ( DNSSDError ) errorCode );
766*48a54d36SAndroid Build Coastguard Worker 		}
767*48a54d36SAndroid Build Coastguard Worker 	}
768*48a54d36SAndroid Build Coastguard Worker 
769*48a54d36SAndroid Build Coastguard Worker exit:
770*48a54d36SAndroid Build Coastguard Worker 
771*48a54d36SAndroid Build Coastguard Worker 	return;
772*48a54d36SAndroid Build Coastguard Worker }
773*48a54d36SAndroid Build Coastguard Worker 
774*48a54d36SAndroid Build Coastguard Worker 
775*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)776*48a54d36SAndroid Build Coastguard Worker CDNSSD::GetAddrInfoReply
777*48a54d36SAndroid Build Coastguard Worker 		(
778*48a54d36SAndroid Build Coastguard Worker 		DNSServiceRef                    sdRef,
779*48a54d36SAndroid Build Coastguard Worker 		DNSServiceFlags                  flags,
780*48a54d36SAndroid Build Coastguard Worker 		uint32_t                         ifIndex,
781*48a54d36SAndroid Build Coastguard Worker 		DNSServiceErrorType              errorCode,
782*48a54d36SAndroid Build Coastguard Worker 		const char                       *hostNameUTF8,
783*48a54d36SAndroid Build Coastguard Worker 		const struct sockaddr            *rawAddress,
784*48a54d36SAndroid Build Coastguard Worker 		uint32_t                         ttl,
785*48a54d36SAndroid Build Coastguard Worker 		void                             *context
786*48a54d36SAndroid Build Coastguard Worker 		)
787*48a54d36SAndroid Build Coastguard Worker {
788*48a54d36SAndroid Build Coastguard Worker 	CComObject<CDNSSDService> * service;
789*48a54d36SAndroid Build Coastguard Worker 	int err;
790*48a54d36SAndroid Build Coastguard Worker 
791*48a54d36SAndroid Build Coastguard Worker 	service = ( CComObject< CDNSSDService>* ) context;
792*48a54d36SAndroid Build Coastguard Worker 	require_action( service, exit, err = kDNSServiceErr_Unknown );
793*48a54d36SAndroid Build Coastguard Worker 
794*48a54d36SAndroid Build Coastguard Worker 	if ( !service->Stopped() )
795*48a54d36SAndroid Build Coastguard Worker 	{
796*48a54d36SAndroid Build Coastguard Worker 		IGetAddrInfoListener * listener;
797*48a54d36SAndroid Build Coastguard Worker 
798*48a54d36SAndroid Build Coastguard Worker 		listener = ( IGetAddrInfoListener* ) service->GetListener();
799*48a54d36SAndroid Build Coastguard Worker 		require_action( listener, exit, err = kDNSServiceErr_Unknown );
800*48a54d36SAndroid Build Coastguard Worker 
801*48a54d36SAndroid Build Coastguard Worker 		if ( !errorCode )
802*48a54d36SAndroid Build Coastguard Worker 		{
803*48a54d36SAndroid Build Coastguard Worker 			CComBSTR			hostName;
804*48a54d36SAndroid Build Coastguard Worker 			DWORD				sockaddrLen;
805*48a54d36SAndroid Build Coastguard Worker 			DNSSDAddressFamily	addressFamily;
806*48a54d36SAndroid Build Coastguard Worker 			char				addressUTF8[INET6_ADDRSTRLEN];
807*48a54d36SAndroid Build Coastguard Worker 			DWORD				addressLen = sizeof( addressUTF8 );
808*48a54d36SAndroid Build Coastguard Worker 			CComBSTR			address;
809*48a54d36SAndroid Build Coastguard Worker 			BOOL				ok;
810*48a54d36SAndroid Build Coastguard Worker 
811*48a54d36SAndroid Build Coastguard Worker 			ok = UTF8ToBSTR( hostNameUTF8, hostName );
812*48a54d36SAndroid Build Coastguard Worker 			require_action( ok, exit, err = kDNSServiceErr_Unknown );
813*48a54d36SAndroid Build Coastguard Worker 
814*48a54d36SAndroid Build Coastguard Worker 			switch ( rawAddress->sa_family )
815*48a54d36SAndroid Build Coastguard Worker 			{
816*48a54d36SAndroid Build Coastguard Worker 				case AF_INET:
817*48a54d36SAndroid Build Coastguard Worker 				{
818*48a54d36SAndroid Build Coastguard Worker 					addressFamily	= kDNSSDAddressFamily_IPv4;
819*48a54d36SAndroid Build Coastguard Worker 					sockaddrLen		= sizeof( sockaddr_in );
820*48a54d36SAndroid Build Coastguard Worker 				}
821*48a54d36SAndroid Build Coastguard Worker 				break;
822*48a54d36SAndroid Build Coastguard Worker 
823*48a54d36SAndroid Build Coastguard Worker 				case AF_INET6:
824*48a54d36SAndroid Build Coastguard Worker 				{
825*48a54d36SAndroid Build Coastguard Worker 					addressFamily	= kDNSSDAddressFamily_IPv6;
826*48a54d36SAndroid Build Coastguard Worker 					sockaddrLen		= sizeof( sockaddr_in6 );
827*48a54d36SAndroid Build Coastguard Worker 				}
828*48a54d36SAndroid Build Coastguard Worker 				break;
829*48a54d36SAndroid Build Coastguard Worker 			}
830*48a54d36SAndroid Build Coastguard Worker 
831*48a54d36SAndroid Build Coastguard Worker 			err = WSAAddressToStringA( ( LPSOCKADDR ) rawAddress, sockaddrLen, NULL, addressUTF8, &addressLen );
832*48a54d36SAndroid Build Coastguard Worker 			require_noerr( err, exit );
833*48a54d36SAndroid Build Coastguard Worker 			ok = UTF8ToBSTR( addressUTF8, address );
834*48a54d36SAndroid Build Coastguard Worker 			require_action( ok, exit, err = kDNSServiceErr_Unknown );
835*48a54d36SAndroid Build Coastguard Worker 
836*48a54d36SAndroid Build Coastguard Worker 			listener->GetAddrInfoReply( service, ( DNSSDFlags ) flags, ifIndex, hostName, addressFamily, address, ttl );
837*48a54d36SAndroid Build Coastguard Worker 		}
838*48a54d36SAndroid Build Coastguard Worker 		else
839*48a54d36SAndroid Build Coastguard Worker 		{
840*48a54d36SAndroid Build Coastguard Worker 			listener->GetAddrInfoFailed( service, ( DNSSDError ) errorCode );
841*48a54d36SAndroid Build Coastguard Worker 		}
842*48a54d36SAndroid Build Coastguard Worker 	}
843*48a54d36SAndroid Build Coastguard Worker 
844*48a54d36SAndroid Build Coastguard Worker exit:
845*48a54d36SAndroid Build Coastguard Worker 
846*48a54d36SAndroid Build Coastguard Worker 	return;
847*48a54d36SAndroid Build Coastguard Worker }
848*48a54d36SAndroid Build Coastguard Worker 
849*48a54d36SAndroid Build Coastguard Worker 
850*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)851*48a54d36SAndroid Build Coastguard Worker CDNSSD::NATPortMappingReply
852*48a54d36SAndroid Build Coastguard Worker     (
853*48a54d36SAndroid Build Coastguard Worker     DNSServiceRef                    sdRef,
854*48a54d36SAndroid Build Coastguard Worker     DNSServiceFlags                  flags,
855*48a54d36SAndroid Build Coastguard Worker     uint32_t                         ifIndex,
856*48a54d36SAndroid Build Coastguard Worker     DNSServiceErrorType              errorCode,
857*48a54d36SAndroid Build Coastguard Worker     uint32_t                         externalAddress,   /* four byte IPv4 address in network byte order */
858*48a54d36SAndroid Build Coastguard Worker     DNSServiceProtocol               protocol,
859*48a54d36SAndroid Build Coastguard Worker     uint16_t                         internalPort,
860*48a54d36SAndroid Build Coastguard Worker     uint16_t                         externalPort,      /* may be different than the requested port     */
861*48a54d36SAndroid Build Coastguard Worker     uint32_t                         ttl,               /* may be different than the requested ttl      */
862*48a54d36SAndroid Build Coastguard Worker     void                             *context
863*48a54d36SAndroid Build Coastguard Worker     )
864*48a54d36SAndroid Build Coastguard Worker {
865*48a54d36SAndroid Build Coastguard Worker 	CComObject<CDNSSDService> * service;
866*48a54d36SAndroid Build Coastguard Worker 	int err;
867*48a54d36SAndroid Build Coastguard Worker 
868*48a54d36SAndroid Build Coastguard Worker 	service = ( CComObject< CDNSSDService>* ) context;
869*48a54d36SAndroid Build Coastguard Worker 	require_action( service, exit, err = kDNSServiceErr_Unknown );
870*48a54d36SAndroid Build Coastguard Worker 
871*48a54d36SAndroid Build Coastguard Worker 	if ( !service->Stopped() )
872*48a54d36SAndroid Build Coastguard Worker 	{
873*48a54d36SAndroid Build Coastguard Worker 		INATPortMappingListener * listener;
874*48a54d36SAndroid Build Coastguard Worker 
875*48a54d36SAndroid Build Coastguard Worker 		listener = ( INATPortMappingListener* ) service->GetListener();
876*48a54d36SAndroid Build Coastguard Worker 		require_action( listener, exit, err = kDNSServiceErr_Unknown );
877*48a54d36SAndroid Build Coastguard Worker 
878*48a54d36SAndroid Build Coastguard Worker 		if ( !errorCode )
879*48a54d36SAndroid Build Coastguard Worker 		{
880*48a54d36SAndroid Build Coastguard Worker 			listener->MappingCreated( service, ( DNSSDFlags ) flags, ifIndex, externalAddress, ( DNSSDAddressFamily ) ( protocol & 0x8 ), ( DNSSDProtocol ) ( protocol & 0x80 ), internalPort, externalPort, ttl  );
881*48a54d36SAndroid Build Coastguard Worker 		}
882*48a54d36SAndroid Build Coastguard Worker 		else
883*48a54d36SAndroid Build Coastguard Worker 		{
884*48a54d36SAndroid Build Coastguard Worker 			listener->MappingFailed( service, ( DNSSDError ) errorCode );
885*48a54d36SAndroid Build Coastguard Worker 		}
886*48a54d36SAndroid Build Coastguard Worker 	}
887*48a54d36SAndroid Build Coastguard Worker 
888*48a54d36SAndroid Build Coastguard Worker exit:
889*48a54d36SAndroid Build Coastguard Worker 
890*48a54d36SAndroid Build Coastguard Worker 	return;
891*48a54d36SAndroid Build Coastguard Worker }
892*48a54d36SAndroid Build Coastguard Worker 
893