PortMapper/MYDNSService.h
author Jens Alfke <jens@mooseyard.com>
Tue Jul 21 10:04:10 2009 -0700 (2009-07-21)
changeset 61 981f9d604c88
parent 32 b3254a2f6d6c
permissions -rw-r--r--
Prevent crash if MYBonjourQuery is released during response handling
jens@27
     1
//
jens@27
     2
//  MYDNSService.h
jens@27
     3
//  MYNetwork
jens@27
     4
//
jens@27
     5
//  Created by Jens Alfke on 4/23/09.
jens@27
     6
//  Copyright 2009 Jens Alfke. All rights reserved.
jens@27
     7
//
jens@27
     8
jens@27
     9
#import <Foundation/Foundation.h>
jens@27
    10
#import <CoreFoundation/CFSocket.h>
jens@31
    11
@class MYDNSConnection;
jens@27
    12
jens@27
    13
jens@27
    14
/** Abstract superclass for services based on DNSServiceRefs, such as MYPortMapper. */
jens@27
    15
@interface MYDNSService : NSObject
jens@27
    16
{
jens@27
    17
    @private
jens@31
    18
    BOOL _usePrivateConnection;
jens@31
    19
    MYDNSConnection *_connection;
jens@27
    20
    struct _DNSServiceRef_t *_serviceRef;
jens@27
    21
    CFSocketRef _socket;
jens@27
    22
    CFRunLoopSourceRef _socketSource;
jens@27
    23
    SInt32 _error;
jens@31
    24
    BOOL _continuous, _gotResponse;
jens@27
    25
}
jens@27
    26
jens@28
    27
/** If NO (the default), the service will stop after it gets a result.
jens@28
    28
    If YES, it will continue to run until stopped. */
jens@28
    29
@property BOOL continuous;
jens@28
    30
jens@27
    31
/** Starts the service.
jens@27
    32
    Returns immediately; you can find out when the service actually starts (or fails to)
jens@27
    33
    by observing the isOpen and error properties.
jens@27
    34
    It's very unlikely that this call itself will fail (return NO). If it does, it
jens@27
    35
    probably means that the mDNSResponder process isn't working. */
jens@28
    36
- (BOOL) start;
jens@27
    37
jens@28
    38
/** Stops the service. */
jens@28
    39
- (void) stop;
jens@27
    40
jens@50
    41
/** Has the service started up? */
jens@50
    42
@property (readonly) BOOL isRunning;
jens@50
    43
jens@27
    44
jens@27
    45
/** The error status, a DNSServiceErrorType enum; nonzero if something went wrong. 
jens@27
    46
    This property is KV observable. */
jens@28
    47
@property int32_t error;
jens@27
    48
jens@31
    49
jens@31
    50
/** Utility to construct a service's full name. */
jens@31
    51
+ (NSString*) fullNameOfService: (NSString*)serviceName
jens@31
    52
                         ofType: (NSString*)type
jens@31
    53
                       inDomain: (NSString*)domain;
jens@31
    54
jens@31
    55
jens@32
    56
/** @name Protected
jens@32
    57
 *  Methods for use only by subclasses
jens@32
    58
 */
jens@32
    59
//@{
jens@31
    60
jens@32
    61
/** Normally, all DNSService objects use a shared IPC connection to the mDNSResponder daemon.
jens@32
    62
    If an instance wants to use its own connection instead, it can set this property to YES before
jens@32
    63
    it starts. If it does so, it must NOT set the kDNSServiceFlagsShareConnection flag when creating
jens@32
    64
    its underlying DNSService.
jens@32
    65
    This functionality is only provided because MYBonjourRegistration needs it -- there's a bug
jens@32
    66
    that prevents DNSServiceUpdateRecord from working with a shared connection. */
jens@31
    67
@property BOOL usePrivateConnection;
jens@31
    68
jens@27
    69
/** Subclass must implement this abstract method to create a new DNSServiceRef.
jens@27
    70
    This method is called by -open.
jens@31
    71
    The implementation MUST pass the given sdRefPtr directly to the DNSService function
jens@31
    72
    that creates the new ref, without setting it to NULL first.
jens@32
    73
    It MUST also set the kDNSServiceFlagsShareConnection flag, unless it's already set the
jens@32
    74
    usePrivateConnection property. */
jens@31
    75
- (int32_t/*DNSServiceErrorType*/) createServiceRef: (struct _DNSServiceRef_t**)sdRefPtr;
jens@31
    76
jens@31
    77
/** Subclass's callback must call this method after doing its own work.
jens@31
    78
    This method will update the error state, and will stop the service if it's not set to be
jens@31
    79
    continuous. */
jens@31
    80
- (void) gotResponse: (int32_t/*DNSServiceErrorType*/)errorCode;
jens@27
    81
jens@32
    82
/** The underlying DNSServiceRef. This will be NULL except while the service is running. */
jens@28
    83
@property (readonly) struct _DNSServiceRef_t* serviceRef;
jens@28
    84
jens@28
    85
/** Same as -stop, but does not clear the error property.
jens@28
    86
    (The stop method actually calls this first.) */
jens@28
    87
- (void) cancel;
jens@28
    88
jens@28
    89
/** Block until a message is received from the daemon.
jens@28
    90
    This will cause the service's callback (defined by the subclass) to be invoked.
jens@28
    91
    @return  YES if a message is received, NO on error (or if the service isn't started) */
jens@28
    92
- (BOOL) waitForReply;
jens@27
    93
jens@32
    94
//@}
jens@31
    95
jens@27
    96
@end
jens@31
    97
jens@31
    98
jens@31
    99
jens@31
   100
jens@31
   101
@interface MYDNSConnection : NSObject
jens@31
   102
{
jens@31
   103
    struct _DNSServiceRef_t* _connectionRef;
jens@31
   104
    CFSocketRef _socket;
jens@31
   105
    CFRunLoopSourceRef _runLoopSource;
jens@31
   106
}
jens@31
   107
jens@31
   108
+ (MYDNSConnection*) sharedConnection;
jens@31
   109
- (id) initWithServiceRef: (struct _DNSServiceRef_t *)serviceRef;
jens@31
   110
@property (readonly) struct _DNSServiceRef_t* connectionRef;
jens@31
   111
- (BOOL) processResult;
jens@31
   112
- (void) close;
jens@31
   113
jens@31
   114
@end