diff options
Diffstat (limited to 'mDNSResponder/mDNSWindows/DLL.NET/dnssd_NET.h')
-rwxr-xr-x | mDNSResponder/mDNSWindows/DLL.NET/dnssd_NET.h | 1392 |
1 files changed, 1392 insertions, 0 deletions
diff --git a/mDNSResponder/mDNSWindows/DLL.NET/dnssd_NET.h b/mDNSResponder/mDNSWindows/DLL.NET/dnssd_NET.h new file mode 100755 index 00000000..3e0196d2 --- /dev/null +++ b/mDNSResponder/mDNSWindows/DLL.NET/dnssd_NET.h @@ -0,0 +1,1392 @@ +/* -*- Mode: C; tab-width: 4 -*- + * + * Copyright (c) 2003-2004 Apple Computer, Inc. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + + * + * NOTE: + * + * These .Net APIs are a work in progress, currently being discussed and refined. + * If you plan to build an application based on these APIs, you may wish to + * statically link this code into your application, or otherwise distribute + * the DLL so that it installs into the same folder as your application + * (not into any common system area where it might interfere with other + * applications using a future completed version of these APIs). + * If you plan to do this, please be sure to inform us by sending email + * to bonjour@apple.com to let us know. + * You may want to discuss what you're doing on the Bonjour mailing + * list to see if others in similar positions have any suggestions for you: + * + * <http://lists.apple.com/bonjour-dev/> + * + */ + +#pragma once + +#include <dns_sd.h> +#include <vcclr.h> +#include <memory> +#include <winsock2.h> + +using namespace System; +using namespace System::Net; +using namespace System::Runtime::InteropServices; +using namespace System::Threading; +using namespace System::Collections; + + +namespace Apple +{ + namespace DNSSD + { + public __gc class ServiceRef; + + public __value enum ServiceFlags : int + { + MoreComing = 1, + /* MoreComing indicates to a callback that at least one more result is + * queued and will be delivered following immediately after this one. + * Applications should not update their UI to display browse + * results when the MoreComing flag is set, because this would + * result in a great deal of ugly flickering on the screen. + * Applications should instead wait until until MoreComing is not set, + * and then update their UI. + * When MoreComing is not set, that doesn't mean there will be no more + * answers EVER, just that there are no more answers immediately + * available right now at this instant. If more answers become available + * in the future they will be delivered as usual. + */ + + Add = 2, + Default = 4, + /* Flags for domain enumeration and browse/query reply callbacks. + * "Default" applies only to enumeration and is only valid in + * conjuction with "Add". An enumeration callback with the "Add" + * flag NOT set indicates a "Remove", i.e. the domain is no longer + * valid. + */ + + NoAutoRename = 8, + /* Flag for specifying renaming behavior on name conflict when registering + * non-shared records. By default, name conflicts are automatically handled + * by renaming the service. NoAutoRename overrides this behavior - with this + * flag set, name conflicts will result in a callback. The NoAutorename flag + * is only valid if a name is explicitly specified when registering a service + * (i.e. the default name is not used.) + */ + + Shared = 16, + Unique = 32, + /* Flag for registering individual records on a connected + * DNSServiceRef. Shared indicates that there may be multiple records + * with this name on the network (e.g. PTR records). Unique indicates that + the + * record's name is to be unique on the network (e.g. SRV records). + */ + + BrowseDomains = 64, + RegistrationDomains = 128, + /* Flags for specifying domain enumeration type in DNSServiceEnumerateDomain + s. + * BrowseDomains enumerates domains recommended for browsing, RegistrationDo + mains + * enumerates domains recommended for registration. + */ + }; + + + public __value enum ErrorCode : int + { + NoError = 0, + Unknown = -65537, + NoSuchName = -65538, + NoMemory = -65539, + BadParam = -65540, + BadReference = -65541, + BadState = -65542, + BadFlags = -65543, + Unsupported = -65544, + AlreadyRegistered = -65547, + NameConflict = -65548, + Invalid = -65549, + Incompatible = -65551, + BadinterfaceIndex = -65552 + + /* + * mDNS Error codes are in the range + * FFFE FF00 (-65792) to FFFE FFFF (-65537) + */ + }; + + public __gc class DNSServiceException + : + public Exception + { + public: + + DNSServiceException + ( + int err + ); + + DNSServiceException + ( + String * message, + System::Exception * innerException + ); + + int err; + }; + + + /* + * class RecordRef + * + * This is a thin MC++ class facade on top of a DNSRecordRef + */ + public __gc class RecordRef + { + public: + + RecordRef() + { + m_impl = new RecordRefImpl; + m_impl->m_ref = NULL; + } + + ~RecordRef() + { + delete m_impl; + } + + __nogc class RecordRefImpl + { + public: + + DNSRecordRef m_ref; + }; + + RecordRefImpl * m_impl; + }; + + + /* + * class ServiceRef + * + * This is a thin MC++ class facade on top of a DNSServiceRef + */ + public __gc class ServiceRef : public IDisposable + { + public: + + ServiceRef(Object * callback); + + ~ServiceRef(); + + /* + * This does an underlying DNSServiceRefDeallocate(). After + * calling Dispose, the ServiceRef is no longer usable. + */ + void + Dispose(); + + /* + * Internal - Dispatch an EnumerateDomains callback + */ + void + EnumerateDomainsDispatch + ( + ServiceFlags flags, + int interfaceIndex, + ErrorCode errorCode, + String * replyDomain + ); + + /* + * Internal - Dispatch a Register callback + */ + void + RegisterDispatch + ( + ServiceFlags flags, + ErrorCode errorCode, + String * name, + String * regtype, + String * domain + ); + + /* + * Internal - Dispatch a Browse callback + */ + void + BrowseDispatch + ( + ServiceFlags flags, + int interfaceIndex, + ErrorCode errorCode, + String * serviceName, + String * regtype, + String * replyDomain + ); + + /* + * Internal - Dispatch a Resolve callback + */ + void + ResolveDispatch + ( + ServiceFlags flags, + int interfaceIndex, + ErrorCode errorCode, + String * fullname, + String * hosttarget, + int port, + Byte txtRecord[] + ); + + /* + * Internal - Dispatch a RegisterRecord callback + */ + void + RegisterRecordDispatch + ( + ServiceFlags flags, + ErrorCode errorCode, + RecordRef * record + ); + + /* + * Internal - Dispatch a QueryRecord callback + */ + void + QueryRecordDispatch + ( + ServiceFlags flags, + int interfaceIndex, + ErrorCode errorCode, + String * fullname, + int rrtype, + int rrclass, + Byte rdata[], + int ttl + ); + + /* + * Internal - A non managed class to wrap a DNSServiceRef + */ + __nogc class ServiceRefImpl + { + public: + + ServiceRefImpl + ( + ServiceRef * outer + ); + + ~ServiceRefImpl(); + + /* + * Sets up events for threaded operation + */ + void + SetupEvents(); + + /* + * Main processing thread + */ + void + ProcessingThread(); + + /* + * Calls DNSServiceRefDeallocate() + */ + void + Dispose(); + + /* + * Called from dnssd.dll + */ + static void DNSSD_API + EnumerateDomainsCallback + ( + DNSServiceRef sdRef, + DNSServiceFlags flags, + uint32_t interfaceIndex, + DNSServiceErrorType errorCode, + const char * replyDomain, + void * context + ); + + static void DNSSD_API + RegisterCallback + ( + DNSServiceRef ref, + DNSServiceFlags flags, + DNSServiceErrorType errorCode, + const char * name, + const char * regtype, + const char * domain, + void * context + ); + + static void DNSSD_API + BrowseCallback + ( + DNSServiceRef sdRef, + DNSServiceFlags flags, + uint32_t interfaceIndex, + DNSServiceErrorType errorCode, + const char * serviceName, + const char * regtype, + const char * replyDomain, + void * context + ); + + static 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 + ); + + static void DNSSD_API + RegisterRecordCallback + ( + DNSServiceRef sdRef, + DNSRecordRef RecordRef, + DNSServiceFlags flags, + DNSServiceErrorType errorCode, + void * context + ); + + static 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 + ); + + SOCKET m_socket; + HANDLE m_socketEvent; + HANDLE m_stopEvent; + DWORD m_threadId; + bool m_disposed; + DNSServiceRef m_ref; + gcroot<ServiceRef*> m_outer; + }; + + void + StartThread(); + + void + ProcessingThread(); + + bool m_bDisposed; + Object * m_callback; + Thread * m_thread; + ServiceRefImpl * m_impl; + }; + + /********************************************************************************************* + * + * TXT Record Construction Functions + * + *********************************************************************************************/ + + /* + * A typical calling sequence for TXT record construction is something like: + * + * DNSService.TextRecord tr = new DNSService.TextRecord(1024); + * tr.SetValue(); + * tr.SetValue(); + * tr.SetValue(); + * ... + * DNSServiceRegister( ... tr.GetLength(), tr.GetBytes() ... ); + */ + + + /* TextRecord + * + * Opaque internal data type. + * Note: Represents a DNS-SD TXT record. + */ + + + /* TextRecord::TextRecord() + * + * Creates a new empty TextRecord . + * + */ + + public __gc class TextRecord + { + public: + + TextRecord() + { + m_impl = new TextRecordImpl(); + TXTRecordCreate(&m_impl->m_ref, 0, NULL); + } + + ~TextRecord() + { + TXTRecordDeallocate(&m_impl->m_ref); + delete m_impl; + } + + __nogc class TextRecordImpl + { + public: + + TXTRecordRef m_ref; + }; + + TextRecordImpl * m_impl; + + + /* SetValue() + * + * Adds a key (optionally with value) to a TextRecord. If the "key" already + * exists in the TextRecord, then the current value will be replaced with + * the new value. + * Keys may exist in four states with respect to a given TXT record: + * - Absent (key does not appear at all) + * - Present with no value ("key" appears alone) + * - Present with empty value ("key=" appears in TXT record) + * - Present with non-empty value ("key=value" appears in TXT record) + * For more details refer to "Data Syntax for DNS-SD TXT Records" in + * <http://files.dns-sd.org/draft-cheshire-dnsext-dns-sd.txt> + * + * key: A null-terminated string which only contains printable ASCII + * values (0x20-0x7E), excluding '=' (0x3D). Keys should be + * 14 characters or less (not counting the terminating null). + * + * value: Any binary value. For values that represent + * textual data, UTF-8 is STRONGLY recommended. + * For values that represent textual data, valueSize + * should NOT include the terminating null (if any) + * at the end of the string. + * If NULL, then "key" will be added with no value. + * If non-NULL but valueSize is zero, then "key=" will be + * added with empty value. + * + * exceptions: Throws kDNSServiceErr_Invalid if the "key" string contains + * illegal characters. + * Throws kDNSServiceErr_NoMemory if adding this key would + * exceed the available storage. + */ + + void + SetValue + ( + String * key, + Byte value[] /* may be NULL */ + ); + + + /* RemoveValue() + * + * Removes a key from a TextRecord. The "key" must be an + * ASCII string which exists in the TextRecord. + * + * key: A key name which exists in the TextRecord. + * + * exceptions: Throws kDNSServiceErr_NoSuchKey if the "key" does not + * exist in the TextRecord. + * + */ + + void + RemoveValue + ( + String * key + ); + + + /* GetLength() + * + * Allows you to determine the length of the raw bytes within a TextRecord. + * + * return value : Returns the size of the raw bytes inside a TextRecord + * which you can pass directly to DNSServiceRegister() or + * to DNSServiceUpdateRecord(). + * Returns 0 if the TextRecord is empty. + * + */ + + int + GetLength + ( + ); + + + /* GetBytes() + * + * Allows you to retrieve a pointer to the raw bytes within a TextRecord. + * + * return value: Returns a pointer to the bytes inside the TextRecord + * which you can pass directly to DNSServiceRegister() or + * to DNSServiceUpdateRecord(). + * + */ + + Byte + GetBytes + ( + ) __gc[]; + + + /********************************************************************************************* + * + * TXT Record Parsing Functions + * + *********************************************************************************************/ + + /* + * A typical calling sequence for TXT record parsing is something like: + * + * Receive TXT record data in DNSServiceResolve() callback + * if (TXTRecordContainsKey(txtLen, txtRecord, "key")) then do something + * val1ptr = DNSService.TextService.GetValue(txtRecord, "key1", &len1); + * val2ptr = DNSService.TextService.GetValue(txtRecord, "key2", &len2); + * ... + * return; + * + */ + + /* ContainsKey() + * + * Allows you to determine if a given TXT Record contains a specified key. + * + * txtRecord: Pointer to the received TXT Record bytes. + * + * key: A null-terminated ASCII string containing the key name. + * + * return value: Returns 1 if the TXT Record contains the specified key. + * Otherwise, it returns 0. + * + */ + + static public bool + ContainsKey + ( + Byte txtRecord[], + String * key + ); + + + /* GetValueBytes() + * + * Allows you to retrieve the value for a given key from a TXT Record. + * + * txtRecord: Pointer to the received TXT Record bytes. + * + * key: A null-terminated ASCII string containing the key name. + * + * return value: Returns NULL if the key does not exist in this TXT record, + * or exists with no value (to differentiate between + * these two cases use ContainsKey()). + * Returns byte array + * if the key exists with empty or non-empty value. + * For empty value, length of byte array will be zero. + * For non-empty value, it will be the length of value data. + */ + + static public Byte + GetValueBytes + ( + Byte txtRecord[], + String * key + ) __gc[]; + + + /* GetCount() + * + * Returns the number of keys stored in the TXT Record. The count + * can be used with TXTRecordGetItemAtIndex() to iterate through the keys. + * + * txtRecord: Pointer to the received TXT Record bytes. + * + * return value: Returns the total number of keys in the TXT Record. + * + */ + + static public int + GetCount + ( + Byte txtRecord[] + ); + + + /* GetItemAtIndex() + * + * Allows you to retrieve a key name and value pointer, given an index into + * a TXT Record. Legal index values range from zero to TXTRecordGetCount()-1. + * It's also possible to iterate through keys in a TXT record by simply + * calling TXTRecordGetItemAtIndex() repeatedly, beginning with index zero + * and increasing until TXTRecordGetItemAtIndex() returns kDNSServiceErr_Invalid. + * + * On return: + * For keys with no value, *value is set to NULL and *valueLen is zero. + * For keys with empty value, *value is non-NULL and *valueLen is zero. + * For keys with non-empty value, *value is non-NULL and *valueLen is non-zero. + * + * txtRecord: Pointer to the received TXT Record bytes. + * + * index: An index into the TXT Record. + * + * key: A string buffer used to store the key name. + * On return, the buffer contains a string + * giving the key name. DNS-SD TXT keys are usually + * 14 characters or less. + * + * return value: Record bytes that holds the value data. + * + * exceptions: Throws kDNSServiceErr_Invalid if index is greater than + * GetCount()-1. + */ + + static public Byte + GetItemAtIndex + ( + Byte txtRecord[], + int index, + [Out] String ** key + ) __gc[]; + }; + + + public __abstract __gc class DNSService + { + public: + + /********************************************************************************************* + * + * Domain Enumeration + * + *********************************************************************************************/ + + /* DNSServiceEnumerateDomains() + * + * Asynchronously enumerate domains available for browsing and registration. + * Currently, the only domain returned is "local.", but other domains will be returned in future. + * + * The enumeration MUST be cancelled via DNSServiceRefDeallocate() when no more domains + * are to be found. + * + * + * EnumerateDomainsReply Delegate + * + * This Delegate is invoked upon a reply from an EnumerateDomains call. + * + * sdRef: The DNSServiceRef initialized by DNSServiceEnumerateDomains(). + * + * flags: Possible values are: + * MoreComing + * Add + * Default + * + * interfaceIndex: Specifies the interface on which the domain exists. (The index for a given + * interface is determined via the if_nametoindex() family of calls.) + * + * errorCode: Will be NoError (0) on success, otherwise indicates + * the failure that occurred (other parameters are undefined if errorCode is nonzero). + * + * replyDomain: The name of the domain. + * + */ + + __delegate void + EnumerateDomainsReply + ( + ServiceRef * sdRef, + ServiceFlags flags, + int interfaceIndex, + ErrorCode errorCode, + String * replyDomain + ); + + /* DNSServiceEnumerateDomains() Parameters: + * + * + * flags: Possible values are: + * BrowseDomains to enumerate domains recommended for browsing. + * RegistrationDomains to enumerate domains recommended + * for registration. + * + * interfaceIndex: If non-zero, specifies the interface on which to look for domains. + * (the index for a given interface is determined via the if_nametoindex() + * family of calls.) Most applications will pass 0 to enumerate domains on + * all interfaces. + * + * callback: The delegate to be called when a domain is found or the call asynchronously + * fails. + * + * + * return value: Returns initialize ServiceRef on succeses (any subsequent, asynchronous + * errors are delivered to the delegate), otherwise throws an exception indicating + * the error that occurred (the callback is not invoked and the ServiceRef + * is not initialized.) + */ + + static public ServiceRef* + EnumerateDomains + ( + int flags, + int interfaceIndex, + EnumerateDomainsReply * callback + ); + + /********************************************************************************************* + * + * Service Registration + * + *********************************************************************************************/ + + /* Register a service that is discovered via Browse() and Resolve() calls. + * + * RegisterReply() Callback Parameters: + * + * sdRef: The ServiceRef initialized by Register(). + * + * flags: Currently unused, reserved for future use. + * + * errorCode: Will be NoError on success, otherwise will + * indicate the failure that occurred (including name conflicts, if the + * NoAutoRename flag was passed to the + * callout.) Other parameters are undefined if errorCode is nonzero. + * + * name: The service name registered (if the application did not specify a name in + * DNSServiceRegister(), this indicates what name was automatically chosen). + * + * regtype: The type of service registered, as it was passed to the callout. + * + * domain: The domain on which the service was registered (if the application did not + * specify a domain in Register(), this indicates the default domain + * on which the service was registered). + * + */ + + __delegate void + RegisterReply + ( + ServiceRef * sdRef, + ServiceFlags flags, + ErrorCode errorCode, + String * name, + String * regtype, + String * domain + ); + + /* Register() Parameters: + * + * flags: Indicates the renaming behavior on name conflict (most applications + * will pass 0). See flag definitions above for details. + * + * interfaceIndex: If non-zero, specifies the interface on which to register the service + * (the index for a given interface is determined via the if_nametoindex() + * family of calls.) Most applications will pass 0 to register on all + * available interfaces. Pass -1 to register a service only on the local + * machine (service will not be visible to remote hosts.) + * + * name: If non-NULL, specifies the service name to be registered. + * Most applications will not specify a name, in which case the + * computer name is used (this name is communicated to the client via + * the callback). + * + * regtype: The service type followed by the protocol, separated by a dot + * (e.g. "_ftp._tcp"). The transport protocol must be "_tcp" or "_udp". + * New service types should be registered at htp://www.dns-sd.org/ServiceTypes.html. + * + * domain: If non-NULL, specifies the domain on which to advertise the service. + * Most applications will not specify a domain, instead automatically + * registering in the default domain(s). + * + * host: If non-NULL, specifies the SRV target host name. Most applications + * will not specify a host, instead automatically using the machine's + * default host name(s). Note that specifying a non-NULL host does NOT + * create an address record for that host - the application is responsible + * for ensuring that the appropriate address record exists, or creating it + * via DNSServiceRegisterRecord(). + * + * port: The port, in host byte order, on which the service accepts connections. + * Pass 0 for a "placeholder" service (i.e. a service that will not be discovered + * by browsing, but will cause a name conflict if another client tries to + * register that same name). Most clients will not use placeholder services. + * + * txtRecord: The txt record rdata. May be NULL. Note that a non-NULL txtRecord + * MUST be a properly formatted DNS TXT record, i.e. <length byte> <data> + * <length byte> <data> ... + * + * callback: The delegate to be called when the registration completes or asynchronously + * fails. The client MAY pass NULL for the callback - The client will NOT be notified + * of the default values picked on its behalf, and the client will NOT be notified of any + * asynchronous errors (e.g. out of memory errors, etc.) that may prevent the registration + * of the service. The client may NOT pass the NoAutoRename flag if the callback is NULL. + * The client may still deregister the service at any time via DNSServiceRefDeallocate(). + * + * return value: Returns initialize ServiceRef (any subsequent, asynchronous + * errors are delivered to the callback), otherwise throws an exception indicating + * the error that occurred (the callback is never invoked and the DNSServiceRef + * is not initialized.) + * + */ + static public ServiceRef* + Register + ( + int flags, + int interfaceIndex, + String * name, + String * regtype, + String * domain, + String * host, + int port, + Byte txtRecord[], + RegisterReply * callback + ); + + /* AddRecord() + * + * Add a record to a registered service. The name of the record will be the same as the + * registered service's name. + * The record can later be updated or deregistered by passing the RecordRef initialized + * by this function to UpdateRecord() or RemoveRecord(). + * + * + * Parameters; + * + * sdRef: A ServiceRef initialized by Register(). + * + * RecordRef: A pointer to an uninitialized RecordRef. Upon succesfull completion of this + * call, this ref may be passed to UpdateRecord() or RemoveRecord(). + * If the above ServiceRef is disposed, RecordRef is also + * invalidated and may not be used further. + * + * flags: Currently ignored, reserved for future use. + * + * rrtype: The type of the record (e.g. TXT, SRV, etc), as defined in nameser.h. + * + * rdata: The raw rdata to be contained in the added resource record. + * + * ttl: The time to live of the resource record, in seconds. + * + * return value: Returns initialized RecordRef, otherwise throws + * an exception indicating the error that occurred (the RecordRef is not initialized). + */ + + static public RecordRef* + AddRecord + ( + ServiceRef * sref, + int flags, + int rrtype, + Byte rdata[], + int ttl + ); + + /* UpdateRecord + * + * Update a registered resource record. The record must either be: + * - The primary txt record of a service registered via Register() + * - A record added to a registered service via AddRecord() + * - An individual record registered by RegisterRecord() + * + * + * Parameters: + * + * sdRef: A ServiceRef that was initialized by Register() + * or CreateConnection(). + * + * RecordRef: A RecordRef initialized by AddRecord, or NULL to update the + * service's primary txt record. + * + * flags: Currently ignored, reserved for future use. + * + * rdata: The new rdata to be contained in the updated resource record. + * + * ttl: The time to live of the updated resource record, in seconds. + * + * return value: No return value on success, otherwise throws an exception + * indicating the error that occurred. + */ + static public void + UpdateRecord + ( + ServiceRef * sref, + RecordRef * record, + int flags, + Byte rdata[], + int ttl + ); + + /* RemoveRecord + * + * Remove a record previously added to a service record set via AddRecord(), or deregister + * an record registered individually via RegisterRecord(). + * + * Parameters: + * + * sdRef: A ServiceRef initialized by Register() (if the + * record being removed was registered via AddRecord()) or by + * CreateConnection() (if the record being removed was registered via + * RegisterRecord()). + * + * recordRef: A RecordRef initialized by a successful call to AddRecord() + * or RegisterRecord(). + * + * flags: Currently ignored, reserved for future use. + * + * return value: Nothing on success, otherwise throws an + * exception indicating the error that occurred. + */ + + static public void + RemoveRecord + ( + ServiceRef * sref, + RecordRef * record, + int flags + ); + + /********************************************************************************************* + * + * Service Discovery + * + *********************************************************************************************/ + + /* Browse for instances of a service. + * + * + * BrowseReply() Parameters: + * + * sdRef: The DNSServiceRef initialized by Browse(). + * + * flags: Possible values are MoreComing and Add. + * See flag definitions for details. + * + * interfaceIndex: The interface on which the service is advertised. This index should + * be passed to Resolve() when resolving the service. + * + * errorCode: Will be NoError (0) on success, otherwise will + * indicate the failure that occurred. Other parameters are undefined if + * the errorCode is nonzero. + * + * serviceName: The service name discovered. + * + * regtype: The service type, as passed in to Browse(). + * + * domain: The domain on which the service was discovered (if the application did not + * specify a domain in Browse(), this indicates the domain on which the + * service was discovered.) + * + */ + + __delegate void + BrowseReply + ( + ServiceRef * sdRef, + ServiceFlags flags, + int interfaceIndex, + ErrorCode errorCode, + String * name, + String * type, + String * domain + ); + + /* DNSServiceBrowse() Parameters: + * + * sdRef: A pointer to an uninitialized ServiceRef. Call ServiceRef.Dispose() + * to terminate the browse. + * + * flags: Currently ignored, reserved for future use. + * + * interfaceIndex: If non-zero, specifies the interface on which to browse for services + * (the index for a given interface is determined via the if_nametoindex() + * family of calls.) Most applications will pass 0 to browse on all available + * interfaces. Pass -1 to only browse for services provided on the local host. + * + * regtype: The service type being browsed for followed by the protocol, separated by a + * dot (e.g. "_ftp._tcp"). The transport protocol must be "_tcp" or "_udp". + * + * domain: If non-NULL, specifies the domain on which to browse for services. + * Most applications will not specify a domain, instead browsing on the + * default domain(s). + * + * callback: The delegate to be called when an instance of the service being browsed for + * is found, or if the call asynchronously fails. + * + * return value: Returns initialized ServiceRef on succeses (any subsequent, asynchronous + * errors are delivered to the callback), otherwise throws an exception indicating + * the error that occurred (the callback is not invoked and the ServiceRef + * is not initialized.) + */ + + static public ServiceRef* + Browse + ( + int flags, + int interfaceIndex, + String * regtype, + String * domain, + BrowseReply * callback + ); + + /* ResolveReply() Parameters: + * + * Resolve a service name discovered via Browse() to a target host name, port number, and + * txt record. + * + * Note: Applications should NOT use Resolve() solely for txt record monitoring - use + * QueryRecord() instead, as it is more efficient for this task. + * + * Note: When the desired results have been returned, the client MUST terminate the resolve by calling + * ServiceRef.Dispose(). + * + * Note: Resolve() behaves correctly for typical services that have a single SRV record and + * a single TXT record (the TXT record may be empty.) To resolve non-standard services with multiple + * SRV or TXT records, QueryRecord() should be used. + * + * ResolveReply Callback Parameters: + * + * sdRef: The DNSServiceRef initialized by Resolve(). + * + * flags: Currently unused, reserved for future use. + * + * interfaceIndex: The interface on which the service was resolved. + * + * errorCode: Will be NoError (0) on success, otherwise will + * indicate the failure that occurred. Other parameters are undefined if + * the errorCode is nonzero. + * + * fullname: The full service domain name, in the form <servicename>.<protocol>.<domain>. + * (Any literal dots (".") are escaped with a backslash ("\."), and literal + * backslashes are escaped with a second backslash ("\\"), e.g. a web server + * named "Dr. Pepper" would have the fullname "Dr\.\032Pepper._http._tcp.local."). + * This is the appropriate format to pass to standard system DNS APIs such as + * res_query(), or to the special-purpose functions included in this API that + * take fullname parameters. + * + * hosttarget: The target hostname of the machine providing the service. This name can + * be passed to functions like gethostbyname() to identify the host's IP address. + * + * port: The port, in host byte order, on which connections are accepted for this service. + * + * txtRecord: The service's primary txt record, in standard txt record format. + * + */ + + __delegate void + ResolveReply + ( + ServiceRef * sdRef, + ServiceFlags flags, + int interfaceIndex, + ErrorCode errorCode, + String * fullName, + String * hostName, + int port, + Byte txtRecord[] + ); + + /* Resolve() Parameters + * + * flags: Currently ignored, reserved for future use. + * + * interfaceIndex: The interface on which to resolve the service. The client should + * pass the interface on which the servicename was discovered, i.e. + * the interfaceIndex passed to the DNSServiceBrowseReply callback, + * or 0 to resolve the named service on all available interfaces. + * + * name: The servicename to be resolved. + * + * regtype: The service type being resolved followed by the protocol, separated by a + * dot (e.g. "_ftp._tcp"). The transport protocol must be "_tcp" or "_udp". + * + * domain: The domain on which the service is registered, i.e. the domain passed + * to the DNSServiceBrowseReply callback. + * + * callback: The delegate to be called when a result is found, or if the call + * asynchronously fails. + * + * + * return value: Returns initialized ServiceRef on succeses (any subsequent, asynchronous + * errors are delivered to the callback), otherwise throws an exception indicating + * the error that occurred (the callback is never invoked and the DNSServiceRef + * is not initialized.) + */ + + static public ServiceRef* + Resolve + ( + int flags, + int interfaceIndex, + String * name, + String * regtype, + String * domain, + ResolveReply * callback + ); + + /********************************************************************************************* + * + * Special Purpose Calls (most applications will not use these) + * + *********************************************************************************************/ + + /* CreateConnection/RegisterRecord + * + * Register an individual resource record on a connected ServiceRef. + * + * Note that name conflicts occurring for records registered via this call must be handled + * by the client in the callback. + * + * + * RecordReply() parameters: + * + * sdRef: The connected ServiceRef initialized by + * CreateConnection(). + * + * RecordRef: The RecordRef initialized by RegisterRecord(). If the above + * ServiceRef.Dispose is called, this RecordRef is + * invalidated, and may not be used further. + * + * flags: Currently unused, reserved for future use. + * + * errorCode: Will be NoError on success, otherwise will + * indicate the failure that occurred (including name conflicts.) + * Other parameters are undefined if errorCode is nonzero. + * + */ + + __delegate void + RegisterRecordReply + ( + ServiceRef * sdRef, + ServiceFlags flags, + ErrorCode errorCode, + RecordRef * record + ); + + /* CreateConnection() + * + * Create a connection to the daemon allowing efficient registration of + * multiple individual records. + * + * + * Parameters: + * + * callback: The delegate to be called when a result is found, or if the call + * asynchronously fails (e.g. because of a name conflict.) + * + * return value: Returns initialize ServiceRef on success, otherwise throws + * an exception indicating the specific failure that occurred (in which + * case the ServiceRef is not initialized). + */ + + static public ServiceRef* + CreateConnection + ( + RegisterRecordReply * callback + ); + + + /* RegisterRecord() Parameters: + * + * sdRef: A ServiceRef initialized by CreateConnection(). + * + * RecordRef: A pointer to an uninitialized RecordRef. Upon succesfull completion of this + * call, this ref may be passed to UpdateRecord() or RemoveRecord(). + * (To deregister ALL records registered on a single connected ServiceRef + * and deallocate each of their corresponding RecordRefs, call + * ServiceRef.Dispose()). + * + * flags: Possible values are Shared or Unique + * (see flag type definitions for details). + * + * interfaceIndex: If non-zero, specifies the interface on which to register the record + * (the index for a given interface is determined via the if_nametoindex() + * family of calls.) Passing 0 causes the record to be registered on all interfaces. + * Passing -1 causes the record to only be visible on the local host. + * + * fullname: The full domain name of the resource record. + * + * rrtype: The numerical type of the resource record (e.g. PTR, SRV, etc), as defined + * in nameser.h. + * + * rrclass: The class of the resource record, as defined in nameser.h (usually 1 for the + * Internet class). + * + * rdata: A pointer to the raw rdata, as it is to appear in the DNS record. + * + * ttl: The time to live of the resource record, in seconds. + * + * + * return value: Returns initialize RecordRef on succeses (any subsequent, asynchronous + * errors are delivered to the callback), otherwise throws an exception indicating + * the error that occurred (the callback is never invoked and the RecordRef is + * not initialized.) + */ + static public RecordRef* + RegisterRecord + ( + ServiceRef * sdRef, + ServiceFlags flags, + int interfaceIndex, + String * fullname, + int rrtype, + int rrclass, + Byte rdata[], + int ttl + ); + + + /* DNSServiceQueryRecord + * + * Query for an arbitrary DNS record. + * + * + * QueryRecordReply() Delegate Parameters: + * + * sdRef: The ServiceRef initialized by QueryRecord(). + * + * flags: Possible values are MoreComing and + * Add. The Add flag is NOT set for PTR records + * with a ttl of 0, i.e. "Remove" events. + * + * interfaceIndex: The interface on which the query was resolved (the index for a given + * interface is determined via the if_nametoindex() family of calls). + * + * errorCode: Will be kDNSServiceErr_NoError on success, otherwise will + * indicate the failure that occurred. Other parameters are undefined if + * errorCode is nonzero. + * + * fullname: The resource record's full domain name. + * + * rrtype: The resource record's type (e.g. PTR, SRV, etc) as defined in nameser.h. + * + * rrclass: The class of the resource record, as defined in nameser.h (usually 1). + * + * rdata: The raw rdata of the resource record. + * + * ttl: The resource record's time to live, in seconds. + * + */ + + __delegate void + QueryRecordReply + ( + ServiceRef * sdRef, + ServiceFlags flags, + int interfaceIndex, + ErrorCode errorCode, + String * fullName, + int rrtype, + int rrclass, + Byte rdata[], + int ttl + ); + + /* QueryRecord() Parameters: + * + * flags: Pass LongLivedQuery to create a "long-lived" unicast + * query in a non-local domain. Without setting this flag, unicast queries + * will be one-shot - that is, only answers available at the time of the call + * will be returned. By setting this flag, answers (including Add and Remove + * events) that become available after the initial call is made will generate + * callbacks. This flag has no effect on link-local multicast queries. + * + * interfaceIndex: If non-zero, specifies the interface on which to issue the query + * (the index for a given interface is determined via the if_nametoindex() + * family of calls.) Passing 0 causes the name to be queried for on all + * interfaces. Passing -1 causes the name to be queried for only on the + * local host. + * + * fullname: The full domain name of the resource record to be queried for. + * + * rrtype: The numerical type of the resource record to be queried for (e.g. PTR, SRV, etc) + * as defined in nameser.h. + * + * rrclass: The class of the resource record, as defined in nameser.h + * (usually 1 for the Internet class). + * + * callback: The delegate to be called when a result is found, or if the call + * asynchronously fails. + * + * + * return value: Returns initialized ServiceRef on succeses (any subsequent, asynchronous + * errors are delivered to the callback), otherwise throws an exception indicating + * the error that occurred (the callback is never invoked and the ServiceRef + * is not initialized.) + */ + + static public ServiceRef* + QueryRecord + ( + ServiceFlags flags, + int interfaceIndex, + String * fullname, + int rrtype, + int rrclass, + QueryRecordReply * callback + ); + + /* ReconfirmRecord + * + * Instruct the daemon to verify the validity of a resource record that appears to + * be out of date (e.g. because tcp connection to a service's target failed.) + * Causes the record to be flushed from the daemon's cache (as well as all other + * daemons' caches on the network) if the record is determined to be invalid. + * + * Parameters: + * + * flags: Currently unused, reserved for future use. + * + * fullname: The resource record's full domain name. + * + * rrtype: The resource record's type (e.g. PTR, SRV, etc) as defined in nameser.h. + * + * rrclass: The class of the resource record, as defined in nameser.h (usually 1). + * + * rdata: The raw rdata of the resource record. + * + */ + static public void + ReconfirmRecord + ( + ServiceFlags flags, + int interfaceIndex, + String * fullname, + int rrtype, + int rrclass, + Byte rdata[] + ); + }; + } +} |