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