xref: /aosp_15_r20/external/mdnsresponder/mDNSWindows/DLL.NET/dnssd_NET.cpp (revision 48a54d368dc4fa860885eef7b70b6c53499e7c25)
1*48a54d36SAndroid Build Coastguard Worker /* -*- Mode: C; tab-width: 4 -*-
2*48a54d36SAndroid Build Coastguard Worker  *
3*48a54d36SAndroid Build Coastguard Worker  * Copyright (c) 2003-2004 Apple Computer, Inc. All rights reserved.
4*48a54d36SAndroid Build Coastguard Worker  *
5*48a54d36SAndroid Build Coastguard Worker  * Licensed under the Apache License, Version 2.0 (the "License");
6*48a54d36SAndroid Build Coastguard Worker  * you may not use this file except in compliance with the License.
7*48a54d36SAndroid Build Coastguard Worker  * You may obtain a copy of the License at
8*48a54d36SAndroid Build Coastguard Worker  *
9*48a54d36SAndroid Build Coastguard Worker  *     http://www.apache.org/licenses/LICENSE-2.0
10*48a54d36SAndroid Build Coastguard Worker  *
11*48a54d36SAndroid Build Coastguard Worker  * Unless required by applicable law or agreed to in writing, software
12*48a54d36SAndroid Build Coastguard Worker  * distributed under the License is distributed on an "AS IS" BASIS,
13*48a54d36SAndroid Build Coastguard Worker  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14*48a54d36SAndroid Build Coastguard Worker  * See the License for the specific language governing permissions and
15*48a54d36SAndroid Build Coastguard Worker  * limitations under the License.
16*48a54d36SAndroid Build Coastguard Worker  */
17*48a54d36SAndroid Build Coastguard Worker 
18*48a54d36SAndroid Build Coastguard Worker // This is the main DLL file.
19*48a54d36SAndroid Build Coastguard Worker 
20*48a54d36SAndroid Build Coastguard Worker #include "stdafx.h"
21*48a54d36SAndroid Build Coastguard Worker 
22*48a54d36SAndroid Build Coastguard Worker #include "dnssd_NET.h"
23*48a54d36SAndroid Build Coastguard Worker #include "DebugServices.h"
24*48a54d36SAndroid Build Coastguard Worker #include "PString.h"
25*48a54d36SAndroid Build Coastguard Worker 
26*48a54d36SAndroid Build Coastguard Worker 
27*48a54d36SAndroid Build Coastguard Worker using namespace System::Net::Sockets;
28*48a54d36SAndroid Build Coastguard Worker using namespace System::Diagnostics;
29*48a54d36SAndroid Build Coastguard Worker using namespace Apple;
30*48a54d36SAndroid Build Coastguard Worker using namespace Apple::DNSSD;
31*48a54d36SAndroid Build Coastguard Worker 
32*48a54d36SAndroid Build Coastguard Worker 
33*48a54d36SAndroid Build Coastguard Worker //===========================================================================================================================
34*48a54d36SAndroid Build Coastguard Worker //	Constants
35*48a54d36SAndroid Build Coastguard Worker //===========================================================================================================================
36*48a54d36SAndroid Build Coastguard Worker 
37*48a54d36SAndroid Build Coastguard Worker #define	DEBUG_NAME	"[dnssd.NET] "
38*48a54d36SAndroid Build Coastguard Worker 
39*48a54d36SAndroid Build Coastguard Worker //
40*48a54d36SAndroid Build Coastguard Worker // ConvertToString
41*48a54d36SAndroid Build Coastguard Worker //
42*48a54d36SAndroid Build Coastguard Worker static String*
ConvertToString(const char * utf8String)43*48a54d36SAndroid Build Coastguard Worker ConvertToString(const char * utf8String)
44*48a54d36SAndroid Build Coastguard Worker {
45*48a54d36SAndroid Build Coastguard Worker 	return __gc new String(utf8String, 0, strlen(utf8String), __gc new UTF8Encoding(true, true));
46*48a54d36SAndroid Build Coastguard Worker }
47*48a54d36SAndroid Build Coastguard Worker 
48*48a54d36SAndroid Build Coastguard Worker 
49*48a54d36SAndroid Build Coastguard Worker //
50*48a54d36SAndroid Build Coastguard Worker // class ServiceRef
51*48a54d36SAndroid Build Coastguard Worker //
52*48a54d36SAndroid Build Coastguard Worker // ServiceRef serves as the base class for all DNSService operations.
53*48a54d36SAndroid Build Coastguard Worker //
54*48a54d36SAndroid Build Coastguard Worker // It manages the DNSServiceRef, and implements processing the
55*48a54d36SAndroid Build Coastguard Worker // result
56*48a54d36SAndroid Build Coastguard Worker //
ServiceRef(Object * callback)57*48a54d36SAndroid Build Coastguard Worker ServiceRef::ServiceRef(Object * callback)
58*48a54d36SAndroid Build Coastguard Worker :
59*48a54d36SAndroid Build Coastguard Worker 	m_bDisposed(false),
60*48a54d36SAndroid Build Coastguard Worker 	m_callback(callback),
61*48a54d36SAndroid Build Coastguard Worker 	m_thread(NULL)
62*48a54d36SAndroid Build Coastguard Worker {
63*48a54d36SAndroid Build Coastguard Worker 	m_impl = new ServiceRefImpl(this);
64*48a54d36SAndroid Build Coastguard Worker }
65*48a54d36SAndroid Build Coastguard Worker 
66*48a54d36SAndroid Build Coastguard Worker 
~ServiceRef()67*48a54d36SAndroid Build Coastguard Worker ServiceRef::~ServiceRef()
68*48a54d36SAndroid Build Coastguard Worker {
69*48a54d36SAndroid Build Coastguard Worker }
70*48a54d36SAndroid Build Coastguard Worker 
71*48a54d36SAndroid Build Coastguard Worker 
72*48a54d36SAndroid Build Coastguard Worker //
73*48a54d36SAndroid Build Coastguard Worker // StartThread
74*48a54d36SAndroid Build Coastguard Worker //
75*48a54d36SAndroid Build Coastguard Worker // Starts the main processing thread
76*48a54d36SAndroid Build Coastguard Worker //
77*48a54d36SAndroid Build Coastguard Worker void
StartThread()78*48a54d36SAndroid Build Coastguard Worker ServiceRef::StartThread()
79*48a54d36SAndroid Build Coastguard Worker {
80*48a54d36SAndroid Build Coastguard Worker 	check( m_impl != NULL );
81*48a54d36SAndroid Build Coastguard Worker 
82*48a54d36SAndroid Build Coastguard Worker 	m_impl->SetupEvents();
83*48a54d36SAndroid Build Coastguard Worker 
84*48a54d36SAndroid Build Coastguard Worker 	m_thread		=	new Thread(new ThreadStart(this, &Apple::DNSSD::ServiceRef::ProcessingThread));
85*48a54d36SAndroid Build Coastguard Worker 	m_thread->Name	=	S"DNSService Thread";
86*48a54d36SAndroid Build Coastguard Worker 	m_thread->IsBackground = true;
87*48a54d36SAndroid Build Coastguard Worker 
88*48a54d36SAndroid Build Coastguard Worker 	m_thread->Start();
89*48a54d36SAndroid Build Coastguard Worker }
90*48a54d36SAndroid Build Coastguard Worker 
91*48a54d36SAndroid Build Coastguard Worker 
92*48a54d36SAndroid Build Coastguard Worker //
93*48a54d36SAndroid Build Coastguard Worker // ProcessingThread
94*48a54d36SAndroid Build Coastguard Worker //
95*48a54d36SAndroid Build Coastguard Worker // The Thread class can only invoke methods in MC++ types.  So we
96*48a54d36SAndroid Build Coastguard Worker // make a ProcessingThread method that forwards to the impl
97*48a54d36SAndroid Build Coastguard Worker //
98*48a54d36SAndroid Build Coastguard Worker void
ProcessingThread()99*48a54d36SAndroid Build Coastguard Worker ServiceRef::ProcessingThread()
100*48a54d36SAndroid Build Coastguard Worker {
101*48a54d36SAndroid Build Coastguard Worker 	m_impl->ProcessingThread();
102*48a54d36SAndroid Build Coastguard Worker }
103*48a54d36SAndroid Build Coastguard Worker 
104*48a54d36SAndroid Build Coastguard Worker 
105*48a54d36SAndroid Build Coastguard Worker //
106*48a54d36SAndroid Build Coastguard Worker // Dispose
107*48a54d36SAndroid Build Coastguard Worker //
108*48a54d36SAndroid Build Coastguard Worker // Calls impl-Dispose().  This ultimately will call DNSServiceRefDeallocate()
109*48a54d36SAndroid Build Coastguard Worker //
110*48a54d36SAndroid Build Coastguard Worker void
Dispose()111*48a54d36SAndroid Build Coastguard Worker ServiceRef::Dispose()
112*48a54d36SAndroid Build Coastguard Worker {
113*48a54d36SAndroid Build Coastguard Worker 	check(m_impl != NULL);
114*48a54d36SAndroid Build Coastguard Worker 	check(m_bDisposed == false);
115*48a54d36SAndroid Build Coastguard Worker 
116*48a54d36SAndroid Build Coastguard Worker 	if (!m_bDisposed)
117*48a54d36SAndroid Build Coastguard Worker 	{
118*48a54d36SAndroid Build Coastguard Worker 		m_bDisposed = true;
119*48a54d36SAndroid Build Coastguard Worker 
120*48a54d36SAndroid Build Coastguard Worker 		//
121*48a54d36SAndroid Build Coastguard Worker 		// Call Dispose.  This won't call DNSServiceRefDeallocate()
122*48a54d36SAndroid Build Coastguard Worker 		// necessarily. It depends on what thread this is being
123*48a54d36SAndroid Build Coastguard Worker 		// called in.
124*48a54d36SAndroid Build Coastguard Worker 		//
125*48a54d36SAndroid Build Coastguard Worker 		m_impl->Dispose();
126*48a54d36SAndroid Build Coastguard Worker 		m_impl = NULL;
127*48a54d36SAndroid Build Coastguard Worker 
128*48a54d36SAndroid Build Coastguard Worker 		m_thread = NULL;
129*48a54d36SAndroid Build Coastguard Worker 
130*48a54d36SAndroid Build Coastguard Worker 		GC::SuppressFinalize(this);
131*48a54d36SAndroid Build Coastguard Worker 	}
132*48a54d36SAndroid Build Coastguard Worker }
133*48a54d36SAndroid Build Coastguard Worker 
134*48a54d36SAndroid Build Coastguard Worker 
135*48a54d36SAndroid Build Coastguard Worker //
136*48a54d36SAndroid Build Coastguard Worker // EnumerateDomainsDispatch
137*48a54d36SAndroid Build Coastguard Worker //
138*48a54d36SAndroid Build Coastguard Worker // Dispatch a reply to the delegate.
139*48a54d36SAndroid Build Coastguard Worker //
140*48a54d36SAndroid Build Coastguard Worker void
EnumerateDomainsDispatch(ServiceFlags flags,int interfaceIndex,ErrorCode errorCode,String * replyDomain)141*48a54d36SAndroid Build Coastguard Worker ServiceRef::EnumerateDomainsDispatch
142*48a54d36SAndroid Build Coastguard Worker 						(
143*48a54d36SAndroid Build Coastguard Worker 						ServiceFlags	flags,
144*48a54d36SAndroid Build Coastguard Worker 						int				interfaceIndex,
145*48a54d36SAndroid Build Coastguard Worker 						ErrorCode		errorCode,
146*48a54d36SAndroid Build Coastguard Worker 						String		*	replyDomain
147*48a54d36SAndroid Build Coastguard Worker 						)
148*48a54d36SAndroid Build Coastguard Worker {
149*48a54d36SAndroid Build Coastguard Worker 	if ((m_callback != NULL) && (m_impl != NULL))
150*48a54d36SAndroid Build Coastguard Worker 	{
151*48a54d36SAndroid Build Coastguard Worker 		DNSService::EnumerateDomainsReply * OnEnumerateDomainsReply = static_cast<DNSService::EnumerateDomainsReply*>(m_callback);
152*48a54d36SAndroid Build Coastguard Worker 		OnEnumerateDomainsReply(this, flags, interfaceIndex, errorCode, replyDomain);
153*48a54d36SAndroid Build Coastguard Worker 	}
154*48a54d36SAndroid Build Coastguard Worker }
155*48a54d36SAndroid Build Coastguard Worker 
156*48a54d36SAndroid Build Coastguard Worker 
157*48a54d36SAndroid Build Coastguard Worker //
158*48a54d36SAndroid Build Coastguard Worker // RegisterDispatch
159*48a54d36SAndroid Build Coastguard Worker //
160*48a54d36SAndroid Build Coastguard Worker // Dispatch a reply to the delegate.
161*48a54d36SAndroid Build Coastguard Worker //
162*48a54d36SAndroid Build Coastguard Worker void
RegisterDispatch(ServiceFlags flags,ErrorCode errorCode,String * name,String * regtype,String * domain)163*48a54d36SAndroid Build Coastguard Worker ServiceRef::RegisterDispatch
164*48a54d36SAndroid Build Coastguard Worker 				(
165*48a54d36SAndroid Build Coastguard Worker 				ServiceFlags	flags,
166*48a54d36SAndroid Build Coastguard Worker 				ErrorCode		errorCode,
167*48a54d36SAndroid Build Coastguard Worker  				String		*	name,
168*48a54d36SAndroid Build Coastguard Worker 				String		*	regtype,
169*48a54d36SAndroid Build Coastguard Worker 				String		*	domain
170*48a54d36SAndroid Build Coastguard Worker 				)
171*48a54d36SAndroid Build Coastguard Worker {
172*48a54d36SAndroid Build Coastguard Worker 	if ((m_callback != NULL) && (m_impl != NULL))
173*48a54d36SAndroid Build Coastguard Worker 	{
174*48a54d36SAndroid Build Coastguard Worker 		DNSService::RegisterReply * OnRegisterReply = static_cast<DNSService::RegisterReply*>(m_callback);
175*48a54d36SAndroid Build Coastguard Worker 		OnRegisterReply(this, flags, errorCode, name, regtype, domain);
176*48a54d36SAndroid Build Coastguard Worker 	}
177*48a54d36SAndroid Build Coastguard Worker }
178*48a54d36SAndroid Build Coastguard Worker 
179*48a54d36SAndroid Build Coastguard Worker 
180*48a54d36SAndroid Build Coastguard Worker //
181*48a54d36SAndroid Build Coastguard Worker // BrowseDispatch
182*48a54d36SAndroid Build Coastguard Worker //
183*48a54d36SAndroid Build Coastguard Worker // Dispatch a reply to the delegate.
184*48a54d36SAndroid Build Coastguard Worker //
185*48a54d36SAndroid Build Coastguard Worker void
BrowseDispatch(ServiceFlags flags,int interfaceIndex,ErrorCode errorCode,String * serviceName,String * regtype,String * replyDomain)186*48a54d36SAndroid Build Coastguard Worker ServiceRef::BrowseDispatch
187*48a54d36SAndroid Build Coastguard Worker 			(
188*48a54d36SAndroid Build Coastguard Worker 			ServiceFlags	flags,
189*48a54d36SAndroid Build Coastguard Worker 			int				interfaceIndex,
190*48a54d36SAndroid Build Coastguard Worker 			ErrorCode		errorCode,
191*48a54d36SAndroid Build Coastguard Worker 			String		*	serviceName,
192*48a54d36SAndroid Build Coastguard Worker 			String		*	regtype,
193*48a54d36SAndroid Build Coastguard Worker 			String		*	replyDomain
194*48a54d36SAndroid Build Coastguard Worker 			)
195*48a54d36SAndroid Build Coastguard Worker {
196*48a54d36SAndroid Build Coastguard Worker 	if ((m_callback != NULL) && (m_impl != NULL))
197*48a54d36SAndroid Build Coastguard Worker 	{
198*48a54d36SAndroid Build Coastguard Worker 		DNSService::BrowseReply * OnBrowseReply = static_cast<DNSService::BrowseReply*>(m_callback);
199*48a54d36SAndroid Build Coastguard Worker 		OnBrowseReply(this, flags, interfaceIndex, errorCode, serviceName, regtype, replyDomain);
200*48a54d36SAndroid Build Coastguard Worker 	}
201*48a54d36SAndroid Build Coastguard Worker }
202*48a54d36SAndroid Build Coastguard Worker 
203*48a54d36SAndroid Build Coastguard Worker 
204*48a54d36SAndroid Build Coastguard Worker //
205*48a54d36SAndroid Build Coastguard Worker // ResolveDispatch
206*48a54d36SAndroid Build Coastguard Worker //
207*48a54d36SAndroid Build Coastguard Worker // Dispatch a reply to the delegate.
208*48a54d36SAndroid Build Coastguard Worker //
209*48a54d36SAndroid Build Coastguard Worker void
ResolveDispatch(ServiceFlags flags,int interfaceIndex,ErrorCode errorCode,String * fullname,String * hosttarget,int port,Byte txtRecord[])210*48a54d36SAndroid Build Coastguard Worker ServiceRef::ResolveDispatch
211*48a54d36SAndroid Build Coastguard Worker 			(
212*48a54d36SAndroid Build Coastguard Worker 			ServiceFlags	flags,
213*48a54d36SAndroid Build Coastguard Worker 			int				interfaceIndex,
214*48a54d36SAndroid Build Coastguard Worker 			ErrorCode		errorCode,
215*48a54d36SAndroid Build Coastguard Worker 			String		*	fullname,
216*48a54d36SAndroid Build Coastguard Worker 			String		*	hosttarget,
217*48a54d36SAndroid Build Coastguard Worker 			int				port,
218*48a54d36SAndroid Build Coastguard Worker 			Byte			txtRecord[]
219*48a54d36SAndroid Build Coastguard Worker 			)
220*48a54d36SAndroid Build Coastguard Worker {
221*48a54d36SAndroid Build Coastguard Worker 	if ((m_callback != NULL) && (m_impl != NULL))
222*48a54d36SAndroid Build Coastguard Worker 	{
223*48a54d36SAndroid Build Coastguard Worker 		DNSService::ResolveReply * OnResolveReply = static_cast<DNSService::ResolveReply*>(m_callback);
224*48a54d36SAndroid Build Coastguard Worker 		OnResolveReply(this, flags, interfaceIndex, errorCode, fullname, hosttarget, port, txtRecord);
225*48a54d36SAndroid Build Coastguard Worker 	}
226*48a54d36SAndroid Build Coastguard Worker }
227*48a54d36SAndroid Build Coastguard Worker 
228*48a54d36SAndroid Build Coastguard Worker 
229*48a54d36SAndroid Build Coastguard Worker //
230*48a54d36SAndroid Build Coastguard Worker // RegisterRecordDispatch
231*48a54d36SAndroid Build Coastguard Worker //
232*48a54d36SAndroid Build Coastguard Worker // Dispatch a reply to the delegate.
233*48a54d36SAndroid Build Coastguard Worker //
234*48a54d36SAndroid Build Coastguard Worker void
RegisterRecordDispatch(ServiceFlags flags,ErrorCode errorCode,RecordRef * record)235*48a54d36SAndroid Build Coastguard Worker ServiceRef::RegisterRecordDispatch
236*48a54d36SAndroid Build Coastguard Worker 				(
237*48a54d36SAndroid Build Coastguard Worker 				ServiceFlags	flags,
238*48a54d36SAndroid Build Coastguard Worker 				ErrorCode		errorCode,
239*48a54d36SAndroid Build Coastguard Worker 				RecordRef	*	record
240*48a54d36SAndroid Build Coastguard Worker 				)
241*48a54d36SAndroid Build Coastguard Worker {
242*48a54d36SAndroid Build Coastguard Worker 	if ((m_callback != NULL) && (m_impl != NULL))
243*48a54d36SAndroid Build Coastguard Worker 	{
244*48a54d36SAndroid Build Coastguard Worker 		DNSService::RegisterRecordReply * OnRegisterRecordReply = static_cast<DNSService::RegisterRecordReply*>(m_callback);
245*48a54d36SAndroid Build Coastguard Worker 		OnRegisterRecordReply(this, flags, errorCode, record);
246*48a54d36SAndroid Build Coastguard Worker 	}
247*48a54d36SAndroid Build Coastguard Worker }
248*48a54d36SAndroid Build Coastguard Worker 
249*48a54d36SAndroid Build Coastguard Worker 
250*48a54d36SAndroid Build Coastguard Worker //
251*48a54d36SAndroid Build Coastguard Worker // QueryRecordDispatch
252*48a54d36SAndroid Build Coastguard Worker //
253*48a54d36SAndroid Build Coastguard Worker // Dispatch a reply to the delegate.
254*48a54d36SAndroid Build Coastguard Worker //
255*48a54d36SAndroid Build Coastguard Worker void
QueryRecordDispatch(ServiceFlags flags,int interfaceIndex,ErrorCode errorCode,String * fullname,int rrtype,int rrclass,Byte rdata[],int ttl)256*48a54d36SAndroid Build Coastguard Worker ServiceRef::QueryRecordDispatch
257*48a54d36SAndroid Build Coastguard Worker 					(
258*48a54d36SAndroid Build Coastguard Worker 					ServiceFlags	flags,
259*48a54d36SAndroid Build Coastguard Worker 					int				interfaceIndex,
260*48a54d36SAndroid Build Coastguard Worker 					ErrorCode		errorCode,
261*48a54d36SAndroid Build Coastguard Worker 					String		*	fullname,
262*48a54d36SAndroid Build Coastguard Worker 					int				rrtype,
263*48a54d36SAndroid Build Coastguard Worker 					int				rrclass,
264*48a54d36SAndroid Build Coastguard Worker 					Byte			rdata[],
265*48a54d36SAndroid Build Coastguard Worker 					int				ttl
266*48a54d36SAndroid Build Coastguard Worker 					)
267*48a54d36SAndroid Build Coastguard Worker {
268*48a54d36SAndroid Build Coastguard Worker 	if ((m_callback != NULL) && (m_impl != NULL))
269*48a54d36SAndroid Build Coastguard Worker 	{
270*48a54d36SAndroid Build Coastguard Worker 		DNSService::QueryRecordReply * OnQueryRecordReply = static_cast<DNSService::QueryRecordReply*>(m_callback);
271*48a54d36SAndroid Build Coastguard Worker 		OnQueryRecordReply(this, flags, interfaceIndex, errorCode, fullname, rrtype, rrclass, rdata, ttl);
272*48a54d36SAndroid Build Coastguard Worker 	}
273*48a54d36SAndroid Build Coastguard Worker }
274*48a54d36SAndroid Build Coastguard Worker 
275*48a54d36SAndroid Build Coastguard Worker 
276*48a54d36SAndroid Build Coastguard Worker //
277*48a54d36SAndroid Build Coastguard Worker // ServiceRefImpl::ServiceRefImpl()
278*48a54d36SAndroid Build Coastguard Worker //
279*48a54d36SAndroid Build Coastguard Worker // Constructs a new ServiceRefImpl.  We save the pointer to our enclosing
280*48a54d36SAndroid Build Coastguard Worker // class in a gcroot handle.  This satisfies the garbage collector as
281*48a54d36SAndroid Build Coastguard Worker // the outer class is a managed type
282*48a54d36SAndroid Build Coastguard Worker //
ServiceRefImpl(ServiceRef * outer)283*48a54d36SAndroid Build Coastguard Worker ServiceRef::ServiceRefImpl::ServiceRefImpl(ServiceRef * outer)
284*48a54d36SAndroid Build Coastguard Worker :
285*48a54d36SAndroid Build Coastguard Worker 	m_socketEvent(NULL),
286*48a54d36SAndroid Build Coastguard Worker 	m_stopEvent(NULL),
287*48a54d36SAndroid Build Coastguard Worker 	m_disposed(false),
288*48a54d36SAndroid Build Coastguard Worker 	m_outer(outer),
289*48a54d36SAndroid Build Coastguard Worker 	m_ref(NULL)
290*48a54d36SAndroid Build Coastguard Worker {
291*48a54d36SAndroid Build Coastguard Worker 	m_threadId = GetCurrentThreadId();
292*48a54d36SAndroid Build Coastguard Worker }
293*48a54d36SAndroid Build Coastguard Worker 
294*48a54d36SAndroid Build Coastguard Worker 
295*48a54d36SAndroid Build Coastguard Worker //
296*48a54d36SAndroid Build Coastguard Worker // ServiceRefImpl::~ServiceRefImpl()
297*48a54d36SAndroid Build Coastguard Worker //
298*48a54d36SAndroid Build Coastguard Worker // Deallocate all resources associated with the ServiceRefImpl
299*48a54d36SAndroid Build Coastguard Worker //
~ServiceRefImpl()300*48a54d36SAndroid Build Coastguard Worker ServiceRef::ServiceRefImpl::~ServiceRefImpl()
301*48a54d36SAndroid Build Coastguard Worker {
302*48a54d36SAndroid Build Coastguard Worker 	if (m_socketEvent != NULL)
303*48a54d36SAndroid Build Coastguard Worker 	{
304*48a54d36SAndroid Build Coastguard Worker 		CloseHandle(m_socketEvent);
305*48a54d36SAndroid Build Coastguard Worker 		m_socketEvent = NULL;
306*48a54d36SAndroid Build Coastguard Worker 	}
307*48a54d36SAndroid Build Coastguard Worker 
308*48a54d36SAndroid Build Coastguard Worker 	if (m_stopEvent != NULL)
309*48a54d36SAndroid Build Coastguard Worker 	{
310*48a54d36SAndroid Build Coastguard Worker 		CloseHandle(m_stopEvent);
311*48a54d36SAndroid Build Coastguard Worker 		m_stopEvent = NULL;
312*48a54d36SAndroid Build Coastguard Worker 	}
313*48a54d36SAndroid Build Coastguard Worker 
314*48a54d36SAndroid Build Coastguard Worker 	if (m_ref != NULL)
315*48a54d36SAndroid Build Coastguard Worker 	{
316*48a54d36SAndroid Build Coastguard Worker 		DNSServiceRefDeallocate(m_ref);
317*48a54d36SAndroid Build Coastguard Worker 		m_ref = NULL;
318*48a54d36SAndroid Build Coastguard Worker 	}
319*48a54d36SAndroid Build Coastguard Worker }
320*48a54d36SAndroid Build Coastguard Worker 
321*48a54d36SAndroid Build Coastguard Worker 
322*48a54d36SAndroid Build Coastguard Worker //
323*48a54d36SAndroid Build Coastguard Worker // ServiceRefImpl::SetupEvents()
324*48a54d36SAndroid Build Coastguard Worker //
325*48a54d36SAndroid Build Coastguard Worker // Setup the events necessary to manage multi-threaded dispatch
326*48a54d36SAndroid Build Coastguard Worker // of DNSService Events
327*48a54d36SAndroid Build Coastguard Worker //
328*48a54d36SAndroid Build Coastguard Worker void
SetupEvents()329*48a54d36SAndroid Build Coastguard Worker ServiceRef::ServiceRefImpl::SetupEvents()
330*48a54d36SAndroid Build Coastguard Worker {
331*48a54d36SAndroid Build Coastguard Worker 	check(m_ref != NULL);
332*48a54d36SAndroid Build Coastguard Worker 
333*48a54d36SAndroid Build Coastguard Worker 	m_socket		=	(SOCKET) DNSServiceRefSockFD(m_ref);
334*48a54d36SAndroid Build Coastguard Worker 	check(m_socket != INVALID_SOCKET);
335*48a54d36SAndroid Build Coastguard Worker 
336*48a54d36SAndroid Build Coastguard Worker 	m_socketEvent	=	CreateEvent(NULL, 0, 0, NULL);
337*48a54d36SAndroid Build Coastguard Worker 
338*48a54d36SAndroid Build Coastguard Worker 	if (m_socketEvent == NULL)
339*48a54d36SAndroid Build Coastguard Worker 	{
340*48a54d36SAndroid Build Coastguard Worker 		throw new DNSServiceException(Unknown);
341*48a54d36SAndroid Build Coastguard Worker 	}
342*48a54d36SAndroid Build Coastguard Worker 
343*48a54d36SAndroid Build Coastguard Worker 	int err = WSAEventSelect(m_socket, m_socketEvent, FD_READ|FD_CLOSE);
344*48a54d36SAndroid Build Coastguard Worker 
345*48a54d36SAndroid Build Coastguard Worker 	if (err != 0)
346*48a54d36SAndroid Build Coastguard Worker 	{
347*48a54d36SAndroid Build Coastguard Worker 		throw new DNSServiceException(Unknown);
348*48a54d36SAndroid Build Coastguard Worker 	}
349*48a54d36SAndroid Build Coastguard Worker 
350*48a54d36SAndroid Build Coastguard Worker 	m_stopEvent = CreateEvent(NULL, 0, 0, NULL);
351*48a54d36SAndroid Build Coastguard Worker 
352*48a54d36SAndroid Build Coastguard Worker 	if (m_stopEvent == NULL)
353*48a54d36SAndroid Build Coastguard Worker 	{
354*48a54d36SAndroid Build Coastguard Worker 		throw new DNSServiceException(Unknown);
355*48a54d36SAndroid Build Coastguard Worker 	}
356*48a54d36SAndroid Build Coastguard Worker }
357*48a54d36SAndroid Build Coastguard Worker 
358*48a54d36SAndroid Build Coastguard Worker 
359*48a54d36SAndroid Build Coastguard Worker //
360*48a54d36SAndroid Build Coastguard Worker // ServiceRefImpl::ProcessingThread()
361*48a54d36SAndroid Build Coastguard Worker //
362*48a54d36SAndroid Build Coastguard Worker // Wait for socket events on the DNSServiceRefSockFD().  Also wait
363*48a54d36SAndroid Build Coastguard Worker // for stop events
364*48a54d36SAndroid Build Coastguard Worker //
365*48a54d36SAndroid Build Coastguard Worker void
ProcessingThread()366*48a54d36SAndroid Build Coastguard Worker ServiceRef::ServiceRefImpl::ProcessingThread()
367*48a54d36SAndroid Build Coastguard Worker {
368*48a54d36SAndroid Build Coastguard Worker 	check( m_socketEvent != NULL );
369*48a54d36SAndroid Build Coastguard Worker 	check( m_stopEvent != NULL );
370*48a54d36SAndroid Build Coastguard Worker 	check( m_ref != NULL );
371*48a54d36SAndroid Build Coastguard Worker 
372*48a54d36SAndroid Build Coastguard Worker 	HANDLE handles[2];
373*48a54d36SAndroid Build Coastguard Worker 
374*48a54d36SAndroid Build Coastguard Worker 	handles[0] = m_socketEvent;
375*48a54d36SAndroid Build Coastguard Worker 	handles[1] = m_stopEvent;
376*48a54d36SAndroid Build Coastguard Worker 
377*48a54d36SAndroid Build Coastguard Worker 	while (m_disposed == false)
378*48a54d36SAndroid Build Coastguard Worker 	{
379*48a54d36SAndroid Build Coastguard Worker 		int ret = WaitForMultipleObjects(2, handles, FALSE, INFINITE);
380*48a54d36SAndroid Build Coastguard Worker 
381*48a54d36SAndroid Build Coastguard Worker 		//
382*48a54d36SAndroid Build Coastguard Worker 		// it's a socket event
383*48a54d36SAndroid Build Coastguard Worker 		//
384*48a54d36SAndroid Build Coastguard Worker 		if (ret == WAIT_OBJECT_0)
385*48a54d36SAndroid Build Coastguard Worker 		{
386*48a54d36SAndroid Build Coastguard Worker 			DNSServiceProcessResult(m_ref);
387*48a54d36SAndroid Build Coastguard Worker 		}
388*48a54d36SAndroid Build Coastguard Worker 		//
389*48a54d36SAndroid Build Coastguard Worker 		// else it's a stop event
390*48a54d36SAndroid Build Coastguard Worker 		//
391*48a54d36SAndroid Build Coastguard Worker 		else if (ret == WAIT_OBJECT_0 + 1)
392*48a54d36SAndroid Build Coastguard Worker 		{
393*48a54d36SAndroid Build Coastguard Worker 			break;
394*48a54d36SAndroid Build Coastguard Worker 		}
395*48a54d36SAndroid Build Coastguard Worker 		else
396*48a54d36SAndroid Build Coastguard Worker 		{
397*48a54d36SAndroid Build Coastguard Worker 			//
398*48a54d36SAndroid Build Coastguard Worker 			// unexpected wait result
399*48a54d36SAndroid Build Coastguard Worker 			//
400*48a54d36SAndroid Build Coastguard Worker 			dlog( kDebugLevelWarning, DEBUG_NAME "%s: unexpected wait result (result=0x%08X)\n", __ROUTINE__, ret );
401*48a54d36SAndroid Build Coastguard Worker 		}
402*48a54d36SAndroid Build Coastguard Worker 	}
403*48a54d36SAndroid Build Coastguard Worker 
404*48a54d36SAndroid Build Coastguard Worker 	delete this;
405*48a54d36SAndroid Build Coastguard Worker }
406*48a54d36SAndroid Build Coastguard Worker 
407*48a54d36SAndroid Build Coastguard Worker 
408*48a54d36SAndroid Build Coastguard Worker //
409*48a54d36SAndroid Build Coastguard Worker // ServiceRefImpl::Dispose()
410*48a54d36SAndroid Build Coastguard Worker //
411*48a54d36SAndroid Build Coastguard Worker // Calls DNSServiceRefDeallocate()
412*48a54d36SAndroid Build Coastguard Worker //
413*48a54d36SAndroid Build Coastguard Worker void
Dispose()414*48a54d36SAndroid Build Coastguard Worker ServiceRef::ServiceRefImpl::Dispose()
415*48a54d36SAndroid Build Coastguard Worker {
416*48a54d36SAndroid Build Coastguard Worker 	OSStatus	err;
417*48a54d36SAndroid Build Coastguard Worker 	BOOL		ok;
418*48a54d36SAndroid Build Coastguard Worker 
419*48a54d36SAndroid Build Coastguard Worker 	check(m_disposed == false);
420*48a54d36SAndroid Build Coastguard Worker 
421*48a54d36SAndroid Build Coastguard Worker 	m_disposed = true;
422*48a54d36SAndroid Build Coastguard Worker 
423*48a54d36SAndroid Build Coastguard Worker 	ok = SetEvent(m_stopEvent);
424*48a54d36SAndroid Build Coastguard Worker 	err = translate_errno( ok, (OSStatus) GetLastError(), kUnknownErr );
425*48a54d36SAndroid Build Coastguard Worker 	require_noerr( err, exit );
426*48a54d36SAndroid Build Coastguard Worker 
427*48a54d36SAndroid Build Coastguard Worker exit:
428*48a54d36SAndroid Build Coastguard Worker 
429*48a54d36SAndroid Build Coastguard Worker 	return;
430*48a54d36SAndroid Build Coastguard Worker }
431*48a54d36SAndroid Build Coastguard Worker 
432*48a54d36SAndroid Build Coastguard Worker 
433*48a54d36SAndroid Build Coastguard Worker //
434*48a54d36SAndroid Build Coastguard Worker // ServiceRefImpl::EnumerateDomainsCallback()
435*48a54d36SAndroid Build Coastguard Worker //
436*48a54d36SAndroid Build Coastguard Worker // This is the callback from dnssd.dll.  We pass this up to our outer, managed type
437*48a54d36SAndroid Build Coastguard Worker //
438*48a54d36SAndroid Build Coastguard Worker void DNSSD_API
EnumerateDomainsCallback(DNSServiceRef sdRef,DNSServiceFlags flags,uint32_t interfaceIndex,DNSServiceErrorType errorCode,const char * replyDomain,void * context)439*48a54d36SAndroid Build Coastguard Worker ServiceRef::ServiceRefImpl::EnumerateDomainsCallback
440*48a54d36SAndroid Build Coastguard Worker 											(
441*48a54d36SAndroid Build Coastguard Worker 											DNSServiceRef			sdRef,
442*48a54d36SAndroid Build Coastguard Worker 											DNSServiceFlags			flags,
443*48a54d36SAndroid Build Coastguard Worker 											uint32_t				interfaceIndex,
444*48a54d36SAndroid Build Coastguard Worker 											DNSServiceErrorType		errorCode,
445*48a54d36SAndroid Build Coastguard Worker 											const char			*	replyDomain,
446*48a54d36SAndroid Build Coastguard Worker 											void				*	context
447*48a54d36SAndroid Build Coastguard Worker 											)
448*48a54d36SAndroid Build Coastguard Worker {
449*48a54d36SAndroid Build Coastguard Worker 	ServiceRef::ServiceRefImpl * self = static_cast<ServiceRef::ServiceRefImpl*>(context);
450*48a54d36SAndroid Build Coastguard Worker 
451*48a54d36SAndroid Build Coastguard Worker 	check( self != NULL );
452*48a54d36SAndroid Build Coastguard Worker 	check( self->m_outer != NULL );
453*48a54d36SAndroid Build Coastguard Worker 
454*48a54d36SAndroid Build Coastguard Worker 	if (self->m_disposed == false)
455*48a54d36SAndroid Build Coastguard Worker 	{
456*48a54d36SAndroid Build Coastguard Worker 		self->m_outer->EnumerateDomainsDispatch((ServiceFlags) flags, interfaceIndex, (ErrorCode) errorCode, ConvertToString(replyDomain));
457*48a54d36SAndroid Build Coastguard Worker 	}
458*48a54d36SAndroid Build Coastguard Worker }
459*48a54d36SAndroid Build Coastguard Worker 
460*48a54d36SAndroid Build Coastguard Worker 
461*48a54d36SAndroid Build Coastguard Worker //
462*48a54d36SAndroid Build Coastguard Worker // ServiceRefImpl::RegisterCallback()
463*48a54d36SAndroid Build Coastguard Worker //
464*48a54d36SAndroid Build Coastguard Worker // This is the callback from dnssd.dll.  We pass this up to our outer, managed type
465*48a54d36SAndroid Build Coastguard Worker //
466*48a54d36SAndroid Build Coastguard Worker void DNSSD_API
RegisterCallback(DNSServiceRef sdRef,DNSServiceFlags flags,DNSServiceErrorType errorCode,const char * name,const char * regtype,const char * domain,void * context)467*48a54d36SAndroid Build Coastguard Worker ServiceRef::ServiceRefImpl::RegisterCallback
468*48a54d36SAndroid Build Coastguard Worker 							(
469*48a54d36SAndroid Build Coastguard Worker 							DNSServiceRef			sdRef,
470*48a54d36SAndroid Build Coastguard Worker 							DNSServiceFlags			flags,
471*48a54d36SAndroid Build Coastguard Worker 							DNSServiceErrorType		errorCode,
472*48a54d36SAndroid Build Coastguard Worker 							const char			*	name,
473*48a54d36SAndroid Build Coastguard Worker 							const char			*	regtype,
474*48a54d36SAndroid Build Coastguard Worker 							const char			*	domain,
475*48a54d36SAndroid Build Coastguard Worker 							void				*	context
476*48a54d36SAndroid Build Coastguard Worker 							)
477*48a54d36SAndroid Build Coastguard Worker {
478*48a54d36SAndroid Build Coastguard Worker 	ServiceRef::ServiceRefImpl * self = static_cast<ServiceRef::ServiceRefImpl*>(context);
479*48a54d36SAndroid Build Coastguard Worker 
480*48a54d36SAndroid Build Coastguard Worker 	check( self != NULL );
481*48a54d36SAndroid Build Coastguard Worker 	check( self->m_outer != NULL );
482*48a54d36SAndroid Build Coastguard Worker 
483*48a54d36SAndroid Build Coastguard Worker 	if (self->m_disposed == false)
484*48a54d36SAndroid Build Coastguard Worker 	{
485*48a54d36SAndroid Build Coastguard Worker 		self->m_outer->RegisterDispatch((ServiceFlags) flags, (ErrorCode) errorCode, ConvertToString(name), ConvertToString(regtype), ConvertToString(domain));
486*48a54d36SAndroid Build Coastguard Worker 	}
487*48a54d36SAndroid Build Coastguard Worker }
488*48a54d36SAndroid Build Coastguard Worker 
489*48a54d36SAndroid Build Coastguard Worker 
490*48a54d36SAndroid Build Coastguard Worker //
491*48a54d36SAndroid Build Coastguard Worker // ServiceRefImpl::BrowseCallback()
492*48a54d36SAndroid Build Coastguard Worker //
493*48a54d36SAndroid Build Coastguard Worker // This is the callback from dnssd.dll.  We pass this up to our outer, managed type
494*48a54d36SAndroid Build Coastguard Worker //
495*48a54d36SAndroid Build Coastguard Worker void DNSSD_API
BrowseCallback(DNSServiceRef sdRef,DNSServiceFlags flags,uint32_t interfaceIndex,DNSServiceErrorType errorCode,const char * serviceName,const char * regtype,const char * replyDomain,void * context)496*48a54d36SAndroid Build Coastguard Worker ServiceRef::ServiceRefImpl::BrowseCallback
497*48a54d36SAndroid Build Coastguard Worker 							(
498*48a54d36SAndroid Build Coastguard Worker 							DNSServiceRef			sdRef,
499*48a54d36SAndroid Build Coastguard Worker    							DNSServiceFlags			flags,
500*48a54d36SAndroid Build Coastguard Worker 							uint32_t				interfaceIndex,
501*48a54d36SAndroid Build Coastguard Worker 							DNSServiceErrorType		errorCode,
502*48a54d36SAndroid Build Coastguard Worker 							const char			*	serviceName,
503*48a54d36SAndroid Build Coastguard Worker 							const char			*	regtype,
504*48a54d36SAndroid Build Coastguard Worker 							const char			*	replyDomain,
505*48a54d36SAndroid Build Coastguard Worker 							void				*	context
506*48a54d36SAndroid Build Coastguard Worker 							)
507*48a54d36SAndroid Build Coastguard Worker {
508*48a54d36SAndroid Build Coastguard Worker 	ServiceRef::ServiceRefImpl * self = static_cast<ServiceRef::ServiceRefImpl*>(context);
509*48a54d36SAndroid Build Coastguard Worker 
510*48a54d36SAndroid Build Coastguard Worker 	check( self != NULL );
511*48a54d36SAndroid Build Coastguard Worker 	check( self->m_outer != NULL );
512*48a54d36SAndroid Build Coastguard Worker 
513*48a54d36SAndroid Build Coastguard Worker 	if (self->m_disposed == false)
514*48a54d36SAndroid Build Coastguard Worker 	{
515*48a54d36SAndroid Build Coastguard Worker 		self->m_outer->BrowseDispatch((ServiceFlags) flags, interfaceIndex, (ErrorCode) errorCode, ConvertToString(serviceName), ConvertToString(regtype), ConvertToString(replyDomain));
516*48a54d36SAndroid Build Coastguard Worker 	}
517*48a54d36SAndroid Build Coastguard Worker }
518*48a54d36SAndroid Build Coastguard Worker 
519*48a54d36SAndroid Build Coastguard Worker 
520*48a54d36SAndroid Build Coastguard Worker //
521*48a54d36SAndroid Build Coastguard Worker // ServiceRefImpl::ResolveCallback()
522*48a54d36SAndroid Build Coastguard Worker //
523*48a54d36SAndroid Build Coastguard Worker // This is the callback from dnssd.dll.  We pass this up to our outer, managed type
524*48a54d36SAndroid Build Coastguard Worker //
525*48a54d36SAndroid Build Coastguard Worker void DNSSD_API
ResolveCallback(DNSServiceRef sdRef,DNSServiceFlags flags,uint32_t interfaceIndex,DNSServiceErrorType errorCode,const char * fullname,const char * hosttarget,uint16_t notAnIntPort,uint16_t txtLen,const char * txtRecord,void * context)526*48a54d36SAndroid Build Coastguard Worker ServiceRef::ServiceRefImpl::ResolveCallback
527*48a54d36SAndroid Build Coastguard Worker 							(
528*48a54d36SAndroid Build Coastguard Worker 							DNSServiceRef			sdRef,
529*48a54d36SAndroid Build Coastguard Worker 							DNSServiceFlags			flags,
530*48a54d36SAndroid Build Coastguard Worker 							uint32_t				interfaceIndex,
531*48a54d36SAndroid Build Coastguard Worker 							DNSServiceErrorType		errorCode,
532*48a54d36SAndroid Build Coastguard Worker 							const char			*	fullname,
533*48a54d36SAndroid Build Coastguard Worker 							const char			*	hosttarget,
534*48a54d36SAndroid Build Coastguard Worker 							uint16_t				notAnIntPort,
535*48a54d36SAndroid Build Coastguard Worker 							uint16_t				txtLen,
536*48a54d36SAndroid Build Coastguard Worker 							const char			*	txtRecord,
537*48a54d36SAndroid Build Coastguard Worker 							void				*	context
538*48a54d36SAndroid Build Coastguard Worker 							)
539*48a54d36SAndroid Build Coastguard Worker {
540*48a54d36SAndroid Build Coastguard Worker 	ServiceRef::ServiceRefImpl * self = static_cast<ServiceRef::ServiceRefImpl*>(context);
541*48a54d36SAndroid Build Coastguard Worker 
542*48a54d36SAndroid Build Coastguard Worker 	check( self != NULL );
543*48a54d36SAndroid Build Coastguard Worker 	check( self->m_outer != NULL );
544*48a54d36SAndroid Build Coastguard Worker 
545*48a54d36SAndroid Build Coastguard Worker 	if (self->m_disposed == false)
546*48a54d36SAndroid Build Coastguard Worker 	{
547*48a54d36SAndroid Build Coastguard Worker 		Byte txtRecordBytes[];
548*48a54d36SAndroid Build Coastguard Worker 
549*48a54d36SAndroid Build Coastguard Worker 		txtRecordBytes = NULL;
550*48a54d36SAndroid Build Coastguard Worker 
551*48a54d36SAndroid Build Coastguard Worker 		if (txtLen > 0)
552*48a54d36SAndroid Build Coastguard Worker 		{
553*48a54d36SAndroid Build Coastguard Worker 			//
554*48a54d36SAndroid Build Coastguard Worker 			// copy raw memory into managed byte array
555*48a54d36SAndroid Build Coastguard Worker 			//
556*48a54d36SAndroid Build Coastguard Worker 			txtRecordBytes		=	new Byte[txtLen];
557*48a54d36SAndroid Build Coastguard Worker 			Byte __pin	*	p	=	&txtRecordBytes[0];
558*48a54d36SAndroid Build Coastguard Worker 			memcpy(p, txtRecord, txtLen);
559*48a54d36SAndroid Build Coastguard Worker 		}
560*48a54d36SAndroid Build Coastguard Worker 
561*48a54d36SAndroid Build Coastguard Worker 		self->m_outer->ResolveDispatch((ServiceFlags) flags, interfaceIndex, (ErrorCode) errorCode, ConvertToString(fullname), ConvertToString(hosttarget), ntohs(notAnIntPort), txtRecordBytes);
562*48a54d36SAndroid Build Coastguard Worker 	}
563*48a54d36SAndroid Build Coastguard Worker }
564*48a54d36SAndroid Build Coastguard Worker 
565*48a54d36SAndroid Build Coastguard Worker 
566*48a54d36SAndroid Build Coastguard Worker //
567*48a54d36SAndroid Build Coastguard Worker // ServiceRefImpl::RegisterRecordCallback()
568*48a54d36SAndroid Build Coastguard Worker //
569*48a54d36SAndroid Build Coastguard Worker // This is the callback from dnssd.dll.  We pass this up to our outer, managed type
570*48a54d36SAndroid Build Coastguard Worker //
571*48a54d36SAndroid Build Coastguard Worker void DNSSD_API
RegisterRecordCallback(DNSServiceRef sdRef,DNSRecordRef rrRef,DNSServiceFlags flags,DNSServiceErrorType errorCode,void * context)572*48a54d36SAndroid Build Coastguard Worker ServiceRef::ServiceRefImpl::RegisterRecordCallback
573*48a54d36SAndroid Build Coastguard Worker 								(
574*48a54d36SAndroid Build Coastguard Worker 								DNSServiceRef		sdRef,
575*48a54d36SAndroid Build Coastguard Worker 								DNSRecordRef		rrRef,
576*48a54d36SAndroid Build Coastguard Worker 								DNSServiceFlags		flags,
577*48a54d36SAndroid Build Coastguard Worker 								DNSServiceErrorType	errorCode,
578*48a54d36SAndroid Build Coastguard Worker 								void			*	context
579*48a54d36SAndroid Build Coastguard Worker 								)
580*48a54d36SAndroid Build Coastguard Worker {
581*48a54d36SAndroid Build Coastguard Worker 	ServiceRef::ServiceRefImpl * self = static_cast<ServiceRef::ServiceRefImpl*>(context);
582*48a54d36SAndroid Build Coastguard Worker 
583*48a54d36SAndroid Build Coastguard Worker 	check( self != NULL );
584*48a54d36SAndroid Build Coastguard Worker 	check( self->m_outer != NULL );
585*48a54d36SAndroid Build Coastguard Worker 
586*48a54d36SAndroid Build Coastguard Worker 	if (self->m_disposed == false)
587*48a54d36SAndroid Build Coastguard Worker 	{
588*48a54d36SAndroid Build Coastguard Worker 		RecordRef * record = NULL;
589*48a54d36SAndroid Build Coastguard Worker 
590*48a54d36SAndroid Build Coastguard Worker 		if (errorCode == 0)
591*48a54d36SAndroid Build Coastguard Worker 		{
592*48a54d36SAndroid Build Coastguard Worker 			record = new RecordRef;
593*48a54d36SAndroid Build Coastguard Worker 
594*48a54d36SAndroid Build Coastguard Worker 			record->m_impl->m_ref = rrRef;
595*48a54d36SAndroid Build Coastguard Worker 		}
596*48a54d36SAndroid Build Coastguard Worker 
597*48a54d36SAndroid Build Coastguard Worker 		self->m_outer->RegisterRecordDispatch((ServiceFlags) flags, (ErrorCode) errorCode, record);
598*48a54d36SAndroid Build Coastguard Worker 	}
599*48a54d36SAndroid Build Coastguard Worker }
600*48a54d36SAndroid Build Coastguard Worker 
601*48a54d36SAndroid Build Coastguard Worker 
602*48a54d36SAndroid Build Coastguard Worker //
603*48a54d36SAndroid Build Coastguard Worker // ServiceRefImpl::QueryRecordCallback()
604*48a54d36SAndroid Build Coastguard Worker //
605*48a54d36SAndroid Build Coastguard Worker // This is the callback from dnssd.dll.  We pass this up to our outer, managed type
606*48a54d36SAndroid Build Coastguard Worker //
607*48a54d36SAndroid Build Coastguard Worker void DNSSD_API
QueryRecordCallback(DNSServiceRef DNSServiceRef,DNSServiceFlags flags,uint32_t interfaceIndex,DNSServiceErrorType errorCode,const char * fullname,uint16_t rrtype,uint16_t rrclass,uint16_t rdlen,const void * rdata,uint32_t ttl,void * context)608*48a54d36SAndroid Build Coastguard Worker ServiceRef::ServiceRefImpl::QueryRecordCallback
609*48a54d36SAndroid Build Coastguard Worker 								(
610*48a54d36SAndroid Build Coastguard Worker 								DNSServiceRef			DNSServiceRef,
611*48a54d36SAndroid Build Coastguard Worker 								DNSServiceFlags			flags,
612*48a54d36SAndroid Build Coastguard Worker 								uint32_t				interfaceIndex,
613*48a54d36SAndroid Build Coastguard Worker 								DNSServiceErrorType		errorCode,
614*48a54d36SAndroid Build Coastguard Worker 								const char			*	fullname,
615*48a54d36SAndroid Build Coastguard Worker 								uint16_t				rrtype,
616*48a54d36SAndroid Build Coastguard Worker 								uint16_t				rrclass,
617*48a54d36SAndroid Build Coastguard Worker 								uint16_t				rdlen,
618*48a54d36SAndroid Build Coastguard Worker 								const void			*	rdata,
619*48a54d36SAndroid Build Coastguard Worker 								uint32_t				ttl,
620*48a54d36SAndroid Build Coastguard Worker 								void				*	context
621*48a54d36SAndroid Build Coastguard Worker 								)
622*48a54d36SAndroid Build Coastguard Worker {
623*48a54d36SAndroid Build Coastguard Worker 	ServiceRef::ServiceRefImpl * self = static_cast<ServiceRef::ServiceRefImpl*>(context);
624*48a54d36SAndroid Build Coastguard Worker 
625*48a54d36SAndroid Build Coastguard Worker 	check( self != NULL );
626*48a54d36SAndroid Build Coastguard Worker 	check( self->m_outer != NULL );
627*48a54d36SAndroid Build Coastguard Worker 
628*48a54d36SAndroid Build Coastguard Worker 	if (self->m_disposed == false)
629*48a54d36SAndroid Build Coastguard Worker 	{
630*48a54d36SAndroid Build Coastguard Worker 		Byte rdataBytes[];
631*48a54d36SAndroid Build Coastguard Worker 
632*48a54d36SAndroid Build Coastguard Worker 		if (rdlen)
633*48a54d36SAndroid Build Coastguard Worker 		{
634*48a54d36SAndroid Build Coastguard Worker 			rdataBytes			=	new Byte[rdlen];
635*48a54d36SAndroid Build Coastguard Worker 			Byte __pin * p		=	&rdataBytes[0];
636*48a54d36SAndroid Build Coastguard Worker 			memcpy(p, rdata, rdlen);
637*48a54d36SAndroid Build Coastguard Worker 		}
638*48a54d36SAndroid Build Coastguard Worker 
639*48a54d36SAndroid Build Coastguard Worker 		self->m_outer->QueryRecordDispatch((ServiceFlags) flags, (int) interfaceIndex, (ErrorCode) errorCode, ConvertToString(fullname), rrtype, rrclass, rdataBytes, ttl);
640*48a54d36SAndroid Build Coastguard Worker 	}
641*48a54d36SAndroid Build Coastguard Worker }
642*48a54d36SAndroid Build Coastguard Worker 
643*48a54d36SAndroid Build Coastguard Worker 
644*48a54d36SAndroid Build Coastguard Worker /*
645*48a54d36SAndroid Build Coastguard Worker  * EnumerateDomains()
646*48a54d36SAndroid Build Coastguard Worker  *
647*48a54d36SAndroid Build Coastguard Worker  * This maps to DNSServiceEnumerateDomains().  Returns an
648*48a54d36SAndroid Build Coastguard Worker  * initialized ServiceRef on success, throws an exception
649*48a54d36SAndroid Build Coastguard Worker  * on failure.
650*48a54d36SAndroid Build Coastguard Worker  */
651*48a54d36SAndroid Build Coastguard Worker ServiceRef*
EnumerateDomains(int flags,int interfaceIndex,EnumerateDomainsReply * callback)652*48a54d36SAndroid Build Coastguard Worker DNSService::EnumerateDomains
653*48a54d36SAndroid Build Coastguard Worker 		(
654*48a54d36SAndroid Build Coastguard Worker 		int							flags,
655*48a54d36SAndroid Build Coastguard Worker 		int							interfaceIndex,
656*48a54d36SAndroid Build Coastguard Worker 		EnumerateDomainsReply	*	callback
657*48a54d36SAndroid Build Coastguard Worker 		)
658*48a54d36SAndroid Build Coastguard Worker {
659*48a54d36SAndroid Build Coastguard Worker 	ServiceRef * sdRef = new ServiceRef(callback);
660*48a54d36SAndroid Build Coastguard Worker 	int			 err;
661*48a54d36SAndroid Build Coastguard Worker 
662*48a54d36SAndroid Build Coastguard Worker 	err = DNSServiceEnumerateDomains(&sdRef->m_impl->m_ref, flags, interfaceIndex, ServiceRef::ServiceRefImpl::EnumerateDomainsCallback, sdRef->m_impl);
663*48a54d36SAndroid Build Coastguard Worker 
664*48a54d36SAndroid Build Coastguard Worker 	if (err != 0)
665*48a54d36SAndroid Build Coastguard Worker 	{
666*48a54d36SAndroid Build Coastguard Worker 		throw new DNSServiceException(err);
667*48a54d36SAndroid Build Coastguard Worker 	}
668*48a54d36SAndroid Build Coastguard Worker 
669*48a54d36SAndroid Build Coastguard Worker 	sdRef->StartThread();
670*48a54d36SAndroid Build Coastguard Worker 
671*48a54d36SAndroid Build Coastguard Worker 	return sdRef;
672*48a54d36SAndroid Build Coastguard Worker }
673*48a54d36SAndroid Build Coastguard Worker 
674*48a54d36SAndroid Build Coastguard Worker 
675*48a54d36SAndroid Build Coastguard Worker /*
676*48a54d36SAndroid Build Coastguard Worker  * Register()
677*48a54d36SAndroid Build Coastguard Worker  *
678*48a54d36SAndroid Build Coastguard Worker  * This maps to DNSServiceRegister().  Returns an
679*48a54d36SAndroid Build Coastguard Worker  * initialized ServiceRef on success, throws an exception
680*48a54d36SAndroid Build Coastguard Worker  * on failure.
681*48a54d36SAndroid Build Coastguard Worker  */
682*48a54d36SAndroid Build Coastguard Worker ServiceRef*
Register(int flags,int interfaceIndex,String * name,String * regtype,String * domain,String * host,int port,Byte txtRecord[],RegisterReply * callback)683*48a54d36SAndroid Build Coastguard Worker DNSService::Register
684*48a54d36SAndroid Build Coastguard Worker 				(
685*48a54d36SAndroid Build Coastguard Worker 				int					flags,
686*48a54d36SAndroid Build Coastguard Worker 				int					interfaceIndex,
687*48a54d36SAndroid Build Coastguard Worker 				String			*	name,
688*48a54d36SAndroid Build Coastguard Worker 				String			*	regtype,
689*48a54d36SAndroid Build Coastguard Worker 				String			*	domain,
690*48a54d36SAndroid Build Coastguard Worker 				String			*	host,
691*48a54d36SAndroid Build Coastguard Worker 				int					port,
692*48a54d36SAndroid Build Coastguard Worker 				Byte				txtRecord[],
693*48a54d36SAndroid Build Coastguard Worker 				RegisterReply	*	callback
694*48a54d36SAndroid Build Coastguard Worker 				)
695*48a54d36SAndroid Build Coastguard Worker {
696*48a54d36SAndroid Build Coastguard Worker 	ServiceRef	*	sdRef	=	new ServiceRef(callback);
697*48a54d36SAndroid Build Coastguard Worker 	PString		*	pName	=	new PString(name);
698*48a54d36SAndroid Build Coastguard Worker 	PString		*	pType	=	new PString(regtype);
699*48a54d36SAndroid Build Coastguard Worker 	PString		*	pDomain =	new PString(domain);
700*48a54d36SAndroid Build Coastguard Worker 	PString		*	pHost	=	new PString(host);
701*48a54d36SAndroid Build Coastguard Worker 	int				len		=	0;
702*48a54d36SAndroid Build Coastguard Worker 	Byte __pin	*	p		=	NULL;
703*48a54d36SAndroid Build Coastguard Worker 	void		*	v		=	NULL;
704*48a54d36SAndroid Build Coastguard Worker 
705*48a54d36SAndroid Build Coastguard Worker 	if ((txtRecord != NULL) && (txtRecord->Length > 0))
706*48a54d36SAndroid Build Coastguard Worker 	{
707*48a54d36SAndroid Build Coastguard Worker 		len		= txtRecord->Length;
708*48a54d36SAndroid Build Coastguard Worker 		p		= &txtRecord[0];
709*48a54d36SAndroid Build Coastguard Worker 		v		= (void*) p;
710*48a54d36SAndroid Build Coastguard Worker 	}
711*48a54d36SAndroid Build Coastguard Worker 
712*48a54d36SAndroid Build Coastguard Worker 	int err = DNSServiceRegister(&sdRef->m_impl->m_ref, flags, interfaceIndex, pName->c_str(), pType->c_str(), pDomain->c_str(), pHost->c_str(), htons(port), len, v, ServiceRef::ServiceRefImpl::RegisterCallback, sdRef->m_impl );
713*48a54d36SAndroid Build Coastguard Worker 
714*48a54d36SAndroid Build Coastguard Worker 	if (err != 0)
715*48a54d36SAndroid Build Coastguard Worker 	{
716*48a54d36SAndroid Build Coastguard Worker 		throw new DNSServiceException(err);
717*48a54d36SAndroid Build Coastguard Worker 	}
718*48a54d36SAndroid Build Coastguard Worker 
719*48a54d36SAndroid Build Coastguard Worker 	sdRef->StartThread();
720*48a54d36SAndroid Build Coastguard Worker 
721*48a54d36SAndroid Build Coastguard Worker 	return sdRef;
722*48a54d36SAndroid Build Coastguard Worker }
723*48a54d36SAndroid Build Coastguard Worker 
724*48a54d36SAndroid Build Coastguard Worker 
725*48a54d36SAndroid Build Coastguard Worker /*
726*48a54d36SAndroid Build Coastguard Worker  * AddRecord()
727*48a54d36SAndroid Build Coastguard Worker  *
728*48a54d36SAndroid Build Coastguard Worker  * This maps to DNSServiceAddRecord().  Returns an
729*48a54d36SAndroid Build Coastguard Worker  * initialized ServiceRef on success, throws an exception
730*48a54d36SAndroid Build Coastguard Worker  * on failure.
731*48a54d36SAndroid Build Coastguard Worker  */
732*48a54d36SAndroid Build Coastguard Worker RecordRef*
AddRecord(ServiceRef * sdRef,int flags,int rrtype,Byte rdata[],int ttl)733*48a54d36SAndroid Build Coastguard Worker DNSService::AddRecord
734*48a54d36SAndroid Build Coastguard Worker 				(
735*48a54d36SAndroid Build Coastguard Worker 				ServiceRef	*	sdRef,
736*48a54d36SAndroid Build Coastguard Worker 				int				flags,
737*48a54d36SAndroid Build Coastguard Worker 				int				rrtype,
738*48a54d36SAndroid Build Coastguard Worker 				Byte			rdata[],
739*48a54d36SAndroid Build Coastguard Worker 				int				ttl
740*48a54d36SAndroid Build Coastguard Worker 				)
741*48a54d36SAndroid Build Coastguard Worker {
742*48a54d36SAndroid Build Coastguard Worker 	int				len		=	0;
743*48a54d36SAndroid Build Coastguard Worker 	Byte __pin	*	p		=	NULL;
744*48a54d36SAndroid Build Coastguard Worker 	void		*	v		=	NULL;
745*48a54d36SAndroid Build Coastguard Worker 
746*48a54d36SAndroid Build Coastguard Worker 	if ((rdata != NULL) && (rdata->Length > 0))
747*48a54d36SAndroid Build Coastguard Worker 	{
748*48a54d36SAndroid Build Coastguard Worker 		len = rdata->Length;
749*48a54d36SAndroid Build Coastguard Worker 		p	= &rdata[0];
750*48a54d36SAndroid Build Coastguard Worker 		v	= (void*) p;
751*48a54d36SAndroid Build Coastguard Worker 	}
752*48a54d36SAndroid Build Coastguard Worker 
753*48a54d36SAndroid Build Coastguard Worker 	RecordRef * record = new RecordRef;
754*48a54d36SAndroid Build Coastguard Worker 
755*48a54d36SAndroid Build Coastguard Worker 	int err = DNSServiceAddRecord(sdRef->m_impl->m_ref, &record->m_impl->m_ref, flags, rrtype, len, v, ttl);
756*48a54d36SAndroid Build Coastguard Worker 
757*48a54d36SAndroid Build Coastguard Worker 	if (err != 0)
758*48a54d36SAndroid Build Coastguard Worker 	{
759*48a54d36SAndroid Build Coastguard Worker 		throw new DNSServiceException(err);
760*48a54d36SAndroid Build Coastguard Worker 	}
761*48a54d36SAndroid Build Coastguard Worker 
762*48a54d36SAndroid Build Coastguard Worker 	return record;
763*48a54d36SAndroid Build Coastguard Worker }
764*48a54d36SAndroid Build Coastguard Worker 
765*48a54d36SAndroid Build Coastguard Worker 
766*48a54d36SAndroid Build Coastguard Worker /*
767*48a54d36SAndroid Build Coastguard Worker  * UpdateRecord()
768*48a54d36SAndroid Build Coastguard Worker  *
769*48a54d36SAndroid Build Coastguard Worker  * This maps to DNSServiceUpdateRecord().  Returns an
770*48a54d36SAndroid Build Coastguard Worker  * initialized ServiceRef on success, throws an exception
771*48a54d36SAndroid Build Coastguard Worker  * on failure.
772*48a54d36SAndroid Build Coastguard Worker  */
773*48a54d36SAndroid Build Coastguard Worker void
UpdateRecord(ServiceRef * sdRef,RecordRef * record,int flags,Byte rdata[],int ttl)774*48a54d36SAndroid Build Coastguard Worker DNSService::UpdateRecord
775*48a54d36SAndroid Build Coastguard Worker 				(
776*48a54d36SAndroid Build Coastguard Worker 				ServiceRef	*	sdRef,
777*48a54d36SAndroid Build Coastguard Worker 				RecordRef	*	record,
778*48a54d36SAndroid Build Coastguard Worker 				int				flags,
779*48a54d36SAndroid Build Coastguard Worker 				Byte			rdata[],
780*48a54d36SAndroid Build Coastguard Worker 				int				ttl
781*48a54d36SAndroid Build Coastguard Worker 				)
782*48a54d36SAndroid Build Coastguard Worker {
783*48a54d36SAndroid Build Coastguard Worker 	int				len		=	0;
784*48a54d36SAndroid Build Coastguard Worker 	Byte __pin	*	p		=	NULL;
785*48a54d36SAndroid Build Coastguard Worker 	void		*	v		=	NULL;
786*48a54d36SAndroid Build Coastguard Worker 
787*48a54d36SAndroid Build Coastguard Worker 	if ((rdata != NULL) && (rdata->Length > 0))
788*48a54d36SAndroid Build Coastguard Worker 	{
789*48a54d36SAndroid Build Coastguard Worker 		len	= rdata->Length;
790*48a54d36SAndroid Build Coastguard Worker 		p	= &rdata[0];
791*48a54d36SAndroid Build Coastguard Worker 		v	= (void*) p;
792*48a54d36SAndroid Build Coastguard Worker 	}
793*48a54d36SAndroid Build Coastguard Worker 
794*48a54d36SAndroid Build Coastguard Worker 	int err = DNSServiceUpdateRecord(sdRef->m_impl->m_ref, record ? record->m_impl->m_ref : NULL, flags, len, v, ttl);
795*48a54d36SAndroid Build Coastguard Worker 
796*48a54d36SAndroid Build Coastguard Worker 	if (err != 0)
797*48a54d36SAndroid Build Coastguard Worker 	{
798*48a54d36SAndroid Build Coastguard Worker 		throw new DNSServiceException(err);
799*48a54d36SAndroid Build Coastguard Worker 	}
800*48a54d36SAndroid Build Coastguard Worker }
801*48a54d36SAndroid Build Coastguard Worker 
802*48a54d36SAndroid Build Coastguard Worker 
803*48a54d36SAndroid Build Coastguard Worker /*
804*48a54d36SAndroid Build Coastguard Worker  * RemoveRecord()
805*48a54d36SAndroid Build Coastguard Worker  *
806*48a54d36SAndroid Build Coastguard Worker  * This maps to DNSServiceRemoveRecord().  Returns an
807*48a54d36SAndroid Build Coastguard Worker  * initialized ServiceRef on success, throws an exception
808*48a54d36SAndroid Build Coastguard Worker  * on failure.
809*48a54d36SAndroid Build Coastguard Worker  */
810*48a54d36SAndroid Build Coastguard Worker void
RemoveRecord(ServiceRef * sdRef,RecordRef * record,int flags)811*48a54d36SAndroid Build Coastguard Worker DNSService::RemoveRecord
812*48a54d36SAndroid Build Coastguard Worker 		(
813*48a54d36SAndroid Build Coastguard Worker 		ServiceRef	*	sdRef,
814*48a54d36SAndroid Build Coastguard Worker 		RecordRef	*	record,
815*48a54d36SAndroid Build Coastguard Worker 		int				flags
816*48a54d36SAndroid Build Coastguard Worker 		)
817*48a54d36SAndroid Build Coastguard Worker {
818*48a54d36SAndroid Build Coastguard Worker 	int err = DNSServiceRemoveRecord(sdRef->m_impl->m_ref, record->m_impl->m_ref, flags);
819*48a54d36SAndroid Build Coastguard Worker 
820*48a54d36SAndroid Build Coastguard Worker 	if (err != 0)
821*48a54d36SAndroid Build Coastguard Worker 	{
822*48a54d36SAndroid Build Coastguard Worker 		throw new DNSServiceException(err);
823*48a54d36SAndroid Build Coastguard Worker 	}
824*48a54d36SAndroid Build Coastguard Worker }
825*48a54d36SAndroid Build Coastguard Worker 
826*48a54d36SAndroid Build Coastguard Worker 
827*48a54d36SAndroid Build Coastguard Worker /*
828*48a54d36SAndroid Build Coastguard Worker  * Browse()
829*48a54d36SAndroid Build Coastguard Worker  *
830*48a54d36SAndroid Build Coastguard Worker  * This maps to DNSServiceBrowse().  Returns an
831*48a54d36SAndroid Build Coastguard Worker  * initialized ServiceRef on success, throws an exception
832*48a54d36SAndroid Build Coastguard Worker  * on failure.
833*48a54d36SAndroid Build Coastguard Worker  */
834*48a54d36SAndroid Build Coastguard Worker ServiceRef*
Browse(int flags,int interfaceIndex,String * regtype,String * domain,BrowseReply * callback)835*48a54d36SAndroid Build Coastguard Worker DNSService::Browse
836*48a54d36SAndroid Build Coastguard Worker 	(
837*48a54d36SAndroid Build Coastguard Worker 	int				flags,
838*48a54d36SAndroid Build Coastguard Worker 	int				interfaceIndex,
839*48a54d36SAndroid Build Coastguard Worker 	String		*	regtype,
840*48a54d36SAndroid Build Coastguard Worker 	String		*	domain,
841*48a54d36SAndroid Build Coastguard Worker 	BrowseReply	*	callback
842*48a54d36SAndroid Build Coastguard Worker 	)
843*48a54d36SAndroid Build Coastguard Worker {
844*48a54d36SAndroid Build Coastguard Worker 	ServiceRef	*	sdRef	= new ServiceRef(callback);
845*48a54d36SAndroid Build Coastguard Worker 	PString		*	pType	= new PString(regtype);
846*48a54d36SAndroid Build Coastguard Worker 	PString		*	pDomain	= new PString(domain);
847*48a54d36SAndroid Build Coastguard Worker 
848*48a54d36SAndroid Build Coastguard Worker 	int err = DNSServiceBrowse(&sdRef->m_impl->m_ref, flags, interfaceIndex, pType->c_str(), pDomain->c_str(),(DNSServiceBrowseReply) ServiceRef::ServiceRefImpl::BrowseCallback, sdRef->m_impl);
849*48a54d36SAndroid Build Coastguard Worker 
850*48a54d36SAndroid Build Coastguard Worker 	if (err != 0)
851*48a54d36SAndroid Build Coastguard Worker 	{
852*48a54d36SAndroid Build Coastguard Worker 		throw new DNSServiceException(err);
853*48a54d36SAndroid Build Coastguard Worker 	}
854*48a54d36SAndroid Build Coastguard Worker 
855*48a54d36SAndroid Build Coastguard Worker 	sdRef->StartThread();
856*48a54d36SAndroid Build Coastguard Worker 
857*48a54d36SAndroid Build Coastguard Worker 	return sdRef;
858*48a54d36SAndroid Build Coastguard Worker }
859*48a54d36SAndroid Build Coastguard Worker 
860*48a54d36SAndroid Build Coastguard Worker 
861*48a54d36SAndroid Build Coastguard Worker /*
862*48a54d36SAndroid Build Coastguard Worker  * Resolve()
863*48a54d36SAndroid Build Coastguard Worker  *
864*48a54d36SAndroid Build Coastguard Worker  * This maps to DNSServiceResolve().  Returns an
865*48a54d36SAndroid Build Coastguard Worker  * initialized ServiceRef on success, throws an exception
866*48a54d36SAndroid Build Coastguard Worker  * on failure.
867*48a54d36SAndroid Build Coastguard Worker  */
868*48a54d36SAndroid Build Coastguard Worker ServiceRef*
Resolve(int flags,int interfaceIndex,String * name,String * regtype,String * domain,ResolveReply * callback)869*48a54d36SAndroid Build Coastguard Worker DNSService::Resolve
870*48a54d36SAndroid Build Coastguard Worker 	(
871*48a54d36SAndroid Build Coastguard Worker 	int					flags,
872*48a54d36SAndroid Build Coastguard Worker 	int					interfaceIndex,
873*48a54d36SAndroid Build Coastguard Worker 	String			*	name,
874*48a54d36SAndroid Build Coastguard Worker 	String			*	regtype,
875*48a54d36SAndroid Build Coastguard Worker 	String			*	domain,
876*48a54d36SAndroid Build Coastguard Worker 	ResolveReply	*	callback
877*48a54d36SAndroid Build Coastguard Worker 	)
878*48a54d36SAndroid Build Coastguard Worker {
879*48a54d36SAndroid Build Coastguard Worker 	ServiceRef	*	sdRef	= new ServiceRef(callback);
880*48a54d36SAndroid Build Coastguard Worker 	PString		*	pName	= new PString(name);
881*48a54d36SAndroid Build Coastguard Worker 	PString		*	pType	= new PString(regtype);
882*48a54d36SAndroid Build Coastguard Worker 	PString		*	pDomain	= new PString(domain);
883*48a54d36SAndroid Build Coastguard Worker 
884*48a54d36SAndroid Build Coastguard Worker 	int err = DNSServiceResolve(&sdRef->m_impl->m_ref, flags, interfaceIndex, pName->c_str(), pType->c_str(), pDomain->c_str(),(DNSServiceResolveReply) ServiceRef::ServiceRefImpl::ResolveCallback, sdRef->m_impl);
885*48a54d36SAndroid Build Coastguard Worker 
886*48a54d36SAndroid Build Coastguard Worker 	if (err != 0)
887*48a54d36SAndroid Build Coastguard Worker 	{
888*48a54d36SAndroid Build Coastguard Worker 		throw new DNSServiceException(err);
889*48a54d36SAndroid Build Coastguard Worker 	}
890*48a54d36SAndroid Build Coastguard Worker 
891*48a54d36SAndroid Build Coastguard Worker 	sdRef->StartThread();
892*48a54d36SAndroid Build Coastguard Worker 
893*48a54d36SAndroid Build Coastguard Worker 	return sdRef;
894*48a54d36SAndroid Build Coastguard Worker }
895*48a54d36SAndroid Build Coastguard Worker 
896*48a54d36SAndroid Build Coastguard Worker 
897*48a54d36SAndroid Build Coastguard Worker /*
898*48a54d36SAndroid Build Coastguard Worker  * CreateConnection()
899*48a54d36SAndroid Build Coastguard Worker  *
900*48a54d36SAndroid Build Coastguard Worker  * This maps to DNSServiceCreateConnection().  Returns an
901*48a54d36SAndroid Build Coastguard Worker  * initialized ServiceRef on success, throws an exception
902*48a54d36SAndroid Build Coastguard Worker  * on failure.
903*48a54d36SAndroid Build Coastguard Worker  */
904*48a54d36SAndroid Build Coastguard Worker ServiceRef*
CreateConnection(RegisterRecordReply * callback)905*48a54d36SAndroid Build Coastguard Worker DNSService::CreateConnection
906*48a54d36SAndroid Build Coastguard Worker 			(
907*48a54d36SAndroid Build Coastguard Worker 			RegisterRecordReply * callback
908*48a54d36SAndroid Build Coastguard Worker 			)
909*48a54d36SAndroid Build Coastguard Worker {
910*48a54d36SAndroid Build Coastguard Worker 	ServiceRef * sdRef = new ServiceRef(callback);
911*48a54d36SAndroid Build Coastguard Worker 
912*48a54d36SAndroid Build Coastguard Worker 	int err = DNSServiceCreateConnection(&sdRef->m_impl->m_ref);
913*48a54d36SAndroid Build Coastguard Worker 
914*48a54d36SAndroid Build Coastguard Worker 	if (err != 0)
915*48a54d36SAndroid Build Coastguard Worker 	{
916*48a54d36SAndroid Build Coastguard Worker 		throw new DNSServiceException(err);
917*48a54d36SAndroid Build Coastguard Worker 	}
918*48a54d36SAndroid Build Coastguard Worker 
919*48a54d36SAndroid Build Coastguard Worker 	sdRef->StartThread();
920*48a54d36SAndroid Build Coastguard Worker 
921*48a54d36SAndroid Build Coastguard Worker 	return sdRef;
922*48a54d36SAndroid Build Coastguard Worker }
923*48a54d36SAndroid Build Coastguard Worker 
924*48a54d36SAndroid Build Coastguard Worker 
925*48a54d36SAndroid Build Coastguard Worker /*
926*48a54d36SAndroid Build Coastguard Worker  * RegisterRecord()
927*48a54d36SAndroid Build Coastguard Worker  *
928*48a54d36SAndroid Build Coastguard Worker  * This maps to DNSServiceRegisterRecord().  Returns an
929*48a54d36SAndroid Build Coastguard Worker  * initialized ServiceRef on success, throws an exception
930*48a54d36SAndroid Build Coastguard Worker  * on failure.
931*48a54d36SAndroid Build Coastguard Worker  */
932*48a54d36SAndroid Build Coastguard Worker 
933*48a54d36SAndroid Build Coastguard Worker RecordRef*
RegisterRecord(ServiceRef * sdRef,ServiceFlags flags,int interfaceIndex,String * fullname,int rrtype,int rrclass,Byte rdata[],int ttl)934*48a54d36SAndroid Build Coastguard Worker DNSService::RegisterRecord
935*48a54d36SAndroid Build Coastguard Worker 			(
936*48a54d36SAndroid Build Coastguard Worker 			ServiceRef			*	sdRef,
937*48a54d36SAndroid Build Coastguard Worker 			ServiceFlags			flags,
938*48a54d36SAndroid Build Coastguard Worker 			int						interfaceIndex,
939*48a54d36SAndroid Build Coastguard Worker 			String				*	fullname,
940*48a54d36SAndroid Build Coastguard Worker 			int						rrtype,
941*48a54d36SAndroid Build Coastguard Worker 			int						rrclass,
942*48a54d36SAndroid Build Coastguard Worker 			Byte					rdata[],
943*48a54d36SAndroid Build Coastguard Worker 			int						ttl
944*48a54d36SAndroid Build Coastguard Worker 			)
945*48a54d36SAndroid Build Coastguard Worker {
946*48a54d36SAndroid Build Coastguard Worker 	RecordRef	*	record	= new RecordRef;
947*48a54d36SAndroid Build Coastguard Worker 	int				len		= 0;
948*48a54d36SAndroid Build Coastguard Worker 	Byte __pin	*	p		= NULL;
949*48a54d36SAndroid Build Coastguard Worker 	void		*	v		= NULL;
950*48a54d36SAndroid Build Coastguard Worker 
951*48a54d36SAndroid Build Coastguard Worker 	PString * pFullname = new PString(fullname);
952*48a54d36SAndroid Build Coastguard Worker 
953*48a54d36SAndroid Build Coastguard Worker 	if ((rdata != NULL) && (rdata->Length > 0))
954*48a54d36SAndroid Build Coastguard Worker 	{
955*48a54d36SAndroid Build Coastguard Worker 		len		= rdata->Length;
956*48a54d36SAndroid Build Coastguard Worker 		p		= &rdata[0];
957*48a54d36SAndroid Build Coastguard Worker 		v		= (void*) p;
958*48a54d36SAndroid Build Coastguard Worker 	}
959*48a54d36SAndroid Build Coastguard Worker 
960*48a54d36SAndroid Build Coastguard Worker 	int err = DNSServiceRegisterRecord(sdRef->m_impl->m_ref, &record->m_impl->m_ref, flags, interfaceIndex, pFullname->c_str(), rrtype, rrclass, len, v, ttl, (DNSServiceRegisterRecordReply) ServiceRef::ServiceRefImpl::RegisterRecordCallback, sdRef->m_impl);
961*48a54d36SAndroid Build Coastguard Worker 
962*48a54d36SAndroid Build Coastguard Worker 	if (err != 0)
963*48a54d36SAndroid Build Coastguard Worker 	{
964*48a54d36SAndroid Build Coastguard Worker 		throw new DNSServiceException(err);
965*48a54d36SAndroid Build Coastguard Worker 	}
966*48a54d36SAndroid Build Coastguard Worker 
967*48a54d36SAndroid Build Coastguard Worker 	return record;
968*48a54d36SAndroid Build Coastguard Worker }
969*48a54d36SAndroid Build Coastguard Worker 
970*48a54d36SAndroid Build Coastguard Worker /*
971*48a54d36SAndroid Build Coastguard Worker  * QueryRecord()
972*48a54d36SAndroid Build Coastguard Worker  *
973*48a54d36SAndroid Build Coastguard Worker  * This maps to DNSServiceQueryRecord().  Returns an
974*48a54d36SAndroid Build Coastguard Worker  * initialized ServiceRef on success, throws an exception
975*48a54d36SAndroid Build Coastguard Worker  * on failure.
976*48a54d36SAndroid Build Coastguard Worker  */
977*48a54d36SAndroid Build Coastguard Worker ServiceRef*
QueryRecord(ServiceFlags flags,int interfaceIndex,String * fullname,int rrtype,int rrclass,QueryRecordReply * callback)978*48a54d36SAndroid Build Coastguard Worker DNSService::QueryRecord
979*48a54d36SAndroid Build Coastguard Worker 		(
980*48a54d36SAndroid Build Coastguard Worker 		ServiceFlags			flags,
981*48a54d36SAndroid Build Coastguard Worker 		int						interfaceIndex,
982*48a54d36SAndroid Build Coastguard Worker 		String				*	fullname,
983*48a54d36SAndroid Build Coastguard Worker 		int						rrtype,
984*48a54d36SAndroid Build Coastguard Worker 		int						rrclass,
985*48a54d36SAndroid Build Coastguard Worker 		QueryRecordReply	*	callback
986*48a54d36SAndroid Build Coastguard Worker 		)
987*48a54d36SAndroid Build Coastguard Worker {
988*48a54d36SAndroid Build Coastguard Worker 	ServiceRef	*	sdRef		= new ServiceRef(callback);
989*48a54d36SAndroid Build Coastguard Worker 	PString		*	pFullname	= new PString(fullname);
990*48a54d36SAndroid Build Coastguard Worker 
991*48a54d36SAndroid Build Coastguard Worker 	int err = DNSServiceQueryRecord(&sdRef->m_impl->m_ref, flags, interfaceIndex, pFullname->c_str(), rrtype, rrclass, (DNSServiceQueryRecordReply) ServiceRef::ServiceRefImpl::QueryRecordCallback, sdRef->m_impl);
992*48a54d36SAndroid Build Coastguard Worker 
993*48a54d36SAndroid Build Coastguard Worker 	if (err != 0)
994*48a54d36SAndroid Build Coastguard Worker 	{
995*48a54d36SAndroid Build Coastguard Worker 		throw new DNSServiceException(err);
996*48a54d36SAndroid Build Coastguard Worker 	}
997*48a54d36SAndroid Build Coastguard Worker 
998*48a54d36SAndroid Build Coastguard Worker 	sdRef->StartThread();
999*48a54d36SAndroid Build Coastguard Worker 
1000*48a54d36SAndroid Build Coastguard Worker 	return sdRef;
1001*48a54d36SAndroid Build Coastguard Worker }
1002*48a54d36SAndroid Build Coastguard Worker 
1003*48a54d36SAndroid Build Coastguard Worker 
1004*48a54d36SAndroid Build Coastguard Worker /*
1005*48a54d36SAndroid Build Coastguard Worker  * ReconfirmRecord()
1006*48a54d36SAndroid Build Coastguard Worker  *
1007*48a54d36SAndroid Build Coastguard Worker  * This maps to DNSServiceReconfirmRecord().  Returns an
1008*48a54d36SAndroid Build Coastguard Worker  * initialized ServiceRef on success, throws an exception
1009*48a54d36SAndroid Build Coastguard Worker  * on failure.
1010*48a54d36SAndroid Build Coastguard Worker  */
1011*48a54d36SAndroid Build Coastguard Worker void
ReconfirmRecord(ServiceFlags flags,int interfaceIndex,String * fullname,int rrtype,int rrclass,Byte rdata[])1012*48a54d36SAndroid Build Coastguard Worker DNSService::ReconfirmRecord
1013*48a54d36SAndroid Build Coastguard Worker 		(
1014*48a54d36SAndroid Build Coastguard Worker 		ServiceFlags	flags,
1015*48a54d36SAndroid Build Coastguard Worker 		int				interfaceIndex,
1016*48a54d36SAndroid Build Coastguard Worker 		String		*	fullname,
1017*48a54d36SAndroid Build Coastguard Worker 		int				rrtype,
1018*48a54d36SAndroid Build Coastguard Worker 		int				rrclass,
1019*48a54d36SAndroid Build Coastguard Worker 		Byte			rdata[]
1020*48a54d36SAndroid Build Coastguard Worker 		)
1021*48a54d36SAndroid Build Coastguard Worker {
1022*48a54d36SAndroid Build Coastguard Worker 	int				len	= 0;
1023*48a54d36SAndroid Build Coastguard Worker 	Byte __pin	*	p	= NULL;
1024*48a54d36SAndroid Build Coastguard Worker 	void		*	v	= NULL;
1025*48a54d36SAndroid Build Coastguard Worker 
1026*48a54d36SAndroid Build Coastguard Worker 	PString * pFullname = new PString(fullname);
1027*48a54d36SAndroid Build Coastguard Worker 
1028*48a54d36SAndroid Build Coastguard Worker 	if ((rdata != NULL) && (rdata->Length > 0))
1029*48a54d36SAndroid Build Coastguard Worker 	{
1030*48a54d36SAndroid Build Coastguard Worker 		len	= rdata->Length;
1031*48a54d36SAndroid Build Coastguard Worker 		p	= &rdata[0];
1032*48a54d36SAndroid Build Coastguard Worker 		v	= (void*) p;
1033*48a54d36SAndroid Build Coastguard Worker 	}
1034*48a54d36SAndroid Build Coastguard Worker 
1035*48a54d36SAndroid Build Coastguard Worker 	DNSServiceReconfirmRecord(flags, interfaceIndex, pFullname->c_str(), rrtype, rrclass, len, v);
1036*48a54d36SAndroid Build Coastguard Worker }
1037*48a54d36SAndroid Build Coastguard Worker 
1038*48a54d36SAndroid Build Coastguard Worker 
1039*48a54d36SAndroid Build Coastguard Worker void
SetValue(String * key,Byte value[])1040*48a54d36SAndroid Build Coastguard Worker TextRecord::SetValue
1041*48a54d36SAndroid Build Coastguard Worker 		(
1042*48a54d36SAndroid Build Coastguard Worker 		String	*	key,
1043*48a54d36SAndroid Build Coastguard Worker 		Byte		value[]            /* may be NULL */
1044*48a54d36SAndroid Build Coastguard Worker 		)
1045*48a54d36SAndroid Build Coastguard Worker {
1046*48a54d36SAndroid Build Coastguard Worker 	PString			*	pKey = new PString(key);
1047*48a54d36SAndroid Build Coastguard Worker 	int					len		=	0;
1048*48a54d36SAndroid Build Coastguard Worker 	Byte __pin		*	p		=	NULL;
1049*48a54d36SAndroid Build Coastguard Worker 	void			*	v		=	NULL;
1050*48a54d36SAndroid Build Coastguard Worker 	DNSServiceErrorType	err;
1051*48a54d36SAndroid Build Coastguard Worker 
1052*48a54d36SAndroid Build Coastguard Worker 	if (value && (value->Length > 0))
1053*48a54d36SAndroid Build Coastguard Worker 	{
1054*48a54d36SAndroid Build Coastguard Worker 		len	=	value->Length;
1055*48a54d36SAndroid Build Coastguard Worker 		p	=	&value[0];
1056*48a54d36SAndroid Build Coastguard Worker 		v	=	(void*) p;
1057*48a54d36SAndroid Build Coastguard Worker 	}
1058*48a54d36SAndroid Build Coastguard Worker 
1059*48a54d36SAndroid Build Coastguard Worker 	err = TXTRecordSetValue(&m_impl->m_ref, pKey->c_str(), len, v);
1060*48a54d36SAndroid Build Coastguard Worker 
1061*48a54d36SAndroid Build Coastguard Worker 	if (err != 0)
1062*48a54d36SAndroid Build Coastguard Worker 	{
1063*48a54d36SAndroid Build Coastguard Worker 		throw new DNSServiceException(err);
1064*48a54d36SAndroid Build Coastguard Worker 	}
1065*48a54d36SAndroid Build Coastguard Worker }
1066*48a54d36SAndroid Build Coastguard Worker 
1067*48a54d36SAndroid Build Coastguard Worker 
1068*48a54d36SAndroid Build Coastguard Worker void
RemoveValue(String * key)1069*48a54d36SAndroid Build Coastguard Worker TextRecord::RemoveValue
1070*48a54d36SAndroid Build Coastguard Worker 		(
1071*48a54d36SAndroid Build Coastguard Worker 		String	*	key
1072*48a54d36SAndroid Build Coastguard Worker 		)
1073*48a54d36SAndroid Build Coastguard Worker {
1074*48a54d36SAndroid Build Coastguard Worker 	PString			*	pKey = new PString(key);
1075*48a54d36SAndroid Build Coastguard Worker 	DNSServiceErrorType	err;
1076*48a54d36SAndroid Build Coastguard Worker 
1077*48a54d36SAndroid Build Coastguard Worker 	err = TXTRecordRemoveValue(&m_impl->m_ref, pKey->c_str());
1078*48a54d36SAndroid Build Coastguard Worker 
1079*48a54d36SAndroid Build Coastguard Worker 	if (err != 0)
1080*48a54d36SAndroid Build Coastguard Worker 	{
1081*48a54d36SAndroid Build Coastguard Worker 		throw new DNSServiceException(err);
1082*48a54d36SAndroid Build Coastguard Worker 	}
1083*48a54d36SAndroid Build Coastguard Worker }
1084*48a54d36SAndroid Build Coastguard Worker 
1085*48a54d36SAndroid Build Coastguard Worker 
1086*48a54d36SAndroid Build Coastguard Worker int
GetLength()1087*48a54d36SAndroid Build Coastguard Worker TextRecord::GetLength
1088*48a54d36SAndroid Build Coastguard Worker 		(
1089*48a54d36SAndroid Build Coastguard Worker 		)
1090*48a54d36SAndroid Build Coastguard Worker {
1091*48a54d36SAndroid Build Coastguard Worker 	return TXTRecordGetLength(&m_impl->m_ref);
1092*48a54d36SAndroid Build Coastguard Worker }
1093*48a54d36SAndroid Build Coastguard Worker 
1094*48a54d36SAndroid Build Coastguard Worker 
1095*48a54d36SAndroid Build Coastguard Worker Byte
1096*48a54d36SAndroid Build Coastguard Worker TextRecord::GetBytes
1097*48a54d36SAndroid Build Coastguard Worker 		(
1098*48a54d36SAndroid Build Coastguard Worker 		) __gc[]
1099*48a54d36SAndroid Build Coastguard Worker {
1100*48a54d36SAndroid Build Coastguard Worker 	const void	*	noGCBytes = NULL;
1101*48a54d36SAndroid Build Coastguard Worker 	Byte			gcBytes[] = NULL;
1102*48a54d36SAndroid Build Coastguard Worker 
1103*48a54d36SAndroid Build Coastguard Worker 	noGCBytes		=	TXTRecordGetBytesPtr(&m_impl->m_ref);
1104*48a54d36SAndroid Build Coastguard Worker 	int			len	=	GetLength();
1105*48a54d36SAndroid Build Coastguard Worker 
1106*48a54d36SAndroid Build Coastguard Worker 	if (noGCBytes && len)
1107*48a54d36SAndroid Build Coastguard Worker 	{
1108*48a54d36SAndroid Build Coastguard Worker 		gcBytes				=	new Byte[len];
1109*48a54d36SAndroid Build Coastguard Worker 		Byte __pin	*	p	=	&gcBytes[0];
1110*48a54d36SAndroid Build Coastguard Worker 		memcpy(p, noGCBytes, len);
1111*48a54d36SAndroid Build Coastguard Worker 	}
1112*48a54d36SAndroid Build Coastguard Worker 
1113*48a54d36SAndroid Build Coastguard Worker 	return gcBytes;
1114*48a54d36SAndroid Build Coastguard Worker }
1115*48a54d36SAndroid Build Coastguard Worker 
1116*48a54d36SAndroid Build Coastguard Worker 
1117*48a54d36SAndroid Build Coastguard Worker bool
1118*48a54d36SAndroid Build Coastguard Worker TextRecord::ContainsKey
1119*48a54d36SAndroid Build Coastguard Worker 		(
1120*48a54d36SAndroid Build Coastguard Worker 		Byte		txtRecord[],
1121*48a54d36SAndroid Build Coastguard Worker 		String	*	key
1122*48a54d36SAndroid Build Coastguard Worker 		)
1123*48a54d36SAndroid Build Coastguard Worker {
1124*48a54d36SAndroid Build Coastguard Worker 	PString		*	pKey	= new PString(key);
1125*48a54d36SAndroid Build Coastguard Worker 	Byte __pin	*	p		= &txtRecord[0];
1126*48a54d36SAndroid Build Coastguard Worker 
1127*48a54d36SAndroid Build Coastguard Worker 	return (TXTRecordContainsKey(txtRecord->Length, p, pKey->c_str()) > 0) ? true : false;
1128*48a54d36SAndroid Build Coastguard Worker }
1129*48a54d36SAndroid Build Coastguard Worker 
1130*48a54d36SAndroid Build Coastguard Worker 
1131*48a54d36SAndroid Build Coastguard Worker Byte
1132*48a54d36SAndroid Build Coastguard Worker TextRecord::GetValueBytes
1133*48a54d36SAndroid Build Coastguard Worker 		(
1134*48a54d36SAndroid Build Coastguard Worker 		Byte		txtRecord[],
1135*48a54d36SAndroid Build Coastguard Worker 		String	*	key
1136*48a54d36SAndroid Build Coastguard Worker 		) __gc[]
1137*48a54d36SAndroid Build Coastguard Worker {
1138*48a54d36SAndroid Build Coastguard Worker 	uint8_t			valueLen;
1139*48a54d36SAndroid Build Coastguard Worker 	Byte			ret[]	= NULL;
1140*48a54d36SAndroid Build Coastguard Worker 	PString		*	pKey	= new PString(key);
1141*48a54d36SAndroid Build Coastguard Worker 	Byte __pin	*	p1		= &txtRecord[0];
1142*48a54d36SAndroid Build Coastguard Worker 	const void	*	v;
1143*48a54d36SAndroid Build Coastguard Worker 
1144*48a54d36SAndroid Build Coastguard Worker 	v = TXTRecordGetValuePtr(txtRecord->Length, p1, pKey->c_str(), &valueLen);
1145*48a54d36SAndroid Build Coastguard Worker 
1146*48a54d36SAndroid Build Coastguard Worker 	if (v != NULL)
1147*48a54d36SAndroid Build Coastguard Worker 	{
1148*48a54d36SAndroid Build Coastguard Worker 		ret					= new Byte[valueLen];
1149*48a54d36SAndroid Build Coastguard Worker 		Byte __pin	*	p2	= &ret[0];
1150*48a54d36SAndroid Build Coastguard Worker 
1151*48a54d36SAndroid Build Coastguard Worker 		memcpy(p2, v, valueLen);
1152*48a54d36SAndroid Build Coastguard Worker 	}
1153*48a54d36SAndroid Build Coastguard Worker 
1154*48a54d36SAndroid Build Coastguard Worker 	return ret;
1155*48a54d36SAndroid Build Coastguard Worker }
1156*48a54d36SAndroid Build Coastguard Worker 
1157*48a54d36SAndroid Build Coastguard Worker 
1158*48a54d36SAndroid Build Coastguard Worker int
1159*48a54d36SAndroid Build Coastguard Worker TextRecord::GetCount
1160*48a54d36SAndroid Build Coastguard Worker 		(
1161*48a54d36SAndroid Build Coastguard Worker 		Byte txtRecord[]
1162*48a54d36SAndroid Build Coastguard Worker 		)
1163*48a54d36SAndroid Build Coastguard Worker {
1164*48a54d36SAndroid Build Coastguard Worker 	Byte __pin	*	p	= &txtRecord[0];
1165*48a54d36SAndroid Build Coastguard Worker 
1166*48a54d36SAndroid Build Coastguard Worker 	return TXTRecordGetCount(txtRecord->Length, p);
1167*48a54d36SAndroid Build Coastguard Worker }
1168*48a54d36SAndroid Build Coastguard Worker 
1169*48a54d36SAndroid Build Coastguard Worker 
1170*48a54d36SAndroid Build Coastguard Worker Byte
1171*48a54d36SAndroid Build Coastguard Worker TextRecord::GetItemAtIndex
1172*48a54d36SAndroid Build Coastguard Worker 		(
1173*48a54d36SAndroid Build Coastguard Worker 		Byte				txtRecord[],
1174*48a54d36SAndroid Build Coastguard Worker 		int					index,
1175*48a54d36SAndroid Build Coastguard Worker 		[Out] String	**	key
1176*48a54d36SAndroid Build Coastguard Worker 		) __gc[]
1177*48a54d36SAndroid Build Coastguard Worker {
1178*48a54d36SAndroid Build Coastguard Worker 	char				keyBuf[255];
1179*48a54d36SAndroid Build Coastguard Worker 	uint8_t				keyBufLen = 255;
1180*48a54d36SAndroid Build Coastguard Worker 	uint8_t				valueLen;
1181*48a54d36SAndroid Build Coastguard Worker 	void			*	value;
1182*48a54d36SAndroid Build Coastguard Worker 	Byte				ret[]	= NULL;
1183*48a54d36SAndroid Build Coastguard Worker 	DNSServiceErrorType	err;
1184*48a54d36SAndroid Build Coastguard Worker 	Byte __pin		*	p1		= &txtRecord[0];
1185*48a54d36SAndroid Build Coastguard Worker 
1186*48a54d36SAndroid Build Coastguard Worker 
1187*48a54d36SAndroid Build Coastguard Worker 	err = TXTRecordGetItemAtIndex(txtRecord->Length, p1, index, keyBufLen, keyBuf, &valueLen, (const void**) &value);
1188*48a54d36SAndroid Build Coastguard Worker 
1189*48a54d36SAndroid Build Coastguard Worker 	if (err != 0)
1190*48a54d36SAndroid Build Coastguard Worker 	{
1191*48a54d36SAndroid Build Coastguard Worker 		throw new DNSServiceException(err);
1192*48a54d36SAndroid Build Coastguard Worker 	}
1193*48a54d36SAndroid Build Coastguard Worker 
1194*48a54d36SAndroid Build Coastguard Worker 	*key = ConvertToString(keyBuf);
1195*48a54d36SAndroid Build Coastguard Worker 
1196*48a54d36SAndroid Build Coastguard Worker 	if (valueLen)
1197*48a54d36SAndroid Build Coastguard Worker 	{
1198*48a54d36SAndroid Build Coastguard Worker 		ret					= new Byte[valueLen];
1199*48a54d36SAndroid Build Coastguard Worker 		Byte __pin	*	p2	= &ret[0];
1200*48a54d36SAndroid Build Coastguard Worker 
1201*48a54d36SAndroid Build Coastguard Worker 		memcpy(p2, value, valueLen);
1202*48a54d36SAndroid Build Coastguard Worker 	}
1203*48a54d36SAndroid Build Coastguard Worker 
1204*48a54d36SAndroid Build Coastguard Worker 	return ret;
1205*48a54d36SAndroid Build Coastguard Worker }
1206*48a54d36SAndroid Build Coastguard Worker 
1207*48a54d36SAndroid Build Coastguard Worker 
1208*48a54d36SAndroid Build Coastguard Worker //
1209*48a54d36SAndroid Build Coastguard Worker // DNSServiceException::DNSServiceException()
1210*48a54d36SAndroid Build Coastguard Worker //
1211*48a54d36SAndroid Build Coastguard Worker // Constructs an exception with an error code
1212*48a54d36SAndroid Build Coastguard Worker //
1213*48a54d36SAndroid Build Coastguard Worker DNSServiceException::DNSServiceException
1214*48a54d36SAndroid Build Coastguard Worker 				(
1215*48a54d36SAndroid Build Coastguard Worker 				int _err
1216*48a54d36SAndroid Build Coastguard Worker 				)
1217*48a54d36SAndroid Build Coastguard Worker :
1218*48a54d36SAndroid Build Coastguard Worker 	err(_err)
1219*48a54d36SAndroid Build Coastguard Worker {
1220*48a54d36SAndroid Build Coastguard Worker }
1221*48a54d36SAndroid Build Coastguard Worker 
1222*48a54d36SAndroid Build Coastguard Worker 
1223*48a54d36SAndroid Build Coastguard Worker //
1224*48a54d36SAndroid Build Coastguard Worker // This version of the constructor is useful for instances in which
1225*48a54d36SAndroid Build Coastguard Worker // an inner exception is thrown, caught, and then a new exception
1226*48a54d36SAndroid Build Coastguard Worker // is thrown in it's place
1227*48a54d36SAndroid Build Coastguard Worker //
DNSServiceException(String * message,System::Exception * innerException)1228*48a54d36SAndroid Build Coastguard Worker DNSServiceException::DNSServiceException
1229*48a54d36SAndroid Build Coastguard Worker 				(
1230*48a54d36SAndroid Build Coastguard Worker 				String				*	message,
1231*48a54d36SAndroid Build Coastguard Worker 				System::Exception	*	innerException
1232*48a54d36SAndroid Build Coastguard Worker 				)
1233*48a54d36SAndroid Build Coastguard Worker {
1234*48a54d36SAndroid Build Coastguard Worker }
1235