]>
Commit | Line | Data |
---|---|---|
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 | ||
53 | void 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 |
69 | static void myCFSocketCallBack(CFSocketRef cfs, CFSocketCallBackType CallBackType, CFDataRef address, const void *data, void *context) |
70 | { | |
71 | DNSServiceProcessResult((DNSServiceRef)context); | |
72 | } | |
73 | ||
74 | static 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 | |
271 | int main(int argc, const char *argv[]) | |
272 | { | |
273 | return NSApplicationMain(argc, argv); | |
274 | } |