author | Michael Krelin <hacker@klever.net> | 2012-12-08 21:19:17 (UTC) |
---|---|---|
committer | Michael Krelin <hacker@klever.net> | 2012-12-11 21:59:29 (UTC) |
commit | 8808689fe340bec6e90ab13dd502292b0579cf1f (patch) (side-by-side diff) | |
tree | 45b7c863151341f687b74e40bffcbd7ab5468783 /pumpkin | |
parent | 6e7e413ca364d79673e523c09767c18e7cff1bec (diff) | |
download | pumpkin-osx/0.0.zip pumpkin-osx/0.0.tar.gz pumpkin-osx/0.0.tar.bz2 |
initial osx portosx/0.0
Signed-off-by: Michael Krelin <hacker@klever.net>
41 files changed, 8718 insertions, 0 deletions
diff --git a/pumpkin/ARequest.h b/pumpkin/ARequest.h new file mode 100644 index 0000000..232dcf8 --- a/dev/null +++ b/pumpkin/ARequest.h @@ -0,0 +1,47 @@ +#import <Cocoa/Cocoa.h> + +@interface ARequest : NSWindowController { + BOOL requestIsGet; + + CFHostRef cfhost; + + NSString *localFile; + NSString *remoteHost; + NSNumber *remotePort; + NSString *remoteFile; + NSString *xferType; + NSNumber *blockSize; + NSNumber *timeout; + + NSTextField *remoteHostBox; + BOOL doTouchMe; + NSString *statusLabel; + NSString *errorLabel; +} + +@property BOOL requestIsGet; +@property BOOL doTouchMe; +@property (copy) NSString *statusLabel; +@property (copy) NSString *errorLabel; + +@property (copy) NSString *localFile; +@property (copy) NSString *remoteHost; +@property (copy) NSNumber *remotePort; +@property (copy) NSString *remoteFile; +@property (copy) NSString *xferType; +@property (copy) NSNumber *blockSize; +@property (copy) NSNumber *timeout; + +@property (assign) IBOutlet NSTextField *remoteHostBox; + +- (IBAction)startXfer:(id)sender; +- (IBAction)pickFile:(id)sender; + +-(void)hostCallbackWithHost:(CFHostRef)h info:(CFHostInfoType)hi andError:(const CFStreamError*)e; + ++(void)getFile; ++(void)putFile; + +-(ARequest*)initWithGet:(BOOL)gr; + +@end diff --git a/pumpkin/ARequest.m b/pumpkin/ARequest.m new file mode 100644 index 0000000..439366e --- a/dev/null +++ b/pumpkin/ARequest.m @@ -0,0 +1,184 @@ + +#import "pumpkin.h" +#import "ARequest.h" +#import "ReceiveXFer.h" +#import "SendXFer.h" + +static void cbHost(CFHostRef h,CFHostInfoType hi,const CFStreamError *e,void *i) { + [(ARequest*)i hostCallbackWithHost:h info:hi andError:e]; +} + + +@implementation ARequest +@synthesize requestIsGet; +@synthesize doTouchMe; +@synthesize statusLabel; +@synthesize errorLabel; + +@synthesize localFile; +@synthesize remoteHost; +@synthesize remotePort; +@synthesize remoteFile; +@synthesize xferType; +@synthesize blockSize; +@synthesize timeout; + +@synthesize remoteHostBox; + +-(void)unhost { + if(!cfhost) return; + CFHostCancelInfoResolution(cfhost, kCFHostAddresses); + CFHostUnscheduleFromRunLoop(cfhost, CFRunLoopGetCurrent(), kCFRunLoopDefaultMode); + CFRelease(cfhost); + cfhost = nil; +} +-(void)loadDefaults { + id d = [NSUserDefaultsController.sharedUserDefaultsController values]; + self.remotePort = [d valueForKey:@"remotePort"]; + self.blockSize = [d valueForKey:@"blockSize"]; + self.xferType = [d valueForKey:@"xferType"]; + self.remoteHost = [d valueForKey:@"remoteHost"]; + self.timeout = [d valueForKey:@"timeout"]; + + self.localFile = [[d valueForKey:@"tftpRoot"] stringByAppendingString:@"/"]; +} +-(void)saveDefaults { + NSUserDefaultsController *dc = [NSUserDefaultsController sharedUserDefaultsController]; + id d = dc.values; + [d setValue:self.remotePort forKey:@"remotePort"]; + [d setValue:self.remoteHost forKey:@"remoteHost"]; + [d setValue:self.blockSize forKey:@"blockSize"]; + [d setValue:self.xferType forKey:@"xferType"]; + [d setValue:self.timeout forKey:@"timeout"]; + [dc save:self]; +} + + +- (IBAction)startXfer:(id)sender { + if(!(cfhost = CFHostCreateWithName(kCFAllocatorDefault, (CFStringRef)remoteHost))) { + self.errorLabel = @"failed to even try to resolve."; + return; + } + struct CFHostClientContext hc; + hc.version=0; hc.info=self; hc.retain=0;hc.release=0; + hc.copyDescription=0; + CFHostSetClient(cfhost, cbHost, &hc); + CFHostScheduleWithRunLoop(cfhost, CFRunLoopGetCurrent(), kCFRunLoopDefaultMode); + CFStreamError e; + if(!CFHostStartInfoResolution(cfhost, kCFHostAddresses, &e)) { + self.errorLabel = @"failed to start host resolution."; + [self unhost]; + return; + } + self.statusLabel = @"resolving remote host…"; + self.doTouchMe = NO; +} + +-(void)hostCallbackWithHost:(CFHostRef)h info:(CFHostInfoType)hi andError:(const CFStreamError *)e { + NSString *el = nil; + CFArrayRef aa = nil; + __block struct sockaddr_in peer; + do { + if(e && (e->domain || e->error)) { + el=@"failed to resolve remote address"; break; + } + Boolean hbr; + aa = CFHostGetAddressing(cfhost, &hbr); + if(!(hbr && aa && CFArrayGetCount(aa))) { + el=@"failed to find remote address"; break; + } + peer.sin_addr.s_addr=INADDR_NONE; [(NSArray*)aa enumerateObjectsUsingBlock:^(NSData *o,NSUInteger i,BOOL *s) { + const struct sockaddr_in *sin = o.bytes; + if(sin->sin_family!=AF_INET) return; + memmove(&peer,sin,sizeof(peer)); + *s = YES; + }]; + if(peer.sin_addr.s_addr==INADDR_NONE) { + el=@"found no ipv4 address"; break; + } + peer.sin_port = htons([remotePort unsignedIntValue]); + }while(false); + [self unhost]; + if(el) { + self.errorLabel = el; self.doTouchMe = YES; return; + } + [self saveDefaults]; + [[[requestIsGet?ReceiveXFer.class:SendXFer.class alloc] + initWithLocalFile:localFile peerAddress:&peer remoteFile:remoteFile xferType:xferType blockSize:blockSize.unsignedIntValue andTimeout:timeout.intValue] + autorelease]; + [self.window performClose:nil]; +} + +- (IBAction)pickFile:(id)sender { + NSSavePanel *p = nil; + if(requestIsGet) { + p = [NSSavePanel savePanel]; + p.canCreateDirectories = YES; + }else{ + NSOpenPanel *pp = [NSOpenPanel openPanel]; + pp.canChooseDirectories = NO; + pp.canChooseFiles = YES; + pp.allowsMultipleSelection = NO; + p = pp; + } + p.prompt = @"Pick the local file"; + if([p runModal]!=NSFileHandlingPanelOKButton) return; + self.localFile = p.URL.path; +} + +- (ARequest*) initWithGet:(BOOL)gr { + if(!(self = [super initWithWindowNibName:@"ARequest"])) return self; + self.doTouchMe = YES; + cfhost = nil; + requestIsGet = gr; + if(requestIsGet) { + self.window.title = @"Get file from remote TFTP server"; + self.window.initialFirstResponder = remoteHostBox; + }else{ + self.window.title = @"Put file to remote TFTP server"; + } + [self loadDefaults]; + [self addObserver:self forKeyPath:@"localFile" options:0 context:0]; + [self addObserver:self forKeyPath:@"remoteFile" options:0 context:0]; + return [self retain]; +} +-(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context { + if(requestIsGet) { + if([keyPath isEqualToString:@"remoteFile"]) { + if(self.remoteFile.length) { + self.localFile= [([self.localFile hasSuffix:@"/"] + ?self.localFile + :[self.localFile stringByDeletingLastPathComponent]) + stringByAppendingPathComponent:self.remoteFile.lastPathComponent]; + }else + self.localFile=[[self.localFile stringByDeletingLastPathComponent] stringByAppendingString:@"/"]; + } + }else{ + if([keyPath isEqualToString:@"localFile"]) { + self.remoteFile=[self.localFile hasSuffix:@"/"] + ?@"":self.localFile.lastPathComponent; + } + } +} + ++ (ARequest*) aRequestWithGet:(BOOL)gr { + return [[[ARequest alloc] initWithGet:gr] autorelease]; +} + +static void popMeUp(BOOL g) { + [[ARequest aRequestWithGet:g].window makeKeyAndOrderFront:nil]; +} ++ (void)getFile { popMeUp(YES); } ++ (void)putFile { popMeUp(NO); } + +- (void)windowDidLoad { +} + +- (void)windowWillClose:(NSNotification*)n { + [self unhost]; + [self removeObserver:self forKeyPath:@"localFile" context:0]; + [self removeObserver:self forKeyPath:@"remoteFile" context:0]; + [self release]; +} + +@end diff --git a/pumpkin/ARequest.xib b/pumpkin/ARequest.xib new file mode 100644 index 0000000..5a85dcf --- a/dev/null +++ b/pumpkin/ARequest.xib @@ -0,0 +1,1790 @@ +<?xml version="1.0" encoding="UTF-8"?> +<archive type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="7.10"> + <data> + <int key="IBDocument.SystemTarget">1080</int> + <string key="IBDocument.SystemVersion">12C60</string> + <string key="IBDocument.InterfaceBuilderVersion">2844</string> + <string key="IBDocument.AppKitVersion">1187.34</string> + <string key="IBDocument.HIToolboxVersion">625.00</string> + <object class="NSMutableDictionary" key="IBDocument.PluginVersions"> + <string key="NS.key.0">com.apple.InterfaceBuilder.CocoaPlugin</string> + <string key="NS.object.0">2844</string> + </object> + <object class="NSArray" key="IBDocument.IntegratedClassDependencies"> + <bool key="EncodedWithXMLCoder">YES</bool> + <string>NSButton</string> + <string>NSButtonCell</string> + <string>NSComboBox</string> + <string>NSComboBoxCell</string> + <string>NSCustomObject</string> + <string>NSProgressIndicator</string> + <string>NSTextField</string> + <string>NSTextFieldCell</string> + <string>NSUserDefaultsController</string> + <string>NSView</string> + <string>NSWindowTemplate</string> + </object> + <object class="NSArray" key="IBDocument.PluginDependencies"> + <bool key="EncodedWithXMLCoder">YES</bool> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + </object> + <object class="NSMutableDictionary" key="IBDocument.Metadata"> + <string key="NS.key.0">PluginDependencyRecalculationVersion</string> + <integer value="1" key="NS.object.0"/> + </object> + <object class="NSMutableArray" key="IBDocument.RootObjects" id="1000"> + <bool key="EncodedWithXMLCoder">YES</bool> + <object class="NSCustomObject" id="1001"> + <string key="NSClassName">ARequest</string> + </object> + <object class="NSCustomObject" id="1003"> + <string key="NSClassName">FirstResponder</string> + </object> + <object class="NSCustomObject" id="1004"> + <string key="NSClassName">NSApplication</string> + </object> + <object class="NSWindowTemplate" id="265268434"> + <int key="NSWindowStyleMask">3</int> + <int key="NSWindowBacking">2</int> + <string key="NSWindowRect">{{131, 159}, {553, 185}}</string> + <int key="NSWTFlags">611845120</int> + <string key="NSWindowTitle">PumpKIN request</string> + <string key="NSWindowClass">NSWindow</string> + <nil key="NSViewClass"/> + <nil key="NSUserInterfaceItemIdentifier"/> + <object class="NSView" key="NSWindowView" id="537034939"> + <reference key="NSNextResponder"/> + <int key="NSvFlags">256</int> + <object class="NSMutableArray" key="NSSubviews"> + <bool key="EncodedWithXMLCoder">YES</bool> + <object class="NSTextField" id="983573643"> + <reference key="NSNextResponder" ref="537034939"/> + <int key="NSvFlags">268</int> + <string key="NSFrame">{{45, 145}, {65, 17}}</string> + <reference key="NSSuperview" ref="537034939"/> + <reference key="NSWindow"/> + <reference key="NSNextKeyView" ref="392834772"/> + <string key="NSReuseIdentifierKey">_NS:3936</string> + <bool key="NSEnabled">YES</bool> + <object class="NSTextFieldCell" key="NSCell" id="85931455"> + <int key="NSCellFlags">68157504</int> + <int key="NSCellFlags2">272630784</int> + <string key="NSContents">Local file:</string> + <object class="NSFont" key="NSSupport" id="870520972"> + <string key="NSName">LucidaGrande</string> + <double key="NSSize">13</double> + <int key="NSfFlags">1044</int> + </object> + <string key="NSCellIdentifier">_NS:3936</string> + <reference key="NSControlView" ref="983573643"/> + <object class="NSColor" key="NSBackgroundColor" id="462322918"> + <int key="NSColorSpace">6</int> + <string key="NSCatalogName">System</string> + <string key="NSColorName">controlColor</string> + <object class="NSColor" key="NSColor" id="51768974"> + <int key="NSColorSpace">3</int> + <bytes key="NSWhite">MC42NjY2NjY2NjY3AA</bytes> + </object> + </object> + <object class="NSColor" key="NSTextColor" id="374908237"> + <int key="NSColorSpace">6</int> + <string key="NSCatalogName">System</string> + <string key="NSColorName">controlTextColor</string> + <object class="NSColor" key="NSColor" id="1058998983"> + <int key="NSColorSpace">3</int> + <bytes key="NSWhite">MAA</bytes> + </object> + </object> + </object> + <bool key="NSAllowsLogicalLayoutDirection">NO</bool> + </object> + <object class="NSTextField" id="392834772"> + <reference key="NSNextResponder" ref="537034939"/> + <int key="NSvFlags">270</int> + <string key="NSFrame">{{115, 143}, {349, 22}}</string> + <reference key="NSSuperview" ref="537034939"/> + <reference key="NSWindow"/> + <reference key="NSNextKeyView" ref="176529531"/> + <string key="NSReuseIdentifierKey">_NS:248</string> + <bool key="NSEnabled">YES</bool> + <object class="NSTextFieldCell" key="NSCell" id="47222242"> + <int key="NSCellFlags">-1804599231</int> + <int key="NSCellFlags2">272630784</int> + <string key="NSContents"/> + <reference key="NSSupport" ref="870520972"/> + <string key="NSCellIdentifier">_NS:248</string> + <reference key="NSControlView" ref="392834772"/> + <bool key="NSDrawsBackground">YES</bool> + <object class="NSColor" key="NSBackgroundColor" id="970286794"> + <int key="NSColorSpace">6</int> + <string key="NSCatalogName">System</string> + <string key="NSColorName">textBackgroundColor</string> + <object class="NSColor" key="NSColor" id="232866438"> + <int key="NSColorSpace">3</int> + <bytes key="NSWhite">MQA</bytes> + </object> + </object> + <object class="NSColor" key="NSTextColor" id="95498365"> + <int key="NSColorSpace">6</int> + <string key="NSCatalogName">System</string> + <string key="NSColorName">textColor</string> + <reference key="NSColor" ref="1058998983"/> + </object> + </object> + <bool key="NSAllowsLogicalLayoutDirection">NO</bool> + </object> + <object class="NSButton" id="176529531"> + <reference key="NSNextResponder" ref="537034939"/> + <int key="NSvFlags">265</int> + <string key="NSFrame">{{472, 144}, {56, 19}}</string> + <reference key="NSSuperview" ref="537034939"/> + <reference key="NSWindow"/> + <reference key="NSNextKeyView" ref="712275833"/> + <string key="NSReuseIdentifierKey">_NS:1491</string> + <bool key="NSEnabled">YES</bool> + <object class="NSButtonCell" key="NSCell" id="827794247"> + <int key="NSCellFlags">67108864</int> + <int key="NSCellFlags2">134217728</int> + <string key="NSContents">Browse</string> + <object class="NSFont" key="NSSupport"> + <string key="NSName">LucidaGrande</string> + <double key="NSSize">12</double> + <int key="NSfFlags">4883</int> + </object> + <string key="NSCellIdentifier">_NS:1491</string> + <reference key="NSControlView" ref="176529531"/> + <int key="NSButtonFlags">-2033434624</int> + <int key="NSButtonFlags2">164</int> + <string key="NSAlternateContents"/> + <string key="NSKeyEquivalent"/> + <int key="NSPeriodicDelay">400</int> + <int key="NSPeriodicInterval">75</int> + </object> + <bool key="NSAllowsLogicalLayoutDirection">NO</bool> + </object> + <object class="NSTextField" id="712275833"> + <reference key="NSNextResponder" ref="537034939"/> + <int key="NSvFlags">268</int> + <string key="NSFrame">{{22, 115}, {88, 17}}</string> + <reference key="NSSuperview" ref="537034939"/> + <reference key="NSWindow"/> + <reference key="NSNextKeyView" ref="23478474"/> + <string key="NSReuseIdentifierKey">_NS:3936</string> + <bool key="NSEnabled">YES</bool> + <object class="NSTextFieldCell" key="NSCell" id="931249278"> + <int key="NSCellFlags">68157504</int> + <int key="NSCellFlags2">272630784</int> + <string key="NSContents">Remote host:</string> + <reference key="NSSupport" ref="870520972"/> + <string key="NSCellIdentifier">_NS:3936</string> + <reference key="NSControlView" ref="712275833"/> + <reference key="NSBackgroundColor" ref="462322918"/> + <reference key="NSTextColor" ref="374908237"/> + </object> + <bool key="NSAllowsLogicalLayoutDirection">NO</bool> + </object> + <object class="NSTextField" id="23478474"> + <reference key="NSNextResponder" ref="537034939"/> + <int key="NSvFlags">268</int> + <string key="NSFrame">{{115, 113}, {146, 22}}</string> + <reference key="NSSuperview" ref="537034939"/> + <reference key="NSWindow"/> + <reference key="NSNextKeyView" ref="525390780"/> + <string key="NSReuseIdentifierKey">_NS:248</string> + <bool key="NSEnabled">YES</bool> + <object class="NSTextFieldCell" key="NSCell" id="241562469"> + <int key="NSCellFlags">-1804599231</int> + <int key="NSCellFlags2">272630784</int> + <string key="NSContents"/> + <reference key="NSSupport" ref="870520972"/> + <string key="NSCellIdentifier">_NS:248</string> + <reference key="NSControlView" ref="23478474"/> + <bool key="NSDrawsBackground">YES</bool> + <reference key="NSBackgroundColor" ref="970286794"/> + <reference key="NSTextColor" ref="95498365"/> + </object> + <bool key="NSAllowsLogicalLayoutDirection">NO</bool> + </object> + <object class="NSTextField" id="525390780"> + <reference key="NSNextResponder" ref="537034939"/> + <int key="NSvFlags">268</int> + <string key="NSFrame">{{266, 116}, {35, 17}}</string> + <reference key="NSSuperview" ref="537034939"/> + <reference key="NSWindow"/> + <reference key="NSNextKeyView" ref="471811034"/> + <string key="NSReuseIdentifierKey">_NS:3936</string> + <bool key="NSEnabled">YES</bool> + <object class="NSTextFieldCell" key="NSCell" id="637728381"> + <int key="NSCellFlags">68157504</int> + <int key="NSCellFlags2">272630784</int> + <string key="NSContents">port:</string> + <reference key="NSSupport" ref="870520972"/> + <string key="NSCellIdentifier">_NS:3936</string> + <reference key="NSControlView" ref="525390780"/> + <reference key="NSBackgroundColor" ref="462322918"/> + <reference key="NSTextColor" ref="374908237"/> + </object> + <bool key="NSAllowsLogicalLayoutDirection">NO</bool> + </object> + <object class="NSTextField" id="471811034"> + <reference key="NSNextResponder" ref="537034939"/> + <int key="NSvFlags">268</int> + <string key="NSFrame">{{306, 113}, {71, 22}}</string> + <reference key="NSSuperview" ref="537034939"/> + <reference key="NSWindow"/> + <reference key="NSNextKeyView" ref="656785083"/> + <string key="NSReuseIdentifierKey">_NS:248</string> + <bool key="NSEnabled">YES</bool> + <object class="NSTextFieldCell" key="NSCell" id="35095251"> + <int key="NSCellFlags">-1804599231</int> + <int key="NSCellFlags2">272630784</int> + <string key="NSContents"/> + <reference key="NSSupport" ref="870520972"/> + <string key="NSCellIdentifier">_NS:248</string> + <reference key="NSControlView" ref="471811034"/> + <bool key="NSDrawsBackground">YES</bool> + <reference key="NSBackgroundColor" ref="970286794"/> + <reference key="NSTextColor" ref="95498365"/> + </object> + <bool key="NSAllowsLogicalLayoutDirection">NO</bool> + </object> + <object class="NSTextField" id="656785083"> + <reference key="NSNextResponder" ref="537034939"/> + <int key="NSvFlags">268</int> + <string key="NSFrame">{{380, 115}, {28, 17}}</string> + <reference key="NSSuperview" ref="537034939"/> + <reference key="NSWindow"/> + <reference key="NSNextKeyView" ref="685519878"/> + <string key="NSReuseIdentifierKey">_NS:3936</string> + <bool key="NSEnabled">YES</bool> + <object class="NSTextFieldCell" key="NSCell" id="114681340"> + <int key="NSCellFlags">68157504</int> + <int key="NSCellFlags2">272630784</int> + <string key="NSContents">file:</string> + <reference key="NSSupport" ref="870520972"/> + <string key="NSCellIdentifier">_NS:3936</string> + <reference key="NSControlView" ref="656785083"/> + <reference key="NSBackgroundColor" ref="462322918"/> + <reference key="NSTextColor" ref="374908237"/> + </object> + <bool key="NSAllowsLogicalLayoutDirection">NO</bool> + </object> + <object class="NSTextField" id="685519878"> + <reference key="NSNextResponder" ref="537034939"/> + <int key="NSvFlags">268</int> + <string key="NSFrame">{{413, 113}, {120, 22}}</string> + <reference key="NSSuperview" ref="537034939"/> + <reference key="NSWindow"/> + <reference key="NSNextKeyView" ref="1027449834"/> + <string key="NSReuseIdentifierKey">_NS:248</string> + <bool key="NSEnabled">YES</bool> + <object class="NSTextFieldCell" key="NSCell" id="983145747"> + <int key="NSCellFlags">-1804599231</int> + <int key="NSCellFlags2">272630784</int> + <string key="NSContents"/> + <reference key="NSSupport" ref="870520972"/> + <string key="NSCellIdentifier">_NS:248</string> + <reference key="NSControlView" ref="685519878"/> + <bool key="NSDrawsBackground">YES</bool> + <reference key="NSBackgroundColor" ref="970286794"/> + <reference key="NSTextColor" ref="95498365"/> + </object> + <bool key="NSAllowsLogicalLayoutDirection">NO</bool> + </object> + <object class="NSTextField" id="1027449834"> + <reference key="NSNextResponder" ref="537034939"/> + <int key="NSvFlags">268</int> + <string key="NSFrame">{{17, 83}, {93, 17}}</string> + <reference key="NSSuperview" ref="537034939"/> + <reference key="NSWindow"/> + <reference key="NSNextKeyView" ref="1029217440"/> + <string key="NSReuseIdentifierKey">_NS:3936</string> + <bool key="NSEnabled">YES</bool> + <object class="NSTextFieldCell" key="NSCell" id="977543267"> + <int key="NSCellFlags">68157504</int> + <int key="NSCellFlags2">272630784</int> + <string key="NSContents">Transfer type:</string> + <reference key="NSSupport" ref="870520972"/> + <string key="NSCellIdentifier">_NS:3936</string> + <reference key="NSControlView" ref="1027449834"/> + <reference key="NSBackgroundColor" ref="462322918"/> + <reference key="NSTextColor" ref="374908237"/> + </object> + <bool key="NSAllowsLogicalLayoutDirection">NO</bool> + </object> + <object class="NSComboBox" id="1029217440"> + <reference key="NSNextResponder" ref="537034939"/> + <int key="NSvFlags">268</int> + <string key="NSFrame">{{115, 79}, {99, 26}}</string> + <reference key="NSSuperview" ref="537034939"/> + <reference key="NSWindow"/> + <reference key="NSNextKeyView" ref="213673854"/> + <string key="NSReuseIdentifierKey">_NS:66</string> + <bool key="NSEnabled">YES</bool> + <object class="NSComboBoxCell" key="NSCell" id="567568844"> + <int key="NSCellFlags">342884416</int> + <int key="NSCellFlags2">272630784</int> + <string key="NSContents"/> + <reference key="NSSupport" ref="870520972"/> + <string key="NSCellIdentifier">_NS:66</string> + <reference key="NSControlView" ref="1029217440"/> + <bool key="NSDrawsBackground">YES</bool> + <reference key="NSBackgroundColor" ref="970286794"/> + <reference key="NSTextColor" ref="374908237"/> + <int key="NSVisibleItemCount">2</int> + <bool key="NSHasVerticalScroller">YES</bool> + <bool key="NSCompletes">YES</bool> + <object class="NSMutableArray" key="NSPopUpListData"> + <bool key="EncodedWithXMLCoder">YES</bool> + <string>octet</string> + <string>netascii</string> + </object> + <reference key="NSDelegate" ref="1029217440"/> + <object class="NSComboTableView" key="NSTableView" id="681272190"> + <reference key="NSNextResponder"/> + <int key="NSvFlags">274</int> + <string key="NSFrameSize">{13, 42}</string> + <reference key="NSSuperview"/> + <reference key="NSWindow"/> + <string key="NSReuseIdentifierKey">_NS:108</string> + <bool key="NSEnabled">YES</bool> + <bool key="NSAllowsLogicalLayoutDirection">NO</bool> + <bool key="NSControlAllowsExpansionToolTips">YES</bool> + <object class="NSMutableArray" key="NSTableColumns"> + <bool key="EncodedWithXMLCoder">YES</bool> + <object class="NSTableColumn"> + <double key="NSWidth">10</double> + <double key="NSMinWidth">10</double> + <double key="NSMaxWidth">1000</double> + <object class="NSTableHeaderCell" key="NSHeaderCell"> + <int key="NSCellFlags">75497472</int> + <int key="NSCellFlags2">0</int> + <string key="NSContents"/> + <object class="NSFont" key="NSSupport" id="110565960"> + <string key="NSName">LucidaGrande</string> + <double key="NSSize">12</double> + <int key="NSfFlags">16</int> + </object> + <object class="NSColor" key="NSBackgroundColor"> + <int key="NSColorSpace">3</int> + <bytes key="NSWhite">MC4zMzMzMzI5ODU2AA</bytes> + </object> + <reference key="NSTextColor" ref="232866438"/> + </object> + <object class="NSTextFieldCell" key="NSDataCell"> + <int key="NSCellFlags">338690112</int> + <int key="NSCellFlags2">1024</int> + <reference key="NSSupport" ref="870520972"/> + <reference key="NSControlView" ref="681272190"/> + <bool key="NSDrawsBackground">YES</bool> + <object class="NSColor" key="NSBackgroundColor" id="240142953"> + <int key="NSColorSpace">6</int> + <string key="NSCatalogName">System</string> + <string key="NSColorName">controlBackgroundColor</string> + <reference key="NSColor" ref="51768974"/> + </object> + <reference key="NSTextColor" ref="374908237"/> + </object> + <int key="NSResizingMask">3</int> + <bool key="NSIsResizeable">YES</bool> + <reference key="NSTableView" ref="681272190"/> + </object> + </object> + <double key="NSIntercellSpacingWidth">3</double> + <double key="NSIntercellSpacingHeight">2</double> + <reference key="NSBackgroundColor" ref="240142953"/> + <object class="NSColor" key="NSGridColor" id="524577992"> + <int key="NSColorSpace">6</int> + <string key="NSCatalogName">System</string> + <string key="NSColorName">gridColor</string> + <object class="NSColor" key="NSColor"> + <int key="NSColorSpace">3</int> + <bytes key="NSWhite">MC41AA</bytes> + </object> + </object> + <double key="NSRowHeight">19</double> + <string key="NSAction">tableViewAction:</string> + <int key="NSTvFlags">-765427712</int> + <reference key="NSDelegate" ref="567568844"/> + <reference key="NSDataSource" ref="567568844"/> + <reference key="NSTarget" ref="567568844"/> + <int key="NSColumnAutoresizingStyle">1</int> + <int key="NSDraggingSourceMaskForLocal">15</int> + <int key="NSDraggingSourceMaskForNonLocal">0</int> + <bool key="NSAllowsTypeSelect">YES</bool> + <int key="NSTableViewDraggingDestinationStyle">0</int> + <int key="NSTableViewGroupRowStyle">1</int> + </object> + </object> + <bool key="NSAllowsLogicalLayoutDirection">NO</bool> + </object> + <object class="NSTextField" id="291839274"> + <reference key="NSNextResponder" ref="537034939"/> + <int key="NSvFlags">268</int> + <string key="NSFrame">{{39, 53}, {71, 17}}</string> + <reference key="NSSuperview" ref="537034939"/> + <reference key="NSWindow"/> + <reference key="NSNextKeyView" ref="183069999"/> + <string key="NSReuseIdentifierKey">_NS:3936</string> + <bool key="NSEnabled">YES</bool> + <object class="NSTextFieldCell" key="NSCell" id="61967082"> + <int key="NSCellFlags">68157504</int> + <int key="NSCellFlags2">272630784</int> + <string key="NSContents">Block size:</string> + <reference key="NSSupport" ref="870520972"/> + <string key="NSCellIdentifier">_NS:3936</string> + <reference key="NSControlView" ref="291839274"/> + <reference key="NSBackgroundColor" ref="462322918"/> + <reference key="NSTextColor" ref="374908237"/> + </object> + <bool key="NSAllowsLogicalLayoutDirection">NO</bool> + </object> + <object class="NSComboBox" id="183069999"> + <reference key="NSNextResponder" ref="537034939"/> + <int key="NSvFlags">268</int> + <string key="NSFrame">{{115, 49}, {99, 26}}</string> + <reference key="NSSuperview" ref="537034939"/> + <reference key="NSWindow"/> + <reference key="NSNextKeyView" ref="1053800845"/> + <string key="NSReuseIdentifierKey">_NS:66</string> + <bool key="NSEnabled">YES</bool> + <object class="NSComboBoxCell" key="NSCell" id="418627588"> + <int key="NSCellFlags">342884416</int> + <int key="NSCellFlags2">272630784</int> + <string key="NSContents"/> + <reference key="NSSupport" ref="870520972"/> + <string key="NSCellIdentifier">_NS:66</string> + <reference key="NSControlView" ref="183069999"/> + <bool key="NSDrawsBackground">YES</bool> + <reference key="NSBackgroundColor" ref="970286794"/> + <reference key="NSTextColor" ref="374908237"/> + <int key="NSVisibleItemCount">5</int> + <bool key="NSHasVerticalScroller">YES</bool> + <object class="NSMutableArray" key="NSPopUpListData"> + <bool key="EncodedWithXMLCoder">YES</bool> + <string>512</string> + <string>1024</string> + <string>2048</string> + <string>4096</string> + </object> + <reference key="NSDelegate" ref="183069999"/> + <object class="NSComboTableView" key="NSTableView" id="597366878"> + <reference key="NSNextResponder"/> + <int key="NSvFlags">274</int> + <string key="NSFrameSize">{13, 84}</string> + <reference key="NSSuperview"/> + <reference key="NSWindow"/> + <string key="NSReuseIdentifierKey">_NS:108</string> + <bool key="NSEnabled">YES</bool> + <bool key="NSAllowsLogicalLayoutDirection">NO</bool> + <bool key="NSControlAllowsExpansionToolTips">YES</bool> + <object class="NSMutableArray" key="NSTableColumns"> + <bool key="EncodedWithXMLCoder">YES</bool> + <object class="NSTableColumn"> + <double key="NSWidth">10</double> + <double key="NSMinWidth">10</double> + <double key="NSMaxWidth">1000</double> + <object class="NSTableHeaderCell" key="NSHeaderCell"> + <int key="NSCellFlags">75497472</int> + <int key="NSCellFlags2">0</int> + <string key="NSContents"/> + <reference key="NSSupport" ref="110565960"/> + <object class="NSColor" key="NSBackgroundColor"> + <int key="NSColorSpace">3</int> + <bytes key="NSWhite">MC4zMzMzMzI5ODU2AA</bytes> + </object> + <reference key="NSTextColor" ref="232866438"/> + </object> + <object class="NSTextFieldCell" key="NSDataCell"> + <int key="NSCellFlags">338690112</int> + <int key="NSCellFlags2">1024</int> + <reference key="NSSupport" ref="870520972"/> + <reference key="NSControlView" ref="597366878"/> + <bool key="NSDrawsBackground">YES</bool> + <reference key="NSBackgroundColor" ref="240142953"/> + <reference key="NSTextColor" ref="374908237"/> + </object> + <int key="NSResizingMask">3</int> + <bool key="NSIsResizeable">YES</bool> + <reference key="NSTableView" ref="597366878"/> + </object> + </object> + <double key="NSIntercellSpacingWidth">3</double> + <double key="NSIntercellSpacingHeight">2</double> + <reference key="NSBackgroundColor" ref="240142953"/> + <reference key="NSGridColor" ref="524577992"/> + <double key="NSRowHeight">19</double> + <string key="NSAction">tableViewAction:</string> + <int key="NSTvFlags">-765427712</int> + <reference key="NSDelegate" ref="418627588"/> + <reference key="NSDataSource" ref="418627588"/> + <reference key="NSTarget" ref="418627588"/> + <int key="NSColumnAutoresizingStyle">1</int> + <int key="NSDraggingSourceMaskForLocal">15</int> + <int key="NSDraggingSourceMaskForNonLocal">0</int> + <bool key="NSAllowsTypeSelect">YES</bool> + <int key="NSTableViewDraggingDestinationStyle">0</int> + <int key="NSTableViewGroupRowStyle">1</int> + </object> + </object> + <bool key="NSAllowsLogicalLayoutDirection">NO</bool> + </object> + <object class="NSTextField" id="138314969"> + <reference key="NSNextResponder" ref="537034939"/> + <int key="NSvFlags">268</int> + <string key="NSFrame">{{49, 23}, {61, 17}}</string> + <reference key="NSSuperview" ref="537034939"/> + <reference key="NSWindow"/> + <reference key="NSNextKeyView" ref="720108113"/> + <string key="NSReuseIdentifierKey">_NS:3936</string> + <bool key="NSEnabled">YES</bool> + <object class="NSTextFieldCell" key="NSCell" id="849261570"> + <int key="NSCellFlags">68157504</int> + <int key="NSCellFlags2">272630784</int> + <string key="NSContents">Timeout:</string> + <reference key="NSSupport" ref="870520972"/> + <string key="NSCellIdentifier">_NS:3936</string> + <reference key="NSControlView" ref="138314969"/> + <reference key="NSBackgroundColor" ref="462322918"/> + <reference key="NSTextColor" ref="374908237"/> + </object> + <bool key="NSAllowsLogicalLayoutDirection">NO</bool> + </object> + <object class="NSTextField" id="720108113"> + <reference key="NSNextResponder" ref="537034939"/> + <int key="NSvFlags">268</int> + <string key="NSFrame">{{115, 20}, {96, 22}}</string> + <reference key="NSSuperview" ref="537034939"/> + <reference key="NSWindow"/> + <string key="NSReuseIdentifierKey">_NS:248</string> + <bool key="NSEnabled">YES</bool> + <object class="NSTextFieldCell" key="NSCell" id="966502450"> + <int key="NSCellFlags">-1804599231</int> + <int key="NSCellFlags2">272630784</int> + <string key="NSContents"/> + <reference key="NSSupport" ref="870520972"/> + <string key="NSCellIdentifier">_NS:248</string> + <reference key="NSControlView" ref="720108113"/> + <bool key="NSDrawsBackground">YES</bool> + <reference key="NSBackgroundColor" ref="970286794"/> + <reference key="NSTextColor" ref="95498365"/> + </object> + <bool key="NSAllowsLogicalLayoutDirection">NO</bool> + </object> + <object class="NSButton" id="1053800845"> + <reference key="NSNextResponder" ref="537034939"/> + <int key="NSvFlags">268</int> + <string key="NSFrame">{{238, 45}, {178, 32}}</string> + <reference key="NSSuperview" ref="537034939"/> + <reference key="NSWindow"/> + <reference key="NSNextKeyView" ref="1061611931"/> + <string key="NSReuseIdentifierKey">_NS:161</string> + <bool key="NSEnabled">YES</bool> + <object class="NSButtonCell" key="NSCell" id="673387987"> + <int key="NSCellFlags">67108864</int> + <int key="NSCellFlags2">134217728</int> + <string key="NSContents">I've changed my mind</string> + <reference key="NSSupport" ref="870520972"/> + <string key="NSCellIdentifier">_NS:161</string> + <reference key="NSControlView" ref="1053800845"/> + <int key="NSButtonFlags">-2038284288</int> + <int key="NSButtonFlags2">129</int> + <string key="NSAlternateContents"/> + <string key="NSKeyEquivalent"/> + <int key="NSPeriodicDelay">200</int> + <int key="NSPeriodicInterval">25</int> + </object> + <bool key="NSAllowsLogicalLayoutDirection">NO</bool> + </object> + <object class="NSButton" id="1061611931"> + <reference key="NSNextResponder" ref="537034939"/> + <int key="NSvFlags">268</int> + <string key="NSFrame">{{416, 45}, {123, 32}}</string> + <reference key="NSSuperview" ref="537034939"/> + <reference key="NSWindow"/> + <reference key="NSNextKeyView" ref="138314969"/> + <string key="NSReuseIdentifierKey">_NS:161</string> + <bool key="NSEnabled">YES</bool> + <object class="NSButtonCell" key="NSCell" id="608238510"> + <int key="NSCellFlags">67108864</int> + <int key="NSCellFlags2">134217728</int> + <string key="NSContents">Start transfer</string> + <reference key="NSSupport" ref="870520972"/> + <string key="NSCellIdentifier">_NS:161</string> + <reference key="NSControlView" ref="1061611931"/> + <int key="NSButtonFlags">-2038284288</int> + <int key="NSButtonFlags2">129</int> + <reference key="NSAlternateImage" ref="870520972"/> + <string key="NSAlternateContents"/> + <string type="base64-UTF8" key="NSKeyEquivalent">DQ</string> + <int key="NSPeriodicDelay">200</int> + <int key="NSPeriodicInterval">25</int> + </object> + <bool key="NSAllowsLogicalLayoutDirection">NO</bool> + </object> + <object class="NSProgressIndicator" id="53446878"> + <reference key="NSNextResponder" ref="537034939"/> + <int key="NSvFlags">1292</int> + <string key="NSFrame">{{244, 83}, {16, 16}}</string> + <reference key="NSSuperview" ref="537034939"/> + <reference key="NSWindow"/> + <reference key="NSNextKeyView" ref="727455678"/> + <string key="NSReuseIdentifierKey">_NS:3954</string> + <int key="NSpiFlags">28938</int> + <double key="NSMaxValue">100</double> + </object> + <object class="NSTextField" id="727455678"> + <reference key="NSNextResponder" ref="537034939"/> + <int key="NSvFlags">268</int> + <string key="NSFrame">{{263, 83}, {273, 17}}</string> + <reference key="NSSuperview" ref="537034939"/> + <reference key="NSWindow"/> + <reference key="NSNextKeyView" ref="291839274"/> + <string key="NSReuseIdentifierKey">_NS:3936</string> + <bool key="NSEnabled">YES</bool> + <object class="NSTextFieldCell" key="NSCell" id="873681103"> + <int key="NSCellFlags">68157504</int> + <int key="NSCellFlags2">272630784</int> + <string key="NSContents">status…</string> + <reference key="NSSupport" ref="870520972"/> + <string key="NSCellIdentifier">_NS:3936</string> + <reference key="NSControlView" ref="727455678"/> + <reference key="NSBackgroundColor" ref="462322918"/> + <reference key="NSTextColor" ref="374908237"/> + </object> + <bool key="NSAllowsLogicalLayoutDirection">NO</bool> + </object> + <object class="NSTextField" id="213673854"> + <reference key="NSNextResponder" ref="537034939"/> + <int key="NSvFlags">268</int> + <string key="NSFrame">{{241, 83}, {295, 17}}</string> + <reference key="NSSuperview" ref="537034939"/> + <reference key="NSWindow"/> + <reference key="NSNextKeyView" ref="53446878"/> + <string key="NSReuseIdentifierKey">_NS:3936</string> + <bool key="NSEnabled">YES</bool> + <object class="NSTextFieldCell" key="NSCell" id="468926987"> + <int key="NSCellFlags">68157504</int> + <int key="NSCellFlags2">272630784</int> + <string key="NSContents"/> + <reference key="NSSupport" ref="870520972"/> + <string key="NSCellIdentifier">_NS:3936</string> + <reference key="NSControlView" ref="213673854"/> + <reference key="NSBackgroundColor" ref="462322918"/> + <object class="NSColor" key="NSTextColor"> + <int key="NSColorSpace">1</int> + <bytes key="NSRGB">MSAwIDAAA</bytes> + </object> + </object> + <bool key="NSAllowsLogicalLayoutDirection">NO</bool> + </object> + </object> + <string key="NSFrameSize">{553, 185}</string> + <reference key="NSSuperview"/> + <reference key="NSWindow"/> + <reference key="NSNextKeyView" ref="983573643"/> + <string key="NSReuseIdentifierKey">_NS:2818</string> + </object> + <string key="NSScreenRect">{{0, 0}, {1440, 878}}</string> + <string key="NSMaxSize">{10000000000000, 10000000000000}</string> + <bool key="NSWindowIsRestorable">YES</bool> + </object> + <object class="NSUserDefaultsController" id="431450128"> + <bool key="NSSharedInstance">YES</bool> + </object> + </object> + <object class="IBObjectContainer" key="IBDocument.Objects"> + <object class="NSMutableArray" key="connectionRecords"> + <bool key="EncodedWithXMLCoder">YES</bool> + <object class="IBConnectionRecord"> + <object class="IBOutletConnection" key="connection"> + <string key="label">window</string> + <reference key="source" ref="1001"/> + <reference key="destination" ref="265268434"/> + </object> + <int key="connectionID">29</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBOutletConnection" key="connection"> + <string key="label">blockSizeBox</string> + <reference key="source" ref="1001"/> + <reference key="destination" ref="183069999"/> + </object> + <int key="connectionID">60</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBOutletConnection" key="connection"> + <string key="label">remoteHostBox</string> + <reference key="source" ref="1001"/> + <reference key="destination" ref="712275833"/> + </object> + <int key="connectionID">129</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBActionConnection" key="connection"> + <string key="label">startXfer:</string> + <reference key="source" ref="1001"/> + <reference key="destination" ref="1061611931"/> + </object> + <int key="connectionID">130</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBActionConnection" key="connection"> + <string key="label">pickFile:</string> + <reference key="source" ref="1001"/> + <reference key="destination" ref="176529531"/> + </object> + <int key="connectionID">131</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBActionConnection" key="connection"> + <string key="label">performClose:</string> + <reference key="source" ref="265268434"/> + <reference key="destination" ref="1053800845"/> + </object> + <int key="connectionID">35</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBOutletConnection" key="connection"> + <string key="label">initialFirstResponder</string> + <reference key="source" ref="265268434"/> + <reference key="destination" ref="392834772"/> + </object> + <int key="connectionID">62</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBOutletConnection" key="connection"> + <string key="label">delegate</string> + <reference key="source" ref="265268434"/> + <reference key="destination" ref="1001"/> + </object> + <int key="connectionID">128</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBBindingConnection" key="connection"> + <string key="label">enabled: self.doTouchMe</string> + <reference key="source" ref="1053800845"/> + <reference key="destination" ref="1001"/> + <object class="NSNibBindingConnector" key="connector"> + <reference key="NSSource" ref="1053800845"/> + <reference key="NSDestination" ref="1001"/> + <string key="NSLabel">enabled: self.doTouchMe</string> + <string key="NSBinding">enabled</string> + <string key="NSKeyPath">self.doTouchMe</string> + <int key="NSNibBindingConnectorVersion">2</int> + </object> + </object> + <int key="connectionID">80</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBBindingConnection" key="connection"> + <string key="label">enabled: self.doTouchMe</string> + <reference key="source" ref="1061611931"/> + <reference key="destination" ref="1001"/> + <object class="NSNibBindingConnector" key="connector"> + <reference key="NSSource" ref="1061611931"/> + <reference key="NSDestination" ref="1001"/> + <string key="NSLabel">enabled: self.doTouchMe</string> + <string key="NSBinding">enabled</string> + <string key="NSKeyPath">self.doTouchMe</string> + <int key="NSNibBindingConnectorVersion">2</int> + </object> + </object> + <int key="connectionID">82</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBBindingConnection" key="connection"> + <string key="label">value: self.blockSize</string> + <reference key="source" ref="183069999"/> + <reference key="destination" ref="1001"/> + <object class="NSNibBindingConnector" key="connector"> + <reference key="NSSource" ref="183069999"/> + <reference key="NSDestination" ref="1001"/> + <string key="NSLabel">value: self.blockSize</string> + <string key="NSBinding">value</string> + <string key="NSKeyPath">self.blockSize</string> + <object class="NSDictionary" key="NSOptions"> + <bool key="EncodedWithXMLCoder">YES</bool> + <object class="NSArray" key="dict.sortedKeys"> + <bool key="EncodedWithXMLCoder">YES</bool> + <string>NSContinuouslyUpdatesValue</string> + <string>NSValueTransformerName</string> + </object> + <object class="NSArray" key="dict.values"> + <bool key="EncodedWithXMLCoder">YES</bool> + <boolean value="YES"/> + <string>NumberTransformer</string> + </object> + </object> + <int key="NSNibBindingConnectorVersion">2</int> + </object> + </object> + <int key="connectionID">56</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBBindingConnection" key="connection"> + <string key="label">enabled: self.doTouchMe</string> + <reference key="source" ref="183069999"/> + <reference key="destination" ref="1001"/> + <object class="NSNibBindingConnector" key="connector"> + <reference key="NSSource" ref="183069999"/> + <reference key="NSDestination" ref="1001"/> + <string key="NSLabel">enabled: self.doTouchMe</string> + <string key="NSBinding">enabled</string> + <string key="NSKeyPath">self.doTouchMe</string> + <int key="NSNibBindingConnectorVersion">2</int> + </object> + </object> + <int key="connectionID">77</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBBindingConnection" key="connection"> + <string key="label">value: self.xferType</string> + <reference key="source" ref="1029217440"/> + <reference key="destination" ref="1001"/> + <object class="NSNibBindingConnector" key="connector"> + <reference key="NSSource" ref="1029217440"/> + <reference key="NSDestination" ref="1001"/> + <string key="NSLabel">value: self.xferType</string> + <string key="NSBinding">value</string> + <string key="NSKeyPath">self.xferType</string> + <object class="NSDictionary" key="NSOptions"> + <string key="NS.key.0">NSContinuouslyUpdatesValue</string> + <boolean value="YES" key="NS.object.0"/> + </object> + <int key="NSNibBindingConnectorVersion">2</int> + </object> + </object> + <int key="connectionID">52</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBBindingConnection" key="connection"> + <string key="label">enabled: self.doTouchMe</string> + <reference key="source" ref="1029217440"/> + <reference key="destination" ref="1001"/> + <object class="NSNibBindingConnector" key="connector"> + <reference key="NSSource" ref="1029217440"/> + <reference key="NSDestination" ref="1001"/> + <string key="NSLabel">enabled: self.doTouchMe</string> + <string key="NSBinding">enabled</string> + <string key="NSKeyPath">self.doTouchMe</string> + <int key="NSNibBindingConnectorVersion">2</int> + </object> + </object> + <int key="connectionID">75</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBBindingConnection" key="connection"> + <string key="label">value: self.remoteFile</string> + <reference key="source" ref="685519878"/> + <reference key="destination" ref="1001"/> + <object class="NSNibBindingConnector" key="connector"> + <reference key="NSSource" ref="685519878"/> + <reference key="NSDestination" ref="1001"/> + <string key="NSLabel">value: self.remoteFile</string> + <string key="NSBinding">value</string> + <string key="NSKeyPath">self.remoteFile</string> + <object class="NSDictionary" key="NSOptions"> + <string key="NS.key.0">NSContinuouslyUpdatesValue</string> + <boolean value="YES" key="NS.object.0"/> + </object> + <int key="NSNibBindingConnectorVersion">2</int> + </object> + </object> + <int key="connectionID">49</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBBindingConnection" key="connection"> + <string key="label">value: self.localFile</string> + <reference key="source" ref="392834772"/> + <reference key="destination" ref="1001"/> + <object class="NSNibBindingConnector" key="connector"> + <reference key="NSSource" ref="392834772"/> + <reference key="NSDestination" ref="1001"/> + <string key="NSLabel">value: self.localFile</string> + <string key="NSBinding">value</string> + <string key="NSKeyPath">self.localFile</string> + <object class="NSDictionary" key="NSOptions"> + <string key="NS.key.0">NSContinuouslyUpdatesValue</string> + <boolean value="YES" key="NS.object.0"/> + </object> + <int key="NSNibBindingConnectorVersion">2</int> + </object> + </object> + <int key="connectionID">43</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBBindingConnection" key="connection"> + <string key="label">enabled: self.doTouchMe</string> + <reference key="source" ref="392834772"/> + <reference key="destination" ref="1001"/> + <object class="NSNibBindingConnector" key="connector"> + <reference key="NSSource" ref="392834772"/> + <reference key="NSDestination" ref="1001"/> + <string key="NSLabel">enabled: self.doTouchMe</string> + <string key="NSBinding">enabled</string> + <string key="NSKeyPath">self.doTouchMe</string> + <int key="NSNibBindingConnectorVersion">2</int> + </object> + </object> + <int key="connectionID">70</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBBindingConnection" key="connection"> + <string key="label">enabled: self.doTouchMe</string> + <reference key="source" ref="176529531"/> + <reference key="destination" ref="1001"/> + <object class="NSNibBindingConnector" key="connector"> + <reference key="NSSource" ref="176529531"/> + <reference key="NSDestination" ref="1001"/> + <string key="NSLabel">enabled: self.doTouchMe</string> + <string key="NSBinding">enabled</string> + <string key="NSKeyPath">self.doTouchMe</string> + <int key="NSNibBindingConnectorVersion">2</int> + </object> + </object> + <int key="connectionID">73</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBBindingConnection" key="connection"> + <string key="label">value: self.remoteHost</string> + <reference key="source" ref="23478474"/> + <reference key="destination" ref="1001"/> + <object class="NSNibBindingConnector" key="connector"> + <reference key="NSSource" ref="23478474"/> + <reference key="NSDestination" ref="1001"/> + <string key="NSLabel">value: self.remoteHost</string> + <string key="NSBinding">value</string> + <string key="NSKeyPath">self.remoteHost</string> + <object class="NSDictionary" key="NSOptions"> + <string key="NS.key.0">NSContinuouslyUpdatesValue</string> + <boolean value="YES" key="NS.object.0"/> + </object> + <int key="NSNibBindingConnectorVersion">2</int> + </object> + </object> + <int key="connectionID">46</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBBindingConnection" key="connection"> + <string key="label">enabled: self.doTouchMe</string> + <reference key="source" ref="23478474"/> + <reference key="destination" ref="1001"/> + <object class="NSNibBindingConnector" key="connector"> + <reference key="NSSource" ref="23478474"/> + <reference key="NSDestination" ref="1001"/> + <string key="NSLabel">enabled: self.doTouchMe</string> + <string key="NSBinding">enabled</string> + <string key="NSKeyPath">self.doTouchMe</string> + <int key="NSNibBindingConnectorVersion">2</int> + </object> + </object> + <int key="connectionID">85</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBBindingConnection" key="connection"> + <string key="label">enabled: self.doTouchMe</string> + <reference key="source" ref="471811034"/> + <reference key="destination" ref="1001"/> + <object class="NSNibBindingConnector" key="connector"> + <reference key="NSSource" ref="471811034"/> + <reference key="NSDestination" ref="1001"/> + <string key="NSLabel">enabled: self.doTouchMe</string> + <string key="NSBinding">enabled</string> + <string key="NSKeyPath">self.doTouchMe</string> + <int key="NSNibBindingConnectorVersion">2</int> + </object> + </object> + <int key="connectionID">87</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBBindingConnection" key="connection"> + <string key="label">value: self.remotePort</string> + <reference key="source" ref="471811034"/> + <reference key="destination" ref="1001"/> + <object class="NSNibBindingConnector" key="connector"> + <reference key="NSSource" ref="471811034"/> + <reference key="NSDestination" ref="1001"/> + <string key="NSLabel">value: self.remotePort</string> + <string key="NSBinding">value</string> + <string key="NSKeyPath">self.remotePort</string> + <object class="NSDictionary" key="NSOptions"> + <string key="NS.key.0">NSValueTransformerName</string> + <string key="NS.object.0">NumberTransformer</string> + </object> + <int key="NSNibBindingConnectorVersion">2</int> + </object> + </object> + <int key="connectionID">111</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBBindingConnection" key="connection"> + <string key="label">animate: self.doTouchMe</string> + <reference key="source" ref="53446878"/> + <reference key="destination" ref="1001"/> + <object class="NSNibBindingConnector" key="connector"> + <reference key="NSSource" ref="53446878"/> + <reference key="NSDestination" ref="1001"/> + <string key="NSLabel">animate: self.doTouchMe</string> + <string key="NSBinding">animate</string> + <string key="NSKeyPath">self.doTouchMe</string> + <object class="NSDictionary" key="NSOptions"> + <string key="NS.key.0">NSValueTransformerName</string> + <string key="NS.object.0">NSNegateBoolean</string> + </object> + <int key="NSNibBindingConnectorVersion">2</int> + </object> + </object> + <int key="connectionID">94</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBBindingConnection" key="connection"> + <string key="label">hidden: self.doTouchMe</string> + <reference key="source" ref="53446878"/> + <reference key="destination" ref="1001"/> + <object class="NSNibBindingConnector" key="connector"> + <reference key="NSSource" ref="53446878"/> + <reference key="NSDestination" ref="1001"/> + <string key="NSLabel">hidden: self.doTouchMe</string> + <string key="NSBinding">hidden</string> + <string key="NSKeyPath">self.doTouchMe</string> + <int key="NSNibBindingConnectorVersion">2</int> + </object> + </object> + <int key="connectionID">95</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBBindingConnection" key="connection"> + <string key="label">value: self.statusLabel</string> + <reference key="source" ref="727455678"/> + <reference key="destination" ref="1001"/> + <object class="NSNibBindingConnector" key="connector"> + <reference key="NSSource" ref="727455678"/> + <reference key="NSDestination" ref="1001"/> + <string key="NSLabel">value: self.statusLabel</string> + <string key="NSBinding">value</string> + <string key="NSKeyPath">self.statusLabel</string> + <int key="NSNibBindingConnectorVersion">2</int> + </object> + </object> + <int key="connectionID">104</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBBindingConnection" key="connection"> + <string key="label">enabled: self.doTouchMe</string> + <reference key="source" ref="727455678"/> + <reference key="destination" ref="1001"/> + <object class="NSNibBindingConnector" key="connector"> + <reference key="NSSource" ref="727455678"/> + <reference key="NSDestination" ref="1001"/> + <string key="NSLabel">enabled: self.doTouchMe</string> + <string key="NSBinding">enabled</string> + <string key="NSKeyPath">self.doTouchMe</string> + <int key="NSNibBindingConnectorVersion">2</int> + </object> + </object> + <int key="connectionID">138</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBBindingConnection" key="connection"> + <string key="label">hidden: self.doTouchMe</string> + <reference key="source" ref="727455678"/> + <reference key="destination" ref="1001"/> + <object class="NSNibBindingConnector" key="connector"> + <reference key="NSSource" ref="727455678"/> + <reference key="NSDestination" ref="1001"/> + <string key="NSLabel">hidden: self.doTouchMe</string> + <string key="NSBinding">hidden</string> + <string key="NSKeyPath">self.doTouchMe</string> + <int key="NSNibBindingConnectorVersion">2</int> + </object> + </object> + <int key="connectionID">140</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBBindingConnection" key="connection"> + <string key="label">value: self.errorLabel</string> + <reference key="source" ref="213673854"/> + <reference key="destination" ref="1001"/> + <object class="NSNibBindingConnector" key="connector"> + <reference key="NSSource" ref="213673854"/> + <reference key="NSDestination" ref="1001"/> + <string key="NSLabel">value: self.errorLabel</string> + <string key="NSBinding">value</string> + <string key="NSKeyPath">self.errorLabel</string> + <int key="NSNibBindingConnectorVersion">2</int> + </object> + </object> + <int key="connectionID">115</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBBindingConnection" key="connection"> + <string key="label">hidden: self.doTouchMe</string> + <reference key="source" ref="213673854"/> + <reference key="destination" ref="1001"/> + <object class="NSNibBindingConnector" key="connector"> + <reference key="NSSource" ref="213673854"/> + <reference key="NSDestination" ref="1001"/> + <string key="NSLabel">hidden: self.doTouchMe</string> + <string key="NSBinding">hidden</string> + <string key="NSKeyPath">self.doTouchMe</string> + <object class="NSDictionary" key="NSOptions"> + <string key="NS.key.0">NSValueTransformerName</string> + <string key="NS.object.0">NSNegateBoolean</string> + </object> + <int key="NSNibBindingConnectorVersion">2</int> + </object> + </object> + <int key="connectionID">118</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBBindingConnection" key="connection"> + <string key="label">value: self.timeout</string> + <reference key="source" ref="720108113"/> + <reference key="destination" ref="1001"/> + <object class="NSNibBindingConnector" key="connector"> + <reference key="NSSource" ref="720108113"/> + <reference key="NSDestination" ref="1001"/> + <string key="NSLabel">value: self.timeout</string> + <string key="NSBinding">value</string> + <string key="NSKeyPath">self.timeout</string> + <object class="NSDictionary" key="NSOptions"> + <string key="NS.key.0">NSValueTransformerName</string> + <string key="NS.object.0">NumberTransformer</string> + </object> + <int key="NSNibBindingConnectorVersion">2</int> + </object> + </object> + <int key="connectionID">127</int> + </object> + </object> + <object class="IBMutableOrderedSet" key="objectRecords"> + <object class="NSArray" key="orderedObjects"> + <bool key="EncodedWithXMLCoder">YES</bool> + <object class="IBObjectRecord"> + <int key="objectID">0</int> + <object class="NSArray" key="object" id="0"> + <bool key="EncodedWithXMLCoder">YES</bool> + </object> + <reference key="children" ref="1000"/> + <nil key="parent"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">-2</int> + <reference key="object" ref="1001"/> + <reference key="parent" ref="0"/> + <string key="objectName">File's Owner</string> + </object> + <object class="IBObjectRecord"> + <int key="objectID">-1</int> + <reference key="object" ref="1003"/> + <reference key="parent" ref="0"/> + <string key="objectName">First Responder</string> + </object> + <object class="IBObjectRecord"> + <int key="objectID">-3</int> + <reference key="object" ref="1004"/> + <reference key="parent" ref="0"/> + <string key="objectName">Application</string> + </object> + <object class="IBObjectRecord"> + <int key="objectID">3</int> + <reference key="object" ref="265268434"/> + <object class="NSMutableArray" key="children"> + <bool key="EncodedWithXMLCoder">YES</bool> + <reference ref="537034939"/> + </object> + <reference key="parent" ref="0"/> + <string key="objectName">Window - Request dialog</string> + </object> + <object class="IBObjectRecord"> + <int key="objectID">4</int> + <reference key="object" ref="537034939"/> + <object class="NSMutableArray" key="children"> + <bool key="EncodedWithXMLCoder">YES</bool> + <reference ref="1053800845"/> + <reference ref="183069999"/> + <reference ref="1029217440"/> + <reference ref="1027449834"/> + <reference ref="291839274"/> + <reference ref="685519878"/> + <reference ref="712275833"/> + <reference ref="983573643"/> + <reference ref="1061611931"/> + <reference ref="53446878"/> + <reference ref="727455678"/> + <reference ref="213673854"/> + <reference ref="392834772"/> + <reference ref="23478474"/> + <reference ref="525390780"/> + <reference ref="471811034"/> + <reference ref="656785083"/> + <reference ref="138314969"/> + <reference ref="720108113"/> + <reference ref="176529531"/> + </object> + <reference key="parent" ref="265268434"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">5</int> + <reference key="object" ref="1053800845"/> + <object class="NSMutableArray" key="children"> + <bool key="EncodedWithXMLCoder">YES</bool> + <reference ref="673387987"/> + </object> + <reference key="parent" ref="537034939"/> + <string key="objectName">Push Button - no</string> + </object> + <object class="IBObjectRecord"> + <int key="objectID">6</int> + <reference key="object" ref="1061611931"/> + <object class="NSMutableArray" key="children"> + <bool key="EncodedWithXMLCoder">YES</bool> + <reference ref="608238510"/> + </object> + <reference key="parent" ref="537034939"/> + <string key="objectName">Push Button - go</string> + </object> + <object class="IBObjectRecord"> + <int key="objectID">7</int> + <reference key="object" ref="183069999"/> + <object class="NSMutableArray" key="children"> + <bool key="EncodedWithXMLCoder">YES</bool> + <reference ref="418627588"/> + </object> + <reference key="parent" ref="537034939"/> + <string key="objectName">Combo Box - block size</string> + </object> + <object class="IBObjectRecord"> + <int key="objectID">8</int> + <reference key="object" ref="1029217440"/> + <object class="NSMutableArray" key="children"> + <bool key="EncodedWithXMLCoder">YES</bool> + <reference ref="567568844"/> + </object> + <reference key="parent" ref="537034939"/> + <string key="objectName">Combo Box - xfer type</string> + </object> + <object class="IBObjectRecord"> + <int key="objectID">9</int> + <reference key="object" ref="1027449834"/> + <object class="NSMutableArray" key="children"> + <bool key="EncodedWithXMLCoder">YES</bool> + <reference ref="977543267"/> + </object> + <reference key="parent" ref="537034939"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">10</int> + <reference key="object" ref="291839274"/> + <object class="NSMutableArray" key="children"> + <bool key="EncodedWithXMLCoder">YES</bool> + <reference ref="61967082"/> + </object> + <reference key="parent" ref="537034939"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">11</int> + <reference key="object" ref="685519878"/> + <object class="NSMutableArray" key="children"> + <bool key="EncodedWithXMLCoder">YES</bool> + <reference ref="983145747"/> + </object> + <reference key="parent" ref="537034939"/> + <string key="objectName">Text Field - remote file</string> + </object> + <object class="IBObjectRecord"> + <int key="objectID">12</int> + <reference key="object" ref="712275833"/> + <object class="NSMutableArray" key="children"> + <bool key="EncodedWithXMLCoder">YES</bool> + <reference ref="931249278"/> + </object> + <reference key="parent" ref="537034939"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">13</int> + <reference key="object" ref="392834772"/> + <object class="NSMutableArray" key="children"> + <bool key="EncodedWithXMLCoder">YES</bool> + <reference ref="47222242"/> + </object> + <reference key="parent" ref="537034939"/> + <string key="objectName">Text Field - local file</string> + </object> + <object class="IBObjectRecord"> + <int key="objectID">14</int> + <reference key="object" ref="983573643"/> + <object class="NSMutableArray" key="children"> + <bool key="EncodedWithXMLCoder">YES</bool> + <reference ref="85931455"/> + </object> + <reference key="parent" ref="537034939"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">15</int> + <reference key="object" ref="176529531"/> + <object class="NSMutableArray" key="children"> + <bool key="EncodedWithXMLCoder">YES</bool> + <reference ref="827794247"/> + </object> + <reference key="parent" ref="537034939"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">16</int> + <reference key="object" ref="827794247"/> + <reference key="parent" ref="176529531"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">17</int> + <reference key="object" ref="85931455"/> + <reference key="parent" ref="983573643"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">18</int> + <reference key="object" ref="47222242"/> + <reference key="parent" ref="392834772"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">19</int> + <reference key="object" ref="931249278"/> + <reference key="parent" ref="712275833"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">20</int> + <reference key="object" ref="983145747"/> + <reference key="parent" ref="685519878"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">21</int> + <reference key="object" ref="61967082"/> + <reference key="parent" ref="291839274"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">22</int> + <reference key="object" ref="977543267"/> + <reference key="parent" ref="1027449834"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">23</int> + <reference key="object" ref="567568844"/> + <reference key="parent" ref="1029217440"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">24</int> + <reference key="object" ref="418627588"/> + <reference key="parent" ref="183069999"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">25</int> + <reference key="object" ref="608238510"/> + <reference key="parent" ref="1061611931"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">26</int> + <reference key="object" ref="673387987"/> + <reference key="parent" ref="1053800845"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">30</int> + <reference key="object" ref="23478474"/> + <object class="NSMutableArray" key="children"> + <bool key="EncodedWithXMLCoder">YES</bool> + <reference ref="241562469"/> + </object> + <reference key="parent" ref="537034939"/> + <string key="objectName">Text Field - remote host</string> + </object> + <object class="IBObjectRecord"> + <int key="objectID">31</int> + <reference key="object" ref="241562469"/> + <reference key="parent" ref="23478474"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">32</int> + <reference key="object" ref="656785083"/> + <object class="NSMutableArray" key="children"> + <bool key="EncodedWithXMLCoder">YES</bool> + <reference ref="114681340"/> + </object> + <reference key="parent" ref="537034939"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">33</int> + <reference key="object" ref="114681340"/> + <reference key="parent" ref="656785083"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">37</int> + <reference key="object" ref="431450128"/> + <reference key="parent" ref="0"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">63</int> + <reference key="object" ref="525390780"/> + <object class="NSMutableArray" key="children"> + <bool key="EncodedWithXMLCoder">YES</bool> + <reference ref="637728381"/> + </object> + <reference key="parent" ref="537034939"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">64</int> + <reference key="object" ref="637728381"/> + <reference key="parent" ref="525390780"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">65</int> + <reference key="object" ref="471811034"/> + <object class="NSMutableArray" key="children"> + <bool key="EncodedWithXMLCoder">YES</bool> + <reference ref="35095251"/> + </object> + <reference key="parent" ref="537034939"/> + <string key="objectName">Text Field - remote port</string> + </object> + <object class="IBObjectRecord"> + <int key="objectID">66</int> + <reference key="object" ref="35095251"/> + <reference key="parent" ref="471811034"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">88</int> + <reference key="object" ref="53446878"/> + <reference key="parent" ref="537034939"/> + <string key="objectName">progress indicator</string> + </object> + <object class="IBObjectRecord"> + <int key="objectID">89</int> + <reference key="object" ref="727455678"/> + <object class="NSMutableArray" key="children"> + <bool key="EncodedWithXMLCoder">YES</bool> + <reference ref="873681103"/> + </object> + <reference key="parent" ref="537034939"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">90</int> + <reference key="object" ref="873681103"/> + <reference key="parent" ref="727455678"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">112</int> + <reference key="object" ref="213673854"/> + <object class="NSMutableArray" key="children"> + <bool key="EncodedWithXMLCoder">YES</bool> + <reference ref="468926987"/> + </object> + <reference key="parent" ref="537034939"/> + <string key="objectName">Static Text - error</string> + </object> + <object class="IBObjectRecord"> + <int key="objectID">113</int> + <reference key="object" ref="468926987"/> + <reference key="parent" ref="213673854"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">121</int> + <reference key="object" ref="138314969"/> + <object class="NSMutableArray" key="children"> + <bool key="EncodedWithXMLCoder">YES</bool> + <reference ref="849261570"/> + </object> + <reference key="parent" ref="537034939"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">122</int> + <reference key="object" ref="849261570"/> + <reference key="parent" ref="138314969"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">123</int> + <reference key="object" ref="720108113"/> + <object class="NSMutableArray" key="children"> + <bool key="EncodedWithXMLCoder">YES</bool> + <reference ref="966502450"/> + </object> + <reference key="parent" ref="537034939"/> + <string key="objectName">Text Field - timeout</string> + </object> + <object class="IBObjectRecord"> + <int key="objectID">124</int> + <reference key="object" ref="966502450"/> + <reference key="parent" ref="720108113"/> + </object> + </object> + </object> + <object class="NSMutableDictionary" key="flattenedProperties"> + <bool key="EncodedWithXMLCoder">YES</bool> + <object class="NSArray" key="dict.sortedKeys"> + <bool key="EncodedWithXMLCoder">YES</bool> + <string>-1.IBPluginDependency</string> + <string>-2.IBPluginDependency</string> + <string>-3.IBPluginDependency</string> + <string>10.IBPluginDependency</string> + <string>11.IBAttributePlaceholdersKey</string> + <string>11.IBPluginDependency</string> + <string>112.IBPluginDependency</string> + <string>113.IBPluginDependency</string> + <string>12.IBPluginDependency</string> + <string>121.IBPluginDependency</string> + <string>122.IBPluginDependency</string> + <string>123.IBAttributePlaceholdersKey</string> + <string>123.IBPluginDependency</string> + <string>124.IBPluginDependency</string> + <string>13.IBAttributePlaceholdersKey</string> + <string>13.IBPluginDependency</string> + <string>14.IBPluginDependency</string> + <string>15.IBPluginDependency</string> + <string>16.IBPluginDependency</string> + <string>17.IBPluginDependency</string> + <string>18.IBPluginDependency</string> + <string>19.IBPluginDependency</string> + <string>20.IBPluginDependency</string> + <string>21.IBPluginDependency</string> + <string>22.IBPluginDependency</string> + <string>23.IBAttributePlaceholdersKey</string> + <string>23.IBComboBoxObjectValuesKey.objectValues</string> + <string>23.IBPluginDependency</string> + <string>24.IBComboBoxObjectValuesKey.objectValues</string> + <string>24.IBPluginDependency</string> + <string>25.IBPluginDependency</string> + <string>26.IBPluginDependency</string> + <string>3.IBPluginDependency</string> + <string>3.NSWindowTemplate.visibleAtLaunch</string> + <string>30.IBAttributePlaceholdersKey</string> + <string>30.IBPluginDependency</string> + <string>31.IBPluginDependency</string> + <string>32.IBPluginDependency</string> + <string>33.IBPluginDependency</string> + <string>37.IBPluginDependency</string> + <string>4.IBPluginDependency</string> + <string>4.IBUserGuides</string> + <string>5.IBPluginDependency</string> + <string>6.IBAttributePlaceholdersKey</string> + <string>6.IBPluginDependency</string> + <string>63.IBPluginDependency</string> + <string>64.IBPluginDependency</string> + <string>65.IBAttributePlaceholdersKey</string> + <string>65.IBPluginDependency</string> + <string>66.IBPluginDependency</string> + <string>7.IBAttributePlaceholdersKey</string> + <string>7.IBPluginDependency</string> + <string>8.IBAttributePlaceholdersKey</string> + <string>8.IBPluginDependency</string> + <string>88.IBPluginDependency</string> + <string>89.IBPluginDependency</string> + <string>9.IBPluginDependency</string> + <string>90.IBPluginDependency</string> + </object> + <object class="NSArray" key="dict.values"> + <bool key="EncodedWithXMLCoder">YES</bool> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <object class="NSMutableDictionary"> + <string key="NS.key.0">ToolTip</string> + <object class="IBToolTipAttribute" key="NS.object.0"> + <string key="name">ToolTip</string> + <reference key="object" ref="685519878"/> + <string key="toolTip">Remote file name (possibly with path relative to tftp root directory).</string> + </object> + </object> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <object class="NSMutableDictionary"> + <string key="NS.key.0">ToolTip</string> + <object class="IBToolTipAttribute" key="NS.object.0"> + <string key="name">ToolTip</string> + <reference key="object" ref="720108113"/> + <string key="toolTip">Retransmission timeout in seconds.</string> + </object> + </object> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <object class="NSMutableDictionary"> + <string key="NS.key.0">ToolTip</string> + <object class="IBToolTipAttribute" key="NS.object.0"> + <string key="name">ToolTip</string> + <reference key="object" ref="392834772"/> + <string key="toolTip">Local full file name with path.</string> + </object> + </object> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <object class="NSMutableDictionary"> + <bool key="EncodedWithXMLCoder">YES</bool> + <reference key="dict.sortedKeys" ref="0"/> + <reference key="dict.values" ref="0"/> + </object> + <object class="NSArray"> + <bool key="EncodedWithXMLCoder">YES</bool> + <string>octet</string> + <string>netascii</string> + </object> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <object class="NSArray"> + <bool key="EncodedWithXMLCoder">YES</bool> + <string>512</string> + <string>1024</string> + <string>2048</string> + <string>4096</string> + </object> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <boolean value="NO"/> + <object class="NSMutableDictionary"> + <string key="NS.key.0">ToolTip</string> + <object class="IBToolTipAttribute" key="NS.object.0"> + <string key="name">ToolTip</string> + <reference key="object" ref="23478474"/> + <string key="toolTip">Remote host name or IP address.</string> + </object> + </object> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <object class="NSMutableArray"> + <bool key="EncodedWithXMLCoder">YES</bool> + </object> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <object class="NSMutableDictionary"> + <bool key="EncodedWithXMLCoder">YES</bool> + <reference key="dict.sortedKeys" ref="0"/> + <reference key="dict.values" ref="0"/> + </object> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <object class="NSMutableDictionary"> + <string key="NS.key.0">ToolTip</string> + <object class="IBToolTipAttribute" key="NS.object.0"> + <string key="name">ToolTip</string> + <reference key="object" ref="471811034"/> + <string key="toolTip">Remote UDP port.</string> + </object> + </object> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <object class="NSMutableDictionary"> + <string key="NS.key.0">ToolTip</string> + <object class="IBToolTipAttribute" key="NS.object.0"> + <string key="name">ToolTip</string> + <reference key="object" ref="183069999"/> + <string key="toolTip">Transmission block size in bytes.</string> + </object> + </object> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <object class="NSMutableDictionary"> + <string key="NS.key.0">ToolTip</string> + <object class="IBToolTipAttribute" key="NS.object.0"> + <string key="name">ToolTip</string> + <reference key="object" ref="1029217440"/> + <string key="toolTip">TFTP transfer type. Typically 'octet' or 'netascii'. Isn't really taken into account by PumpKIN.</string> + </object> + </object> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + </object> + </object> + <object class="NSMutableDictionary" key="unlocalizedProperties"> + <bool key="EncodedWithXMLCoder">YES</bool> + <reference key="dict.sortedKeys" ref="0"/> + <reference key="dict.values" ref="0"/> + </object> + <nil key="activeLocalization"/> + <object class="NSMutableDictionary" key="localizations"> + <bool key="EncodedWithXMLCoder">YES</bool> + <reference key="dict.sortedKeys" ref="0"/> + <reference key="dict.values" ref="0"/> + </object> + <nil key="sourceID"/> + <int key="maxID">140</int> + </object> + <object class="IBClassDescriber" key="IBDocument.Classes"> + <object class="NSMutableArray" key="referencedPartialClassDescriptions"> + <bool key="EncodedWithXMLCoder">YES</bool> + <object class="IBPartialClassDescription"> + <string key="className">ARequest</string> + <string key="superclassName">NSWindowController</string> + <object class="NSMutableDictionary" key="actions"> + <bool key="EncodedWithXMLCoder">YES</bool> + <object class="NSArray" key="dict.sortedKeys"> + <bool key="EncodedWithXMLCoder">YES</bool> + <string>pickFile:</string> + <string>startXfer:</string> + </object> + <object class="NSArray" key="dict.values"> + <bool key="EncodedWithXMLCoder">YES</bool> + <string>id</string> + <string>id</string> + </object> + </object> + <object class="NSMutableDictionary" key="actionInfosByName"> + <bool key="EncodedWithXMLCoder">YES</bool> + <object class="NSArray" key="dict.sortedKeys"> + <bool key="EncodedWithXMLCoder">YES</bool> + <string>pickFile:</string> + <string>startXfer:</string> + </object> + <object class="NSArray" key="dict.values"> + <bool key="EncodedWithXMLCoder">YES</bool> + <object class="IBActionInfo"> + <string key="name">pickFile:</string> + <string key="candidateClassName">id</string> + </object> + <object class="IBActionInfo"> + <string key="name">startXfer:</string> + <string key="candidateClassName">id</string> + </object> + </object> + </object> + <object class="NSMutableDictionary" key="outlets"> + <string key="NS.key.0">remoteHostBox</string> + <string key="NS.object.0">NSTextField</string> + </object> + <object class="NSMutableDictionary" key="toOneOutletInfosByName"> + <string key="NS.key.0">remoteHostBox</string> + <object class="IBToOneOutletInfo" key="NS.object.0"> + <string key="name">remoteHostBox</string> + <string key="candidateClassName">NSTextField</string> + </object> + </object> + <object class="IBClassDescriptionSource" key="sourceIdentifier"> + <string key="majorKey">IBProjectSource</string> + <string key="minorKey">./Classes/ARequest.h</string> + </object> + </object> + </object> + </object> + <int key="IBDocument.localizationMode">0</int> + <string key="IBDocument.TargetRuntimeIdentifier">IBCocoaFramework</string> + <object class="NSMutableDictionary" key="IBDocument.PluginDeclaredDevelopmentDependencies"> + <string key="NS.key.0">com.apple.InterfaceBuilder.CocoaPlugin.InterfaceBuilder3</string> + <integer value="3000" key="NS.object.0"/> + </object> + <bool key="IBDocument.PluginDeclaredDependenciesTrackSystemTargetVersion">YES</bool> + <int key="IBDocument.defaultPropertyAccessControl">3</int> + </data> +</archive> diff --git a/pumpkin/ConfirmRequest.h b/pumpkin/ConfirmRequest.h new file mode 100644 index 0000000..5db6f2e --- a/dev/null +++ b/pumpkin/ConfirmRequest.h @@ -0,0 +1,38 @@ + +#import <Cocoa/Cocoa.h> +#import "TFTPPacket.h" +#import "XFer.h" + +enum RequestVerdict { + verdictDeny = 0, + verdictAllow, verdictRename, + verdictDefault = verdictDeny +}; + +@interface ConfirmRequest : NSWindowController { + XFer *xfer; + NSString *remoteHost; + NSString *remoteAction; + NSString *fileName; + BOOL fileExists; + BOOL isWriteRequest; + NSTimer *timeout; +} + +@property (copy) NSString *remoteHost; +@property (copy) NSString *remoteAction; +@property (copy) NSString *fileName; +@property BOOL fileExists; +@property BOOL isWriteRequest; + +@property (assign) IBOutlet NSButton *allowButton; +@property (assign) IBOutlet NSButton *denyButton; +@property (assign) IBOutlet NSButton *renameButton; + +- (IBAction)letItBe:(id)sender; +- (IBAction)deny:(id)sender; +- (IBAction)rename:(id)sender; + ++ (void) confirmationWithXfer:(XFer*)x; + +@end diff --git a/pumpkin/ConfirmRequest.m b/pumpkin/ConfirmRequest.m new file mode 100644 index 0000000..73dfcc1 --- a/dev/null +++ b/pumpkin/ConfirmRequest.m @@ -0,0 +1,57 @@ + +#import "ConfirmRequest.h" +#import "StringsAttached.h" + +@implementation ConfirmRequest +@synthesize remoteHost; +@synthesize remoteAction; +@synthesize fileName; +@synthesize fileExists; +@synthesize isWriteRequest; + +-(void)sentence:(int)v { + [timeout invalidate], [timeout release], timeout=nil; + [xfer goOnWithVerdict:v]; + [self.window performClose:nil]; + [[[NSUserDefaultsController sharedUserDefaultsController] values] + setValue:@(v) forKey:isWriteRequest?@"WRQ.lastSentence":@"RRQ.lastSentence"]; + [self release]; +} + +- (IBAction)letItBe:(id)sender { [self sentence:verdictAllow]; } +- (IBAction)deny:(id)sender { [self sentence:verdictDeny]; } +- (IBAction)rename:(id)sender { [self sentence:verdictRename]; } +- (void)timeout { [self sentence:verdictDefault]; } + +- (ConfirmRequest*) initWithXfer:(XFer *)x { + enum TFTPOp op = x.initialPacket.op; + NSAssert(op==tftpOpRRQ || op==tftpOpWRQ,@"Invalid request to confirm"); + if(!(self=[super initWithWindowNibName:@"ConfirmRequest"])) return self; + isWriteRequest = op==tftpOpWRQ; + remoteHost = [[NSString stringWithHostAddress:x.peer] retain]; + remoteAction = isWriteRequest?@"tries to send you":@"requests the file"; + fileName = x.xferFilename; + fileExists = [[NSFileManager defaultManager] fileExistsAtPath:x.localFile]; + xfer = [x retain]; + switch([[[[NSUserDefaultsController sharedUserDefaultsController] values] valueForKey:isWriteRequest?@"WRQ.lastSentence":@"RRQ.lastSentence"] intValue]) { + case verdictAllow: self.window.initialFirstResponder = self.allowButton; break; + case verdictDeny: self.window.initialFirstResponder = self.denyButton; break; + case verdictRename: self.window.initialFirstResponder = self.renameButton; break; + } + [self.window makeKeyAndOrderFront:nil]; + timeout = [[NSTimer scheduledTimerWithTimeInterval:[[[[NSUserDefaultsController sharedUserDefaultsController] values] valueForKey:@"confirmationTimeout"] intValue] target:self selector:@selector(timeout) userInfo:nil repeats:NO] retain]; + return self; +} + +- (void) dealloc { + if(timeout) [timeout invalidate], [timeout release]; + if(remoteHost) [remoteHost release]; + if(xfer) [xfer release]; + [super dealloc]; +} + ++ (void) confirmationWithXfer:(XFer *)x { + [[self alloc] initWithXfer:x]; +} + +@end diff --git a/pumpkin/ConfirmRequest.xib b/pumpkin/ConfirmRequest.xib new file mode 100644 index 0000000..86d0030 --- a/dev/null +++ b/pumpkin/ConfirmRequest.xib @@ -0,0 +1,695 @@ +<?xml version="1.0" encoding="UTF-8"?> +<archive type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="8.00"> + <data> + <int key="IBDocument.SystemTarget">1080</int> + <string key="IBDocument.SystemVersion">12C60</string> + <string key="IBDocument.InterfaceBuilderVersion">2844</string> + <string key="IBDocument.AppKitVersion">1187.34</string> + <string key="IBDocument.HIToolboxVersion">625.00</string> + <object class="NSMutableDictionary" key="IBDocument.PluginVersions"> + <string key="NS.key.0">com.apple.InterfaceBuilder.CocoaPlugin</string> + <string key="NS.object.0">2844</string> + </object> + <array key="IBDocument.IntegratedClassDependencies"> + <string>NSButton</string> + <string>NSButtonCell</string> + <string>NSCustomObject</string> + <string>NSTextField</string> + <string>NSTextFieldCell</string> + <string>NSUserDefaultsController</string> + <string>NSView</string> + <string>NSWindowTemplate</string> + </array> + <array key="IBDocument.PluginDependencies"> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + </array> + <object class="NSMutableDictionary" key="IBDocument.Metadata"> + <string key="NS.key.0">PluginDependencyRecalculationVersion</string> + <integer value="1" key="NS.object.0"/> + </object> + <array class="NSMutableArray" key="IBDocument.RootObjects" id="1000"> + <object class="NSCustomObject" id="1001"> + <string key="NSClassName">ConfirmRequest</string> + </object> + <object class="NSCustomObject" id="1003"> + <string key="NSClassName">FirstResponder</string> + </object> + <object class="NSCustomObject" id="1004"> + <string key="NSClassName">NSApplication</string> + </object> + <object class="NSWindowTemplate" id="1005"> + <int key="NSWindowStyleMask">11</int> + <int key="NSWindowBacking">2</int> + <string key="NSWindowRect">{{578, 340}, {276, 203}}</string> + <int key="NSWTFlags">544735232</int> + <string key="NSWindowTitle">Incoming request</string> + <string key="NSWindowClass">NSWindow</string> + <nil key="NSViewClass"/> + <nil key="NSUserInterfaceItemIdentifier"/> + <string key="NSWindowContentMaxSize">{276, 203}</string> + <string key="NSWindowContentMinSize">{276, 203}</string> + <object class="NSView" key="NSWindowView" id="1006"> + <reference key="NSNextResponder"/> + <int key="NSvFlags">256</int> + <array class="NSMutableArray" key="NSSubviews"> + <object class="NSTextField" id="1043014274"> + <reference key="NSNextResponder" ref="1006"/> + <int key="NSvFlags">268</int> + <string key="NSFrame">{{17, 166}, {60, 17}}</string> + <reference key="NSSuperview" ref="1006"/> + <reference key="NSNextKeyView" ref="493109509"/> + <string key="NSReuseIdentifierKey">_NS:3936</string> + <bool key="NSEnabled">YES</bool> + <object class="NSTextFieldCell" key="NSCell" id="751681516"> + <int key="NSCellFlags">68157504</int> + <int key="NSCellFlags2">272630784</int> + <string key="NSContents">The host</string> + <object class="NSFont" key="NSSupport" id="480005309"> + <string key="NSName">LucidaGrande</string> + <double key="NSSize">13</double> + <int key="NSfFlags">1044</int> + </object> + <string key="NSCellIdentifier">_NS:3936</string> + <reference key="NSControlView" ref="1043014274"/> + <object class="NSColor" key="NSBackgroundColor" id="566729528"> + <int key="NSColorSpace">6</int> + <string key="NSCatalogName">System</string> + <string key="NSColorName">controlColor</string> + <object class="NSColor" key="NSColor"> + <int key="NSColorSpace">3</int> + <bytes key="NSWhite">MC42NjY2NjY2NjY3AA</bytes> + </object> + </object> + <object class="NSColor" key="NSTextColor" id="737623876"> + <int key="NSColorSpace">6</int> + <string key="NSCatalogName">System</string> + <string key="NSColorName">controlTextColor</string> + <object class="NSColor" key="NSColor"> + <int key="NSColorSpace">3</int> + <bytes key="NSWhite">MAA</bytes> + </object> + </object> + </object> + <bool key="NSAllowsLogicalLayoutDirection">NO</bool> + </object> + <object class="NSTextField" id="493109509"> + <reference key="NSNextResponder" ref="1006"/> + <int key="NSvFlags">268</int> + <string key="NSFrame">{{79, 166}, {117, 17}}</string> + <reference key="NSSuperview" ref="1006"/> + <reference key="NSNextKeyView" ref="442301359"/> + <string key="NSReuseIdentifierKey">_NS:3936</string> + <bool key="NSEnabled">YES</bool> + <object class="NSTextFieldCell" key="NSCell" id="808816111"> + <int key="NSCellFlags">68157504</int> + <int key="NSCellFlags2">272630784</int> + <string key="NSContents">255.255.255.255</string> + <object class="NSFont" key="NSSupport" id="373119259"> + <string key="NSName">LucidaGrande-Bold</string> + <double key="NSSize">13</double> + <int key="NSfFlags">2072</int> + </object> + <string key="NSCellIdentifier">_NS:3936</string> + <reference key="NSControlView" ref="493109509"/> + <bool key="NSDrawsBackground">YES</bool> + <reference key="NSBackgroundColor" ref="566729528"/> + <reference key="NSTextColor" ref="737623876"/> + </object> + <bool key="NSAllowsLogicalLayoutDirection">NO</bool> + </object> + <object class="NSTextField" id="442301359"> + <reference key="NSNextResponder" ref="1006"/> + <int key="NSvFlags">268</int> + <string key="NSFrame">{{17, 141}, {134, 17}}</string> + <reference key="NSSuperview" ref="1006"/> + <reference key="NSNextKeyView" ref="826265339"/> + <string key="NSReuseIdentifierKey">_NS:3936</string> + <bool key="NSEnabled">YES</bool> + <object class="NSTextFieldCell" key="NSCell" id="570503156"> + <int key="NSCellFlags">68157504</int> + <int key="NSCellFlags2">272630784</int> + <string key="NSContents">is requesting the file</string> + <reference key="NSSupport" ref="480005309"/> + <string key="NSCellIdentifier">_NS:3936</string> + <reference key="NSControlView" ref="442301359"/> + <reference key="NSBackgroundColor" ref="566729528"/> + <reference key="NSTextColor" ref="737623876"/> + </object> + <bool key="NSAllowsLogicalLayoutDirection">NO</bool> + </object> + <object class="NSTextField" id="826265339"> + <reference key="NSNextResponder" ref="1006"/> + <int key="NSvFlags">266</int> + <string key="NSFrame">{{17, 116}, {242, 17}}</string> + <reference key="NSSuperview" ref="1006"/> + <reference key="NSNextKeyView" ref="204620803"/> + <string key="NSReuseIdentifierKey">_NS:3936</string> + <bool key="NSEnabled">YES</bool> + <object class="NSTextFieldCell" key="NSCell" id="64476756"> + <int key="NSCellFlags">68157504</int> + <int key="NSCellFlags2">138413056</int> + <string key="NSContents">tftp.bin</string> + <reference key="NSSupport" ref="373119259"/> + <string key="NSCellIdentifier">_NS:3936</string> + <reference key="NSControlView" ref="826265339"/> + <reference key="NSBackgroundColor" ref="566729528"/> + <reference key="NSTextColor" ref="737623876"/> + </object> + <bool key="NSAllowsLogicalLayoutDirection">NO</bool> + </object> + <object class="NSTextField" id="204620803"> + <reference key="NSNextResponder" ref="1006"/> + <int key="NSvFlags">268</int> + <string key="NSFrame">{{17, 97}, {69, 11}}</string> + <reference key="NSSuperview" ref="1006"/> + <reference key="NSNextKeyView" ref="95446448"/> + <string key="NSReuseIdentifierKey">_NS:3936</string> + <bool key="NSEnabled">YES</bool> + <object class="NSTextFieldCell" key="NSCell" id="957466536"> + <int key="NSCellFlags">68157504</int> + <int key="NSCellFlags2">272630784</int> + <string key="NSContents">(the file exists)</string> + <object class="NSFont" key="NSSupport"> + <string key="NSName">LucidaGrande</string> + <double key="NSSize">9</double> + <int key="NSfFlags">3614</int> + </object> + <string key="NSCellIdentifier">_NS:3936</string> + <reference key="NSControlView" ref="204620803"/> + <reference key="NSBackgroundColor" ref="566729528"/> + <reference key="NSTextColor" ref="737623876"/> + </object> + <bool key="NSAllowsLogicalLayoutDirection">NO</bool> + </object> + <object class="NSTextField" id="95446448"> + <reference key="NSNextResponder" ref="1006"/> + <int key="NSvFlags">268</int> + <string key="NSFrame">{{96, 72}, {103, 17}}</string> + <reference key="NSSuperview" ref="1006"/> + <reference key="NSNextKeyView" ref="454803690"/> + <string key="NSReuseIdentifierKey">_NS:3936</string> + <bool key="NSEnabled">YES</bool> + <object class="NSTextFieldCell" key="NSCell" id="330029717"> + <int key="NSCellFlags">68157504</int> + <int key="NSCellFlags2">138413056</int> + <string key="NSContents">do you want to</string> + <reference key="NSSupport" ref="480005309"/> + <string key="NSCellIdentifier">_NS:3936</string> + <reference key="NSControlView" ref="95446448"/> + <reference key="NSBackgroundColor" ref="566729528"/> + <reference key="NSTextColor" ref="737623876"/> + </object> + <bool key="NSAllowsLogicalLayoutDirection">NO</bool> + </object> + <object class="NSButton" id="454803690"> + <reference key="NSNextResponder" ref="1006"/> + <int key="NSvFlags">266</int> + <string key="NSFrame">{{20, 45}, {109, 19}}</string> + <reference key="NSSuperview" ref="1006"/> + <reference key="NSNextKeyView" ref="173020989"/> + <string key="NSReuseIdentifierKey">_NS:1534</string> + <bool key="NSEnabled">YES</bool> + <object class="NSButtonCell" key="NSCell" id="239767303"> + <int key="NSCellFlags">-2080374784</int> + <int key="NSCellFlags2">134217728</int> + <string key="NSContents">let it be</string> + <object class="NSFont" key="NSSupport" id="609726753"> + <string key="NSName">LucidaGrande</string> + <double key="NSSize">12</double> + <int key="NSfFlags">16</int> + </object> + <string key="NSCellIdentifier">_NS:1534</string> + <reference key="NSControlView" ref="454803690"/> + <int key="NSButtonFlags">-2038153216</int> + <int key="NSButtonFlags2">164</int> + <string key="NSAlternateContents"/> + <string key="NSKeyEquivalent"/> + <int key="NSPeriodicDelay">400</int> + <int key="NSPeriodicInterval">75</int> + </object> + <bool key="NSAllowsLogicalLayoutDirection">NO</bool> + </object> + <object class="NSButton" id="173020989"> + <reference key="NSNextResponder" ref="1006"/> + <int key="NSvFlags">266</int> + <string key="NSFrame">{{146, 45}, {110, 19}}</string> + <reference key="NSSuperview" ref="1006"/> + <reference key="NSNextKeyView" ref="17265301"/> + <string key="NSReuseIdentifierKey">_NS:1534</string> + <bool key="NSEnabled">YES</bool> + <object class="NSButtonCell" key="NSCell" id="50310263"> + <int key="NSCellFlags">-2080374784</int> + <int key="NSCellFlags2">134217728</int> + <string key="NSContents">deny access</string> + <reference key="NSSupport" ref="609726753"/> + <string key="NSCellIdentifier">_NS:1534</string> + <reference key="NSControlView" ref="173020989"/> + <int key="NSButtonFlags">-2038153216</int> + <int key="NSButtonFlags2">164</int> + <string key="NSAlternateContents"/> + <string key="NSKeyEquivalent"/> + <int key="NSPeriodicDelay">400</int> + <int key="NSPeriodicInterval">75</int> + </object> + <bool key="NSAllowsLogicalLayoutDirection">NO</bool> + </object> + <object class="NSButton" id="17265301"> + <reference key="NSNextResponder" ref="1006"/> + <int key="NSvFlags">266</int> + <string key="NSFrame">{{20, 19}, {236, 19}}</string> + <reference key="NSSuperview" ref="1006"/> + <string key="NSReuseIdentifierKey">_NS:1534</string> + <bool key="NSEnabled">YES</bool> + <object class="NSButtonCell" key="NSCell" id="577909785"> + <int key="NSCellFlags">-2080374784</int> + <int key="NSCellFlags2">134217728</int> + <string key="NSContents">save under different name</string> + <reference key="NSSupport" ref="609726753"/> + <string key="NSCellIdentifier">_NS:1534</string> + <reference key="NSControlView" ref="17265301"/> + <int key="NSButtonFlags">-2038153216</int> + <int key="NSButtonFlags2">164</int> + <string key="NSAlternateContents"/> + <string key="NSKeyEquivalent"/> + <int key="NSPeriodicDelay">400</int> + <int key="NSPeriodicInterval">75</int> + </object> + <bool key="NSAllowsLogicalLayoutDirection">NO</bool> + </object> + </array> + <string key="NSFrameSize">{276, 203}</string> + <reference key="NSSuperview"/> + <reference key="NSNextKeyView" ref="1043014274"/> + </object> + <string key="NSScreenRect">{{0, 0}, {1440, 878}}</string> + <string key="NSMinSize">{276, 225}</string> + <string key="NSMaxSize">{276, 225}</string> + <bool key="NSWindowIsRestorable">YES</bool> + </object> + <object class="NSUserDefaultsController" id="896102830"> + <bool key="NSSharedInstance">YES</bool> + </object> + </array> + <object class="IBObjectContainer" key="IBDocument.Objects"> + <array class="NSMutableArray" key="connectionRecords"> + <object class="IBConnectionRecord"> + <object class="IBOutletConnection" key="connection"> + <string key="label">window</string> + <reference key="source" ref="1001"/> + <reference key="destination" ref="1005"/> + </object> + <int key="connectionID">37</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBActionConnection" key="connection"> + <string key="label">rename:</string> + <reference key="source" ref="1001"/> + <reference key="destination" ref="17265301"/> + </object> + <int key="connectionID">40</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBActionConnection" key="connection"> + <string key="label">deny:</string> + <reference key="source" ref="1001"/> + <reference key="destination" ref="173020989"/> + </object> + <int key="connectionID">46</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBActionConnection" key="connection"> + <string key="label">letItBe:</string> + <reference key="source" ref="1001"/> + <reference key="destination" ref="454803690"/> + </object> + <int key="connectionID">47</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBOutletConnection" key="connection"> + <string key="label">allowButton</string> + <reference key="source" ref="1001"/> + <reference key="destination" ref="454803690"/> + </object> + <int key="connectionID">48</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBOutletConnection" key="connection"> + <string key="label">denyButton</string> + <reference key="source" ref="1001"/> + <reference key="destination" ref="173020989"/> + </object> + <int key="connectionID">49</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBOutletConnection" key="connection"> + <string key="label">renameButton</string> + <reference key="source" ref="1001"/> + <reference key="destination" ref="17265301"/> + </object> + <int key="connectionID">50</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBOutletConnection" key="connection"> + <string key="label">delegate</string> + <reference key="source" ref="1005"/> + <reference key="destination" ref="1001"/> + </object> + <int key="connectionID">36</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBBindingConnection" key="connection"> + <string key="label">value: self.remoteHost</string> + <reference key="source" ref="493109509"/> + <reference key="destination" ref="1001"/> + <object class="NSNibBindingConnector" key="connector"> + <reference key="NSSource" ref="493109509"/> + <reference key="NSDestination" ref="1001"/> + <string key="NSLabel">value: self.remoteHost</string> + <string key="NSBinding">value</string> + <string key="NSKeyPath">self.remoteHost</string> + <int key="NSNibBindingConnectorVersion">2</int> + </object> + </object> + <int key="connectionID">28</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBBindingConnection" key="connection"> + <string key="label">value: self.remoteAction</string> + <reference key="source" ref="442301359"/> + <reference key="destination" ref="1001"/> + <object class="NSNibBindingConnector" key="connector"> + <reference key="NSSource" ref="442301359"/> + <reference key="NSDestination" ref="1001"/> + <string key="NSLabel">value: self.remoteAction</string> + <string key="NSBinding">value</string> + <string key="NSKeyPath">self.remoteAction</string> + <int key="NSNibBindingConnectorVersion">2</int> + </object> + </object> + <int key="connectionID">30</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBBindingConnection" key="connection"> + <string key="label">value: self.fileName</string> + <reference key="source" ref="826265339"/> + <reference key="destination" ref="1001"/> + <object class="NSNibBindingConnector" key="connector"> + <reference key="NSSource" ref="826265339"/> + <reference key="NSDestination" ref="1001"/> + <string key="NSLabel">value: self.fileName</string> + <string key="NSBinding">value</string> + <string key="NSKeyPath">self.fileName</string> + <int key="NSNibBindingConnectorVersion">2</int> + </object> + </object> + <int key="connectionID">32</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBBindingConnection" key="connection"> + <string key="label">hidden: self.fileExists</string> + <reference key="source" ref="204620803"/> + <reference key="destination" ref="1001"/> + <object class="NSNibBindingConnector" key="connector"> + <reference key="NSSource" ref="204620803"/> + <reference key="NSDestination" ref="1001"/> + <string key="NSLabel">hidden: self.fileExists</string> + <string key="NSBinding">hidden</string> + <string key="NSKeyPath">self.fileExists</string> + <object class="NSDictionary" key="NSOptions"> + <string key="NS.key.0">NSValueTransformerName</string> + <string key="NS.object.0">NSNegateBoolean</string> + </object> + <int key="NSNibBindingConnectorVersion">2</int> + </object> + </object> + <int key="connectionID">35</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBBindingConnection" key="connection"> + <string key="label">hidden: self.writeRequest</string> + <reference key="source" ref="17265301"/> + <reference key="destination" ref="1001"/> + <object class="NSNibBindingConnector" key="connector"> + <reference key="NSSource" ref="17265301"/> + <reference key="NSDestination" ref="1001"/> + <string key="NSLabel">hidden: self.writeRequest</string> + <string key="NSBinding">hidden</string> + <string key="NSKeyPath">self.writeRequest</string> + <object class="NSDictionary" key="NSOptions"> + <string key="NS.key.0">NSValueTransformerName</string> + <string key="NS.object.0">NSNegateBoolean</string> + </object> + <int key="NSNibBindingConnectorVersion">2</int> + </object> + </object> + <int key="connectionID">45</int> + </object> + </array> + <object class="IBMutableOrderedSet" key="objectRecords"> + <array key="orderedObjects"> + <object class="IBObjectRecord"> + <int key="objectID">0</int> + <array key="object" id="0"/> + <reference key="children" ref="1000"/> + <nil key="parent"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">-2</int> + <reference key="object" ref="1001"/> + <reference key="parent" ref="0"/> + <string key="objectName">File's Owner</string> + </object> + <object class="IBObjectRecord"> + <int key="objectID">-1</int> + <reference key="object" ref="1003"/> + <reference key="parent" ref="0"/> + <string key="objectName">First Responder</string> + </object> + <object class="IBObjectRecord"> + <int key="objectID">-3</int> + <reference key="object" ref="1004"/> + <reference key="parent" ref="0"/> + <string key="objectName">Application</string> + </object> + <object class="IBObjectRecord"> + <int key="objectID">1</int> + <reference key="object" ref="1005"/> + <array class="NSMutableArray" key="children"> + <reference ref="1006"/> + </array> + <reference key="parent" ref="0"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">2</int> + <reference key="object" ref="1006"/> + <array class="NSMutableArray" key="children"> + <reference ref="1043014274"/> + <reference ref="493109509"/> + <reference ref="442301359"/> + <reference ref="204620803"/> + <reference ref="454803690"/> + <reference ref="173020989"/> + <reference ref="17265301"/> + <reference ref="826265339"/> + <reference ref="95446448"/> + </array> + <reference key="parent" ref="1005"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">3</int> + <reference key="object" ref="1043014274"/> + <array class="NSMutableArray" key="children"> + <reference ref="751681516"/> + </array> + <reference key="parent" ref="1006"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">4</int> + <reference key="object" ref="751681516"/> + <reference key="parent" ref="1043014274"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">5</int> + <reference key="object" ref="493109509"/> + <array class="NSMutableArray" key="children"> + <reference ref="808816111"/> + </array> + <reference key="parent" ref="1006"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">6</int> + <reference key="object" ref="808816111"/> + <reference key="parent" ref="493109509"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">7</int> + <reference key="object" ref="442301359"/> + <array class="NSMutableArray" key="children"> + <reference ref="570503156"/> + </array> + <reference key="parent" ref="1006"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">8</int> + <reference key="object" ref="570503156"/> + <reference key="parent" ref="442301359"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">9</int> + <reference key="object" ref="826265339"/> + <array class="NSMutableArray" key="children"> + <reference ref="64476756"/> + </array> + <reference key="parent" ref="1006"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">10</int> + <reference key="object" ref="64476756"/> + <reference key="parent" ref="826265339"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">11</int> + <reference key="object" ref="204620803"/> + <array class="NSMutableArray" key="children"> + <reference ref="957466536"/> + </array> + <reference key="parent" ref="1006"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">12</int> + <reference key="object" ref="957466536"/> + <reference key="parent" ref="204620803"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">13</int> + <reference key="object" ref="454803690"/> + <array class="NSMutableArray" key="children"> + <reference ref="239767303"/> + </array> + <reference key="parent" ref="1006"/> + <string key="objectName">Button - allow</string> + </object> + <object class="IBObjectRecord"> + <int key="objectID">14</int> + <reference key="object" ref="239767303"/> + <reference key="parent" ref="454803690"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">15</int> + <reference key="object" ref="95446448"/> + <array class="NSMutableArray" key="children"> + <reference ref="330029717"/> + </array> + <reference key="parent" ref="1006"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">16</int> + <reference key="object" ref="330029717"/> + <reference key="parent" ref="95446448"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">19</int> + <reference key="object" ref="173020989"/> + <array class="NSMutableArray" key="children"> + <reference ref="50310263"/> + </array> + <reference key="parent" ref="1006"/> + <string key="objectName">Button - deny</string> + </object> + <object class="IBObjectRecord"> + <int key="objectID">20</int> + <reference key="object" ref="50310263"/> + <reference key="parent" ref="173020989"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">21</int> + <reference key="object" ref="17265301"/> + <array class="NSMutableArray" key="children"> + <reference ref="577909785"/> + </array> + <reference key="parent" ref="1006"/> + <string key="objectName">Button - rename</string> + </object> + <object class="IBObjectRecord"> + <int key="objectID">22</int> + <reference key="object" ref="577909785"/> + <reference key="parent" ref="17265301"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">25</int> + <reference key="object" ref="896102830"/> + <reference key="parent" ref="0"/> + </object> + </array> + </object> + <dictionary class="NSMutableDictionary" key="flattenedProperties"> + <string key="-1.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> + <string key="-2.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> + <string key="-3.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> + <boolean value="YES" key="1.IBNSWindowAutoPositionCentersHorizontal"/> + <boolean value="YES" key="1.IBNSWindowAutoPositionCentersVertical"/> + <string key="1.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> + <string key="1.IBWindowTemplateEditedContentRect">{{357, 418}, {480, 270}}</string> + <boolean value="NO" key="1.NSWindowTemplate.visibleAtLaunch"/> + <string key="10.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> + <string key="11.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> + <string key="12.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> + <object class="NSMutableDictionary" key="13.IBAttributePlaceholdersKey"> + <string key="NS.key.0">ToolTip</string> + <object class="IBToolTipAttribute" key="NS.object.0"> + <string key="name">ToolTip</string> + <reference key="object" ref="454803690"/> + <string key="toolTip">Allow transfer.</string> + </object> + </object> + <string key="13.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> + <string key="14.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> + <string key="15.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> + <string key="16.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> + <object class="NSMutableDictionary" key="19.IBAttributePlaceholdersKey"> + <string key="NS.key.0">ToolTip</string> + <object class="IBToolTipAttribute" key="NS.object.0"> + <string key="name">ToolTip</string> + <reference key="object" ref="173020989"/> + <string key="toolTip">Send back the rejection.</string> + </object> + </object> + <string key="19.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> + <string key="2.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> + <string key="20.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> + <object class="NSMutableDictionary" key="21.IBAttributePlaceholdersKey"> + <string key="NS.key.0">ToolTip</string> + <object class="IBToolTipAttribute" key="NS.object.0"> + <string key="name">ToolTip</string> + <reference key="object" ref="17265301"/> + <string key="toolTip">Automatically rename file before saving.</string> + </object> + </object> + <string key="21.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> + <string key="22.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> + <string key="25.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> + <string key="3.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> + <string key="4.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> + <string key="5.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> + <string key="6.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> + <string key="7.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> + <string key="8.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> + <string key="9.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> + </dictionary> + <dictionary class="NSMutableDictionary" key="unlocalizedProperties"/> + <nil key="activeLocalization"/> + <dictionary class="NSMutableDictionary" key="localizations"/> + <nil key="sourceID"/> + <int key="maxID">50</int> + </object> + <object class="IBClassDescriber" key="IBDocument.Classes"/> + <int key="IBDocument.localizationMode">0</int> + <string key="IBDocument.TargetRuntimeIdentifier">IBCocoaFramework</string> + <object class="NSMutableDictionary" key="IBDocument.PluginDeclaredDevelopmentDependencies"> + <string key="NS.key.0">com.apple.InterfaceBuilder.CocoaPlugin.InterfaceBuilder3</string> + <real value="4000" key="NS.object.0"/> + </object> + <bool key="IBDocument.PluginDeclaredDependenciesTrackSystemTargetVersion">YES</bool> + <int key="IBDocument.defaultPropertyAccessControl">3</int> + </data> +</archive> diff --git a/pumpkin/Credits.rtf b/pumpkin/Credits.rtf new file mode 100644 index 0000000..3855c1a --- a/dev/null +++ b/pumpkin/Credits.rtf @@ -0,0 +1,17 @@ +{\rtf1\ansi\ansicpg1252\cocoartf1187\cocoasubrtf340 +{\fonttbl\f0\fswiss\fcharset0 Helvetica;} +{\colortbl;\red255\green255\blue255;} +\paperw11900\paperh16840\vieww9600\viewh8400\viewkind0 +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720 + +\f0\b\fs24 \cf0 \'a9 2012 Klever Group (http://www.klever.net/)\ +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural + +\b0 \cf0 \ +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\ +\ +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\ +\ +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720 + +\b \cf0 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.}
\ No newline at end of file diff --git a/pumpkin/DaemonListener.h b/pumpkin/DaemonListener.h new file mode 100644 index 0000000..1bb6f2a --- a/dev/null +++ b/pumpkin/DaemonListener.h @@ -0,0 +1,15 @@ + +#import <Cocoa/Cocoa.h> +#include <netinet/in.h> + +@class PumpKIN; +@interface DaemonListener : NSObject { + CFSocketRef sockie; + PumpKIN *pumpkin; + CFRunLoopSourceRef runloopSource; +} + ++(DaemonListener*)listenerWithDefaults; +-(void)callbackWithType:(CFSocketCallBackType)t addr:(CFDataRef)a data:(const void *)d; + +@end diff --git a/pumpkin/DaemonListener.m b/pumpkin/DaemonListener.m new file mode 100644 index 0000000..ab14296 --- a/dev/null +++ b/pumpkin/DaemonListener.m @@ -0,0 +1,111 @@ +#import "DaemonListener.h" +#import "TFTPPacket.h" +#import "SendXFer.h" +#import "ReceiveXFer.h" +#import "StringsAttached.h" + +#include <sys/socket.h> +#include <arpa/inet.h> +#include <sys/stat.h> + +static void cbListener(CFSocketRef sockie,CFSocketCallBackType cbt,CFDataRef cba, + const void *cbd,void *i) { + [(DaemonListener*)i callbackWithType:cbt addr:cba data:cbd]; +} + +@implementation DaemonListener + +-(void)callbackWithType:(CFSocketCallBackType)t addr:(CFDataRef)a data:(const void *)d { + switch(t) { + case kCFSocketDataCallBack: + { + struct sockaddr_in *sin = (struct sockaddr_in*)CFDataGetBytePtr(a); + if([pumpkin hasPeer:sin]) { + [pumpkin log:@"I'm already processing the request from %@",[NSString stringWithSocketAddress:sin]]; + return; + } + TFTPPacket *p = [TFTPPacket packetWithData:(NSData*)d]; + switch([p op]) { + case tftpOpRRQ: [[[SendXFer alloc] initWithPeer:sin andPacket:p] autorelease]; break; + case tftpOpWRQ: [[[ReceiveXFer alloc] initWithPeer:sin andPacket:p] autorelease]; break; + default: + [pumpkin log:@"Invalid OP %d received from %@",p.op,[NSString stringWithSocketAddress:sin]]; + break; + } + } + break; + default: + NSLog(@"unhandled callback: %lu",t); + break; + } +} + + +-(DaemonListener*)initWithAddress:(struct sockaddr_in*)sin { + if(!(self=[super init])) return self; + + pumpkin = NSApplication.sharedApplication.delegate; + + @try { + CFSocketContext ctx; + ctx.version = 0; + ctx.info = self; + ctx.retain = 0; ctx.release = 0; + ctx.copyDescription = 0; + sockie = CFSocketCreate(kCFAllocatorDefault,PF_INET,SOCK_DGRAM,IPPROTO_UDP, + kCFSocketReadCallBack|kCFSocketDataCallBack, + cbListener,&ctx); + if(ntohs(sin->sin_port)>1024) { + NSData *nsd = [NSData dataWithBytes:sin length:sizeof(*sin)]; + if(CFSocketSetAddress(sockie, (CFDataRef)nsd)) + [[NSException exceptionWithName:@"BindFailure" + reason:[NSString stringWithFormat:@"Binding failed, error code: %d", errno] + userInfo:@{@"errno": @errno} + ] raise]; + }else{ + const char *args[] = { + 0, + [[NSString stringWithFormat:@"%d", CFSocketGetNative(sockie)] UTF8String], + [[NSString stringWithHostAddress:sin] UTF8String], + [[NSString stringWithPortNumber:sin] UTF8String], + NULL + }; + [pumpkin runBiportal:args]; + } + }@catch(NSException *e) { + if(sockie) { + CFSocketInvalidate(sockie); + CFRelease(sockie); + } + @throw; + } + + runloopSource = CFSocketCreateRunLoopSource(kCFAllocatorDefault, sockie, 0); + CFRunLoopAddSource(CFRunLoopGetCurrent(),runloopSource, kCFRunLoopDefaultMode); + return self; +} + +-(void)dealloc { + if(runloopSource) { + CFRunLoopRemoveSource(CFRunLoopGetCurrent(), runloopSource, kCFRunLoopDefaultMode); + CFRelease(runloopSource); + } + if(sockie) { + CFSocketInvalidate(sockie); + CFRelease(sockie); + } + [super dealloc]; +} + ++(DaemonListener*) listenerWithDefaults { + struct sockaddr_in sin; + memset(&sin,0,sizeof(sin)); + sin.sin_len=sizeof(sin); + sin.sin_family=AF_INET; + id d = [[NSUserDefaultsController sharedUserDefaultsController] values]; + sin.sin_port=htons([[d valueForKey:@"bindPort"] intValue]); + sin.sin_addr.s_addr=inet_addr([[d valueForKey:@"bindAddress"] UTF8String]); + return [[[DaemonListener alloc] initWithAddress:&sin] autorelease]; +} + +@end diff --git a/pumpkin/IPFormatter.h b/pumpkin/IPFormatter.h new file mode 100644 index 0000000..c98f3a0 --- a/dev/null +++ b/pumpkin/IPFormatter.h @@ -0,0 +1,6 @@ + +#import <Foundation/Foundation.h> + +@interface IPFormatter : NSFormatter + +@end diff --git a/pumpkin/IPFormatter.m b/pumpkin/IPFormatter.m new file mode 100644 index 0000000..78a51b4 --- a/dev/null +++ b/pumpkin/IPFormatter.m @@ -0,0 +1,21 @@ + +#import "IPFormatter.h" +#include <arpa/inet.h> + +@implementation IPFormatter + +-(NSString *)stringForObjectValue:(id)obj { + if(![obj isKindOfClass:[NSString class]]) return nil; + return obj; +} + +-(BOOL)getObjectValue:(id*)anObject forString:(NSString*)string errorDescription:(NSString**)error { + if(inet_addr(string.UTF8String)==INADDR_NONE) { + if(error) *error=@"Doesn't look like an IP address to me"; + return NO; + } + *anObject = [NSString stringWithString:string]; + return YES; +} + +@end diff --git a/pumpkin/IPTransformer.h b/pumpkin/IPTransformer.h new file mode 100644 index 0000000..8c52c71 --- a/dev/null +++ b/pumpkin/IPTransformer.h @@ -0,0 +1,6 @@ + +#import <Foundation/Foundation.h> + +@interface IPTransformer : NSValueTransformer + +@end diff --git a/pumpkin/IPTransformer.m b/pumpkin/IPTransformer.m new file mode 100644 index 0000000..2307b05 --- a/dev/null +++ b/pumpkin/IPTransformer.m @@ -0,0 +1,21 @@ + +#import "IPTransformer.h" + +#include <arpa/inet.h> + +@implementation IPTransformer + ++(Class)transformedValueClass { return [NSString class]; } ++(BOOL)allowsReverseTransformation { return YES; } +-(id)transformedValue:(id)value { + if(value && + [value respondsToSelector:@selector(UTF8String)] + && inet_addr([value UTF8String])!=INADDR_NONE ) + return value; + return nil; +} +-(id)reverseTransformedValue:(id)value { + return [self transformedValue:value]; +} + +@end
\ No newline at end of file diff --git a/pumpkin/NSPortNumberTransformer.h b/pumpkin/NSPortNumberTransformer.h new file mode 100644 index 0000000..c9afb6c --- a/dev/null +++ b/pumpkin/NSPortNumberTransformer.h @@ -0,0 +1,5 @@ +#import <Foundation/Foundation.h> + +@interface NSPortNumberTransformer : NSValueTransformer + +@end diff --git a/pumpkin/NSPortNumberTransformer.m b/pumpkin/NSPortNumberTransformer.m new file mode 100644 index 0000000..e1a14a5 --- a/dev/null +++ b/pumpkin/NSPortNumberTransformer.m @@ -0,0 +1,22 @@ +#import "NSPortNumberTransformer.h" + +@implementation NSPortNumberTransformer + ++(Class)transformedValueClass { return [NSNumber class]; } ++(BOOL)allowsReverseTransformation { return YES; } +-(id)transformedValue:(id)value { + if(value==nil) return nil; + if(![value respondsToSelector:@selector(integerValue)]) return nil; + NSInteger rv = [value integerValue]; + if(rv<1 || rv>32767) return nil; + return [NSString stringWithFormat:@"%u",rv]; +} +-(id)reverseTransformedValue:(id)value { + if(value==nil) return nil; + if(![value respondsToSelector:@selector(integerValue)]) return nil; + NSInteger rv = [value integerValue]; + if(rv<1 || rv>32767) return nil; + return [NSNumber numberWithInteger:rv]; +} + +@end diff --git a/pumpkin/NumberTransformer.h b/pumpkin/NumberTransformer.h new file mode 100644 index 0000000..373950e --- a/dev/null +++ b/pumpkin/NumberTransformer.h @@ -0,0 +1,6 @@ + +#import <Foundation/Foundation.h> + +@interface NumberTransformer : NSValueTransformer + +@end diff --git a/pumpkin/NumberTransformer.m b/pumpkin/NumberTransformer.m new file mode 100644 index 0000000..c02cd8b --- a/dev/null +++ b/pumpkin/NumberTransformer.m @@ -0,0 +1,19 @@ + +#import "NumberTransformer.h" + +@implementation NumberTransformer + ++(Class)transformedValueClass { return [NSNumber class]; } ++(BOOL)allowsReverseTransformation { return YES; } +-(id)transformedValue:(id)value { + if(value==nil) return nil; + if(![value respondsToSelector:@selector(integerValue)]) return nil; + return [NSString stringWithFormat:@"%lu",[value integerValue]]; +} +-(id)reverseTransformedValue:(id)value { + if(value==nil) return nil; + if(![value respondsToSelector:@selector(integerValue)]) return nil; + return @([value integerValue]); +} + +@end diff --git a/pumpkin/PumpKIN.h b/pumpkin/PumpKIN.h new file mode 100644 index 0000000..d582c94 --- a/dev/null +++ b/pumpkin/PumpKIN.h @@ -0,0 +1,49 @@ +#import <Cocoa/Cocoa.h> +#import "DaemonListener.h" +#include <netinet/in.h> +#import "XFersViewDatasource.h" + +enum { + onRRQGive=0, onRRQPrompt, onRRQDeny, + onWRQTake=0, onWRQPromptIfExists, onWRQPrompt, onWRQDeny +}; + +@interface PumpKIN : NSObject <NSApplicationDelegate> { + NSWindow *window; + NSTextView *logger; + DaemonListener *listener; + NSWindow *preferencesWindow; + NSUserDefaultsController *theDefaults; + NSMutableArray *xfers; + NSTableView *xfersView; + XFersViewDatasource *xvDatasource; + NSToolbar *toolbar; +} + +@property (assign) IBOutlet NSWindow *window; +@property (assign) IBOutlet NSTextView *logger; +- (IBAction)showPreferences:(id)sender; +@property (assign) IBOutlet NSWindow *preferencesWindow; +@property (assign) IBOutlet NSUserDefaultsController *theDefaults; +- (IBAction)pickTFTPFolder:(id)sender; +- (IBAction)pickLogFile:(id)sender; +@property (assign) IBOutlet NSTableView *xfersView; +@property (readonly) BOOL hasSelectedXfer; +@property (assign) IBOutlet NSToolbar *toolbar; +- (IBAction)abortXfer:(id)sender; +- (IBAction)getFile:(id)sender; +- (IBAction)putFile:(id)sender; + ++(void)initialize; + +-(void)log:(NSString*)fmt,...; +-(void)registerXfer:(id)xfer; +-(void)unregisterXfer:(id)xfer; +-(void)updateXfers; +-(BOOL)hasPeer:(struct sockaddr_in*)sin; + +-(void)tableViewSelectionDidChange:(NSNotification*)an; + +- (void)runBiportal:(char const**)arg; + +@end diff --git a/pumpkin/PumpKIN.m b/pumpkin/PumpKIN.m new file mode 100644 index 0000000..9a4623a --- a/dev/null +++ b/pumpkin/PumpKIN.m @@ -0,0 +1,301 @@ +#include <stdarg.h> +#include <sys/stat.h> + +#import "PumpKIN.h" +#import "NumberTransformer.h" +#import "IPTransformer.h" +#import "XFer.h" +#import "XFersViewDatasource.h" +#import "ARequest.h" + + +@implementation PumpKIN +@synthesize toolbar; +@synthesize preferencesWindow; +@synthesize theDefaults; + +@synthesize window; +@synthesize logger; +@synthesize xfersView; + +-(void) updateListener { + if(listener) { + [listener release]; listener = nil; + } + if(![[theDefaults.values valueForKey:@"listen"] boolValue]) return; + @try { + listener = [[DaemonListener listenerWithDefaults] retain]; + } + @catch (NSException *e) { + [self log:@"Error starting the server. %@: %@",e.name,e.reason]; + NSAlert *a = [NSAlert alertWithMessageText:@"Failed to enable tftp server" defaultButton:@"OK" alternateButton:nil otherButton:nil informativeTextWithFormat:@"Failed to enable tftp server.\n%@\n\n%@",e.name,e.reason]; + a.alertStyle = NSWarningAlertStyle; + enum act_type { + actDont = 0, + actBindToAny = NSAlertThirdButtonReturn+1, + actRemoveTFTPD, actChangePort + }; + id en; + if (e.userInfo && (en=(e.userInfo)[@"errno"])) { + switch([en intValue]) { + case EADDRINUSE: + { + int p = [[theDefaults.values valueForKey:@"bindPort"] intValue]; + if(p==69) { + a.informativeText = @"The OS reports that the address is already in use.\n\n" + "It probably means, that some other programm is listening on the TFTP port." + " since Mac OS X comes with its own tftpd, it is the likeliest suspect." + " If you're going to use tftp server a lot, you may prefer to use that one." + " If you want to use PumpKIN, you can either use unprivileged port (but make sure" + " the client is aware of that and supports it) or unload Apple tftpd using" + " command 'launchctl remove com.apple.tftpd' (as root). I can try doing either for you."; + [a addButtonWithTitle:@"Change port to 6969"].tag = actChangePort; + [a addButtonWithTitle:@"Try to stop Apple's tftpd"].tag = actRemoveTFTPD; + }else if(p!=6969) { + a.informativeText = @"The OS reports that the address is already in use.\n\n" + "It probably means, that some other program is listening on the port." + " you can either try to find out who's using the port and shut it down or" + " change the port. Make sure to notify your peers of the change." + " I can help you with changing the port."; + [a addButtonWithTitle:@"Change port to 6969"].tag = actChangePort; + }else { + a.informativeText = @"The OS reports that the address is already in use.\n\n" + "It probably means that some other program is listening on the port." + "You should either change port to the one that is not used or find the" + " offending program and shut it down. Or go on without server."; + } + } + break; + case EADDRNOTAVAIL: + a.informativeText = @"The OS reports that the address is not available.\n\n" + "It probably means, that the IP address you specified is not configured on this machine.\n\n" + "You can either ignore the error and go on without TFTP server, fix the ip address, by entering the one" + " that is configured, or bind to the special '0.0.0.0' ip address which means listen to any" + " address configured. The latter you can do automatically with a single click below."; + [a addButtonWithTitle:@"Listen to any address"].tag = actBindToAny; + [a addButtonWithTitle:@"Try removing Apple's daemon"].tag = actRemoveTFTPD; + break; + } + }; + [theDefaults.values setValue:@NO forKey:@"listen"]; + switch([a runModal]) { + case actBindToAny: + [NSTimer scheduledTimerWithTimeInterval:0 target:self selector:@selector(bindToAny) userInfo:nil repeats:NO]; + break; + case actChangePort: + [NSTimer scheduledTimerWithTimeInterval:0 target:self selector:@selector(bindTo6969) userInfo:nil repeats:NO]; + break; + case actRemoveTFTPD: + { + @try { + char const *args[] = { 0,"-k",NULL }; + [self runBiportal:args]; + }@catch(NSException *e) { + [self log:@"Error trying to unload com.apple.tftpd. %@: %@",e.name,e.reason]; + } + } + [NSTimer scheduledTimerWithTimeInterval:0 target:self selector:@selector(bindAgain) userInfo:nil repeats:NO]; + break; + } + } +} + +-(void)bindAgain { + [theDefaults.values setValue:@YES forKey:@"listen"]; +} +-(void)bindTo6969 { + [theDefaults.values setValue:@6969 forKey:@"bindPort"]; + [self bindAgain]; +} +-(void)bindToAny { + [theDefaults.values setValue:@"0.0.0.0" forKey:@"bindAddress"]; + [self bindAgain]; +} + +- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context { + if( object==theDefaults && ( + [keyPath isEqualToString:@"values.listen"] + || [keyPath isEqualToString:@"values.bindPort"] + || [keyPath isEqualToString:@"values.bindAddress"]) ) { + [self updateListener]; + } +} + +- (void)applicationDidFinishLaunching:(NSNotification *)aNotification +{ + [theDefaults addObserver:self forKeyPath:@"values.listen" options:0 context:0]; + [theDefaults addObserver:self forKeyPath:@"values.bindAddress" options:0 context:0]; + [theDefaults addObserver:self forKeyPath:@"values.bindPort" options:0 context:0]; + + listener = nil; + [window.contentView setWantsLayer:true]; + window.backgroundColor = [NSColor colorWithPatternImage:[NSImage imageNamed:@"klever-background.png"]]; + xfersView.dataSource = (xvDatasource = [[XFersViewDatasource alloc] initWithXfers:xfers=[NSMutableArray arrayWithCapacity:4]]); + [self updateListener]; + if(![[theDefaults values] valueForKey:@"tftpRoot"]) + [self showPreferences:nil]; +} + +- (IBAction)showPreferences:(id)sender { + [preferencesWindow makeKeyAndOrderFront:preferencesWindow]; +} + +- (void)log:(NSString*)fmt,... { + va_list vl; va_start(vl, fmt); + NSString *s = [[[[NSString alloc] initWithFormat:fmt arguments:vl] autorelease] stringByAppendingString:@"\n"]; + va_end(vl); + NSString *lf = [theDefaults.values valueForKey:@"logFile"]; + if(lf && ![lf isEqualTo:@""]) { + NSFileHandle *l = [NSFileHandle fileHandleForWritingAtPath:lf]; + if(!l) { + [[NSFileManager defaultManager] createFileAtPath:lf contents:nil attributes:nil]; + l = [NSFileHandle fileHandleForWritingAtPath:lf]; + } + if(!l) { + static NSString *bl = nil; + if(!(bl && [bl isEqualToString:lf])) { + [[logger textStorage] appendAttributedString:[[[NSAttributedString alloc] initWithString: + [NSString stringWithFormat:@"Failed to open/create '%@' log file\n",lf] ] autorelease]]; + if(bl) [bl release]; + bl = [NSString stringWithString:lf]; + } + }else{ + [l seekToEndOfFile]; + [l writeData:[[NSString stringWithFormat:@"[%@] %@",[[NSDate date] description],s] dataUsingEncoding:NSUTF8StringEncoding]]; + [l closeFile]; + } + } + [[logger textStorage] appendAttributedString:[[[NSAttributedString alloc] initWithString: + s ] autorelease]]; + [logger scrollToEndOfDocument:nil]; +} + +-(void)registerXfer:(id)xfer { + [xfers insertObject:xfer atIndex:0]; + [self updateXfers]; +} +-(void)unregisterXfer:(id)xfer { + [xfers removeObject:xfer]; + [self updateXfers]; +} +-(void)updateXfers { + [xfersView reloadData]; +} +-(BOOL)hasPeer:(struct sockaddr_in*)sin { + return NSNotFound!=[xfers indexOfObjectPassingTest:^BOOL(XFer *x,NSUInteger i,BOOL *s) { + struct sockaddr_in *p = x.peer; + return p->sin_len==sin->sin_len && !memcmp(p, sin, p->sin_len); + }]; +} + +-(BOOL)hasSelectedXfer { + return [xfersView selectedRow]>=0; +} + +-(void)tableViewSelectionDidChange:(NSNotification *)an { + [toolbar validateVisibleItems]; +} +-(BOOL)validateToolbarItem:(NSToolbarItem *)theItem { + if([theItem.itemIdentifier isEqualToString:@"abort_xfer"]) + return self.hasSelectedXfer; + return YES; +} +-(IBAction)abortXfer:(id)sender { + NSInteger r = [xfersView selectedRow]; + NSAssert(r>=0,@"no selected row"); + if(r<0) return; + XFer *x = xfers[r]; + [self log:@"Aborting transfer of '%@' %@",x.xferFilename,x.xferPrefix]; + [x abort]; +} + +- (IBAction)getFile:(id)sender { + [ARequest getFile]; +} +- (IBAction)putFile:(id)sender { + [ARequest putFile]; +} + +- (IBAction)pickTFTPFolder:(id)sender { + NSOpenPanel *op = [NSOpenPanel openPanel]; + op.canChooseDirectories = YES; op.canChooseFiles = NO; + op.canCreateDirectories = YES; + op.allowsMultipleSelection = NO; + op.prompt = @"Set TFTP root"; + op.title = @"TFTP root"; + op.nameFieldLabel = @"TFTP root:"; + if([op runModal]!=NSFileHandlingPanelOKButton) return; + [[theDefaults values] setValue:op.URL.path forKey:@"tftpRoot"]; +} + +- (IBAction)pickLogFile:(id)sender { + NSSavePanel *op = [NSSavePanel savePanel]; + op.canCreateDirectories = YES; + op.prompt = @"Set log file"; + op.title = @"Log to"; + op.nameFieldLabel = @"Log to"; + if([op runModal]!=NSFileHandlingPanelOKButton) return; + [[theDefaults values] setValue:op.URL.path forKey:@"logFile"]; + +} + +- (void)runBiportal:(char const**)args { + FILE *f=NULL; + AuthorizationRef a=nil; + @try { + NSString *bip=[[NSBundle mainBundle] pathForAuxiliaryExecutable:@"biportal"]; + struct stat st; + if(stat(bip.UTF8String, &st)) [NSException raise:@"ToolFailure" format:@"Can't see my tool"]; + if(st.st_uid || !(st.st_mode&S_ISUID)) { + OSStatus r = AuthorizationCreate(NULL, kAuthorizationEmptyEnvironment, kAuthorizationFlagDefaults, &a); + if(r!=errAuthorizationSuccess) + [NSException raise:@"AuthFailure" format:@"failed to AuthorizationCreate(): %d",r]; + AuthorizationItem ai = {kAuthorizationRightExecute,0,NULL,0}; + AuthorizationRights ar = {1,&ai}; + r = AuthorizationCopyRights(a, &ar, NULL, kAuthorizationFlagDefaults|kAuthorizationFlagInteractionAllowed|kAuthorizationFlagPreAuthorize|kAuthorizationFlagExtendRights, NULL); + if(r!=errAuthorizationSuccess) + [NSException raise:@"AuthFailure" format:@"failed to AuthorizationCopyRights(): %d",r]; + const char *args[] = { NULL }; +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wdeprecated" + r = AuthorizationExecuteWithPrivileges(a,bip.UTF8String, + kAuthorizationFlagDefaults, (char*const*)args, &f); +#pragma GCC diagnostic pop + if(r!=errAuthorizationSuccess) + [NSException raise:@"AuthFailure" format:@"failed to AuthorizationExecuteWithPrivileges(): %d",r]; + int e; + int sr = fscanf(f, "%d", &e); + fclose(f),f=NULL; + if(sr!=1) + [NSException raise:@"ToolFailure" format:@"failed to setup tool"]; + if(e) + [NSException raise:@"ToolFailure" format:@"failed to setup tool, error code: %d",e]; + } + *args = bip.UTF8String; + pid_t p = fork(); + if(p<0) [NSException raise:@"ToolFailure" format:@"failed to fork"]; + if(!p) execv(*args,(char**)args), exit(errno); + int r, wp; + while((wp=waitpid(p,&r,0))<0 && errno==EINTR); + if(wp!=p) [NSException raise:@"ToolFailure" format:@"failed to wait for tool"]; + if(!WIFEXITED(r)) [NSException raise:@"ToolFailure" format:@"tool failed"]; + if(WEXITSTATUS(r)) { + [[NSException exceptionWithName:@"ToolFailure" reason:[NSString stringWithFormat:@"tool failed, error code: %d", WEXITSTATUS(r)] userInfo:@{@"errno": @WEXITSTATUS(r)}] raise]; + } + }@finally { + if(f) fclose(f); + if(a) AuthorizationFree(a,kAuthorizationFlagDefaults); + } +} + ++(void)initialize { + [[NSUserDefaultsController sharedUserDefaultsController] setInitialValues: + [NSDictionary dictionaryWithContentsOfFile: + [[NSBundle mainBundle] pathForResource:@"pumpkin-defaults" ofType:@"plist"] + ] + ]; + [NSValueTransformer setValueTransformer:[[[NumberTransformer alloc] init] autorelease] forName:@"PortNumberTransformer"]; + [NSValueTransformer setValueTransformer:[[[IPTransformer alloc] init] autorelease] forName:@"IPAddressTransformer"]; +} + +@end diff --git a/pumpkin/PumpKIN.xib b/pumpkin/PumpKIN.xib new file mode 100644 index 0000000..8e76afe --- a/dev/null +++ b/pumpkin/PumpKIN.xib @@ -0,0 +1,4251 @@ +<?xml version="1.0" encoding="UTF-8"?> +<archive type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="8.00"> + <data> + <int key="IBDocument.SystemTarget">1080</int> + <string key="IBDocument.SystemVersion">12C60</string> + <string key="IBDocument.InterfaceBuilderVersion">2844</string> + <string key="IBDocument.AppKitVersion">1187.34</string> + <string key="IBDocument.HIToolboxVersion">625.00</string> + <object class="NSMutableDictionary" key="IBDocument.PluginVersions"> + <string key="NS.key.0">com.apple.InterfaceBuilder.CocoaPlugin</string> + <string key="NS.object.0">2844</string> + </object> + <array key="IBDocument.IntegratedClassDependencies"> + <string>IBCustomFormatter</string> + <string>NSBox</string> + <string>NSButton</string> + <string>NSButtonCell</string> + <string>NSCustomObject</string> + <string>NSCustomView</string> + <string>NSMatrix</string> + <string>NSMenu</string> + <string>NSMenuItem</string> + <string>NSNumberFormatter</string> + <string>NSScrollView</string> + <string>NSScroller</string> + <string>NSSplitView</string> + <string>NSTableColumn</string> + <string>NSTableHeaderView</string> + <string>NSTableView</string> + <string>NSTextField</string> + <string>NSTextFieldCell</string> + <string>NSTextView</string> + <string>NSToolbar</string> + <string>NSToolbarFlexibleSpaceItem</string> + <string>NSToolbarItem</string> + <string>NSToolbarSpaceItem</string> + <string>NSUserDefaultsController</string> + <string>NSView</string> + <string>NSWindowTemplate</string> + </array> + <array key="IBDocument.PluginDependencies"> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + </array> + <object class="NSMutableDictionary" key="IBDocument.Metadata"> + <string key="NS.key.0">PluginDependencyRecalculationVersion</string> + <integer value="1" key="NS.object.0"/> + </object> + <array class="NSMutableArray" key="IBDocument.RootObjects" id="1048"> + <object class="NSCustomObject" id="1021"> + <string key="NSClassName">NSApplication</string> + </object> + <object class="NSCustomObject" id="1014"> + <string key="NSClassName">FirstResponder</string> + </object> + <object class="NSCustomObject" id="1050"> + <string key="NSClassName">NSApplication</string> + </object> + <object class="NSMenu" id="649796088"> + <string key="NSTitle">AMainMenu</string> + <array class="NSMutableArray" key="NSMenuItems"> + <object class="NSMenuItem" id="694149608"> + <reference key="NSMenu" ref="649796088"/> + <string key="NSTitle">PumpKIN</string> + <string key="NSKeyEquiv"/> + <int key="NSKeyEquivModMask">1048576</int> + <int key="NSMnemonicLoc">2147483647</int> + <object class="NSCustomResource" key="NSOnImage" id="35465992"> + <string key="NSClassName">NSImage</string> + <string key="NSResourceName">NSMenuCheckmark</string> + </object> + <object class="NSCustomResource" key="NSMixedImage" id="502551668"> + <string key="NSClassName">NSImage</string> + <string key="NSResourceName">NSMenuMixedState</string> + </object> + <string key="NSAction">submenuAction:</string> + <object class="NSMenu" key="NSSubmenu" id="110575045"> + <string key="NSTitle">PumpKIN</string> + <array class="NSMutableArray" key="NSMenuItems"> + <object class="NSMenuItem" id="238522557"> + <reference key="NSMenu" ref="110575045"/> + <string key="NSTitle">About PumpKIN</string> + <string key="NSKeyEquiv"/> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + </object> + <object class="NSMenuItem" id="304266470"> + <reference key="NSMenu" ref="110575045"/> + <bool key="NSIsDisabled">YES</bool> + <bool key="NSIsSeparator">YES</bool> + <string key="NSTitle"/> + <string key="NSKeyEquiv"/> + <int key="NSKeyEquivModMask">1048576</int> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + </object> + <object class="NSMenuItem" id="609285721"> + <reference key="NSMenu" ref="110575045"/> + <string key="NSTitle">Preferences…</string> + <string key="NSKeyEquiv">,</string> + <int key="NSKeyEquivModMask">1048576</int> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + </object> + <object class="NSMenuItem" id="481834944"> + <reference key="NSMenu" ref="110575045"/> + <bool key="NSIsDisabled">YES</bool> + <bool key="NSIsSeparator">YES</bool> + <string key="NSTitle"/> + <string key="NSKeyEquiv"/> + <int key="NSKeyEquivModMask">1048576</int> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + </object> + <object class="NSMenuItem" id="1046388886"> + <reference key="NSMenu" ref="110575045"/> + <string key="NSTitle">Services</string> + <string key="NSKeyEquiv"/> + <int key="NSKeyEquivModMask">1048576</int> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + <string key="NSAction">submenuAction:</string> + <object class="NSMenu" key="NSSubmenu" id="752062318"> + <string key="NSTitle">Services</string> + <array class="NSMutableArray" key="NSMenuItems"/> + <string key="NSName">_NSServicesMenu</string> + </object> + </object> + <object class="NSMenuItem" id="646227648"> + <reference key="NSMenu" ref="110575045"/> + <bool key="NSIsDisabled">YES</bool> + <bool key="NSIsSeparator">YES</bool> + <string key="NSTitle"/> + <string key="NSKeyEquiv"/> + <int key="NSKeyEquivModMask">1048576</int> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + </object> + <object class="NSMenuItem" id="755159360"> + <reference key="NSMenu" ref="110575045"/> + <string key="NSTitle">Hide PumpKIN</string> + <string key="NSKeyEquiv">h</string> + <int key="NSKeyEquivModMask">1048576</int> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + </object> + <object class="NSMenuItem" id="342932134"> + <reference key="NSMenu" ref="110575045"/> + <string key="NSTitle">Hide Others</string> + <string key="NSKeyEquiv">h</string> + <int key="NSKeyEquivModMask">1572864</int> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + </object> + <object class="NSMenuItem" id="908899353"> + <reference key="NSMenu" ref="110575045"/> + <string key="NSTitle">Show All</string> + <string key="NSKeyEquiv"/> + <int key="NSKeyEquivModMask">1048576</int> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + </object> + <object class="NSMenuItem" id="1056857174"> + <reference key="NSMenu" ref="110575045"/> + <bool key="NSIsDisabled">YES</bool> + <bool key="NSIsSeparator">YES</bool> + <string key="NSTitle"/> + <string key="NSKeyEquiv"/> + <int key="NSKeyEquivModMask">1048576</int> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + </object> + <object class="NSMenuItem" id="632727374"> + <reference key="NSMenu" ref="110575045"/> + <string key="NSTitle">Quit PumpKIN</string> + <string key="NSKeyEquiv">q</string> + <int key="NSKeyEquivModMask">1048576</int> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + </object> + </array> + <string key="NSName">_NSAppleMenu</string> + </object> + </object> + <object class="NSMenuItem" id="379814623"> + <reference key="NSMenu" ref="649796088"/> + <string key="NSTitle">XFer</string> + <string key="NSKeyEquiv"/> + <int key="NSKeyEquivModMask">1048576</int> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + <string key="NSAction">submenuAction:</string> + <object class="NSMenu" key="NSSubmenu" id="720053764"> + <string key="NSTitle">XFer</string> + <array class="NSMutableArray" key="NSMenuItems"> + <object class="NSMenuItem" id="869342911"> + <reference key="NSMenu" ref="720053764"/> + <string key="NSTitle">Get file</string> + <string key="NSKeyEquiv">g</string> + <int key="NSKeyEquivModMask">1048576</int> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + </object> + <object class="NSMenuItem" id="684754710"> + <reference key="NSMenu" ref="720053764"/> + <string key="NSTitle">Put file</string> + <string key="NSKeyEquiv">p</string> + <int key="NSKeyEquivModMask">1048576</int> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + </object> + <object class="NSMenuItem" id="511451131"> + <reference key="NSMenu" ref="720053764"/> + <bool key="NSIsDisabled">YES</bool> + <bool key="NSIsSeparator">YES</bool> + <string key="NSTitle"/> + <string key="NSKeyEquiv"/> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + </object> + <object class="NSMenuItem" id="964116338"> + <reference key="NSMenu" ref="720053764"/> + <string key="NSTitle">Abort xfer</string> + <string key="NSKeyEquiv"/> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + </object> + </array> + </object> + </object> + <object class="NSMenuItem" id="952259628"> + <reference key="NSMenu" ref="649796088"/> + <string key="NSTitle">Edit</string> + <string key="NSKeyEquiv"/> + <int key="NSKeyEquivModMask">1048576</int> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + <string key="NSAction">submenuAction:</string> + <object class="NSMenu" key="NSSubmenu" id="789758025"> + <string key="NSTitle">Edit</string> + <array class="NSMutableArray" key="NSMenuItems"> + <object class="NSMenuItem" id="1058277027"> + <reference key="NSMenu" ref="789758025"/> + <string key="NSTitle">Undo</string> + <string key="NSKeyEquiv">z</string> + <int key="NSKeyEquivModMask">1048576</int> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + </object> + <object class="NSMenuItem" id="790794224"> + <reference key="NSMenu" ref="789758025"/> + <string key="NSTitle">Redo</string> + <string key="NSKeyEquiv">Z</string> + <int key="NSKeyEquivModMask">1179648</int> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + </object> + <object class="NSMenuItem" id="1040322652"> + <reference key="NSMenu" ref="789758025"/> + <bool key="NSIsDisabled">YES</bool> + <bool key="NSIsSeparator">YES</bool> + <string key="NSTitle"/> + <string key="NSKeyEquiv"/> + <int key="NSKeyEquivModMask">1048576</int> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + </object> + <object class="NSMenuItem" id="296257095"> + <reference key="NSMenu" ref="789758025"/> + <string key="NSTitle">Cut</string> + <string key="NSKeyEquiv">x</string> + <int key="NSKeyEquivModMask">1048576</int> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + </object> + <object class="NSMenuItem" id="860595796"> + <reference key="NSMenu" ref="789758025"/> + <string key="NSTitle">Copy</string> + <string key="NSKeyEquiv">c</string> + <int key="NSKeyEquivModMask">1048576</int> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + </object> + <object class="NSMenuItem" id="29853731"> + <reference key="NSMenu" ref="789758025"/> + <string key="NSTitle">Paste</string> + <string key="NSKeyEquiv">v</string> + <int key="NSKeyEquivModMask">1048576</int> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + </object> + <object class="NSMenuItem" id="82994268"> + <reference key="NSMenu" ref="789758025"/> + <string key="NSTitle">Paste and Match Style</string> + <string key="NSKeyEquiv">V</string> + <int key="NSKeyEquivModMask">1572864</int> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + </object> + <object class="NSMenuItem" id="437104165"> + <reference key="NSMenu" ref="789758025"/> + <string key="NSTitle">Delete</string> + <string key="NSKeyEquiv"/> + <int key="NSKeyEquivModMask">1048576</int> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + </object> + <object class="NSMenuItem" id="583158037"> + <reference key="NSMenu" ref="789758025"/> + <string key="NSTitle">Select All</string> + <string key="NSKeyEquiv">a</string> + <int key="NSKeyEquivModMask">1048576</int> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + </object> + <object class="NSMenuItem" id="212016141"> + <reference key="NSMenu" ref="789758025"/> + <bool key="NSIsDisabled">YES</bool> + <bool key="NSIsSeparator">YES</bool> + <string key="NSTitle"/> + <string key="NSKeyEquiv"/> + <int key="NSKeyEquivModMask">1048576</int> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + </object> + <object class="NSMenuItem" id="892235320"> + <reference key="NSMenu" ref="789758025"/> + <string key="NSTitle">Find</string> + <string key="NSKeyEquiv"/> + <int key="NSKeyEquivModMask">1048576</int> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + <string key="NSAction">submenuAction:</string> + <object class="NSMenu" key="NSSubmenu" id="963351320"> + <string key="NSTitle">Find</string> + <array class="NSMutableArray" key="NSMenuItems"> + <object class="NSMenuItem" id="447796847"> + <reference key="NSMenu" ref="963351320"/> + <string key="NSTitle">Find…</string> + <string key="NSKeyEquiv">f</string> + <int key="NSKeyEquivModMask">1048576</int> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + <int key="NSTag">1</int> + </object> + <object class="NSMenuItem" id="738670835"> + <reference key="NSMenu" ref="963351320"/> + <string key="NSTitle">Find and Replace…</string> + <string key="NSKeyEquiv">f</string> + <int key="NSKeyEquivModMask">1572864</int> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + <int key="NSTag">12</int> + </object> + <object class="NSMenuItem" id="326711663"> + <reference key="NSMenu" ref="963351320"/> + <string key="NSTitle">Find Next</string> + <string key="NSKeyEquiv">g</string> + <int key="NSKeyEquivModMask">1048576</int> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + <int key="NSTag">2</int> + </object> + <object class="NSMenuItem" id="270902937"> + <reference key="NSMenu" ref="963351320"/> + <string key="NSTitle">Find Previous</string> + <string key="NSKeyEquiv">G</string> + <int key="NSKeyEquivModMask">1179648</int> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + <int key="NSTag">3</int> + </object> + <object class="NSMenuItem" id="159080638"> + <reference key="NSMenu" ref="963351320"/> + <string key="NSTitle">Use Selection for Find</string> + <string key="NSKeyEquiv">e</string> + <int key="NSKeyEquivModMask">1048576</int> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + <int key="NSTag">7</int> + </object> + <object class="NSMenuItem" id="88285865"> + <reference key="NSMenu" ref="963351320"/> + <string key="NSTitle">Jump to Selection</string> + <string key="NSKeyEquiv">j</string> + <int key="NSKeyEquivModMask">1048576</int> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + </object> + </array> + </object> + </object> + <object class="NSMenuItem" id="972420730"> + <reference key="NSMenu" ref="789758025"/> + <string key="NSTitle">Spelling and Grammar</string> + <string key="NSKeyEquiv"/> + <int key="NSKeyEquivModMask">1048576</int> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + <string key="NSAction">submenuAction:</string> + <object class="NSMenu" key="NSSubmenu" id="769623530"> + <string key="NSTitle">Spelling and Grammar</string> + <array class="NSMutableArray" key="NSMenuItems"> + <object class="NSMenuItem" id="679648819"> + <reference key="NSMenu" ref="769623530"/> + <string key="NSTitle">Show Spelling and Grammar</string> + <string key="NSKeyEquiv">:</string> + <int key="NSKeyEquivModMask">1048576</int> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + </object> + <object class="NSMenuItem" id="96193923"> + <reference key="NSMenu" ref="769623530"/> + <string key="NSTitle">Check Document Now</string> + <string key="NSKeyEquiv">;</string> + <int key="NSKeyEquivModMask">1048576</int> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + </object> + <object class="NSMenuItem" id="859480356"> + <reference key="NSMenu" ref="769623530"/> + <bool key="NSIsDisabled">YES</bool> + <bool key="NSIsSeparator">YES</bool> + <string key="NSTitle"/> + <string key="NSKeyEquiv"/> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + </object> + <object class="NSMenuItem" id="948374510"> + <reference key="NSMenu" ref="769623530"/> + <string key="NSTitle">Check Spelling While Typing</string> + <string key="NSKeyEquiv"/> + <int key="NSKeyEquivModMask">1048576</int> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + </object> + <object class="NSMenuItem" id="967646866"> + <reference key="NSMenu" ref="769623530"/> + <string key="NSTitle">Check Grammar With Spelling</string> + <string key="NSKeyEquiv"/> + <int key="NSKeyEquivModMask">1048576</int> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + </object> + <object class="NSMenuItem" id="795346622"> + <reference key="NSMenu" ref="769623530"/> + <string key="NSTitle">Correct Spelling Automatically</string> + <string key="NSKeyEquiv"/> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + </object> + </array> + </object> + </object> + <object class="NSMenuItem" id="507821607"> + <reference key="NSMenu" ref="789758025"/> + <string key="NSTitle">Substitutions</string> + <string key="NSKeyEquiv"/> + <int key="NSKeyEquivModMask">1048576</int> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + <string key="NSAction">submenuAction:</string> + <object class="NSMenu" key="NSSubmenu" id="698887838"> + <string key="NSTitle">Substitutions</string> + <array class="NSMutableArray" key="NSMenuItems"> + <object class="NSMenuItem" id="65139061"> + <reference key="NSMenu" ref="698887838"/> + <string key="NSTitle">Show Substitutions</string> + <string key="NSKeyEquiv"/> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + </object> + <object class="NSMenuItem" id="19036812"> + <reference key="NSMenu" ref="698887838"/> + <bool key="NSIsDisabled">YES</bool> + <bool key="NSIsSeparator">YES</bool> + <string key="NSTitle"/> + <string key="NSKeyEquiv"/> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + </object> + <object class="NSMenuItem" id="605118523"> + <reference key="NSMenu" ref="698887838"/> + <string key="NSTitle">Smart Copy/Paste</string> + <string key="NSKeyEquiv">f</string> + <int key="NSKeyEquivModMask">1048576</int> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + <int key="NSTag">1</int> + </object> + <object class="NSMenuItem" id="197661976"> + <reference key="NSMenu" ref="698887838"/> + <string key="NSTitle">Smart Quotes</string> + <string key="NSKeyEquiv">g</string> + <int key="NSKeyEquivModMask">1048576</int> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + <int key="NSTag">2</int> + </object> + <object class="NSMenuItem" id="672708820"> + <reference key="NSMenu" ref="698887838"/> + <string key="NSTitle">Smart Dashes</string> + <string key="NSKeyEquiv"/> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + </object> + <object class="NSMenuItem" id="708854459"> + <reference key="NSMenu" ref="698887838"/> + <string key="NSTitle">Smart Links</string> + <string key="NSKeyEquiv">G</string> + <int key="NSKeyEquivModMask">1179648</int> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + <int key="NSTag">3</int> + </object> + <object class="NSMenuItem" id="537092702"> + <reference key="NSMenu" ref="698887838"/> + <string key="NSTitle">Text Replacement</string> + <string key="NSKeyEquiv"/> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + </object> + </array> + </object> + </object> + <object class="NSMenuItem" id="288088188"> + <reference key="NSMenu" ref="789758025"/> + <string key="NSTitle">Transformations</string> + <string key="NSKeyEquiv"/> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + <string key="NSAction">submenuAction:</string> + <object class="NSMenu" key="NSSubmenu" id="579392910"> + <string key="NSTitle">Transformations</string> + <array class="NSMutableArray" key="NSMenuItems"> + <object class="NSMenuItem" id="1060694897"> + <reference key="NSMenu" ref="579392910"/> + <string key="NSTitle">Make Upper Case</string> + <string key="NSKeyEquiv"/> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + </object> + <object class="NSMenuItem" id="879586729"> + <reference key="NSMenu" ref="579392910"/> + <string key="NSTitle">Make Lower Case</string> + <string key="NSKeyEquiv"/> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + </object> + <object class="NSMenuItem" id="56570060"> + <reference key="NSMenu" ref="579392910"/> + <string key="NSTitle">Capitalize</string> + <string key="NSKeyEquiv"/> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + </object> + </array> + </object> + </object> + <object class="NSMenuItem" id="676164635"> + <reference key="NSMenu" ref="789758025"/> + <string key="NSTitle">Speech</string> + <string key="NSKeyEquiv"/> + <int key="NSKeyEquivModMask">1048576</int> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + <string key="NSAction">submenuAction:</string> + <object class="NSMenu" key="NSSubmenu" id="785027613"> + <string key="NSTitle">Speech</string> + <array class="NSMutableArray" key="NSMenuItems"> + <object class="NSMenuItem" id="731782645"> + <reference key="NSMenu" ref="785027613"/> + <string key="NSTitle">Start Speaking</string> + <string key="NSKeyEquiv"/> + <int key="NSKeyEquivModMask">1048576</int> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + </object> + <object class="NSMenuItem" id="680220178"> + <reference key="NSMenu" ref="785027613"/> + <string key="NSTitle">Stop Speaking</string> + <string key="NSKeyEquiv"/> + <int key="NSKeyEquivModMask">1048576</int> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + </object> + </array> + </object> + </object> + </array> + </object> + </object> + <object class="NSMenuItem" id="586577488"> + <reference key="NSMenu" ref="649796088"/> + <string key="NSTitle">View</string> + <string key="NSKeyEquiv"/> + <int key="NSKeyEquivModMask">1048576</int> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + <string key="NSAction">submenuAction:</string> + <object class="NSMenu" key="NSSubmenu" id="466310130"> + <string key="NSTitle">View</string> + <array class="NSMutableArray" key="NSMenuItems"> + <object class="NSMenuItem" id="102151532"> + <reference key="NSMenu" ref="466310130"/> + <string key="NSTitle">Show Toolbar</string> + <string key="NSKeyEquiv">t</string> + <int key="NSKeyEquivModMask">1572864</int> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + </object> + <object class="NSMenuItem" id="237841660"> + <reference key="NSMenu" ref="466310130"/> + <string key="NSTitle">Customize Toolbar…</string> + <string key="NSKeyEquiv"/> + <int key="NSKeyEquivModMask">1048576</int> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + </object> + </array> + </object> + </object> + <object class="NSMenuItem" id="713487014"> + <reference key="NSMenu" ref="649796088"/> + <string key="NSTitle">Window</string> + <string key="NSKeyEquiv"/> + <int key="NSKeyEquivModMask">1048576</int> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + <string key="NSAction">submenuAction:</string> + <object class="NSMenu" key="NSSubmenu" id="835318025"> + <string key="NSTitle">Window</string> + <array class="NSMutableArray" key="NSMenuItems"> + <object class="NSMenuItem" id="1011231497"> + <reference key="NSMenu" ref="835318025"/> + <string key="NSTitle">Minimize</string> + <string key="NSKeyEquiv">m</string> + <int key="NSKeyEquivModMask">1048576</int> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + </object> + <object class="NSMenuItem" id="575023229"> + <reference key="NSMenu" ref="835318025"/> + <string key="NSTitle">Zoom</string> + <string key="NSKeyEquiv"/> + <int key="NSKeyEquivModMask">1048576</int> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + </object> + <object class="NSMenuItem" id="299356726"> + <reference key="NSMenu" ref="835318025"/> + <bool key="NSIsDisabled">YES</bool> + <bool key="NSIsSeparator">YES</bool> + <string key="NSTitle"/> + <string key="NSKeyEquiv"/> + <int key="NSKeyEquivModMask">1048576</int> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + </object> + <object class="NSMenuItem" id="625202149"> + <reference key="NSMenu" ref="835318025"/> + <string key="NSTitle">Bring All to Front</string> + <string key="NSKeyEquiv"/> + <int key="NSKeyEquivModMask">1048576</int> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + </object> + </array> + <string key="NSName">_NSWindowsMenu</string> + </object> + </object> + <object class="NSMenuItem" id="448692316"> + <reference key="NSMenu" ref="649796088"/> + <bool key="NSIsHidden">YES</bool> + <string key="NSTitle">Help</string> + <string key="NSKeyEquiv"/> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + <string key="NSAction">submenuAction:</string> + <object class="NSMenu" key="NSSubmenu" id="992780483"> + <string key="NSTitle">Help</string> + <array class="NSMutableArray" key="NSMenuItems"> + <object class="NSMenuItem" id="105068016"> + <reference key="NSMenu" ref="992780483"/> + <string key="NSTitle">PumpKIN Help</string> + <string key="NSKeyEquiv">?</string> + <int key="NSKeyEquivModMask">1048576</int> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + </object> + </array> + <string key="NSName">_NSHelpMenu</string> + </object> + </object> + </array> + <string key="NSName">_NSMainMenu</string> + </object> + <object class="NSWindowTemplate" id="972006081"> + <int key="NSWindowStyleMask">15</int> + <int key="NSWindowBacking">2</int> + <string key="NSWindowRect">{{335, 390}, {600, 322}}</string> + <int key="NSWTFlags">1954021376</int> + <string key="NSWindowTitle">PumpKIN</string> + <string key="NSWindowClass">NSWindow</string> + <object class="NSToolbar" key="NSViewClass" id="185334702"> + <object class="NSMutableString" key="NSToolbarIdentifier"> + <characters key="NS.bytes">348FD175-E511-41B0-AC1C-205ED57FC50B</characters> + </object> + <nil key="NSToolbarDelegate"/> + <bool key="NSToolbarPrefersToBeShown">YES</bool> + <bool key="NSToolbarShowsBaselineSeparator">YES</bool> + <bool key="NSToolbarAllowsUserCustomization">YES</bool> + <bool key="NSToolbarAutosavesConfiguration">NO</bool> + <int key="NSToolbarDisplayMode">1</int> + <int key="NSToolbarSizeMode">2</int> + <dictionary class="NSMutableDictionary" key="NSToolbarIBIdentifiedItems"> + <object class="NSToolbarItem" key="6D17B806-047D-4E35-9CBF-FA07113768DF" id="1051457108"> + <object class="NSMutableString" key="NSToolbarItemIdentifier"> + <characters key="NS.bytes">6D17B806-047D-4E35-9CBF-FA07113768DF</characters> + </object> + <string key="NSToolbarItemLabel">Abort xfer</string> + <string key="NSToolbarItemPaletteLabel">Abort xfer</string> + <string key="NSToolbarItemToolTip">Cancel transfer in progress.</string> + <nil key="NSToolbarItemView"/> + <object class="NSCustomResource" key="NSToolbarItemImage"> + <string key="NSClassName">NSImage</string> + <string key="NSResourceName">abort</string> + </object> + <nil key="NSToolbarItemTarget"/> + <nil key="NSToolbarItemAction"/> + <string key="NSToolbarItemMinSize">{0, 0}</string> + <string key="NSToolbarItemMaxSize">{0, 0}</string> + <bool key="NSToolbarItemEnabled">YES</bool> + <bool key="NSToolbarItemAutovalidates">YES</bool> + <int key="NSToolbarItemTag">-1</int> + <bool key="NSToolbarIsUserRemovable">YES</bool> + <int key="NSToolbarItemVisibilityPriority">0</int> + </object> + <object class="NSToolbarItem" key="7587C7D2-FAE0-4AF7-9DDB-64F34C45BD11" id="163657319"> + <object class="NSMutableString" key="NSToolbarItemIdentifier"> + <characters key="NS.bytes">7587C7D2-FAE0-4AF7-9DDB-64F34C45BD11</characters> + </object> + <string key="NSToolbarItemLabel">Put file</string> + <string key="NSToolbarItemPaletteLabel">Put file</string> + <string key="NSToolbarItemToolTip">Initiate WRQ request.</string> + <nil key="NSToolbarItemView"/> + <object class="NSCustomResource" key="NSToolbarItemImage"> + <string key="NSClassName">NSImage</string> + <string key="NSResourceName">put</string> + </object> + <nil key="NSToolbarItemTarget"/> + <nil key="NSToolbarItemAction"/> + <string key="NSToolbarItemMinSize">{0, 0}</string> + <string key="NSToolbarItemMaxSize">{0, 0}</string> + <bool key="NSToolbarItemEnabled">YES</bool> + <bool key="NSToolbarItemAutovalidates">YES</bool> + <int key="NSToolbarItemTag">-1</int> + <bool key="NSToolbarIsUserRemovable">YES</bool> + <int key="NSToolbarItemVisibilityPriority">0</int> + </object> + <object class="NSToolbarItem" key="FAB1C64D-0CC8-46A0-815A-6423AD586E28" id="210005870"> + <object class="NSMutableString" key="NSToolbarItemIdentifier"> + <characters key="NS.bytes">FAB1C64D-0CC8-46A0-815A-6423AD586E28</characters> + </object> + <string key="NSToolbarItemLabel">Get file</string> + <string key="NSToolbarItemPaletteLabel">Get file</string> + <string key="NSToolbarItemToolTip">Initiate RRQ request.</string> + <nil key="NSToolbarItemView"/> + <object class="NSCustomResource" key="NSToolbarItemImage"> + <string key="NSClassName">NSImage</string> + <string key="NSResourceName">get</string> + </object> + <nil key="NSToolbarItemTarget"/> + <nil key="NSToolbarItemAction"/> + <string key="NSToolbarItemMinSize">{0, 0}</string> + <string key="NSToolbarItemMaxSize">{0, 0}</string> + <bool key="NSToolbarItemEnabled">YES</bool> + <bool key="NSToolbarItemAutovalidates">YES</bool> + <int key="NSToolbarItemTag">-1</int> + <bool key="NSToolbarIsUserRemovable">YES</bool> + <int key="NSToolbarItemVisibilityPriority">0</int> + </object> + <object class="NSToolbarFlexibleSpaceItem" key="NSToolbarFlexibleSpaceItem" id="106903695"> + <string key="NSToolbarItemIdentifier">NSToolbarFlexibleSpaceItem</string> + <string key="NSToolbarItemLabel"/> + <string key="NSToolbarItemPaletteLabel">Flexible Space</string> + <nil key="NSToolbarItemToolTip"/> + <nil key="NSToolbarItemView"/> + <nil key="NSToolbarItemImage"/> + <nil key="NSToolbarItemTarget"/> + <nil key="NSToolbarItemAction"/> + <string key="NSToolbarItemMinSize">{1, 5}</string> + <string key="NSToolbarItemMaxSize">{20000, 32}</string> + <bool key="NSToolbarItemEnabled">YES</bool> + <bool key="NSToolbarItemAutovalidates">YES</bool> + <int key="NSToolbarItemTag">-1</int> + <bool key="NSToolbarIsUserRemovable">YES</bool> + <int key="NSToolbarItemVisibilityPriority">0</int> + <object class="NSMenuItem" key="NSToolbarItemMenuFormRepresentation"> + <bool key="NSIsDisabled">YES</bool> + <bool key="NSIsSeparator">YES</bool> + <string key="NSTitle"/> + <string key="NSKeyEquiv"/> + <int key="NSKeyEquivModMask">1048576</int> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + </object> + </object> + <object class="NSToolbarSpaceItem" key="NSToolbarSpaceItem" id="166245072"> + <string key="NSToolbarItemIdentifier">NSToolbarSpaceItem</string> + <string key="NSToolbarItemLabel"/> + <string key="NSToolbarItemPaletteLabel">Space</string> + <nil key="NSToolbarItemToolTip"/> + <nil key="NSToolbarItemView"/> + <nil key="NSToolbarItemImage"/> + <nil key="NSToolbarItemTarget"/> + <nil key="NSToolbarItemAction"/> + <string key="NSToolbarItemMinSize">{32, 5}</string> + <string key="NSToolbarItemMaxSize">{32, 32}</string> + <bool key="NSToolbarItemEnabled">YES</bool> + <bool key="NSToolbarItemAutovalidates">YES</bool> + <int key="NSToolbarItemTag">-1</int> + <bool key="NSToolbarIsUserRemovable">YES</bool> + <int key="NSToolbarItemVisibilityPriority">0</int> + <object class="NSMenuItem" key="NSToolbarItemMenuFormRepresentation"> + <bool key="NSIsDisabled">YES</bool> + <bool key="NSIsSeparator">YES</bool> + <string key="NSTitle"/> + <string key="NSKeyEquiv"/> + <int key="NSKeyEquivModMask">1048576</int> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + </object> + </object> + </dictionary> + <array key="NSToolbarIBAllowedItems"> + <reference ref="210005870"/> + <reference ref="163657319"/> + <reference ref="1051457108"/> + <reference ref="166245072"/> + <reference ref="106903695"/> + </array> + <array key="NSToolbarIBDefaultItems"> + <reference ref="210005870"/> + <reference ref="163657319"/> + <reference ref="1051457108"/> + <reference ref="166245072"/> + <reference ref="106903695"/> + </array> + <array key="NSToolbarIBSelectableItems" id="0"/> + </object> + <nil key="NSUserInterfaceItemIdentifier"/> + <string key="NSWindowContentMinSize">{492, 200}</string> + <object class="NSView" key="NSWindowView" id="439893737"> + <nil key="NSNextResponder"/> + <int key="NSvFlags">256</int> + <array class="NSMutableArray" key="NSSubviews"> + <object class="NSSplitView" id="250587056"> + <reference key="NSNextResponder" ref="439893737"/> + <int key="NSvFlags">274</int> + <array class="NSMutableArray" key="NSSubviews"> + <object class="NSCustomView" id="328183451"> + <reference key="NSNextResponder" ref="250587056"/> + <int key="NSvFlags">256</int> + <array class="NSMutableArray" key="NSSubviews"> + <object class="NSScrollView" id="192988542"> + <reference key="NSNextResponder" ref="328183451"/> + <int key="NSvFlags">274</int> + <array class="NSMutableArray" key="NSSubviews"> + <object class="NSClipView" id="790409929"> + <reference key="NSNextResponder" ref="192988542"/> + <int key="NSvFlags">2304</int> + <array class="NSMutableArray" key="NSSubviews"> + <object class="NSTableView" id="45603544"> + <reference key="NSNextResponder" ref="790409929"/> + <int key="NSvFlags">256</int> + <string key="NSFrameSize">{568, 115}</string> + <reference key="NSSuperview" ref="790409929"/> + <reference key="NSNextKeyView" ref="862834072"/> + <string key="NSReuseIdentifierKey">_NS:1197</string> + <bool key="NSEnabled">YES</bool> + <bool key="NSAllowsLogicalLayoutDirection">NO</bool> + <bool key="NSControlAllowsExpansionToolTips">YES</bool> + <object class="NSTableHeaderView" key="NSHeaderView" id="1022673745"> + <reference key="NSNextResponder" ref="862834072"/> + <int key="NSvFlags">256</int> + <string key="NSFrameSize">{568, 17}</string> + <reference key="NSSuperview" ref="862834072"/> + <reference key="NSNextKeyView" ref="790409929"/> + <string key="NSReuseIdentifierKey">_NS:1199</string> + <reference key="NSTableView" ref="45603544"/> + </object> + <object class="_NSCornerView" key="NSCornerView"> + <nil key="NSNextResponder"/> + <int key="NSvFlags">-2147483392</int> + <string key="NSFrame">{{224, 0}, {16, 17}}</string> + <string key="NSReuseIdentifierKey">_NS:1202</string> + </object> + <array class="NSMutableArray" key="NSTableColumns"> + <object class="NSTableColumn" id="919343863"> + <string key="NSIdentifier">fileName</string> + <double key="NSWidth">235</double> + <double key="NSMinWidth">40</double> + <double key="NSMaxWidth">1000</double> + <object class="NSTableHeaderCell" key="NSHeaderCell"> + <int key="NSCellFlags">75497536</int> + <int key="NSCellFlags2">2048</int> + <string key="NSContents">file</string> + <object class="NSFont" key="NSSupport" id="26"> + <string key="NSName">LucidaGrande</string> + <double key="NSSize">11</double> + <int key="NSfFlags">3100</int> + </object> + <object class="NSColor" key="NSBackgroundColor" id="1015974014"> + <int key="NSColorSpace">3</int> + <bytes key="NSWhite">MC4zMzMzMzI5ODU2AA</bytes> + </object> + <object class="NSColor" key="NSTextColor" id="778577558"> + <int key="NSColorSpace">6</int> + <string key="NSCatalogName">System</string> + <string key="NSColorName">headerTextColor</string> + <object class="NSColor" key="NSColor" id="515582523"> + <int key="NSColorSpace">3</int> + <bytes key="NSWhite">MAA</bytes> + </object> + </object> + </object> + <object class="NSTextFieldCell" key="NSDataCell" id="967877425"> + <int key="NSCellFlags">337641536</int> + <int key="NSCellFlags2">2048</int> + <string key="NSContents">Text Cell</string> + <object class="NSFont" key="NSSupport" id="809233629"> + <string key="NSName">LucidaGrande</string> + <double key="NSSize">13</double> + <int key="NSfFlags">1044</int> + </object> + <reference key="NSControlView" ref="45603544"/> + <object class="NSColor" key="NSBackgroundColor" id="933857092"> + <int key="NSColorSpace">6</int> + <string key="NSCatalogName">System</string> + <string key="NSColorName">controlBackgroundColor</string> + <object class="NSColor" key="NSColor" id="591163410"> + <int key="NSColorSpace">3</int> + <bytes key="NSWhite">MC42NjY2NjY2NjY3AA</bytes> + </object> + </object> + <object class="NSColor" key="NSTextColor" id="210721017"> + <int key="NSColorSpace">6</int> + <string key="NSCatalogName">System</string> + <string key="NSColorName">controlTextColor</string> + <reference key="NSColor" ref="515582523"/> + </object> + </object> + <int key="NSResizingMask">3</int> + <bool key="NSIsResizeable">YES</bool> + <reference key="NSTableView" ref="45603544"/> + </object> + <object class="NSTableColumn" id="1044915056"> + <string key="NSIdentifier">xferType</string> + <double key="NSWidth">40</double> + <double key="NSMinWidth">40</double> + <double key="NSMaxWidth">1000</double> + <object class="NSTableHeaderCell" key="NSHeaderCell"> + <int key="NSCellFlags">75497536</int> + <int key="NSCellFlags2">134219776</int> + <string key="NSContents">type</string> + <reference key="NSSupport" ref="26"/> + <reference key="NSBackgroundColor" ref="1015974014"/> + <reference key="NSTextColor" ref="778577558"/> + </object> + <object class="NSTextFieldCell" key="NSDataCell" id="1061781149"> + <int key="NSCellFlags">67108928</int> + <int key="NSCellFlags2">2048</int> + <string key="NSContents">Text Cell</string> + <reference key="NSSupport" ref="809233629"/> + <reference key="NSControlView" ref="45603544"/> + <reference key="NSBackgroundColor" ref="933857092"/> + <reference key="NSTextColor" ref="210721017"/> + </object> + <int key="NSResizingMask">3</int> + <bool key="NSIsResizeable">YES</bool> + <reference key="NSTableView" ref="45603544"/> + <string key="NSHeaderToolTip">TFTP transfer type.</string> + </object> + <object class="NSTableColumn" id="431807415"> + <string key="NSIdentifier">peerAddress</string> + <double key="NSWidth">150</double> + <double key="NSMinWidth">10</double> + <double key="NSMaxWidth">3.4028234663852886e+38</double> + <object class="NSTableHeaderCell" key="NSHeaderCell"> + <int key="NSCellFlags">75497536</int> + <int key="NSCellFlags2">134219776</int> + <string key="NSContents">peer</string> + <reference key="NSSupport" ref="26"/> + <object class="NSColor" key="NSBackgroundColor" id="459346940"> + <int key="NSColorSpace">6</int> + <string key="NSCatalogName">System</string> + <string key="NSColorName">headerColor</string> + <object class="NSColor" key="NSColor" id="771510757"> + <int key="NSColorSpace">3</int> + <bytes key="NSWhite">MQA</bytes> + </object> + </object> + <reference key="NSTextColor" ref="778577558"/> + </object> + <object class="NSTextFieldCell" key="NSDataCell" id="762484653"> + <int key="NSCellFlags">67108928</int> + <int key="NSCellFlags2">2048</int> + <string key="NSContents">Text Cell</string> + <reference key="NSSupport" ref="809233629"/> + <reference key="NSControlView" ref="45603544"/> + <reference key="NSBackgroundColor" ref="933857092"/> + <reference key="NSTextColor" ref="210721017"/> + </object> + <int key="NSResizingMask">3</int> + <bool key="NSIsResizeable">YES</bool> + <reference key="NSTableView" ref="45603544"/> + <string key="NSHeaderToolTip">Peer address.</string> + </object> + <object class="NSTableColumn" id="644944854"> + <string key="NSIdentifier">ackBytes</string> + <double key="NSWidth">64</double> + <double key="NSMinWidth">10</double> + <double key="NSMaxWidth">3.4028234663852886e+38</double> + <object class="NSTableHeaderCell" key="NSHeaderCell"> + <int key="NSCellFlags">75497536</int> + <int key="NSCellFlags2">134219776</int> + <string key="NSContents">ACK</string> + <reference key="NSSupport" ref="26"/> + <reference key="NSBackgroundColor" ref="459346940"/> + <reference key="NSTextColor" ref="778577558"/> + </object> + <object class="NSTextFieldCell" key="NSDataCell" id="730146075"> + <int key="NSCellFlags">67108928</int> + <int key="NSCellFlags2">67110912</int> + <string key="NSContents">Text Cell</string> + <reference key="NSSupport" ref="809233629"/> + <reference key="NSControlView" ref="45603544"/> + <reference key="NSBackgroundColor" ref="933857092"/> + <reference key="NSTextColor" ref="210721017"/> + </object> + <int key="NSResizingMask">3</int> + <bool key="NSIsResizeable">YES</bool> + <reference key="NSTableView" ref="45603544"/> + <string key="NSHeaderToolTip">Acknowledged (transferred) portion size.</string> + </object> + <object class="NSTableColumn" id="780404863"> + <string key="NSIdentifier">xferSize</string> + <double key="NSWidth">64</double> + <double key="NSMinWidth">10</double> + <double key="NSMaxWidth">3.4028234663852886e+38</double> + <object class="NSTableHeaderCell" key="NSHeaderCell"> + <int key="NSCellFlags">75497536</int> + <int key="NSCellFlags2">134219776</int> + <string key="NSContents">size</string> + <reference key="NSSupport" ref="26"/> + <reference key="NSBackgroundColor" ref="459346940"/> + <reference key="NSTextColor" ref="778577558"/> + </object> + <object class="NSTextFieldCell" key="NSDataCell" id="475925037"> + <int key="NSCellFlags">67108928</int> + <int key="NSCellFlags2">67110912</int> + <string key="NSContents">Text Cell</string> + <reference key="NSSupport" ref="809233629"/> + <reference key="NSControlView" ref="45603544"/> + <reference key="NSBackgroundColor" ref="933857092"/> + <reference key="NSTextColor" ref="210721017"/> + </object> + <int key="NSResizingMask">3</int> + <bool key="NSIsResizeable">YES</bool> + <reference key="NSTableView" ref="45603544"/> + <string key="NSHeaderToolTip">Total file size.</string> + </object> + </array> + <double key="NSIntercellSpacingWidth">3</double> + <double key="NSIntercellSpacingHeight">2</double> + <reference key="NSBackgroundColor" ref="771510757"/> + <object class="NSColor" key="NSGridColor"> + <int key="NSColorSpace">6</int> + <string key="NSCatalogName">System</string> + <string key="NSColorName">gridColor</string> + <object class="NSColor" key="NSColor" id="288383301"> + <int key="NSColorSpace">3</int> + <bytes key="NSWhite">MC41AA</bytes> + </object> + </object> + <double key="NSRowHeight">17</double> + <int key="NSTvFlags">-750780416</int> + <reference key="NSDelegate"/> + <reference key="NSDataSource"/> + <int key="NSColumnAutoresizingStyle">5</int> + <int key="NSDraggingSourceMaskForLocal">15</int> + <int key="NSDraggingSourceMaskForNonLocal">0</int> + <bool key="NSAllowsTypeSelect">YES</bool> + <int key="NSTableViewDraggingDestinationStyle">0</int> + <int key="NSTableViewGroupRowStyle">1</int> + </object> + </array> + <string key="NSFrame">{{1, 17}, {568, 115}}</string> + <reference key="NSSuperview" ref="192988542"/> + <reference key="NSNextKeyView" ref="45603544"/> + <string key="NSReuseIdentifierKey">_NS:1195</string> + <reference key="NSDocView" ref="45603544"/> + <reference key="NSBGColor" ref="933857092"/> + <int key="NScvFlags">4</int> + </object> + <object class="NSScroller" id="600095476"> + <reference key="NSNextResponder" ref="192988542"/> + <int key="NSvFlags">-2147483392</int> + <string key="NSFrame">{{224, 17}, {15, 102}}</string> + <reference key="NSSuperview" ref="192988542"/> + <reference key="NSNextKeyView" ref="427087625"/> + <string key="NSReuseIdentifierKey">_NS:1214</string> + <bool key="NSAllowsLogicalLayoutDirection">NO</bool> + <reference key="NSTarget" ref="192988542"/> + <string key="NSAction">_doScroller:</string> + <double key="NSCurValue">37</double> + <double key="NSPercent">0.1947367936372757</double> + </object> + <object class="NSScroller" id="1046047013"> + <reference key="NSNextResponder" ref="192988542"/> + <int key="NSvFlags">-2147483392</int> + <string key="NSFrame">{{1, 118}, {568, 15}}</string> + <reference key="NSSuperview" ref="192988542"/> + <reference key="NSNextKeyView" ref="600095476"/> + <string key="NSReuseIdentifierKey">_NS:1216</string> + <bool key="NSAllowsLogicalLayoutDirection">NO</bool> + <int key="NSsFlags">1</int> + <reference key="NSTarget" ref="192988542"/> + <string key="NSAction">_doScroller:</string> + <double key="NSPercent">0.99824253075571179</double> + </object> + <object class="NSClipView" id="862834072"> + <reference key="NSNextResponder" ref="192988542"/> + <int key="NSvFlags">2304</int> + <array class="NSMutableArray" key="NSSubviews"> + <reference ref="1022673745"/> + </array> + <string key="NSFrame">{{1, 0}, {568, 17}}</string> + <reference key="NSSuperview" ref="192988542"/> + <reference key="NSNextKeyView" ref="1022673745"/> + <string key="NSReuseIdentifierKey">_NS:1200</string> + <reference key="NSDocView" ref="1022673745"/> + <reference key="NSBGColor" ref="933857092"/> + <int key="NScvFlags">4</int> + </object> + </array> + <string key="NSFrameSize">{570, 133}</string> + <reference key="NSSuperview" ref="328183451"/> + <reference key="NSNextKeyView" ref="790409929"/> + <string key="NSReuseIdentifierKey">_NS:1193</string> + <int key="NSsFlags">133682</int> + <reference key="NSVScroller" ref="600095476"/> + <reference key="NSHScroller" ref="1046047013"/> + <reference key="NSContentView" ref="790409929"/> + <reference key="NSHeaderClipView" ref="862834072"/> + <bytes key="NSScrollAmts">QSAAAEEgAABBmAAAQZgAAA</bytes> + <double key="NSMinMagnification">0.25</double> + <double key="NSMaxMagnification">4</double> + <double key="NSMagnification">1</double> + </object> + </array> + <string key="NSFrameSize">{570, 133}</string> + <reference key="NSSuperview" ref="250587056"/> + <reference key="NSNextKeyView" ref="192988542"/> + <string key="NSReuseIdentifierKey">_NS:547</string> + <string key="NSClassName">NSView</string> + </object> + <object class="NSCustomView" id="427087625"> + <reference key="NSNextResponder" ref="250587056"/> + <int key="NSvFlags">256</int> + <array class="NSMutableArray" key="NSSubviews"> + <object class="NSScrollView" id="356109671"> + <reference key="NSNextResponder" ref="427087625"/> + <int key="NSvFlags">274</int> + <array class="NSMutableArray" key="NSSubviews"> + <object class="NSClipView" id="105628437"> + <reference key="NSNextResponder" ref="356109671"/> + <int key="NSvFlags">2304</int> + <array class="NSMutableArray" key="NSSubviews"> + <object class="NSTextView" id="827877557"> + <reference key="NSNextResponder" ref="105628437"/> + <int key="NSvFlags">2322</int> + <string key="NSFrameSize">{568, 130}</string> + <reference key="NSSuperview" ref="105628437"/> + <reference key="NSNextKeyView" ref="4720790"/> + <string key="NSReuseIdentifierKey">_NS:3760</string> + <object class="NSTextContainer" key="NSTextContainer" id="398997119"> + <object class="NSLayoutManager" key="NSLayoutManager"> + <object class="NSTextStorage" key="NSTextStorage"> + <object class="NSMutableString" key="NSString"> + <characters key="NS.bytes"/> + </object> + <nil key="NSDelegate"/> + </object> + <array class="NSMutableArray" key="NSTextContainers"> + <reference ref="398997119"/> + </array> + <int key="NSLMFlags">38</int> + <nil key="NSDelegate"/> + </object> + <reference key="NSTextView" ref="827877557"/> + <double key="NSWidth">568</double> + <int key="NSTCFlags">1</int> + </object> + <object class="NSTextViewSharedData" key="NSSharedData"> + <int key="NSFlags">67119877</int> + <int key="NSTextCheckingTypes">0</int> + <nil key="NSMarkedAttributes"/> + <reference key="NSBackgroundColor" ref="771510757"/> + <dictionary key="NSSelectedAttributes"> + <object class="NSColor" key="NSBackgroundColor"> + <int key="NSColorSpace">6</int> + <string key="NSCatalogName">System</string> + <string key="NSColorName">selectedTextBackgroundColor</string> + <reference key="NSColor" ref="591163410"/> + </object> + <object class="NSColor" key="NSColor"> + <int key="NSColorSpace">6</int> + <string key="NSCatalogName">System</string> + <string key="NSColorName">selectedTextColor</string> + <reference key="NSColor" ref="515582523"/> + </object> + </dictionary> + <reference key="NSInsertionColor" ref="515582523"/> + <dictionary key="NSLinkAttributes"> + <object class="NSColor" key="NSColor"> + <int key="NSColorSpace">1</int> + <bytes key="NSRGB">MCAwIDEAA</bytes> + </object> + <object class="NSCursor" key="NSCursor"> + <string key="NSHotSpot">{8, -8}</string> + <int key="NSCursorType">13</int> + </object> + <integer value="1" key="NSUnderline"/> + </dictionary> + <nil key="NSDefaultParagraphStyle"/> + <nil key="NSTextFinder"/> + <int key="NSPreferredTextFinderStyle">1</int> + </object> + <int key="NSTVFlags">6</int> + <string key="NSMaxSize">{696, 10000000}</string> + <nil key="NSDelegate"/> + </object> + </array> + <string key="NSFrame">{{1, 1}, {568, 130}}</string> + <reference key="NSSuperview" ref="356109671"/> + <reference key="NSNextKeyView" ref="827877557"/> + <string key="NSReuseIdentifierKey">_NS:3758</string> + <reference key="NSDocView" ref="827877557"/> + <reference key="NSBGColor" ref="771510757"/> + <object class="NSCursor" key="NSCursor"> + <string key="NSHotSpot">{4, 5}</string> + <object class="NSImage" key="NSImage"> + <int key="NSImageFlags">12582912</int> + <array class="NSMutableArray" key="NSReps"> + <array> + <integer value="0"/> + <object class="NSBitmapImageRep"> + <object class="NSData" key="NSTIFFRepresentation"> + <bytes key="NS.bytes">TU0AKgAAAHCAFUqgBVKsAAAAwdVQUqwaEQeIRGJRGFlYqwWLQ+JxuOQpVRmEx2RROKwOQyOUQSPyaUym +SxqWyKXyeYxyZzWbSuJTScRCbz2Nz+gRKhUOfTqeUai0OSxiWTiBQSHSGFquGwekxyAgAAAOAQAAAwAA +AAEAEAAAAQEAAwAAAAEAEAAAAQIAAwAAAAIACAAIAQMAAwAAAAEABQAAAQYAAwAAAAEAAQAAAREABAAA +AAEAAAAIARIAAwAAAAEAAQAAARUAAwAAAAEAAgAAARYAAwAAAAEAEAAAARcABAAAAAEAAABnARwAAwAA +AAEAAQAAAT0AAwAAAAEAAgAAAVIAAwAAAAEAAQAAAVMAAwAAAAIAAQABAAAAAA</bytes> + </object> + </object> + </array> + </array> + <object class="NSColor" key="NSColor" id="785653565"> + <int key="NSColorSpace">3</int> + <bytes key="NSWhite">MCAwAA</bytes> + </object> + </object> + </object> + <int key="NScvFlags">4</int> + </object> + <object class="NSScroller" id="275648235"> + <reference key="NSNextResponder" ref="356109671"/> + <int key="NSvFlags">256</int> + <string key="NSFrame">{{553, 1}, {16, 130}}</string> + <reference key="NSSuperview" ref="356109671"/> + <reference key="NSNextKeyView" ref="639837771"/> + <string key="NSReuseIdentifierKey">_NS:3774</string> + <bool key="NSAllowsLogicalLayoutDirection">NO</bool> + <reference key="NSTarget" ref="356109671"/> + <string key="NSAction">_doScroller:</string> + <double key="NSCurValue">1</double> + <double key="NSPercent">0.85256409645080566</double> + </object> + <object class="NSScroller" id="4720790"> + <reference key="NSNextResponder" ref="356109671"/> + <int key="NSvFlags">-2147483392</int> + <string key="NSFrame">{{-100, -100}, {87, 18}}</string> + <reference key="NSSuperview" ref="356109671"/> + <reference key="NSNextKeyView" ref="105628437"/> + <string key="NSReuseIdentifierKey">_NS:3762</string> + <bool key="NSAllowsLogicalLayoutDirection">NO</bool> + <int key="NSsFlags">1</int> + <reference key="NSTarget" ref="356109671"/> + <string key="NSAction">_doScroller:</string> + <double key="NSCurValue">1</double> + <double key="NSPercent">0.94565218687057495</double> + </object> + </array> + <string key="NSFrameSize">{570, 132}</string> + <reference key="NSSuperview" ref="427087625"/> + <reference key="NSNextKeyView" ref="105628437"/> + <string key="NSReuseIdentifierKey">_NS:148</string> + <int key="NSsFlags">133138</int> + <reference key="NSVScroller" ref="275648235"/> + <reference key="NSHScroller" ref="4720790"/> + <reference key="NSContentView" ref="105628437"/> + <double key="NSMinMagnification">0.25</double> + <double key="NSMaxMagnification">4</double> + <double key="NSMagnification">1</double> + </object> + </array> + <string key="NSFrame">{{0, 134}, {570, 132}}</string> + <reference key="NSSuperview" ref="250587056"/> + <reference key="NSNextKeyView" ref="356109671"/> + <string key="NSReuseIdentifierKey">_NS:549</string> + <string key="NSClassName">NSView</string> + </object> + </array> + <string key="NSFrame">{{15, 41}, {570, 266}}</string> + <reference key="NSSuperview" ref="439893737"/> + <reference key="NSNextKeyView" ref="328183451"/> + <string key="NSReuseIdentifierKey">_NS:545</string> + <int key="NSDividerStyle">2</int> + </object> + <object class="NSBox" id="639837771"> + <reference key="NSNextResponder" ref="439893737"/> + <int key="NSvFlags">33</int> + <array class="NSMutableArray" key="NSSubviews"> + <object class="NSView" id="1002721778"> + <reference key="NSNextResponder" ref="639837771"/> + <int key="NSvFlags">274</int> + <array class="NSMutableArray" key="NSSubviews"> + <object class="NSButton" id="230958321"> + <reference key="NSNextResponder" ref="1002721778"/> + <int key="NSvFlags">289</int> + <string key="NSFrame">{{13, 0}, {174, 29}}</string> + <reference key="NSSuperview" ref="1002721778"/> + <reference key="NSNextKeyView" ref="419622798"/> + <string key="NSReuseIdentifierKey">_NS:239</string> + <bool key="NSEnabled">YES</bool> + <object class="NSButtonCell" key="NSCell" id="441222556"> + <int key="NSCellFlags">-2080374784</int> + <int key="NSCellFlags2">134217728</int> + <string key="NSContents">Listen on the address</string> + <reference key="NSSupport" ref="809233629"/> + <string key="NSCellIdentifier">_NS:239</string> + <reference key="NSControlView" ref="230958321"/> + <int key="NSButtonFlags">1211912448</int> + <int key="NSButtonFlags2">2</int> + <object class="NSCustomResource" key="NSNormalImage"> + <string key="NSClassName">NSImage</string> + <string key="NSResourceName">NSSwitch</string> + </object> + <object class="NSButtonImageSource" key="NSAlternateImage"> + <string key="NSImageName">NSSwitch</string> + </object> + <string key="NSAlternateContents"/> + <string key="NSKeyEquivalent"/> + <int key="NSPeriodicDelay">200</int> + <int key="NSPeriodicInterval">25</int> + </object> + <bool key="NSAllowsLogicalLayoutDirection">NO</bool> + </object> + <object class="NSTextField" id="419622798"> + <reference key="NSNextResponder" ref="1002721778"/> + <int key="NSvFlags">289</int> + <string key="NSFrame">{{201, 3}, {119, 22}}</string> + <reference key="NSSuperview" ref="1002721778"/> + <reference key="NSNextKeyView" ref="7620662"/> + <string key="NSReuseIdentifierKey">_NS:248</string> + <bool key="NSEnabled">YES</bool> + <object class="NSTextFieldCell" key="NSCell" id="226701554"> + <int key="NSCellFlags">-1804599231</int> + <int key="NSCellFlags2">138413056</int> + <string key="NSContents">0.0.0.0</string> + <reference key="NSSupport" ref="809233629"/> + <string key="NSCellIdentifier">_NS:248</string> + <reference key="NSControlView" ref="419622798"/> + <bool key="NSDrawsBackground">YES</bool> + <object class="NSColor" key="NSBackgroundColor" id="449937964"> + <int key="NSColorSpace">6</int> + <string key="NSCatalogName">System</string> + <string key="NSColorName">textBackgroundColor</string> + <reference key="NSColor" ref="771510757"/> + </object> + <object class="NSColor" key="NSTextColor" id="53075377"> + <int key="NSColorSpace">6</int> + <string key="NSCatalogName">System</string> + <string key="NSColorName">textColor</string> + <reference key="NSColor" ref="515582523"/> + </object> + </object> + <bool key="NSAllowsLogicalLayoutDirection">NO</bool> + </object> + <object class="NSTextField" id="7620662"> + <reference key="NSNextResponder" ref="1002721778"/> + <int key="NSvFlags">289</int> + <string key="NSFrame">{{325, 2}, {75, 22}}</string> + <reference key="NSSuperview" ref="1002721778"/> + <reference key="NSNextKeyView" ref="711665850"/> + <string key="NSReuseIdentifierKey">_NS:3936</string> + <bool key="NSEnabled">YES</bool> + <object class="NSTextFieldCell" key="NSCell" id="31855702"> + <int key="NSCellFlags">68157504</int> + <int key="NSCellFlags2">138413056</int> + <string key="NSContents">and port</string> + <reference key="NSSupport" ref="809233629"/> + <string key="NSCellIdentifier">_NS:3936</string> + <reference key="NSControlView" ref="7620662"/> + <bool key="NSDrawsBackground">YES</bool> + <object class="NSColor" key="NSBackgroundColor" id="175645791"> + <int key="NSColorSpace">6</int> + <string key="NSCatalogName">System</string> + <string key="NSColorName">controlColor</string> + <reference key="NSColor" ref="591163410"/> + </object> + <reference key="NSTextColor" ref="210721017"/> + </object> + <bool key="NSAllowsLogicalLayoutDirection">NO</bool> + </object> + <object class="NSTextField" id="711665850"> + <reference key="NSNextResponder" ref="1002721778"/> + <int key="NSvFlags">289</int> + <string key="NSFrame">{{405, 3}, {40, 22}}</string> + <reference key="NSSuperview" ref="1002721778"/> + <string key="NSReuseIdentifierKey">_NS:248</string> + <bool key="NSEnabled">YES</bool> + <object class="NSTextFieldCell" key="NSCell" id="771004923"> + <int key="NSCellFlags">-1804599231</int> + <int key="NSCellFlags2">71304192</int> + <string key="NSContents">69</string> + <reference key="NSSupport" ref="809233629"/> + <string key="NSCellIdentifier">_NS:248</string> + <reference key="NSControlView" ref="711665850"/> + <bool key="NSDrawsBackground">YES</bool> + <reference key="NSBackgroundColor" ref="449937964"/> + <reference key="NSTextColor" ref="53075377"/> + </object> + <bool key="NSAllowsLogicalLayoutDirection">NO</bool> + </object> + </array> + <string key="NSFrame">{{1, 1}, {460, 28}}</string> + <reference key="NSSuperview" ref="639837771"/> + <reference key="NSNextKeyView" ref="230958321"/> + <string key="NSReuseIdentifierKey">_NS:11</string> + </object> + </array> + <string key="NSFrame">{{123, 7}, {462, 30}}</string> + <reference key="NSSuperview" ref="439893737"/> + <reference key="NSNextKeyView" ref="1002721778"/> + <string key="NSReuseIdentifierKey">_NS:9</string> + <string key="NSOffsets">{0, 0}</string> + <object class="NSTextFieldCell" key="NSTitleCell"> + <int key="NSCellFlags">67108864</int> + <int key="NSCellFlags2">0</int> + <string key="NSContents">Box</string> + <reference key="NSSupport" ref="26"/> + <reference key="NSBackgroundColor" ref="449937964"/> + <object class="NSColor" key="NSTextColor"> + <int key="NSColorSpace">3</int> + <bytes key="NSWhite">MCAwLjgwMDAwMDAxMTkAA</bytes> + </object> + </object> + <reference key="NSContentView" ref="1002721778"/> + <int key="NSBorderType">1</int> + <int key="NSBoxType">4</int> + <int key="NSTitlePosition">2</int> + <bool key="NSTransparent">NO</bool> + <double key="NSCornerRadius2">5</double> + <object class="NSColor" key="NSFillColor2"> + <int key="NSColorSpace">6</int> + <string key="NSCatalogName">System</string> + <string key="NSColorName">windowBackgroundColor</string> + <reference key="NSColor" ref="288383301"/> + </object> + </object> + </array> + <string key="NSFrameSize">{600, 322}</string> + <reference key="NSNextKeyView" ref="250587056"/> + </object> + <string key="NSScreenRect">{{0, 0}, {1440, 878}}</string> + <string key="NSMinSize">{492, 269}</string> + <string key="NSMaxSize">{10000000000000, 10000000000000}</string> + <bool key="NSWindowIsRestorable">YES</bool> + </object> + <object class="NSWindowTemplate" id="759947593"> + <int key="NSWindowStyleMask">3</int> + <int key="NSWindowBacking">2</int> + <string key="NSWindowRect">{{131, 159}, {603, 348}}</string> + <int key="NSWTFlags">1685586944</int> + <string key="NSWindowTitle">PumpKIN Preferences</string> + <string key="NSWindowClass">NSWindow</string> + <nil key="NSViewClass"/> + <nil key="NSUserInterfaceItemIdentifier"/> + <object class="NSView" key="NSWindowView" id="929656847"> + <nil key="NSNextResponder"/> + <int key="NSvFlags">256</int> + <array class="NSMutableArray" key="NSSubviews"> + <object class="NSBox" id="208819373"> + <reference key="NSNextResponder" ref="929656847"/> + <int key="NSvFlags">12</int> + <array class="NSMutableArray" key="NSSubviews"> + <object class="NSView" id="434868610"> + <reference key="NSNextResponder" ref="208819373"/> + <int key="NSvFlags">274</int> + <array class="NSMutableArray" key="NSSubviews"> + <object class="NSTextField" id="328098120"> + <reference key="NSNextResponder" ref="434868610"/> + <int key="NSvFlags">268</int> + <string key="NSFrame">{{18, 14}, {481, 22}}</string> + <reference key="NSSuperview" ref="434868610"/> + <reference key="NSNextKeyView" ref="240606174"/> + <string key="NSReuseIdentifierKey">_NS:248</string> + <bool key="NSEnabled">YES</bool> + <object class="NSTextFieldCell" key="NSCell" id="151062802"> + <int key="NSCellFlags">-1804599231</int> + <int key="NSCellFlags2">272630784</int> + <string key="NSContents"/> + <reference key="NSSupport" ref="809233629"/> + <string key="NSCellIdentifier">_NS:248</string> + <reference key="NSControlView" ref="328098120"/> + <bool key="NSDrawsBackground">YES</bool> + <reference key="NSBackgroundColor" ref="449937964"/> + <reference key="NSTextColor" ref="53075377"/> + </object> + <bool key="NSAllowsLogicalLayoutDirection">NO</bool> + </object> + <object class="NSButton" id="240606174"> + <reference key="NSNextResponder" ref="434868610"/> + <int key="NSvFlags">268</int> + <string key="NSFrame">{{507, 17}, {56, 19}}</string> + <reference key="NSSuperview" ref="434868610"/> + <reference key="NSNextKeyView" ref="233651545"/> + <string key="NSReuseIdentifierKey">_NS:1491</string> + <bool key="NSEnabled">YES</bool> + <object class="NSButtonCell" key="NSCell" id="108023427"> + <int key="NSCellFlags">67108864</int> + <int key="NSCellFlags2">134217728</int> + <string key="NSContents">Browse</string> + <object class="NSFont" key="NSSupport" id="752899677"> + <string key="NSName">LucidaGrande</string> + <double key="NSSize">12</double> + <int key="NSfFlags">16</int> + </object> + <string key="NSCellIdentifier">_NS:1491</string> + <reference key="NSControlView" ref="240606174"/> + <int key="NSButtonFlags">-2037104640</int> + <int key="NSButtonFlags2">36</int> + <object class="NSCustomResource" key="NSNormalImage"> + <string key="NSClassName">NSImage</string> + <string key="NSResourceName">NSPathTemplate</string> + </object> + <string key="NSAlternateContents"/> + <string key="NSKeyEquivalent"/> + <int key="NSPeriodicDelay">400</int> + <int key="NSPeriodicInterval">75</int> + </object> + <bool key="NSAllowsLogicalLayoutDirection">NO</bool> + </object> + </array> + <string key="NSFrame">{{1, 1}, {581, 46}}</string> + <reference key="NSSuperview" ref="208819373"/> + <reference key="NSNextKeyView" ref="328098120"/> + <string key="NSReuseIdentifierKey">_NS:632</string> + </object> + </array> + <string key="NSFrame">{{10, 266}, {583, 62}}</string> + <reference key="NSSuperview" ref="929656847"/> + <reference key="NSNextKeyView" ref="434868610"/> + <string key="NSReuseIdentifierKey">_NS:630</string> + <string key="NSOffsets">{0, 0}</string> + <object class="NSTextFieldCell" key="NSTitleCell"> + <int key="NSCellFlags">67108864</int> + <int key="NSCellFlags2">0</int> + <string key="NSContents">TFTP filesystem root (download path)</string> + <reference key="NSSupport" ref="26"/> + <reference key="NSBackgroundColor" ref="449937964"/> + <object class="NSColor" key="NSTextColor"> + <int key="NSColorSpace">3</int> + <bytes key="NSWhite">MCAwLjgwMDAwMDAxMTkAA</bytes> + </object> + </object> + <reference key="NSContentView" ref="434868610"/> + <int key="NSBorderType">1</int> + <int key="NSBoxType">0</int> + <int key="NSTitlePosition">2</int> + <bool key="NSTransparent">NO</bool> + </object> + <object class="NSBox" id="233651545"> + <reference key="NSNextResponder" ref="929656847"/> + <int key="NSvFlags">12</int> + <array class="NSMutableArray" key="NSSubviews"> + <object class="NSView" id="532822418"> + <reference key="NSNextResponder" ref="233651545"/> + <int key="NSvFlags">274</int> + <array class="NSMutableArray" key="NSSubviews"> + <object class="NSTextField" id="823695658"> + <reference key="NSNextResponder" ref="532822418"/> + <int key="NSvFlags">268</int> + <string key="NSFrame">{{18, 14}, {481, 22}}</string> + <reference key="NSSuperview" ref="532822418"/> + <reference key="NSNextKeyView" ref="379050521"/> + <string key="NSReuseIdentifierKey">_NS:248</string> + <bool key="NSEnabled">YES</bool> + <object class="NSTextFieldCell" key="NSCell" id="424316336"> + <int key="NSCellFlags">-1804599231</int> + <int key="NSCellFlags2">272630784</int> + <string key="NSContents"/> + <reference key="NSSupport" ref="809233629"/> + <string key="NSCellIdentifier">_NS:248</string> + <reference key="NSControlView" ref="823695658"/> + <bool key="NSDrawsBackground">YES</bool> + <reference key="NSBackgroundColor" ref="449937964"/> + <reference key="NSTextColor" ref="53075377"/> + </object> + <bool key="NSAllowsLogicalLayoutDirection">NO</bool> + </object> + <object class="NSButton" id="379050521"> + <reference key="NSNextResponder" ref="532822418"/> + <int key="NSvFlags">268</int> + <string key="NSFrame">{{507, 15}, {56, 19}}</string> + <reference key="NSSuperview" ref="532822418"/> + <reference key="NSNextKeyView" ref="197043543"/> + <string key="NSReuseIdentifierKey">_NS:1491</string> + <bool key="NSEnabled">YES</bool> + <object class="NSButtonCell" key="NSCell" id="621926228"> + <int key="NSCellFlags">67108864</int> + <int key="NSCellFlags2">134217728</int> + <string key="NSContents">Browse</string> + <reference key="NSSupport" ref="752899677"/> + <string key="NSCellIdentifier">_NS:1491</string> + <reference key="NSControlView" ref="379050521"/> + <int key="NSButtonFlags">-2033434624</int> + <int key="NSButtonFlags2">164</int> + <string key="NSAlternateContents"/> + <string key="NSKeyEquivalent"/> + <int key="NSPeriodicDelay">400</int> + <int key="NSPeriodicInterval">75</int> + </object> + <bool key="NSAllowsLogicalLayoutDirection">NO</bool> + </object> + </array> + <string key="NSFrame">{{1, 1}, {581, 46}}</string> + <reference key="NSSuperview" ref="233651545"/> + <reference key="NSNextKeyView" ref="823695658"/> + <string key="NSReuseIdentifierKey">_NS:632</string> + </object> + </array> + <string key="NSFrame">{{10, 200}, {583, 62}}</string> + <reference key="NSSuperview" ref="929656847"/> + <reference key="NSNextKeyView" ref="532822418"/> + <string key="NSReuseIdentifierKey">_NS:630</string> + <string key="NSOffsets">{0, 0}</string> + <object class="NSTextFieldCell" key="NSTitleCell"> + <int key="NSCellFlags">67108864</int> + <int key="NSCellFlags2">0</int> + <string key="NSContents">Log file (leave empty to disable logging to file)</string> + <reference key="NSSupport" ref="26"/> + <reference key="NSBackgroundColor" ref="449937964"/> + <object class="NSColor" key="NSTextColor"> + <int key="NSColorSpace">3</int> + <bytes key="NSWhite">MCAwLjgwMDAwMDAxMTkAA</bytes> + </object> + </object> + <reference key="NSContentView" ref="532822418"/> + <int key="NSBorderType">1</int> + <int key="NSBoxType">0</int> + <int key="NSTitlePosition">2</int> + <bool key="NSTransparent">NO</bool> + </object> + <object class="NSBox" id="197043543"> + <reference key="NSNextResponder" ref="929656847"/> + <int key="NSvFlags">12</int> + <array class="NSMutableArray" key="NSSubviews"> + <object class="NSView" id="202393739"> + <reference key="NSNextResponder" ref="197043543"/> + <int key="NSvFlags">274</int> + <array class="NSMutableArray" key="NSSubviews"> + <object class="NSMatrix" id="973753659"> + <reference key="NSNextResponder" ref="202393739"/> + <int key="NSvFlags">268</int> + <string key="NSFrame">{{18, 14}, {190, 58}}</string> + <reference key="NSSuperview" ref="202393739"/> + <reference key="NSNextKeyView" ref="866741769"/> + <string key="NSReuseIdentifierKey">_NS:266</string> + <bool key="NSEnabled">YES</bool> + <bool key="NSAllowsLogicalLayoutDirection">NO</bool> + <int key="NSNumRows">3</int> + <int key="NSNumCols">1</int> + <array class="NSMutableArray" key="NSCells"> + <object class="NSButtonCell" id="529759421"> + <int key="NSCellFlags">-2080374784</int> + <int key="NSCellFlags2">0</int> + <string key="NSContents">Give all files</string> + <reference key="NSSupport" ref="809233629"/> + <reference key="NSControlView" ref="973753659"/> + <int key="NSButtonFlags">1211912448</int> + <int key="NSButtonFlags2">0</int> + <object class="NSButtonImageSource" key="NSAlternateImage" id="914616927"> + <string key="NSImageName">NSRadioButton</string> + </object> + <int key="NSPeriodicDelay">400</int> + <int key="NSPeriodicInterval">75</int> + </object> + <object class="NSButtonCell" id="859183946"> + <int key="NSCellFlags">67108864</int> + <int key="NSCellFlags2">0</int> + <string key="NSContents">Prompt before giving a file</string> + <reference key="NSSupport" ref="809233629"/> + <reference key="NSControlView" ref="973753659"/> + <int key="NSTag">1</int> + <int key="NSButtonFlags">1211912448</int> + <int key="NSButtonFlags2">0</int> + <reference key="NSAlternateImage" ref="914616927"/> + <int key="NSPeriodicDelay">400</int> + <int key="NSPeriodicInterval">75</int> + </object> + <object class="NSButtonCell" id="862531403"> + <int key="NSCellFlags">67108864</int> + <int key="NSCellFlags2">0</int> + <string key="NSContents">Deny all requests</string> + <reference key="NSSupport" ref="809233629"/> + <reference key="NSControlView" ref="973753659"/> + <int key="NSTag">2</int> + <int key="NSButtonFlags">1211912448</int> + <int key="NSButtonFlags2">0</int> + <reference key="NSAlternateImage" ref="914616927"/> + <int key="NSPeriodicDelay">400</int> + <int key="NSPeriodicInterval">75</int> + </object> + </array> + <string key="NSCellSize">{190, 18}</string> + <string key="NSIntercellSpacing">{4, 2}</string> + <int key="NSMatrixFlags">1151868928</int> + <string key="NSCellClass">NSActionCell</string> + <object class="NSButtonCell" key="NSProtoCell" id="518920277"> + <int key="NSCellFlags">67108864</int> + <int key="NSCellFlags2">0</int> + <string key="NSContents">Radio</string> + <reference key="NSSupport" ref="809233629"/> + <int key="NSTag">-1</int> + <int key="NSButtonFlags">1211912448</int> + <int key="NSButtonFlags2">0</int> + <object class="NSImage" key="NSNormalImage"> + <int key="NSImageFlags">549453824</int> + <string key="NSSize">{18, 18}</string> + <array class="NSMutableArray" key="NSReps"> + <array> + <integer value="0"/> + <object class="NSBitmapImageRep"> + <object class="NSData" key="NSTIFFRepresentation"> + <bytes key="NS.bytes">TU0AKgAABRgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAMAAAADAAAAAwAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAADwRERGLJycnySsrK/A1NTXw +IyMjyRwcHIsJCQk8AAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFFRUVdVBQUOCoqKj/ +29vb//n5+f/6+vr/2tra/6qqqv9UVFTgHx8fdQAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUZGRl5 +dXV198PDw//8/Pz////////////////////////////U1NT/fHx89yUlJXkAAAAFAAAAAAAAAAAAAAAA +AAAAAxEREUZqamrmtbW1/+3t7f/+/v7//v7+//7+/v/9/f3//f39//39/f/39/f/xMTE/3d3d+YZGRlG +AAAAAwAAAAAAAAAAAAAACkJCQqGtra3/xsbG/+vr6//y8vL/9fX1//X19f/z8/P/9fX1//Ly8v/u7u7/ +0tLS/6+vr/9KSkqhAAAACgAAAAAAAAAAAAAAF3h4eN2/v7//z8/P/93d3f/q6ur/7+/v/+/v7//w8PD/ +7e3t/+3t7f/i4uL/zs7O/8XFxf98fHzdAAAAFwAAAAAAAAADAAAAJKSkpPjOzs7/2dnZ/+Dg4P/i4uL/ +5eXl/+bm5v/n5+f/5eXl/+Li4v/e3t7/2tra/9DQ0P+srKz4AAAAJAAAAAMAAAADAAAALrCwsPrW1tb/ +3t7e/+Tk5P/p6en/6+vr/+zs7P/p6en/6+vr/+fn5//k5OT/4ODg/9nZ2f+zs7P6AAAALgAAAAMAAAAD +AAAALp2dnezg4OD/5eXl/+rq6v/u7u7/8PDw//Dw8P/x8fH/8PDw/+7u7v/q6ur/5ubm/+Hh4f+ZmZns +AAAALgAAAAMAAAADAAAAJG5ubs/l5eX/6enp/+/v7//y8vL/9vb2//r6+v/5+fn/9/f3//b29v/x8fH/ +6+vr/+Tk5P9ra2vPAAAAJAAAAAMAAAAAAAAAFy4uLpPCwsL67Ozs//Pz8//5+fn//v7+//7+/v/+/v7/ +/v7+//v7+//19fX/8PDw/8LCwvosLCyTAAAAFwAAAAAAAAAAAAAACgAAAENfX1/S5OTk/vn5+f/+/v7/ +///////////////////////////8/Pz/5ubm/l9fX9IAAABDAAAACgAAAAAAAAAAAAAAAwAAABcAAABl +YmJi3NLS0v3////////////////////////////////V1dX9ZGRk3AAAAGUAAAAXAAAAAwAAAAAAAAAA +AAAAAAAAAAUAAAAfAAAAZTMzM8KAgIDwv7+//O3t7f/t7e3/v7+//ICAgPAzMzPCAAAAZQAAAB8AAAAF +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAAAFwAAAEMAAAB3AAAAnwAAALMAAACzAAAAnwAAAHcAAABD +AAAAFwAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAoAAAAXAAAAJAAAAC4AAAAu +AAAAJAAAABcAAAAKAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAwAAAAMAAAADAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADQEAAAMAAAABABIAAAEB +AAMAAAABABIAAAECAAMAAAAEAAAFugEDAAMAAAABAAEAAAEGAAMAAAABAAIAAAERAAQAAAABAAAACAES +AAMAAAABAAEAAAEVAAMAAAABAAQAAAEWAAMAAAABABIAAAEXAAQAAAABAAAFEAEcAAMAAAABAAEAAAFS +AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA</bytes> + </object> + </object> + </array> + </array> + <reference key="NSColor" ref="785653565"/> + </object> + <reference key="NSAlternateImage" ref="914616927"/> + <int key="NSPeriodicDelay">400</int> + <int key="NSPeriodicInterval">75</int> + </object> + <reference key="NSSelectedCell" ref="529759421"/> + <reference key="NSBackgroundColor" ref="175645791"/> + <reference key="NSCellBackgroundColor" ref="771510757"/> + <reference key="NSFont" ref="809233629"/> + </object> + </array> + <string key="NSFrame">{{1, 1}, {581, 82}}</string> + <reference key="NSSuperview" ref="197043543"/> + <reference key="NSNextKeyView" ref="973753659"/> + <string key="NSReuseIdentifierKey">_NS:632</string> + </object> + </array> + <string key="NSFrame">{{10, 98}, {583, 98}}</string> + <reference key="NSSuperview" ref="929656847"/> + <reference key="NSNextKeyView" ref="202393739"/> + <string key="NSReuseIdentifierKey">_NS:630</string> + <string key="NSOffsets">{0, 0}</string> + <object class="NSTextFieldCell" key="NSTitleCell"> + <int key="NSCellFlags">67108864</int> + <int key="NSCellFlags2">0</int> + <string key="NSContents">Read Request Behavior</string> + <reference key="NSSupport" ref="26"/> + <reference key="NSBackgroundColor" ref="449937964"/> + <object class="NSColor" key="NSTextColor"> + <int key="NSColorSpace">3</int> + <bytes key="NSWhite">MCAwLjgwMDAwMDAxMTkAA</bytes> + </object> + </object> + <reference key="NSContentView" ref="202393739"/> + <int key="NSBorderType">1</int> + <int key="NSBoxType">0</int> + <int key="NSTitlePosition">2</int> + <bool key="NSTransparent">NO</bool> + </object> + <object class="NSBox" id="866741769"> + <reference key="NSNextResponder" ref="929656847"/> + <int key="NSvFlags">12</int> + <array class="NSMutableArray" key="NSSubviews"> + <object class="NSView" id="132072321"> + <reference key="NSNextResponder" ref="866741769"/> + <int key="NSvFlags">274</int> + <array class="NSMutableArray" key="NSSubviews"> + <object class="NSMatrix" id="82294173"> + <reference key="NSNextResponder" ref="132072321"/> + <int key="NSvFlags">268</int> + <string key="NSFrame">{{18, 14}, {526, 38}}</string> + <reference key="NSSuperview" ref="132072321"/> + <string key="NSReuseIdentifierKey">_NS:266</string> + <bool key="NSEnabled">YES</bool> + <bool key="NSAllowsLogicalLayoutDirection">NO</bool> + <int key="NSNumRows">2</int> + <int key="NSNumCols">2</int> + <array class="NSMutableArray" key="NSCells"> + <object class="NSButtonCell" id="708384367"> + <int key="NSCellFlags">-2080374784</int> + <int key="NSCellFlags2">0</int> + <string key="NSContents">Take all files</string> + <reference key="NSSupport" ref="809233629"/> + <reference key="NSControlView" ref="82294173"/> + <int key="NSButtonFlags">1211912448</int> + <int key="NSButtonFlags2">0</int> + <reference key="NSAlternateImage" ref="914616927"/> + <string key="NSAlternateContents"/> + <string key="NSKeyEquivalent"/> + <int key="NSPeriodicDelay">200</int> + <int key="NSPeriodicInterval">25</int> + </object> + <object class="NSButtonCell" id="158682464"> + <int key="NSCellFlags">67108864</int> + <int key="NSCellFlags2">0</int> + <string key="NSContents">Prompt if file exists</string> + <reference key="NSSupport" ref="809233629"/> + <reference key="NSControlView" ref="82294173"/> + <int key="NSTag">1</int> + <int key="NSButtonFlags">1211912448</int> + <int key="NSButtonFlags2">0</int> + <reference key="NSAlternateImage" ref="914616927"/> + <int key="NSPeriodicDelay">400</int> + <int key="NSPeriodicInterval">75</int> + </object> + <object class="NSButtonCell" id="527645225"> + <int key="NSCellFlags">67108864</int> + <int key="NSCellFlags2">0</int> + <string key="NSContents">Always prompt before accepting a file</string> + <reference key="NSSupport" ref="809233629"/> + <reference key="NSControlView" ref="82294173"/> + <int key="NSTag">2</int> + <int key="NSButtonFlags">1211912448</int> + <int key="NSButtonFlags2">0</int> + <object class="NSImage" key="NSNormalImage"> + <int key="NSImageFlags">549453824</int> + <string key="NSSize">{18, 18}</string> + <array class="NSMutableArray" key="NSReps"> + <array> + <integer value="0"/> + <object class="NSBitmapImageRep"> + <object class="NSData" key="NSTIFFRepresentation"> + <bytes key="NS.bytes">TU0AKgAABRgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAMAAAADAAAAAwAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAADwRERGLJycnySsrK/A1NTXw +IyMjyRwcHIsJCQk8AAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFFRUVdVBQUOCoqKj/ +29vb//n5+f/6+vr/2tra/6qqqv9UVFTgHx8fdQAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUZGRl5 +dXV198PDw//8/Pz////////////////////////////U1NT/fHx89yUlJXkAAAAFAAAAAAAAAAAAAAAA +AAAAAxEREUZqamrmtbW1/+3t7f/+/v7//v7+//7+/v/9/f3//f39//39/f/39/f/xMTE/3d3d+YZGRlG +AAAAAwAAAAAAAAAAAAAACkJCQqGtra3/xsbG/+vr6//y8vL/9fX1//X19f/z8/P/9fX1//Ly8v/u7u7/ +0tLS/6+vr/9KSkqhAAAACgAAAAAAAAAAAAAAF3h4eN2/v7//z8/P/93d3f/q6ur/7+/v/+/v7//w8PD/ +7e3t/+3t7f/i4uL/zs7O/8XFxf98fHzdAAAAFwAAAAAAAAADAAAAJKSkpPjOzs7/2dnZ/+Dg4P/i4uL/ +5eXl/+bm5v/n5+f/5eXl/+Li4v/e3t7/2tra/9DQ0P+srKz4AAAAJAAAAAMAAAADAAAALrCwsPrW1tb/ +3t7e/+Tk5P/p6en/6+vr/+zs7P/p6en/6+vr/+fn5//k5OT/4ODg/9nZ2f+zs7P6AAAALgAAAAMAAAAD +AAAALp2dnezg4OD/5eXl/+rq6v/u7u7/8PDw//Dw8P/x8fH/8PDw/+7u7v/q6ur/5ubm/+Hh4f+ZmZns +AAAALgAAAAMAAAADAAAAJG5ubs/l5eX/6enp/+/v7//y8vL/9vb2//r6+v/5+fn/9/f3//b29v/x8fH/ +6+vr/+Tk5P9ra2vPAAAAJAAAAAMAAAAAAAAAFy4uLpPCwsL67Ozs//Pz8//5+fn//v7+//7+/v/+/v7/ +/v7+//v7+//19fX/8PDw/8LCwvosLCyTAAAAFwAAAAAAAAAAAAAACgAAAENfX1/S5OTk/vn5+f/+/v7/ +///////////////////////////8/Pz/5ubm/l9fX9IAAABDAAAACgAAAAAAAAAAAAAAAwAAABcAAABl +YmJi3NLS0v3////////////////////////////////V1dX9ZGRk3AAAAGUAAAAXAAAAAwAAAAAAAAAA +AAAAAAAAAAUAAAAfAAAAZTMzM8KAgIDwv7+//O3t7f/t7e3/v7+//ICAgPAzMzPCAAAAZQAAAB8AAAAF +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAAAFwAAAEMAAAB3AAAAnwAAALMAAACzAAAAnwAAAHcAAABD +AAAAFwAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAoAAAAXAAAAJAAAAC4AAAAu +AAAAJAAAABcAAAAKAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAwAAAAMAAAADAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADQEAAAMAAAABABIAAAEB +AAMAAAABABIAAAECAAMAAAAEAAAFugEDAAMAAAABAAEAAAEGAAMAAAABAAIAAAERAAQAAAABAAAACAES +AAMAAAABAAEAAAEVAAMAAAABAAQAAAEWAAMAAAABABIAAAEXAAQAAAABAAAFEAEcAAMAAAABAAEAAAFS +AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA</bytes> + </object> + </object> + </array> + </array> + <reference key="NSColor" ref="785653565"/> + </object> + <reference key="NSAlternateImage" ref="914616927"/> + <int key="NSPeriodicDelay">400</int> + <int key="NSPeriodicInterval">75</int> + </object> + <object class="NSButtonCell" id="310101904"> + <int key="NSCellFlags">67108864</int> + <int key="NSCellFlags2">0</int> + <string key="NSContents">Deny all requests</string> + <reference key="NSSupport" ref="809233629"/> + <reference key="NSControlView" ref="82294173"/> + <int key="NSTag">3</int> + <int key="NSButtonFlags">1211912448</int> + <int key="NSButtonFlags2">0</int> + <reference key="NSAlternateImage" ref="914616927"/> + <int key="NSPeriodicDelay">400</int> + <int key="NSPeriodicInterval">75</int> + </object> + </array> + <string key="NSCellSize">{261, 18}</string> + <string key="NSIntercellSpacing">{4, 2}</string> + <int key="NSMatrixFlags">1151868928</int> + <string key="NSCellClass">NSActionCell</string> + <object class="NSButtonCell" key="NSProtoCell" id="672179877"> + <int key="NSCellFlags">67108864</int> + <int key="NSCellFlags2">0</int> + <string key="NSContents">Radio</string> + <reference key="NSSupport" ref="809233629"/> + <int key="NSTag">-1</int> + <int key="NSButtonFlags">1211912448</int> + <int key="NSButtonFlags2">0</int> + <object class="NSImage" key="NSNormalImage"> + <int key="NSImageFlags">549453824</int> + <string key="NSSize">{18, 18}</string> + <array class="NSMutableArray" key="NSReps"> + <array> + <integer value="0"/> + <object class="NSBitmapImageRep"> + <object class="NSData" key="NSTIFFRepresentation"> + <bytes key="NS.bytes">TU0AKgAABRgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAMAAAADAAAAAwAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAADwRERGLJycnySsrK/A1NTXw +IyMjyRwcHIsJCQk8AAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFFRUVdVBQUOCoqKj/ +29vb//n5+f/6+vr/2tra/6qqqv9UVFTgHx8fdQAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUZGRl5 +dXV198PDw//8/Pz////////////////////////////U1NT/fHx89yUlJXkAAAAFAAAAAAAAAAAAAAAA +AAAAAxEREUZqamrmtbW1/+3t7f/+/v7//v7+//7+/v/9/f3//f39//39/f/39/f/xMTE/3d3d+YZGRlG +AAAAAwAAAAAAAAAAAAAACkJCQqGtra3/xsbG/+vr6//y8vL/9fX1//X19f/z8/P/9fX1//Ly8v/u7u7/ +0tLS/6+vr/9KSkqhAAAACgAAAAAAAAAAAAAAF3h4eN2/v7//z8/P/93d3f/q6ur/7+/v/+/v7//w8PD/ +7e3t/+3t7f/i4uL/zs7O/8XFxf98fHzdAAAAFwAAAAAAAAADAAAAJKSkpPjOzs7/2dnZ/+Dg4P/i4uL/ +5eXl/+bm5v/n5+f/5eXl/+Li4v/e3t7/2tra/9DQ0P+srKz4AAAAJAAAAAMAAAADAAAALrCwsPrW1tb/ +3t7e/+Tk5P/p6en/6+vr/+zs7P/p6en/6+vr/+fn5//k5OT/4ODg/9nZ2f+zs7P6AAAALgAAAAMAAAAD +AAAALp2dnezg4OD/5eXl/+rq6v/u7u7/8PDw//Dw8P/x8fH/8PDw/+7u7v/q6ur/5ubm/+Hh4f+ZmZns +AAAALgAAAAMAAAADAAAAJG5ubs/l5eX/6enp/+/v7//y8vL/9vb2//r6+v/5+fn/9/f3//b29v/x8fH/ +6+vr/+Tk5P9ra2vPAAAAJAAAAAMAAAAAAAAAFy4uLpPCwsL67Ozs//Pz8//5+fn//v7+//7+/v/+/v7/ +/v7+//v7+//19fX/8PDw/8LCwvosLCyTAAAAFwAAAAAAAAAAAAAACgAAAENfX1/S5OTk/vn5+f/+/v7/ +///////////////////////////8/Pz/5ubm/l9fX9IAAABDAAAACgAAAAAAAAAAAAAAAwAAABcAAABl +YmJi3NLS0v3////////////////////////////////V1dX9ZGRk3AAAAGUAAAAXAAAAAwAAAAAAAAAA +AAAAAAAAAAUAAAAfAAAAZTMzM8KAgIDwv7+//O3t7f/t7e3/v7+//ICAgPAzMzPCAAAAZQAAAB8AAAAF +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAAAFwAAAEMAAAB3AAAAnwAAALMAAACzAAAAnwAAAHcAAABD +AAAAFwAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAoAAAAXAAAAJAAAAC4AAAAu +AAAAJAAAABcAAAAKAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAwAAAAMAAAADAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADQEAAAMAAAABABIAAAEB +AAMAAAABABIAAAECAAMAAAAEAAAFugEDAAMAAAABAAEAAAEGAAMAAAABAAIAAAERAAQAAAABAAAACAES +AAMAAAABAAEAAAEVAAMAAAABAAQAAAEWAAMAAAABABIAAAEXAAQAAAABAAAFEAEcAAMAAAABAAEAAAFS +AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA</bytes> + </object> + </object> + </array> + </array> + <reference key="NSColor" ref="785653565"/> + </object> + <reference key="NSAlternateImage" ref="914616927"/> + <int key="NSPeriodicDelay">400</int> + <int key="NSPeriodicInterval">75</int> + </object> + <reference key="NSSelectedCell" ref="708384367"/> + <reference key="NSBackgroundColor" ref="175645791"/> + <reference key="NSCellBackgroundColor" ref="771510757"/> + <reference key="NSFont" ref="809233629"/> + </object> + </array> + <string key="NSFrame">{{1, 1}, {581, 62}}</string> + <reference key="NSSuperview" ref="866741769"/> + <reference key="NSNextKeyView" ref="82294173"/> + <string key="NSReuseIdentifierKey">_NS:632</string> + </object> + </array> + <string key="NSFrame">{{10, 16}, {583, 78}}</string> + <reference key="NSSuperview" ref="929656847"/> + <reference key="NSNextKeyView" ref="132072321"/> + <string key="NSReuseIdentifierKey">_NS:630</string> + <string key="NSOffsets">{0, 0}</string> + <object class="NSTextFieldCell" key="NSTitleCell"> + <int key="NSCellFlags">67108864</int> + <int key="NSCellFlags2">0</int> + <string key="NSContents">Write Request Behavior</string> + <reference key="NSSupport" ref="26"/> + <reference key="NSBackgroundColor" ref="449937964"/> + <object class="NSColor" key="NSTextColor"> + <int key="NSColorSpace">3</int> + <bytes key="NSWhite">MCAwLjgwMDAwMDAxMTkAA</bytes> + </object> + </object> + <reference key="NSContentView" ref="132072321"/> + <int key="NSBorderType">1</int> + <int key="NSBoxType">0</int> + <int key="NSTitlePosition">2</int> + <bool key="NSTransparent">NO</bool> + </object> + </array> + <string key="NSFrameSize">{603, 348}</string> + <reference key="NSNextKeyView" ref="208819373"/> + <string key="NSReuseIdentifierKey">_NS:2818</string> + </object> + <string key="NSScreenRect">{{0, 0}, {1440, 878}}</string> + <string key="NSMaxSize">{10000000000000, 10000000000000}</string> + <bool key="NSWindowIsRestorable">YES</bool> + </object> + <object class="NSNumberFormatter" id="668310416"> + <dictionary class="NSMutableDictionary" key="NS.attributes"> + <boolean value="YES" key="allowsFloats"/> + <integer value="1040" key="formatterBehavior"/> + <object class="NSLocale" key="locale"> + <string key="NS.identifier"/> + </object> + <real value="32765" key="maximum"/> + <real value="1" key="minimum"/> + <string key="negativeInfinitySymbol">-∞</string> + <string key="nilSymbol"/> + <integer value="0" key="numberStyle"/> + <string key="positiveInfinitySymbol">+∞</string> + </dictionary> + <string key="NS.positiveformat">#</string> + <string key="NS.negativeformat">#</string> + <nil key="NS.positiveattrs"/> + <nil key="NS.negativeattrs"/> + <nil key="NS.zero"/> + <object class="NSAttributedString" key="NS.nil"> + <string key="NSString"/> + </object> + <object class="NSAttributedString" key="NS.nan"> + <string key="NSString">NaN</string> + <dictionary key="NSAttributes"/> + </object> + <real value="1" key="NS.min"/> + <real value="32765" key="NS.max"/> + <object class="NSDecimalNumberHandler" key="NS.rounding"> + <int key="NS.roundingmode">3</int> + <bool key="NS.raise.overflow">YES</bool> + <bool key="NS.raise.underflow">YES</bool> + <bool key="NS.raise.dividebyzero">YES</bool> + </object> + <string key="NS.decimal">.</string> + <string key="NS.thousand">,</string> + <bool key="NS.hasthousands">NO</bool> + <bool key="NS.localized">NO</bool> + <bool key="NS.allowsfloats">YES</bool> + </object> + <object class="IBCustomFormatter" id="1047776860"/> + <object class="NSCustomObject" id="976324537"> + <string key="NSClassName">PumpKIN</string> + </object> + <object class="NSCustomObject" id="755631768"> + <string key="NSClassName">NSFontManager</string> + </object> + <object class="NSUserDefaultsController" id="228329665"> + <bool key="NSSharedInstance">YES</bool> + </object> + </array> + <object class="IBObjectContainer" key="IBDocument.Objects"> + <array class="NSMutableArray" key="connectionRecords"> + <object class="IBConnectionRecord"> + <object class="IBActionConnection" key="connection"> + <string key="label">terminate:</string> + <reference key="source" ref="1050"/> + <reference key="destination" ref="632727374"/> + </object> + <int key="connectionID">449</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBActionConnection" key="connection"> + <string key="label">orderFrontStandardAboutPanel:</string> + <reference key="source" ref="1021"/> + <reference key="destination" ref="238522557"/> + </object> + <int key="connectionID">142</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBOutletConnection" key="connection"> + <string key="label">delegate</string> + <reference key="source" ref="1021"/> + <reference key="destination" ref="976324537"/> + </object> + <int key="connectionID">495</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBActionConnection" key="connection"> + <string key="label">performMiniaturize:</string> + <reference key="source" ref="1014"/> + <reference key="destination" ref="1011231497"/> + </object> + <int key="connectionID">37</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBActionConnection" key="connection"> + <string key="label">arrangeInFront:</string> + <reference key="source" ref="1014"/> + <reference key="destination" ref="625202149"/> + </object> + <int key="connectionID">39</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBActionConnection" key="connection"> + <string key="label">toggleContinuousSpellChecking:</string> + <reference key="source" ref="1014"/> + <reference key="destination" ref="948374510"/> + </object> + <int key="connectionID">222</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBActionConnection" key="connection"> + <string key="label">undo:</string> + <reference key="source" ref="1014"/> + <reference key="destination" ref="1058277027"/> + </object> + <int key="connectionID">223</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBActionConnection" key="connection"> + <string key="label">copy:</string> + <reference key="source" ref="1014"/> + <reference key="destination" ref="860595796"/> + </object> + <int key="connectionID">224</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBActionConnection" key="connection"> + <string key="label">checkSpelling:</string> + <reference key="source" ref="1014"/> + <reference key="destination" ref="96193923"/> + </object> + <int key="connectionID">225</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBActionConnection" key="connection"> + <string key="label">paste:</string> + <reference key="source" ref="1014"/> + <reference key="destination" ref="29853731"/> + </object> + <int key="connectionID">226</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBActionConnection" key="connection"> + <string key="label">stopSpeaking:</string> + <reference key="source" ref="1014"/> + <reference key="destination" ref="680220178"/> + </object> + <int key="connectionID">227</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBActionConnection" key="connection"> + <string key="label">cut:</string> + <reference key="source" ref="1014"/> + <reference key="destination" ref="296257095"/> + </object> + <int key="connectionID">228</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBActionConnection" key="connection"> + <string key="label">showGuessPanel:</string> + <reference key="source" ref="1014"/> + <reference key="destination" ref="679648819"/> + </object> + <int key="connectionID">230</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBActionConnection" key="connection"> + <string key="label">redo:</string> + <reference key="source" ref="1014"/> + <reference key="destination" ref="790794224"/> + </object> + <int key="connectionID">231</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBActionConnection" key="connection"> + <string key="label">selectAll:</string> + <reference key="source" ref="1014"/> + <reference key="destination" ref="583158037"/> + </object> + <int key="connectionID">232</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBActionConnection" key="connection"> + <string key="label">startSpeaking:</string> + <reference key="source" ref="1014"/> + <reference key="destination" ref="731782645"/> + </object> + <int key="connectionID">233</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBActionConnection" key="connection"> + <string key="label">delete:</string> + <reference key="source" ref="1014"/> + <reference key="destination" ref="437104165"/> + </object> + <int key="connectionID">235</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBActionConnection" key="connection"> + <string key="label">performZoom:</string> + <reference key="source" ref="1014"/> + <reference key="destination" ref="575023229"/> + </object> + <int key="connectionID">240</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBActionConnection" key="connection"> + <string key="label">performFindPanelAction:</string> + <reference key="source" ref="1014"/> + <reference key="destination" ref="447796847"/> + </object> + <int key="connectionID">241</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBActionConnection" key="connection"> + <string key="label">centerSelectionInVisibleArea:</string> + <reference key="source" ref="1014"/> + <reference key="destination" ref="88285865"/> + </object> + <int key="connectionID">245</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBActionConnection" key="connection"> + <string key="label">toggleGrammarChecking:</string> + <reference key="source" ref="1014"/> + <reference key="destination" ref="967646866"/> + </object> + <int key="connectionID">347</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBActionConnection" key="connection"> + <string key="label">toggleSmartInsertDelete:</string> + <reference key="source" ref="1014"/> + <reference key="destination" ref="605118523"/> + </object> + <int key="connectionID">355</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBActionConnection" key="connection"> + <string key="label">toggleAutomaticQuoteSubstitution:</string> + <reference key="source" ref="1014"/> + <reference key="destination" ref="197661976"/> + </object> + <int key="connectionID">356</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBActionConnection" key="connection"> + <string key="label">toggleAutomaticLinkDetection:</string> + <reference key="source" ref="1014"/> + <reference key="destination" ref="708854459"/> + </object> + <int key="connectionID">357</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBActionConnection" key="connection"> + <string key="label">runToolbarCustomizationPalette:</string> + <reference key="source" ref="1014"/> + <reference key="destination" ref="237841660"/> + </object> + <int key="connectionID">365</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBActionConnection" key="connection"> + <string key="label">toggleToolbarShown:</string> + <reference key="source" ref="1014"/> + <reference key="destination" ref="102151532"/> + </object> + <int key="connectionID">366</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBActionConnection" key="connection"> + <string key="label">hide:</string> + <reference key="source" ref="1014"/> + <reference key="destination" ref="755159360"/> + </object> + <int key="connectionID">367</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBActionConnection" key="connection"> + <string key="label">hideOtherApplications:</string> + <reference key="source" ref="1014"/> + <reference key="destination" ref="342932134"/> + </object> + <int key="connectionID">368</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBActionConnection" key="connection"> + <string key="label">unhideAllApplications:</string> + <reference key="source" ref="1014"/> + <reference key="destination" ref="908899353"/> + </object> + <int key="connectionID">370</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBActionConnection" key="connection"> + <string key="label">toggleAutomaticSpellingCorrection:</string> + <reference key="source" ref="1014"/> + <reference key="destination" ref="795346622"/> + </object> + <int key="connectionID">456</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBActionConnection" key="connection"> + <string key="label">orderFrontSubstitutionsPanel:</string> + <reference key="source" ref="1014"/> + <reference key="destination" ref="65139061"/> + </object> + <int key="connectionID">458</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBActionConnection" key="connection"> + <string key="label">toggleAutomaticDashSubstitution:</string> + <reference key="source" ref="1014"/> + <reference key="destination" ref="672708820"/> + </object> + <int key="connectionID">461</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBActionConnection" key="connection"> + <string key="label">toggleAutomaticTextReplacement:</string> + <reference key="source" ref="1014"/> + <reference key="destination" ref="537092702"/> + </object> + <int key="connectionID">463</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBActionConnection" key="connection"> + <string key="label">uppercaseWord:</string> + <reference key="source" ref="1014"/> + <reference key="destination" ref="1060694897"/> + </object> + <int key="connectionID">464</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBActionConnection" key="connection"> + <string key="label">capitalizeWord:</string> + <reference key="source" ref="1014"/> + <reference key="destination" ref="56570060"/> + </object> + <int key="connectionID">467</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBActionConnection" key="connection"> + <string key="label">lowercaseWord:</string> + <reference key="source" ref="1014"/> + <reference key="destination" ref="879586729"/> + </object> + <int key="connectionID">468</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBActionConnection" key="connection"> + <string key="label">pasteAsPlainText:</string> + <reference key="source" ref="1014"/> + <reference key="destination" ref="82994268"/> + </object> + <int key="connectionID">486</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBActionConnection" key="connection"> + <string key="label">performFindPanelAction:</string> + <reference key="source" ref="1014"/> + <reference key="destination" ref="326711663"/> + </object> + <int key="connectionID">487</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBActionConnection" key="connection"> + <string key="label">performFindPanelAction:</string> + <reference key="source" ref="1014"/> + <reference key="destination" ref="270902937"/> + </object> + <int key="connectionID">488</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBActionConnection" key="connection"> + <string key="label">performFindPanelAction:</string> + <reference key="source" ref="1014"/> + <reference key="destination" ref="159080638"/> + </object> + <int key="connectionID">489</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBActionConnection" key="connection"> + <string key="label">showHelp:</string> + <reference key="source" ref="1014"/> + <reference key="destination" ref="105068016"/> + </object> + <int key="connectionID">493</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBActionConnection" key="connection"> + <string key="label">performFindPanelAction:</string> + <reference key="source" ref="1014"/> + <reference key="destination" ref="738670835"/> + </object> + <int key="connectionID">535</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBOutletConnection" key="connection"> + <string key="label">window</string> + <reference key="source" ref="976324537"/> + <reference key="destination" ref="972006081"/> + </object> + <int key="connectionID">532</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBOutletConnection" key="connection"> + <string key="label">logger</string> + <reference key="source" ref="976324537"/> + <reference key="destination" ref="827877557"/> + </object> + <int key="connectionID">572</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBOutletConnection" key="connection"> + <string key="label">toolbar</string> + <reference key="source" ref="976324537"/> + <reference key="destination" ref="185334702"/> + </object> + <int key="connectionID">1020</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBActionConnection" key="connection"> + <string key="label">abortXfer:</string> + <reference key="source" ref="976324537"/> + <reference key="destination" ref="964116338"/> + </object> + <int key="connectionID">1142</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBActionConnection" key="connection"> + <string key="label">abortXfer:</string> + <reference key="source" ref="976324537"/> + <reference key="destination" ref="1051457108"/> + </object> + <int key="connectionID">1143</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBActionConnection" key="connection"> + <string key="label">getFile:</string> + <reference key="source" ref="976324537"/> + <reference key="destination" ref="210005870"/> + </object> + <int key="connectionID">1144</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBActionConnection" key="connection"> + <string key="label">putFile:</string> + <reference key="source" ref="976324537"/> + <reference key="destination" ref="163657319"/> + </object> + <int key="connectionID">1145</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBActionConnection" key="connection"> + <string key="label">putFile:</string> + <reference key="source" ref="976324537"/> + <reference key="destination" ref="684754710"/> + </object> + <int key="connectionID">1146</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBOutletConnection" key="connection"> + <string key="label">preferencesWindow</string> + <reference key="source" ref="976324537"/> + <reference key="destination" ref="759947593"/> + </object> + <int key="connectionID">1147</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBOutletConnection" key="connection"> + <string key="label">theDefaults</string> + <reference key="source" ref="976324537"/> + <reference key="destination" ref="228329665"/> + </object> + <int key="connectionID">1148</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBActionConnection" key="connection"> + <string key="label">showPreferences:</string> + <reference key="source" ref="976324537"/> + <reference key="destination" ref="609285721"/> + </object> + <int key="connectionID">1149</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBActionConnection" key="connection"> + <string key="label">pickLogFile:</string> + <reference key="source" ref="976324537"/> + <reference key="destination" ref="379050521"/> + </object> + <int key="connectionID">1151</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBOutletConnection" key="connection"> + <string key="label">xfersView</string> + <reference key="source" ref="976324537"/> + <reference key="destination" ref="45603544"/> + </object> + <int key="connectionID">1152</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBActionConnection" key="connection"> + <string key="label">getFile:</string> + <reference key="source" ref="976324537"/> + <reference key="destination" ref="869342911"/> + </object> + <int key="connectionID">1154</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBActionConnection" key="connection"> + <string key="label">pickTFTPFolder:</string> + <reference key="source" ref="976324537"/> + <reference key="destination" ref="108023427"/> + </object> + <int key="connectionID">1162</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBOutletConnection" key="connection"> + <string key="label">delegate</string> + <reference key="source" ref="45603544"/> + <reference key="destination" ref="976324537"/> + </object> + <int key="connectionID">1019</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBBindingConnection" key="connection"> + <string key="label">enabled: self.hasSelectedXfer</string> + <reference key="source" ref="1051457108"/> + <reference key="destination" ref="976324537"/> + <object class="NSNibBindingConnector" key="connector"> + <reference key="NSSource" ref="1051457108"/> + <reference key="NSDestination" ref="976324537"/> + <string key="NSLabel">enabled: self.hasSelectedXfer</string> + <string key="NSBinding">enabled</string> + <string key="NSKeyPath">self.hasSelectedXfer</string> + <int key="NSNibBindingConnectorVersion">2</int> + </object> + </object> + <int key="connectionID">1023</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBBindingConnection" key="connection"> + <string key="label">enabled: self.hasSelectedXfer</string> + <reference key="source" ref="964116338"/> + <reference key="destination" ref="976324537"/> + <object class="NSNibBindingConnector" key="connector"> + <reference key="NSSource" ref="964116338"/> + <reference key="NSDestination" ref="976324537"/> + <string key="NSLabel">enabled: self.hasSelectedXfer</string> + <string key="NSBinding">enabled</string> + <string key="NSKeyPath">self.hasSelectedXfer</string> + <int key="NSNibBindingConnectorVersion">2</int> + </object> + </object> + <int key="connectionID">1027</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBOutletConnection" key="connection"> + <string key="label">formatter</string> + <reference key="source" ref="419622798"/> + <reference key="destination" ref="1047776860"/> + </object> + <int key="connectionID">1103</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBBindingConnection" key="connection"> + <string key="label">value: values.bindAddress</string> + <reference key="source" ref="419622798"/> + <reference key="destination" ref="228329665"/> + <object class="NSNibBindingConnector" key="connector"> + <reference key="NSSource" ref="419622798"/> + <reference key="NSDestination" ref="228329665"/> + <string key="NSLabel">value: values.bindAddress</string> + <string key="NSBinding">value</string> + <string key="NSKeyPath">values.bindAddress</string> + <dictionary key="NSOptions"> + <boolean value="YES" key="NSValidatesImmediately"/> + <string key="NSValueTransformerName">IPTransformer</string> + </dictionary> + <int key="NSNibBindingConnectorVersion">2</int> + </object> + </object> + <int key="connectionID">1164</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBOutletConnection" key="connection"> + <string key="label">formatter</string> + <reference key="source" ref="711665850"/> + <reference key="destination" ref="668310416"/> + </object> + <int key="connectionID">1097</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBBindingConnection" key="connection"> + <string key="label">value: values.bindPort</string> + <reference key="source" ref="711665850"/> + <reference key="destination" ref="228329665"/> + <object class="NSNibBindingConnector" key="connector"> + <reference key="NSSource" ref="711665850"/> + <reference key="NSDestination" ref="228329665"/> + <string key="NSLabel">value: values.bindPort</string> + <string key="NSBinding">value</string> + <string key="NSKeyPath">values.bindPort</string> + <object class="NSDictionary" key="NSOptions"> + <string key="NS.key.0">NSValueTransformerName</string> + <string key="NS.object.0">NumberTransformer</string> + </object> + <int key="NSNibBindingConnectorVersion">2</int> + </object> + </object> + <int key="connectionID">1153</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBBindingConnection" key="connection"> + <string key="label">value: values.listen</string> + <reference key="source" ref="230958321"/> + <reference key="destination" ref="228329665"/> + <object class="NSNibBindingConnector" key="connector"> + <reference key="NSSource" ref="230958321"/> + <reference key="NSDestination" ref="228329665"/> + <string key="NSLabel">value: values.listen</string> + <string key="NSBinding">value</string> + <string key="NSKeyPath">values.listen</string> + <int key="NSNibBindingConnectorVersion">2</int> + </object> + </object> + <int key="connectionID">1140</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBBindingConnection" key="connection"> + <string key="label">value: values.listen</string> + <reference key="source" ref="441222556"/> + <reference key="destination" ref="228329665"/> + <object class="NSNibBindingConnector" key="connector"> + <reference key="NSSource" ref="441222556"/> + <reference key="NSDestination" ref="228329665"/> + <string key="NSLabel">value: values.listen</string> + <string key="NSBinding">value</string> + <string key="NSKeyPath">values.listen</string> + <int key="NSNibBindingConnectorVersion">2</int> + </object> + </object> + <int key="connectionID">1158</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBBindingConnection" key="connection"> + <string key="label">value: values.tftpRoot</string> + <reference key="source" ref="328098120"/> + <reference key="destination" ref="228329665"/> + <object class="NSNibBindingConnector" key="connector"> + <reference key="NSSource" ref="328098120"/> + <reference key="NSDestination" ref="228329665"/> + <string key="NSLabel">value: values.tftpRoot</string> + <string key="NSBinding">value</string> + <string key="NSKeyPath">values.tftpRoot</string> + <int key="NSNibBindingConnectorVersion">2</int> + </object> + </object> + <int key="connectionID">1134</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBBindingConnection" key="connection"> + <string key="label">selectedTag: values.rrqBehavior</string> + <reference key="source" ref="973753659"/> + <reference key="destination" ref="228329665"/> + <object class="NSNibBindingConnector" key="connector"> + <reference key="NSSource" ref="973753659"/> + <reference key="NSDestination" ref="228329665"/> + <string key="NSLabel">selectedTag: values.rrqBehavior</string> + <string key="NSBinding">selectedTag</string> + <string key="NSKeyPath">values.rrqBehavior</string> + <int key="NSNibBindingConnectorVersion">2</int> + </object> + </object> + <int key="connectionID">1133</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBBindingConnection" key="connection"> + <string key="label">selectedTag: values.wrqBehavior</string> + <reference key="source" ref="82294173"/> + <reference key="destination" ref="228329665"/> + <object class="NSNibBindingConnector" key="connector"> + <reference key="NSSource" ref="82294173"/> + <reference key="NSDestination" ref="228329665"/> + <string key="NSLabel">selectedTag: values.wrqBehavior</string> + <string key="NSBinding">selectedTag</string> + <string key="NSKeyPath">values.wrqBehavior</string> + <int key="NSNibBindingConnectorVersion">2</int> + </object> + </object> + <int key="connectionID">1135</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBBindingConnection" key="connection"> + <string key="label">value: values.logFile</string> + <reference key="source" ref="823695658"/> + <reference key="destination" ref="228329665"/> + <object class="NSNibBindingConnector" key="connector"> + <reference key="NSSource" ref="823695658"/> + <reference key="NSDestination" ref="228329665"/> + <string key="NSLabel">value: values.logFile</string> + <string key="NSBinding">value</string> + <string key="NSKeyPath">values.logFile</string> + <int key="NSNibBindingConnectorVersion">2</int> + </object> + </object> + <int key="connectionID">1136</int> + </object> + </array> + <object class="IBMutableOrderedSet" key="objectRecords"> + <array key="orderedObjects"> + <object class="IBObjectRecord"> + <int key="objectID">0</int> + <reference key="object" ref="0"/> + <reference key="children" ref="1048"/> + <nil key="parent"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">-2</int> + <reference key="object" ref="1021"/> + <reference key="parent" ref="0"/> + <string key="objectName">File's Owner</string> + </object> + <object class="IBObjectRecord"> + <int key="objectID">-1</int> + <reference key="object" ref="1014"/> + <reference key="parent" ref="0"/> + <string key="objectName">First Responder</string> + </object> + <object class="IBObjectRecord"> + <int key="objectID">-3</int> + <reference key="object" ref="1050"/> + <reference key="parent" ref="0"/> + <string key="objectName">Application</string> + </object> + <object class="IBObjectRecord"> + <int key="objectID">29</int> + <reference key="object" ref="649796088"/> + <array class="NSMutableArray" key="children"> + <reference ref="713487014"/> + <reference ref="694149608"/> + <reference ref="952259628"/> + <reference ref="379814623"/> + <reference ref="586577488"/> + <reference ref="448692316"/> + </array> + <reference key="parent" ref="0"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">19</int> + <reference key="object" ref="713487014"/> + <array class="NSMutableArray" key="children"> + <reference ref="835318025"/> + </array> + <reference key="parent" ref="649796088"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">56</int> + <reference key="object" ref="694149608"/> + <array class="NSMutableArray" key="children"> + <reference ref="110575045"/> + </array> + <reference key="parent" ref="649796088"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">217</int> + <reference key="object" ref="952259628"/> + <array class="NSMutableArray" key="children"> + <reference ref="789758025"/> + </array> + <reference key="parent" ref="649796088"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">83</int> + <reference key="object" ref="379814623"/> + <array class="NSMutableArray" key="children"> + <reference ref="720053764"/> + </array> + <reference key="parent" ref="649796088"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">81</int> + <reference key="object" ref="720053764"/> + <array class="NSMutableArray" key="children"> + <reference ref="869342911"/> + <reference ref="684754710"/> + <reference ref="511451131"/> + <reference ref="964116338"/> + </array> + <reference key="parent" ref="379814623"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">205</int> + <reference key="object" ref="789758025"/> + <array class="NSMutableArray" key="children"> + <reference ref="437104165"/> + <reference ref="583158037"/> + <reference ref="1058277027"/> + <reference ref="212016141"/> + <reference ref="296257095"/> + <reference ref="29853731"/> + <reference ref="860595796"/> + <reference ref="1040322652"/> + <reference ref="790794224"/> + <reference ref="892235320"/> + <reference ref="972420730"/> + <reference ref="676164635"/> + <reference ref="507821607"/> + <reference ref="288088188"/> + <reference ref="82994268"/> + </array> + <reference key="parent" ref="952259628"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">202</int> + <reference key="object" ref="437104165"/> + <reference key="parent" ref="789758025"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">198</int> + <reference key="object" ref="583158037"/> + <reference key="parent" ref="789758025"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">207</int> + <reference key="object" ref="1058277027"/> + <reference key="parent" ref="789758025"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">214</int> + <reference key="object" ref="212016141"/> + <reference key="parent" ref="789758025"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">199</int> + <reference key="object" ref="296257095"/> + <reference key="parent" ref="789758025"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">203</int> + <reference key="object" ref="29853731"/> + <reference key="parent" ref="789758025"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">197</int> + <reference key="object" ref="860595796"/> + <reference key="parent" ref="789758025"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">206</int> + <reference key="object" ref="1040322652"/> + <reference key="parent" ref="789758025"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">215</int> + <reference key="object" ref="790794224"/> + <reference key="parent" ref="789758025"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">218</int> + <reference key="object" ref="892235320"/> + <array class="NSMutableArray" key="children"> + <reference ref="963351320"/> + </array> + <reference key="parent" ref="789758025"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">216</int> + <reference key="object" ref="972420730"/> + <array class="NSMutableArray" key="children"> + <reference ref="769623530"/> + </array> + <reference key="parent" ref="789758025"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">200</int> + <reference key="object" ref="769623530"/> + <array class="NSMutableArray" key="children"> + <reference ref="948374510"/> + <reference ref="96193923"/> + <reference ref="679648819"/> + <reference ref="967646866"/> + <reference ref="859480356"/> + <reference ref="795346622"/> + </array> + <reference key="parent" ref="972420730"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">219</int> + <reference key="object" ref="948374510"/> + <reference key="parent" ref="769623530"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">201</int> + <reference key="object" ref="96193923"/> + <reference key="parent" ref="769623530"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">204</int> + <reference key="object" ref="679648819"/> + <reference key="parent" ref="769623530"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">220</int> + <reference key="object" ref="963351320"/> + <array class="NSMutableArray" key="children"> + <reference ref="270902937"/> + <reference ref="88285865"/> + <reference ref="159080638"/> + <reference ref="326711663"/> + <reference ref="447796847"/> + <reference ref="738670835"/> + </array> + <reference key="parent" ref="892235320"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">213</int> + <reference key="object" ref="270902937"/> + <reference key="parent" ref="963351320"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">210</int> + <reference key="object" ref="88285865"/> + <reference key="parent" ref="963351320"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">221</int> + <reference key="object" ref="159080638"/> + <reference key="parent" ref="963351320"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">208</int> + <reference key="object" ref="326711663"/> + <reference key="parent" ref="963351320"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">209</int> + <reference key="object" ref="447796847"/> + <reference key="parent" ref="963351320"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">57</int> + <reference key="object" ref="110575045"/> + <array class="NSMutableArray" key="children"> + <reference ref="238522557"/> + <reference ref="755159360"/> + <reference ref="908899353"/> + <reference ref="632727374"/> + <reference ref="646227648"/> + <reference ref="609285721"/> + <reference ref="481834944"/> + <reference ref="304266470"/> + <reference ref="1046388886"/> + <reference ref="1056857174"/> + <reference ref="342932134"/> + </array> + <reference key="parent" ref="694149608"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">58</int> + <reference key="object" ref="238522557"/> + <reference key="parent" ref="110575045"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">134</int> + <reference key="object" ref="755159360"/> + <reference key="parent" ref="110575045"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">150</int> + <reference key="object" ref="908899353"/> + <reference key="parent" ref="110575045"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">136</int> + <reference key="object" ref="632727374"/> + <reference key="parent" ref="110575045"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">144</int> + <reference key="object" ref="646227648"/> + <reference key="parent" ref="110575045"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">129</int> + <reference key="object" ref="609285721"/> + <reference key="parent" ref="110575045"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">143</int> + <reference key="object" ref="481834944"/> + <reference key="parent" ref="110575045"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">236</int> + <reference key="object" ref="304266470"/> + <reference key="parent" ref="110575045"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">131</int> + <reference key="object" ref="1046388886"/> + <array class="NSMutableArray" key="children"> + <reference ref="752062318"/> + </array> + <reference key="parent" ref="110575045"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">149</int> + <reference key="object" ref="1056857174"/> + <reference key="parent" ref="110575045"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">145</int> + <reference key="object" ref="342932134"/> + <reference key="parent" ref="110575045"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">130</int> + <reference key="object" ref="752062318"/> + <reference key="parent" ref="1046388886"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">24</int> + <reference key="object" ref="835318025"/> + <array class="NSMutableArray" key="children"> + <reference ref="299356726"/> + <reference ref="625202149"/> + <reference ref="575023229"/> + <reference ref="1011231497"/> + </array> + <reference key="parent" ref="713487014"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">92</int> + <reference key="object" ref="299356726"/> + <reference key="parent" ref="835318025"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">5</int> + <reference key="object" ref="625202149"/> + <reference key="parent" ref="835318025"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">239</int> + <reference key="object" ref="575023229"/> + <reference key="parent" ref="835318025"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">23</int> + <reference key="object" ref="1011231497"/> + <reference key="parent" ref="835318025"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">295</int> + <reference key="object" ref="586577488"/> + <array class="NSMutableArray" key="children"> + <reference ref="466310130"/> + </array> + <reference key="parent" ref="649796088"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">296</int> + <reference key="object" ref="466310130"/> + <array class="NSMutableArray" key="children"> + <reference ref="102151532"/> + <reference ref="237841660"/> + </array> + <reference key="parent" ref="586577488"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">297</int> + <reference key="object" ref="102151532"/> + <reference key="parent" ref="466310130"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">298</int> + <reference key="object" ref="237841660"/> + <reference key="parent" ref="466310130"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">211</int> + <reference key="object" ref="676164635"/> + <array class="NSMutableArray" key="children"> + <reference ref="785027613"/> + </array> + <reference key="parent" ref="789758025"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">212</int> + <reference key="object" ref="785027613"/> + <array class="NSMutableArray" key="children"> + <reference ref="680220178"/> + <reference ref="731782645"/> + </array> + <reference key="parent" ref="676164635"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">195</int> + <reference key="object" ref="680220178"/> + <reference key="parent" ref="785027613"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">196</int> + <reference key="object" ref="731782645"/> + <reference key="parent" ref="785027613"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">346</int> + <reference key="object" ref="967646866"/> + <reference key="parent" ref="769623530"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">348</int> + <reference key="object" ref="507821607"/> + <array class="NSMutableArray" key="children"> + <reference ref="698887838"/> + </array> + <reference key="parent" ref="789758025"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">349</int> + <reference key="object" ref="698887838"/> + <array class="NSMutableArray" key="children"> + <reference ref="605118523"/> + <reference ref="197661976"/> + <reference ref="708854459"/> + <reference ref="65139061"/> + <reference ref="19036812"/> + <reference ref="672708820"/> + <reference ref="537092702"/> + </array> + <reference key="parent" ref="507821607"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">350</int> + <reference key="object" ref="605118523"/> + <reference key="parent" ref="698887838"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">351</int> + <reference key="object" ref="197661976"/> + <reference key="parent" ref="698887838"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">354</int> + <reference key="object" ref="708854459"/> + <reference key="parent" ref="698887838"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">371</int> + <reference key="object" ref="972006081"/> + <array class="NSMutableArray" key="children"> + <reference ref="439893737"/> + <reference ref="185334702"/> + </array> + <reference key="parent" ref="0"/> + <string key="objectName">Window - PumpKIN</string> + </object> + <object class="IBObjectRecord"> + <int key="objectID">372</int> + <reference key="object" ref="439893737"/> + <array class="NSMutableArray" key="children"> + <reference ref="250587056"/> + <reference ref="639837771"/> + </array> + <reference key="parent" ref="972006081"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">420</int> + <reference key="object" ref="755631768"/> + <reference key="parent" ref="0"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">450</int> + <reference key="object" ref="288088188"/> + <array class="NSMutableArray" key="children"> + <reference ref="579392910"/> + </array> + <reference key="parent" ref="789758025"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">451</int> + <reference key="object" ref="579392910"/> + <array class="NSMutableArray" key="children"> + <reference ref="1060694897"/> + <reference ref="879586729"/> + <reference ref="56570060"/> + </array> + <reference key="parent" ref="288088188"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">452</int> + <reference key="object" ref="1060694897"/> + <reference key="parent" ref="579392910"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">453</int> + <reference key="object" ref="859480356"/> + <reference key="parent" ref="769623530"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">454</int> + <reference key="object" ref="795346622"/> + <reference key="parent" ref="769623530"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">457</int> + <reference key="object" ref="65139061"/> + <reference key="parent" ref="698887838"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">459</int> + <reference key="object" ref="19036812"/> + <reference key="parent" ref="698887838"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">460</int> + <reference key="object" ref="672708820"/> + <reference key="parent" ref="698887838"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">462</int> + <reference key="object" ref="537092702"/> + <reference key="parent" ref="698887838"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">465</int> + <reference key="object" ref="879586729"/> + <reference key="parent" ref="579392910"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">466</int> + <reference key="object" ref="56570060"/> + <reference key="parent" ref="579392910"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">485</int> + <reference key="object" ref="82994268"/> + <reference key="parent" ref="789758025"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">490</int> + <reference key="object" ref="448692316"/> + <array class="NSMutableArray" key="children"> + <reference ref="992780483"/> + </array> + <reference key="parent" ref="649796088"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">491</int> + <reference key="object" ref="992780483"/> + <array class="NSMutableArray" key="children"> + <reference ref="105068016"/> + </array> + <reference key="parent" ref="448692316"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">492</int> + <reference key="object" ref="105068016"/> + <reference key="parent" ref="992780483"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">494</int> + <reference key="object" ref="976324537"/> + <reference key="parent" ref="0"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">534</int> + <reference key="object" ref="738670835"/> + <reference key="parent" ref="963351320"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">536</int> + <reference key="object" ref="250587056"/> + <array class="NSMutableArray" key="children"> + <reference ref="328183451"/> + <reference ref="427087625"/> + </array> + <reference key="parent" ref="439893737"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">537</int> + <reference key="object" ref="328183451"/> + <array class="NSMutableArray" key="children"> + <reference ref="192988542"/> + </array> + <reference key="parent" ref="250587056"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">538</int> + <reference key="object" ref="427087625"/> + <array class="NSMutableArray" key="children"> + <reference ref="356109671"/> + </array> + <reference key="parent" ref="250587056"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">547</int> + <reference key="object" ref="356109671"/> + <array class="NSMutableArray" key="children"> + <reference ref="275648235"/> + <reference ref="4720790"/> + <reference ref="827877557"/> + </array> + <reference key="parent" ref="427087625"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">548</int> + <reference key="object" ref="275648235"/> + <reference key="parent" ref="356109671"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">549</int> + <reference key="object" ref="4720790"/> + <reference key="parent" ref="356109671"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">550</int> + <reference key="object" ref="827877557"/> + <reference key="parent" ref="356109671"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">551</int> + <reference key="object" ref="192988542"/> + <array class="NSMutableArray" key="children"> + <reference ref="600095476"/> + <reference ref="1022673745"/> + <reference ref="1046047013"/> + <reference ref="45603544"/> + </array> + <reference key="parent" ref="328183451"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">552</int> + <reference key="object" ref="600095476"/> + <reference key="parent" ref="192988542"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">553</int> + <reference key="object" ref="1022673745"/> + <reference key="parent" ref="192988542"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">554</int> + <reference key="object" ref="1046047013"/> + <reference key="parent" ref="192988542"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">555</int> + <reference key="object" ref="45603544"/> + <array class="NSMutableArray" key="children"> + <reference ref="919343863"/> + <reference ref="1044915056"/> + <reference ref="431807415"/> + <reference ref="644944854"/> + <reference ref="780404863"/> + </array> + <reference key="parent" ref="192988542"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">556</int> + <reference key="object" ref="919343863"/> + <array class="NSMutableArray" key="children"> + <reference ref="967877425"/> + </array> + <reference key="parent" ref="45603544"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">557</int> + <reference key="object" ref="1044915056"/> + <array class="NSMutableArray" key="children"> + <reference ref="1061781149"/> + </array> + <reference key="parent" ref="45603544"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">558</int> + <reference key="object" ref="1061781149"/> + <reference key="parent" ref="1044915056"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">559</int> + <reference key="object" ref="967877425"/> + <reference key="parent" ref="919343863"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">566</int> + <reference key="object" ref="431807415"/> + <array class="NSMutableArray" key="children"> + <reference ref="762484653"/> + </array> + <reference key="parent" ref="45603544"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">567</int> + <reference key="object" ref="762484653"/> + <reference key="parent" ref="431807415"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">568</int> + <reference key="object" ref="644944854"/> + <array class="NSMutableArray" key="children"> + <reference ref="730146075"/> + </array> + <reference key="parent" ref="45603544"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">569</int> + <reference key="object" ref="730146075"/> + <reference key="parent" ref="644944854"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">570</int> + <reference key="object" ref="780404863"/> + <array class="NSMutableArray" key="children"> + <reference ref="475925037"/> + </array> + <reference key="parent" ref="45603544"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">571</int> + <reference key="object" ref="475925037"/> + <reference key="parent" ref="780404863"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">815</int> + <reference key="object" ref="759947593"/> + <array class="NSMutableArray" key="children"> + <reference ref="929656847"/> + </array> + <reference key="parent" ref="0"/> + <string key="objectName">Window - PumpKIN preferences</string> + </object> + <object class="IBObjectRecord"> + <int key="objectID">816</int> + <reference key="object" ref="929656847"/> + <array class="NSMutableArray" key="children"> + <reference ref="197043543"/> + <reference ref="233651545"/> + <reference ref="208819373"/> + <reference ref="866741769"/> + </array> + <reference key="parent" ref="759947593"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">915</int> + <reference key="object" ref="228329665"/> + <reference key="parent" ref="0"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">994</int> + <reference key="object" ref="185334702"/> + <array class="NSMutableArray" key="children"> + <reference ref="166245072"/> + <reference ref="106903695"/> + <reference ref="210005870"/> + <reference ref="163657319"/> + <reference ref="1051457108"/> + </array> + <reference key="parent" ref="972006081"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">998</int> + <reference key="object" ref="166245072"/> + <reference key="parent" ref="185334702"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">999</int> + <reference key="object" ref="106903695"/> + <reference key="parent" ref="185334702"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">1000</int> + <reference key="object" ref="210005870"/> + <reference key="parent" ref="185334702"/> + <string key="objectName">Toolbar Item - Get file</string> + </object> + <object class="IBObjectRecord"> + <int key="objectID">1001</int> + <reference key="object" ref="163657319"/> + <reference key="parent" ref="185334702"/> + <string key="objectName">Toolbar Item - Put file</string> + </object> + <object class="IBObjectRecord"> + <int key="objectID">1002</int> + <reference key="object" ref="1051457108"/> + <reference key="parent" ref="185334702"/> + <string key="objectName">Toolbar Item - Abort xfer</string> + </object> + <object class="IBObjectRecord"> + <int key="objectID">1003</int> + <reference key="object" ref="869342911"/> + <reference key="parent" ref="720053764"/> + <string key="objectName">Menu Item - Get file</string> + </object> + <object class="IBObjectRecord"> + <int key="objectID">1004</int> + <reference key="object" ref="684754710"/> + <reference key="parent" ref="720053764"/> + <string key="objectName">Menu Item - Put file</string> + </object> + <object class="IBObjectRecord"> + <int key="objectID">1006</int> + <reference key="object" ref="511451131"/> + <reference key="parent" ref="720053764"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">1007</int> + <reference key="object" ref="964116338"/> + <reference key="parent" ref="720053764"/> + <string key="objectName">Menu Item - Abort xfer</string> + </object> + <object class="IBObjectRecord"> + <int key="objectID">1096</int> + <reference key="object" ref="668310416"/> + <reference key="parent" ref="0"/> + <string key="objectName">Port formatter</string> + </object> + <object class="IBObjectRecord"> + <int key="objectID">1102</int> + <reference key="object" ref="1047776860"/> + <reference key="parent" ref="0"/> + <string key="objectName">IP formatter</string> + </object> + <object class="IBObjectRecord"> + <int key="objectID">1108</int> + <reference key="object" ref="208819373"/> + <array class="NSMutableArray" key="children"> + <reference ref="328098120"/> + <reference ref="240606174"/> + </array> + <reference key="parent" ref="929656847"/> + <string key="objectName">Box - TFTP filesystem root (download path)</string> + </object> + <object class="IBObjectRecord"> + <int key="objectID">1115</int> + <reference key="object" ref="240606174"/> + <array class="NSMutableArray" key="children"> + <reference ref="108023427"/> + </array> + <reference key="parent" ref="208819373"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">1114</int> + <reference key="object" ref="328098120"/> + <array class="NSMutableArray" key="children"> + <reference ref="151062802"/> + </array> + <reference key="parent" ref="208819373"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">1117</int> + <reference key="object" ref="151062802"/> + <reference key="parent" ref="328098120"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">1116</int> + <reference key="object" ref="108023427"/> + <reference key="parent" ref="240606174"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">1106</int> + <reference key="object" ref="866741769"/> + <array class="NSMutableArray" key="children"> + <reference ref="82294173"/> + </array> + <reference key="parent" ref="929656847"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">1123</int> + <reference key="object" ref="82294173"/> + <array class="NSMutableArray" key="children"> + <reference ref="672179877"/> + <reference ref="708384367"/> + <reference ref="527645225"/> + <reference ref="158682464"/> + <reference ref="310101904"/> + </array> + <reference key="parent" ref="866741769"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">1128</int> + <reference key="object" ref="672179877"/> + <reference key="parent" ref="82294173"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">1127</int> + <reference key="object" ref="708384367"/> + <reference key="parent" ref="82294173"/> + <string key="objectName">Button Cell - take all</string> + </object> + <object class="IBObjectRecord"> + <int key="objectID">1126</int> + <reference key="object" ref="527645225"/> + <reference key="parent" ref="82294173"/> + <string key="objectName">Button Cell - prompt</string> + </object> + <object class="IBObjectRecord"> + <int key="objectID">1125</int> + <reference key="object" ref="158682464"/> + <reference key="parent" ref="82294173"/> + <string key="objectName">Button Cell - prompt if exists</string> + </object> + <object class="IBObjectRecord"> + <int key="objectID">1124</int> + <reference key="object" ref="310101904"/> + <reference key="parent" ref="82294173"/> + <string key="objectName">Button Cell - deny all</string> + </object> + <object class="IBObjectRecord"> + <int key="objectID">1105</int> + <reference key="object" ref="233651545"/> + <array class="NSMutableArray" key="children"> + <reference ref="823695658"/> + <reference ref="379050521"/> + </array> + <reference key="parent" ref="929656847"/> + <string key="objectName">Box - Log file (leave empty to disable logging to file)</string> + </object> + <object class="IBObjectRecord"> + <int key="objectID">1130</int> + <reference key="object" ref="823695658"/> + <array class="NSMutableArray" key="children"> + <reference ref="424316336"/> + </array> + <reference key="parent" ref="233651545"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">1129</int> + <reference key="object" ref="379050521"/> + <array class="NSMutableArray" key="children"> + <reference ref="621926228"/> + </array> + <reference key="parent" ref="233651545"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">1132</int> + <reference key="object" ref="621926228"/> + <reference key="parent" ref="379050521"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">1131</int> + <reference key="object" ref="424316336"/> + <reference key="parent" ref="823695658"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">1107</int> + <reference key="object" ref="197043543"/> + <array class="NSMutableArray" key="children"> + <reference ref="973753659"/> + </array> + <reference key="parent" ref="929656847"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">1118</int> + <reference key="object" ref="973753659"/> + <array class="NSMutableArray" key="children"> + <reference ref="518920277"/> + <reference ref="529759421"/> + <reference ref="859183946"/> + <reference ref="862531403"/> + </array> + <reference key="parent" ref="197043543"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">1119</int> + <reference key="object" ref="862531403"/> + <reference key="parent" ref="973753659"/> + <string key="objectName">Button Cell - deny all</string> + </object> + <object class="IBObjectRecord"> + <int key="objectID">1120</int> + <reference key="object" ref="859183946"/> + <reference key="parent" ref="973753659"/> + <string key="objectName">Button Cell - prompt</string> + </object> + <object class="IBObjectRecord"> + <int key="objectID">1121</int> + <reference key="object" ref="529759421"/> + <reference key="parent" ref="973753659"/> + <string key="objectName">Button Cell - give all</string> + </object> + <object class="IBObjectRecord"> + <int key="objectID">1122</int> + <reference key="object" ref="518920277"/> + <reference key="parent" ref="973753659"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">1161</int> + <reference key="object" ref="639837771"/> + <array class="NSMutableArray" key="children"> + <reference ref="711665850"/> + <reference ref="7620662"/> + <reference ref="419622798"/> + <reference ref="230958321"/> + </array> + <reference key="parent" ref="439893737"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">1090</int> + <reference key="object" ref="230958321"/> + <array class="NSMutableArray" key="children"> + <reference ref="441222556"/> + </array> + <reference key="parent" ref="639837771"/> + <string key="objectName">Check Box - listen</string> + </object> + <object class="IBObjectRecord"> + <int key="objectID">1091</int> + <reference key="object" ref="441222556"/> + <reference key="parent" ref="230958321"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">1082</int> + <reference key="object" ref="419622798"/> + <array class="NSMutableArray" key="children"> + <reference ref="226701554"/> + </array> + <reference key="parent" ref="639837771"/> + <string key="objectName">Text Field - bind address</string> + </object> + <object class="IBObjectRecord"> + <int key="objectID">1083</int> + <reference key="object" ref="226701554"/> + <reference key="parent" ref="419622798"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">1086</int> + <reference key="object" ref="7620662"/> + <array class="NSMutableArray" key="children"> + <reference ref="31855702"/> + </array> + <reference key="parent" ref="639837771"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">1087</int> + <reference key="object" ref="31855702"/> + <reference key="parent" ref="7620662"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">1084</int> + <reference key="object" ref="711665850"/> + <array class="NSMutableArray" key="children"> + <reference ref="771004923"/> + </array> + <reference key="parent" ref="639837771"/> + <string key="objectName">Text Field - bind port</string> + </object> + <object class="IBObjectRecord"> + <int key="objectID">1085</int> + <reference key="object" ref="771004923"/> + <reference key="parent" ref="711665850"/> + </object> + </array> + </object> + <dictionary class="NSMutableDictionary" key="flattenedProperties"> + <string key="-1.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> + <string key="-2.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> + <string key="-3.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> + <string key="1000.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> + <string key="1001.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> + <string key="1002.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> + <string key="1002.designableToolbarItemIdentifier">abort_xfer</string> + <string key="1003.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> + <string key="1004.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> + <string key="1006.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> + <string key="1007.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> + <object class="NSMutableDictionary" key="1082.IBAttributePlaceholdersKey"> + <string key="NS.key.0">ToolTip</string> + <object class="IBToolTipAttribute" key="NS.object.0"> + <string key="name">ToolTip</string> + <reference key="object" ref="419622798"/> + <string key="toolTip">If you only want PumpKIN to listen to TFTP request on one IP address, specify it here.</string> + </object> + </object> + <string key="1082.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> + <string key="1083.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> + <object class="NSMutableDictionary" key="1084.IBAttributePlaceholdersKey"> + <string key="NS.key.0">ToolTip</string> + <object class="IBToolTipAttribute" key="NS.object.0"> + <string key="name">ToolTip</string> + <reference key="object" ref="711665850"/> + <string key="toolTip">The standard TFTP port is 69. If you change it, make sure peers are aware of the change and support it.</string> + </object> + </object> + <string key="1084.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> + <string key="1085.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> + <string key="1086.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> + <string key="1087.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> + <object class="NSMutableDictionary" key="1090.IBAttributePlaceholdersKey"> + <string key="NS.key.0">ToolTip</string> + <object class="IBToolTipAttribute" key="NS.object.0"> + <string key="name">ToolTip</string> + <reference key="object" ref="230958321"/> + <string key="toolTip">When enabled, pumpkin also acts as a daemon (server). Note, that this often requires escalating privileges to bind to the privileged (69 by default) port and may also conflict if you have another tftp daemon running (you'll be notified).</string> + </object> + </object> + <string key="1090.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> + <string key="1091.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> + <integer value="1041" key="1096.IBNumberFormatterBehaviorMetadataKey"/> + <boolean value="YES" key="1096.IBNumberFormatterLocalizesFormatMetadataKey"/> + <string key="1096.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> + <string key="1102.CustomClassName">IPFormatter</string> + <string key="1102.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> + <string key="1105.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> + <string key="1106.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> + <string key="1107.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> + <string key="1108.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> + <object class="NSMutableDictionary" key="1114.IBAttributePlaceholdersKey"> + <string key="NS.key.0">ToolTip</string> + <object class="IBToolTipAttribute" key="NS.object.0"> + <string key="name">ToolTip</string> + <reference key="object" ref="328098120"/> + <string key="toolTip">TFTP root is a directory where incoming WRQ transfers are saved and RRQ transfers are served from. Point it to where the file you want to transfer are.</string> + </object> + </object> + <string key="1114.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> + <object class="NSMutableDictionary" key="1115.IBAttributePlaceholdersKey"> + <string key="NS.key.0">ToolTip</string> + <object class="IBToolTipAttribute" key="NS.object.0"> + <string key="name">ToolTip</string> + <reference key="object" ref="240606174"/> + <string key="toolTip">Browse for the TFTP root directory.</string> + </object> + </object> + <string key="1115.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> + <string key="1116.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> + <string key="1117.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> + <string key="1118.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> + <object class="NSMutableDictionary" key="1119.IBAttributePlaceholdersKey"> + <string key="NS.key.0">ToolTip</string> + <object class="IBToolTipAttribute" key="NS.object.0"> + <string key="name">ToolTip</string> + <reference key="object" ref="862531403"/> + <string key="toolTip">No incoming RRQ will be served. Acess will be invariably denied.</string> + </object> + </object> + <string key="1119.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> + <object class="NSMutableDictionary" key="1120.IBAttributePlaceholdersKey"> + <string key="NS.key.0">ToolTip</string> + <object class="IBToolTipAttribute" key="NS.object.0"> + <string key="name">ToolTip</string> + <reference key="object" ref="859183946"/> + <string key="toolTip">PumpKIN will prompt the user (probably, you) whenever RRQ request comes in.</string> + </object> + </object> + <string key="1120.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> + <object class="NSMutableDictionary" key="1121.IBAttributePlaceholdersKey"> + <string key="NS.key.0">ToolTip</string> + <object class="IBToolTipAttribute" key="NS.object.0"> + <string key="name">ToolTip</string> + <reference key="object" ref="529759421"/> + <string key="toolTip">Server will automatically approve all incoming RRQ transfers (as long as they stay in TFTP root, of course).</string> + </object> + </object> + <string key="1121.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> + <string key="1122.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> + <string key="1123.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> + <object class="NSMutableDictionary" key="1124.IBAttributePlaceholdersKey"> + <string key="NS.key.0">ToolTip</string> + <object class="IBToolTipAttribute" key="NS.object.0"> + <string key="name">ToolTip</string> + <reference key="object" ref="310101904"/> + <string key="toolTip">No incoming WRQ transfer will be accepted. Acess will be invariably denied.</string> + </object> + </object> + <string key="1124.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> + <object class="NSMutableDictionary" key="1125.IBAttributePlaceholdersKey"> + <string key="NS.key.0">ToolTip</string> + <object class="IBToolTipAttribute" key="NS.object.0"> + <string key="name">ToolTip</string> + <reference key="object" ref="158682464"/> + <string key="toolTip">Incoming WRQ transfers for non-existing files are pre-approved, whereas an attempt to transfer already existing file results in prompting the user.</string> + </object> + </object> + <string key="1125.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> + <object class="NSMutableDictionary" key="1126.IBAttributePlaceholdersKey"> + <string key="NS.key.0">ToolTip</string> + <object class="IBToolTipAttribute" key="NS.object.0"> + <string key="name">ToolTip</string> + <reference key="object" ref="527645225"/> + <string key="toolTip">All incoming WRQ transfers should be accepted by the user.</string> + </object> + </object> + <string key="1126.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> + <object class="NSMutableDictionary" key="1127.IBAttributePlaceholdersKey"> + <string key="NS.key.0">ToolTip</string> + <object class="IBToolTipAttribute" key="NS.object.0"> + <string key="name">ToolTip</string> + <reference key="object" ref="708384367"/> + <string key="toolTip">All incoming WRQ transfers will be accepted. Note, that if file by the same name already exists, it will be renamed.</string> + </object> + </object> + <string key="1127.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> + <string key="1128.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> + <object class="NSMutableDictionary" key="1129.IBAttributePlaceholdersKey"> + <string key="NS.key.0">ToolTip</string> + <object class="IBToolTipAttribute" key="NS.object.0"> + <string key="name">ToolTip</string> + <reference key="object" ref="379050521"/> + <string key="toolTip">Browse for the TFTP log file.</string> + </object> + </object> + <string key="1129.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> + <object class="NSMutableDictionary" key="1130.IBAttributePlaceholdersKey"> + <string key="NS.key.0">ToolTip</string> + <object class="IBToolTipAttribute" key="NS.object.0"> + <string key="name">ToolTip</string> + <reference key="object" ref="823695658"/> + <string key="toolTip">PumpKIN can optionally log the activity shown on screen into this file.</string> + </object> + </object> + <string key="1130.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> + <string key="1131.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> + <string key="1132.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> + <string key="1161.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> + <string key="129.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> + <string key="130.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> + <string key="131.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> + <string key="134.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> + <string key="136.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> + <string key="143.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> + <string key="144.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> + <string key="145.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> + <string key="149.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> + <string key="150.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> + <string key="19.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> + <string key="195.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> + <string key="196.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> + <string key="197.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> + <string key="198.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> + <string key="199.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> + <string key="200.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> + <string key="201.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> + <string key="202.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> + <string key="203.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> + <string key="204.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> + <string key="205.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> + <string key="206.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> + <string key="207.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> + <string key="208.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> + <string key="209.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> + <string key="210.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> + <string key="211.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> + <string key="212.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> + <string key="213.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> + <string key="214.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> + <string key="215.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> + <string key="216.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> + <string key="217.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> + <string key="218.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> + <string key="219.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> + <string key="220.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> + <string key="221.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> + <string key="23.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> + <string key="236.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> + <string key="239.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> + <string key="24.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> + <string key="29.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> + <string key="295.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> + <string key="296.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> + <string key="297.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> + <string key="298.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> + <string key="346.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> + <string key="348.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> + <string key="349.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> + <string key="350.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> + <string key="351.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> + <string key="354.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> + <string key="371.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> + <string key="371.IBWindowTemplateEditedContentRect">{{380, 496}, {480, 360}}</string> + <integer value="1" key="371.NSWindowTemplate.visibleAtLaunch"/> + <string key="372.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> + <string key="420.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> + <string key="450.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> + <string key="451.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> + <string key="452.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> + <string key="453.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> + <string key="454.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> + <string key="457.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> + <string key="459.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> + <string key="460.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> + <string key="462.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> + <string key="465.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> + <string key="466.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> + <string key="485.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> + <string key="490.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> + <string key="491.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> + <string key="492.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> + <string key="494.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> + <string key="5.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> + <string key="534.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> + <string key="536.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> + <string key="537.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> + <string key="538.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> + <object class="NSMutableDictionary" key="547.IBAttributePlaceholdersKey"> + <string key="NS.key.0">ToolTip</string> + <object class="IBToolTipAttribute" key="NS.object.0"> + <string key="name">ToolTip</string> + <reference key="object" ref="356109671"/> + <string key="toolTip">Activity log.</string> + </object> + </object> + <string key="547.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> + <string key="548.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> + <string key="549.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> + <dictionary class="NSMutableDictionary" key="550.IBAttributePlaceholdersKey"/> + <string key="550.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> + <string key="550.userInterfaceItemIdentifier">logger</string> + <string key="551.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> + <string key="552.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> + <string key="553.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> + <string key="554.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> + <string key="555.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> + <string key="556.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> + <string key="557.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> + <string key="558.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> + <string key="559.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> + <string key="56.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> + <string key="566.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> + <string key="567.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> + <string key="568.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> + <string key="569.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> + <string key="57.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> + <string key="570.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> + <string key="571.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> + <string key="58.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> + <string key="81.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> + <string key="815.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> + <boolean value="NO" key="815.NSWindowTemplate.visibleAtLaunch"/> + <string key="816.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> + <string key="83.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> + <string key="915.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> + <string key="92.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> + <string key="994.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> + <string key="998.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> + <string key="999.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> + </dictionary> + <dictionary class="NSMutableDictionary" key="unlocalizedProperties"/> + <nil key="activeLocalization"/> + <dictionary class="NSMutableDictionary" key="localizations"/> + <nil key="sourceID"/> + <int key="maxID">1164</int> + </object> + <object class="IBClassDescriber" key="IBDocument.Classes"> + <array class="NSMutableArray" key="referencedPartialClassDescriptions"> + <object class="IBPartialClassDescription"> + <string key="className">IPFormatter</string> + <string key="superclassName">NSFormatter</string> + <object class="IBClassDescriptionSource" key="sourceIdentifier"> + <string key="majorKey">IBProjectSource</string> + <string key="minorKey">./Classes/IPFormatter.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">PumpKIN</string> + <string key="superclassName">NSObject</string> + <dictionary class="NSMutableDictionary" key="actions"> + <string key="abortXfer:">id</string> + <string key="getFile:">id</string> + <string key="pickLogFile:">id</string> + <string key="pickTFTPFolder:">id</string> + <string key="putFile:">id</string> + <string key="showPreferences:">id</string> + </dictionary> + <dictionary class="NSMutableDictionary" key="actionInfosByName"> + <object class="IBActionInfo" key="abortXfer:"> + <string key="name">abortXfer:</string> + <string key="candidateClassName">id</string> + </object> + <object class="IBActionInfo" key="getFile:"> + <string key="name">getFile:</string> + <string key="candidateClassName">id</string> + </object> + <object class="IBActionInfo" key="pickLogFile:"> + <string key="name">pickLogFile:</string> + <string key="candidateClassName">id</string> + </object> + <object class="IBActionInfo" key="pickTFTPFolder:"> + <string key="name">pickTFTPFolder:</string> + <string key="candidateClassName">id</string> + </object> + <object class="IBActionInfo" key="putFile:"> + <string key="name">putFile:</string> + <string key="candidateClassName">id</string> + </object> + <object class="IBActionInfo" key="showPreferences:"> + <string key="name">showPreferences:</string> + <string key="candidateClassName">id</string> + </object> + </dictionary> + <dictionary class="NSMutableDictionary" key="outlets"> + <string key="logger">NSTextView</string> + <string key="preferencesWindow">NSWindow</string> + <string key="theDefaults">NSUserDefaultsController</string> + <string key="toolbar">NSToolbar</string> + <string key="window">NSWindow</string> + <string key="xfersView">NSTableView</string> + </dictionary> + <dictionary class="NSMutableDictionary" key="toOneOutletInfosByName"> + <object class="IBToOneOutletInfo" key="logger"> + <string key="name">logger</string> + <string key="candidateClassName">NSTextView</string> + </object> + <object class="IBToOneOutletInfo" key="preferencesWindow"> + <string key="name">preferencesWindow</string> + <string key="candidateClassName">NSWindow</string> + </object> + <object class="IBToOneOutletInfo" key="theDefaults"> + <string key="name">theDefaults</string> + <string key="candidateClassName">NSUserDefaultsController</string> + </object> + <object class="IBToOneOutletInfo" key="toolbar"> + <string key="name">toolbar</string> + <string key="candidateClassName">NSToolbar</string> + </object> + <object class="IBToOneOutletInfo" key="window"> + <string key="name">window</string> + <string key="candidateClassName">NSWindow</string> + </object> + <object class="IBToOneOutletInfo" key="xfersView"> + <string key="name">xfersView</string> + <string key="candidateClassName">NSTableView</string> + </object> + </dictionary> + <object class="IBClassDescriptionSource" key="sourceIdentifier"> + <string key="majorKey">IBProjectSource</string> + <string key="minorKey">./Classes/PumpKIN.h</string> + </object> + </object> + </array> + </object> + <int key="IBDocument.localizationMode">0</int> + <string key="IBDocument.TargetRuntimeIdentifier">IBCocoaFramework</string> + <bool key="IBDocument.PluginDeclaredDependenciesTrackSystemTargetVersion">YES</bool> + <int key="IBDocument.defaultPropertyAccessControl">3</int> + <dictionary class="NSMutableDictionary" key="IBDocument.LastKnownImageSizes"> + <string key="NSMenuCheckmark">{11, 11}</string> + <string key="NSMenuMixedState">{10, 3}</string> + <string key="NSPathTemplate">{13, 10}</string> + <string key="NSSwitch">{15, 15}</string> + <string key="abort">{32, 32}</string> + <string key="get">{32, 32}</string> + <string key="put">{32, 32}</string> + </dictionary> + </data> + <classes> + <class name="IBCustomFormatter"> + <fallbacks> + <name>NSFormatter</name> + </fallbacks> + </class> + </classes> +</archive> diff --git a/pumpkin/ReceiveXFer.h b/pumpkin/ReceiveXFer.h new file mode 100644 index 0000000..f62fcdc --- a/dev/null +++ b/pumpkin/ReceiveXFer.h @@ -0,0 +1,8 @@ + +#import "XFer.h" + +@interface ReceiveXFer : XFer + +-(ReceiveXFer*)initWithPeer:(struct sockaddr_in *)sin andPacket:(TFTPPacket*)p; +-(ReceiveXFer*)initWithLocalFile:(NSString *)lf peerAddress:(const struct sockaddr_in *)pa remoteFile:(NSString *)rf xferType:(NSString *)xt blockSize:(uint16_t)bs andTimeout:(int)to; +@end diff --git a/pumpkin/ReceiveXFer.m b/pumpkin/ReceiveXFer.m new file mode 100644 index 0000000..33e9604 --- a/dev/null +++ b/pumpkin/ReceiveXFer.m @@ -0,0 +1,168 @@ +#import "ReceiveXFer.h" +#import "StringsAttached.h" +#import "ConfirmRequest.h" + +@implementation ReceiveXFer + +- (ReceiveXFer*)initWithLocalFile:(NSString *)lf peerAddress:(const struct sockaddr_in *)pa remoteFile:(NSString *)rf xferType :(NSString *)xt blockSize:(uint16_t)bs andTimeout:(int)to{ + if(!(self = [super init])) return self; + xferPrefix = @"⬇"; + retryTimeout = to; + localFile = lf; + memmove(&peer,pa,sizeof(peer)); + [[NSFileManager defaultManager] createFileAtPath:localFile contents:nil attributes:nil]; + if(!(theFile = [[NSFileHandle fileHandleForWritingAtPath:localFile] retain])) { + [pumpkin log:@"Failed to create '%@', transfer aborted.", localFile]; + return self; + } + [self createSocket]; + NSMutableDictionary *o = [NSMutableDictionary dictionaryWithCapacity:4]; + [o setValue:[NSString stringWithFormat:@"%u",bs] forKey:@"blksize"]; + [o setValue:@"" forKey:@"tsize"]; + [o setValue:[NSString stringWithFormat:@"%d",(int)retryTimeout] forKey:@"timeout"]; + state = xferStateConnecting; + [self queuePacket:[TFTPPacket packetRRQWithFile:xferFilename=rf xferType:xferType=xt andOptions:o]]; + [self appear]; + return self; +} + +- (ReceiveXFer*)initWithPeer:(struct sockaddr_in *)sin andPacket:(TFTPPacket *)p { + if(!(self = [super initWithPeer:sin andPacket:p])) return self; + xferPrefix = @"⬇"; + xferFilename=[p.rqFilename retain]; xferType=[p.rqType retain]; + [pumpkin log:@"'%@' of type '%@' is coming from %@", xferFilename, xferType, [NSString stringWithSocketAddress:&peer]]; + + [self createSocket]; + [self appear]; + + if(![self makeLocalFileName:xferFilename]) + return self; + + switch([[pumpkin.theDefaults.values valueForKey:@"wrqBehavior"] intValue]) { + case onWRQDeny: [self goOnWithVerdict:verdictDeny]; break; + case onWRQTake: [self goOnWithVerdict:verdictAllow]; break; + case onWRQPromptIfExists: + if(![[NSFileManager defaultManager] fileExistsAtPath:localFile]) { + [self goOnWithVerdict:verdictAllow]; + break; + } + case onWRQPrompt: + [ConfirmRequest confirmationWithXfer:self]; + break; + } + return self; +} +-(void)goOnWithVerdict:(int)verdict { + if(!(verdict==verdictAllow || verdict==verdictRename)) { + [self queuePacket:[TFTPPacket packetErrorWithCode:tftpErrAccessViolation andMessage:@"Access denied"]]; + return; + } + NSFileManager *fm = [NSFileManager defaultManager]; + if(verdict==verdictRename) { + int i; + for(i=1;i>0;++i) { + if(![self makeLocalFileName:[NSString stringWithFormat:@"%@ (%d)",xferFilename,i]]) + return; + if(![fm fileExistsAtPath:localFile]) break; + [localFile release],localFile=nil; + } + if(!localFile) { + [self queuePacket:[TFTPPacket packetErrorWithCode:tftpErrFileExists andMessage:@"Couldn't find a name for a file"]]; + return; + } + } + [pumpkin log:@"Receiving '%@'",localFile]; + [fm createFileAtPath:localFile contents:nil attributes:nil]; + if(!(theFile = [[NSFileHandle fileHandleForWritingAtPath:localFile] retain])) { + [self queuePacket:[TFTPPacket packetErrorWithErrno:errno andFallback:@"couldn't write to file"]]; + return; + } + xferSize=0; + NSMutableDictionary *o = [NSMutableDictionary dictionaryWithCapacity:4]; + [initialPacket.rqOptions enumerateKeysAndObjectsUsingBlock:^(NSString* k,NSString *v,BOOL *s) { + if([k isEqualToString:@"blksize"]) { + [o setValue:[NSString stringWithFormat:@"%u",blockSize=v.intValue] forKey:@"blksize"]; + }else if([k isEqualToString:@"tsize"]) { + [o setValue:[NSString stringWithFormat:@"%lld",xferSize=v.longLongValue] forKey:@"tsize"]; + }else if([k isEqualToString:@"timeout"]) { + [o setValue:[NSString stringWithFormat:@"%d",v.intValue] forKey:@"timeout"]; + retryTimeout = v.intValue; + }else + [pumpkin log:@"Unknown option '%@' with value '%@'. Ignoring.",k,v]; + }]; + if(xferSize) { + long xb = (xferSize/blockSize)+1; + if(xb>UINT16_MAX) { + [self queuePacket:[TFTPPacket packetErrorWithCode:tftpErrUndefined andMessage:[NSString stringWithFormat:@"file seems to be too big (%lld bytes) and would take %ld blocks to be transferred with the block size of %d bytes", xferSize, xb,blockSize]] ]; + return; + } + xferBlocks = xb; + } + state = xferStateXfer; + if([o count]) { + [self queuePacket:[TFTPPacket packetOACKWithOptions:o]]; + }else{ + [self queuePacket:[TFTPPacket packetACKWithBlock:acked=0]]; + } + [self updateView]; +} + +-(void)eatTFTPPacket:(TFTPPacket *)p from:(struct sockaddr_in *)sin { + if(state==xferStateConnecting) { + peer.sin_port = sin->sin_port; + [self updateView]; + }else if(![self isPeer:sin]) { + [pumpkin log:@"Packet from unexpected source (%@) received",[NSString stringWithSocketAddress:sin]]; + return; + } + switch(p.op) { + case tftpOpDATA: + { + NSData *d=p.rqData;; + @try { + if(p.block > (acked+1)) + [pumpkin log:@"While transferring %@ block %d seems to immediately follow block %d",xferFilename,p.block,acked]; + [theFile seekToFileOffset:(p.block-1)*blockSize]; + [theFile writeData:d]; + [theFile truncateFileAtOffset:(p.block-1)*blockSize+d.length]; + }@catch (NSException *e) { + [self queuePacket:[TFTPPacket packetErrorWithCode:tftpErrUndefined andMessage:e.reason]]; + break; + } + [self queuePacket:[TFTPPacket packetACKWithBlock: acked=p.block]]; + [self updateView]; + if(d.length<blockSize) + state = xferStateShutdown; + } + break; + case tftpOpOACK: + { + __block BOOL a=NO; + [p.rqOptions enumerateKeysAndObjectsUsingBlock:^(NSString *k,NSString *v,BOOL *s) { + if([k isEqualToString:@"blksize"]) + blockSize = v.intValue; + else if([k isEqualToString:@"tsize"]) + xferSize = v.longLongValue; + else if([k isEqualToString:@"timeout"]) + retryTimeout = v.intValue; + else{ + [pumpkin log:@"Totally unknown option %@ acknowledged by remote.",k]; + a=YES; + } + }]; + if(a) { + [self abort]; + break; + } + [self queuePacket:[TFTPPacket packetACKWithBlock:0]]; + state = xferStateXfer; + [self updateView]; + } + break; + default: + [pumpkin log:@"Totaly unexpected opcode %d received",p.op]; + break; + } +} + +@end diff --git a/pumpkin/SendXFer.h b/pumpkin/SendXFer.h new file mode 100644 index 0000000..787a1b9 --- a/dev/null +++ b/pumpkin/SendXFer.h @@ -0,0 +1,16 @@ +#import <Cocoa/Cocoa.h> +#import "TFTPPacket.h" +#import "PumpKIN.h" +#import "XFer.h" + +#include <netinet/in.h> + +@interface SendXFer : XFer { +} + +-(SendXFer*)initWithPeer:(struct sockaddr_in *)sin andPacket:(TFTPPacket*)p; +-(SendXFer*)initWithLocalFile:(NSString *)lf peerAddress:(const struct sockaddr_in *)pa remoteFile:(NSString *)rf xferType:(NSString *)xt blockSize:(uint16_t)bs andTimeout:(int)to; + +-(void)xfer; + +@end diff --git a/pumpkin/SendXFer.m b/pumpkin/SendXFer.m new file mode 100644 index 0000000..9a1d85b --- a/dev/null +++ b/pumpkin/SendXFer.m @@ -0,0 +1,156 @@ +#import "SendXFer.h" +#import "StringsAttached.h" +#import "ConfirmRequest.h" + +@implementation SendXFer + +-(SendXFer*)initWithLocalFile:(NSString *)lf peerAddress:(const struct sockaddr_in *)pa remoteFile:(NSString *)rf xferType:(NSString *)xt blockSize:(uint16_t)bs andTimeout:(int)to { + if(!(self = [super init])) return self; + xferPrefix = @"⬆"; + retryTimeout = to; + localFile = lf; + memmove(&peer,pa,sizeof(peer)); + if(!(theFile = [[NSFileHandle fileHandleForReadingAtPath:localFile] retain])) { + [pumpkin log:@"Failed to open '%@', transfer aborted.",localFile]; + return self; + } + + long xb = ((xferSize=[theFile seekToEndOfFile])/blockSize)+1; + if(xb > UINT16_MAX) { + [pumpkin log:@"file is too big (%lld bytes) and will take %ld blocks to be sent with block size of %d bytes",xferSize,xb,blockSize]; + return self; + } + xferBlocks = xb; + + [self createSocket]; + NSMutableDictionary *o = [NSMutableDictionary dictionaryWithCapacity:4]; + [o setValue:[NSString stringWithFormat:@"%u",bs] forKey:@"blksize"]; + [o setValue:[NSString stringWithFormat:@"%llu",xferSize] forKey:@"tsize"]; + [o setValue:[NSString stringWithFormat:@"%d",(int)retryTimeout] forKey:@"timeout"]; + state = xferStateConnecting; + [self queuePacket:[TFTPPacket packetWRQWithFile:xferFilename=rf xferType:xferType=xt andOptions:o]]; + [self appear]; + return self; +} + +-(SendXFer*)initWithPeer:(struct sockaddr_in *)sin andPacket:(TFTPPacket*)p { + if(!(self = [super initWithPeer:sin andPacket:p])) return self; + xferPrefix = @"⬆"; + xferFilename = [p.rqFilename retain]; xferType = [p.rqType retain]; + [pumpkin log:@"'%@' of type '%@' is requested from %@", + xferFilename, xferType, [NSString stringWithSocketAddress:&peer] ]; + + [self createSocket]; + [self appear]; + + if(![self makeLocalFileName:xferFilename]) + return self; + + switch([[pumpkin.theDefaults.values valueForKey:@"rrqBehavior"] intValue]) { + case onRRQDeny: [self goOnWithVerdict:verdictDeny]; break; + case onRRQGive: [self goOnWithVerdict:verdictAllow]; break; + default: + [ConfirmRequest confirmationWithXfer:self]; + break; + } + return self; +} +-(void)goOnWithVerdict:(int)verdict { + if(verdict!=verdictAllow) { + [self queuePacket:[TFTPPacket packetErrorWithCode:tftpErrAccessViolation andMessage:@"Access denied"]]; + return; + } + if(!(theFile = [[NSFileHandle fileHandleForReadingAtPath:localFile] retain])) { + [self queuePacket:[TFTPPacket packetErrorWithErrno:errno andFallback:@"couldn't open file"]]; + return; + } + xferSize = [theFile seekToEndOfFile]; + NSMutableDictionary *o = [NSMutableDictionary dictionaryWithCapacity:4]; + [[initialPacket rqOptions] enumerateKeysAndObjectsUsingBlock:^(NSString* k, NSString* v, BOOL *stop) { + if([k isEqualToString:@"blksize"]) { + [o setValue:[NSString stringWithFormat:@"%u",blockSize=v.intValue] forKey:@"blksize"]; + }else if([k isEqualToString:@"tsize"]) { + [o setValue:[NSString stringWithFormat:@"%lld",xferSize] forKey:@"tsize"]; + }else if([k isEqualToString:@"timeout"]) { + [o setValue:[NSString stringWithFormat:@"%d",v.intValue] forKey:@"timeout"]; + retryTimeout = v.intValue; + }else + [pumpkin log:@"Unknown option '%@' with value '%@'. Ignoring.",k,v]; + }]; + long xb = (xferSize/blockSize)+1; + if(xb > UINT16_MAX) { + [self queuePacket:[TFTPPacket packetErrorWithCode:tftpErrUndefined andMessage:[NSString stringWithFormat:@"file is too big (%lld bytes) and will take %ld blocks to be sent with block size of %d bytes",xferSize,xb,blockSize]]]; + return; + } + xferBlocks = xb; + state = xferStateXfer; + if(o.count) { + [self queuePacket:[TFTPPacket packetOACKWithOptions:o]]; + }else{ + [self xfer]; + } +} + +- (void) xfer { + NSAssert(theFile,@"no file!"); + [theFile seekToFileOffset:acked*blockSize]; + [self queuePacket:[TFTPPacket packetDataWithBlock:acked+1 andData:[theFile readDataOfLength:blockSize]]]; +} + +- (void) eatTFTPPacket:(TFTPPacket*)p from:(struct sockaddr_in*)sin{ + if(state==xferStateConnecting) { + peer.sin_port = sin->sin_port; + [self updateView]; + }else if(![self isPeer:sin]) { + [pumpkin log:@"Packet from unexpected source (%@) recevied",[NSString stringWithSocketAddress:sin]]; + return; + } + switch(p.op) { + case tftpOpACK: + if(state==xferStateShutdown || ( (acked=p.block)==xferBlocks && (state=xferStateShutdown) ) ) { + CFSocketEnableCallBacks(sockie, kCFSocketWriteCallBack); + return; + } + [self updateView]; + [self xfer]; + break; + case tftpOpERROR: + [pumpkin log:@"Error %u:%@",p.rqCode, p.rqMessage]; + [self updateView]; + [self disappear]; + return; + case tftpOpOACK: + if(acked) { + [pumpkin log:@"It's a bit too late to acknowledge options, ignoring OACK packet"]; + break; + } + { + __block BOOL a=NO; + [p.rqOptions enumerateKeysAndObjectsUsingBlock:^(NSString *k,NSString *v,BOOL *s) { + if([k isEqualToString:@"blksize"]) + blockSize = v.intValue; + else if([k isEqualToString:@"tsize"]) { + }else if([k isEqualToString:@"timeout"]) + retryTimeout = v.intValue; + else{ + [pumpkin log:@"Totally unknown option '%@' with value '%@' acknowledged by peer",k,v]; + a=YES; + } + }]; + if(a) { + [self abort]; + break; + } + state = xferStateXfer; + [self updateView]; + [self xfer]; + } + break; + default: + [pumpkin log:@"Totaly unexpected opcode %d received",p.op]; + break; + } +} + + +@end diff --git a/pumpkin/StringsAttached.h b/pumpkin/StringsAttached.h new file mode 100644 index 0000000..fa73ae0 --- a/dev/null +++ b/pumpkin/StringsAttached.h @@ -0,0 +1,11 @@ + +#import <Foundation/Foundation.h> +#include <netinet/in.h> + +@interface NSString (StringsAttached) + ++ stringWithSocketAddress:(const struct sockaddr_in*)sin; ++ stringWithHostAddress:(const struct sockaddr_in*)sin; ++ stringWithPortNumber:(const struct sockaddr_in*)sin; + +@end diff --git a/pumpkin/StringsAttached.m b/pumpkin/StringsAttached.m new file mode 100644 index 0000000..8ad5868 --- a/dev/null +++ b/pumpkin/StringsAttached.m @@ -0,0 +1,19 @@ + +#import "StringsAttached.h" +#include <arpa/inet.h> + +@implementation NSString (StringsAttached) + ++ stringWithSocketAddress:(const struct sockaddr_in*)sin { + return [NSString stringWithFormat:@"%@:%u",[NSString stringWithHostAddress:sin],ntohs(sin->sin_port)]; +} ++ stringWithHostAddress:(const struct sockaddr_in*)sin { + char tmp[32]; + addr2ascii(sin->sin_family,&sin->sin_addr,sizeof(sin->sin_addr),tmp); + return @(tmp); +} ++ (id)stringWithPortNumber:(const struct sockaddr_in *)sin { + return [NSString stringWithFormat:@"%u",ntohs(sin->sin_port)]; +} + +@end diff --git a/pumpkin/TFTPPacket.h b/pumpkin/TFTPPacket.h new file mode 100644 index 0000000..a46d5bc --- a/dev/null +++ b/pumpkin/TFTPPacket.h @@ -0,0 +1,87 @@ + +#import <Cocoa/Cocoa.h> +#include <stdint.h> + +enum TFTPOp { + tftpOpRRQ=1, tftpOpWRQ=2, + tftpOpDATA=3, + tftpOpACK=4, + tftpOpERROR=5, + tftpOpOACK=6 +}; + +enum TFTPError { + tftpErrUndefined=0, + tftpErrNotFound=1, + tftpErrAccessViolation=2, + tftpErrDiskFull=3, + tftpErrIllegalOp=4, + tftpErrUnknownTID=5, + tftpErrFileExists=6, + tftpErrNoUser=7, + tftpErrOption=8 +}; + +#pragma pack(push,1) +struct AnyTFTPPacket { + uint16_t op; + union { + struct { + char data[1]; + } any; + struct { + char data[1]; + } rq; + struct { + char data[1]; + } rrq; + struct { + char data[1]; + } wrq; + struct { + uint16_t block; + char data[1]; + } data; + struct { + uint16_t block; + } ack; + struct { + uint16_t code; + char data[1]; + } err; + struct { + char data[1]; + } oack; + }; +}; +#pragma pack(pop) + +@interface TFTPPacket : NSObject { + NSData *data; + struct AnyTFTPPacket *packet; +} + +@property (readonly) enum TFTPOp op; +@property (readonly) NSString* rqFilename; +@property (readonly) NSString* rqType; +@property (readonly) NSDictionary* rqOptions; +@property (readonly) NSData *data; +@property (readonly) uint16_t block; +@property (readonly) NSData *rqData; +@property (readonly) uint16_t rqCode; +@property (readonly) NSString* rqMessage; + +-(TFTPPacket*)initWithData:(NSData*)d; + ++(TFTPPacket*)packetWithData:(NSData*)d; ++(TFTPPacket*)packetWithBytesNoCopy:(void*)b andLength:(size_t)l; + ++(TFTPPacket*)packetErrorWithCode:(enum TFTPError)c andMessage:(NSString*)m; ++(TFTPPacket*)packetErrorWithErrno:(int)en andFallback:(NSString*)fb; ++(TFTPPacket*)packetOACKWithOptions:(NSDictionary*)o; ++(TFTPPacket*)packetDataWithBlock:(uint16_t)b andData:(NSData*)d; ++(TFTPPacket*)packetACKWithBlock:(uint16_t)b; ++(TFTPPacket*)packetRRQWithFile:(NSString*)f xferType:(NSString*)t andOptions:(NSDictionary*)o; ++(TFTPPacket*)packetWRQWithFile:(NSString*)f xferType:(NSString*)t andOptions:(NSDictionary*)o; + +@end diff --git a/pumpkin/TFTPPacket.m b/pumpkin/TFTPPacket.m new file mode 100644 index 0000000..73f5995 --- a/dev/null +++ b/pumpkin/TFTPPacket.m @@ -0,0 +1,203 @@ + +#import "TFTPPacket.h" + +@interface NSDictionary (TFTPOptions) + +- (size_t)tftpBytesLength; +- (size_t)tftpGetBytes:(char*)p maxLength:(size_t)ml; + +@end +@implementation NSDictionary (TFTPOptions) + +- (size_t)tftpBytesLength { + __block size_t rv = 0; + [self enumerateKeysAndObjectsUsingBlock:^(id k,id v,BOOL *s) { + rv += [k lengthOfBytesUsingEncoding:NSUTF8StringEncoding]+[v lengthOfBytesUsingEncoding:NSUTF8StringEncoding]+2; + }]; + return rv; +} + +- (size_t)tftpGetBytes:(char*)p maxLength:(size_t)ml { + __block char *_p = p; + __block size_t rl = ml; + __block size_t rv = 0; + [self enumerateKeysAndObjectsUsingBlock:^(NSString *k,NSString *v,BOOL *s) { + NSUInteger l; + [k getBytes:_p maxLength:rl usedLength:&l encoding:NSUTF8StringEncoding options:0 range:NSMakeRange(0,k.length) remainingRange:NULL]; + _p+=l; *_p++=0; rl-=l+1; rv+=l+1; + [v getBytes:_p maxLength:rl usedLength:&l encoding:NSUTF8StringEncoding options:0 range:NSMakeRange(0,v.length) remainingRange:NULL]; + _p+=l; *_p++=0; rl-=l+1; rv+=l+1; + }]; + return rv; +} + +@end + +@implementation TFTPPacket +@synthesize data; + +-(BOOL) isRQOp { + return self.op==tftpOpRRQ || self.op==tftpOpWRQ; +} +-(BOOL) isOptionsOp { + return self.isRQOp || self.op==tftpOpOACK; +} +-(BOOL) isBlockOp { + return self.op==tftpOpDATA || self.op==tftpOpACK; +} + +-(enum TFTPOp)op { + NSAssert(data.length,@"no data"); + return (enum TFTPOp)ntohs(packet->op); +} +-(NSString*)rqFilename { + NSAssert( self.isRQOp, @"Wrong TFTP opcode for rq filename retrieval"); + if(!memchr(packet->rq.data, 0, [data length]-sizeof(packet->op))) return nil; + return @(packet->rq.data); +} +-(NSString*)rqType { + NSAssert( self.isRQOp, @"Wrong TFTP opcode for rq type retrieval"); + const char *z = (const char*)memchr(packet->rq.data,0, data.length-sizeof(packet->op)); + if(!z) return nil; + if(!memchr(z+1,0,data.length-sizeof(packet->op)-(z-packet->rq.data))) return nil; + return @(z+1); +} +-(NSDictionary*)rqOptions { + enum TFTPOp op = self.op; + NSAssert( self.isOptionsOp, @"Wrong TFTP opcode for options retrieval"); + const char *p = packet->any.data, *p1 = (const char*)packet + data.length; + if(op==tftpOpRRQ || op==tftpOpWRQ) { + p = (const char *)memchr(p,0,p1-p); + if(!p) return nil; + p = (const char *)memchr(p+1,0,p1-p); + if(!p) return nil; + ++p; + } + NSMutableDictionary *rv = [NSMutableDictionary dictionaryWithCapacity:8]; + while(p<p1) { + const char *on = p; + p = (const char *)memchr(p,0,p1-p); + if(!p) break; + const char *ov = ++p; + p = (const char *)memchr(p,0,p1-p); + if(!p) break; + ++p; + rv[[@(on) lowercaseString]] = @(ov); + } + return rv; +} +-(uint16_t)block { + NSAssert( self.isBlockOp, @"Wrong TFTP opcode for block number retrieval"); + return ntohs(*(uint16_t*)&packet->data); +} +-(NSData*)rqData { + NSAssert( self.op==tftpOpDATA, @"Can't get data from the request that doesn't have it"); + return [NSData dataWithBytes:packet->data.data length:data.length-sizeof(packet->op)-sizeof(packet->data.block)]; +} +-(uint16_t)rqCode { + NSAssert(self.op==tftpOpERROR,@"Wrong TFTP opcode for error code retrieval"); + return ntohs(packet->err.code); +} +-(NSString*)rqMessage { + NSAssert(self.op==tftpOpERROR,@"Wrong TFTP opcode for error message retrieval"); + return @(packet->err.data); +} + +-(TFTPPacket*)initWithData:(NSData *)d { + if(!(self = [super init])) return self; + packet = (struct AnyTFTPPacket*)(data = [d retain]).bytes; + return self; +} + + ++(TFTPPacket*)packetWithData:(NSData*)d { + return [[[self alloc] initWithData:d] autorelease]; +} ++(TFTPPacket*)packetWithBytesNoCopy:(void*)b andLength:(size_t)l { + return [[[self alloc] initWithData:[NSData dataWithBytesNoCopy:b length:l]] autorelease]; +} + ++(TFTPPacket*)packetErrorWithCode:(enum TFTPError)c andMessage:(NSString*)m { + NSUInteger ml = [m lengthOfBytesUsingEncoding:NSUTF8StringEncoding], bb; + struct AnyTFTPPacket *b = (struct AnyTFTPPacket*)malloc(bb = sizeof(b->op)+sizeof(b->err.code)+ml+1); + if(!b) return nil; + b->op = htons(tftpOpERROR); + b->err.code = ntohs(c); + [m getBytes:b->err.data maxLength:ml usedLength:NULL encoding:NSUTF8StringEncoding options:0 range:NSMakeRange(0,m.length) remainingRange:NULL]; + b->err.data[ml]=0; + return [self packetWithBytesNoCopy:b andLength:bb]; +} ++(TFTPPacket*)packetErrorWithErrno:(int)en andFallback:(NSString *)fb{ + switch(en) { + case EACCES: + return [self packetErrorWithCode:tftpErrAccessViolation andMessage:@"acess violation"]; + case ENOENT: + return [self packetErrorWithCode:tftpErrNotFound andMessage:@"not found"]; + } + return [self packetErrorWithCode:tftpErrUndefined andMessage:fb]; +} + ++(TFTPPacket*)packetXRQWithOp:(enum TFTPOp)op file:(NSString*)f xferType:(NSString*)t andOptions:(NSDictionary*)o { + NSAssert(f && t && o,@"Something is amiss in packetXRQWithOp"); + __block size_t dl = o.tftpBytesLength + +[f lengthOfBytesUsingEncoding:NSUTF8StringEncoding] + +[t lengthOfBytesUsingEncoding:NSUTF8StringEncoding] + +2; + size_t pl = dl; + struct AnyTFTPPacket *b = (struct AnyTFTPPacket*)malloc(pl+=sizeof(b->op)); + if(!b) return nil; + b->op = htons(op); + __block char *p = b->rrq.data; + NSUInteger l; + [f getBytes:p maxLength:dl usedLength:&l encoding:NSUTF8StringEncoding options:0 range:NSMakeRange(0,f.length) remainingRange:NULL]; + p+=l; *p++=0; dl-=l+1; + [t getBytes:p maxLength:dl usedLength:&l encoding:NSUTF8StringEncoding options:0 range:NSMakeRange(0,t.length) remainingRange:NULL]; + p+=l; *p++=0; dl-=l+1; + l = [o tftpGetBytes:p maxLength:dl]; + p+=l; dl-=l; + NSAssert1(dl==0,@"packet of the wrong size, remaining count: %lu",dl); + return [self packetWithBytesNoCopy:b andLength:pl]; +} + ++(TFTPPacket*)packetRRQWithFile:(NSString *)f xferType:(NSString *)t andOptions:(NSDictionary *)o { + return [self packetXRQWithOp:tftpOpRRQ file:f xferType:t andOptions:o]; +} ++(TFTPPacket*)packetWRQWithFile:(NSString *)f xferType:(NSString *)t andOptions:(NSDictionary *)o { + return [self packetXRQWithOp:tftpOpWRQ file:f xferType:t andOptions:o]; +} + ++(TFTPPacket*)packetOACKWithOptions:(NSDictionary*)o { + __block NSUInteger pl = [o tftpBytesLength]; + __block NSUInteger rc = pl; + __block struct AnyTFTPPacket *b = (struct AnyTFTPPacket*)malloc(pl+=sizeof(b->op)); + if(!b) return nil; + b->op = htons(tftpOpOACK); + __block char *p = b->oack.data; + rc -= [o tftpGetBytes:p maxLength:pl]; + NSAssert1(rc==0,@"packet of the wrong size, remaining count: %lu",rc); + return [self packetWithBytesNoCopy:b andLength:pl]; +} ++(TFTPPacket*)packetDataWithBlock:(uint16_t)b andData:(NSData*)d { + NSUInteger pl; + struct AnyTFTPPacket *p = (struct AnyTFTPPacket*)malloc(pl=sizeof(p->op)+sizeof(p->data.block)+d.length); + if(!p) return nil; + p->op = htons(tftpOpDATA); + p->data.block = htons(b); + [d getBytes:p->data.data length:d.length]; + return [self packetWithBytesNoCopy:p andLength:pl]; +} ++(TFTPPacket*)packetACKWithBlock:(uint16_t)b { + NSUInteger pl; + struct AnyTFTPPacket *p = (struct AnyTFTPPacket*)malloc(pl=sizeof(p->op)+sizeof(p->ack.block)); + if(!p) return nil; + p->op = htons(tftpOpACK); + p->ack.block = htons(b); + return [self packetWithBytesNoCopy:p andLength:pl]; +} + +-(void)dealloc { + [data release]; + [super dealloc]; +} + +@end diff --git a/pumpkin/XFer.h b/pumpkin/XFer.h new file mode 100644 index 0000000..ffe7fc1 --- a/dev/null +++ b/pumpkin/XFer.h @@ -0,0 +1,68 @@ + +#import <Foundation/Foundation.h> +#import "PumpKIN.h" +#include <netinet/in.h> +#import "TFTPPacket.h" + +enum XFerState { + xferStateNone = 0, + xferStateConnecting, + xferStateXfer, + xferStateShutdown +}; + +@interface XFer : NSObject { + struct sockaddr_in peer; + PumpKIN *pumpkin; + CFSocketRef sockie; + CFRunLoopSourceRef runloopSource; + NSFileHandle *theFile; + uint16_t blockSize; + uint16_t acked; + unsigned long long xferSize; + uint16_t xferBlocks; + enum XFerState state; + NSString *xferType; + NSString *xferFilename; + NSTimeInterval retryTimeout; + NSTimeInterval giveupTimeout; + TFTPPacket *lastPacket; + NSTimer *retryTimer; + NSTimer *giveupTimer; + TFTPPacket *initialPacket; + NSString *xferPrefix; + + NSString *localFile; + + NSMutableArray *queue; +} +@property (readonly) struct sockaddr_in *peer; +@property (readonly) TFTPPacket *initialPacket; +@property (readonly) NSString *xferFilename; +@property (readonly) NSString *localFile; +@property (readonly) NSString *xferPrefix; + +- (id) init; +- (id) initWithPeer:(struct sockaddr_in *)sin andPacket:(TFTPPacket*)p; + +- (BOOL) createSocket; +- (void) callbackWithType:(CFSocketCallBackType)t addr:(CFDataRef)a data:(const void *)d; +- (void) queuePacket:(TFTPPacket*)p; + +- (void) eatTFTPPacket:(TFTPPacket*)p from:(struct sockaddr_in*)sin; + +- (id) cellValueForColumn:(NSString*)ci; + +- (void) updateView; +- (void) appear; +- (void) disappear; + +- (BOOL) isPeer:(struct sockaddr_in*)sin; + +- (void) abort; + +- (void) goOnWithVerdict:(int)verdict; + +- (BOOL) makeLocalFileName:(NSString*)xf; + +@end diff --git a/pumpkin/XFer.m b/pumpkin/XFer.m new file mode 100644 index 0000000..6803ade --- a/dev/null +++ b/pumpkin/XFer.m @@ -0,0 +1,205 @@ + +#import "XFer.h" +#import "TFTPPacket.h" +#import "StringsAttached.h" + +static void cbXfer(CFSocketRef sockie,CFSocketCallBackType cbt,CFDataRef cba, + const void *cbd,void *i) { + [(XFer*)i callbackWithType:cbt addr:cba data:cbd]; +} + +@implementation XFer +@synthesize initialPacket; +@synthesize xferFilename; +@synthesize localFile; +@synthesize xferPrefix; + +- (id) init { + if(!(self = [super init])) return self; + blockSize = 512; + sockie = NULL; + theFile = nil; + acked = 0; + xferSize = 0; xferBlocks = 0; + xferType = nil; xferFilename = nil; + state = xferStateNone; + pumpkin = NSApplication.sharedApplication.delegate; + queue = [[NSMutableArray alloc]initWithCapacity:4]; + localFile = nil; + retryTimeout = 3; + giveupTimeout = [[[[NSUserDefaultsController sharedUserDefaultsController] values] valueForKey:@"giveUpTimeout"] intValue]; + lastPacket = nil; retryTimer = nil; + giveupTimer = nil; + initialPacket = nil; + return self; + +} + +- (id) initWithPeer:(struct sockaddr_in *)sin andPacket:(TFTPPacket*)p { + if(!(self=[self init])) return self; + memmove(&peer,sin,sizeof(peer)); + initialPacket = [p retain]; + return self; +} + +- (struct sockaddr_in*)peer { return &peer; } + +- (BOOL) makeLocalFileName:(NSString *)xf { + NSString *fn = [xf stringByReplacingOccurrencesOfString:@"\\" withString:@"/"]; + if([fn hasPrefix:@"../"] || [fn hasSuffix:@"/.."] || [fn rangeOfString:@"/../"].location!=NSNotFound) { + [self queuePacket:[TFTPPacket packetErrorWithCode:tftpErrAccessViolation andMessage:@"bad path"]]; + return NO; + } + localFile = [[[pumpkin.theDefaults.values valueForKey:@"tftpRoot"] stringByAppendingPathComponent:fn] retain]; + return YES; +} + +- (void) retryTimeout { + [self queuePacket:lastPacket]; [lastPacket release]; lastPacket = nil; +} +- (void) giveUp { + [pumpkin log:@"Connection timeout for '%@'",xferFilename]; + [self abort]; +} +- (void) renewHope { + if(giveupTimer) { + [giveupTimer invalidate]; [giveupTimer release]; + } + giveupTimer = [[NSTimer scheduledTimerWithTimeInterval:giveupTimeout target:self selector:@selector(giveUp) userInfo:nil repeats:NO] retain]; +} + +- (void) callbackWithType:(CFSocketCallBackType)t addr:(CFDataRef)a data:(const void *)d { + if(!giveupTimer) [self renewHope]; + if(retryTimer) { + [retryTimer release]; [retryTimer invalidate]; retryTimer = nil; + } + switch (t) { + case kCFSocketWriteCallBack: + if(queue.count) { + TFTPPacket *p = queue[0]; + CFSocketError r = CFSocketSendData(sockie, (CFDataRef)[NSData dataWithBytesNoCopy:&peer length:sizeof(peer) freeWhenDone:NO], (CFDataRef)[NSData dataWithData:p.data], 0); + if(r!=kCFSocketSuccess) + [pumpkin log:@"Failed to send data, error %d",errno]; + if(!(p.op==tftpOpDATA || p.op==tftpOpERROR)) { + if(lastPacket) [lastPacket release]; + lastPacket = [p retain]; + if(retryTimer) { + [retryTimer invalidate]; [retryTimer release]; + } + retryTimer = [[NSTimer scheduledTimerWithTimeInterval:retryTimeout target:self selector:@selector(retryTimeout) userInfo:nil repeats:NO] retain]; + }else{ + [lastPacket release]; lastPacket = nil; + } + [queue removeObjectAtIndex:0]; + if([queue count] || state==xferStateShutdown) + CFSocketEnableCallBacks(sockie, kCFSocketWriteCallBack); + }else if(state==xferStateShutdown) { + [pumpkin log:@"%@ Transfer of '%@' finished.",xferPrefix,xferFilename]; + [self disappear]; + } + break; + case kCFSocketDataCallBack: + [self renewHope]; + [self eatTFTPPacket:[TFTPPacket packetWithData:(NSData*)d] from:(struct sockaddr_in*)CFDataGetBytePtr(a)]; + break; + default: + NSLog(@"unhandled %lu callback",t); + break; + } +} + +- (BOOL) createSocket { + CFSocketContext ctx; + ctx.version=0; ctx.info=self; ctx.retain=0; ctx.release=0; ctx.copyDescription=0; + sockie = CFSocketCreate(kCFAllocatorDefault, PF_INET, SOCK_DGRAM, IPPROTO_UDP, + kCFSocketReadCallBack|kCFSocketWriteCallBack|kCFSocketDataCallBack, + cbXfer, &ctx); + if(!sockie) return NO; + struct sockaddr_in a; memset(&a, 0, sizeof(a)); + a.sin_family = AF_INET; + if(CFSocketSetAddress(sockie, (CFDataRef)[NSData dataWithBytesNoCopy:&a length:sizeof(a) freeWhenDone:NO]) + !=kCFSocketSuccess) { + [pumpkin log:@"failed to set socket address"]; + return NO; + } + runloopSource = CFSocketCreateRunLoopSource(kCFAllocatorDefault, sockie, 0); + CFRunLoopAddSource(CFRunLoopGetCurrent(), runloopSource, kCFRunLoopDefaultMode); + return YES; +} + +- (void) queuePacket:(TFTPPacket*)p { + [queue addObject:p]; + CFSocketEnableCallBacks(sockie, kCFSocketWriteCallBack|kCFSocketReadCallBack); + if(p.op==tftpOpERROR) state = xferStateShutdown; +} + +- (void) goOnWithVerdict:(int)verdict { + NSAssert(false,@"unimplemented goOnWithVerdict"); +} + +- (void) eatTFTPPacket:(TFTPPacket*)p from:(struct sockaddr_in*)sin { + NSAssert(false,@"unimplemented eatTFTPPacket"); +} +-(void) abort { + [self queuePacket:[TFTPPacket packetErrorWithCode:tftpErrUndefined andMessage:@"transfer cancelled"]]; +} + +- (id) cellValueForColumn:(NSString*)ci { + if([ci isEqualToString:@"fileName"]) { + return [NSString stringWithFormat:@"%@ %@",xferPrefix,xferFilename]; + }else if([ci isEqualToString:@"xferType"]) { + return xferType; + }else if([ci isEqualToString:@"peerAddress"]) { + switch (state) { + case xferStateConnecting: return [NSString stringWithHostAddress:&peer]; + default: return [NSString stringWithSocketAddress:&peer]; + } + }else if([ci isEqualToString:@"ackBytes"]) { + return [NSString stringWithFormat:@"%u",acked*blockSize]; + }else if([ci isEqualToString:@"xferSize"]) { + return xferSize?[NSString stringWithFormat:@"%llu",xferSize]:nil; + } + return nil; +} + +- (void) updateView { + [pumpkin updateXfers]; +} +- (void) appear { + [pumpkin registerXfer:self]; +} +- (void) disappear { + if(retryTimer) { + [retryTimer invalidate]; [retryTimer release]; retryTimer = nil; + } + if(giveupTimer) { + [giveupTimer invalidate]; [giveupTimer release]; retryTimer = nil; + } + [pumpkin unregisterXfer:self]; +} + +- (BOOL) isPeer:(struct sockaddr_in*)sin { + return sin->sin_len==peer.sin_len && !memcmp(sin,&peer,sin->sin_len); +} + +-(void)dealloc { + if(runloopSource) { + CFRunLoopSourceInvalidate(runloopSource); + CFRelease(runloopSource); + } + if(sockie) { + CFSocketInvalidate(sockie); + CFRelease(sockie); + } + [queue release]; + if(theFile) [theFile release]; + if(xferFilename) [xferFilename release]; + if(xferType) [xferType release]; + if(lastPacket) [lastPacket release]; + if(initialPacket) [initialPacket release]; + if(localFile) [localFile release]; + [super dealloc]; +} + + +@end diff --git a/pumpkin/XFersViewDatasource.h b/pumpkin/XFersViewDatasource.h new file mode 100644 index 0000000..3225e1b --- a/dev/null +++ b/pumpkin/XFersViewDatasource.h @@ -0,0 +1,11 @@ + +@interface XFersViewDatasource : NSObject <NSTableViewDataSource> { + NSMutableArray *xfers; +} + +- (id)initWithXfers:(NSMutableArray*)x; + +- (id)tableView:(NSTableView *)aTableView objectValueForTableColumn:(NSTableColumn *)aTableColumn row:(NSInteger)rowIndex; +- (NSInteger)numberOfRowsInTableView:(NSTableView *)aTableView; + +@end diff --git a/pumpkin/XFersViewDatasource.m b/pumpkin/XFersViewDatasource.m new file mode 100644 index 0000000..1f7c689 --- a/dev/null +++ b/pumpkin/XFersViewDatasource.m @@ -0,0 +1,24 @@ + +#import "XFersViewDatasource.h" +#import "XFer.h" + +@implementation XFersViewDatasource + +- (id)initWithXfers:(NSMutableArray*)x { + if(!(self = [super init])) return self; + xfers = [x retain]; + return self; +} +- (id)tableView:(NSTableView *)aTableView objectValueForTableColumn:(NSTableColumn *)aTableColumn row:(NSInteger)rowIndex { + return [xfers[rowIndex] cellValueForColumn:aTableColumn.identifier]; +} +- (NSInteger)numberOfRowsInTableView:(NSTableView *)aTableView { + return xfers.count; +} + +- (void) dealloc { + [xfers release]; + [super dealloc]; +} + +@end diff --git a/pumpkin/abort.icns b/pumpkin/abort.icns Binary files differnew file mode 100644 index 0000000..cd688ca --- a/dev/null +++ b/pumpkin/abort.icns diff --git a/pumpkin/en.lproj/InfoPlist.strings b/pumpkin/en.lproj/InfoPlist.strings new file mode 100644 index 0000000..5495781 --- a/dev/null +++ b/pumpkin/en.lproj/InfoPlist.strings @@ -0,0 +1,2 @@ +/* Localized versions of Info.plist keys */ +CFBundleDisplayName = "PumpKIN";
\ No newline at end of file diff --git a/pumpkin/get.icns b/pumpkin/get.icns Binary files differnew file mode 100644 index 0000000..c0120da --- a/dev/null +++ b/pumpkin/get.icns diff --git a/pumpkin/klever-background.png b/pumpkin/klever-background.png Binary files differnew file mode 100644 index 0000000..42bb1e5 --- a/dev/null +++ b/pumpkin/klever-background.png diff --git a/pumpkin/main.m b/pumpkin/main.m new file mode 100644 index 0000000..27f298f --- a/dev/null +++ b/pumpkin/main.m @@ -0,0 +1,6 @@ +#import <Cocoa/Cocoa.h> + +int main(int argc, char *argv[]) +{ + return NSApplicationMain(argc, (const char **)argv); +} diff --git a/pumpkin/pumpkin-Info.plist b/pumpkin/pumpkin-Info.plist new file mode 100644 index 0000000..a921bb4 --- a/dev/null +++ b/pumpkin/pumpkin-Info.plist @@ -0,0 +1,38 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> +<plist version="1.0"> +<dict> + <key>CFBundleDevelopmentRegion</key> + <string>en</string> + <key>CFBundleDisplayName</key> + <string>pumpkin</string> + <key>CFBundleExecutable</key> + <string>${EXECUTABLE_NAME}</string> + <key>CFBundleIconFile</key> + <string>pumpkin</string> + <key>CFBundleIdentifier</key> + <string>net.klever.kin.${PRODUCT_NAME:rfc1034identifier}</string> + <key>CFBundleInfoDictionaryVersion</key> + <string>6.0</string> + <key>CFBundleName</key> + <string>${PRODUCT_NAME}</string> + <key>CFBundlePackageType</key> + <string>APPL</string> + <key>CFBundleShortVersionString</key> + <string>0.0</string> + <key>CFBundleSignature</key> + <string>????</string> + <key>CFBundleVersion</key> + <string>1</string> + <key>LSApplicationCategoryType</key> + <string>public.app-category.utilities</string> + <key>LSMinimumSystemVersion</key> + <string>${MACOSX_DEPLOYMENT_TARGET}</string> + <key>NSHumanReadableCopyright</key> + <string>Copyright © 2012 Klever Group. All rights reserved.</string> + <key>NSMainNibFile</key> + <string>PumpKIN</string> + <key>NSPrincipalClass</key> + <string>NSApplication</string> +</dict> +</plist> diff --git a/pumpkin/pumpkin-Prefix.pch b/pumpkin/pumpkin-Prefix.pch new file mode 100644 index 0000000..8976de1 --- a/dev/null +++ b/pumpkin/pumpkin-Prefix.pch @@ -0,0 +1,7 @@ +// +// Prefix header for all source files of the 'PumpKIN' target in the 'PumpKIN' project +// + +#ifdef __OBJC__ + #import <Cocoa/Cocoa.h> +#endif diff --git a/pumpkin/pumpkin-defaults.plist b/pumpkin/pumpkin-defaults.plist new file mode 100644 index 0000000..511140f --- a/dev/null +++ b/pumpkin/pumpkin-defaults.plist @@ -0,0 +1,28 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> +<plist version="1.0"> +<dict> + <key>bindPort</key> + <integer>69</integer> + <key>bindAddress</key> + <string>0.0.0.0</string> + <key>remotePort</key> + <integer>69</integer> + <key>blockSize</key> + <integer>512</integer> + <key>xferType</key> + <string>octet</string> + <key>timeout</key> + <integer>10</integer> + <key>rrqBehavior</key> + <integer>1</integer> + <key>wrqBehavior</key> + <integer>2</integer> + <key>confirmationTimeout</key> + <string>30</string> + <key>giveUpTimeout</key> + <integer>120</integer> + <key>listen</key> + <true/> +</dict> +</plist> diff --git a/pumpkin/put.icns b/pumpkin/put.icns Binary files differnew file mode 100644 index 0000000..5d62867 --- a/dev/null +++ b/pumpkin/put.icns |