source: rtems-libbsd/mDNSResponder/Clients/DNSServiceReg.m @ 4a5f546

55-freebsd-126-freebsd-12
Last change on this file since 4a5f546 was 9449f15, checked in by Sebastian Huber <sebastian.huber@…>, on 01/30/14 at 12:52:13

mDNS: Import

The sources can be obtained via:

http://opensource.apple.com/tarballs/mDNSResponder/mDNSResponder-544.tar.gz

  • Property mode set to 100644
File size: 10.0 KB
Line 
1/* -*- Mode: C; tab-width: 4 -*-
2 *
3 * Copyright (c) 2002-2003 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#include "dns_sd.h"
19
20@interface RegistrationController : NSObject
21{
22    IBOutlet NSTableColumn      *typeColumn;
23    IBOutlet NSTableColumn      *nameColumn;
24    IBOutlet NSTableColumn      *portColumn;
25    IBOutlet NSTableColumn      *domainColumn;
26    IBOutlet NSTableColumn      *textColumn;
27
28    IBOutlet NSTableView        *serviceDisplayTable;
29
30    IBOutlet NSTextField        *serviceTypeField;
31    IBOutlet NSTextField        *serviceNameField;
32    IBOutlet NSTextField        *servicePortField;
33    IBOutlet NSTextField        *serviceDomainField;
34    IBOutlet NSTextField        *serviceTextField;
35   
36    NSMutableArray              *srvtypeKeys;
37    NSMutableArray              *srvnameKeys;
38    NSMutableArray              *srvportKeys;
39    NSMutableArray              *srvdomainKeys;
40    NSMutableArray              *srvtextKeys;
41
42    NSMutableDictionary         *registeredDict;
43}
44
45- (IBAction)registerService:(id)sender;
46- (IBAction)unregisterService:(id)sender;
47
48- (IBAction)addNewService:(id)sender;
49- (IBAction)removeSelected:(id)sender;
50
51@end
52
53void reg_reply
54    (
55    DNSServiceRef                       sdRef,
56    DNSServiceFlags                     flags,
57    DNSServiceErrorType                 errorCode,
58    const char                          *name,
59    const char                          *regtype,
60    const char                          *domain,
61    void                                *context
62    )
63{
64    // registration reply
65    printf("Got a reply from the server with error %d\n", errorCode);
66    return;
67}
68
69static void myCFSocketCallBack(CFSocketRef cfs, CFSocketCallBackType CallBackType, CFDataRef address, const void *data, void *context)
70        {
71        DNSServiceProcessResult((DNSServiceRef)context);
72        }
73
74static void addDNSServiceRefToRunLoop(DNSServiceRef ref)
75        {
76        int s = DNSServiceRefSockFD(ref);
77        CFSocketContext myCFSocketContext = { 0, ref, NULL, NULL, NULL };
78        CFSocketRef c = CFSocketCreateWithNative(kCFAllocatorDefault, s, kCFSocketReadCallBack, myCFSocketCallBack, &myCFSocketContext);
79        CFRunLoopSourceRef rls = CFSocketCreateRunLoopSource(kCFAllocatorDefault, c, 0);
80        CFRunLoopAddSource(CFRunLoopGetCurrent(), rls, kCFRunLoopDefaultMode);
81        CFRelease(rls);
82        }
83
84
85@implementation RegistrationController
86
87- (void)registerDefaults
88{
89    NSMutableDictionary *regDict = [NSMutableDictionary dictionary];
90
91    NSArray *typeArray   = [NSArray arrayWithObjects:@"_ftp._tcp.",    @"_ssh._tcp.",  @"_tftp._tcp.",        @"_http._tcp.",      @"_printer._tcp.",  @"_afpovertcp._tcp.",         nil];
92    NSArray *nameArray   = [NSArray arrayWithObjects:@"My ftp Server", @"My Computer", @"Testing Boot Image", @"A Web Server",     @"Steve's Printer", @"Company AppleShare Server", nil];
93    NSArray *portArray   = [NSArray arrayWithObjects:@"21",            @"22",          @"69",                 @"80",               @"515",             @"548",                       nil];
94    NSArray *domainArray = [NSArray arrayWithObjects:@"",              @"",            @"",                   @"",                 @"",                @"",                          nil];
95    NSArray *textArray   = [NSArray arrayWithObjects:@"",              @"",            @"image=mybootimage",  @"path=/index.html", @"rn=lpt1",         @"Vol=Public",                nil];
96
97    [regDict setObject:typeArray forKey:@"SrvTypeKeys"];
98    [regDict setObject:nameArray forKey:@"SrvNameKeys"];
99    [regDict setObject:portArray forKey:@"SrvPortKeys"];
100    [regDict setObject:domainArray forKey:@"SrvDomainKeys"];
101    [regDict setObject:textArray forKey:@"SrvTextKeys"];
102
103    [[NSUserDefaults standardUserDefaults] registerDefaults:regDict];
104}
105
106- (id)init
107{
108    srvtypeKeys = [[NSMutableArray array] retain];      //Define arrays for Type, Domain, and Name
109    srvnameKeys = [[NSMutableArray array] retain];
110    srvportKeys = [[NSMutableArray array] retain];
111    srvdomainKeys = [[NSMutableArray array] retain];
112    srvtextKeys = [[NSMutableArray array] retain];
113
114    registeredDict = [[NSMutableDictionary alloc] init];
115   
116    [self registerDefaults];
117    return [super init];
118}
119
120- (void)awakeFromNib                            //BrowserController startup procedure
121{
122    [srvtypeKeys addObjectsFromArray:[[NSUserDefaults standardUserDefaults] arrayForKey:@"SrvTypeKeys"]];
123    [srvnameKeys addObjectsFromArray:[[NSUserDefaults standardUserDefaults] arrayForKey:@"SrvNameKeys"]];
124    [srvportKeys addObjectsFromArray:[[NSUserDefaults standardUserDefaults] arrayForKey:@"SrvPortKeys"]];
125    [srvdomainKeys addObjectsFromArray:[[NSUserDefaults standardUserDefaults] arrayForKey:@"SrvDomainKeys"]];
126    [srvtextKeys addObjectsFromArray:[[NSUserDefaults standardUserDefaults] arrayForKey:@"SrvTextKeys"]];
127
128    [serviceDisplayTable reloadData];                           //Reload (redraw) data in fields
129
130}
131
132
133
134 - (IBAction)registerService:(id)sender
135{
136    int selectedRow = [serviceDisplayTable selectedRow];
137    CFMachPortContext       context;
138    DNSServiceRef               dns_client;
139
140    if (selectedRow < 0) {
141        return;
142    }
143
144        NSString *key = [srvtypeKeys objectAtIndex:selectedRow];
145        if ([registeredDict objectForKey:key]) { printf("Already registered\n"); return; }
146
147    context.version                 = 1;
148    context.info                    = 0;
149    context.retain                  = NULL;
150    context.release                 = NULL;
151    context.copyDescription         = NULL;
152    unsigned char txtbuffer[300];
153        strncpy(txtbuffer+1, [[srvtextKeys objectAtIndex:selectedRow] UTF8String], sizeof(txtbuffer)-1);
154        txtbuffer[0] = strlen(txtbuffer+1);
155
156    DNSServiceErrorType err = DNSServiceRegister
157        (
158                &dns_client, 0, 0,
159            [[srvnameKeys objectAtIndex:selectedRow] UTF8String],
160            [key UTF8String],
161            [[srvdomainKeys objectAtIndex:selectedRow] UTF8String],
162            NULL, htons([[srvportKeys objectAtIndex:selectedRow] intValue]),
163            txtbuffer[0]+1, txtbuffer,
164            reg_reply,
165            nil
166            );
167        if (err)
168                printf("DNSServiceRegister failed %d\n", err);
169        else
170        {
171                addDNSServiceRefToRunLoop(dns_client);
172                [registeredDict setObject:[NSNumber numberWithUnsignedInt:(unsigned int)dns_client] forKey:key];
173        }
174}
175
176- (IBAction)unregisterService:(id)sender
177{
178    int selectedRow = [serviceDisplayTable selectedRow];
179    NSString *key = [srvtypeKeys objectAtIndex:selectedRow];
180
181    NSNumber *refPtr = [registeredDict objectForKey:key];
182    DNSServiceRef ref = (DNSServiceRef)[refPtr unsignedIntValue];
183
184    if (ref) {
185        DNSServiceRefDeallocate(ref);
186        [registeredDict removeObjectForKey:key];
187    }
188}
189
190-(void)tableView:(NSTableView *)theTableView setObjectValue:(id)object forTableColumn:(NSTableColumn *)tableColumn row:(int)row
191{
192    if (row<0) return;
193}
194
195- (int)numberOfRowsInTableView:(NSTableView *)theTableView      //Begin mandatory TableView methods
196{
197    return [srvtypeKeys count];
198}
199
200- (id)tableView:(NSTableView *)theTableView objectValueForTableColumn:(NSTableColumn *)theColumn row:(int)rowIndex
201{
202    if (theColumn == typeColumn) {
203        return [srvtypeKeys objectAtIndex:rowIndex];
204    }
205    if (theColumn == nameColumn) {
206        return [srvnameKeys objectAtIndex:rowIndex];
207    }
208    if (theColumn == portColumn) {
209        return [srvportKeys objectAtIndex:rowIndex];
210    }
211    if (theColumn == domainColumn) {
212        return [srvdomainKeys objectAtIndex:rowIndex];
213    }
214    if (theColumn == textColumn) {
215        return [srvtextKeys objectAtIndex:rowIndex];
216    }
217   
218    return(0);
219}                                               //End of mandatory TableView methods
220
221- (IBAction)removeSelected:(id)sender
222{
223    // remove the selected row and force a refresh
224
225    int selectedRow = [serviceDisplayTable selectedRow];
226
227    if (selectedRow) {
228
229        [srvtypeKeys removeObjectAtIndex:selectedRow];
230        [srvnameKeys removeObjectAtIndex:selectedRow];
231        [srvportKeys removeObjectAtIndex:selectedRow];
232        [srvdomainKeys removeObjectAtIndex:selectedRow];
233        [srvtextKeys removeObjectAtIndex:selectedRow];
234
235        [[NSUserDefaults standardUserDefaults] setObject:srvtypeKeys forKey:@"SrvTypeKeys"];
236        [[NSUserDefaults standardUserDefaults] setObject:srvnameKeys forKey:@"SrvNameKeys"];
237        [[NSUserDefaults standardUserDefaults] setObject:srvportKeys forKey:@"SrvPortKeys"];
238        [[NSUserDefaults standardUserDefaults] setObject:srvdomainKeys forKey:@"SrvDomainKeys"];
239        [[NSUserDefaults standardUserDefaults] setObject:srvtextKeys forKey:@"SrvTextKeys"];
240       
241        [serviceDisplayTable reloadData];
242    }
243}
244
245- (IBAction)addNewService:(id)sender
246{
247    // add new entries from the edit fields to the arrays for the defaults
248
249    if ([[serviceTypeField stringValue] length] && [[serviceNameField stringValue] length] && [[serviceDomainField stringValue] length]&& [[servicePortField stringValue] length]) {
250        [srvtypeKeys addObject:[serviceTypeField stringValue]];
251        [srvnameKeys addObject:[serviceNameField stringValue]];
252        [srvportKeys addObject:[servicePortField stringValue]];
253        [srvdomainKeys addObject:[serviceDomainField stringValue]];
254        [srvtextKeys addObject:[serviceTextField stringValue]];
255
256        [[NSUserDefaults standardUserDefaults] setObject:srvtypeKeys forKey:@"SrvTypeKeys"];
257        [[NSUserDefaults standardUserDefaults] setObject:srvnameKeys forKey:@"SrvNameKeys"];
258        [[NSUserDefaults standardUserDefaults] setObject:srvportKeys forKey:@"SrvPortKeys"];
259        [[NSUserDefaults standardUserDefaults] setObject:srvdomainKeys forKey:@"SrvDomainKeys"];
260        [[NSUserDefaults standardUserDefaults] setObject:srvtextKeys forKey:@"SrvTextKeys"];
261
262        [serviceDisplayTable reloadData];
263    } else {
264        NSBeep();
265    }
266
267}
268
269@end
270
271int main(int argc, const char *argv[])
272{
273    return NSApplicationMain(argc, argv);
274}
Note: See TracBrowser for help on using the repository browser.