Home | History | Annotate | Download | only in DLL.NET
      1 /* -*- Mode: C; tab-width: 4 -*-
      2  *
      3  * Copyright (c) 2003-2004 Apple Computer, Inc. All rights reserved.
      4  *
      5  * Licensed under the Apache License, Version 2.0 (the "License");
      6  * you may not use this file except in compliance with the License.
      7  * You may obtain a copy of the License at
      8  *
      9  *     http://www.apache.org/licenses/LICENSE-2.0
     10  *
     11  * Unless required by applicable law or agreed to in writing, software
     12  * distributed under the License is distributed on an "AS IS" BASIS,
     13  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     14  * See the License for the specific language governing permissions and
     15  * limitations under the License.
     16 
     17  *
     18  * NOTE:
     19  *
     20  * These .Net APIs are a work in progress, currently being discussed and refined.
     21  * If you plan to build an application based on these APIs, you may wish to
     22  * statically link this code into your application, or otherwise distribute
     23  * the DLL so that it installs into the same folder as your application
     24  * (not into any common system area where it might interfere with other
     25  * applications using a future completed version of these APIs).
     26  * If you plan to do this, please be sure to inform us by sending email
     27  * to bonjour (at) apple.com to let us know.
     28  * You may want to discuss what you're doing on the Bonjour mailing
     29  * list to see if others in similar positions have any suggestions for you:
     30  *
     31  * <http://lists.apple.com/bonjour-dev/>
     32  *
     33  */
     34 
     35 #pragma once
     36 
     37 #include <dns_sd.h>
     38 #include <vcclr.h>
     39 #include <memory>
     40 #include <winsock2.h>
     41 
     42 using namespace System;
     43 using namespace System::Net;
     44 using namespace System::Runtime::InteropServices;
     45 using namespace System::Threading;
     46 using namespace System::Collections;
     47 
     48 
     49 namespace Apple
     50 {
     51 	namespace DNSSD
     52 	{
     53 		public __gc class ServiceRef;
     54 
     55 		public __value enum ServiceFlags : int
     56 		{
     57 			MoreComing			=	1,
     58 			/* MoreComing indicates to a callback that at least one more result is
     59 				* queued and will be delivered following immediately after this one.
     60 				* Applications should not update their UI to display browse
     61 				* results when the MoreComing flag is set, because this would
     62 				* result in a great deal of ugly flickering on the screen.
     63 				* Applications should instead wait until until MoreComing is not set,
     64 				* and then update their UI.
     65 				* When MoreComing is not set, that doesn't mean there will be no more
     66 				* answers EVER, just that there are no more answers immediately
     67 				* available right now at this instant. If more answers become available
     68 				* in the future they will be delivered as usual.
     69 				*/
     70 
     71 			Add					=	2,
     72 			Default				=	4,
     73 			/* Flags for domain enumeration and browse/query reply callbacks.
     74 				* "Default" applies only to enumeration and is only valid in
     75 				* conjuction with "Add".  An enumeration callback with the "Add"
     76 				* flag NOT set indicates a "Remove", i.e. the domain is no longer
     77 				* valid.
     78 				*/
     79 
     80 			NoAutoRename		=	8,
     81 			/* Flag for specifying renaming behavior on name conflict when registering
     82 				* non-shared records. By default, name conflicts are automatically handled
     83 				* by renaming the service.  NoAutoRename overrides this behavior - with this
     84 				* flag set, name conflicts will result in a callback.  The NoAutorename flag
     85 				* is only valid if a name is explicitly specified when registering a service
     86 				* (i.e. the default name is not used.)
     87 				*/
     88 
     89 			Shared				=	16,
     90 			Unique				=	32,
     91 			/* Flag for registering individual records on a connected
     92 				* DNSServiceRef.  Shared indicates that there may be multiple records
     93 				* with this name on the network (e.g. PTR records).  Unique indicates that
     94 	the
     95 				* record's name is to be unique on the network (e.g. SRV records).
     96 				*/
     97 
     98 			BrowseDomains		=	64,
     99 			RegistrationDomains	=	128,
    100 			/* Flags for specifying domain enumeration type in DNSServiceEnumerateDomain
    101 	s.
    102 				* BrowseDomains enumerates domains recommended for browsing, RegistrationDo
    103 	mains
    104 				* enumerates domains recommended for registration.
    105 				*/
    106 		};
    107 
    108 
    109 		public __value enum ErrorCode : int
    110 		{
    111 			NoError				=	0,
    112 			Unknown				=	-65537,
    113 			NoSuchName			=	-65538,
    114 			NoMemory			=	-65539,
    115 			BadParam			=	-65540,
    116 			BadReference		=	-65541,
    117 			BadState			=	-65542,
    118 			BadFlags			=	-65543,
    119 			Unsupported			=	-65544,
    120 			AlreadyRegistered	=	-65547,
    121 			NameConflict		=	-65548,
    122 			Invalid				=	-65549,
    123 			Incompatible		=	-65551,
    124 			BadinterfaceIndex	=	-65552
    125 
    126 			/*
    127 				* mDNS Error codes are in the range
    128 				* FFFE FF00 (-65792) to FFFE FFFF (-65537)
    129 				*/
    130 		};
    131 
    132 		public __gc class DNSServiceException
    133 		:
    134 			public Exception
    135 		{
    136 		public:
    137 
    138 			DNSServiceException
    139 				(
    140 				int err
    141 				);
    142 
    143 			DNSServiceException
    144 				(
    145 				String				*	message,
    146 				System::Exception	*	innerException
    147 				);
    148 
    149 			int err;
    150 		};
    151 
    152 
    153 		/*
    154 		* class RecordRef
    155 		*
    156 		* This is a thin MC++ class facade on top of a DNSRecordRef
    157 		*/
    158 		public __gc class RecordRef
    159 		{
    160 		public:
    161 
    162 			RecordRef()
    163 			{
    164 				m_impl = new RecordRefImpl;
    165 				m_impl->m_ref = NULL;
    166 			}
    167 
    168 			~RecordRef()
    169 			{
    170 				delete m_impl;
    171 			}
    172 
    173 			__nogc class RecordRefImpl
    174 			{
    175 			public:
    176 
    177 				DNSRecordRef m_ref;
    178 			};
    179 
    180 			RecordRefImpl * m_impl;
    181 		};
    182 
    183 
    184 		/*
    185 		* class ServiceRef
    186 		*
    187 		* This is a thin MC++ class facade on top of a DNSServiceRef
    188 		*/
    189 		public __gc class ServiceRef : public IDisposable
    190 		{
    191 		public:
    192 
    193 			ServiceRef(Object * callback);
    194 
    195 			~ServiceRef();
    196 
    197 			/*
    198 			* This does an underlying DNSServiceRefDeallocate().  After
    199 			* calling Dispose, the ServiceRef is no longer usable.
    200 			*/
    201 			void
    202 			Dispose();
    203 
    204 			/*
    205 			* Internal - Dispatch an EnumerateDomains callback
    206 			*/
    207 			void
    208 			EnumerateDomainsDispatch
    209 				(
    210 				ServiceFlags	flags,
    211 				int				interfaceIndex,
    212 				ErrorCode		errorCode,
    213 				String		*	replyDomain
    214 				);
    215 
    216 			/*
    217 			* Internal - Dispatch a Register callback
    218 			*/
    219 			void
    220 			RegisterDispatch
    221 				(
    222 				ServiceFlags	flags,
    223 				ErrorCode		errorCode,
    224  				String		*	name,
    225 				String		*	regtype,
    226 				String		*	domain
    227 				);
    228 
    229 			/*
    230 			* Internal - Dispatch a Browse callback
    231 			*/
    232 			void
    233 			BrowseDispatch
    234 				(
    235 				ServiceFlags	flags,
    236 				int				interfaceIndex,
    237 				ErrorCode		errorCode,
    238 				String		*	serviceName,
    239 				String		*	regtype,
    240 				String		*	replyDomain
    241 				);
    242 
    243 			/*
    244 			* Internal - Dispatch a Resolve callback
    245 			*/
    246 			void
    247 			ResolveDispatch
    248 				(
    249 				ServiceFlags	flags,
    250 				int				interfaceIndex,
    251 				ErrorCode		errorCode,
    252 				String		*	fullname,
    253 				String		*	hosttarget,
    254 				int				port,
    255 				Byte			txtRecord[]
    256 				);
    257 
    258 			/*
    259 			* Internal - Dispatch a RegisterRecord callback
    260 			*/
    261 			void
    262 			RegisterRecordDispatch
    263 				(
    264 				ServiceFlags	flags,
    265 				ErrorCode		errorCode,
    266 				RecordRef	*	record
    267 				);
    268 
    269 			/*
    270 			* Internal - Dispatch a QueryRecord callback
    271 			*/
    272 			void
    273 			QueryRecordDispatch
    274 				(
    275 				ServiceFlags	flags,
    276 				int				interfaceIndex,
    277 				ErrorCode		errorCode,
    278 				String		*	fullname,
    279 				int				rrtype,
    280 				int				rrclass,
    281 				Byte			rdata[],
    282 				int				ttl
    283 				);
    284 
    285 			/*
    286 			* Internal - A non managed class to wrap a DNSServiceRef
    287 			*/
    288 			__nogc class ServiceRefImpl
    289 			{
    290 			public:
    291 
    292 				ServiceRefImpl
    293 					(
    294 					ServiceRef * outer
    295 					);
    296 
    297 				~ServiceRefImpl();
    298 
    299 				/*
    300 				* Sets up events for threaded operation
    301 				*/
    302 				void
    303 				SetupEvents();
    304 
    305 				/*
    306 				* Main processing thread
    307 				*/
    308 				void
    309 				ProcessingThread();
    310 
    311 				/*
    312 				* Calls DNSServiceRefDeallocate()
    313 				*/
    314 				void
    315 				Dispose();
    316 
    317 				/*
    318 				* Called from dnssd.dll
    319 				*/
    320 				static void DNSSD_API
    321 				EnumerateDomainsCallback
    322 					(
    323 					DNSServiceRef			sdRef,
    324 					DNSServiceFlags			flags,
    325 					uint32_t				interfaceIndex,
    326 					DNSServiceErrorType		errorCode,
    327 					const char			*	replyDomain,
    328 					void				*	context
    329 					);
    330 
    331 				static void DNSSD_API
    332 				RegisterCallback
    333 					(
    334 					DNSServiceRef			ref,
    335 					DNSServiceFlags			flags,
    336 					DNSServiceErrorType		errorCode,
    337  					const char			*	name,
    338 					const char			*	regtype,
    339 					const char			*	domain,
    340 					void				*	context
    341 					);
    342 
    343 				static void DNSSD_API
    344 				BrowseCallback
    345 					(
    346 					DNSServiceRef			sdRef,
    347    					DNSServiceFlags			flags,
    348 					uint32_t				interfaceIndex,
    349 					DNSServiceErrorType		errorCode,
    350 					const char			*	serviceName,
    351 					const char			*	regtype,
    352 					const char			*	replyDomain,
    353 					void				*	context
    354 					);
    355 
    356 				static void DNSSD_API
    357 				ResolveCallback
    358 					(
    359 					DNSServiceRef			sdRef,
    360 					DNSServiceFlags			flags,
    361 					uint32_t				interfaceIndex,
    362 					DNSServiceErrorType		errorCode,
    363 					const char			*	fullname,
    364 					const char			*	hosttarget,
    365 					uint16_t				notAnIntPort,
    366 					uint16_t				txtLen,
    367 					const char			*	txtRecord,
    368 					void				*	context
    369 					);
    370 
    371 				static void DNSSD_API
    372 				RegisterRecordCallback
    373 					(
    374 					DNSServiceRef		sdRef,
    375 					DNSRecordRef		RecordRef,
    376 					DNSServiceFlags		flags,
    377 					DNSServiceErrorType	errorCode,
    378 					void			*	context
    379 					);
    380 
    381 				static void DNSSD_API
    382 				QueryRecordCallback
    383 					(
    384 					DNSServiceRef			DNSServiceRef,
    385 					DNSServiceFlags			flags,
    386 					uint32_t				interfaceIndex,
    387 					DNSServiceErrorType		errorCode,
    388 					const char			*	fullname,
    389 					uint16_t				rrtype,
    390 					uint16_t				rrclass,
    391 					uint16_t				rdlen,
    392 					const void			*	rdata,
    393 					uint32_t				ttl,
    394 					void				*	context
    395 					);
    396 
    397 				SOCKET				m_socket;
    398 				HANDLE				m_socketEvent;
    399 				HANDLE				m_stopEvent;
    400 				DWORD				m_threadId;
    401 				bool				m_disposed;
    402 				DNSServiceRef		m_ref;
    403 				gcroot<ServiceRef*> m_outer;
    404 			};
    405 
    406 			void
    407 			StartThread();
    408 
    409 			void
    410 			ProcessingThread();
    411 
    412 			bool				m_bDisposed;
    413 			Object			*	m_callback;
    414 			Thread			*	m_thread;
    415 			ServiceRefImpl	*	m_impl;
    416 		};
    417 
    418 		/*********************************************************************************************
    419 		*
    420 		*   TXT Record Construction Functions
    421 		*
    422 		*********************************************************************************************/
    423 
    424 		/*
    425 		* A typical calling sequence for TXT record construction is something like:
    426 		*
    427 		* DNSService.TextRecord tr = new DNSService.TextRecord(1024);
    428 		* tr.SetValue();
    429 		* tr.SetValue();
    430 		* tr.SetValue();
    431 		* ...
    432 		* DNSServiceRegister( ... tr.GetLength(), tr.GetBytes() ... );
    433 		*/
    434 
    435 
    436 		/* TextRecord
    437 		*
    438 		* Opaque internal data type.
    439 		* Note: Represents a DNS-SD TXT record.
    440 		*/
    441 
    442 
    443 		/* TextRecord::TextRecord()
    444 		*
    445 		* Creates a new empty TextRecord .
    446 		*
    447 		*/
    448 
    449 		public __gc class TextRecord
    450 		{
    451 		public:
    452 
    453 			TextRecord()
    454 			{
    455 				m_impl = new TextRecordImpl();
    456 				TXTRecordCreate(&m_impl->m_ref, 0, NULL);
    457 			}
    458 
    459 			~TextRecord()
    460 			{
    461 				TXTRecordDeallocate(&m_impl->m_ref);
    462 				delete m_impl;
    463 			}
    464 
    465 			__nogc class TextRecordImpl
    466 			{
    467 			public:
    468 
    469 				TXTRecordRef m_ref;
    470 			};
    471 
    472 			TextRecordImpl * m_impl;
    473 
    474 
    475 			/* SetValue()
    476 			*
    477 			* Adds a key (optionally with value) to a TextRecord. If the "key" already
    478 			* exists in the TextRecord, then the current value will be replaced with
    479 			* the new value.
    480 			* Keys may exist in four states with respect to a given TXT record:
    481 			*  - Absent (key does not appear at all)
    482 			*  - Present with no value ("key" appears alone)
    483 			*  - Present with empty value ("key=" appears in TXT record)
    484 			*  - Present with non-empty value ("key=value" appears in TXT record)
    485 			* For more details refer to "Data Syntax for DNS-SD TXT Records" in
    486 			* <http://files.dns-sd.org/draft-cheshire-dnsext-dns-sd.txt>
    487 			*
    488 			* key:             A null-terminated string which only contains printable ASCII
    489 			*                  values (0x20-0x7E), excluding '=' (0x3D). Keys should be
    490 			*                  14 characters or less (not counting the terminating null).
    491 			*
    492 			* value:           Any binary value. For values that represent
    493 			*                  textual data, UTF-8 is STRONGLY recommended.
    494 			*                  For values that represent textual data, valueSize
    495 			*                  should NOT include the terminating null (if any)
    496 			*                  at the end of the string.
    497 			*                  If NULL, then "key" will be added with no value.
    498 			*                  If non-NULL but valueSize is zero, then "key=" will be
    499 			*                  added with empty value.
    500 			*
    501 			* exceptions:      Throws kDNSServiceErr_Invalid if the "key" string contains
    502 			*                  illegal characters.
    503 			*                  Throws kDNSServiceErr_NoMemory if adding this key would
    504 			*                  exceed the available storage.
    505 			*/
    506 
    507 			void
    508 			SetValue
    509 				(
    510 				String	*	key,
    511 				Byte		value[]  /* may be NULL */
    512 				);
    513 
    514 
    515 			/* RemoveValue()
    516 			*
    517 			* Removes a key from a TextRecord.  The "key" must be an
    518 			* ASCII string which exists in the TextRecord.
    519 			*
    520 			* key:             A key name which exists in the TextRecord.
    521 			*
    522 			* exceptions:      Throws kDNSServiceErr_NoSuchKey if the "key" does not
    523 			*                  exist in the TextRecord.
    524 			*
    525 			*/
    526 
    527 			void
    528 			RemoveValue
    529 				(
    530 				String	*	key
    531 				);
    532 
    533 
    534 			/* GetLength()
    535 			*
    536 			* Allows you to determine the length of the raw bytes within a TextRecord.
    537 			*
    538 			* return value :     Returns the size of the raw bytes inside a TextRecord
    539 			*                  which you can pass directly to DNSServiceRegister() or
    540 			*                  to DNSServiceUpdateRecord().
    541 			*                  Returns 0 if the TextRecord is empty.
    542 			*
    543 			*/
    544 
    545 			int
    546 			GetLength
    547 				(
    548 				);
    549 
    550 
    551 			/* GetBytes()
    552 			*
    553 			* Allows you to retrieve a pointer to the raw bytes within a TextRecord.
    554 			*
    555 			* return value:    Returns a pointer to the bytes inside the TextRecord
    556 			*                  which you can pass directly to DNSServiceRegister() or
    557 			*                  to DNSServiceUpdateRecord().
    558 			*
    559 			*/
    560 
    561 			Byte
    562 			GetBytes
    563 				(
    564 				) __gc[];
    565 
    566 
    567 			/*********************************************************************************************
    568 			*
    569 			*   TXT Record Parsing Functions
    570 			*
    571 			*********************************************************************************************/
    572 
    573 			/*
    574 			* A typical calling sequence for TXT record parsing is something like:
    575 			*
    576 			* Receive TXT record data in DNSServiceResolve() callback
    577 			* if (TXTRecordContainsKey(txtLen, txtRecord, "key")) then do something
    578 			* val1ptr = DNSService.TextService.GetValue(txtRecord, "key1", &len1);
    579 			* val2ptr = DNSService.TextService.GetValue(txtRecord, "key2", &len2);
    580 			* ...
    581 			* return;
    582 			*
    583 			*/
    584 
    585 			/* ContainsKey()
    586 			*
    587 			* Allows you to determine if a given TXT Record contains a specified key.
    588 			*
    589 			* txtRecord:       Pointer to the received TXT Record bytes.
    590 			*
    591 			* key:             A null-terminated ASCII string containing the key name.
    592 			*
    593 			* return value:    Returns 1 if the TXT Record contains the specified key.
    594 			*                  Otherwise, it returns 0.
    595 			*
    596 			*/
    597 
    598 			static public bool
    599 			ContainsKey
    600 				(
    601 				Byte		txtRecord[],
    602 				String	*	key
    603 				);
    604 
    605 
    606 			/* GetValueBytes()
    607 			*
    608 			* Allows you to retrieve the value for a given key from a TXT Record.
    609 			*
    610 			* txtRecord:       Pointer to the received TXT Record bytes.
    611 			*
    612 			* key:             A null-terminated ASCII string containing the key name.
    613 			*
    614 			* return value:    Returns NULL if the key does not exist in this TXT record,
    615 			*                  or exists with no value (to differentiate between
    616 			*                  these two cases use ContainsKey()).
    617 			*                  Returns byte array
    618 			*                  if the key exists with empty or non-empty value.
    619 			*                  For empty value, length of byte array will be zero.
    620 			*                  For non-empty value, it will be the length of value data.
    621 			*/
    622 
    623 			static public Byte
    624 			GetValueBytes
    625 				(
    626 				Byte		txtRecord[],
    627 				String	*	key
    628 				) __gc[];
    629 
    630 
    631 			/* GetCount()
    632 			*
    633 			* Returns the number of keys stored in the TXT Record.  The count
    634 			* can be used with TXTRecordGetItemAtIndex() to iterate through the keys.
    635 			*
    636 			* txtRecord:       Pointer to the received TXT Record bytes.
    637 			*
    638 			* return value:    Returns the total number of keys in the TXT Record.
    639 			*
    640 			*/
    641 
    642 			static public int
    643 			GetCount
    644 				(
    645 				Byte	txtRecord[]
    646 				);
    647 
    648 
    649 			/* GetItemAtIndex()
    650 			*
    651 			* Allows you to retrieve a key name and value pointer, given an index into
    652 			* a TXT Record.  Legal index values range from zero to TXTRecordGetCount()-1.
    653 			* It's also possible to iterate through keys in a TXT record by simply
    654 			* calling TXTRecordGetItemAtIndex() repeatedly, beginning with index zero
    655 			* and increasing until TXTRecordGetItemAtIndex() returns kDNSServiceErr_Invalid.
    656 			*
    657 			* On return:
    658 			* For keys with no value, *value is set to NULL and *valueLen is zero.
    659 			* For keys with empty value, *value is non-NULL and *valueLen is zero.
    660 			* For keys with non-empty value, *value is non-NULL and *valueLen is non-zero.
    661 			*
    662 			* txtRecord:       Pointer to the received TXT Record bytes.
    663 			*
    664 			* index:           An index into the TXT Record.
    665 			*
    666 			* key:             A string buffer used to store the key name.
    667 			*                  On return, the buffer contains a string
    668 			*                  giving the key name. DNS-SD TXT keys are usually
    669 			*                  14 characters or less.
    670 			*
    671 			* return value:    Record bytes that holds the value data.
    672 			*
    673 			* exceptions:      Throws kDNSServiceErr_Invalid if index is greater than
    674 			*                  GetCount()-1.
    675 			*/
    676 
    677 			static public Byte
    678 			GetItemAtIndex
    679 				(
    680 				Byte				txtRecord[],
    681 				int					index,
    682 				[Out] String	**	key
    683 				) __gc[];
    684 		};
    685 
    686 
    687 		public __abstract __gc class DNSService
    688 		{
    689 		public:
    690 
    691 			/*********************************************************************************************
    692 			*
    693 			* Domain Enumeration
    694 			*
    695 			*********************************************************************************************/
    696 
    697 			/* DNSServiceEnumerateDomains()
    698 			*
    699 			* Asynchronously enumerate domains available for browsing and registration.
    700 			* Currently, the only domain returned is "local.", but other domains will be returned in future.
    701 			*
    702 			* The enumeration MUST be cancelled via DNSServiceRefDeallocate() when no more domains
    703 			* are to be found.
    704 			*
    705 			*
    706 			* EnumerateDomainsReply Delegate
    707 			*
    708 			* This Delegate is invoked upon a reply from an EnumerateDomains call.
    709 			*
    710 			* sdRef:           The DNSServiceRef initialized by DNSServiceEnumerateDomains().
    711 			*
    712 			* flags:           Possible values are:
    713 			*                  MoreComing
    714 			*                  Add
    715 			*                  Default
    716 			*
    717 			* interfaceIndex:  Specifies the interface on which the domain exists.  (The index for a given
    718 			*                  interface is determined via the if_nametoindex() family of calls.)
    719 			*
    720 			* errorCode:       Will be NoError (0) on success, otherwise indicates
    721 			*                  the failure that occurred (other parameters are undefined if errorCode is nonzero).
    722 			*
    723 			* replyDomain:     The name of the domain.
    724 			*
    725 			*/
    726 
    727 			__delegate void
    728 			EnumerateDomainsReply
    729 				(
    730 				ServiceRef	*	sdRef,
    731 				ServiceFlags	flags,
    732 				int				interfaceIndex,
    733 				ErrorCode		errorCode,
    734 				String		*	replyDomain
    735 				);
    736 
    737 			/* DNSServiceEnumerateDomains() Parameters:
    738 			*
    739 			*
    740 			* flags:           Possible values are:
    741 			*                  BrowseDomains to enumerate domains recommended for browsing.
    742 			*                  RegistrationDomains to enumerate domains recommended
    743 			*                  for registration.
    744 			*
    745 			* interfaceIndex:  If non-zero, specifies the interface on which to look for domains.
    746 			*                  (the index for a given interface is determined via the if_nametoindex()
    747 			*                  family of calls.)  Most applications will pass 0 to enumerate domains on
    748 			*                  all interfaces.
    749 			*
    750 			* callback:        The delegate to be called when a domain is found or the call asynchronously
    751 			*                  fails.
    752 			*
    753 			*
    754 			* return value:    Returns initialize ServiceRef on succeses (any subsequent, asynchronous
    755 			*                  errors are delivered to the delegate), otherwise throws an exception indicating
    756 			*                  the error that occurred (the callback is not invoked and the ServiceRef
    757 			*                  is not initialized.)
    758 			*/
    759 
    760 			static public ServiceRef*
    761 			EnumerateDomains
    762 				(
    763 				int							flags,
    764 				int							interfaceIndex,
    765 				EnumerateDomainsReply	*	callback
    766 				);
    767 
    768 			/*********************************************************************************************
    769 			*
    770 			*  Service Registration
    771 			*
    772 			*********************************************************************************************/
    773 
    774 			/* Register a service that is discovered via Browse() and Resolve() calls.
    775 			*
    776 			* RegisterReply() Callback Parameters:
    777 			*
    778 			* sdRef:           The ServiceRef initialized by Register().
    779 			*
    780 			* flags:           Currently unused, reserved for future use.
    781 			*
    782 			* errorCode:       Will be NoError on success, otherwise will
    783 			*                  indicate the failure that occurred (including name conflicts, if the
    784 			*                  NoAutoRename flag was passed to the
    785 			*                  callout.)  Other parameters are undefined if errorCode is nonzero.
    786 			*
    787 			* name:            The service name registered (if the application did not specify a name in
    788 			*                  DNSServiceRegister(), this indicates what name was automatically chosen).
    789 			*
    790 			* regtype:         The type of service registered, as it was passed to the callout.
    791 			*
    792 			* domain:          The domain on which the service was registered (if the application did not
    793 			*                  specify a domain in Register(), this indicates the default domain
    794 			*                  on which the service was registered).
    795 			*
    796 			*/
    797 
    798 			__delegate void
    799 			RegisterReply
    800 				(
    801 				ServiceRef	*	sdRef,
    802 				ServiceFlags	flags,
    803 				ErrorCode		errorCode,
    804 				String		*	name,
    805 				String		*	regtype,
    806 				String		*	domain
    807 				);
    808 
    809 			/* Register()  Parameters:
    810 			*
    811 			* flags:           Indicates the renaming behavior on name conflict (most applications
    812 			*                  will pass 0).  See flag definitions above for details.
    813 			*
    814 			* interfaceIndex:  If non-zero, specifies the interface on which to register the service
    815 			*                  (the index for a given interface is determined via the if_nametoindex()
    816 			*                  family of calls.)  Most applications will pass 0 to register on all
    817 			*                  available interfaces.  Pass -1 to register a service only on the local
    818 			*                  machine (service will not be visible to remote hosts.)
    819 			*
    820 			* name:            If non-NULL, specifies the service name to be registered.
    821 			*                  Most applications will not specify a name, in which case the
    822 			*                  computer name is used (this name is communicated to the client via
    823 			*                  the callback).
    824 			*
    825 			* regtype:         The service type followed by the protocol, separated by a dot
    826 			*                  (e.g. "_ftp._tcp").  The transport protocol must be "_tcp" or "_udp".
    827 			*                  New service types should be registered at htp://www.dns-sd.org/ServiceTypes.html.
    828 			*
    829 			* domain:          If non-NULL, specifies the domain on which to advertise the service.
    830 			*                  Most applications will not specify a domain, instead automatically
    831 			*                  registering in the default domain(s).
    832 			*
    833 			* host:            If non-NULL, specifies the SRV target host name.  Most applications
    834 			*                  will not specify a host, instead automatically using the machine's
    835 			*                  default host name(s).  Note that specifying a non-NULL host does NOT
    836 			*                  create an address record for that host - the application is responsible
    837 			*                  for ensuring that the appropriate address record exists, or creating it
    838 			*                  via DNSServiceRegisterRecord().
    839 			*
    840 			* port:            The port, in host byte order, on which the service accepts connections.
    841 			*                  Pass 0 for a "placeholder" service (i.e. a service that will not be discovered
    842 			*                  by browsing, but will cause a name conflict if another client tries to
    843 			*                  register that same name).  Most clients will not use placeholder services.
    844 			*
    845 			* txtRecord:       The txt record rdata.  May be NULL.  Note that a non-NULL txtRecord
    846 			*                  MUST be a properly formatted DNS TXT record, i.e. <length byte> <data>
    847 			*                  <length byte> <data> ...
    848 			*
    849 			* callback:        The delegate to be called when the registration completes or asynchronously
    850 			*                  fails.  The client MAY pass NULL for the callback -  The client will NOT be notified
    851 			*                  of the default values picked on its behalf, and the client will NOT be notified of any
    852 			*                  asynchronous errors (e.g. out of memory errors, etc.) that may prevent the registration
    853 			*                  of the service.  The client may NOT pass the NoAutoRename flag if the callback is NULL.
    854 			*                  The client may still deregister the service at any time via DNSServiceRefDeallocate().
    855 			*
    856 			* return value:    Returns initialize ServiceRef (any subsequent, asynchronous
    857 			*                  errors are delivered to the callback), otherwise throws an exception indicating
    858 			*                  the error that occurred (the callback is never invoked and the DNSServiceRef
    859 			*                  is not initialized.)
    860 			*
    861 			*/
    862 			static public ServiceRef*
    863 			Register
    864 				(
    865 				int					flags,
    866 				int					interfaceIndex,
    867 				String			*	name,
    868 				String			*	regtype,
    869 				String			*	domain,
    870 				String			*	host,
    871 				int					port,
    872 				Byte				txtRecord[],
    873 				RegisterReply	*	callback
    874 				);
    875 
    876 			/* AddRecord()
    877 			*
    878 			* Add a record to a registered service.  The name of the record will be the same as the
    879 			* registered service's name.
    880 			* The record can later be updated or deregistered by passing the RecordRef initialized
    881 			* by this function to UpdateRecord() or RemoveRecord().
    882 			*
    883 			*
    884 			* Parameters;
    885 			*
    886 			* sdRef:           A ServiceRef initialized by Register().
    887 			*
    888 			* RecordRef:       A pointer to an uninitialized RecordRef.  Upon succesfull completion of this
    889 			*                  call, this ref may be passed to UpdateRecord() or RemoveRecord().
    890 			*                  If the above ServiceRef is disposed, RecordRef is also
    891 			*                  invalidated and may not be used further.
    892 			*
    893 			* flags:           Currently ignored, reserved for future use.
    894 			*
    895 			* rrtype:          The type of the record (e.g. TXT, SRV, etc), as defined in nameser.h.
    896 			*
    897 			* rdata:           The raw rdata to be contained in the added resource record.
    898 			*
    899 			* ttl:             The time to live of the resource record, in seconds.
    900 			*
    901 			* return value:    Returns initialized RecordRef, otherwise throws
    902 			*                  an exception indicating the error that occurred (the RecordRef is not initialized).
    903 			*/
    904 
    905 			static public RecordRef*
    906 			AddRecord
    907 				(
    908 				ServiceRef	*	sref,
    909 				int				flags,
    910 				int				rrtype,
    911 				Byte			rdata[],
    912 				int				ttl
    913 				);
    914 
    915 			/* UpdateRecord
    916 			*
    917 			* Update a registered resource record.  The record must either be:
    918 			*   - The primary txt record of a service registered via Register()
    919 			*   - A record added to a registered service via AddRecord()
    920 			*   - An individual record registered by RegisterRecord()
    921 			*
    922 			*
    923 			* Parameters:
    924 			*
    925 			* sdRef:           A ServiceRef that was initialized by Register()
    926 			*                  or CreateConnection().
    927 			*
    928 			* RecordRef:       A RecordRef initialized by AddRecord, or NULL to update the
    929 			*                  service's primary txt record.
    930 			*
    931 			* flags:           Currently ignored, reserved for future use.
    932 			*
    933 			* rdata:           The new rdata to be contained in the updated resource record.
    934 			*
    935 			* ttl:             The time to live of the updated resource record, in seconds.
    936 			*
    937 			* return value:    No return value on success, otherwise throws an exception
    938 			*                  indicating the error that occurred.
    939 			*/
    940 			static public void
    941 			UpdateRecord
    942 				(
    943 				ServiceRef	*	sref,
    944 				RecordRef	*	record,
    945 				int				flags,
    946 				Byte			rdata[],
    947 				int				ttl
    948 				);
    949 
    950 			/* RemoveRecord
    951 			*
    952 			* Remove a record previously added to a service record set via AddRecord(), or deregister
    953 			* an record registered individually via RegisterRecord().
    954 			*
    955 			* Parameters:
    956 			*
    957 			* sdRef:           A ServiceRef initialized by Register() (if the
    958 			*                  record being removed was registered via AddRecord()) or by
    959 			*                  CreateConnection() (if the record being removed was registered via
    960 			*                  RegisterRecord()).
    961 			*
    962 			* recordRef:       A RecordRef initialized by a successful call to AddRecord()
    963 			*                  or RegisterRecord().
    964 			*
    965 			* flags:           Currently ignored, reserved for future use.
    966 			*
    967 			* return value:    Nothing on success, otherwise throws an
    968 			*                  exception indicating the error that occurred.
    969 			*/
    970 
    971 			static public void
    972 			RemoveRecord
    973 							(
    974 							ServiceRef	*	sref,
    975 							RecordRef	*	record,
    976 							int				flags
    977 							);
    978 
    979 			/*********************************************************************************************
    980 			*
    981 			*  Service Discovery
    982 			*
    983 			*********************************************************************************************/
    984 
    985 			/* Browse for instances of a service.
    986 			*
    987 			*
    988 			* BrowseReply() Parameters:
    989 			*
    990 			* sdRef:           The DNSServiceRef initialized by Browse().
    991 			*
    992 			* flags:           Possible values are MoreComing and Add.
    993 			*                  See flag definitions for details.
    994 			*
    995 			* interfaceIndex:  The interface on which the service is advertised.  This index should
    996 			*                  be passed to Resolve() when resolving the service.
    997 			*
    998 			* errorCode:       Will be NoError (0) on success, otherwise will
    999 			*                  indicate the failure that occurred.  Other parameters are undefined if
   1000 			*                  the errorCode is nonzero.
   1001 			*
   1002 			* serviceName:     The service name discovered.
   1003 			*
   1004 			* regtype:         The service type, as passed in to Browse().
   1005 			*
   1006 			* domain:          The domain on which the service was discovered (if the application did not
   1007 			*                  specify a domain in Browse(), this indicates the domain on which the
   1008 			*                  service was discovered.)
   1009 			*
   1010 			*/
   1011 
   1012 			__delegate void
   1013 			BrowseReply
   1014 				(
   1015 				ServiceRef	*	sdRef,
   1016 				ServiceFlags	flags,
   1017 				int				interfaceIndex,
   1018 				ErrorCode		errorCode,
   1019 				String		*	name,
   1020 				String		*	type,
   1021 				String		*	domain
   1022 				);
   1023 
   1024 			/* DNSServiceBrowse() Parameters:
   1025 			*
   1026 			* sdRef:           A pointer to an uninitialized ServiceRef.  Call ServiceRef.Dispose()
   1027 			*                  to terminate the browse.
   1028 			*
   1029 			* flags:           Currently ignored, reserved for future use.
   1030 			*
   1031 			* interfaceIndex:  If non-zero, specifies the interface on which to browse for services
   1032 			*                  (the index for a given interface is determined via the if_nametoindex()
   1033 			*                  family of calls.)  Most applications will pass 0 to browse on all available
   1034 			*                  interfaces.  Pass -1 to only browse for services provided on the local host.
   1035 			*
   1036 			* regtype:         The service type being browsed for followed by the protocol, separated by a
   1037 			*                  dot (e.g. "_ftp._tcp").  The transport protocol must be "_tcp" or "_udp".
   1038 			*
   1039 			* domain:          If non-NULL, specifies the domain on which to browse for services.
   1040 			*                  Most applications will not specify a domain, instead browsing on the
   1041 			*                  default domain(s).
   1042 			*
   1043 			* callback:        The delegate to be called when an instance of the service being browsed for
   1044 			*                  is found, or if the call asynchronously fails.
   1045 			*
   1046 			* return value:    Returns initialized ServiceRef on succeses (any subsequent, asynchronous
   1047 			*                  errors are delivered to the callback), otherwise throws an exception indicating
   1048 			*                  the error that occurred (the callback is not invoked and the ServiceRef
   1049 			*                  is not initialized.)
   1050 			*/
   1051 
   1052 			static public ServiceRef*
   1053 			Browse
   1054 				(
   1055 				int				flags,
   1056 				int				interfaceIndex,
   1057 				String		*	regtype,
   1058 				String		*	domain,
   1059 				BrowseReply	*	callback
   1060 				);
   1061 
   1062 			/* ResolveReply() Parameters:
   1063 			*
   1064 			* Resolve a service name discovered via Browse() to a target host name, port number, and
   1065 			* txt record.
   1066 			*
   1067 			* Note: Applications should NOT use Resolve() solely for txt record monitoring - use
   1068 			* QueryRecord() instead, as it is more efficient for this task.
   1069 			*
   1070 			* Note: When the desired results have been returned, the client MUST terminate the resolve by calling
   1071 			* ServiceRef.Dispose().
   1072 			*
   1073 			* Note: Resolve() behaves correctly for typical services that have a single SRV record and
   1074 			* a single TXT record (the TXT record may be empty.)  To resolve non-standard services with multiple
   1075 			* SRV or TXT records, QueryRecord() should be used.
   1076 			*
   1077 			* ResolveReply Callback Parameters:
   1078 			*
   1079 			* sdRef:           The DNSServiceRef initialized by Resolve().
   1080 			*
   1081 			* flags:           Currently unused, reserved for future use.
   1082 			*
   1083 			* interfaceIndex:  The interface on which the service was resolved.
   1084 			*
   1085 			* errorCode:       Will be NoError (0) on success, otherwise will
   1086 			*                  indicate the failure that occurred.  Other parameters are undefined if
   1087 			*                  the errorCode is nonzero.
   1088 			*
   1089 			* fullname:        The full service domain name, in the form <servicename>.<protocol>.<domain>.
   1090 			*                  (Any literal dots (".") are escaped with a backslash ("\."), and literal
   1091 			*                  backslashes are escaped with a second backslash ("\\"), e.g. a web server
   1092 			*                  named "Dr. Pepper" would have the fullname  "Dr\.\032Pepper._http._tcp.local.").
   1093 			*                  This is the appropriate format to pass to standard system DNS APIs such as
   1094 			*                  res_query(), or to the special-purpose functions included in this API that
   1095 			*                  take fullname parameters.
   1096 			*
   1097 			* hosttarget:      The target hostname of the machine providing the service.  This name can
   1098 			*                  be passed to functions like gethostbyname() to identify the host's IP address.
   1099 			*
   1100 			* port:            The port, in host byte order, on which connections are accepted for this service.
   1101 			*
   1102 			* txtRecord:       The service's primary txt record, in standard txt record format.
   1103 			*
   1104 			*/
   1105 
   1106 			__delegate void
   1107 			ResolveReply
   1108 				(
   1109 				ServiceRef	*	sdRef,
   1110 				ServiceFlags	flags,
   1111 				int				interfaceIndex,
   1112 				ErrorCode		errorCode,
   1113 				String		*	fullName,
   1114 				String		*	hostName,
   1115 				int				port,
   1116 				Byte			txtRecord[]
   1117 				);
   1118 
   1119 			/* Resolve() Parameters
   1120 			*
   1121 			* flags:           Currently ignored, reserved for future use.
   1122 			*
   1123 			* interfaceIndex:  The interface on which to resolve the service.  The client should
   1124 			*                  pass the interface on which the servicename was discovered, i.e.
   1125 			*                  the interfaceIndex passed to the DNSServiceBrowseReply callback,
   1126 			*                  or 0 to resolve the named service on all available interfaces.
   1127 			*
   1128 			* name:            The servicename to be resolved.
   1129 			*
   1130 			* regtype:         The service type being resolved followed by the protocol, separated by a
   1131 			*                  dot (e.g. "_ftp._tcp").  The transport protocol must be "_tcp" or "_udp".
   1132 			*
   1133 			* domain:          The domain on which the service is registered, i.e. the domain passed
   1134 			*                  to the DNSServiceBrowseReply callback.
   1135 			*
   1136 			* callback:        The delegate to be called when a result is found, or if the call
   1137 			*                  asynchronously fails.
   1138 			*
   1139 			*
   1140 			* return value:    Returns initialized ServiceRef on succeses (any subsequent, asynchronous
   1141 			*                  errors are delivered to the callback), otherwise throws an exception indicating
   1142 			*                  the error that occurred (the callback is never invoked and the DNSServiceRef
   1143 			*                  is not initialized.)
   1144 			*/
   1145 
   1146 			static public ServiceRef*
   1147 			Resolve
   1148 				(
   1149 				int					flags,
   1150 				int					interfaceIndex,
   1151 				String			*	name,
   1152 				String			*	regtype,
   1153 				String			*	domain,
   1154 				ResolveReply	*	callback
   1155 				);
   1156 
   1157 			/*********************************************************************************************
   1158 			*
   1159 			*  Special Purpose Calls (most applications will not use these)
   1160 			*
   1161 			*********************************************************************************************/
   1162 
   1163 			/* CreateConnection/RegisterRecord
   1164 			*
   1165 			* Register an individual resource record on a connected ServiceRef.
   1166 			*
   1167 			* Note that name conflicts occurring for records registered via this call must be handled
   1168 			* by the client in the callback.
   1169 			*
   1170 			*
   1171 			* RecordReply() parameters:
   1172 			*
   1173 			* sdRef:           The connected ServiceRef initialized by
   1174 			*                  CreateConnection().
   1175 			*
   1176 			* RecordRef:       The RecordRef initialized by RegisterRecord().  If the above
   1177 			*                  ServiceRef.Dispose is called, this RecordRef is
   1178 			*                  invalidated, and may not be used further.
   1179 			*
   1180 			* flags:           Currently unused, reserved for future use.
   1181 			*
   1182 			* errorCode:       Will be NoError on success, otherwise will
   1183 			*                  indicate the failure that occurred (including name conflicts.)
   1184 			*                  Other parameters are undefined if errorCode is nonzero.
   1185 			*
   1186 			*/
   1187 
   1188 			__delegate void
   1189 			RegisterRecordReply
   1190 				(
   1191 				ServiceRef	*	sdRef,
   1192 				ServiceFlags	flags,
   1193 				ErrorCode		errorCode,
   1194 				RecordRef	*	record
   1195 				);
   1196 
   1197 			/* CreateConnection()
   1198 			*
   1199 			* Create a connection to the daemon allowing efficient registration of
   1200 			* multiple individual records.
   1201 			*
   1202 			*
   1203 			* Parameters:
   1204 			*
   1205 			* callback:        The delegate to be called when a result is found, or if the call
   1206 			*                  asynchronously fails (e.g. because of a name conflict.)
   1207 			*
   1208 			* return value:    Returns initialize ServiceRef on success, otherwise throws
   1209 			*                  an exception indicating the specific failure that occurred (in which
   1210 			*                  case the ServiceRef is not initialized).
   1211 			*/
   1212 
   1213 			static public ServiceRef*
   1214 			CreateConnection
   1215 				(
   1216 				RegisterRecordReply * callback
   1217 				);
   1218 
   1219 
   1220 			/* RegisterRecord() Parameters:
   1221 			*
   1222 			* sdRef:           A ServiceRef initialized by CreateConnection().
   1223 			*
   1224 			* RecordRef:       A pointer to an uninitialized RecordRef.  Upon succesfull completion of this
   1225 			*                  call, this ref may be passed to UpdateRecord() or RemoveRecord().
   1226 			*                  (To deregister ALL records registered on a single connected ServiceRef
   1227 			*                  and deallocate each of their corresponding RecordRefs, call
   1228 			*                  ServiceRef.Dispose()).
   1229 			*
   1230 			* flags:           Possible values are Shared or Unique
   1231 			*                  (see flag type definitions for details).
   1232 			*
   1233 			* interfaceIndex:  If non-zero, specifies the interface on which to register the record
   1234 			*                  (the index for a given interface is determined via the if_nametoindex()
   1235 			*                  family of calls.)  Passing 0 causes the record to be registered on all interfaces.
   1236 			*                  Passing -1 causes the record to only be visible on the local host.
   1237 			*
   1238 			* fullname:        The full domain name of the resource record.
   1239 			*
   1240 			* rrtype:          The numerical type of the resource record (e.g. PTR, SRV, etc), as defined
   1241 			*                  in nameser.h.
   1242 			*
   1243 			* rrclass:         The class of the resource record, as defined in nameser.h (usually 1 for the
   1244 			*                  Internet class).
   1245 			*
   1246 			* rdata:           A pointer to the raw rdata, as it is to appear in the DNS record.
   1247 			*
   1248 			* ttl:             The time to live of the resource record, in seconds.
   1249 			*
   1250 			*
   1251 			* return value:    Returns initialize RecordRef on succeses (any subsequent, asynchronous
   1252 			*                  errors are delivered to the callback), otherwise throws an exception indicating
   1253 			*                  the error that occurred (the callback is never invoked and the RecordRef is
   1254 			*                  not initialized.)
   1255 			*/
   1256 			static public RecordRef*
   1257 			RegisterRecord
   1258 				(
   1259 				ServiceRef			*	sdRef,
   1260 				ServiceFlags			flags,
   1261 				int						interfaceIndex,
   1262 				String				*	fullname,
   1263 				int						rrtype,
   1264 				int						rrclass,
   1265 				Byte					rdata[],
   1266 				int						ttl
   1267 				);
   1268 
   1269 
   1270 			/* DNSServiceQueryRecord
   1271 			*
   1272 			* Query for an arbitrary DNS record.
   1273 			*
   1274 			*
   1275 			* QueryRecordReply() Delegate Parameters:
   1276 			*
   1277 			* sdRef:           The ServiceRef initialized by QueryRecord().
   1278 			*
   1279 			* flags:           Possible values are MoreComing and
   1280 			*                  Add.  The Add flag is NOT set for PTR records
   1281 			*                  with a ttl of 0, i.e. "Remove" events.
   1282 			*
   1283 			* interfaceIndex:  The interface on which the query was resolved (the index for a given
   1284 			*                  interface is determined via the if_nametoindex() family of calls).
   1285 			*
   1286 			* errorCode:       Will be kDNSServiceErr_NoError on success, otherwise will
   1287 			*                  indicate the failure that occurred.  Other parameters are undefined if
   1288 			*                  errorCode is nonzero.
   1289 			*
   1290 			* fullname:        The resource record's full domain name.
   1291 			*
   1292 			* rrtype:          The resource record's type (e.g. PTR, SRV, etc) as defined in nameser.h.
   1293 			*
   1294 			* rrclass:         The class of the resource record, as defined in nameser.h (usually 1).
   1295 			*
   1296 			* rdata:           The raw rdata of the resource record.
   1297 			*
   1298 			* ttl:             The resource record's time to live, in seconds.
   1299 			*
   1300 			*/
   1301 
   1302 			__delegate void
   1303 			QueryRecordReply
   1304 				(
   1305 				ServiceRef	*	sdRef,
   1306 				ServiceFlags	flags,
   1307 				int				interfaceIndex,
   1308 				ErrorCode		errorCode,
   1309 				String		*	fullName,
   1310 				int				rrtype,
   1311 				int				rrclass,
   1312 				Byte			rdata[],
   1313 				int				ttl
   1314 				);
   1315 
   1316 			/* QueryRecord() Parameters:
   1317 			*
   1318 			* flags:           Pass LongLivedQuery to create a "long-lived" unicast
   1319 			*                  query in a non-local domain.  Without setting this flag, unicast queries
   1320 			*                  will be one-shot - that is, only answers available at the time of the call
   1321 			*                  will be returned.  By setting this flag, answers (including Add and Remove
   1322 			*                  events) that become available after the initial call is made will generate
   1323 			*                  callbacks.  This flag has no effect on link-local multicast queries.
   1324 			*
   1325 			* interfaceIndex:  If non-zero, specifies the interface on which to issue the query
   1326 			*                  (the index for a given interface is determined via the if_nametoindex()
   1327 			*                  family of calls.)  Passing 0 causes the name to be queried for on all
   1328 			*                  interfaces.  Passing -1 causes the name to be queried for only on the
   1329 			*                  local host.
   1330 			*
   1331 			* fullname:        The full domain name of the resource record to be queried for.
   1332 			*
   1333 			* rrtype:          The numerical type of the resource record to be queried for (e.g. PTR, SRV, etc)
   1334 			*                  as defined in nameser.h.
   1335 			*
   1336 			* rrclass:         The class of the resource record, as defined in nameser.h
   1337 			*                  (usually 1 for the Internet class).
   1338 			*
   1339 			* callback:        The delegate to be called when a result is found, or if the call
   1340 			*                  asynchronously fails.
   1341 			*
   1342 			*
   1343 			* return value:    Returns initialized ServiceRef on succeses (any subsequent, asynchronous
   1344 			*                  errors are delivered to the callback), otherwise throws an exception indicating
   1345 			*                  the error that occurred (the callback is never invoked and the ServiceRef
   1346 			*                  is not initialized.)
   1347 			*/
   1348 
   1349 			static public ServiceRef*
   1350 			QueryRecord
   1351 				(
   1352 				ServiceFlags			flags,
   1353 				int						interfaceIndex,
   1354 				String				*	fullname,
   1355 				int						rrtype,
   1356 				int						rrclass,
   1357 				QueryRecordReply	*	callback
   1358 				);
   1359 
   1360 			/* ReconfirmRecord
   1361 			*
   1362 			* Instruct the daemon to verify the validity of a resource record that appears to
   1363 			* be out of date (e.g. because tcp connection to a service's target failed.)
   1364 			* Causes the record to be flushed from the daemon's cache (as well as all other
   1365 			* daemons' caches on the network) if the record is determined to be invalid.
   1366 			*
   1367 			* Parameters:
   1368 			*
   1369 			* flags:           Currently unused, reserved for future use.
   1370 			*
   1371 			* fullname:        The resource record's full domain name.
   1372 			*
   1373 			* rrtype:          The resource record's type (e.g. PTR, SRV, etc) as defined in nameser.h.
   1374 			*
   1375 			* rrclass:         The class of the resource record, as defined in nameser.h (usually 1).
   1376 			*
   1377 			* rdata:           The raw rdata of the resource record.
   1378 			*
   1379 			*/
   1380 			static public void
   1381 			ReconfirmRecord
   1382 				(
   1383 				ServiceFlags	flags,
   1384 				int				interfaceIndex,
   1385 				String		*	fullname,
   1386 				int				rrtype,
   1387 				int				rrclass,
   1388 				Byte			rdata[]
   1389 				);
   1390 		};
   1391 	}
   1392 }
   1393