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