/* -*- Mode: C; tab-width: 4 -*-
 *
 * Copyright (c) 2002, 2004, 2006, 2011 Apple 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.
 */

/*!	@header		DNS Service Discovery (Deprecated Mach-based API)
 *
 * @discussion  Note that this API was deprecated in Mac OS X 10.3, and replaced
 *				by the portable cross-platform /usr/include/dns_sd.h API.
 */

#ifndef __DNS_SERVICE_DISCOVERY_H
#define __DNS_SERVICE_DISCOVERY_H

#include <mach/mach_types.h>

#include <sys/types.h>
#include <sys/socket.h>
#include <sys/cdefs.h>

#include <netinet/in.h>

#include <AvailabilityMacros.h>

__BEGIN_DECLS

/* Opaque internal data type */
typedef struct _dns_service_discovery_t * dns_service_discovery_ref;

/* possible reply flags values */

enum {
    kDNSServiceDiscoveryNoFlags         = 0,
    kDNSServiceDiscoveryMoreRepliesImmediately  = 1 << 0,
};


typedef enum
{
    DNSServiceDomainEnumerationReplyAddDomain,
    DNSServiceDomainEnumerationReplyAddDomainDefault,
    DNSServiceDomainEnumerationReplyRemoveDomain,
} DNSServiceDomainEnumerationReplyResultType;

typedef enum
{
    DNSServiceDiscoverReplyFlagsFinished,
    DNSServiceDiscoverReplyFlagsMoreComing,
} DNSServiceDiscoveryReplyFlags;

typedef void (*DNSServiceDomainEnumerationReply)(
    DNSServiceDomainEnumerationReplyResultType resultType,  // One of DNSServiceDomainEnumerationReplyResultType
    const char                                *replyDomain,
    DNSServiceDiscoveryReplyFlags              flags,       // DNS Service Discovery reply flags information
    void                                      *context
);


/* possible error code values */
typedef enum
{
    kDNSServiceDiscoveryNoError     = 0,
} DNSServiceRegistrationReplyErrorType;

typedef void (*DNSServiceRegistrationReply)(
    DNSServiceRegistrationReplyErrorType errorCode,
    void                                        *context
);

typedef uint32_t DNSRecordReference;


/*!
   @function DNSServiceResolver_handleReply
   @discussion This function should be called with the Mach message sent
   to the port returned by the call to DNSServiceResolverResolve.
   The reply message will be interpreted and will result in a
   call to the specified callout function.
   @param replyMsg The Mach message.
 */
void DNSServiceDiscovery_handleReply(void *replyMsg);

/***************************************************************************/
/*   DNS Service Browser   */

typedef enum
{
    DNSServiceBrowserReplyAddInstance,  // Instance of service found
    DNSServiceBrowserReplyRemoveInstance    // Instance has been removed from network
} DNSServiceBrowserReplyResultType;

typedef void (*DNSServiceBrowserReply)(
    DNSServiceBrowserReplyResultType resultType,                // One of DNSServiceBrowserReplyResultType
    const char      *replyName,
    const char      *replyType,
    const char      *replyDomain,
    DNSServiceDiscoveryReplyFlags flags,                        // DNS Service Discovery reply flags information
    void            *context
    );

/*!
    @function DNSServiceBrowserCreate
    @discussion Asynchronously create a DNS Service browser
    @param regtype The type of service
    @param domain The domain in which to find the service
    @param callBack The function to be called when service instances are found or removed
    @param context A user specified context which will be passed to the callout function.
    @result A dns_registration_t
 */
dns_service_discovery_ref DNSServiceBrowserCreate
(
    const char      *regtype,
    const char      *domain,
    DNSServiceBrowserReply callBack,
    void        *context
) AVAILABLE_MAC_OS_X_VERSION_10_2_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_3;

/***************************************************************************/
/* Resolver requests */

typedef void (*DNSServiceResolverReply)(
    struct sockaddr     *interface,     // Needed for scoped addresses like link-local
    struct sockaddr     *address,
    const char          *txtRecord,
    DNSServiceDiscoveryReplyFlags flags,                        // DNS Service Discovery reply flags information
    void                *context
    );

/*!
   @function DNSServiceResolverResolve
    @discussion Resolved a named instance of a service to its address, port, and
        (optionally) other demultiplexing information contained in the TXT record.
    @param name The name of the service instance
    @param regtype The type of service
    @param domain The domain in which to find the service
    @param callBack The DNSServiceResolverReply function to be called when the specified
        address has been resolved.
    @param context A user specified context which will be passed to the callout function.
    @result A dns_registration_t
 */

dns_service_discovery_ref DNSServiceResolverResolve
(
    const char      *name,
    const char      *regtype,
    const char      *domain,
    DNSServiceResolverReply callBack,
    void        *context
) AVAILABLE_MAC_OS_X_VERSION_10_2_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_3;

/***************************************************************************/
/* Mach port accessor and deallocation */

/*!
    @function DNSServiceDiscoveryMachPort
    @discussion Returns the mach port for a dns_service_discovery_ref
    @param registration A dns_service_discovery_ref as returned from DNSServiceRegistrationCreate
    @result A mach reply port which will be sent messages as appropriate.
        These messages should be passed to the DNSServiceDiscovery_handleReply
        function.  A NULL value indicates that no address was
        specified or some other error occurred which prevented the
        resolution from being started.
 */
mach_port_t DNSServiceDiscoveryMachPort(dns_service_discovery_ref dnsServiceDiscovery) AVAILABLE_MAC_OS_X_VERSION_10_2_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_3;

/*!
    @function DNSServiceDiscoveryDeallocate
    @discussion Deallocates the DNS Service Discovery type / closes the connection to the server
    @param dnsServiceDiscovery A dns_service_discovery_ref as returned from a creation or enumeration call
    @result void
 */
void DNSServiceDiscoveryDeallocate(dns_service_discovery_ref dnsServiceDiscovery) AVAILABLE_MAC_OS_X_VERSION_10_2_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_3;

__END_DECLS

#endif  /* __DNS_SERVICE_DISCOVERY_H */
