]> git.saurik.com Git - apple/mdnsresponder.git/blame - Clients/DNSServiceReg.m
mDNSResponder-1310.80.1.tar.gz
[apple/mdnsresponder.git] / Clients / DNSServiceReg.m
CommitLineData
67c8f8a1
A
1/* -*- Mode: C; tab-width: 4 -*-
2 *
b7388343
A
3 * Copyright (c) 2002-2003 Apple Computer, Inc. All rights reserved.
4 *
67c8f8a1
A
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
b7388343 8 *
67c8f8a1 9 * http://www.apache.org/licenses/LICENSE-2.0
b7388343 10 *
67c8f8a1
A
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
b7388343 15 * limitations under the License.
b7388343
A
16 */
17
8e92c31c
A
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}
b7388343 44
8e92c31c
A
45- (IBAction)registerService:(id)sender;
46- (IBAction)unregisterService:(id)sender;
b7388343 47
8e92c31c
A
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 )
b7388343
A
63{
64 // registration reply
65 printf("Got a reply from the server with error %d\n", errorCode);
66 return;
67}
68
8e92c31c
A
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
b7388343
A
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];
8e92c31c 92 NSArray *nameArray = [NSArray arrayWithObjects:@"My ftp Server", @"My Computer", @"Testing Boot Image", @"A Web Server", @"Steve's Printer", @"Company AppleShare Server", nil];
b7388343
A
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];
b7388343 137 CFMachPortContext context;
8e92c31c 138 DNSServiceRef dns_client;
b7388343
A
139
140 if (selectedRow < 0) {
141 return;
142 }
143
8e92c31c
A
144 NSString *key = [srvtypeKeys objectAtIndex:selectedRow];
145 if ([registeredDict objectForKey:key]) { printf("Already registered\n"); return; }
146
b7388343
A
147 context.version = 1;
148 context.info = 0;
149 context.retain = NULL;
150 context.release = NULL;
151 context.copyDescription = NULL;
8e92c31c
A
152 unsigned char txtbuffer[300];
153 strncpy(txtbuffer+1, [[srvtextKeys objectAtIndex:selectedRow] UTF8String], sizeof(txtbuffer)-1);
154 txtbuffer[0] = strlen(txtbuffer+1);
b7388343 155
8e92c31c 156 DNSServiceErrorType err = DNSServiceRegister
b7388343 157 (
8e92c31c 158 &dns_client, 0, 0,
b7388343 159 [[srvnameKeys objectAtIndex:selectedRow] UTF8String],
8e92c31c 160 [key UTF8String],
b7388343 161 [[srvdomainKeys objectAtIndex:selectedRow] UTF8String],
8e92c31c
A
162 NULL, htons([[srvportKeys objectAtIndex:selectedRow] intValue]),
163 txtbuffer[0]+1, txtbuffer,
b7388343
A
164 reg_reply,
165 nil
166 );
8e92c31c
A
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 }
b7388343
A
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];
8e92c31c 182 DNSServiceRef ref = (DNSServiceRef)[refPtr unsignedIntValue];
b7388343
A
183
184 if (ref) {
8e92c31c 185 DNSServiceRefDeallocate(ref);
b7388343
A
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
b7388343 269@end
8e92c31c
A
270
271int main(int argc, const char *argv[])
272{
273 return NSApplicationMain(argc, argv);
274}