FTP-0.6/0000775000175000017500000000000013151737063011446 5ustar multixmultixFTP-0.6/fileElement.m0000664000175000017500000004430713062270301014051 0ustar multixmultix/* Project: FTP Copyright (C) 2005-2017 Riccardo Mottola Author: Riccardo Mottola Created: 2005-04-18 Single element of a file listing This application is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This application is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License for more details. You should have received a copy of the GNU General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #import "fileElement.h" @implementation FileElement - (void)dealloc { [fileName release]; [filePath release]; [linkTargetName release]; [modifDate release]; [super dealloc]; } /* -- coder methods for copying -- */ - (Class) classForCoder { return [FileElement class]; } - (id) replacementObjectForPortCoder: (NSPortCoder*)aCoder { return self; } - (void) encodeWithCoder: (NSCoder*)aCoder { [aCoder encodeObject: fileName]; [aCoder encodeObject: filePath]; [aCoder encodeObject: linkTargetName]; [aCoder encodeValueOfObjCType: @encode(BOOL) at: &isDir]; [aCoder encodeValueOfObjCType: @encode(BOOL) at: &isLink]; [aCoder encodeValueOfObjCType: @encode(unsigned long long) at: &size]; [aCoder encodeObject: modifDate]; } - (id) initWithCoder: (NSCoder*)aCoder { self = [super init]; fileName = [[aCoder decodeObject] retain]; filePath = [[aCoder decodeObject] retain]; linkTargetName = [[aCoder decodeObject] retain]; [aCoder decodeValueOfObjCType: @encode(BOOL) at: &isDir]; [aCoder decodeValueOfObjCType: @encode(BOOL) at: &isLink]; [aCoder decodeValueOfObjCType: @encode(unsigned long long) at: &size]; modifDate = [[aCoder decodeObject] retain]; return self; } /* initialize a file element using attrbutes of NSFileManager */ - (id)initWithPath:(NSString *)path andAttributes:(NSDictionary *)attribs { self = [super init]; if (self) { size = [attribs fileSize]; modifDate = [[attribs objectForKey:NSFileModificationDate] retain]; if ([attribs fileType] == NSFileTypeDirectory) isDir = YES; else isDir = NO; isLink = NO; filePath = [path retain]; fileName = [[filePath lastPathComponent] retain]; } return self; } - (NSDictionary *)attributes { NSMutableDictionary *attr; attr = [[NSMutableDictionary alloc] init]; [attr setObject:[NSNumber numberWithLongLong:size] forKey:NSFileSize]; if (modifDate) [attr setObject:modifDate forKey:NSFileModificationDate]; if (isDir) [attr setObject:NSFileTypeDirectory forKey:NSFileType]; else [attr setObject:NSFileTypeRegular forKey:NSFileType]; [attr autorelease]; return [NSDictionary dictionaryWithDictionary:attr]; } /* as a parser aid, check if a string is a month */ - (int)checkMonth: (NSString *)token { if ([token compare:@"Jan" options:NSCaseInsensitiveSearch ] == NSOrderedSame) return 1; if ([token compare:@"Feb" options:NSCaseInsensitiveSearch ] == NSOrderedSame) return 2; if ([token compare:@"Mar" options:NSCaseInsensitiveSearch ] == NSOrderedSame) return 3; if ([token compare:@"Apr" options:NSCaseInsensitiveSearch ] == NSOrderedSame) return 4; if ([token compare:@"May" options:NSCaseInsensitiveSearch ] == NSOrderedSame) return 5; if ([token compare:@"Jun" options:NSCaseInsensitiveSearch ] == NSOrderedSame) return 6; if ([token compare:@"Jul" options:NSCaseInsensitiveSearch ] == NSOrderedSame) return 7; if ([token compare:@"Aug" options:NSCaseInsensitiveSearch ] == NSOrderedSame) return 8; if ([token compare:@"Sep" options:NSCaseInsensitiveSearch ] == NSOrderedSame) return 9; if ([token compare:@"Oct" options:NSCaseInsensitiveSearch ] == NSOrderedSame) return 10; if ([token compare:@"Nov" options:NSCaseInsensitiveSearch ] == NSOrderedSame) return 11; if ([token compare:@"Dec" options:NSCaseInsensitiveSearch ] == NSOrderedSame) return 12; return 0; } /* tries to parse a single line of LIST currently unix-style results will work, like drwx------ 22 multix staff 704 Apr 2 14:46 Documents or these where one of user/group are omitted drwxr-xr-x 8 users 4096 Apr 15 19:58 Documents inital blocks can be omitted, like: drwx------ multix staff 704 Apr 2 14:46 Documents user/group could be numerical drwx------ 22 4567 120 704 Apr 2 14:46 Documents the hour time could be the year drwx------ 22 multix staff 704 Apr 2 2005 Documents the filename could contain one or more spaces -rw-r--r-- 1 multix staff 0 May 25 10:08 test file the filesize can be zero.. it will skip a line that is not considered meaningful, like: total 74184 (typical from Unix ls -l) and return nil. some attempt at scanning OS400 / i5 ftp listings is attempted too, those are in the style of: SVIFELMA 32768 02/05/07 15:32:42 *FILE INSOLUTO SVIFELMA *MEM INSOLUTO.INSOLUTO the feof line is ignored */ - (id)initWithLsLine :(char *)line { NSString *fullLine; NSMutableArray *splitLine; unichar ch; unsigned elementsFound; NSCharacterSet *whiteSet; unsigned lineLen; NSRange searchRange; NSRange tokenEnd; NSRange tokenRange; BOOL foundStandardMonth; BOOL foundOneBeforeMonth; long long tempLL; self = [super init]; if (self) { // typical Unix end of listing if (strstr(line, "total") == line) return nil; // typical IBM OS400 end of listing if (strstr(line, "feof") == line) return nil; fileName = nil; filePath = nil; linkTargetName = nil; isLink = NO; isDir = NO; size = 0; modifDate = nil; whiteSet = [NSCharacterSet whitespaceCharacterSet]; splitLine = [NSMutableArray arrayWithCapacity:5]; fullLine = [NSString stringWithCString:line]; lineLen = [fullLine length]; ch = [fullLine characterAtIndex:0]; if (ch == '-' || ch == 'd' || ch == 'l') { // this is a unix-like listing unsigned cursor; // file permissions block cursor = 0; searchRange = NSMakeRange(cursor, lineLen-cursor); tokenEnd = [fullLine rangeOfCharacterFromSet:whiteSet options:0 range:searchRange]; tokenRange = NSMakeRange(cursor, tokenEnd.location-cursor); [splitLine addObject:[fullLine substringWithRange:tokenRange]]; cursor = NSMaxRange(tokenEnd); while ([fullLine characterAtIndex:cursor] == ' ' && cursor <= lineLen) cursor++; // typically links - (user) - group - size searchRange = NSMakeRange(cursor, lineLen-cursor); tokenEnd = [fullLine rangeOfCharacterFromSet:whiteSet options:0 range:searchRange]; tokenRange = NSMakeRange(cursor, tokenEnd.location-cursor); // NSLog(@"second token: %@ %@", NSStringFromRange(tokenEnd), NSStringFromRange(tokenRange)); [splitLine addObject:[fullLine substringWithRange:tokenRange]]; cursor = NSMaxRange(tokenEnd); while ([fullLine characterAtIndex:cursor] == ' ' && cursor <= lineLen) cursor++; searchRange = NSMakeRange(cursor, lineLen-cursor); tokenEnd = [fullLine rangeOfCharacterFromSet:whiteSet options:0 range:searchRange]; tokenRange = NSMakeRange(cursor, tokenEnd.location-cursor); // NSLog(@"third token: %@ %@", NSStringFromRange(tokenEnd), NSStringFromRange(tokenRange)); [splitLine addObject:[fullLine substringWithRange:tokenRange]]; cursor = NSMaxRange(tokenEnd); while ([fullLine characterAtIndex:cursor] == ' ' && cursor <= lineLen) cursor++; searchRange = NSMakeRange(cursor, lineLen-cursor); tokenEnd = [fullLine rangeOfCharacterFromSet:whiteSet options:0 range:searchRange]; tokenRange = NSMakeRange(cursor, tokenEnd.location-cursor); // NSLog(@"fourth token: %@ %@", NSStringFromRange(tokenEnd), NSStringFromRange(tokenRange)); [splitLine addObject:[fullLine substringWithRange:tokenRange]]; cursor = NSMaxRange(tokenEnd); while ([fullLine characterAtIndex:cursor] == ' ' && cursor <= lineLen) cursor++; searchRange = NSMakeRange(cursor, lineLen-cursor); tokenEnd = [fullLine rangeOfCharacterFromSet:whiteSet options:0 range:searchRange]; tokenRange = NSMakeRange(cursor, tokenEnd.location-cursor); // NSLog(@"fifth token: %@ %@ %@", NSStringFromRange(tokenEnd), NSStringFromRange(tokenRange), [fullLine substringWithRange:tokenRange]); [splitLine addObject:[fullLine substringWithRange:tokenRange]]; cursor = NSMaxRange(tokenEnd); foundOneBeforeMonth = [self checkMonth:[splitLine objectAtIndex:4]]; while ([fullLine characterAtIndex:cursor] == ' ' && cursor <= lineLen) cursor++; // typically month searchRange = NSMakeRange(cursor, lineLen-cursor); tokenEnd = [fullLine rangeOfCharacterFromSet:whiteSet options:0 range:searchRange]; tokenRange = NSMakeRange(cursor, tokenEnd.location-cursor); // NSLog(@"sixth token: %@ %@ %@", NSStringFromRange(tokenEnd), NSStringFromRange(tokenRange), [fullLine substringWithRange:tokenRange]); [splitLine addObject:[fullLine substringWithRange:tokenRange]]; cursor = NSMaxRange(tokenEnd); foundStandardMonth = [self checkMonth:[splitLine objectAtIndex:5]]; while ([fullLine characterAtIndex:cursor] == ' ' && cursor <= lineLen) cursor++; // typically day of the month searchRange = NSMakeRange(cursor, lineLen-cursor); tokenEnd = [fullLine rangeOfCharacterFromSet:whiteSet options:0 range:searchRange]; tokenRange = NSMakeRange(cursor, tokenEnd.location-cursor); // NSLog(@"seventh token: %@ %@ %@", NSStringFromRange(tokenEnd), NSStringFromRange(tokenRange), [fullLine substringWithRange:tokenRange]); [splitLine addObject:[fullLine substringWithRange:tokenRange]]; cursor = NSMaxRange(tokenEnd); while ([fullLine characterAtIndex:cursor] == ' ' && cursor <= lineLen) cursor++; // typically year or hour // but it could be fileName already if (foundStandardMonth) { searchRange = NSMakeRange(cursor, lineLen-cursor); tokenEnd = [fullLine rangeOfCharacterFromSet:whiteSet options:0 range:searchRange]; tokenRange = NSMakeRange(cursor, tokenEnd.location-cursor); // NSLog(@"eighth token: %@ %@ %@", NSStringFromRange(tokenEnd), NSStringFromRange(tokenRange), [fullLine substringWithRange:tokenRange]); [splitLine addObject:[fullLine substringWithRange:tokenRange]]; cursor = NSMaxRange(tokenEnd); while ([fullLine characterAtIndex:cursor] == ' ' && cursor <= lineLen) cursor++; } // typically the filename if (cursor < lineLen) { tokenRange = NSMakeRange(cursor, lineLen-cursor); // NSLog(@"last token: %@ %@ %@", NSStringFromRange(tokenEnd), NSStringFromRange(tokenRange), [fullLine substringWithRange:tokenRange]); [splitLine addObject:[fullLine substringWithRange:tokenRange]]; } elementsFound = [splitLine count]; // If the listing had only 8 elements out of 9 // Missing user is supposed and a blank is inserted if (elementsFound == 8) { [splitLine insertObject: @"" atIndex:2]; foundStandardMonth = foundOneBeforeMonth; elementsFound = [splitLine count]; } // Parse split data if (foundStandardMonth && elementsFound == 9) { NSRange linkArrowRange; NSString *tmpFileName; NSString *tmpSizeString; // everything is fine and ok, we have a full-blown listing and parsed it well; isDir = NO; isLink = NO; if ([[splitLine objectAtIndex:0] characterAtIndex:0] == 'd') isDir = YES; else if ([[splitLine objectAtIndex:0] characterAtIndex:0] == 'l') isLink = YES; size = 0; tmpSizeString = [splitLine objectAtIndex:4]; [[NSScanner scannerWithString: tmpSizeString] scanLongLong:&tempLL]; if (tempLL > 0) size = (unsigned long long)tempLL; tmpFileName = [splitLine objectAtIndex:elementsFound -1]; linkArrowRange = [tmpFileName rangeOfString: @" -> "]; if (isLink) { if (linkArrowRange.location == NSNotFound) { NSLog(@"we have a link, but no target to parse: %@", tmpFileName); fileName = [tmpFileName retain]; } else { fileName = [[tmpFileName substringToIndex: linkArrowRange.location] retain]; linkTargetName = [[tmpFileName substringFromIndex: linkArrowRange.location+linkArrowRange.length] retain]; NSLog(@"we have a link, target: %@", linkTargetName); } // we suppose that files have extensions, dirs not // links have no further information if ([[fileName pathExtension] isEqualToString:@""]) { NSLog(@"we suppose %@ is a dir", fileName); isDir = YES; } } else { fileName = [tmpFileName retain]; } } else return nil; } else if ((fullLine != NULL) && ([fullLine rangeOfString: @"*FILE"].location != NSNotFound)) { // maybe it is an IBM AS400 / i5 style line // this is an IBM listing, having the *FILE element unsigned cursor; // username block cursor = 0; searchRange = NSMakeRange(cursor, lineLen-cursor); tokenEnd = [fullLine rangeOfCharacterFromSet:whiteSet options:0 range:searchRange]; tokenRange = NSMakeRange(cursor, tokenEnd.location-cursor); [splitLine addObject:[fullLine substringWithRange:tokenRange]]; cursor = NSMaxRange(tokenEnd); while ([fullLine characterAtIndex:cursor] == ' ' && cursor <= lineLen) cursor++; // file size searchRange = NSMakeRange(cursor, lineLen-cursor); tokenEnd = [fullLine rangeOfCharacterFromSet:whiteSet options:0 range:searchRange]; tokenRange = NSMakeRange(cursor, tokenEnd.location-cursor); [splitLine addObject:[fullLine substringWithRange:tokenRange]]; cursor = NSMaxRange(tokenEnd); while ([fullLine characterAtIndex:cursor] == ' ' && cursor <= lineLen) cursor++; // date searchRange = NSMakeRange(cursor, lineLen-cursor); tokenEnd = [fullLine rangeOfCharacterFromSet:whiteSet options:0 range:searchRange]; tokenRange = NSMakeRange(cursor, tokenEnd.location-cursor); [splitLine addObject:[fullLine substringWithRange:tokenRange]]; cursor = NSMaxRange(tokenEnd); while ([fullLine characterAtIndex:cursor] == ' ' && cursor <= lineLen) cursor++; // time searchRange = NSMakeRange(cursor, lineLen-cursor); tokenEnd = [fullLine rangeOfCharacterFromSet:whiteSet options:0 range:searchRange]; tokenRange = NSMakeRange(cursor, tokenEnd.location-cursor); [splitLine addObject:[fullLine substringWithRange:tokenRange]]; cursor = NSMaxRange(tokenEnd); while ([fullLine characterAtIndex:cursor] == ' ' && cursor <= lineLen) cursor++; // record type searchRange = NSMakeRange(cursor, lineLen-cursor); tokenEnd = [fullLine rangeOfCharacterFromSet:whiteSet options:0 range:searchRange]; tokenRange = NSMakeRange(cursor, tokenEnd.location-cursor); [splitLine addObject:[fullLine substringWithRange:tokenRange]]; cursor = NSMaxRange(tokenEnd); while ([fullLine characterAtIndex:cursor] == ' ' && cursor <= lineLen) cursor++; // file name // typically the filename if (cursor < lineLen) { tokenRange = NSMakeRange(cursor, lineLen-cursor); [splitLine addObject:[fullLine substringWithRange:tokenRange]]; } // everything is fine and ok, we have a full-blown listing and parsed it well; isDir = NO; /* OS400 is not hierarchical */ [[NSScanner scannerWithString: [splitLine objectAtIndex:1]] scanLongLong:&tempLL]; if (tempLL > 0) size = (unsigned long long)tempLL; else size = 0; fileName = [[splitLine objectAtIndex:5] retain]; } else { /* we don't know better */ return nil; } /* let's ignore the current and the parent directory some servers send over... */ if([fileName isEqualToString:@"."]) return nil; else if([fileName isEqualToString:@".."]) return nil; } return self; } /* accessors */ - (NSString *)name { return fileName; } /* sets the file name and updates the full path */ - (void)setName: (NSString *)n { NSString *basePath; [fileName release]; fileName = [n retain]; basePath = [filePath stringByDeletingLastPathComponent]; filePath = [[basePath stringByAppendingPathComponent: fileName] retain]; } - (NSString *)path { return filePath; } /* sets the full path and updates the name */ - (void)setPath: (NSString *)p { [filePath release]; [fileName release]; filePath = [p retain]; fileName = [[filePath lastPathComponent] retain]; } - (NSString *)linkTargetName { return linkTargetName; } - (BOOL)isDir { return isDir; } - (BOOL)isLink { return isLink; } - (void)setIsLink:(BOOL)flag { isLink = flag; } - (unsigned long long)size { return size; } @end FTP-0.6/ftpclient.h0000664000175000017500000000616212752175167013623 0ustar multixmultix/* Project: FTP Copyright (C) 2005-2015 Riccardo Mottola Author: Riccardo Mottola Created: 2005-03-30 FTP client class This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include /* for bcopy or memcpy */ #ifdef _WIN32 #include #include #define BCOPY(SRC, DST, LEN) memcpy(DST, SRC, LEN) #else #include #include #include #define BCOPY(SRC, DST, LEN) bcopy(SRC, DST, LEN) #endif /* WIN32 */ #include #import #import "client.h" #import "localclient.h" #import "fileElement.h" #define MAX_SOCK_BUFF 1024 #define MAX_DIR_RECURSION 5 #define ERR_COULDNT_RESOLVE -1 #define ERR_SOCKET_FAIL -2 #define ERR_CONNECT_FAIL -3 #define ERR_GESOCKNAME_FAIL -4 #define ERR_READ_FAIL -5 /** connection types: PASV or PORT */ typedef enum { defaultMode, portMode, passiveMode } connectionModes; /** private structure to use a socket like it was a file stream */ typedef struct { int socket; int position; int len; char buffer[MAX_SOCK_BUFF]; } streamStruct; @interface FtpClient : Client { int userDataPort; int serverDataPort; int dataSocket; int controlSocket; int localSocket; streamStruct dataStream; streamStruct ctrlStream; struct sockaddr_in remoteSockName; struct sockaddr_in localSockName; struct sockaddr_in dataSockName; BOOL usesPassive; BOOL usesPorts; @protected BOOL connected; } - (id)initWithController:(id)cont :(connectionModes)cMode; - (void)setPortDefault; - (void)setPortPort; - (void)setPortPassive; - (void)logIt:(NSString *)str; /** reads a reply from the control socket */ - (int)readReply :(NSMutableArray **)result; - (int)writeLine:(NSString *)line; - (int)writeLine:(NSString *)line byLoggingIt:(BOOL)doLog; - (oneway void)retrieveFile:(FileElement *)file to:(LocalClient *)localClient; - (BOOL)retrieveFile:(FileElement *)file to:(LocalClient *)localClient beingAt:(int)depth; - (oneway void)storeFile:(FileElement *)file from:(LocalClient *)localClient; - (BOOL)storeFile:(FileElement *)file from:(LocalClient *)localClient beingAt:(int)depth; - (int)connect:(int)port :(char *)server; - (void)disconnect; - (int)authenticate:(NSString *)user :(NSString *)pass; - (int)initDataConn; - (int)initDataStream; - (int)closeDataConn; - (void)closeDataStream; @end FTP-0.6/FTPInfo.plist0000664000175000017500000000106713136607146013775 0ustar multixmultix{ ApplicationDescription = "FTP client"; ApplicationIcon = "FTP_icon_gs.tif"; ApplicationName = FTP; ApplicationRelease = "0.6"; Authors = ( "Riccardo Mottola " ); CFBundleIdentifier = "org.gap.FTP"; Copyright = "Copyright (C) 2005-2017"; CopyrightDescription = "Released under GPL v2+"; FullVersionID = "0.6"; NSExecutable = FTP; NSIcon = "FTP_icon_gs.tif"; NSMainNibFile = "FTP.gorm"; NSPrincipalClass = NSApplication; NSRole = Application; URL = "http://savannah.nongnu/project/gap/"; } FTP-0.6/GNUmakefile.preamble0000664000175000017500000000107012650250074015277 0ustar multixmultix# # GNUmakefile.preamble - Generated by ProjectCenter # # Additional flags to pass to the preprocessor ADDITIONAL_CPPFLAGS += # Additional flags to pass to Objective C compiler ADDITIONAL_OBJCFLAGS += # Additional flags to pass to C compiler ADDITIONAL_CFLAGS += # Additional flags to pass to the linker ADDITIONAL_LDFLAGS += # Additional include directories the compiler should search ADDITIONAL_INCLUDE_DIRS += # Additional library directories the linker should search ADDITIONAL_LIB_DIRS += # Additional GUI libraries to link ADDITIONAL_GUI_LIBS += FTP-0.6/GetNameController.h0000664000175000017500000000322613040104062015166 0ustar multixmultix/* -*- mode: objc -*- Project: FTP Copyright (C) 2013-2016 Free Software Foundation Author: Riccardo Mottola Created: 2013-06-05 Controller class to get an new name from the user in a panel dialog. This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #import #if !defined (GNUSTEP) && (MAC_OS_X_VERSION_MAX_ALLOWED <= MAC_OS_X_VERSION_10_4) #ifndef NSInteger #define NSInteger int #endif #ifndef NSUInteger #define NSUInteger unsigned #endif #endif @class NSPanel, NSTextField; @interface GetNameController : NSObject { IBOutlet NSPanel *panel; IBOutlet NSTextField *textField; IBOutlet NSTextField *messageField; IBOutlet NSTextField *labelField; IBOutlet NSButton *cancelButton; IBOutlet NSButton *okButton; NSInteger returnCode; } -(NSInteger)runAsModal; -(void)setTitle:(NSString *)title; -(void)setMessage:(NSString *)desc; -(void)setName:(NSString *)name; -(NSString *)name; -(IBAction)okPressed:(id)sender; -(IBAction)cancelPressed:(id)sender; @end FTP-0.6/client.h0000664000175000017500000000375412752175167013115 0ustar multixmultix/* -*- mode: objc -*- Project: FTP Copyright (C) 2005-2016 Free Software Foundation Author: Riccardo Mottola Created: 2005-04-21 Generic client class, to be subclassed. This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #import #import "fileElement.h" /** * Class that represents an object to access files, be them remote or local. * It must be subclassed to be useful. This object holds porperties genrealy * valid for both local and remote instances as the working directory and the * home directory of the user. It also defines common methods for creating, * changing and deleting directories. */ @interface Client : NSObject { id controller; NSString *workingDir; NSString *homeDir; } - (id)init; - (id)initWithController:(id)cont; /** returns the current working directory */ - (bycopy NSString *)workingDir; - (void)setWorkingDirWithCString:(char *)dir; - (void)setWorkingDir:(NSString *)dir; - (void)changeWorkingDir:(NSString *)dir; - (BOOL)createNewDir:(NSString *)dir; - (BOOL)deleteFile:(FileElement *)file beingAt:(int)depth; - (BOOL)renameFile:(FileElement *)file to:(NSString *)name; - (bycopy NSArray *)workDirSplit; /** returns an array with the directory listing */ - (bycopy NSArray *)dirContents; /** returns the current home directory */ - (bycopy NSString *)homeDir; @end FTP-0.6/FTP.pbproj/0000775000175000017500000000000012650250074013365 5ustar multixmultixFTP-0.6/FTP.pbproj/project.pbxproj0000664000175000017500000002612312650250074016445 0ustar multixmultix// !$*UTF8*$! { archiveVersion = 1; classes = { }; objectVersion = 38; objects = { 080E96DCFE201CFB7F000001 = { fileRef = 29B97318FDCFA39411CA2CEA; isa = PBXBuildFile; settings = { }; }; 080E96DDFE201D6D7F000001 = { children = ( F5F5F93707FD8CAD01A80101, F5F5F93807FD8CAD01A80101, F5F5F93907FD8CAD01A80101, F5F5F93A07FD8CAD01A80101, F56A03FB080AC70701A80101, F56A03FD080AC71101A80101, F5BE3AF6080C6A3601A80101, F5BE3AF7080C6A3601A80101, F5C84D6008142DF201A80101, F5C84D6108142DF201A80101, F5EFB6470818FE6E01A80101, F5EFB6450818FE6001A80101, ); isa = PBXGroup; name = Classes; refType = 4; }; 089C165CFE840E0CC02AAC07 = { children = ( 089C165DFE840E0CC02AAC07, ); isa = PBXVariantGroup; name = InfoPlist.strings; refType = 4; }; 089C165DFE840E0CC02AAC07 = { fileEncoding = 10; isa = PBXFileReference; name = English; path = English.lproj/InfoPlist.strings; refType = 4; }; 089C165EFE840E0CC02AAC07 = { fileRef = 089C165CFE840E0CC02AAC07; isa = PBXBuildFile; settings = { }; }; //080 //081 //082 //083 //084 //100 //101 //102 //103 //104 1058C7A0FEA54F0111CA2CBB = { children = ( 1058C7A1FEA54F0111CA2CBB, ); isa = PBXGroup; name = "Linked Frameworks"; refType = 4; }; 1058C7A1FEA54F0111CA2CBB = { isa = PBXFileReference; name = Cocoa.framework; path = /System/Library/Frameworks/Cocoa.framework; refType = 0; }; 1058C7A2FEA54F0111CA2CBB = { children = ( 29B97325FDCFA39411CA2CEA, 29B97324FDCFA39411CA2CEA, ); isa = PBXGroup; name = "Other Frameworks"; refType = 4; }; 1058C7A3FEA54F0111CA2CBB = { fileRef = 1058C7A1FEA54F0111CA2CBB; isa = PBXBuildFile; settings = { }; }; //100 //101 //102 //103 //104 //190 //191 //192 //193 //194 19C28FACFE9D520D11CA2CBB = { children = ( 85E6C4AE11BEE78200A80101, ); isa = PBXGroup; name = Products; refType = 4; }; //190 //191 //192 //193 //194 //290 //291 //292 //293 //294 29B97313FDCFA39411CA2CEA = { buildStyles = ( 4A9504CCFFE6A4B311CA0CBA, 4A9504CDFFE6A4B311CA0CBA, ); hasScannedForEncodings = 1; isa = PBXProject; mainGroup = 29B97314FDCFA39411CA2CEA; projectDirPath = ""; targets = ( 29B97326FDCFA39411CA2CEA, ); }; 29B97314FDCFA39411CA2CEA = { children = ( 080E96DDFE201D6D7F000001, 29B97315FDCFA39411CA2CEA, 29B97317FDCFA39411CA2CEA, 29B97323FDCFA39411CA2CEA, 19C28FACFE9D520D11CA2CBB, ); isa = PBXGroup; name = FTP; path = ""; refType = 4; }; 29B97315FDCFA39411CA2CEA = { children = ( 29B97316FDCFA39411CA2CEA, ); isa = PBXGroup; name = "Other Sources"; path = ""; refType = 4; }; 29B97316FDCFA39411CA2CEA = { fileEncoding = 30; isa = PBXFileReference; path = main.m; refType = 4; }; 29B97317FDCFA39411CA2CEA = { children = ( 85FC29710DD7B28300A80101, 29B97318FDCFA39411CA2CEA, 089C165CFE840E0CC02AAC07, F5C0879F08A0C47B01A8012F, F5C087A108A0C4AF01A8012F, ); isa = PBXGroup; name = Resources; path = ""; refType = 4; }; 29B97318FDCFA39411CA2CEA = { children = ( 29B97319FDCFA39411CA2CEA, ); isa = PBXVariantGroup; name = MainMenu.nib; path = ""; refType = 4; }; 29B97319FDCFA39411CA2CEA = { isa = PBXFileReference; name = English; path = English.lproj/MainMenu.nib; refType = 4; }; 29B97323FDCFA39411CA2CEA = { children = ( 1058C7A0FEA54F0111CA2CBB, 1058C7A2FEA54F0111CA2CBB, ); isa = PBXGroup; name = Frameworks; path = ""; refType = 4; }; 29B97324FDCFA39411CA2CEA = { isa = PBXFileReference; name = AppKit.framework; path = /System/Library/Frameworks/AppKit.framework; refType = 0; }; 29B97325FDCFA39411CA2CEA = { isa = PBXFileReference; name = Foundation.framework; path = /System/Library/Frameworks/Foundation.framework; refType = 0; }; 29B97326FDCFA39411CA2CEA = { buildPhases = ( 29B97327FDCFA39411CA2CEA, 29B97328FDCFA39411CA2CEA, 29B9732BFDCFA39411CA2CEA, 29B9732DFDCFA39411CA2CEA, ); buildSettings = { FRAMEWORK_SEARCH_PATHS = ""; HEADER_SEARCH_PATHS = ""; INSTALL_PATH = "$(HOME)/Applications"; LIBRARY_SEARCH_PATHS = ""; OTHER_CFLAGS = ""; OTHER_LDFLAGS = ""; PRODUCT_NAME = FTP; SECTORDER_FLAGS = ""; WARNING_CFLAGS = "-Wmost -Wno-four-char-constants -Wno-unknown-pragmas"; WRAPPER_EXTENSION = app; }; dependencies = ( ); isa = PBXApplicationTarget; name = FTP; productInstallPath = "$(HOME)/Applications"; productName = FTP; productReference = 85E6C4AE11BEE78200A80101; productSettingsXML = " CFBundleDevelopmentRegion English CFBundleExecutable FTP CFBundleIconFile FTP_icon_osx.icns CFBundleInfoDictionaryVersion 6.0 CFBundlePackageType APPL CFBundleSignature ???? CFBundleVersion 0.3 NSMainNibFile MainMenu NSPrincipalClass NSApplication "; }; 29B97327FDCFA39411CA2CEA = { buildActionMask = 2147483647; files = ( F5F5F93B07FD8CAD01A80101, F5F5F93D07FD8CAD01A80101, F56A03FE080AC71101A80101, F5BE3AF8080C6A3601A80101, F5C84D6208142DF201A80101, F5EFB6480818FE6E01A80101, ); isa = PBXHeadersBuildPhase; runOnlyForDeploymentPostprocessing = 0; }; 29B97328FDCFA39411CA2CEA = { buildActionMask = 2147483647; files = ( 080E96DCFE201CFB7F000001, 089C165EFE840E0CC02AAC07, F5C087A008A0C47C01A8012F, F5C087A208A0C4B001A8012F, 85FC29720DD7B28300A80101, ); isa = PBXResourcesBuildPhase; runOnlyForDeploymentPostprocessing = 0; }; 29B9732BFDCFA39411CA2CEA = { buildActionMask = 2147483647; files = ( 29B9732CFDCFA39411CA2CEA, F5F5F93C07FD8CAD01A80101, F5F5F93E07FD8CAD01A80101, F56A03FC080AC70701A80101, F5BE3AF9080C6A3601A80101, F5C84D6308142DF201A80101, F5EFB6460818FE6001A80101, ); isa = PBXSourcesBuildPhase; runOnlyForDeploymentPostprocessing = 0; }; 29B9732CFDCFA39411CA2CEA = { fileRef = 29B97316FDCFA39411CA2CEA; isa = PBXBuildFile; settings = { ATTRIBUTES = ( ); }; }; 29B9732DFDCFA39411CA2CEA = { buildActionMask = 2147483647; files = ( 1058C7A3FEA54F0111CA2CBB, ); isa = PBXFrameworksBuildPhase; runOnlyForDeploymentPostprocessing = 0; }; //290 //291 //292 //293 //294 //4A0 //4A1 //4A2 //4A3 //4A4 4A9504CCFFE6A4B311CA0CBA = { buildSettings = { COPY_PHASE_STRIP = NO; GCC_DYNAMIC_NO_PIC = NO; GCC_ENABLE_FIX_AND_CONTINUE = YES; GCC_GENERATE_DEBUGGING_SYMBOLS = YES; GCC_OPTIMIZATION_LEVEL = 0; OPTIMIZATION_CFLAGS = "-O0"; ZERO_LINK = YES; }; isa = PBXBuildStyle; name = Development; }; 4A9504CDFFE6A4B311CA0CBA = { buildSettings = { COPY_PHASE_STRIP = YES; GCC_ENABLE_FIX_AND_CONTINUE = NO; ZERO_LINK = NO; }; isa = PBXBuildStyle; name = Deployment; }; //4A0 //4A1 //4A2 //4A3 //4A4 //850 //851 //852 //853 //854 85E6C4AE11BEE78200A80101 = { isa = PBXApplicationReference; path = FTP.app; refType = 3; }; 85FC29710DD7B28300A80101 = { isa = PBXFileReference; path = FTP_icon_osx.icns; refType = 4; }; 85FC29720DD7B28300A80101 = { fileRef = 85FC29710DD7B28300A80101; isa = PBXBuildFile; settings = { }; }; //850 //851 //852 //853 //854 //F50 //F51 //F52 //F53 //F54 F56A03FB080AC70701A80101 = { fileEncoding = 30; isa = PBXFileReference; path = localclient.m; refType = 4; }; F56A03FC080AC70701A80101 = { fileRef = F56A03FB080AC70701A80101; isa = PBXBuildFile; settings = { }; }; F56A03FD080AC71101A80101 = { fileEncoding = 30; isa = PBXFileReference; path = localclient.h; refType = 4; }; F56A03FE080AC71101A80101 = { fileRef = F56A03FD080AC71101A80101; isa = PBXBuildFile; settings = { }; }; F5BE3AF6080C6A3601A80101 = { fileEncoding = 30; isa = PBXFileReference; path = fileTable.h; refType = 4; }; F5BE3AF7080C6A3601A80101 = { fileEncoding = 30; isa = PBXFileReference; path = fileTable.m; refType = 4; }; F5BE3AF8080C6A3601A80101 = { fileRef = F5BE3AF6080C6A3601A80101; isa = PBXBuildFile; settings = { }; }; F5BE3AF9080C6A3601A80101 = { fileRef = F5BE3AF7080C6A3601A80101; isa = PBXBuildFile; settings = { }; }; F5C0879F08A0C47B01A8012F = { isa = PBXFileReference; path = arrow_right.tiff; refType = 4; }; F5C087A008A0C47C01A8012F = { fileRef = F5C0879F08A0C47B01A8012F; isa = PBXBuildFile; settings = { }; }; F5C087A108A0C4AF01A8012F = { isa = PBXFileReference; path = arrow_left.tiff; refType = 4; }; F5C087A208A0C4B001A8012F = { fileRef = F5C087A108A0C4AF01A8012F; isa = PBXBuildFile; settings = { }; }; F5C84D6008142DF201A80101 = { fileEncoding = 30; isa = PBXFileReference; path = fileElement.h; refType = 4; }; F5C84D6108142DF201A80101 = { fileEncoding = 30; isa = PBXFileReference; path = fileElement.m; refType = 4; }; F5C84D6208142DF201A80101 = { fileRef = F5C84D6008142DF201A80101; isa = PBXBuildFile; settings = { }; }; F5C84D6308142DF201A80101 = { fileRef = F5C84D6108142DF201A80101; isa = PBXBuildFile; settings = { }; }; F5EFB6450818FE6001A80101 = { fileEncoding = 30; isa = PBXFileReference; path = client.m; refType = 4; }; F5EFB6460818FE6001A80101 = { fileRef = F5EFB6450818FE6001A80101; isa = PBXBuildFile; settings = { }; }; F5EFB6470818FE6E01A80101 = { fileEncoding = 30; isa = PBXFileReference; path = client.h; refType = 4; }; F5EFB6480818FE6E01A80101 = { fileRef = F5EFB6470818FE6E01A80101; isa = PBXBuildFile; settings = { }; }; F5F5F93707FD8CAD01A80101 = { fileEncoding = 30; isa = PBXFileReference; path = AppController.h; refType = 4; }; F5F5F93807FD8CAD01A80101 = { fileEncoding = 30; isa = PBXFileReference; path = AppController.m; refType = 4; }; F5F5F93907FD8CAD01A80101 = { fileEncoding = 30; isa = PBXFileReference; path = ftpclient.h; refType = 4; }; F5F5F93A07FD8CAD01A80101 = { fileEncoding = 30; isa = PBXFileReference; path = ftpclient.m; refType = 4; }; F5F5F93B07FD8CAD01A80101 = { fileRef = F5F5F93707FD8CAD01A80101; isa = PBXBuildFile; settings = { }; }; F5F5F93C07FD8CAD01A80101 = { fileRef = F5F5F93807FD8CAD01A80101; isa = PBXBuildFile; settings = { }; }; F5F5F93D07FD8CAD01A80101 = { fileRef = F5F5F93907FD8CAD01A80101; isa = PBXBuildFile; settings = { }; }; F5F5F93E07FD8CAD01A80101 = { fileRef = F5F5F93A07FD8CAD01A80101; isa = PBXBuildFile; settings = { }; }; }; rootObject = 29B97313FDCFA39411CA2CEA; } FTP-0.6/AppController.h0000664000175000017500000001145613040104062014372 0ustar multixmultix/* -*- mode: objc -*- Project: FTP Copyright (C) 2005-2016 Riccardo Mottola Author: Riccardo Mottola Created: 2005-03-30 Application Controller This application is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This application is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License for more details. You should have received a copy of the GNU General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #define connectionModeKey @"connectionMode" #import #import "ftpclient.h" #import "localclient.h" #import "fileTable.h" #include @interface AppController : NSObject { IBOutlet NSMenu *mainMenu; IBOutlet NSWindow *mainWin; IBOutlet NSTableView *localView; IBOutlet NSTableView *remoteView; IBOutlet NSPopUpButton *localPath; IBOutlet NSPopUpButton *remotePath; IBOutlet NSButton *buttDownload; IBOutlet NSButton *buttUpload; IBOutlet NSTextField *infoMessage; IBOutlet NSTextField *infoSpeed; IBOutlet NSTextField *infoSize; IBOutlet NSProgressIndicator *progBar; IBOutlet NSWindow *logWin; IBOutlet NSTextView *logTextField; IBOutlet NSPanel *connectPanel; IBOutlet NSBox *connServerBox; IBOutlet NSBox *connAccountBox; IBOutlet NSTextField *connAddress; IBOutlet NSTextField *connPort; IBOutlet NSTextField *connUser; IBOutlet NSTextField *connPass; IBOutlet NSButton *connAnon; IBOutlet NSButton *connCancelButt; IBOutlet NSButton *connConnectButt; IBOutlet NSPanel *prefPanel; IBOutlet NSMatrix *portType; IBOutlet NSButton *prefCancelButt; IBOutlet NSButton *prefSaveButt; NSMutableDictionary *textAttributes; FileTable *localTableData; FileTable *remoteTableData; FtpClient *ftp; LocalClient *local; NSMutableArray *filesInProcess; @private connectionModes connMode; @private NSTimeInterval beginTimeVal; @private unsigned long long transferSize; @private BOOL threadRunning; @private NSConnection *doConnection; } - (void)applicationDidFinishLaunching:(NSNotification *)aNotif; - (NSApplicationTerminateReply)applicationShouldTerminate:(id)sender; - (void)applicationWillTerminate:(NSNotification *)aNotif; - (BOOL)application:(NSApplication *)application openFile:(NSString *)fileName; - (void)readDirWith:(Client *)client toTable:(FileTable *)t andView:(NSTableView*)tv; - (void)updatePath :(NSPopUpButton *)path :(NSArray *)pathArray; - (IBAction)changePathFromMenu:(id)sender; - (IBAction)listDoubleClick:(id)sender; - (BOOL)dropValidate:(id)sender paths:(NSArray *)paths; - (void)dropAction:(id)sender paths:(NSArray *)paths; - (IBAction)downloadButton:(id)sender; - (IBAction)uploadButton:(id)sender; - (IBAction)localDelete:(id)sender; - (IBAction)remoteDelete:(id)sender; - (IBAction)localRename:(id)sender; - (IBAction)remoteRename:(id)sender; - (IBAction)localNewFolder:(id)sender; - (IBAction)remoteNewFolder:(id)sender; - (IBAction)localRefresh:(id)sender; - (IBAction)remoteRefresh:(id)sender; - (void)setThreadRunningState:(BOOL)flag; - (oneway void)setTransferBegin:(in bycopy NSString *)name :(unsigned long long)size; - (oneway void)setTransferProgress:(in bycopy NSNumber *)bytesTransferred; - (oneway void)setTransferEnd:(in bycopy NSNumber *)bytesTransferred; /** closes the open connections and quits the session with the remote server */ - (IBAction)disconnect:(id)sender; - (IBAction)showPrefPanel:(id)sender; - (IBAction)prefSave:(id)sender; - (IBAction)prefCancel:(id)sender; - (IBAction)showFtpLog:(id)sender; /** Called by the server object to register itself */ - (void)setServer:(id)anObject; - (oneway void)appendTextToLog:(NSString *)textChunk; - (IBAction)showConnPanel:(id)sender; - (IBAction)connectConn:(id)sender; - (IBAction)cancelConn:(id)sender; - (IBAction)anonymousConn:(id)sender; - (void)showAlertDialog:(NSString*)message; /* accessor */ - (connectionModes)connectionMode; /* internal methods */ - (void)performRetrieveFile; - (void)performStoreFile; - (void)retrieveFiles; - (oneway void)fileRetrieved:(BOOL)success; - (void)storeFiles; - (oneway void)fileStored:(BOOL)success; @end @interface fileTransmitParms : NSObject { @public FileElement *file; @public LocalClient *localClient; @public int depth; } @end FTP-0.6/README0000664000175000017500000000007712750205530012323 0ustar multixmultixNOTES No specific notes for Windows compilation currently. FTP-0.6/Resources/0000775000175000017500000000000013136607146013421 5ustar multixmultixFTP-0.6/Resources/German.lproj/0000775000175000017500000000000013040104062015736 5ustar multixmultixFTP-0.6/Resources/German.lproj/Localizable.strings0000664000175000017500000000072613040104062021577 0ustar multixmultix/* menu */ "Local" = "Lokal"; "Remote" = "Fern"; "Rename..." = "Umbenennen..."; "New Folder..." = "Neuer Ordner..."; "Delete" = "Delete"; "Refresh" = "Aktualisieren"; /* Connection panel */ "Server Address and Port" = "Server Addresse und Port"; "Account" = "Konto"; "Connect" = "Verbindung"; "Anonymous" = "Anonym"; "Connect (action)" = "Verbinde"; /* Log */ "Connection Log" = "Verbindungslog"; /* Get Name */ "Name:" = "Name:"; "Cancel" = "Abbrechen"; "Ok" = "Ok";FTP-0.6/Resources/InfoPlist.strings0000664000175000017500000000113613136607146016744 0ustar multixmultix/* Localized versions of Info.plist keys */ CFBundleName = "FTP"; CFBundleShortVersionString = "FTP version 0.6"; CFBundleGetInfoString = "FTP version 0.6, Copyright 2005-2017."; NSHumanReadableCopyright = "Copyright 2005-2017 Riccardo Mottola.\n This software is distributed under GPL v2 or later."; FTP-0.6/Resources/Italian.lproj/0000775000175000017500000000000013040104062016106 5ustar multixmultixFTP-0.6/Resources/Italian.lproj/Localizable.strings0000664000175000017500000000106613040104062021745 0ustar multixmultix/* menu */ "Local" = "Local"; "Remote" = "Remote"; "Rename..." = "Rename..."; "New Folder..." = "New Folder..."; "Delete" = "Delete"; "Refresh" = "Refresh"; /* Connection panel */ "Server Address and Port" = "Indirizzo server e porta"; "Account" = "Credenziali"; "Connect" = "Connessione"; "Anonymous" = "Anonimo"; "Connect (action)" = "Connetti"; /* main window */ "local view" = "Vista Locale"; "remote view" = "Vista Remota"; "Name" = "Nome"; /* Log */ "Connection Log" = "Log Connessione"; /* Get Name */ "Name:" = "Nome:"; "Cancel" = "Annulla"; "Ok" = "Ok";FTP-0.6/Resources/arrow_right.tiff0000664000175000017500000000211612650250074016614 0ustar multixmultixMM*     t(RQ---/LLLw iii LLLccc """<j"""< LLLccc jjjLLLvQ---/ FTP-0.6/Resources/FTP.gorm/0000775000175000017500000000000012650250074015007 5ustar multixmultixFTP-0.6/Resources/FTP.gorm/data.info0000664000175000017500000000027012650250074016574 0ustar multixmultixGNUstep archive000f4240:00000003:00000003:00000000:01GormFilePrefsManager1NSObject%01NSString&%Latest Version0& % Typed StreamFTP-0.6/Resources/FTP.gorm/arrow_right.tiff0000664000175000017500000000211612650250074020210 0ustar multixmultixMM*     t(RQ---/LLLw iii LLLccc """<j"""< LLLccc jjjLLLvQ---/ FTP-0.6/Resources/FTP.gorm/objects.gorm0000664000175000017500000010750312650250074017334 0ustar multixmultixGNUstep archive000f4240:00000035:000003df:00000001:01GSNibContainer1NSObject01 NSMutableSet1NSSet&01GSWindowTemplate1GSClassSwapper01NSString&% NSWindow1NSWindow1 NSResponder% ? A C C*&% C C01 NSView% ? A C C*  C C*&01 NSMutableArray1 NSArray&01 NSScrollView%  C C*  C C*&0 &0 1 NSClipView% A @ C̀ C& A @ C̀ C&&0 1 NSTextView1NSText% A @ C̀   C̀ & 0 &0 1NSColor0 &% NSNamedColorSpace0&%System0&%textBackgroundColor  K K0 0& % textColor C̀ K0 & 01 NSScroller1 NSControl% @ @ A C&  A C&&0 &%01NSCell0&01NSFont%&&&&&&&&&&&&&&& % A A A A 0 0&% System0&% windowBackgroundColor0&%Window0&%Connection Log ? ? F@ F@%&  D D@00&% NSPanel1NSPanel% ? A C C[&% C D0 % ? A C C[  C C[&0 &0!1NSButton% CJ A B A  B A&0" &%0#1 NSButtonCell1 NSActionCell0$&%Connect&&&&&&&&&&&&&&%0%&0&&&&& &&0'% C A B` A  B` A&0( &%0)0*&%Cancel&&&&&&&&&&&&&&%0+&0,&&&& &&0-1NSBox% A0 B4 C B  C B&0. &0/ % @ @ Cv B  Cv B&00 &011 NSTextField% B A C( A  C( A&02 &%031NSTextFieldCell04&%joe4&&&&&&&& &&&&&&% 051GSControlTemplate06&%NSSecureTextField% B @ C( A  C( A&07 &%081NSSecureTextFieldCell09&9&&&&&&&& &&&&&&% 0:% A B B A  B A&0; &%0<0=& % Anonymous0>1NSImage0?1 NSMutableString&%GSSwitch&&&&&&&&&&&&&&%0@&0A&0B0C &%GSSwitchSelected&&& &&0D% A B A  B A&0E &%0F0G&%Username0H% A@G&&&&&&&& &&&&&&% 0I% @ B A  B A&0J &%0K0L&%PasswordHL&&&&&&&& &&&&&&% 0M0N&%Account&&&&&&&&&&&&&& @ @%%0O% A0 C C BH  C BH&0P &0Q % @h @ Cup A  Cup A&0R &0S% C?  B[e A  B[e A&0T &%0U0V&%21V&&&&&&&& &&&&&&% 0W%  C0 A  C0 A&0X &%0Y0Z& % localhost&&&&&&&& &&&&&&% 0[% C5 @@ @ A  @ A&0\ &%0]0^&%:H^&&&&&&&& &&&&&&% 0_0`&%Server Address and Port`&&&&&&&&&&&&&& @h @%%0a&%Connecta ? ? F@ F@%&  D D@0b% ? A C C&% CS D@0c % ? A C C  C C&0d &0e % A0 B C5 C^  C5 C^&0f &0g% A A C C1  C C1&0h1! NSTableView%  C) C!  C) C!&hg0i &%0j0k&&&&&&&&&&&&&&&0l &0m1" NSTableColumn0n&%filename C) A GP0o1#NSTableHeaderCell0p&%Name0q% &&&&&&&& &&&&&&%0r 0s&% controlShadowColor0t 0u&% windowFrameTextColor0v0w&%ninew&&&&&&&& &&&&&&% 0x 0y& %  gridColor0z 0{&% controlBackgroundColor0|1$NSTableHeaderView%  C) A  C) A&|0}% A @ C A  C A&|0~ &|0 0& %  controlColor0 &01%GSTableCornerView% @ @ A A  A A&0 &%% A @ @@0 &0 &hz0% @ A A CD  A CD&0 &%0k&&&&&&&&&&&&&&&}0% A CJ C A  C A&0 &%00&&&&&&&&&&&&&&&&g% A A A A }0 % C B C5 C]  C5 C]&0 &0% A A C C0  C C0&0!%  C) C!  C) C!&0 &%00&&&&&&&&&&&&&&&0 &0"0&%filename C) A GP0#0&%Nameq&&&&&&&& &&&&&&%rt0ww&&&&&&&& &&&&&&% xz0$%  C) A  C) A&0% A @ C A  C A&0 &0 &0%% @ @ A A  A A&0 &%% A @ @@0 &0 &z0% @ A A CC  A CC&0 &%0&&&&&&&&&&&&&&&0% A CI C A  C A&0 &%0&&&&&&&&&&&&&&&% A A A A 0% CQ Cg B B  B B&-0 &%00&%->0 A AP00&% NSCalibratedWhiteColorSpace 0 &01&NSBitmapImageRep1' NSImageRep0&% NSDeviceRGBColorSpace A AP%%% 01(NSData&II*|777Q%%%&&&/555???w >>> 555=== ...<>>>j...< 555===  >>>555???v777Q%%%&&&/   tR&&&&&&&&&&&&&&%0&0&&&& &&0% CQ C0 B B  B B&-0 &%00&%<-0 A AP0 &0& A AP%%% 0(&II*|&&&/%%%777Q???w555>>>  ===555 ...<>>>j...< ===555 >>>  ???v555&&&/%%%777Q  tR&&&&&&&&&&&&&&%0&0&&&& &&0% A0 A  C B  C B&0 &0 % @ @ C BT  C BT&0± &0ñ% B C A  C A&0ı &%0ű0Ʊ&&&&&&&&& &&&&&&% 0DZ% C B C A  C A&0ȱ &%0ɱ0ʱ&&&&&&&&& &&&&&&% 01)NSProgressIndicator%  C> A  C> A&0̱ & ?UUUUUU @I @Y0ͱ% Cf  C> A  C> A&0α &%0ϱ0б&&&&&&&&& &&&&&&% 0ѱ0ұ&%Title&&&&&&&&&&&&&& @ @%%01* NSPopUpButton% A0 C C5 A  C5 A&0Ա &%01+NSPopUpButtonCell1,NSMenuItemCell0ֱ&&&&&&&&&01-NSMenu0ر&0ٱ &01. NSMenuItem0۱& % Local View&&%0ܱ0ݱ&% common_3DArrowDown%&&&&&&%0ޱ&0߱&&&& > =&&ڰװ%%%%%0*% C C C5 A  C5 A& 0 &%0+0&&&&&&&&&0-0&0 &0.0& % Remote View&&%ܐ%&&&&&&%0&0&&&& > =&&%%%%%0&%FTP ? ? F@ F@%&  D D@0-0&%FTP0 &0.0&%Info0&&&%00 &%GSMenuSelected00 & % GSMenuMixed2 submenuAction:v12@0:4@8%0-0 &0.0& % Info Panel...0&&&%%0.0&%Preferences...0&&&%%0.0&%Help...P&%?&&%%P.P& % ConnectionP&&&%%P-P &P.P& % Connect...P&&&%%P .P & % DisconnectP &&&%%P .P &%Show LogP&&&%%P.P&%LocalP&&&%%P-P &P.P& % Rename...P&&&%%P.P& % New Folder...P&&&%%P.P&%DeleteP&&&%%P.P&%RefreshP&&&%%P .P!&%RemoteP"&&&%%P#-!P$ &P%.P&& % Rename...P'&&&%%P(.P)& % New Folder...P*&&&%%P+.P,&%DeleteP-&&&%%P..P/&%RefreshP0&&&%%P1.P2&%WindowsP3&&&%%P4-2P5 &P6.P7&%Arrange In FrontP8&&&%%P9.P:&%Miniaturize WindowP;&%m&&%%P<.P=& % Close WindowP>&%w&&%%P?.P@&%ServicesPA&&&%%PB-@PC &PD.PE&%HidePF&%h&&%%PG.PH&%QuitPI&%q&&%%PJ% ? A C C*& % C D"@PK % ? A C C*  C C*&PL &PM% A B8 Ce B  Ce B&PN &PO % @ @ CW B  CW B&PP &PQ1/NSMatrix% A @ C5 B  C5 B&PR &%PSPT&&&&&&&&&&&&&&&%% C5 A zzPU& % NSButtonCellPVPW&%RadioPXPY &%GSRadio&&&&&&&&&&&&&&%PZ&P[&P\P] &%GSRadioSelected&&& &&%%P^ &P_P`& % default portsX&&&&&&&&&&&&&&%Pa&Pb&\&&& &&PcPd&%client arbitrates (PORT)X&&&&&&&&&&&&&&%Pe&Pf&\&&& &&PgPh&%server arbitrates (PASV)X&&&&&&&&&&&&&&%Pi&Pj&\&&& &&_PkPl&%Data Connection Managment&&&&&&&&&&&&&& @ @%%Pm% C7 A  B` A  B` A&Pn &%PoPp&%Save&&&&&&&&&&&&&&%Pq&Pr&&&& &&Ps% B A  B` A  B` A&Pt &%PuPv&%Cancel&&&&&&&&&&&&&&%Pw&Px&&&& &&Py&%WindowPz& % Preferencesz @@ B F@ F@%&  D D@P{10 GSNibItemP|& % AppController  &P} &bP~ &bP11NSMutableDictionary12 NSDictionary&YP& % MenuItem81DP& % MenuItem(21)+P& % GormNSMenu1BP&%Button1!P&%Menu(13)P& % MenuItem(49)P& % TableColumnmP&% NSOwnerP& % NSApplicationP& % GormNSMenu33P& % MenuItem(31)P& % MenuItem99+P& % MenuItem75+P& % MenuItem51?P& % MenuItem153 P& % TextField1SP&%Menu(10)4P& % GormNSMenu27P& % MenuItem(46)P& % MenuItem69P& % MenuItem147P& % MenuItem45DP& % MenuItem123P& % MenuItem21P&%Menu(7)P& % MenuItem(43)P.P&%Item 3P&&&%%P& % GormNSMenu40#P& % MenuItem1GP& % MenuItem39 P& % MenuItem117DP& % MenuItem151P& % MenuItem82GP& % MenuItem160GP&%Menu(4)4P&%MatrixQP& % GormNSMenu24P&%Button2'P& % MenuItem(40)GP& % GormNSMenu34#P&%NSServicesMenuBP& % GormNSMenu10#P& % MenuItem761P& % MenuItem52DP& % MenuItem154+P& % MenuItem130& % TextField6DP?& % MenuItem(53)P@& % ScrollView1PA& % MenuItem26PB& % MenuItem1286PC& % MenuItem104?PD& % MenuItem93DPE& % Scroller(3)PF& % MenuItem(50)(PG& % GormNSMenu45PH& % GormNSMenu21PI& % MenuItem6?PJ& % MenuItem87+PK& % TextFieldWPL& % MenuItem639PM& % MenuItem1411PN& % MenuItem(17) PO& % GormNSMenu7PP& % Scroller(0)PQ&%GormNSTableViewhPR&%View(0)/PS& % GormNSMenu39PT& % MenuItem(9)6PU& % GormNSMenu15PV& % MenuItem57&%connPortP?5|P@&%connUserPA5|PB&%connPassPC5|PD& % connectPanelPE3PF3PG4|PH& % connectConn:PI4|PJ& % cancelConn:PK3>RPL3\RPM3̐PN5KPO & % nextKeyViewPP5OPQ3ŐPR3퐐PS5|PT&%connAnonPU5PV & % nextKeyViewPW5KVPX5VPY5VPZ3P[3ސP\3P]3P^3ĐP_3ƐP`5|Pa& % infoMessagePb5|Pc&%progBarPd4|Pe& % uploadButton:Pf4|Pg&%downloadButton:Ph5|Pi&%mainWinPj3ƐPk3ݐPl5|Pm& % infoSpeedPn5|Po&%infoSizePp3]Pq4]Pr&%submenuAction:Ps3ِPt3Pu3]Pv4]Pw&%submenuAction:Px3ՐPy3Pz4|P{& % localDelete:P|4|P}& % remoteDelete:P~3P4|P& % prefSave:P5|P&%portTypeP5|P& % prefPanelP4|P &%anonymousConn:P36P46|P& % prefCancel:P3P3P3P5|P& % buttDownloadP5|P & % buttUploadP3t_P3P_P4P_P& % _doScroll:P3R̐P3P3P3P4P& % _doScroll:P3P32P3P4P& % _doScroll:P3P3h@P3E@P4E@P& % _doScroll:P3@P3ҐP3@P4@P& % _doScroll:P3@P3ݐP3ƐP3ƐP4|P & % disconnect:P5Q|P &%delegateP5(|P &%delegateP3)P3P3P3P3 P4 P&%_popUpItemAction:P3P3P4P&%_popUpItemAction:P5|P& % remotePathP5|P±& % localPathPñ4|Pı&%changePathFromMenu:Pű4|PƱ&%changePathFromMenu:PDZ3Pȱ4|Pɱ& % localRename:Pʱ3P˱4|P̱&%localNewFolder:Pͱ3FPα3Pϱ4F|Pб&%remoteNewFolder:Pѱ4|Pұ& % remoteRename:Pӱ3?PԱ3Pձ4|Pֱ&%remoteRefresh:Pױ4?|Pر& % localRefresh:Pٱ1&ְ6FTP-0.6/Resources/FTP.gorm/data.classes0000664000175000017500000000320012650250074017272 0ustar multixmultix{ "## Comment" = "Do NOT change this file, Gorm maintains it"; AppController = { Actions = ( "changePathFromMenu:", "listDoubleClick:", "downloadButton:", "uploadButton:", "localDelete:", "remoteDelete:", "localRename:", "remoteRename:", "localNewFolder:", "remoteNewFolder:", "localRefresh:", "remoteRefresh:", "disconnect:", "showPrefPanel:", "prefSave:", "prefCancel:", "showFtpLog:", "setServer:", "showConnPanel:", "connectConn:", "cancelConn:", "anonymousConn:" ); Outlets = ( mainWin, localView, remoteView, localPath, remotePath, buttDownload, buttUpload, infoMessage, infoSpeed, infoSize, progBar, logWin, logTextField, connectPanel, connAddress, connPort, connUser, connPass, connAnon, prefPanel, portType ); Super = NSObject; }; FirstResponder = { Actions = ( "anonymousConn:", "appendTextToLog:", "cancelConn:", "changePathFromMenu:", "connectConn:", "disconnect:", "downloadButton:", "listDoubleClick:", "localDelete:", "localNewFolder:", "localRefresh:", "localRename:", "orderFrontFontPanel:", "prefCancel:", "prefSave:", "remoteDelete:", "remoteNewFolder:", "remoteRefresh:", "remoteRename:", "setServer:", "showConnPanel:", "showFtpLog:", "showPrefPanel:", "uploadButton:" ); Super = NSObject; }; fileTransmitParms = { Actions = ( ); Outlets = ( ); Super = NSObject; }; }FTP-0.6/Resources/FTP.gorm/arrow_left.tiff0000664000175000017500000000211612650250074020025 0ustar multixmultixMM*     t(R/---ҮQwLLLiii cccLLL <"""j<""" cccLLL jjj vLLL/---ҮQ FTP-0.6/Resources/MainMenu.nib/0000775000175000017500000000000013040104062015660 5ustar multixmultixFTP-0.6/Resources/MainMenu.nib/info.nib0000664000175000017500000000130313040104062017302 0ustar multixmultix IBDocumentLocation 68 91 356 240 0 0 1440 938 IBEditorPositions 29 194 678 369 44 0 0 1440 938 IBFramework Version 489.0 IBOldestOS 1 IBOpenObjects 29 274 218 21 206 IBSystem Version 8S165 FTP-0.6/Resources/MainMenu.nib/keyedobjects.nib0000664000175000017500000010734013040104062021032 0ustar multixmultixbplist00 Y$archiverX$versionT$topX$objects_NSKeyedArchiver ]IB.objectdata 159@CDI_`abemw #+,-06?DGLMORVZ^_bmnorzn{^mnzn #()*.047>?GHLMOWXpr  #%(),45=DELMOPQWX\_bcdehl  '(234<?FGNOTU\]defPgmnpqv}  P$%*3457>c?@AFGLMRSXY^_du"v"a*04589BnCLnMMc?NOTYZd`no`tnnn'./0789@ABIJQRS\n]\ahpqxyInpxInn  ,239ABEFHPQYZ[4\bcghmtyz4Pc?        " & ' , - 1 2 7 8 = > C D I J O P T U Y Z ^ _ c d h i n o t u z { a7 d f i Y                           ! " # $ % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? @ A B C D E F G H I J K L M N O P Q R S T U V W X Y Z [ \ ] ^ _ ` a b c d e f g h l p :     U !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`ab%cdefghijklmnopqrstuvwxyz{|}~U$null  !"#$%&'()*+,-./0_NSObjectsValues_NSAccessibilityConnectors_NSClassesValuesZNSOidsKeys[NSNamesKeys]NSClassesKeys_NSAccessibilityOidsValues\NSOidsValues_NSVisibleWindowsV$class]NSConnections]NSNamesValues]NSObjectsKeys_NSAccessibilityOidsKeys[NSFramework]NSFontManagerYNSNextOidVNSRoot؁ځۀـ|234[NSClassName678YNS.string]NSApplication:;<=X$classesZ$classname=>?_NSMutableStringXNSStringXNSObject:;ABB?^NSCustomObject_IBCocoaFrameworkEFHZNS.objectsGJKLMNOPQRSTUVWXYZ[\]^_NSWindowStyleMask_NSWindowBackingYNSMinSize]NSWindowTitle]NSWindowClass\NSWindowRect\NSScreenRect\NSWindowViewYNSWTFlags[NSViewClass px _{{202, 164}, {467, 392}}SFTPXNSWindow6c8TViewfghi.klZNSSubviews_NSNextResponder[NSFrameSizeEnvopqrstuEcov2fgxyz{|}~[[[NSSuperview]NSNextKeyView\NSCornerView_NSHeaderClipViewWNSFrame[NSHScrollerXNSvFlagsXNSsFlags[NSVScroller]NSContentView\NSScrollAmts C;27DOA A AAEv7;2fgxy|~ooYNSBGColorYNSDocViewYNScvFlags35 6Ev2gxzh~T_NSIntercellSpacingWidth\NSHeaderView_NSColumnAutoresizingStyle[NSRowHeight_NSDraggingSourceMaskForLocalYNSEnabledYNSTvFlags_NSIntercellSpacingHeight_NSDraggingSourceMaskForNonLocal[NSGridColor^NSTableColumns_NSBackgroundColor"@@"A Z@"@43-Z{186, 224}hgx~[NSTableViewfgxy|~oo>@?6Y{186, 17}:;ݤ?_NSTableHeaderViewVNSView[NSRespondergx|~oo_{{187, 0}, {16, 17}}:;?]_NSCornerViewEv2^NSResizingMask\NSHeaderCellZNSMinWidthWNSWidth\NSIdentifier^NSIsResizeableZNSDataCellZNSMaxWidth"Be`"C6X +"Dz1Xfilename     [NSTextColorYNSSupportZNSContents[NSCellFlags\NSCellFlags2$&! *@TNameVNSSizeVNSNameXNSfFlags"A0"#\LucidaGrande:;?VNSFontWNSWhite\NSColorSpaceK0.33333299%:;!""?WNSColor"$%&'()[NSColorName]NSCatalogName)('%VSystem_headerTextColor.B0%:;122345?_NSTableHeaderCell_NSTextFieldCell\NSActionCellVNSCell79:<=>]NSControlView-.,01@@C"AP"#EB1%"$%&I())/'%_controlTextColor:;N3345?:;PQQ?]NSTableColumn:;STTU?^NSMutableArrayWNSArrayWXUNSRGBO!0.76086956 0.76086956 0.76086956%:;[˦\]?\%NSTableViewYNSControl_{{1, 17}, {186, 224}}:;`aa?ZNSClipViewgxc|~deoooijklXNSTargetYNSPercentXNSAction8:"?[9_{{187, 17}, {15, 224}}\_doScroller::;pqq]?ZNSScrollergxc|~deooovjxy<:"?}ـ=_{{1, 241}, {186, 15}}E|v2_{{1, 0}, {186, 17}}"$%()BA'%_controlBackgroundColorK0.66666669%_{{10, 96}, {203, 257}}:;?\NSScrollViewfgxyz{|}~[[F GNLb]ZGDEvGZ]LN2fgxy|~ppHEEIYIX6EvI2gxzh~TȀKG G4NJWP-hgx~ЀIMLLfgxy|~pp`EEK@Ka6gx|~ppEEOEvЀQ2ISR V1    U&!T*%79:<=>-.,I0WO!0.76086998 0.76086998 0.76086998%W%gxc|~depppjEEE[:"??S\gxc|~depppjxEEE^:_EvK2_{{254, 96}, {203, 257}}gx|~5[[ d -ne_{{214, 271}, {39, 38}}  7  q_NSKeyEquivalent]NSNormalImage^NSButtonFlags2_NSPeriodicInterval]NSButtonFlags_NSPeriodicDelay_NSAlternateContentslhgfcmfP""A "# $2%&'^NSResourceNamejkiWNSImage[arrow_right:;+,,-?_NSCustomResource_%NSCustomResource68:;122345?\NSButtonCell]%NSButtonCell:;566]?XNSButtongx|~5[[:= p nq_{{214, 222}, {39, 38}}  7  @ACr€usgromfR<-$2I&'tkiZarrow_left68gx|~5[[RTUV w x_{{17, 355}, {198, 26}}Y Z[\]^7 _ `:bUcdeh>isl:oU_NSAlternateImageVNSMenuZNSMenuItem_NSPreferredEdgeZNSPullDown]NSAltersState_NSUsesItemFromMenu_NSArrowPosition,A@@{zf  vy, K68Zstuvwcxyed{|}~V]NSMnemonicLoc_NSKeyEquivModMaskWNSTitleYNSOnImageZNSKeyEquivZNSIsHidden\NSMixedImage{|}fx u[NSMenuItemsZlocal view$2&'~ki_NSMenuCheckmark$2&'ki_NSMenuMixedState__popUpItemAction::;[[?68ZOtherViewsEvez2:;ZZ?:;2345?_NSPopUpButtonCell^NSMenuItemCell:;6]?]NSPopUpButtongx|~5[[U  _{{252, 355}, {197, 26}}Y Z[\]^7 _ `:bUch>it:oU,f , 68Zstuvwcxye{|~Ȁ}f ù[remote view68Ev2fgx|~[[U\NSBorderType_NSTitlePosition[NSTitleCellYNSOffsets]NSTransparentYNSBoxType Ev—2fgx|~uulEv󀖀2gx|~5 _{{241, 10}, {187, 17}}7:<,f0@"$% ()-'%_textBackgroundColor"$%&())'%YtextColor:;]?[NSTextField\%NSTextFieldgx|~ !"YNSpiFlagsZNSMaxValue\NSDrawMatrix #@Y$:;&''?ZNSPSMatrix_{{11, 6}, {210, 20}}:;*++?_NSProgressIndicatorgx|~5/13 _{{13, 38}, {270, 17}}7:<<,f0@gx|~5@C _{{285, 38}, {143, 17}}7:<,f0_{{2, 2}, {440, 62}}:;Nޣ?_{{10, 15}, {444, 66}}V{0, 0}STU<€0XProgress@["#]M0 0.80000001%:;`aa?UNSBoxZ{467, 392}_{{0, 0}, {1440, 938}}Z{300, 172}:;fgg?_NSWindowTemplate:;ijjk?\NSMutableSetUNSSetEmvHnopqrstuvwxyz{|}~ &(*,.0^w)+-/13579;=?ACFHJLNPRTVXZ\^`bdfhjlnprtvxz|~20]NSDestinationWNSLabelXNSSource23]AppControllerXdelegate:;ƣ?_NSNibOutletConnector^NSNibConnectorro\buttDownloadqcZbuttUpload€耼fgx|UĀÀÀŀfgh.l!"Evŀ2fgx|~lƀ€€‪Evǀ΀Ҁ؀ހ2gx|~5ŀŀ n_{{10, 88}, {97, 18}} Y7  :U€fˀ,ʀH>?^NSClassSwappergx|~5BEŀŀ _{{9, 60}, {82, 17}}7H9:K<܀.,ۀ؀0XUsername"$%Q()B݀'%\controlColorgx|~5X[ŀŀ _{{9, 27}, {82, 17}}7H9:a<܀.,ހ0XPassword_{{2, 2}, {263, 115}}_{{10, 52}, {267, 135}}iTk<€瀯0WAccount]%^connAccountBoxrsgx|~5wwy| fgx|~~l   _{{14, 14}, {170, 22}}7:r<%&, 0Ylocalhost[connAddressǀ񀼀XconnAnongx|~5ÀÀ n_{{115, 12}, {84, 32}} Y7  :,@mf8VCancel@#YHelvetica68^connCancelButtgx|~5ÀÀ n_{{199, 12}, {84, 32}} Y7  :,mfWConnect68_connConnectButtҁXconnPass gx|~5ww݀ _{{198, 14}, {51, 22}}7:<%&, 0R21XconnPort fgx|Uw ÀÁ뀱Evw2Evr2gx|~5ww _{{184, 16}, {15, 17}}7H9:<܀.,0@Q:_{{2, 2}, {263, 50}}_{{10, 194}, {267, 70}}T<€0_Server Address and Port]%]connServerBox!΁XconnUser&'%JKLMNOPQRSU+,-./\]2$#À _{{79, 285}, {289, 271}}WNSPanel6c8E8v€ 2Z{289, 271}Z{213, 129}\connectPanelC'[infoMessageI)XinfoSizeO+YinfoSpeedsUv-YlocalPath[/YlocalView`a1]hgxefgh~ijkllno.(qrst\NSSharedDataYNSMaxSizeZNSDelegateYNSTVFlags[NSDragTypes_NSTextContainer?22H[ \3@fgxyv|~wxx``}~XNSCursorhff1-1ji6EH456789:;<=>_Apple HTML pasteboard type_Apple PICT pasteboard type_1NeXT Encapsulated PostScript v1.2 pasteboard type_*NeXT Rich Text Format v1.0 pasteboard type_Apple PDF pasteboard type_NSFilenamesPboardType_NSStringPboardType_NeXT TIFF v4.0 pasteboard type_NSColor pasteboard type_#CorePasteboardFlavorType 0x6D6F6F76_NeXT RTFD pasteboard typeZ{413, 153}`ZNSTextView_NSLayoutManagerYNSTCFlags"C΀1AGg(.]NSTextStorageYNSLMFlags_NSTextContainersBFEg>.DC68:;?_NSMutableAttributedString_NSAttributedStringEvt@2:;?:;jj?.&._NSSelectedAttributesWNSFlags_NSDefaultParagraphStyle_NSInsertionColor_NSLinkAttributes_NSMarkedAttributesI a)QZ-EWNS.keysρLNҁJKP"$%()BM'%_selectedTextBackgroundColor"$%&())O'%_selectedTextColor:;?\NSDictionaryEӣUVYRSTP[NSUnderlineYNSHotSpot\NSCursorTypeW XW{8, -8}:;vv?WF0 0 1%:;?_NSTextViewSharedData\{428, 1e+07}:;?[%NSTextViewVNSText\logTextField_vJKLMNOPQRSTU     \]uab`tdc_{{101, 194}, {430, 155}}^Connection Log6c8fgh.lesEvxf2fghxy}~!l$%&'lgdrd2ol2DE+vl'$2lo2E1v`12_{{1, 1}, {413, 153}}6kXW{4, -5}gx:c|~exx=x?jAZNSCurValueff"?fm:n_{{414, 1}, {15, 139}}gx:c|~dexx=xGHjJKfffp:"?rCq_{{-100, -100}, {87, 18}}Z{430, 155}VlogWinPQxuUVXy퀅zXMainMenuE[v\]^_`ab{Ɂׁ2ZsteuvwyeP{|gh~mYNSSubmenux~|}f}^submenuAction:upqsEuvvwxyz{|}~2Zsuvwyg{~~}fYAbout FTPZstuvwyg{|~~}f^Preferences...Zstuvwyg{|~]NSIsSeparator~f}f Zsteuvwyeg{|~~}fXServicesu68Ev2__NSServicesMenuZstuvwyg{|~~f}f Zstuvwyg{|~~}XHide FTPQhZstuvwyg{~~}[Hide OthersZstuvwyg{|~~}fXShow AllZstuvwyg{|~~f}f Zstuvwyg{|~~}XQuit FTPQq\_NSAppleMenuZsteuvwyeP{|~x}fTFileuEv2Zstuvwy{|~}fZConnect...Zstuvwy{|~}fZDisconnectZstuvwy{| ~}fXShow LogZsteuvwyeP{|~x}fTEditu68E v!"#$%2Zstuvwy{|)~+}SCutQxZstuvwy{|2~4}TCopyQcZstuvwy{|;~=}UPasteQvZstuvwy{|D~}fVDeleteZstuvwy{|L~N}ZSelect AllQaZsteuvwyeP{|UV~[x}fULocalu^`EbvcdefÁŁǀ2ZstuvwyiU{|k~UNSTag€}fgRename &ZstuvwyiU{|s~UĀ}fkNew Folder &ZstuvwyiU{|{~ƀ}fZstuvwyiU{|~Ȁ}fWRefreshZsteuvwyeP{|~x́ʀ}fVRemoteùEvρсӁՀ2Zstuvwyi{|~́Ѐ}fZstuvwyi{|~ÚҀ}fZstuvwyi{|~́Ԁ}fZstuvwyi{|~́ր}fZsteuvwyeP{|~xځ؀}fVWindowuǁہ々68Ev΁݁2Zstuvwy{|~ځހ}߀XMinimizeQmZstuvwy{|~ڀf}f Zstuvwy{|~ځ}f_Bring All to Front^_NSWindowsMenuZsteuvwyeP{|~x}fTHelpu者Ev2Zstuvwy{|~}XFTP HelpQ?[_NSMainMenuXmainMenuG WmainWin|gx~ !#!%&():H[NSCellClassYNSNumRowsZNSCellSizeYNSNumColsWNSCells[NSProtoCell^NSSelectedCell_NSCellBackgroundColor]NSMatrixFlags_NSIntercellSpacing -D(,fgx|~-..0l_{{12, 22}, {224, 58}}E4v%672 Y7  :;:=,mf]default ports C]NSRadioButton68 Y7  i:;:L,mf_client arbitrates (PORT) Y7  ih;:UoU€f,mf_server arbitrates (PASV)Y{224, 18}V{4, 2}Y   ;:_oh,mfURadio:;deef]?XNSMatrixY%NSMatrixXportTypeijgx|~5nnps n fghu.wl%_{{98, 10}, {84, 32}} Y7  {:~i , m 6868^prefCancelButt(JKLMNOPQRSUn\]'&_{{258, 199}, {280, 174}}[Preferences6c8Ev.i2fgx|nn!Ev!2Ev2_{{2, 2}, {236, 88}}_{{20, 58}, {240, 92}}:<€,0_Data Connection Managment]%gx|~5nn n!_{{182, 10}, {84, 32}} Y7  :$,"m#TSave6868Z{280, 174}YprefPanel*\prefSaveButt,WprogBart.ZremotePathI0ZremoteView24I&6_initialFirstResponderr8[nextKeyView Ӏǁ: ΁< ҁ> @r B  ΁DE_arrangeInFront::; ! !?_NSNibControlConnector # ́GE_performMiniaturize:0 ) vIE_orderFrontStandardAboutPanel: . KEYshowHelp: 4 wME^showPrefPanel:0 : {OEUhide:0 @ QEZterminate:0 F |SE_hideOtherApplications:0 L }UE_unhideAllApplications: Q "WEUcopy: V !YETcut: [ $[EWdelete: ` #]EVpaste: e %_EZselectAll: k 󀹁aE^showConnPanel: q cE[showFtpLog: w 􀹁eE^anonymousConn: } gE\connectConn: iE[cancelConn: qkEc]uploadButton: rmEo_downloadButton: soEv_changePathFromMenu: tqE 􀹁sE[disconnect: euE\localDelete: wE]remoteDelete: yEYprefSave: i{E[prefCancel: d}E_localNewFolder: cE\localRename: E]remoteRename: E_remoteNewFolder: fE]localRefresh: E^remoteRefresh:E `~rV\Pg|o_vU0e}cb^'uC~dap%x!&Gye$E"=6rifsqt#[].xd7$ K`zs|%`3[wn#{doxρ{x7e;~Qс ǁ]րzӁlV؁ÀKɀׁE!+ŀ΁oځqǁڀvcZހ f{Ё_݁ÀIɀ Ձ1Ҁ́23 c:; eUU?E g `~[sP0ouqoo\go[0Pg_pdngU.PPx[gbUpu^P[gg00gUxrnUa[[y[upGPn0V0]&0pPtgirxg`guځ_  v́xcÁ{I~ ́x~ÀEҀ{~x́xf Q~Eǀx ~~~f؁o ׀  E€xdxÁ΀ځÀEx~́ځf€ށ~Ɂ~E `rV\Pg|o_vU0e}cb^'uC~dap%x!&Gye$E"=6rifsqt#[].xd7$ K`zs|0%`3[wn#{doxρ{x7e;~Qс ǁ]րzӁlV؁ÀKɀׁE!+ŀ΁oځqǁڀvcZހ f{Ё_݁ÀIɀ Հ1Ҁ́E j ` k l m n o p q r s t u v w x y z { | } ~  ÁāŁƁǁȁɁʁˁ́́΁ρЁсҁӁԁՁցׁ؁فځہ܁݁ށ߁     _Menu Item (Bring All to Front)^Content View-1_Button Cell (Cancel)_Round Button (<-)_Text Field (21)_Menu Item (remote view)_Pop Up Button Cell (local view)oMenu Item (Rename &)_Menu Item (FTP)_Vertical Scroller]Static Text-1_Button Cell (arrow_right)_Menu Item (Show Log)_Horizontal Scroller_Table View (Name)_Push Button (Connect)ZMenu (FTP)_Table Column (filename)-1_Menu Item (Hide Others)_Table Header View_!Bordered Scroll View (Table View)YPrefPaneloMenu Item (New Folder &)_Menu Item (Local)_Menu Item (About FTP)_Box (Server Address and Port)_Check Box (Anonymous)\Menu (Local)_Horizontal Scroller-1_Text Field Cell-3_Menu Item (local view)_Push Button (Save)_Menu Item (Show All)_Menu Item (Connect...)_Text Field CelloMenu Item (Rename &)-1VMatrix_Menu Item (Help)_Menu Item (Delete)-1_Menu Item (Edit)_Vertical Scroller-2_Text Field Cell (21)_Button Cell (Connect)^Box (Progress)_Text Field Cell-5_Text Field Cell-1_Static Text (Username)[Separator-2[Menu (Help)oMenu Item (New Folder &)-1_Table Header View-1_Button Cell (Anonymous)_Horizontal Progress Indicator[Menu (Edit)_Menu Item (FTP Help)_Menu Item (Window)_Static Text (:)_#Bordered Scroll View (Table View)-1_Button Cell (default ports)_Menu Item (Quit FTP)YSeparator_Button Cell (Save)_Text Field Cell-4_Menu Item (Cut)YConnPanel_Menu Item (Disconnect)WMainWin_Menu Item (Services)_Menu Item (Delete)-2_Text Field (ftp)_Horizontal Scroller-2_Text Field Cell (Username)_Menu Item (Copy)_Button Cell (<-)_&Button Cell (client arbitrates (PORT))_Text Field (localhost)_Push Button (Cancel)-1_Text Field Cell (:)_Menu Item (Refresh)-1]Menu (Window)_Pop Up Button-1_Round Button (arrow_right)_Menu (Services)_Table Column (filename)]Pop Up Button]Static Text-2_Menu Item (Paste)_Vertical Scroller-1_Static Text (Password)\Content View_Menu Item (File)_Box (Data Connection Managment)_ Bordered Scroll View (Text View)_Menu (OtherViews)-1_Push Button (Cancel)_&Button Cell (server arbitrates (PASV))_Text Field Cell (ftp)YConLogWin[Menu (File)_Menu Item (Minimize)_Menu Item (Delete)^Content View-2]Box (Account)[Application_Table View (Name)-1_Menu Item (Remote)_ Pop Up Button Cell (remote view)[Separator-1_Button Cell (Cancel)-1_Text Field Cell (localhost)_Menu Item (Refresh)\File's Owner_Menu Item (Select All)[Separator-3YText View_Secure Text Field_Text Field Cell-2_Text Field Cell (Password)_Menu Item (Preferences...)]Menu (Remote)^Content View-3_Prototype Button Cell (Radio)_Menu Item (Hide FTP)[Static Text_Menu (OtherViews)E i `ҁE m `1ӁE q `po0U|[brn|$fc#w'6}e{n!%xu\tzdpss]vrutg~}"wqy[GEv~=`x.7q K{0d%y^Co#Vzi&e$_x`sr3aP|ހ?Ve؀f(V Aҁo^ρv`wÁǁ-C^7΀+xbl~ǁ\/Fd€z&j 1сH|{!3ÁhE Jpꀒ~5I*LdQcڀ7lځ,ӁNq;)Ɂ +Ɂ9PnЀ.Zր{tK_;R0XxՁ=TŁZ]rof1vźׁx݁E ; ` < = > ? @ A B C D F G H I J K L M N O P Q R S T U V W X Y Z [ \ ] ^ _ ` a b c d e f g h i j k l m n o p q r s t u v w x y z { | } ~  U !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~ÁāŁƁǁȁɁʁˁ́́΁ρЁсҁӁԁՁցׁdEW f7lgN;euR'Kjmk>[csL\%j*9(BD,HvOMoy8UhIJizS 4x9GQ<b?)a:$PXQnw"{z'^  _p`:r ]TF=YoZS@!qtg\A#Ev2E `E `:;͢?^NSIBObjectData#,1:LQVdf"(s    ) 7 E _ k y   - 6 ? H M \ o x    * 4 @ B D F H J L N P U W Y t x 4 @ N [ n v     2 < F P R T V X Z \ ^ ` c e n q s u .8B] ?ACEGIKMOYbk.;FN[ju $+2;@BDFS\ahu} &:LY`}*3:IQ^d  )+-/138:S`it  )6BD]fo|!#%'0357  GIKMNPRoqsuwy!#HJLNPRT]`bd~ &;I[qsuwy{} ')2=JXalu   #%BDFHILNPi/1:?ACEFIKLNPRSU^` )68:<N[]_at)FHJLMPRTn  &(*,8ACLOQS       " + - / 1 3 5 R T V X Y \ ^ ` y !!!!!!$!0!=!^!h!s!!!!!!!!!!!!!!!!!!""""""" """:"["]"_"a"c"e"g"l"""""""""""""""""####<#>#@#B#D#F#O#`#b#d#g#t#############$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$%%%% %%%%%%% %#%&%)%,%/%2%5%8%;%>%A%D%G%J%M%P%S%V%Y%\%_%b%e%h%k%n%q%t%w%z%|%%%%%%%%%%%%%%%%&&&!&#&%&'&4&E&G&I&K&M&X&i&k&m&o&q&&&&&&&&&&&&&&&&&&&&&&&&'' '''''''!'>'@'B'D'E'G'I'`''''''''''''''''''((((((( (8(](q(s(u(w(y({(|(~(((((((((((((())+)-)/)1)3)5)6)8)A)F)U)r)t)v)x)y){)})))))))))))))))********1*R*T*V*X*Z*\*^*g*~****************++++ +!+#+%+>+A+D+G+J+L+d+++++++++++++++++++++,,,, , , ,,',\,^,`,b,d,f,o,q,s,x,,,,,,,,,,,,,,,,,,,,--G-J-L-N-P-R-T-V-^-g-i-{-------------------. .".$.&.).,.-./.2.;.L.O.R.T.V...........................//)/+/-///2/5/7//T/m////////////////0000 0 080;0>0A0D0G0I0K0N0h0p0y0{0000000000000000000001111111(191;1>1@1B1L1]1_1b1d1f1p111111111112222 22222222L2U2X2[2^2a2c2f2i2l2n2w22222222222222233L3h3333344424=4O4Y4^4a4d4g4|4444444444444445555!5$5&5/545=5B5c5z555555555555556666 66666.606365676U6j6l6o6q6s666666666666666667777 777 7-74767?7D7[7h7q7~7777777777777777788'80828C8F8H8K8M8V8Y8\8^8888888888888888888888888999)94979:9?9B9E9G9J9b99999999999999999::: : ::: :/:2:5:8:;:>:A:D:F:o:y:|::::::::::::::::::::::::::;;;;;;;!;+;L;O;R;T;V;X;Z;i;;;;;;;;;;;;;;;;;;;<<<< < <<< >>> >*>->0>2>4>6>8>C>d>g>j>l>n>p>r>}>>>>>>>>>>>>>>>>>>??? ? ??? ?+?.?1?4?7?:?@@@C@E@G@R@T@}@@@@@@@@@@@@@@@@@@@@@@@@@AAAAA9AQAQDQGQTQeQgQjQmQpQ~QQQQQQQQQQQQQQQQQQR R RRRR#R4R6R9RWAWDWGWJWLWNWPWSWUWXW[W]W`WcWfWiWkWmWoWrWuWxW{W~WWWWXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXYYYYYY YYYYYYYY Y#Y%Y(Y+Y.Y1Y3Y6Y9YYAYDYFYIYKYNYPYSYUYXY[Y^YaYcYeYhYjYlYnYqYsYuYwYzY}YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYZZZZZZZZZZZ[[[[ [[[[[[[ [#[&[)[,[/[2[5[8[;[>[A[D[G[J[M[P[S[V[Y[\[_[b[e[h[k[n[q[t[w[z[}[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[\\\\ \ \\\\\\\"\%\(\+\.\1\4\7\:\=\@\C\F\I\L\O\R\U\X\[\^\a\\\\\\] ]3]E]Y]g]]]]]]^^^1^U^_^^^^^___-_F_[_r______``$`;`S`b`v`````aa a@aLacaxaaaaabbb*b4bMbUblbbbbbbcc3cLcbczcccccccdd)dBdOdbdddddeee+eBeWefeteeeeeeff'f4fMfYfcfwfffffggg%g9gBgEgGgJgSgVgXg[gdhhhhhiiiii i iiiiiiii!i$i'i)i,i.i1i4i6i9i忂qA@ftp腅c@@̭фtextBackgroundColorˆ̭ф textColor׆:NSClassSwapper*@#NSSecureTextField`񒅒qA@腅̅ ̭фheaderTextColor׆1@腅1 1˄̭?BY?BY?BYZ@-11Gے---?[ے---?}ٷ59 `ˁˁ+/HI/59 +J2LL҄4JOJOO7PN:JJ=քfilenameC6XBe`@@NameB̭>D1@腅N N˄̭?B`?B`?B`Z@JNṊ?B`?B`?B`ےJJJ??SےJJJ?}ٷPR`ˁˁ+L\]LPR +-ց'&'&+係$LucidaGrande  ^ǁ arrow_right* NSPopUpButton+c+NSPopUpButtonCell1NSMenuItemCell係A@腅dǁK@腖 OtherViewsj local view_popUpItemAction:fi@ike+ c+gA@腅oǁK@腖 OtherViewsr remote viewp܂s+wy y@腅{̅NSProgressIndicatorܰyF NSPSMatrix[12f] yccddcdy &y@腅̅y&y@腅̅>>w BB+Progress̭?L͆yӁӁ-ց'&'&+係<-`*ǁ arrow_left+ rsfdRemote New Folder…DeleteRefresh Rename…MainMenuFilesubmenuAction:File Connect... DisconnectShow LogEditEditCutxCopycPastevDelete Select AllaLocalLocal Rename… New Folder…DeleteRefreshRemoteWindowHelpHelp͠FTP Help? _NSMainMenuFTPFTP ՠ About FTPՠPreferences...ՠ@ՠServicesServices_NSServicesMenuՠ@ՠHide FTPhՠ Hide OthershՠShow Allՠ@ՠQuit FTPq _NSAppleMenuH-w_^I-1-얁ՁTNՖ3--+ߺǁpx PreferencesNSPanelViewNSMatrix>ܒ ::#iiii:::ffffi@@@@@D(係 default ports腅ǁH|[cځځss-,L< ݁\%jrρ*j9(B#D,߁HӁvO*M܁1oy82Uo hI JJizS w4x9 }NÁG.Q篁Tс<^݁bՁ?)a:{Ł$0PXQInׁwǁ"{z ف'^  _ǁ\p`k":Orށ ]Ɂ4TF =fY3opZS@߁Á!]q ݁t糁繁d$g\(A#|IBCocoaFrameworkFTP-0.6/Resources/MainMenu.nib/classes.nib0000664000175000017500000000443313040104062020013 0ustar multixmultix{ IBClasses = ( { ACTIONS = { anonymousConn = id; cancelConn = id; changePathFromMenu = id; connectConn = id; disconnect = id; downloadButton = id; listDoubleClick = id; localDelete = id; localNewFolder = id; localRefresh = id; localRename = id; prefCancel = id; prefSave = id; remoteDelete = id; remoteNewFolder = id; remoteRefresh = id; remoteRename = id; showConnPanel = id; showFtpLog = id; showPrefPanel = id; uploadButton = id; }; CLASS = AppController; LANGUAGE = ObjC; OUTLETS = { buttDownload = NSButton; buttUpload = NSButton; connAccountBox = NSBox; connAddress = NSTextField; connAnon = NSButton; connCancelButt = NSButton; connConnectButt = NSButton; connPass = NSTextField; connPort = NSTextField; connServerBox = NSBox; connUser = NSTextField; connectPanel = NSPanel; infoMessage = NSTextField; infoSize = NSTextField; infoSpeed = NSTextField; localPath = NSPopUpButton; localView = NSTableView; logTextField = NSTextView; logWin = NSWindow; mainMenu = NSMenu; mainWin = NSWindow; portType = NSMatrix; prefCancelButt = NSButton; prefPanel = NSPanel; prefSaveButt = NSButton; progBar = NSProgressIndicator; remotePath = NSPopUpButton; remoteView = NSTableView; }; SUPERCLASS = NSObject; }, {CLASS = FirstResponder; LANGUAGE = ObjC; SUPERCLASS = NSObject; }, {CLASS = fileTransmitParms; LANGUAGE = ObjC; SUPERCLASS = NSObject; } ); IBVersion = 1; }FTP-0.6/Resources/GetName.gorm/0000775000175000017500000000000012650250074015676 5ustar multixmultixFTP-0.6/Resources/GetName.gorm/data.info0000664000175000017500000000027012650250074017463 0ustar multixmultixGNUstep archive000f4240:00000003:00000003:00000000:01GormFilePrefsManager1NSObject%01NSString&%Latest Version0& % Typed StreamFTP-0.6/Resources/GetName.gorm/objects.gorm0000664000175000017500000002452612650250074020226 0ustar multixmultixGNUstep archive000f4240:00000022:00000077:00000000:01GSNibContainer1NSObject01 NSMutableSet1NSSet&01GSWindowTemplate1GSClassSwapper01NSString&% NSPanel1NSPanel1 NSWindow1 NSResponder% ? A C C&% C D/01 NSView% ? A C C  C C&01 NSMutableArray1 NSArray&01 NSTextField1 NSControl% A B  Bh A  Bh A&0 &%0 1NSTextFieldCell1 NSActionCell1NSCell0 &%Name:0 1NSFont%&&&&&&&& &&&&&&%0 1NSColor0 &% NSNamedColorSpace0&%System0&%textBackgroundColor0 0& % textColor01NSBox% B C @  C @&0 &0 % @ @ C   C &0 &00&%Box0%&&&&&&&& &&&&&&%0 0&% System0&% windowBackgroundColor @ @%%01 NSImageView% A B B@ B@  B@ B@&0 &%01 NSImageCell01NSImage B@ B@0 0!&% NSCalibratedWhiteColorSpace 0" &0#1NSBitmapImageRep1 NSImageRep0$&% NSDeviceRGBColorSpace B@ B@%%0%00%1NSData&||II* P8$ BaPd4DF"m4[-E]`.aNL%pjE `X1q F(/9Ɓ1cAȇ6MH4"?ixuv_X`yb1( I?ԉ3bYثci?t?-|KN-g1rZN$o i@IQ9x)I/ьnw[P4 &a(Vۻwήz7SN>^>}9p1#P]7$xQHpy|Y{|=GDPyQqEqk{{aG9朏p;%A,U-HHɖq1pd45hCRSJ& ^f``^T1sEE)7Lfp91b^L&TS%w/68Cq51IVOi0lm n|o3xzħ4DZtamga"F\/RX=GStau?&Avj>N4ܓRjTU-.%46X|\=ρ< E!G=%8buldd$Nkg`gTx57OLzqriH:Dz9beŐ0;IxCč1bCjp@!7  \ @0arP&0PsJR%S@@$ja._R `OJ,0he Id4>0 LPA7f@g}5(.TW |3p@\̀?g bD 60n 61!!da,";!F dcF2.!\R` @  f)h̸ `xa$#,"^R8,A ɖD3anvE Na:a# J.NNa#>2:a n& x @ ! : !BA~` DH+Ф!;DaH0!hyBrRa]0SAAVPAX]^!I#;æa aL8 tAq9!Dblt 6`vDgvi ! H!%.?aFjQ㸵j^EIqSa6T3 !v92~#*P qjo l@lh C 2 6R b d!ErA!D%!1!EVdTZPA)"C:a%!"0+^9Dnd. djFLAL Na Dg(@)0"oA(A-;;1!"Adac c EP1Ɔ;DSahL|Lha E !IaN$/6R#lRVbKb hn  " 4v`(v2CH #9R I'Da=#!!æ"D:aƆS(v<a`2:m2k,όrLj*Lh XV jSa E=Jex=fx#$-n?D6;:h#=xDb0l"Qc\g!drn:u014;:9lM[.!]DSRjaC\.DV0! 8|`; 0A A{of "dh>>HhEX") DPVLgf o d!rjKtA|BER4  0ݲz2hRPRk6; bQXd<!XX$`nfDxUa@ Hab! a:NE4t 5`  a4W!$c 䗄 aBavdD4xP AlRaDAT$<=àPa"*apRx@0]r9H6;Dgږ*vm`g!> :|hp>Q'LDM AHLhgi @JUa1#% an0A1!D`["'l.A$3axBC3gBA8Ang>Ca?sh:J;'D!1 e a@2|hh oZ!$afUVbd$`;!F 0fhbia.^jRo#. z@ZRTu. aDndR#!E̳ ($X%; 6 ApLB aV0c.Nb|-ϭ2VAjD`Ik6dadQchJ`^CNUP$ ݸb.`2<Pg|SOLx Vʁ^Q v$la ݠNc(RaDPZ0лzIa;!1AhTa;oŴ@.P( AZ9E aN`D<8?.jP 4*!   @` `    lv\d&4l@,wBab*T2!<=prI D .B8bLQc6i`b^]#xlPc?!da/ˠ <* 6bO6" 8%"^aPe]a<&yw$Xf?#t\h00 $=s U ^!$ &ݠ#~E^DP$s85?A TXAB8 a)@?D! H B!@ =!=p=E]TF,:SGl0&6!:?:  iG"  PA:=zgPaha"t@(h Ur BP@\ FST. CN)Bǃ l?-w|OgruFo6{b9՛q\Y6$ zN'xn]W`P2j{ۯY[m]Jxg hZ *֮4IA1޿z5zR6OR3e9g:_V3f[8۵}_sRIiTU4O2Q*ݤl͛_ls/F9ؽiQ Y,iɊ %453d#0B9 C(`)šl]Arp|Kfa5e:07 hfBE+JK`(w/ B'.#=@9CX1#dO!@N4 00tR&&&&&&&&&&&&&&%%% B@ B@0&% B B C B@  C B@&0' &%0(0)&%Set Name0*% A&&&&&&&& &&&&&&% 0+1NSButton% C3 A` B A  B A&0, &%0-1 NSButtonCell0.&%Cancel &&&&&&&&&&&&&&%0/&00&&&& &&01% C A` B A  B A&02 &%0304&%Ok0506& %  common_ret&&&&&&&&&&&&&&%07&% 08&090:& % common_retH&&& &&0;% B B< Cz A  Cz A&0< &%0=0>&&&&&&&&& &&&&&&% 0?&%Window0@&%Panel@ @@ B F@ F@%&   D D@0A &0B &0C1NSMutableDictionary1 NSDictionary&0D&%TextFieldCell(3)=0E&%View(1)0F& % ImageCell(0)0G& % TextField(0)0H& % ImageView(0)0I&%Box(0)0J&%TextFieldCell(1)(0K& % ButtonCell(0)-0L& % TextField(3);0M&% NSOwner0N&%GetNameController0O& % Button(0)+0P& % TextField(1)&0Q&%View(0)0R&%Panel0S& % ButtonCell(1)30T& % Button(1)10U&%TextFieldCell(0) 0V &0W1 NSNibConnectorR0X&% NSOwner0Y QR0Z1!NSNibOutletConnectorXR0[&%panel0\ GQ0] UG0^ IQ0_ EI0` HQ0a FH0b PQ0c JP0d OQ0e KO0f TQ0g ST0h LQ0i DL0j1"NSNibControlConnectorD0k&% NSFirst0l& % performClick:0m!XL0n& % textField0o"TX0p& % okPressed:0q"OX0r&%cancelPressed:0s!XP0t& % messageField0u&FTP-0.6/Resources/GetName.gorm/data.classes0000664000175000017500000000053412650250074020170 0ustar multixmultix{ "## Comment" = "Do NOT change this file, Gorm maintains it"; FirstResponder = { Actions = ( "cancelPressed:", "okPressed:" ); Super = NSObject; }; GetNameController = { Actions = ( "okPressed:", "cancelPressed:" ); Outlets = ( panel, textField, messageField ); Super = NSObject; }; }FTP-0.6/Resources/GetName.gorm/FTP_icon_gs.tif0000664000175000017500000006730012650250074020542 0ustar multixmultixMM*00*&.6(1>2R=R)fI)iT\T=2R ' 'Adobe Photoshop 7.02008:05:12 01:09:32 adobe:docid:photoshop:5b2fcc99-214e-11dd-8124-e6ef54ace4d8 8BIM%8BIM com.apple.print.PageFormat.PMHorizontalRes com.apple.print.ticket.creator com.apple.printingmanager com.apple.print.ticket.itemArray com.apple.print.PageFormat.PMHorizontalRes 72 com.apple.print.ticket.client com.apple.printingmanager com.apple.print.ticket.modDate 2008-05-11T21:20:19Z com.apple.print.ticket.stateFlag 0 com.apple.print.PageFormat.PMOrientation com.apple.print.ticket.creator com.apple.printingmanager com.apple.print.ticket.itemArray com.apple.print.PageFormat.PMOrientation 1 com.apple.print.ticket.client com.apple.printingmanager com.apple.print.ticket.modDate 2008-05-11T21:20:19Z com.apple.print.ticket.stateFlag 0 com.apple.print.PageFormat.PMScaling com.apple.print.ticket.creator com.apple.printingmanager com.apple.print.ticket.itemArray com.apple.print.PageFormat.PMScaling 1 com.apple.print.ticket.client com.apple.printingmanager com.apple.print.ticket.modDate 2008-05-11T21:20:19Z com.apple.print.ticket.stateFlag 0 com.apple.print.PageFormat.PMVerticalRes com.apple.print.ticket.creator com.apple.printingmanager com.apple.print.ticket.itemArray com.apple.print.PageFormat.PMVerticalRes 72 com.apple.print.ticket.client com.apple.printingmanager com.apple.print.ticket.modDate 2008-05-11T21:20:19Z com.apple.print.ticket.stateFlag 0 com.apple.print.PageFormat.PMVerticalScaling com.apple.print.ticket.creator com.apple.printingmanager com.apple.print.ticket.itemArray com.apple.print.PageFormat.PMVerticalScaling 1 com.apple.print.ticket.client com.apple.printingmanager com.apple.print.ticket.modDate 2008-05-11T21:20:19Z com.apple.print.ticket.stateFlag 0 com.apple.print.subTicket.paper_info_ticket com.apple.print.PageFormat.PMAdjustedPageRect com.apple.print.ticket.creator com.apple.printingmanager com.apple.print.ticket.itemArray com.apple.print.PageFormat.PMAdjustedPageRect 0.0 0.0 783 559 com.apple.print.ticket.client com.apple.printingmanager com.apple.print.ticket.modDate 2008-05-11T22:49:53Z com.apple.print.ticket.stateFlag 0 com.apple.print.PageFormat.PMAdjustedPaperRect com.apple.print.ticket.creator com.apple.printingmanager com.apple.print.ticket.itemArray com.apple.print.PageFormat.PMAdjustedPaperRect -18 -18 824 577 com.apple.print.ticket.client com.apple.printingmanager com.apple.print.ticket.modDate 2008-05-11T22:49:53Z com.apple.print.ticket.stateFlag 0 com.apple.print.PaperInfo.PMPaperName com.apple.print.ticket.creator com.apple.print.pm.PostScript com.apple.print.ticket.itemArray com.apple.print.PaperInfo.PMPaperName iso-a4 com.apple.print.ticket.client com.apple.print.pm.PostScript com.apple.print.ticket.modDate 2000-07-28T22:57:04Z com.apple.print.ticket.stateFlag 1 com.apple.print.PaperInfo.PMUnadjustedPageRect com.apple.print.ticket.creator com.apple.print.pm.PostScript com.apple.print.ticket.itemArray com.apple.print.PaperInfo.PMUnadjustedPageRect 0.0 0.0 783 559 com.apple.print.ticket.client com.apple.printingmanager com.apple.print.ticket.modDate 2008-05-11T21:20:19Z com.apple.print.ticket.stateFlag 0 com.apple.print.PaperInfo.PMUnadjustedPaperRect com.apple.print.ticket.creator com.apple.print.pm.PostScript com.apple.print.ticket.itemArray com.apple.print.PaperInfo.PMUnadjustedPaperRect -18 -18 824 577 com.apple.print.ticket.client com.apple.printingmanager com.apple.print.ticket.modDate 2008-05-11T21:20:19Z com.apple.print.ticket.stateFlag 0 com.apple.print.PaperInfo.ppd.PMPaperName com.apple.print.ticket.creator com.apple.print.pm.PostScript com.apple.print.ticket.itemArray com.apple.print.PaperInfo.ppd.PMPaperName A4 com.apple.print.ticket.client com.apple.print.pm.PostScript com.apple.print.ticket.modDate 2000-07-28T22:57:04Z com.apple.print.ticket.stateFlag 1 com.apple.print.ticket.APIVersion 00.20 com.apple.print.ticket.privateLock com.apple.print.ticket.type com.apple.print.PaperInfoTicket com.apple.print.ticket.APIVersion 00.20 com.apple.print.ticket.privateLock com.apple.print.ticket.type com.apple.print.PageFormatTicket 8BIMxHH/8Ag{HH(dh 8BIMHH8BIM&?8BIM Transparency8BIM Transparency8BIMd8BIM8BIM x8BIM8BIM 8BIM 8BIM' 8BIMH/fflff/ff2Z5-8BIMp8BIM8BIM8BIM@@8BIM8BIMY00icon_computer_disk00nullboundsObjcRct1Top longLeftlongBtomlong0Rghtlong0slicesVlLsObjcslicesliceIDlonggroupIDlongoriginenum ESliceOrigin autoGeneratedTypeenum ESliceTypeImg boundsObjcRct1Top longLeftlongBtomlong0Rghtlong0urlTEXTnullTEXTMsgeTEXTaltTagTEXTcellTextIsHTMLboolcellTextTEXT horzAlignenumESliceHorzAligndefault vertAlignenumESliceVertAligndefault bgColorTypeenumESliceBGColorTypeNone topOutsetlong leftOutsetlong bottomOutsetlong rightOutsetlong8BIM8BIM8BIM G00+JFIFHH Adobe_CMAdobed            00"?   3!1AQa"q2B#$Rb34rC%Scs5&DTdE£t6UeuF'Vfv7GWgw5!1AQaq"2B#R3$brCScs4%&5DTdEU6teuFVfv'7GWgw ?D.Qe+iq BրkZ豥'o mCLj3D $1Zַo76SMS[EyXbGcfms,wp}vmV\}-:9ssek{^ޙozlXB'.ue6*x\ְMRSEv.5:/mo.rįcm `vìm`{@Cv'ݠܡU/ޓZOۈ͹,c1ShvNOKũ<̷4{\]I{CCB\|V'3Ä& GsIiVÚm2糧,/=+#*̭5{KK{K}Kim c/W﬚g9u6KJ@5+$N8BIM!UAdobe PhotoshopAdobe Photoshop 7.0 P8$ BaPd4DDR~?]y<7 -Au`0#_@@g\& >o4ìV;%KdÁ2o@ dp4z@|?ywh@ .Q5- —:[  ER,b3'`h0 ?0'b !!끁 ,onBH;";!wdZJ5AB 8`$kG ɭHF0QK<ι!l]ZXHR(is6PZL /@h=D!6ሬwlN ;,~<'ӺBȤ  $gy'ۺL& ně`Fà bLS%OD]C83" x'+U Á\x|$x A4!ah-)$q|nB =q 0!Tdm8O8h-lw0 U`)W* \)"nPR`$#q8M%Dwf쐀 0praH3 :80 +ǚ K A%8(:.xCQGv^Ixc  d5d "55A4 3[R@R6h,@@DZ1)F4GRF>B12N#P#;ean~&@6NjMu< bT?& >>AJ,6Ab`~v(,Aj=CeZdF`1 `A2'Ί&L tL!>:B1'D'T 2 !vW Z ʤ0A*AB&~!p!`f/HgG (:Zde&+ۂ쪆,0MF͢!O @rʎPNzP$<,`aux H ` !r=5P v 2Br ~>:p:40$@C*ʡQa%&\#Б$h'}'Ea޶A|Jv+{$_jѠK:a 1py@b @ j4J,A0~ "$N8e&82##2\/D<oA6XCs$:av^>J:FPOAB*RpmldT e60Az .   ` AJ0Ab6,](\HSιeOƆ$?Me$n!5#J 8.Q<,r~FFC= `!\F&FLa\`2ad;aN@X FP2P2. *D:@XC0d 6P"46]OF2̪DLG26`*QPbhi3HOc 4!|`x ! ,@JT*: ho4|< Z NΉf +InYc./BQت+,>] Rc::%:AOJ<NaDe:;RaƤp!KX`` `> <|E$1 ?_U2::zD24\$dJDjK8D{QAF6'xAra2 0@ &@rl:kfscZ3`gD&jlB%궠~'v VJZ!!İ taOî$NT 3cUToᐶ,&ZCa I V@bEbmTN#`JD,D漌Z͑ZC`Z D.`Wzʫfc2E @}A|+diC!20jʤZGG5*!>#4]ima, J#a'Fƶ)lp Dab+ J0ANhJ4 ` lZvj d`df#2 2P0hkaZhqQAHr´3 l"R'm:f.Z0bʢLj<"3dV<*O.2!z ((H&x%` P <dxE!u0c Ȯs>R"’a$D`E:OBZCc|kq822ra] Od3+*aZ%`v^0"!ИQ\VH gaQ p!!&xᲶ aDn@`@0Րh P!GvJ6a^]T#w3Eb=AV&dF%:o;V;kHbDnr'L&#!`N%7a`n`v4=|NDnܪ kd `pTe)cê2c {u2"T$x.JF`bgRH!<<%;>dn=rDXrOnw<`br&wC07A'$@Q\UC`n,F!p!f ;CDJ\a3a%\DXP9yOS56OTjU:V +`X0?/w=Ȱ}%f̻òֿ͠grðpbUSOiݾ̕r޾ZREK6 jw޷R_KE@mϢyี][J7X p¯߾viX6Se蛲¯w俾siU0Ilٮ|ĿtfR,=cϽݠoƹzfX0Axߪ߭rʬhZ9H.}Ķ]\J=Jyƕɤ{hQSgp̰ͤfn}ÉװǫyijgČȻfkuzÍѹݹ٫ޛȼ٫iǥ^=p٬ànfjrگCl˸v忞Ÿ湟ߡ껦񪖦²똏e壥䡣鰪ۀףḌouۿx↯١䣀ͬͨmZᅭ۽zyѰԨiUnۿ͑㆜züߏ¹dӶrȩ۾ȀœˋQ(@WꜾڵҰJI]Nɱհͭ}_Xiֳ~d^[^o}}ouvƩ|{j]c`OXeù殭䛹ǽőȯ៼Ʒ⤧ūƜ¹дޖίϵޗ½դʱĚ̼֑õ}ڽɽŤёtѮĪБslŬʯ|耗䷚׾´׼خͺê̿ʵyԲ÷µȐ𞓌tnno߱īƵˊǩƴֹ߾ȋƦY{ëɳ̴ݹ\ϱ﹀ߠͳޠƭޠȱ򑒦¼ޠ艤¼ޠҾ¼ޠѽԬ¼ޠнĶᡷ¼ޠǹ¼ޠij¼ޠ¼ޠƶޠūżޠ͆vޠ͉϶ܹޠ{cۨٗ÷{cۨ~ϭ_I{cۨ{}{cڧ[ȓ{cϦ{cƿװ{cǣ{cbߛ檪{cƯjqʻt{eʵ}ʩ٧gW{kaïuw̰eQkީ{lkggBw~ops\K3o~˾ŨFfC>[\WrэP*>TNypw_q^NK_NHpllw-ƶƿոL^~(o̧ƸMZyjOŻͮfOpˬeCٺ㬮ƹͲcihk~l쿮Ҹہ9FТ\RXDђdZո̑vďΙ炶פΙҜ䷙|”拉¶պ̿˩ٹطlܻᙶԣλР͠Рǯʱϣ𮬽ͶѝߨͶӢֹͶ՗˶ӣܳ֬¿ȹԙ̺҆t҉Ҹܸ8BIMLMsk28BIMPattFTP-0.6/Resources/GetName.nib/0000775000175000017500000000000013040104062015467 5ustar multixmultixFTP-0.6/Resources/GetName.nib/info.nib0000664000175000017500000000076113040104062017120 0ustar multixmultix IBDocumentLocation 168 85 356 240 0 0 1440 938 IBFramework Version 489.0 IBOldestOS 1 IBOpenObjects 6 IBSystem Version 8S165 FTP-0.6/Resources/GetName.nib/keyedobjects.nib0000664000175000017500000001565113040104062020644 0ustar multixmultixbplist00 Y$archiverX$versionT$topX$objects_NSKeyedArchiver ]IB.objectdata 156<=AEPXfmn !89<=@JQR]bcfkl{|},:ABCDEFGHI>JKLMNOPQTWtU$null  !"#$%&'()*+,-./0_NSObjectsValues_NSAccessibilityConnectors_NSClassesValuesZNSOidsKeys[NSNamesKeys]NSClassesKeys_NSAccessibilityOidsValues\NSOidsValues_NSVisibleWindowsV$class]NSConnections]NSNamesValues]NSObjectsKeys_NSAccessibilityOidsKeys[NSFramework]NSFontManagerYNSNextOidVNSRootrstl"234[NSClassName_GetNameController789:X$classesZ$classname:;^NSCustomObjectXNSObject_IBCocoaFramework>?@ZNS.objects78BCCD;\NSMutableSetUNSSet>FOGHIJKLMN )07egj]QRSTUV0]NSDestinationWNSLabelXNSSource YZ[\]^__abcde_NSNextResponder[NSSuperviewWNSFrameYNSEnabledXNSvFlagsVNSCell  gYhi.klZNSSubviews[NSFrameSize=^__{{165, 12}, {82, 32}}opqrstuvwxyz{||~T_NSKeyEquivalent_NSAlternateImageYNSSupportZNSContents]NSControlView^NSButtonFlags2_NSPeriodicInterval]NSButtonFlags_NSPeriodicDelay[NSCellFlags_NSAlternateContents\NSCellFlags2 @VCancelVNSSizeVNSNameXNSfFlags"AP\LucidaGrande78;VNSFontPYNS.string78;_NSMutableStringXNSString78^;\NSButtonCell]%NSButtonCell\NSActionCell78;XNSButtonYNSControlVNSView[NSResponder\cancelButton78;_NSNibOutletConnector^NSNibConnectorQRSV0(YZ[\]^__bc  '_{{12, 58}, {60, 17}}qrsxz|_NSBackgroundColor[NSTextColor#&@UName:WNSColor[NSColorName\NSColorSpace]NSCatalogName! "VSystem\controlColorWNSWhiteK0.66666669"78Ƣ;΀%$"_controlTextColorB0"78^;_NSTextFieldCell78;[NSTextField\%NSTextFieldZlabelFieldQRSV0*/YZ[\]^__bc + ',_{{80, 115}, {248, 48}}qrsxzÀ#.-*&XSet Name"A\messageFieldQRSV016YZ[\]^__ bcd 2 3_{{247, 12}, {81, 32}}opqrstuvwxyz||541ROkQ XokButtonQRSV08d"#$%&'()*+,-./0123_567_NSWindowStyleMask_NSWindowBackingYNSMinSize]NSWindowTitle]NSWindowClass\NSWindowRect\NSScreenRectYNSMaxSize\NSWindowViewYNSWTFlags[NSViewClassa:;9`b pxc<_{{85, 369}, {345, 183}}:UPanelWNSPanel>TView>AOTDFG *>FM1]YZ[\]^__MbcP ? '@_{{72, 55}, {250, 22}}qrsSxzTU|Db[\_NSDrawsBackgroundAD> &qA@^_΀CB"_textBackgroundColordB1"h΀%E"YtextColormYZno[pqrs__vwxyz-_NSTitlePosition\NSBorderType[NSTitleCellYNSOffsets]NSTransparentYNSBoxType IGHL_{{-1, 91}, {346, 5}}V{0, 0}qrxzT|sAKJ&SBoxM0 0.80000001"78;UNSBoxYZ[\]^__bcb[NSDragTypesZNSEditable U \VN >@OPQRST_Apple PDF pasteboard type_1NeXT Encapsulated PostScript v1.2 pasteboard type_NeXT TIFF v4.0 pasteboard type_NSFilenamesPboardType_Apple PICT pasteboard type_Apple PNG pasteboard type_{{-1, 107}, {82, 64}}rxzssysWNSScaleWNSStyleZNSAnimatesWNSAlignW[2^NSResourceNameYZXWNSImage_NSApplicationIcon78;_NSCustomResource_%NSCustomResource78^;[NSImageCell\%NSImageCell78;[NSImageView78ã;^NSMutableArrayWNSArrayZ{345, 183}78;_{{0, 0}, {1440, 938}}Z{213, 129}Z{inf, inf}78͢;_NSWindowTemplateUpanelQRSDV0>fYtextFieldQRS0Thi ^cancelPressed:78ݣ;_NSNibControlConnectorQRS0ki1ZokPressed:>_PGDeTF8, @*M> mo 13VFqY[.ln__{{2, 2}, {125, 1}}23p]NSApplication78Ģ;>0D____TF0__G_*8> F 1M q>_PGDeTF08, @*M> mo 13VFq>-./0123456789:;<=>?uvwxyz{|}~q_Text Field Cell (Name:)_Text Field Cell (Set Name)\Content View_Text Field Cell_Static Text (Name:)_Static Text (Set Name)_Image View (NSApplicationIcon)ZText Field_Button Cell (Cancel)[Application_Push Button (Cancel)_Push Button (Ok)_Button Cell (Ok)_Image Cell (NSApplicationIcon)_Horizontal Line\File's Owner>Rq>Uq>XeMJGTLKNH_F0DPIG83m o*gV0M e,7j1 F>@) q>uvwxyz{|}~q     ! >O]>q>q78;^NSIBObjectData#,1:LQVdf :LWcq#%')+-/13579;=?ACEGP\^`t}!#%'8FNWY[]_|GYlv  "$)0AHOX]_adqz  *1=JSZq !#%*0EMYftvxz|~      + 4 A M Z e v x z | ~     / 1 3 5 7 T V X Z [ ] _ w  & 8 B P ^ k x      ! # % ' ) F H J L M O Q i       ) R d q } &,Q]hjlnoqsuv #@\t(<ENZgp{/1357ARTVXZiry/8:<JSXa 02468:<>@BDFHJLNPRTVp*ATg   !#%')+-/135>uwy{} !FTP-0.6/Resources/GetName.nib/objects.nib0000664000175000017500000000506313040104062017616 0ustar multixmultix typedstream@NSIBObjectDataNSObjectNSCustomObject)@@NSString+GetNameControlleriNSWindowTemplate iiffffi@@@@@cUqYpxNSMutableStringPanelNSPanelViewNSView) NSResponder @@@@ffffffffNSMutableArrayNSArrayNSButton NSControl) R R icc@ NSButtonCell? NSActionCellNSCellAii@@@@CancelNSFont$[36c]LucidaGrandef ci: ssii@@@@@@ NSTextFieldPs00NSTextFieldCell>@Set Name$LucidaGrandec@@NSColor@@@System controlColorff?*controlTextColor:H7qA@textBackgroundColor textColor :<<@Name:ƲNSBox*[ZZff@@cccBox?L͆ NSImageView NSMutableSetNSSetIApple PDF pasteboard type1NeXT Encapsulated PostScript v1.2 pasteboard typeNeXT TIFF v4.0 pasteboard typeNSFilenamesPboardTypeApple PICT pasteboard typeApple PNG pasteboard typekR@R@ NSImageCell)NSCustomResource)NSImageNSApplicationIconiii Q Q Ok߯@ YYffffՁƖƟΟ}}ɖ NSApplicationߟߖΖɟPanelDŽText Field Cell (Name:)Text Field Cell (Set Name) Content ViewText Field CellƄStatic Text (Name:)Static Text (Set Name)΄Image View (NSApplicationIcon) Text FieldButton Cell (Cancel)ㄘView䄘 ApplicationPush Button (Cancel)߄Push Button (Ok)Button Cell (Ok)لImage Cell (NSApplicationIcon)ɄHorizontal Line File's OwnerѼNSNibOutletConnectorτNSNibConnector cancelButtonƄ labelField messageField߄okButtonpanel textFieldNSNibControlConnectorcancelPressed: ߕ okPressed:@i Ĩı ĥij  ğ ĕ!Ŀ "IBCocoaFrameworkFTP-0.6/Resources/GetName.nib/classes.nib0000664000175000017500000000112713040104062017617 0ustar multixmultix{ IBClasses = ( {CLASS = FirstResponder; LANGUAGE = ObjC; SUPERCLASS = NSObject; }, { ACTIONS = {cancelPressed = id; okPressed = id; }; CLASS = GetNameController; LANGUAGE = ObjC; OUTLETS = { cancelButton = NSButton; labelField = NSTextField; messageField = NSTextField; okButton = NSButton; panel = NSPanel; textField = NSTextField; }; SUPERCLASS = NSObject; } ); IBVersion = 1; }FTP-0.6/Resources/English.lproj/0000775000175000017500000000000013040104062016116 5ustar multixmultixFTP-0.6/Resources/English.lproj/Localizable.strings0000664000175000017500000000105113040104062021747 0ustar multixmultix/* menu */ "Local" = "Local"; "Remote" = "Remote"; "Rename..." = "Rename..."; "New Folder..." = "New Folder..."; "Delete" = "Delete"; "Refresh" = "Refresh"; /* Connection panel */ "Server Address and Port" = "Server Address and Port"; "Account" = "Account"; "Connect" = "Connect"; "Anonymous" = "Anonymous"; "Connect (action)" = "Connect"; /* main window */ "local view" = "Local View"; "remote view" = "Remote View"; "Name" = "Name"; /* Log */ "Connection Log" = "Connection Log"; /* Get Name */ "Name:" = "Name:"; "Cancel" = "Cancel"; "Ok" = "Ok";FTP-0.6/Resources/arrow_left.tiff0000664000175000017500000000211612650250074016431 0ustar multixmultixMM*     t(R/---ҮQwLLLiii cccLLL <"""j<""" cccLLL jjj vLLL/---ҮQ FTP-0.6/Resources/FTP_icon_gs.tif0000664000175000017500000006730012650250074016257 0ustar multixmultixMM*00*&.6(1>2R=R)fI)iT\T=2R ' 'Adobe Photoshop 7.02008:05:12 01:09:32 adobe:docid:photoshop:5b2fcc99-214e-11dd-8124-e6ef54ace4d8 8BIM%8BIM com.apple.print.PageFormat.PMHorizontalRes com.apple.print.ticket.creator com.apple.printingmanager com.apple.print.ticket.itemArray com.apple.print.PageFormat.PMHorizontalRes 72 com.apple.print.ticket.client com.apple.printingmanager com.apple.print.ticket.modDate 2008-05-11T21:20:19Z com.apple.print.ticket.stateFlag 0 com.apple.print.PageFormat.PMOrientation com.apple.print.ticket.creator com.apple.printingmanager com.apple.print.ticket.itemArray com.apple.print.PageFormat.PMOrientation 1 com.apple.print.ticket.client com.apple.printingmanager com.apple.print.ticket.modDate 2008-05-11T21:20:19Z com.apple.print.ticket.stateFlag 0 com.apple.print.PageFormat.PMScaling com.apple.print.ticket.creator com.apple.printingmanager com.apple.print.ticket.itemArray com.apple.print.PageFormat.PMScaling 1 com.apple.print.ticket.client com.apple.printingmanager com.apple.print.ticket.modDate 2008-05-11T21:20:19Z com.apple.print.ticket.stateFlag 0 com.apple.print.PageFormat.PMVerticalRes com.apple.print.ticket.creator com.apple.printingmanager com.apple.print.ticket.itemArray com.apple.print.PageFormat.PMVerticalRes 72 com.apple.print.ticket.client com.apple.printingmanager com.apple.print.ticket.modDate 2008-05-11T21:20:19Z com.apple.print.ticket.stateFlag 0 com.apple.print.PageFormat.PMVerticalScaling com.apple.print.ticket.creator com.apple.printingmanager com.apple.print.ticket.itemArray com.apple.print.PageFormat.PMVerticalScaling 1 com.apple.print.ticket.client com.apple.printingmanager com.apple.print.ticket.modDate 2008-05-11T21:20:19Z com.apple.print.ticket.stateFlag 0 com.apple.print.subTicket.paper_info_ticket com.apple.print.PageFormat.PMAdjustedPageRect com.apple.print.ticket.creator com.apple.printingmanager com.apple.print.ticket.itemArray com.apple.print.PageFormat.PMAdjustedPageRect 0.0 0.0 783 559 com.apple.print.ticket.client com.apple.printingmanager com.apple.print.ticket.modDate 2008-05-11T22:49:53Z com.apple.print.ticket.stateFlag 0 com.apple.print.PageFormat.PMAdjustedPaperRect com.apple.print.ticket.creator com.apple.printingmanager com.apple.print.ticket.itemArray com.apple.print.PageFormat.PMAdjustedPaperRect -18 -18 824 577 com.apple.print.ticket.client com.apple.printingmanager com.apple.print.ticket.modDate 2008-05-11T22:49:53Z com.apple.print.ticket.stateFlag 0 com.apple.print.PaperInfo.PMPaperName com.apple.print.ticket.creator com.apple.print.pm.PostScript com.apple.print.ticket.itemArray com.apple.print.PaperInfo.PMPaperName iso-a4 com.apple.print.ticket.client com.apple.print.pm.PostScript com.apple.print.ticket.modDate 2000-07-28T22:57:04Z com.apple.print.ticket.stateFlag 1 com.apple.print.PaperInfo.PMUnadjustedPageRect com.apple.print.ticket.creator com.apple.print.pm.PostScript com.apple.print.ticket.itemArray com.apple.print.PaperInfo.PMUnadjustedPageRect 0.0 0.0 783 559 com.apple.print.ticket.client com.apple.printingmanager com.apple.print.ticket.modDate 2008-05-11T21:20:19Z com.apple.print.ticket.stateFlag 0 com.apple.print.PaperInfo.PMUnadjustedPaperRect com.apple.print.ticket.creator com.apple.print.pm.PostScript com.apple.print.ticket.itemArray com.apple.print.PaperInfo.PMUnadjustedPaperRect -18 -18 824 577 com.apple.print.ticket.client com.apple.printingmanager com.apple.print.ticket.modDate 2008-05-11T21:20:19Z com.apple.print.ticket.stateFlag 0 com.apple.print.PaperInfo.ppd.PMPaperName com.apple.print.ticket.creator com.apple.print.pm.PostScript com.apple.print.ticket.itemArray com.apple.print.PaperInfo.ppd.PMPaperName A4 com.apple.print.ticket.client com.apple.print.pm.PostScript com.apple.print.ticket.modDate 2000-07-28T22:57:04Z com.apple.print.ticket.stateFlag 1 com.apple.print.ticket.APIVersion 00.20 com.apple.print.ticket.privateLock com.apple.print.ticket.type com.apple.print.PaperInfoTicket com.apple.print.ticket.APIVersion 00.20 com.apple.print.ticket.privateLock com.apple.print.ticket.type com.apple.print.PageFormatTicket 8BIMxHH/8Ag{HH(dh 8BIMHH8BIM&?8BIM Transparency8BIM Transparency8BIMd8BIM8BIM x8BIM8BIM 8BIM 8BIM' 8BIMH/fflff/ff2Z5-8BIMp8BIM8BIM8BIM@@8BIM8BIMY00icon_computer_disk00nullboundsObjcRct1Top longLeftlongBtomlong0Rghtlong0slicesVlLsObjcslicesliceIDlonggroupIDlongoriginenum ESliceOrigin autoGeneratedTypeenum ESliceTypeImg boundsObjcRct1Top longLeftlongBtomlong0Rghtlong0urlTEXTnullTEXTMsgeTEXTaltTagTEXTcellTextIsHTMLboolcellTextTEXT horzAlignenumESliceHorzAligndefault vertAlignenumESliceVertAligndefault bgColorTypeenumESliceBGColorTypeNone topOutsetlong leftOutsetlong bottomOutsetlong rightOutsetlong8BIM8BIM8BIM G00+JFIFHH Adobe_CMAdobed            00"?   3!1AQa"q2B#$Rb34rC%Scs5&DTdE£t6UeuF'Vfv7GWgw5!1AQaq"2B#R3$brCScs4%&5DTdEU6teuFVfv'7GWgw ?D.Qe+iq BրkZ豥'o mCLj3D $1Zַo76SMS[EyXbGcfms,wp}vmV\}-:9ssek{^ޙozlXB'.ue6*x\ְMRSEv.5:/mo.rįcm `vìm`{@Cv'ݠܡU/ޓZOۈ͹,c1ShvNOKũ<̷4{\]I{CCB\|V'3Ä& GsIiVÚm2糧,/=+#*̭5{KK{K}Kim c/W﬚g9u6KJ@5+$N8BIM!UAdobe PhotoshopAdobe Photoshop 7.0 P8$ BaPd4DDR~?]y<7 -Au`0#_@@g\& >o4ìV;%KdÁ2o@ dp4z@|?ywh@ .Q5- —:[  ER,b3'`h0 ?0'b !!끁 ,onBH;";!wdZJ5AB 8`$kG ɭHF0QK<ι!l]ZXHR(is6PZL /@h=D!6ሬwlN ;,~<'ӺBȤ  $gy'ۺL& ně`Fà bLS%OD]C83" x'+U Á\x|$x A4!ah-)$q|nB =q 0!Tdm8O8h-lw0 U`)W* \)"nPR`$#q8M%Dwf쐀 0praH3 :80 +ǚ K A%8(:.xCQGv^Ixc  d5d "55A4 3[R@R6h,@@DZ1)F4GRF>B12N#P#;ean~&@6NjMu< bT?& >>AJ,6Ab`~v(,Aj=CeZdF`1 `A2'Ί&L tL!>:B1'D'T 2 !vW Z ʤ0A*AB&~!p!`f/HgG (:Zde&+ۂ쪆,0MF͢!O @rʎPNzP$<,`aux H ` !r=5P v 2Br ~>:p:40$@C*ʡQa%&\#Б$h'}'Ea޶A|Jv+{$_jѠK:a 1py@b @ j4J,A0~ "$N8e&82##2\/D<oA6XCs$:av^>J:FPOAB*RpmldT e60Az .   ` AJ0Ab6,](\HSιeOƆ$?Me$n!5#J 8.Q<,r~FFC= `!\F&FLa\`2ad;aN@X FP2P2. *D:@XC0d 6P"46]OF2̪DLG26`*QPbhi3HOc 4!|`x ! ,@JT*: ho4|< Z NΉf +InYc./BQت+,>] Rc::%:AOJ<NaDe:;RaƤp!KX`` `> <|E$1 ?_U2::zD24\$dJDjK8D{QAF6'xAra2 0@ &@rl:kfscZ3`gD&jlB%궠~'v VJZ!!İ taOî$NT 3cUToᐶ,&ZCa I V@bEbmTN#`JD,D漌Z͑ZC`Z D.`Wzʫfc2E @}A|+diC!20jʤZGG5*!>#4]ima, J#a'Fƶ)lp Dab+ J0ANhJ4 ` lZvj d`df#2 2P0hkaZhqQAHr´3 l"R'm:f.Z0bʢLj<"3dV<*O.2!z ((H&x%` P <dxE!u0c Ȯs>R"’a$D`E:OBZCc|kq822ra] Od3+*aZ%`v^0"!ИQ\VH gaQ p!!&xᲶ aDn@`@0Րh P!GvJ6a^]T#w3Eb=AV&dF%:o;V;kHbDnr'L&#!`N%7a`n`v4=|NDnܪ kd `pTe)cê2c {u2"T$x.JF`bgRH!<<%;>dn=rDXrOnw<`br&wC07A'$@Q\UC`n,F!p!f ;CDJ\a3a%\DXP9yOS56OTjU:V +`X0?/w=Ȱ}%f̻òֿ͠grðpbUSOiݾ̕r޾ZREK6 jw޷R_KE@mϢyี][J7X p¯߾viX6Se蛲¯w俾siU0Ilٮ|ĿtfR,=cϽݠoƹzfX0Axߪ߭rʬhZ9H.}Ķ]\J=Jyƕɤ{hQSgp̰ͤfn}ÉװǫyijgČȻfkuzÍѹݹ٫ޛȼ٫iǥ^=p٬ànfjrگCl˸v忞Ÿ湟ߡ껦񪖦²똏e壥䡣鰪ۀףḌouۿx↯١䣀ͬͨmZᅭ۽zyѰԨiUnۿ͑㆜züߏ¹dӶrȩ۾ȀœˋQ(@WꜾڵҰJI]Nɱհͭ}_Xiֳ~d^[^o}}ouvƩ|{j]c`OXeù殭䛹ǽőȯ៼Ʒ⤧ūƜ¹дޖίϵޗ½դʱĚ̼֑õ}ڽɽŤёtѮĪБslŬʯ|耗䷚׾´׼خͺê̿ʵyԲ÷µȐ𞓌tnno߱īƵˊǩƴֹ߾ȋƦY{ëɳ̴ݹ\ϱ﹀ߠͳޠƭޠȱ򑒦¼ޠ艤¼ޠҾ¼ޠѽԬ¼ޠнĶᡷ¼ޠǹ¼ޠij¼ޠ¼ޠƶޠūżޠ͆vޠ͉϶ܹޠ{cۨٗ÷{cۨ~ϭ_I{cۨ{}{cڧ[ȓ{cϦ{cƿװ{cǣ{cbߛ檪{cƯjqʻt{eʵ}ʩ٧gW{kaïuw̰eQkީ{lkggBw~ops\K3o~˾ŨFfC>[\WrэP*>TNypw_q^NK_NHpllw-ƶƿոL^~(o̧ƸMZyjOŻͮfOpˬeCٺ㬮ƹͲcihk~l쿮Ҹہ9FТ\RXDђdZո̑vďΙ炶פΙҜ䷙|”拉¶պ̿˩ٹطlܻᙶԣλР͠Рǯʱϣ𮬽ͶѝߨͶӢֹͶ՗˶ӣܳ֬¿ȹԙ̺҆t҉Ҹܸ8BIMLMsk28BIMPattFTP-0.6/arrow_right.tiff0000664000175000017500000000211612650250074014642 0ustar multixmultixMM*     t(RQ---/LLLw iii LLLccc """<j"""< LLLccc jjjLLLvQ---/ FTP-0.6/FTP.xcodeproj/0000775000175000017500000000000013151733471014072 5ustar multixmultixFTP-0.6/FTP.xcodeproj/project.pbxproj0000775000175000017500000004724613151733471017166 0ustar multixmultix// !$*UTF8*$! { archiveVersion = 1; classes = { }; objectVersion = 42; objects = { /* Begin PBXBuildFile section */ 8531288D1767CADA00F56C92 /* GetNameController.h in Headers */ = {isa = PBXBuildFile; fileRef = 8531288B1767CADA00F56C92 /* GetNameController.h */; }; 8531288E1767CADB00F56C92 /* GetNameController.m in Sources */ = {isa = PBXBuildFile; fileRef = 8531288C1767CADA00F56C92 /* GetNameController.m */; }; 8534AFAA1DAB81DC005F5ECD /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = 8534AFA81DAB81DC005F5ECD /* Localizable.strings */; }; 8570ECE01DA1916700099FC2 /* GetName.nib in Resources */ = {isa = PBXBuildFile; fileRef = 8570ECDE1DA1916700099FC2 /* GetName.nib */; }; 8570ECE11DA1916700099FC2 /* MainMenu.nib in Resources */ = {isa = PBXBuildFile; fileRef = 8570ECDF1DA1916700099FC2 /* MainMenu.nib */; }; 8570ECE31DA1917D00099FC2 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 8570ECE21DA1917D00099FC2 /* InfoPlist.strings */; }; 85E8F2AD16EFCF6C00E03CA9 /* AppController.h in Headers */ = {isa = PBXBuildFile; fileRef = F5F5F93707FD8CAD01A80101 /* AppController.h */; }; 85E8F2AE16EFCF6C00E03CA9 /* ftpclient.h in Headers */ = {isa = PBXBuildFile; fileRef = F5F5F93907FD8CAD01A80101 /* ftpclient.h */; }; 85E8F2AF16EFCF6C00E03CA9 /* localclient.h in Headers */ = {isa = PBXBuildFile; fileRef = F56A03FD080AC71101A80101 /* localclient.h */; }; 85E8F2B016EFCF6C00E03CA9 /* fileTable.h in Headers */ = {isa = PBXBuildFile; fileRef = F5BE3AF6080C6A3601A80101 /* fileTable.h */; }; 85E8F2B116EFCF6C00E03CA9 /* fileElement.h in Headers */ = {isa = PBXBuildFile; fileRef = F5C84D6008142DF201A80101 /* fileElement.h */; }; 85E8F2B216EFCF6C00E03CA9 /* client.h in Headers */ = {isa = PBXBuildFile; fileRef = F5EFB6470818FE6E01A80101 /* client.h */; }; 85E8F2B616EFCF6C00E03CA9 /* arrow_right.tiff in Resources */ = {isa = PBXBuildFile; fileRef = F5C0879F08A0C47B01A8012F /* arrow_right.tiff */; }; 85E8F2B716EFCF6C00E03CA9 /* arrow_left.tiff in Resources */ = {isa = PBXBuildFile; fileRef = F5C087A108A0C4AF01A8012F /* arrow_left.tiff */; }; 85E8F2B816EFCF6C00E03CA9 /* FTP_icon_osx.icns in Resources */ = {isa = PBXBuildFile; fileRef = 85FC29710DD7B28300A80101 /* FTP_icon_osx.icns */; }; 85E8F2B916EFCF6C00E03CA9 /* README in Resources */ = {isa = PBXBuildFile; fileRef = 853FB7F814A3F52200DE7B18 /* README */; }; 85E8F2BB16EFCF6C00E03CA9 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 29B97316FDCFA39411CA2CEA /* main.m */; settings = {ATTRIBUTES = (); }; }; 85E8F2BC16EFCF6C00E03CA9 /* AppController.m in Sources */ = {isa = PBXBuildFile; fileRef = F5F5F93807FD8CAD01A80101 /* AppController.m */; }; 85E8F2BD16EFCF6C00E03CA9 /* ftpclient.m in Sources */ = {isa = PBXBuildFile; fileRef = F5F5F93A07FD8CAD01A80101 /* ftpclient.m */; }; 85E8F2BE16EFCF6C00E03CA9 /* localclient.m in Sources */ = {isa = PBXBuildFile; fileRef = F56A03FB080AC70701A80101 /* localclient.m */; }; 85E8F2BF16EFCF6C00E03CA9 /* fileTable.m in Sources */ = {isa = PBXBuildFile; fileRef = F5BE3AF7080C6A3601A80101 /* fileTable.m */; }; 85E8F2C016EFCF6C00E03CA9 /* fileElement.m in Sources */ = {isa = PBXBuildFile; fileRef = F5C84D6108142DF201A80101 /* fileElement.m */; }; 85E8F2C116EFCF6C00E03CA9 /* client.m in Sources */ = {isa = PBXBuildFile; fileRef = F5EFB6450818FE6001A80101 /* client.m */; }; 85E8F2C316EFCF6C00E03CA9 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */; }; 85E8F32516EFD9D000E03CA9 /* ChangeLog in Resources */ = {isa = PBXBuildFile; fileRef = 85E8F32416EFD9D000E03CA9 /* ChangeLog */; }; /* End PBXBuildFile section */ /* Begin PBXFileReference section */ 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Cocoa.framework; path = /System/Library/Frameworks/Cocoa.framework; sourceTree = ""; }; 29B97316FDCFA39411CA2CEA /* main.m */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; }; 29B97324FDCFA39411CA2CEA /* AppKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AppKit.framework; path = /System/Library/Frameworks/AppKit.framework; sourceTree = ""; }; 29B97325FDCFA39411CA2CEA /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = /System/Library/Frameworks/Foundation.framework; sourceTree = ""; }; 8531288B1767CADA00F56C92 /* GetNameController.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = GetNameController.h; sourceTree = ""; }; 8531288C1767CADA00F56C92 /* GetNameController.m */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.objc; path = GetNameController.m; sourceTree = ""; }; 8534AFA91DAB81DC005F5ECD /* English */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.strings; name = English; path = Resources/English.lproj/Localizable.strings; sourceTree = ""; }; 8534AFAB1DAB81F5005F5ECD /* German */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = German; path = Resources/German.lproj/Localizable.strings; sourceTree = ""; }; 8534AFAC1DAB8213005F5ECD /* Italian */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = Italian; path = Resources/Italian.lproj/Localizable.strings; sourceTree = ""; }; 853FB7F814A3F52200DE7B18 /* README */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = text; path = README; sourceTree = ""; }; 8570ECDE1DA1916700099FC2 /* GetName.nib */ = {isa = PBXFileReference; lastKnownFileType = wrapper.nib; name = GetName.nib; path = Resources/GetName.nib; sourceTree = ""; }; 8570ECDF1DA1916700099FC2 /* MainMenu.nib */ = {isa = PBXFileReference; lastKnownFileType = wrapper.nib; name = MainMenu.nib; path = Resources/MainMenu.nib; sourceTree = ""; }; 8570ECE21DA1917D00099FC2 /* InfoPlist.strings */ = {isa = PBXFileReference; fileEncoding = 10; lastKnownFileType = text.plist.strings; name = InfoPlist.strings; path = Resources/InfoPlist.strings; sourceTree = ""; }; 85E8F2C916EFCF6C00E03CA9 /* FTP.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = FTP.app; sourceTree = BUILT_PRODUCTS_DIR; }; 85E8F32416EFD9D000E03CA9 /* ChangeLog */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = text; path = ChangeLog; sourceTree = ""; }; 85FC29710DD7B28300A80101 /* FTP_icon_osx.icns */ = {isa = PBXFileReference; lastKnownFileType = image.icns; path = FTP_icon_osx.icns; sourceTree = ""; }; F56A03FB080AC70701A80101 /* localclient.m */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.objc; path = localclient.m; sourceTree = ""; }; F56A03FD080AC71101A80101 /* localclient.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = localclient.h; sourceTree = ""; }; F5BE3AF6080C6A3601A80101 /* fileTable.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = fileTable.h; sourceTree = ""; }; F5BE3AF7080C6A3601A80101 /* fileTable.m */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.objc; path = fileTable.m; sourceTree = ""; }; F5C0879F08A0C47B01A8012F /* arrow_right.tiff */ = {isa = PBXFileReference; lastKnownFileType = image.tiff; path = arrow_right.tiff; sourceTree = ""; }; F5C087A108A0C4AF01A8012F /* arrow_left.tiff */ = {isa = PBXFileReference; lastKnownFileType = image.tiff; path = arrow_left.tiff; sourceTree = ""; }; F5C84D6008142DF201A80101 /* fileElement.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = fileElement.h; sourceTree = ""; }; F5C84D6108142DF201A80101 /* fileElement.m */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.objc; path = fileElement.m; sourceTree = ""; }; F5EFB6450818FE6001A80101 /* client.m */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.objc; path = client.m; sourceTree = ""; }; F5EFB6470818FE6E01A80101 /* client.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = client.h; sourceTree = ""; }; F5F5F93707FD8CAD01A80101 /* AppController.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = AppController.h; sourceTree = ""; }; F5F5F93807FD8CAD01A80101 /* AppController.m */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.objc; path = AppController.m; sourceTree = ""; }; F5F5F93907FD8CAD01A80101 /* ftpclient.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = ftpclient.h; sourceTree = ""; }; F5F5F93A07FD8CAD01A80101 /* ftpclient.m */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.objc; path = ftpclient.m; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ 85E8F2C216EFCF6C00E03CA9 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( 85E8F2C316EFCF6C00E03CA9 /* Cocoa.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ 080E96DDFE201D6D7F000001 /* Classes */ = { isa = PBXGroup; children = ( 8531288B1767CADA00F56C92 /* GetNameController.h */, 8531288C1767CADA00F56C92 /* GetNameController.m */, F5F5F93707FD8CAD01A80101 /* AppController.h */, F5F5F93807FD8CAD01A80101 /* AppController.m */, F5F5F93907FD8CAD01A80101 /* ftpclient.h */, F5F5F93A07FD8CAD01A80101 /* ftpclient.m */, F56A03FB080AC70701A80101 /* localclient.m */, F56A03FD080AC71101A80101 /* localclient.h */, F5BE3AF6080C6A3601A80101 /* fileTable.h */, F5BE3AF7080C6A3601A80101 /* fileTable.m */, F5C84D6008142DF201A80101 /* fileElement.h */, F5C84D6108142DF201A80101 /* fileElement.m */, F5EFB6470818FE6E01A80101 /* client.h */, F5EFB6450818FE6001A80101 /* client.m */, ); name = Classes; sourceTree = ""; }; 1058C7A0FEA54F0111CA2CBB /* Linked Frameworks */ = { isa = PBXGroup; children = ( 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */, ); name = "Linked Frameworks"; sourceTree = ""; }; 1058C7A2FEA54F0111CA2CBB /* Other Frameworks */ = { isa = PBXGroup; children = ( 29B97325FDCFA39411CA2CEA /* Foundation.framework */, 29B97324FDCFA39411CA2CEA /* AppKit.framework */, ); name = "Other Frameworks"; sourceTree = ""; }; 19C28FACFE9D520D11CA2CBB /* Products */ = { isa = PBXGroup; children = ( 85E8F2C916EFCF6C00E03CA9 /* FTP.app */, ); name = Products; sourceTree = ""; }; 29B97314FDCFA39411CA2CEA /* FTP */ = { isa = PBXGroup; children = ( 080E96DDFE201D6D7F000001 /* Classes */, 29B97315FDCFA39411CA2CEA /* Other Sources */, 29B97317FDCFA39411CA2CEA /* Resources */, 29B97323FDCFA39411CA2CEA /* Frameworks */, 19C28FACFE9D520D11CA2CBB /* Products */, ); name = FTP; sourceTree = ""; }; 29B97315FDCFA39411CA2CEA /* Other Sources */ = { isa = PBXGroup; children = ( 29B97316FDCFA39411CA2CEA /* main.m */, ); name = "Other Sources"; sourceTree = ""; }; 29B97317FDCFA39411CA2CEA /* Resources */ = { isa = PBXGroup; children = ( 8534AFA81DAB81DC005F5ECD /* Localizable.strings */, 8570ECE21DA1917D00099FC2 /* InfoPlist.strings */, 8570ECDE1DA1916700099FC2 /* GetName.nib */, 8570ECDF1DA1916700099FC2 /* MainMenu.nib */, 85E8F32416EFD9D000E03CA9 /* ChangeLog */, 853FB7F814A3F52200DE7B18 /* README */, 85FC29710DD7B28300A80101 /* FTP_icon_osx.icns */, F5C0879F08A0C47B01A8012F /* arrow_right.tiff */, F5C087A108A0C4AF01A8012F /* arrow_left.tiff */, ); name = Resources; sourceTree = ""; }; 29B97323FDCFA39411CA2CEA /* Frameworks */ = { isa = PBXGroup; children = ( 1058C7A0FEA54F0111CA2CBB /* Linked Frameworks */, 1058C7A2FEA54F0111CA2CBB /* Other Frameworks */, ); name = Frameworks; sourceTree = ""; }; /* End PBXGroup section */ /* Begin PBXHeadersBuildPhase section */ 85E8F2AC16EFCF6C00E03CA9 /* Headers */ = { isa = PBXHeadersBuildPhase; buildActionMask = 2147483647; files = ( 85E8F2AD16EFCF6C00E03CA9 /* AppController.h in Headers */, 85E8F2AE16EFCF6C00E03CA9 /* ftpclient.h in Headers */, 85E8F2AF16EFCF6C00E03CA9 /* localclient.h in Headers */, 85E8F2B016EFCF6C00E03CA9 /* fileTable.h in Headers */, 85E8F2B116EFCF6C00E03CA9 /* fileElement.h in Headers */, 85E8F2B216EFCF6C00E03CA9 /* client.h in Headers */, 8531288D1767CADA00F56C92 /* GetNameController.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXHeadersBuildPhase section */ /* Begin PBXNativeTarget section */ 85E8F2AB16EFCF6C00E03CA9 /* FTP */ = { isa = PBXNativeTarget; buildConfigurationList = 85E8F2C416EFCF6C00E03CA9 /* Build configuration list for PBXNativeTarget "FTP" */; buildPhases = ( 85E8F2AC16EFCF6C00E03CA9 /* Headers */, 85E8F2B316EFCF6C00E03CA9 /* Resources */, 85E8F2BA16EFCF6C00E03CA9 /* Sources */, 85E8F2C216EFCF6C00E03CA9 /* Frameworks */, ); buildRules = ( ); dependencies = ( ); name = FTP; productInstallPath = "$(HOME)/Applications"; productName = FTP; productReference = 85E8F2C916EFCF6C00E03CA9 /* FTP.app */; productType = "com.apple.product-type.application"; }; /* End PBXNativeTarget section */ /* Begin PBXProject section */ 29B97313FDCFA39411CA2CEA /* Project object */ = { isa = PBXProject; buildConfigurationList = 85A6DBE310D43D010048FE0B /* Build configuration list for PBXProject "FTP" */; compatibilityVersion = "Xcode 2.4"; hasScannedForEncodings = 1; knownRegions = ( English, Japanese, French, German, Italian, ); mainGroup = 29B97314FDCFA39411CA2CEA /* FTP */; projectDirPath = ""; projectRoot = ""; targets = ( 85E8F2AB16EFCF6C00E03CA9 /* FTP */, ); }; /* End PBXProject section */ /* Begin PBXResourcesBuildPhase section */ 85E8F2B316EFCF6C00E03CA9 /* Resources */ = { isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( 85E8F2B616EFCF6C00E03CA9 /* arrow_right.tiff in Resources */, 85E8F2B716EFCF6C00E03CA9 /* arrow_left.tiff in Resources */, 85E8F2B816EFCF6C00E03CA9 /* FTP_icon_osx.icns in Resources */, 85E8F2B916EFCF6C00E03CA9 /* README in Resources */, 85E8F32516EFD9D000E03CA9 /* ChangeLog in Resources */, 8570ECE01DA1916700099FC2 /* GetName.nib in Resources */, 8570ECE11DA1916700099FC2 /* MainMenu.nib in Resources */, 8570ECE31DA1917D00099FC2 /* InfoPlist.strings in Resources */, 8534AFAA1DAB81DC005F5ECD /* Localizable.strings in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXResourcesBuildPhase section */ /* Begin PBXSourcesBuildPhase section */ 85E8F2BA16EFCF6C00E03CA9 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( 85E8F2BB16EFCF6C00E03CA9 /* main.m in Sources */, 85E8F2BC16EFCF6C00E03CA9 /* AppController.m in Sources */, 85E8F2BD16EFCF6C00E03CA9 /* ftpclient.m in Sources */, 85E8F2BE16EFCF6C00E03CA9 /* localclient.m in Sources */, 85E8F2BF16EFCF6C00E03CA9 /* fileTable.m in Sources */, 85E8F2C016EFCF6C00E03CA9 /* fileElement.m in Sources */, 85E8F2C116EFCF6C00E03CA9 /* client.m in Sources */, 8531288E1767CADB00F56C92 /* GetNameController.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXSourcesBuildPhase section */ /* Begin PBXVariantGroup section */ 8534AFA81DAB81DC005F5ECD /* Localizable.strings */ = { isa = PBXVariantGroup; children = ( 8534AFA91DAB81DC005F5ECD /* English */, 8534AFAB1DAB81F5005F5ECD /* German */, 8534AFAC1DAB8213005F5ECD /* Italian */, ); name = Localizable.strings; sourceTree = ""; }; /* End PBXVariantGroup section */ /* Begin XCBuildConfiguration section */ 85A6DBE410D43D010048FE0B /* Development */ = { isa = XCBuildConfiguration; buildSettings = { }; name = Development; }; 85A6DBE510D43D010048FE0B /* Deployment */ = { isa = XCBuildConfiguration; buildSettings = { ARCHS = "$(ARCHS_STANDARD_32_64_BIT_PRE_XCODE_3_1)"; ARCHS_STANDARD_32_64_BIT_PRE_XCODE_3_1 = "x86_64 i386 ppc"; SDKROOT = /Developer/SDKs/MacOSX10.4u.sdk; }; name = Deployment; }; 85A6DBE610D43D010048FE0B /* Default */ = { isa = XCBuildConfiguration; buildSettings = { }; name = Default; }; 85E8F2C516EFCF6C00E03CA9 /* Development */ = { isa = XCBuildConfiguration; buildSettings = { COPY_PHASE_STRIP = NO; FRAMEWORK_SEARCH_PATHS = ""; GCC_DYNAMIC_NO_PIC = NO; GCC_ENABLE_FIX_AND_CONTINUE = YES; GCC_GENERATE_DEBUGGING_SYMBOLS = YES; GCC_OPTIMIZATION_LEVEL = 0; GCC_SYMBOLS_PRIVATE_EXTERN = NO; HEADER_SEARCH_PATHS = ""; INFOPLIST_FILE = "Info-FTP.plist"; INSTALL_PATH = "$(HOME)/Applications"; LIBRARY_SEARCH_PATHS = ""; OTHER_CFLAGS = ""; OTHER_LDFLAGS = ""; PRODUCT_NAME = FTP; SECTORDER_FLAGS = ""; WARNING_CFLAGS = ( "-Wmost", "-Wno-four-char-constants", "-Wno-unknown-pragmas", ); WRAPPER_EXTENSION = app; ZERO_LINK = YES; }; name = Development; }; 85E8F2C616EFCF6C00E03CA9 /* Deployment */ = { isa = XCBuildConfiguration; buildSettings = { COPY_PHASE_STRIP = YES; FRAMEWORK_SEARCH_PATHS = ""; GCC_ENABLE_FIX_AND_CONTINUE = NO; GCC_SYMBOLS_PRIVATE_EXTERN = NO; HEADER_SEARCH_PATHS = ""; INFOPLIST_FILE = "Info-FTP.plist"; INSTALL_PATH = "$(HOME)/Applications"; LIBRARY_SEARCH_PATHS = ""; OTHER_CFLAGS = ""; OTHER_LDFLAGS = ""; PRODUCT_NAME = FTP; SDKROOT = /Developer/SDKs/MacOSX10.5.sdk; SECTORDER_FLAGS = ""; WARNING_CFLAGS = ( "-Wmost", "-Wno-four-char-constants", "-Wno-unknown-pragmas", ); WRAPPER_EXTENSION = app; ZERO_LINK = NO; }; name = Deployment; }; 85E8F2C716EFCF6C00E03CA9 /* Default */ = { isa = XCBuildConfiguration; buildSettings = { ARCHS = "$(NATIVE_ARCH_ACTUAL)"; FRAMEWORK_SEARCH_PATHS = ""; GCC_SYMBOLS_PRIVATE_EXTERN = NO; HEADER_SEARCH_PATHS = ""; INFOPLIST_FILE = "Info-FTP.plist"; INSTALL_PATH = "$(HOME)/Applications"; LIBRARY_SEARCH_PATHS = ""; OTHER_CFLAGS = ""; OTHER_LDFLAGS = ""; PRODUCT_NAME = FTP; SECTORDER_FLAGS = ""; WARNING_CFLAGS = ( "-Wmost", "-Wno-four-char-constants", "-Wno-unknown-pragmas", ); WRAPPER_EXTENSION = app; }; name = Default; }; /* End XCBuildConfiguration section */ /* Begin XCConfigurationList section */ 85A6DBE310D43D010048FE0B /* Build configuration list for PBXProject "FTP" */ = { isa = XCConfigurationList; buildConfigurations = ( 85A6DBE410D43D010048FE0B /* Development */, 85A6DBE510D43D010048FE0B /* Deployment */, 85A6DBE610D43D010048FE0B /* Default */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Default; }; 85E8F2C416EFCF6C00E03CA9 /* Build configuration list for PBXNativeTarget "FTP" */ = { isa = XCConfigurationList; buildConfigurations = ( 85E8F2C516EFCF6C00E03CA9 /* Development */, 85E8F2C616EFCF6C00E03CA9 /* Deployment */, 85E8F2C716EFCF6C00E03CA9 /* Default */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Default; }; /* End XCConfigurationList section */ }; rootObject = 29B97313FDCFA39411CA2CEA /* Project object */; } FTP-0.6/ftpclient.m0000664000175000017500000010415213136612651013615 0ustar multixmultix/* Project: FTP Copyright (C) 2005-2017 Riccardo Mottola Author: Riccardo Mottola Created: 2005-03-30 FTP client class This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ /* * this class handles acts as a remote client with the FTP server. * the connection modes, default, active (port) and passive * can be set using the three setPort* methods */ #import "ftpclient.h" #import "AppController.h" #import "fileElement.h" #include #include #include #include #include #ifdef _WIN32 #include #else #include /* for inet_ntoa and similar */ #include #define INVALID_SOCKET -1 #define closesocket close #endif /* WIN32 */ #define MAX_CONTROL_BUFF 2048 #define MAX_DATA_BUFF 2048 #if defined(__linux__) || defined (__BSD_VISIBLE) || defined (NetBSD) || defined (__APPLE__) #define socklentype socklen_t #else #define socklentype int #endif void initStream(streamStruct *ss, int socket) { ss->socket = socket; ss->position = 0; ss->len = 0; ss->buffer[0] = '\0'; } int getChar(streamStruct* ss) { int result; BOOL gotEof; gotEof = NO; if (ss->position == ss->len) { int read; read = recv(ss->socket, ss->buffer, MAX_SOCK_BUFF, 0); if (read > 0) { ss->len = read; ss->position = 0; } else if (read == 0) { ss->len = 0; ss->position = 0; ss->buffer[0] = '\0'; gotEof = YES; } else { ss->len = 0; ss->position = 0; NSLog(@"error sock read"); perror("getChar:read"); ss->buffer[0] = '\0'; gotEof = YES; } } if (gotEof) { result = EOF; } else { result = ss->buffer[ss->position]; ss->position++; } return result; } @implementation FtpClient + (void)connectWithPorts:(NSArray *)portArray { NSAutoreleasePool *pool; NSConnection *serverConnection; FtpClient *serverObject; pool = [[NSAutoreleasePool alloc] init]; serverConnection = [NSConnection connectionWithReceivePort: [portArray objectAtIndex:0] sendPort:[portArray objectAtIndex:1]]; serverObject = [self alloc]; [(id)[serverConnection rootProxy] setServer:serverObject]; [serverObject release]; [[NSRunLoop currentRunLoop] run]; [pool release]; return; } - (id)initWithController:(id)cont :(connectionModes)cMode { if (!(self =[super initWithController:cont])) return nil; switch (cMode) { case defaultMode: [self setPortDefault]; break; case portMode: [self setPortPort]; break; case passiveMode: [self setPortPassive]; break; default: [self setPortDefault]; } #ifdef _WIN32 WORD wVersionRequested; WSADATA wsaData; wVersionRequested = MAKEWORD( 1, 1 ); WSAStartup(wVersionRequested, &wsaData); #endif connected = NO; return self; } /* three methods to set the connection handling */ - (void)setPortDefault { usesPassive = NO; usesPorts = NO; } - (void)setPortPort { usesPassive = NO; usesPorts = YES; } - (void)setPortPassive { usesPassive = YES; usesPorts = NO; } /* changes the current working directory this directory is implicit in many other actions */ - (void)changeWorkingDir:(NSString *)dir { NSString *tempStr; NSMutableArray *reply; if (!connected) return; tempStr = [@"CWD " stringByAppendingString:dir]; [self writeLine:tempStr]; if ([self readReply:&reply] == 250) [super changeWorkingDir:dir]; else NSLog(@"cwd failed"); } /* if we have a valid controller, we suppose it respons to appendTextToLog */ /* RM: is there a better way to append a newline? */ - (void)logIt:(NSString *)str { NSMutableString *tempStr; if (controller == NULL) return; tempStr = [NSMutableString stringWithCapacity:([str length] + 1)]; [tempStr appendString:str]; [tempStr appendString:@"\n"]; [controller appendTextToLog:tempStr]; } /* read the reply of a command, be it single or multi-line returned is the first numerical code NOTE: the parser is NOT robust in handling errors */ #define NUMCODELEN 4 - (int)readReply :(NSMutableArray **)result { char buff[MAX_CONTROL_BUFF]; int readBytes; int ch; /* the first numerical code, in case of multi-line output it is followed by '-' in the first line and by ' ' in the last line */ char numCodeStr[NUMCODELEN]; int numCode; int startNumCode; char separator; enum states { N1, N2, N3, SEPARATOR, CHARS, GOTR, END }; enum states state; BOOL multiline; readBytes = 0; state = N1; separator = 0; multiline = NO; startNumCode = numCode = 0; *result = [NSMutableArray arrayWithCapacity:1]; // TODO: protect against numCodeStr overflow while (!(state == END)) { ch = getChar(&ctrlStream); //NSLog(@"read char: %c", ch); if (ch == EOF) state = END; switch (state) { case N1: buff[readBytes] = ch; if (readBytes < NUMCODELEN) numCodeStr[readBytes] = ch; readBytes++; if (ch == ' ') /* skip internal lines of multi-line */ state = CHARS; else state = N2; break; case N2: buff[readBytes] = ch; numCodeStr[readBytes] = ch; readBytes++; state = N3; break; case N3: buff[readBytes] = ch; numCodeStr[readBytes] = ch; readBytes++; state = SEPARATOR; break; case SEPARATOR: buff[readBytes] = ch; numCodeStr[readBytes] = '\0'; readBytes++; numCode = atoi(numCodeStr); separator = ch; state = CHARS; break; case CHARS: if (ch == '\r') state = GOTR; else { buff[readBytes++] = ch; } break; case GOTR: if (ch == '\n') { buff[readBytes] = '\0'; [self logIt:[NSString stringWithCString:buff]]; [*result addObject:[NSString stringWithCString:buff]]; readBytes = 0; if (separator == ' ') { if (multiline) { if (numCode == startNumCode) state = END; } else { startNumCode = numCode; state = END; } } else { startNumCode = numCode; multiline = YES; state = N1; } } break; case END: NSLog(@"EOF reached prematurely"); startNumCode = -1; break; default: NSLog(@"Duh, a case default in the readReply parser"); } } [*result retain]; return startNumCode; } /* writes a single line to the control connection, logging it always */ - (int)writeLine:(NSString *)line { return [self writeLine:line byLoggingIt:YES]; } /* writes a single line to the control connection */ - (int)writeLine:(NSString *)line byLoggingIt:(BOOL)doLog { int sentBytes; int bytesToSend; char command[MAX_CONTROL_BUFF]; NSString *commandStr; commandStr = [line stringByAppendingString:@"\r\n"]; [commandStr getCString:command]; bytesToSend = strlen(command); if (doLog) [self logIt:line]; if ((sentBytes = send(controlSocket, command, bytesToSend, 0)) < bytesToSend) NSLog(@"sent %d out of %d", sentBytes, bytesToSend); return sentBytes; } - (int)setTypeToI { NSMutableArray *reply; int retVal; retVal = [self writeLine:@"TYPE I"]; if (retVal > 0) { [self readReply:&reply]; [reply release]; } return retVal; } - (int)setTypeToA { NSMutableArray *reply; int retVal; retVal = [self writeLine:@"TYPE A"]; if (retVal > 0) { [self readReply:&reply]; [reply release]; } return retVal; } - (oneway void)retrieveFile:(FileElement *)file to:(LocalClient *)localClient { BOOL gotFile; gotFile = [self retrieveFile:file to:localClient beingAt:0]; [controller fileRetrieved:gotFile]; } - (BOOL)retrieveFile:(FileElement *)file to:(LocalClient *)localClient beingAt:(int)depth; { NSString *fileName; unsigned long long fileSize; NSString *command; char buff[MAX_DATA_BUFF]; FILE *localFileStream; int bytesRead; NSMutableArray *reply; unsigned int minimumPercentIncrement; unsigned int progressIncBytes; int replyCode; unsigned long long totalBytes; NSString *localPath; BOOL gotFile; fileName = [file name]; fileSize = [file size]; minimumPercentIncrement = fileSize / 100; // we should guard against maxint localPath = [[localClient workingDir] stringByAppendingPathComponent:fileName]; if ([file isDir]) { NSString *pristineLocalPath; /* original path */ NSString *pristineRemotePath; /* original path */ NSArray *dirList; NSString *remoteDir; NSEnumerator *en; FileElement *fEl; if (depth > MAX_DIR_RECURSION) { NSLog(@"Max depth reached: %d", depth); return NO; } pristineLocalPath = [[localClient workingDir] retain]; pristineRemotePath = [[self workingDir] retain]; remoteDir = [[self workingDir] stringByAppendingPathComponent:fileName]; [self changeWorkingDir:remoteDir]; if ([localClient createNewDir:localPath] == YES) { [localClient changeWorkingDir:localPath]; dirList = [self dirContents]; en = [dirList objectEnumerator]; while ((fEl = [en nextObject])) { NSLog(@"recurse, download : %@", [fEl name]); [self retrieveFile:fEl to:localClient beingAt:depth+1]; } } /* we get back were we started */ [self changeWorkingDir:pristineRemotePath]; [localClient changeWorkingDir:pristineLocalPath]; [pristineLocalPath release]; [pristineRemotePath release]; return YES; } /* lets settle to a plain binary standard type */ [self setTypeToI]; if ([self initDataConn] < 0) { NSLog(@"error initiating data connection, retrieveFile"); return NO; } command = [@"RETR " stringByAppendingString:fileName]; [self writeLine:command]; replyCode = [self readReply:&reply]; NSLog(@"%d reply is %@: ", replyCode, [reply objectAtIndex:0]); if(replyCode != 150) { if (replyCode >= 400) { [controller showAlertDialog:[reply objectAtIndex:0]]; [self logIt: [reply objectAtIndex:0]]; } else { [controller showAlertDialog:@"Unexpected server error."]; NSLog(@"Unexpected condition in retrieve"); } return NO; /* we have an error or some unexpected condition */ } else { NSString *s; NSRange bytesR; /* we try to parse the response which may look like this: 150 Opening BINARY mode data connection for core.current.tar.bz2 (10867411 bytes) and extract the transfer size */ s = [reply objectAtIndex:0]; bytesR = [s rangeOfString:@")" options:NSBackwardsSearch]; if (bytesR.location > 0) { NSRange leftParR; NSString *sizeString; long long tempLL; unsigned long long tempSize; NSLog(@"recognized a 150 response, looking for size in: %@", s); leftParR = [s rangeOfString:@"(" options:NSBackwardsSearch]; if (leftParR.location > 0) { sizeString = [s substringWithRange:NSMakeRange(leftParR.location+1, bytesR.location-leftParR.location)]; [[NSScanner scannerWithString: sizeString] scanLongLong:&tempLL]; NSLog(@"parsed response size from %@ is %lld", sizeString, tempLL); if (tempLL > 0) { tempSize = (unsigned long long)tempLL; if (fileSize == 0) fileSize = tempSize; else if (fileSize != tempSize) NSLog(@"Apparently the server is lying! list size is: %llu, transfer size is: %lld", fileSize, tempSize); } } } } [reply release]; if ([self initDataStream] < 0) { [controller showAlertDialog:@"Unexpected connection error."]; return NO; } localFileStream = fopen([localPath cString], "wb"); if (localFileStream == NULL) { [controller showAlertDialog:@"Opening of local file failed.\nCheck permissions and free space."]; perror("local fopen failed"); return NO; } totalBytes = 0; progressIncBytes = 0; gotFile = NO; [controller setTransferBegin:fileName :fileSize]; while (!gotFile) { bytesRead = recv(localSocket, buff, MAX_DATA_BUFF, 0); if (bytesRead == 0) gotFile = YES; else if (bytesRead < 0) { gotFile = YES; NSLog(@"error on socket read, retrieve file"); } else { if (fwrite(buff, sizeof(char), bytesRead, localFileStream) < bytesRead) { NSLog(@"file write error, retrieve file"); } totalBytes += bytesRead; progressIncBytes += bytesRead; if (progressIncBytes > minimumPercentIncrement) { [controller setTransferProgress:[NSNumber numberWithUnsignedLongLong:totalBytes]]; progressIncBytes = 0; } } } [controller setTransferEnd:[NSNumber numberWithUnsignedLongLong:totalBytes]]; fclose(localFileStream); [self closeDataStream]; [self readReply:&reply]; [reply release]; return gotFile; } - (oneway void)storeFile:(FileElement *)file from:(LocalClient *)localClient { BOOL gotFile; gotFile = [self storeFile:file from:localClient beingAt:0]; [controller fileStored:gotFile]; } - (BOOL)storeFile:(FileElement *)file from:(LocalClient *)localClient beingAt:(int)depth { NSString *fileName; unsigned long long fileSize; NSString *command; char buff[MAX_DATA_BUFF]; FILE *localFileStream; NSMutableArray *reply; int bytesRead; unsigned int minimumPercentIncrement; unsigned int progressIncBytes; int replyCode; unsigned long long totalBytes; NSString *localPath; BOOL gotFile; fileName = [file name]; fileSize = [file size]; minimumPercentIncrement = fileSize / 100; // we should guard against maxint localPath = [file path]; if ([file isDir]) { NSString *pristineLocalPath; /* original path */ NSString *pristineRemotePath; /* original path */ NSArray *dirList; NSString *remotePath; NSEnumerator *en; FileElement *fEl; if (depth > MAX_DIR_RECURSION) { NSLog(@"Max depth reached: %d", depth); return NO; } pristineLocalPath = [[localClient workingDir] retain]; pristineRemotePath = [[self workingDir] retain]; remotePath = [pristineRemotePath stringByAppendingPathComponent:fileName]; [localClient changeWorkingDir:localPath]; NSLog(@"local dir changed: %@", [localClient workingDir]); if ([self createNewDir:remotePath] == YES) { NSLog(@"remote dir created successfully"); [self changeWorkingDir:remotePath]; dirList = [localClient dirContents]; en = [dirList objectEnumerator]; while ((fEl = [en nextObject])) { NSLog(@"recurse, upload : %@", [fEl name]); [self storeFile:fEl from:localClient beingAt:(depth+1)]; } } /* we get back were we started */ [self changeWorkingDir:pristineRemotePath]; [localClient changeWorkingDir:pristineLocalPath]; [pristineLocalPath release]; [pristineRemotePath release]; return YES; } /* lets settle to a plain binary standard type */ [self setTypeToI]; if ([self initDataConn] < 0) { [controller showAlertDialog:@"Error initiating the Data Connection."]; NSLog(@"error initiating data connection, storeFile"); return NO; } command = [@"STOR " stringByAppendingString:fileName]; [self writeLine:command]; replyCode = [self readReply:&reply]; NSLog(@"%d reply is %@: ", replyCode, [reply objectAtIndex:0]); if (replyCode >= 400 && replyCode <= 559) { [controller showAlertDialog:[reply objectAtIndex:0]]; [self logIt: [reply objectAtIndex:0]]; [reply release]; return NO; } [reply release]; if ([self initDataStream] < 0) { [controller showAlertDialog:@"Unexpected connection error."]; return NO; } localFileStream = fopen([localPath cString], "rb"); if (localFileStream == NULL) { [controller showAlertDialog:@"Opening of local file failed.\nCheck permissions."]; perror("local fopen failed"); return NO; } totalBytes = 0; progressIncBytes = 0; gotFile = NO; [controller setTransferBegin:fileName :fileSize]; while (!gotFile) { bytesRead = fread(buff, sizeof(char), MAX_DATA_BUFF, localFileStream); if (bytesRead == 0) { gotFile = YES; if (!feof(localFileStream)) NSLog(@"error on file read, store file"); else NSLog(@"feof"); } else { int sentBytes; if ((sentBytes = send(localSocket, buff, bytesRead, 0)) < bytesRead) { NSLog(@"socket write error, store file. Wrote %d of %d", sentBytes, bytesRead); } totalBytes += bytesRead; progressIncBytes += bytesRead; if (progressIncBytes > minimumPercentIncrement) { [controller setTransferProgress:[NSNumber numberWithUnsignedLongLong:totalBytes]]; progressIncBytes = 0; } } } [controller setTransferEnd:[NSNumber numberWithUnsignedLongLong:totalBytes]]; fclose(localFileStream); [self closeDataStream]; [self readReply:&reply]; [reply release]; return gotFile; } - (BOOL)deleteFile:(FileElement *)file beingAt:(int)depth { NSString *fileName; NSString *command; NSMutableArray *reply; int replyCode; fileName = [file name]; if ([file isDir]) { NSString *pristineRemotePath; /* original path */ NSArray *dirList; NSString *remotePath; NSEnumerator *en; FileElement *fEl; if (depth > 3) { NSLog(@"Max depth reached: %d", depth); return NO; } pristineRemotePath = [[self workingDir] retain]; remotePath = [pristineRemotePath stringByAppendingPathComponent:fileName]; NSLog(@"remote dir created successfully"); [self changeWorkingDir:remotePath]; dirList = [self dirContents]; en = [dirList objectEnumerator]; while ((fEl = [en nextObject])) { NSLog(@"recurse, delete : %@", [fEl name]); [self deleteFile:fEl beingAt:(depth+1)]; } /* we get back were we started */ [self changeWorkingDir:pristineRemotePath]; [pristineRemotePath release]; } command = [@"DELE " stringByAppendingString:fileName]; [self writeLine:command]; replyCode = [self readReply:&reply]; NSLog(@"%d reply is %@: ", replyCode, [reply objectAtIndex:0]); if(replyCode >= 400) { [controller showAlertDialog:[reply objectAtIndex:0]]; [self logIt: [reply objectAtIndex:0]]; [reply release]; return NO; /* we have an error or some unexpected condition */ } [reply release]; return YES; } /* initialize a connection */ /* set up and connect the control socket */ - (int)connect:(int)port :(char *)server { struct hostent *hostentPtr; socklentype addrLen; /* socklen_t on some systems? */ NSMutableArray *reply; NSLog(@"connect to %s : %d", server, port); if((hostentPtr = gethostbyname(server)) == NULL) { NSLog(@"Could not resolve %s", server); return ERR_COULDNT_RESOLVE; } BCOPY((char *)hostentPtr->h_addr, (char *)&remoteSockName.sin_addr, hostentPtr->h_length); remoteSockName.sin_family = PF_INET; remoteSockName.sin_port = htons(port); if ((controlSocket = socket(PF_INET, SOCK_STREAM, 0)) == INVALID_SOCKET) { perror("socket failed: "); return ERR_SOCKET_FAIL; } if (connect(controlSocket, (struct sockaddr*) &remoteSockName, sizeof(remoteSockName)) < 0) { perror("connect failed: "); return ERR_CONNECT_FAIL; } /* we retrieve now the local name of the created socked */ /* the local port is for example important as default data port */ addrLen = sizeof(localSockName); if (getsockname(controlSocket, (struct sockaddr *)&localSockName, &addrLen) < 0) { perror("ftpclient: getsockname"); return ERR_GESOCKNAME_FAIL; } initStream(&ctrlStream, controlSocket); if([self readReply :&reply] < 0) return ERR_READ_FAIL; [reply release]; return 0; } - (void)disconnect { NSMutableArray *reply; [self writeLine:@"QUIT"]; [self readReply:&reply]; connected = NO; closesocket(controlSocket); } - (int)authenticate:(NSString *)user :(NSString *)pass { NSString *tempStr; NSMutableArray *reply; int replyCode; tempStr = [@"USER " stringByAppendingString: user]; if ([self writeLine:tempStr] < 0) return -2; /* we couldn't write */ replyCode = [self readReply:&reply]; if (replyCode == 530) { NSLog(@"Not logged in: %@", [reply objectAtIndex:0]); [reply release]; [self disconnect]; return -1; } [reply release]; tempStr = [@"PASS " stringByAppendingString: pass]; if ([self writeLine:tempStr byLoggingIt:NO] < 0) return -2; /* we couldn't write */ replyCode = [self readReply:&reply]; if (replyCode == 530) { NSLog(@"Not logged in: %@", [reply objectAtIndex:0]); [reply release]; [self disconnect]; return -1; } [reply release]; connected = YES; /* get home directory as dir we first connected to */ [self writeLine:@"PWD"]; [self readReply:&reply]; if ([reply count] >= 1) { NSString *line; unsigned int length; unsigned int first; unsigned int last; unsigned int i; line = [reply objectAtIndex:0]; length = [line length]; i = 0; while (i < length && ([line characterAtIndex:i] != '\"')) i++; first = i; if (first < length) { first++; i = length-1; while (i > 0 && ([line characterAtIndex:i] != '\"')) i--; last = i; homeDir = [[line substringWithRange: NSMakeRange(first, last-first)] retain]; NSLog(@"homedir: %@", homeDir); } else homeDir = nil; } return 0; } /* initialize the data connection */ - (int)initDataConn { socklentype addrLen; /* socklen_t on some systems ? */ const int socketReuse = 1; /* passive mode */ if (usesPassive) { NSMutableArray *reply; int replyCode; NSScanner *addrScan; int a1, a2, a3, a4; int p1, p2; if ((dataSocket = socket(AF_INET, SOCK_STREAM, 0)) == INVALID_SOCKET) { perror("socket in initDataConn"); return -1; } [self writeLine:@"PASV"]; replyCode = [self readReply:&reply]; if (replyCode != 227) { NSLog(@"passive mode failed"); return -1; } NSLog(@"pasv reply is: %d %@", replyCode, [reply objectAtIndex:0]); addrScan = [NSScanner scannerWithString:[reply objectAtIndex:0]]; [addrScan setCharactersToBeSkipped:[[NSCharacterSet decimalDigitCharacterSet] invertedSet]]; if ([addrScan scanInt:NULL] == NO) { NSLog(@"error while scanning pasv address"); return -1; } NSLog(@"skipped result code"); if ([addrScan scanInt:&a1] == NO) { NSLog(@"error while scanning pasv address"); return -1; } NSLog(@"got first"); if ([addrScan scanInt:&a2] == NO) { NSLog(@"error while scanning pasv address"); return -1; } NSLog(@"got second"); if ([addrScan scanInt:&a3] == NO) { NSLog(@"error while scanning pasv address"); return -1; } if ([addrScan scanInt:&a4] == NO) { NSLog(@"error while scanning pasv address"); return -1; } if ([addrScan scanInt:&p1] == NO) { NSLog(@"error while scanning pasv port"); return -1; } if ([addrScan scanInt:&p2] == NO) { NSLog(@"error while scanning pasv port"); return -1; } NSLog(@"read: %d %d %d %d : %d %d", a1, a2, a3, a4, p1, p2); dataSockName.sin_family = AF_INET; dataSockName.sin_addr.s_addr = htonl((a1 << 24) | (a2 << 16) | (a3 << 8) | a4); dataSockName.sin_port = htons((p1 << 8) | p2); if (connect(dataSocket, (struct sockaddr *) &dataSockName, sizeof(dataSockName)) < 0) { perror("connect in initDataConn"); return -1; } return 0; } /* active mode, default or PORT arbitrated */ dataSockName = localSockName; /* system picks up a port */ if (usesPorts == YES) dataSockName.sin_port = 0; if ((dataSocket = socket(AF_INET, SOCK_STREAM, 0)) == INVALID_SOCKET) { perror("socket in initDataConn"); return -1; } /* if we use the default port, we set the option to reuse the port */ /* linux is happier if we set both ends that way */ if (usesPorts == NO) { if (setsockopt(dataSocket, SOL_SOCKET, SO_REUSEADDR, &socketReuse, (socklentype) sizeof (socketReuse)) < 0) { perror("ftpclient: setsockopt (reuse address) on data"); } if (setsockopt(controlSocket, SOL_SOCKET, SO_REUSEADDR, &socketReuse, (socklentype) sizeof (socketReuse)) < 0) { perror("ftpclient: setsockopt (reuse address) on control"); } } if (bind(dataSocket, (struct sockaddr *)&dataSockName, sizeof (dataSockName)) < 0) { perror("ftpclient: bind"); return -1; } if (usesPorts == YES) { addrLen = sizeof (dataSockName); if (getsockname(dataSocket, (struct sockaddr *)&dataSockName, &addrLen) < 0) { perror("ftpclient: getsockname"); return -1; } } if (listen(dataSocket, 1) < 0) { perror("ftpclient: listen"); return -1; } if (usesPorts == YES) { union addrAccess /* we use this union to extract the 8 bytes of an address */ { struct in_addr sinAddr; unsigned char ipv4[4]; } addr; NSMutableArray *reply; NSString *tempStr; unsigned char p1, p2; int returnCode; unsigned int port; addr.sinAddr = dataSockName.sin_addr; port = ntohs(dataSockName.sin_port); p1 = (port & 0xFF00) >> 8; p2 = port & 0x00FF; tempStr = [NSString stringWithFormat:@"PORT %u,%u,%u,%u,%u,%u", addr.ipv4[0], addr.ipv4[1], addr.ipv4[2], addr.ipv4[3], p1, p2]; [self writeLine:tempStr]; NSLog(@"port str: %@", tempStr); returnCode = [self readReply:&reply]; if (returnCode != 200) { NSLog(@"Error return code of PORT: %d", returnCode); if(reply && [reply count] > 0) { NSLog(@"error occoured in port command: %@", [reply objectAtIndex:0]); return -1; } NSLog(@"error in port command, no code"); return -2; } } return 0; } - (int)initDataStream { struct sockaddr from; socklentype fromLen; fromLen = sizeof(from); if (usesPassive) { initStream(&dataStream, dataSocket); localSocket = dataSocket; } else { if ((localSocket = accept(dataSocket, &from, &fromLen)) < 0) { perror("accepting socket, initDataStream: "); return -1; } initStream(&dataStream, localSocket); } return 0; } - (int)closeDataConn { closesocket(dataSocket); return 0; } - (void)closeDataStream { // a passive localSocket is just a copy of the dataSocket if (usesPassive == NO) closesocket(localSocket); // apparently it is not true that fclose closes the underlying // descriptor, without closing dataSocket we got a bind error // at the next connection attempt [self closeDataConn]; } /* creates a new directory tries to guess if the given dir is relative (no starting /) or absolute Is this portable to non-unix OS's? */ - (BOOL)createNewDir:(NSString *)dir { NSString *remotePath; NSString *command; NSMutableArray *reply; int replyCode; if ([dir hasPrefix:@"/"]) { NSLog(@"%@ is an absolute path", dir); remotePath = dir; } else { NSLog(@"%@ is a relative path", dir); remotePath = [[self workingDir] stringByAppendingPathComponent:dir]; } command =[@"MKD " stringByAppendingString:remotePath]; [self writeLine:command]; replyCode = [self readReply:&reply]; if (replyCode == 257) return YES; else { NSLog(@"remote mkdir code: %d %@", replyCode, [reply objectAtIndex:0]); return NO; } } /* RM again: a better path limit is needed */ - (bycopy NSArray *)dirContents { int ch; char buff[MAX_DATA_BUFF]; unsigned readBytes; enum states_m1 { READ, GOTR }; enum states_m1 state; NSMutableArray *listArr; FileElement *aFile; char path[4096]; NSMutableArray *reply; int replyCode; unsigned long long transferSize; if (!connected) return nil; [workingDir getCString:path]; /* lets settle to a plain ascii standard type */ if ([self setTypeToA] < 0) { connected = NO; NSLog(@"Timed out."); return nil; } /* create an array with a reasonable starting size */ listArr = [NSMutableArray arrayWithCapacity:5]; [self initDataConn]; [self writeLine:@"LIST"]; replyCode = [self readReply:&reply]; if ([self initDataStream] < 0) return nil; transferSize = 0; [controller setTransferBegin:@"Listing" :transferSize]; /* read the directory listing, each line being CR-LF terminated */ state = READ; readBytes = 0; while ((ch = getChar(&dataStream)) != EOF) { if (ch == '\r') state = GOTR; else if (ch == '\n' && state == GOTR) { buff[readBytes] = '\0'; [self logIt:[NSString stringWithCString:buff]]; state = READ; /* reset the state for a new line */ transferSize += readBytes; readBytes = 0; aFile = [[FileElement alloc] initWithLsLine:buff]; if (aFile) { [listArr addObject:aFile]; [aFile release]; } [controller setTransferProgress:[NSNumber numberWithUnsignedLongLong:transferSize]]; } else buff[readBytes++] = ch; } /* FIXME *********** if (ferror(dataStream)) { perror("error in reading data stream: "); } else if (feof(dataStream)) { fprintf(stderr, "feof\n"); } */ [self closeDataStream]; [controller setTransferEnd:[NSNumber numberWithUnsignedLongLong:transferSize]]; replyCode = [self readReply:&reply]; return [NSArray arrayWithArray:listArr]; } - (BOOL)renameFile:(FileElement *)file to:(NSString *)name { NSString *commandStr; NSMutableArray *reply; int replyCode; commandStr = [NSString stringWithFormat:@"RNFR %@", [file name]]; [self writeLine:commandStr]; replyCode = [self readReply:&reply]; if (replyCode != 350) { NSLog(@"Error during Rename from %d", replyCode); return NO; } commandStr = [NSString stringWithFormat:@"RNTO %@", name]; [self writeLine:commandStr]; replyCode = [self readReply:&reply]; if (replyCode == 250) { [file setName:name]; return YES; } return NO; } @end FTP-0.6/localclient.h0000664000175000017500000000173012650250074014104 0ustar multixmultix/* Project: FTP Copyright (C) 2005-2007 Riccardo Mottola Author: Riccardo Mottola Created: 2005-04-09 Local filesystem class This application is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This application is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License for more details. You should have received a copy of the GNU General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #import #import "client.h" @interface LocalClient : Client { } @end FTP-0.6/main.m0000664000175000017500000000172612650250074012551 0ustar multixmultix/* Project: FTP Copyright (C) 2005 Free Software Foundation Author: Created: 2005-03-30 09:43:03 +0200 by multix This application is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This application is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License for more details. You should have received a copy of the GNU General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include int main(int argc, const char *argv[]) { return NSApplicationMain (argc, argv); } FTP-0.6/ChangeLog0000664000175000017500000002344213136612651013223 0ustar multixmultix2017-27-28 Riccardo Mottola * ftpclient.m Track and NSLog() non-200 port response. 2017-03-02 Riccardo Mottola * fileTable.m Further razionalize parsing of lines without user or link info. Use suffix for dir/file heuristics on links. 2017-03-02 Riccardo Mottola * fileTable.m Razionalize parsing with 8 or 9 elements, improve link handling by extracting link information from the dir block. 2016-11-24 Riccardo Mottola * AppController.m More localize Local and Remote menus. 2016-11-18 Riccardo Mottola * AppController.m More localization work. 2016-09-27 Riccardo Mottola * AppController.m * Resources/GetName.nib * Resources/MainMenu.nib Localization work: make nib generic 2016-09-16 Riccardo Mottola * localclient.m use isAbsolutePath! 2016-08-23 Riccardo Mottola * fileTable.m cleanup and simplify housekeeping of the sorted array. 2016-08-23 Riccardo Mottola * fileTable.m Do not keep in the sortedArray just name and index, but really just the sorted object pointers. 2016-08-08 Riccardo Mottola * AppController.m Do not run runloop, no longer needed. 2016-08-06 Riccardo Mottola * AppController.h * AppController.m * ftpclient.h * ftpclient.m make store/retrieve client methods return immediately oneway void and then use call-back method fileStored/fileRetrieved to complete action 2016-08-02 Riccardo Mottola * client.h * client.m make also workDirSplit return result bycopy 2016-08-02 Riccardo Mottola * fileElement.m Implement coder methods for bycopy. 2016-08-02 Riccardo Mottola * AppController.m When Retrieving, set file-element path since it can be different than source. 2016-08-02 Riccardo Mottola * client.h * client.m * ftpclient.m * localclient.m Pass directory elements array by copy 2016-08-01 Riccardo Mottola * AppController.h * AppController.m Pass progress parameters by copy 2016-08-01 Riccardo Mottola * AppController.h * AppController.m Use NSTimeInterval for speed calculations. 2016-07-08 Riccardo Mottola * client.h * client.m * ftpclient.m * localclient.m * AppController.m Delete files may fail, handle result. 2016-07-07 Riccardo Mottola * AppController.m Use passive as default. 2016-07-03 Riccardo Mottola * AppController.h * AppController.m Mark progress methods as oneway. 2016-07-03 Riccardo Mottola * ftpclient.m Open local file in binary mode (needed on Windows) 2016-05-16 Riccardo Mottola * ftpclient.m Open files in binary mode (fixes on Windows), check more carefully for sent bytes. 2015-09-04 Riccardo Mottola * ftpclient.m Fix socktype for NetBSD. 2015-02-11 Riccardo Mottola * AppController.m * ftpclient.m * ftpclient.h Return success/failure in retrieveFile, add to the table only if it succeeds. 2015-02-11 Riccardo Mottola * AppController.m * ftpclient.m * ftpclient.h Return success/failure in storeFile, add to the table only if it succeeds. 2015-02-05 Riccardo Mottola * AppController.m Do not add element to the table if it is already there. 2015-02-02 Riccardo Mottola * fileTable.m (containsFileName) * fileTable.h Added method containsFileName to check if the current table stores a file with the same name 2014-05-27 Riccardo Mottola * ftpclient.m Make file size parsing more robust, checking for () with NSBackwardSearch. 2013-10-19 Riccardo Mottola * localclient.m * ftpclient.m Update file after renaming. * AppController.m Add created folder to remote directory listing. 2013-10-19 Riccardo Mottola * ftpclient.m Cleanup debug logs. 2013-10-19 Riccardo Mottola * fileElement.h * fileElement.m Path and name setters. 2013-07-28 Riccardo Mottola * fileTable.h * fileTable.m File path setter. 2013-07-27 Riccardo Mottola * AppController.h * AppController.m * fileTable.m Make copy of selection before file transfer. Update table after store and retrieve. 2013-07-14 Riccardo Mottola * AppController.h * AppController.m * Resources/FTP.gorm Remote/Local refresh 2013-07-12 Riccardo Mottola * AppController.h (readDirWith) * AppController.m Factor out code for reading directory contents into table and view. 2013-07-11 Riccardo Mottola * AppController.m (localDelete, remoteDelete) Make a copy of selection before performing deletion. 2013-07-11 Riccardo Mottola * fileTable.[h,m] Improve object remove methods regarding sorting array sync, factor sortedArray generation out. 2013-07-09 Riccardo Mottola * fileTable.[h,m] Object add and remove methods. 2013-06-27 Riccardo Mottola * GetNameController.h * GetNameController.m Handle return also in case of window closure through window button. 2013-06-11 Riccardo Mottola * AppController.m Actually create a new folder, local and remote. 2013-06-11 Riccardo Mottola * ftpclient.m * ftpclient.h * AppController.m * AppController.h Change most method parameters from char* to NSString*. 2013-06-10 Riccardo Mottola * ftpclient.m Implement FTP rename RNFR RNTO 2013-06-09 Riccardo Mottola * GetNameController.h * GetNameController.m * AppController.m Rename setDescription to setMessage to avoid method clash 2013-06-07 Riccardo Mottola * GetNameController.m Load interface in init, not runAsModal * AppController.m Actually delete the file! * localclient.m Do not use working dir, but absolute path in the file element. 2013-06-07 Riccardo Mottola * AppController.h * AppController.m * GetNameController.h * GetNameController.m * GNUmakefile * Resources/GetName.gorm * Resources/FTP.gorm Local rename function. 2013-06-04 Riccardo Mottola * localclient.m Local rename function. 2013-06-04 Riccardo MOttola * client.h * client.m Renaming virtual method. 2013-06-01 Riccardo Mottola * AppController * localclient.m Fix memory leak. 2013-05-27 Riccardo Mottola * AppController.[h,m] Remove initialize. 2013-05-27 Riccardo Mottola * AppController.m (dropAction: paths:) Handle local file drop. 2013-05-22 Riccardo Mottola * AppController.m (performStoreFile) Also for button upload action, extract an array from the selectionand upload it. 2013-05-21 Riccardo Mottola * AppController.h * AppController.m Upload dragged files. 2013-05-21 Riccardo Mottola * AppController.m * fileElement.h * fileElement.m * fileTable.m * ftpclient.m * localclient.m Give path and name accessors to FileElement, initialize it with full path when local. 2013-05-19 Riccardo Mottola * AppController.h * AppController.m * fileTable.m Enable and detect drag-n-drop, do not do anything yet. 2013-03-18 Riccardo Mottola * AppController.m Make sure the interface gets enabled after a download/uploadm even if nothing ot done. 2013-03-12 Riccardo Mottola * ftpclient.[h,m] (retrieveFile, storeFile) Make call synchronous instead of asynchronous, solves problem on Mac where calls to the the ftpClient class would hang after a dozen of calls. 2013-02-25 Sebastian Reitenbach * AppController.[m|h] * use NSApplicationTerminateReply 2013-02-21 Riccardo Mottola * AppController.m Fix setting of the datasource and reload data, so that connection works after a disconnection. 2013-02-17 Riccardo Mottola * fileTable.[h,m] Add clear method. * ftpclient.m (disconnect) Close socket and clear status on disconnect. * AppController.m (disconnect) Clear the remote view. 2013-02-17 Riccardo Mottola * AppController.m (disconnect) Clear path menu. 2013-02-17 Riccardo Mottola * fileTable.h Fix memory leak. 2013-02-12 Riccardo Mottola * ftpclient.m Fix RNFR and RNTO not to append CRLF twice. 2013-02-12 Riccardo Mottola * fileTable.[h,m] Transition to NSInteger 2013-02-12 Riccardo Mottola * ftpclient.m Use __BSD_VISIBLE instead of freebsd check for socklen_t 2013-02-04 Riccardo Mottola * Resources/FTP.gorm Fix broken popup connections. 2013-02-04 Riccardo Mottola * AppController.[h,m] Keep connection as ivar and invalidate on closure. 2012-12-12 Riccardo Mottola * Resources/FTP.gorm recreated popupbuttons to fix strange problem. 2012-10-03 Riccardo Mottola * AppController.h * AppController.m Fix warnings. 2012-10-03 Riccardo Mottola * AppController.m: Clear selection on path change. 2012-10-03 Riccardo Mottola * AppController.m: Display conneciton panel at startup. 2012-09-29 Riccardo Mottola * ftpclient.m Show progress while listing remotely. 2012-09-29 Riccardo Mottola * ftpclient.m Remove useless statement. 2012-09-28 Riccardo Mottola * ftpclient.m Get the final size filesize from the 150 response, if it is unknown. 2012-09-28 Riccardo Mottola * fileElement.m: Better parsing of sizes, set size of link always to 0. * ftpclient.m If filesize is unknown, set progress bar to indeterminate. 2012-09-13 Riccardo Mottola * AppController.m Better runloop management during progress and log updates. FTP-0.6/FTP-T.xcodeproj/0000775000175000017500000000000013040104063014255 5ustar multixmultixFTP-0.6/FTP-T.xcodeproj/project.pbxproj0000775000175000017500000004666013040104063017350 0ustar multixmultix// !$*UTF8*$! { archiveVersion = 1; classes = { }; objectVersion = 42; objects = { /* Begin PBXBuildFile section */ 8531288D1767CADA00F56C92 /* GetNameController.h in Headers */ = {isa = PBXBuildFile; fileRef = 8531288B1767CADA00F56C92 /* GetNameController.h */; }; 8531288E1767CADB00F56C92 /* GetNameController.m in Sources */ = {isa = PBXBuildFile; fileRef = 8531288C1767CADA00F56C92 /* GetNameController.m */; }; 85D3CFE11D99296E00679061 /* MainMenu.nib in Resources */ = {isa = PBXBuildFile; fileRef = 29B97319FDCFA39411CA2CEA /* MainMenu.nib */; }; 85D3CFEB1D992A2200679061 /* GetName.nib in Resources */ = {isa = PBXBuildFile; fileRef = 853128931767CC2600F56C92 /* GetName.nib */; }; 85D3CFEE1D992B2C00679061 /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = 85D3CFEC1D992B2C00679061 /* Localizable.strings */; }; 85D3CFF81D992BB100679061 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 089C165DFE840E0CC02AAC07 /* InfoPlist.strings */; }; 85E8F2AD16EFCF6C00E03CA9 /* AppController.h in Headers */ = {isa = PBXBuildFile; fileRef = F5F5F93707FD8CAD01A80101 /* AppController.h */; }; 85E8F2AE16EFCF6C00E03CA9 /* ftpclient.h in Headers */ = {isa = PBXBuildFile; fileRef = F5F5F93907FD8CAD01A80101 /* ftpclient.h */; }; 85E8F2AF16EFCF6C00E03CA9 /* localclient.h in Headers */ = {isa = PBXBuildFile; fileRef = F56A03FD080AC71101A80101 /* localclient.h */; }; 85E8F2B016EFCF6C00E03CA9 /* fileTable.h in Headers */ = {isa = PBXBuildFile; fileRef = F5BE3AF6080C6A3601A80101 /* fileTable.h */; }; 85E8F2B116EFCF6C00E03CA9 /* fileElement.h in Headers */ = {isa = PBXBuildFile; fileRef = F5C84D6008142DF201A80101 /* fileElement.h */; }; 85E8F2B216EFCF6C00E03CA9 /* client.h in Headers */ = {isa = PBXBuildFile; fileRef = F5EFB6470818FE6E01A80101 /* client.h */; }; 85E8F2B616EFCF6C00E03CA9 /* arrow_right.tiff in Resources */ = {isa = PBXBuildFile; fileRef = F5C0879F08A0C47B01A8012F /* arrow_right.tiff */; }; 85E8F2B716EFCF6C00E03CA9 /* arrow_left.tiff in Resources */ = {isa = PBXBuildFile; fileRef = F5C087A108A0C4AF01A8012F /* arrow_left.tiff */; }; 85E8F2B816EFCF6C00E03CA9 /* FTP_icon_osx.icns in Resources */ = {isa = PBXBuildFile; fileRef = 85FC29710DD7B28300A80101 /* FTP_icon_osx.icns */; }; 85E8F2B916EFCF6C00E03CA9 /* README in Resources */ = {isa = PBXBuildFile; fileRef = 853FB7F814A3F52200DE7B18 /* README */; }; 85E8F2BB16EFCF6C00E03CA9 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 29B97316FDCFA39411CA2CEA /* main.m */; settings = {ATTRIBUTES = (); }; }; 85E8F2BC16EFCF6C00E03CA9 /* AppController.m in Sources */ = {isa = PBXBuildFile; fileRef = F5F5F93807FD8CAD01A80101 /* AppController.m */; }; 85E8F2BD16EFCF6C00E03CA9 /* ftpclient.m in Sources */ = {isa = PBXBuildFile; fileRef = F5F5F93A07FD8CAD01A80101 /* ftpclient.m */; }; 85E8F2BE16EFCF6C00E03CA9 /* localclient.m in Sources */ = {isa = PBXBuildFile; fileRef = F56A03FB080AC70701A80101 /* localclient.m */; }; 85E8F2BF16EFCF6C00E03CA9 /* fileTable.m in Sources */ = {isa = PBXBuildFile; fileRef = F5BE3AF7080C6A3601A80101 /* fileTable.m */; }; 85E8F2C016EFCF6C00E03CA9 /* fileElement.m in Sources */ = {isa = PBXBuildFile; fileRef = F5C84D6108142DF201A80101 /* fileElement.m */; }; 85E8F2C116EFCF6C00E03CA9 /* client.m in Sources */ = {isa = PBXBuildFile; fileRef = F5EFB6450818FE6001A80101 /* client.m */; }; 85E8F2C316EFCF6C00E03CA9 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */; }; 85E8F32516EFD9D000E03CA9 /* ChangeLog in Resources */ = {isa = PBXBuildFile; fileRef = 85E8F32416EFD9D000E03CA9 /* ChangeLog */; }; /* End PBXBuildFile section */ /* Begin PBXFileReference section */ 089C165DFE840E0CC02AAC07 /* InfoPlist.strings */ = {isa = PBXFileReference; fileEncoding = 10; lastKnownFileType = text.plist.strings; name = InfoPlist.strings; path = Resources/InfoPlist.strings; sourceTree = ""; }; 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Cocoa.framework; path = /System/Library/Frameworks/Cocoa.framework; sourceTree = ""; }; 29B97316FDCFA39411CA2CEA /* main.m */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; }; 29B97319FDCFA39411CA2CEA /* MainMenu.nib */ = {isa = PBXFileReference; lastKnownFileType = wrapper.nib; name = MainMenu.nib; path = Resources/MainMenu.nib; sourceTree = ""; }; 29B97324FDCFA39411CA2CEA /* AppKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AppKit.framework; path = /System/Library/Frameworks/AppKit.framework; sourceTree = ""; }; 29B97325FDCFA39411CA2CEA /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = /System/Library/Frameworks/Foundation.framework; sourceTree = ""; }; 8531288B1767CADA00F56C92 /* GetNameController.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = GetNameController.h; sourceTree = ""; }; 8531288C1767CADA00F56C92 /* GetNameController.m */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.objc; path = GetNameController.m; sourceTree = ""; }; 853128931767CC2600F56C92 /* GetName.nib */ = {isa = PBXFileReference; lastKnownFileType = wrapper.nib; name = GetName.nib; path = Resources/GetName.nib; sourceTree = ""; }; 853FB7F814A3F52200DE7B18 /* README */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = text; path = README; sourceTree = ""; }; 85D3CFED1D992B2C00679061 /* English */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = text.plist.strings; name = English; path = Resources/English.lproj/Localizable.strings; sourceTree = ""; }; 85D3CFEF1D992B3A00679061 /* German */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = German; path = Resources/German.lproj/Localizable.strings; sourceTree = ""; }; 85D3CFF01D992B4000679061 /* Italian */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = Italian; path = Resources/Italian.lproj/Localizable.strings; sourceTree = ""; }; 85E8F2C916EFCF6C00E03CA9 /* FTP.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = FTP.app; sourceTree = BUILT_PRODUCTS_DIR; }; 85E8F32416EFD9D000E03CA9 /* ChangeLog */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = text; path = ChangeLog; sourceTree = ""; }; 85FC29710DD7B28300A80101 /* FTP_icon_osx.icns */ = {isa = PBXFileReference; lastKnownFileType = image.icns; path = FTP_icon_osx.icns; sourceTree = ""; }; F56A03FB080AC70701A80101 /* localclient.m */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.objc; path = localclient.m; sourceTree = ""; }; F56A03FD080AC71101A80101 /* localclient.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = localclient.h; sourceTree = ""; }; F5BE3AF6080C6A3601A80101 /* fileTable.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = fileTable.h; sourceTree = ""; }; F5BE3AF7080C6A3601A80101 /* fileTable.m */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.objc; path = fileTable.m; sourceTree = ""; }; F5C0879F08A0C47B01A8012F /* arrow_right.tiff */ = {isa = PBXFileReference; lastKnownFileType = image.tiff; path = arrow_right.tiff; sourceTree = ""; }; F5C087A108A0C4AF01A8012F /* arrow_left.tiff */ = {isa = PBXFileReference; lastKnownFileType = image.tiff; path = arrow_left.tiff; sourceTree = ""; }; F5C84D6008142DF201A80101 /* fileElement.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = fileElement.h; sourceTree = ""; }; F5C84D6108142DF201A80101 /* fileElement.m */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.objc; path = fileElement.m; sourceTree = ""; }; F5EFB6450818FE6001A80101 /* client.m */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.objc; path = client.m; sourceTree = ""; }; F5EFB6470818FE6E01A80101 /* client.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = client.h; sourceTree = ""; }; F5F5F93707FD8CAD01A80101 /* AppController.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = AppController.h; sourceTree = ""; }; F5F5F93807FD8CAD01A80101 /* AppController.m */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.objc; path = AppController.m; sourceTree = ""; }; F5F5F93907FD8CAD01A80101 /* ftpclient.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = ftpclient.h; sourceTree = ""; }; F5F5F93A07FD8CAD01A80101 /* ftpclient.m */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.objc; path = ftpclient.m; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ 85E8F2C216EFCF6C00E03CA9 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( 85E8F2C316EFCF6C00E03CA9 /* Cocoa.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ 080E96DDFE201D6D7F000001 /* Classes */ = { isa = PBXGroup; children = ( 8531288B1767CADA00F56C92 /* GetNameController.h */, 8531288C1767CADA00F56C92 /* GetNameController.m */, F5F5F93707FD8CAD01A80101 /* AppController.h */, F5F5F93807FD8CAD01A80101 /* AppController.m */, F5F5F93907FD8CAD01A80101 /* ftpclient.h */, F5F5F93A07FD8CAD01A80101 /* ftpclient.m */, F56A03FB080AC70701A80101 /* localclient.m */, F56A03FD080AC71101A80101 /* localclient.h */, F5BE3AF6080C6A3601A80101 /* fileTable.h */, F5BE3AF7080C6A3601A80101 /* fileTable.m */, F5C84D6008142DF201A80101 /* fileElement.h */, F5C84D6108142DF201A80101 /* fileElement.m */, F5EFB6470818FE6E01A80101 /* client.h */, F5EFB6450818FE6001A80101 /* client.m */, ); name = Classes; sourceTree = ""; }; 1058C7A0FEA54F0111CA2CBB /* Linked Frameworks */ = { isa = PBXGroup; children = ( 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */, ); name = "Linked Frameworks"; sourceTree = ""; }; 1058C7A2FEA54F0111CA2CBB /* Other Frameworks */ = { isa = PBXGroup; children = ( 29B97325FDCFA39411CA2CEA /* Foundation.framework */, 29B97324FDCFA39411CA2CEA /* AppKit.framework */, ); name = "Other Frameworks"; sourceTree = ""; }; 19C28FACFE9D520D11CA2CBB /* Products */ = { isa = PBXGroup; children = ( 85E8F2C916EFCF6C00E03CA9 /* FTP.app */, ); name = Products; sourceTree = ""; }; 29B97314FDCFA39411CA2CEA /* FTP */ = { isa = PBXGroup; children = ( 080E96DDFE201D6D7F000001 /* Classes */, 29B97315FDCFA39411CA2CEA /* Other Sources */, 29B97317FDCFA39411CA2CEA /* Resources */, 29B97323FDCFA39411CA2CEA /* Frameworks */, 19C28FACFE9D520D11CA2CBB /* Products */, ); name = FTP; sourceTree = ""; }; 29B97315FDCFA39411CA2CEA /* Other Sources */ = { isa = PBXGroup; children = ( 29B97316FDCFA39411CA2CEA /* main.m */, ); name = "Other Sources"; sourceTree = ""; }; 29B97317FDCFA39411CA2CEA /* Resources */ = { isa = PBXGroup; children = ( 85D3CFEC1D992B2C00679061 /* Localizable.strings */, 853128931767CC2600F56C92 /* GetName.nib */, 85E8F32416EFD9D000E03CA9 /* ChangeLog */, 853FB7F814A3F52200DE7B18 /* README */, 85FC29710DD7B28300A80101 /* FTP_icon_osx.icns */, 29B97319FDCFA39411CA2CEA /* MainMenu.nib */, 089C165DFE840E0CC02AAC07 /* InfoPlist.strings */, F5C0879F08A0C47B01A8012F /* arrow_right.tiff */, F5C087A108A0C4AF01A8012F /* arrow_left.tiff */, ); name = Resources; sourceTree = ""; }; 29B97323FDCFA39411CA2CEA /* Frameworks */ = { isa = PBXGroup; children = ( 1058C7A0FEA54F0111CA2CBB /* Linked Frameworks */, 1058C7A2FEA54F0111CA2CBB /* Other Frameworks */, ); name = Frameworks; sourceTree = ""; }; /* End PBXGroup section */ /* Begin PBXHeadersBuildPhase section */ 85E8F2AC16EFCF6C00E03CA9 /* Headers */ = { isa = PBXHeadersBuildPhase; buildActionMask = 2147483647; files = ( 85E8F2AD16EFCF6C00E03CA9 /* AppController.h in Headers */, 85E8F2AE16EFCF6C00E03CA9 /* ftpclient.h in Headers */, 85E8F2AF16EFCF6C00E03CA9 /* localclient.h in Headers */, 85E8F2B016EFCF6C00E03CA9 /* fileTable.h in Headers */, 85E8F2B116EFCF6C00E03CA9 /* fileElement.h in Headers */, 85E8F2B216EFCF6C00E03CA9 /* client.h in Headers */, 8531288D1767CADA00F56C92 /* GetNameController.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXHeadersBuildPhase section */ /* Begin PBXNativeTarget section */ 85E8F2AB16EFCF6C00E03CA9 /* FTP */ = { isa = PBXNativeTarget; buildConfigurationList = 85E8F2C416EFCF6C00E03CA9 /* Build configuration list for PBXNativeTarget "FTP" */; buildPhases = ( 85E8F2AC16EFCF6C00E03CA9 /* Headers */, 85E8F2B316EFCF6C00E03CA9 /* Resources */, 85E8F2BA16EFCF6C00E03CA9 /* Sources */, 85E8F2C216EFCF6C00E03CA9 /* Frameworks */, ); buildRules = ( ); dependencies = ( ); name = FTP; productInstallPath = "$(HOME)/Applications"; productName = FTP; productReference = 85E8F2C916EFCF6C00E03CA9 /* FTP.app */; productType = "com.apple.product-type.application"; }; /* End PBXNativeTarget section */ /* Begin PBXProject section */ 29B97313FDCFA39411CA2CEA /* Project object */ = { isa = PBXProject; buildConfigurationList = 85A6DBE310D43D010048FE0B /* Build configuration list for PBXProject "FTP-T" */; compatibilityVersion = "Xcode 2.4"; hasScannedForEncodings = 1; knownRegions = ( English, Japanese, French, German, Italian, ); mainGroup = 29B97314FDCFA39411CA2CEA /* FTP */; projectDirPath = ""; projectRoot = ""; targets = ( 85E8F2AB16EFCF6C00E03CA9 /* FTP */, ); }; /* End PBXProject section */ /* Begin PBXResourcesBuildPhase section */ 85E8F2B316EFCF6C00E03CA9 /* Resources */ = { isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( 85D3CFE11D99296E00679061 /* MainMenu.nib in Resources */, 85D3CFF81D992BB100679061 /* InfoPlist.strings in Resources */, 85E8F2B616EFCF6C00E03CA9 /* arrow_right.tiff in Resources */, 85E8F2B716EFCF6C00E03CA9 /* arrow_left.tiff in Resources */, 85E8F2B816EFCF6C00E03CA9 /* FTP_icon_osx.icns in Resources */, 85E8F2B916EFCF6C00E03CA9 /* README in Resources */, 85E8F32516EFD9D000E03CA9 /* ChangeLog in Resources */, 85D3CFEB1D992A2200679061 /* GetName.nib in Resources */, 85D3CFEE1D992B2C00679061 /* Localizable.strings in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXResourcesBuildPhase section */ /* Begin PBXSourcesBuildPhase section */ 85E8F2BA16EFCF6C00E03CA9 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( 85E8F2BB16EFCF6C00E03CA9 /* main.m in Sources */, 85E8F2BC16EFCF6C00E03CA9 /* AppController.m in Sources */, 85E8F2BD16EFCF6C00E03CA9 /* ftpclient.m in Sources */, 85E8F2BE16EFCF6C00E03CA9 /* localclient.m in Sources */, 85E8F2BF16EFCF6C00E03CA9 /* fileTable.m in Sources */, 85E8F2C016EFCF6C00E03CA9 /* fileElement.m in Sources */, 85E8F2C116EFCF6C00E03CA9 /* client.m in Sources */, 8531288E1767CADB00F56C92 /* GetNameController.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXSourcesBuildPhase section */ /* Begin PBXVariantGroup section */ 85D3CFEC1D992B2C00679061 /* Localizable.strings */ = { isa = PBXVariantGroup; children = ( 85D3CFED1D992B2C00679061 /* English */, 85D3CFEF1D992B3A00679061 /* German */, 85D3CFF01D992B4000679061 /* Italian */, ); name = Localizable.strings; sourceTree = ""; }; /* End PBXVariantGroup section */ /* Begin XCBuildConfiguration section */ 85A6DBE410D43D010048FE0B /* Development */ = { isa = XCBuildConfiguration; buildSettings = { }; name = Development; }; 85A6DBE510D43D010048FE0B /* Deployment */ = { isa = XCBuildConfiguration; buildSettings = { }; name = Deployment; }; 85A6DBE610D43D010048FE0B /* Default */ = { isa = XCBuildConfiguration; buildSettings = { }; name = Default; }; 85E8F2C516EFCF6C00E03CA9 /* Development */ = { isa = XCBuildConfiguration; buildSettings = { COPY_PHASE_STRIP = NO; FRAMEWORK_SEARCH_PATHS = ""; GCC_DYNAMIC_NO_PIC = NO; GCC_ENABLE_FIX_AND_CONTINUE = YES; GCC_GENERATE_DEBUGGING_SYMBOLS = YES; GCC_OPTIMIZATION_LEVEL = 0; GCC_SYMBOLS_PRIVATE_EXTERN = NO; HEADER_SEARCH_PATHS = ""; INFOPLIST_FILE = "Info-FTP.plist"; INSTALL_PATH = "$(HOME)/Applications"; LIBRARY_SEARCH_PATHS = ""; OTHER_CFLAGS = ""; OTHER_LDFLAGS = ""; PRODUCT_NAME = FTP; SECTORDER_FLAGS = ""; WARNING_CFLAGS = ( "-Wmost", "-Wno-four-char-constants", "-Wno-unknown-pragmas", ); WRAPPER_EXTENSION = app; ZERO_LINK = YES; }; name = Development; }; 85E8F2C616EFCF6C00E03CA9 /* Deployment */ = { isa = XCBuildConfiguration; buildSettings = { COPY_PHASE_STRIP = YES; FRAMEWORK_SEARCH_PATHS = ""; GCC_ENABLE_FIX_AND_CONTINUE = NO; GCC_SYMBOLS_PRIVATE_EXTERN = NO; HEADER_SEARCH_PATHS = ""; INFOPLIST_FILE = "Info-FTP.plist"; INSTALL_PATH = "$(HOME)/Applications"; LIBRARY_SEARCH_PATHS = ""; OTHER_CFLAGS = ""; OTHER_LDFLAGS = ""; PRODUCT_NAME = FTP; SECTORDER_FLAGS = ""; WARNING_CFLAGS = ( "-Wmost", "-Wno-four-char-constants", "-Wno-unknown-pragmas", ); WRAPPER_EXTENSION = app; ZERO_LINK = NO; }; name = Deployment; }; 85E8F2C716EFCF6C00E03CA9 /* Default */ = { isa = XCBuildConfiguration; buildSettings = { FRAMEWORK_SEARCH_PATHS = ""; GCC_SYMBOLS_PRIVATE_EXTERN = NO; HEADER_SEARCH_PATHS = ""; INFOPLIST_FILE = "Info-FTP.plist"; INSTALL_PATH = "$(HOME)/Applications"; LIBRARY_SEARCH_PATHS = ""; OTHER_CFLAGS = ""; OTHER_LDFLAGS = ""; PRODUCT_NAME = FTP; SECTORDER_FLAGS = ""; WARNING_CFLAGS = ( "-Wmost", "-Wno-four-char-constants", "-Wno-unknown-pragmas", ); WRAPPER_EXTENSION = app; }; name = Default; }; /* End XCBuildConfiguration section */ /* Begin XCConfigurationList section */ 85A6DBE310D43D010048FE0B /* Build configuration list for PBXProject "FTP-T" */ = { isa = XCConfigurationList; buildConfigurations = ( 85A6DBE410D43D010048FE0B /* Development */, 85A6DBE510D43D010048FE0B /* Deployment */, 85A6DBE610D43D010048FE0B /* Default */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Default; }; 85E8F2C416EFCF6C00E03CA9 /* Build configuration list for PBXNativeTarget "FTP" */ = { isa = XCConfigurationList; buildConfigurations = ( 85E8F2C516EFCF6C00E03CA9 /* Development */, 85E8F2C616EFCF6C00E03CA9 /* Deployment */, 85E8F2C716EFCF6C00E03CA9 /* Default */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Default; }; /* End XCConfigurationList section */ }; rootObject = 29B97313FDCFA39411CA2CEA /* Project object */; } FTP-0.6/GNUmakefile0000664000175000017500000000264613040104063013511 0ustar multixmultix# # GNUmakefile - Generated by ProjectCenter # ifeq ($(GNUSTEP_MAKEFILES),) GNUSTEP_MAKEFILES := $(shell gnustep-config --variable=GNUSTEP_MAKEFILES 2>/dev/null) ifeq ($(GNUSTEP_MAKEFILES),) $(warning ) $(warning Unable to obtain GNUSTEP_MAKEFILES setting from gnustep-config!) $(warning Perhaps gnustep-make is not properly installed,) $(warning so gnustep-config is not in your PATH.) $(warning ) $(warning Your PATH is currently $(PATH)) $(warning ) endif endif ifeq ($(GNUSTEP_MAKEFILES),) $(error You need to set GNUSTEP_MAKEFILES before compiling!) endif include $(GNUSTEP_MAKEFILES)/common.make # # Application # VERSION = 0.6 PACKAGE_NAME = FTP APP_NAME = FTP FTP_APPLICATION_ICON = FTP_icon_gs.tif # # Resource files # FTP_RESOURCE_FILES = \ Resources/FTP.gorm \ Resources/GetName.gorm \ Resources/FTP_icon_gs.tif \ Resources/arrow_left.tiff \ Resources/arrow_right.tiff # # Header files # FTP_HEADER_FILES = \ AppController.h \ client.h \ fileElement.h \ fileTable.h \ ftpclient.h \ GetNameController.h \ localclient.h # # Objective-C Class files # FTP_OBJC_FILES = \ AppController.m \ client.m \ fileElement.m \ fileTable.m \ ftpclient.m \ GetNameController.m \ localclient.m # # Other sources # FTP_OBJC_FILES += \ main.m # # Makefiles # -include GNUmakefile.preamble include $(GNUSTEP_MAKEFILES)/aggregate.make include $(GNUSTEP_MAKEFILES)/application.make -include GNUmakefile.postamble FTP-0.6/FTP.xcode/0000775000175000017500000000000013040104062013160 5ustar multixmultixFTP-0.6/FTP.xcode/project.pbxproj0000664000175000017500000003551513040104062016245 0ustar multixmultix// !$*UTF8*$! { archiveVersion = 1; classes = { }; objectVersion = 39; objects = { 080E96DDFE201D6D7F000001 = { children = ( 85D69C7917629757000AC90B, 85D69C7A17629757000AC90B, F5F5F93707FD8CAD01A80101, F5F5F93807FD8CAD01A80101, F5F5F93907FD8CAD01A80101, F5F5F93A07FD8CAD01A80101, F56A03FB080AC70701A80101, F56A03FD080AC71101A80101, F5BE3AF6080C6A3601A80101, F5BE3AF7080C6A3601A80101, F5C84D6008142DF201A80101, F5C84D6108142DF201A80101, F5EFB6470818FE6E01A80101, F5EFB6450818FE6001A80101, ); isa = PBXGroup; name = Classes; refType = 4; sourceTree = ""; }; //080 //081 //082 //083 //084 //100 //101 //102 //103 //104 1058C7A0FEA54F0111CA2CBB = { children = ( 1058C7A1FEA54F0111CA2CBB, ); isa = PBXGroup; name = "Linked Frameworks"; refType = 4; sourceTree = ""; }; 1058C7A1FEA54F0111CA2CBB = { isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Cocoa.framework; path = /System/Library/Frameworks/Cocoa.framework; refType = 0; sourceTree = ""; }; 1058C7A2FEA54F0111CA2CBB = { children = ( 29B97325FDCFA39411CA2CEA, 29B97324FDCFA39411CA2CEA, ); isa = PBXGroup; name = "Other Frameworks"; refType = 4; sourceTree = ""; }; //100 //101 //102 //103 //104 //190 //191 //192 //193 //194 19C28FACFE9D520D11CA2CBB = { children = ( 8576CCFB152E1559008F8C62, ); isa = PBXGroup; name = Products; refType = 4; sourceTree = ""; }; //190 //191 //192 //193 //194 //290 //291 //292 //293 //294 29B97313FDCFA39411CA2CEA = { buildSettings = { }; buildStyles = ( 4A9504CCFFE6A4B311CA0CBA, 4A9504CDFFE6A4B311CA0CBA, ); hasScannedForEncodings = 1; isa = PBXProject; knownRegions = ( English, Japanese, French, German, Italian, ); mainGroup = 29B97314FDCFA39411CA2CEA; projectDirPath = ""; targets = ( 8576CCE2152E1559008F8C62, ); }; 29B97314FDCFA39411CA2CEA = { children = ( 080E96DDFE201D6D7F000001, 29B97315FDCFA39411CA2CEA, 29B97317FDCFA39411CA2CEA, 29B97323FDCFA39411CA2CEA, 19C28FACFE9D520D11CA2CBB, 8576CCFA152E1559008F8C62, ); isa = PBXGroup; name = FTP; path = ""; refType = 4; sourceTree = ""; }; 29B97315FDCFA39411CA2CEA = { children = ( 29B97316FDCFA39411CA2CEA, ); isa = PBXGroup; name = "Other Sources"; path = ""; refType = 4; sourceTree = ""; }; 29B97316FDCFA39411CA2CEA = { fileEncoding = 30; isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; refType = 4; sourceTree = ""; }; 29B97317FDCFA39411CA2CEA = { children = ( 85848F181DBFE1F70050DC12, 85848F121DBFE1A70050DC12, 85848F131DBFE1A70050DC12, 85848F141DBFE1A70050DC12, 85D69CD717651E24000AC90B, 85FC29710DD7B28300A80101, F5C0879F08A0C47B01A8012F, F5C087A108A0C4AF01A8012F, ); isa = PBXGroup; name = Resources; path = ""; refType = 4; sourceTree = ""; }; 29B97323FDCFA39411CA2CEA = { children = ( 1058C7A0FEA54F0111CA2CBB, 1058C7A2FEA54F0111CA2CBB, ); isa = PBXGroup; name = Frameworks; path = ""; refType = 4; sourceTree = ""; }; 29B97324FDCFA39411CA2CEA = { isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AppKit.framework; path = /System/Library/Frameworks/AppKit.framework; refType = 0; sourceTree = ""; }; 29B97325FDCFA39411CA2CEA = { isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = /System/Library/Frameworks/Foundation.framework; refType = 0; sourceTree = ""; }; //290 //291 //292 //293 //294 //4A0 //4A1 //4A2 //4A3 //4A4 4A9504CCFFE6A4B311CA0CBA = { buildSettings = { COPY_PHASE_STRIP = NO; GCC_DYNAMIC_NO_PIC = NO; GCC_ENABLE_FIX_AND_CONTINUE = YES; GCC_GENERATE_DEBUGGING_SYMBOLS = YES; GCC_OPTIMIZATION_LEVEL = 0; OPTIMIZATION_CFLAGS = "-O0"; ZERO_LINK = YES; }; isa = PBXBuildStyle; name = Development; }; 4A9504CDFFE6A4B311CA0CBA = { buildSettings = { COPY_PHASE_STRIP = YES; GCC_ENABLE_FIX_AND_CONTINUE = NO; ZERO_LINK = NO; }; isa = PBXBuildStyle; name = Deployment; }; //4A0 //4A1 //4A2 //4A3 //4A4 //850 //851 //852 //853 //854 8576CCE2152E1559008F8C62 = { buildPhases = ( 8576CCE3152E1559008F8C62, 8576CCEA152E1559008F8C62, 8576CCF0152E1559008F8C62, 8576CCF8152E1559008F8C62, ); buildRules = ( ); buildSettings = { FRAMEWORK_SEARCH_PATHS = ""; GCC_ENABLE_CPP_EXCEPTIONS = NO; GCC_ENABLE_CPP_RTTI = NO; GCC_ENABLE_PASCAL_STRINGS = NO; GCC_MODEL_TUNING = G3; HEADER_SEARCH_PATHS = ""; INFOPLIST_FILE = "Info-FTP.plist"; INSTALL_PATH = "$(HOME)/Applications"; LIBRARY_SEARCH_PATHS = ""; OTHER_CFLAGS = ""; OTHER_LDFLAGS = ""; PRODUCT_NAME = FTP; SECTORDER_FLAGS = ""; WARNING_CFLAGS = "-Wmost -Wno-four-char-constants -Wno-unknown-pragmas"; WRAPPER_EXTENSION = app; }; dependencies = ( ); isa = PBXNativeTarget; name = FTP; productInstallPath = "$(HOME)/Applications"; productName = FTP; productReference = 8576CCFB152E1559008F8C62; productType = "com.apple.product-type.application"; }; 8576CCE3152E1559008F8C62 = { buildActionMask = 2147483647; files = ( 8576CCE4152E1559008F8C62, 8576CCE5152E1559008F8C62, 8576CCE6152E1559008F8C62, 8576CCE7152E1559008F8C62, 8576CCE8152E1559008F8C62, 8576CCE9152E1559008F8C62, 85D69C7B17629757000AC90B, ); isa = PBXHeadersBuildPhase; runOnlyForDeploymentPostprocessing = 0; }; 8576CCE4152E1559008F8C62 = { fileRef = F5F5F93707FD8CAD01A80101; isa = PBXBuildFile; settings = { }; }; 8576CCE5152E1559008F8C62 = { fileRef = F5F5F93907FD8CAD01A80101; isa = PBXBuildFile; settings = { }; }; 8576CCE6152E1559008F8C62 = { fileRef = F56A03FD080AC71101A80101; isa = PBXBuildFile; settings = { }; }; 8576CCE7152E1559008F8C62 = { fileRef = F5BE3AF6080C6A3601A80101; isa = PBXBuildFile; settings = { }; }; 8576CCE8152E1559008F8C62 = { fileRef = F5C84D6008142DF201A80101; isa = PBXBuildFile; settings = { }; }; 8576CCE9152E1559008F8C62 = { fileRef = F5EFB6470818FE6E01A80101; isa = PBXBuildFile; settings = { }; }; 8576CCEA152E1559008F8C62 = { buildActionMask = 2147483647; files = ( 8576CCED152E1559008F8C62, 8576CCEE152E1559008F8C62, 8576CCEF152E1559008F8C62, 85D69CD817651E24000AC90B, 85848F151DBFE1A70050DC12, 85848F161DBFE1A70050DC12, 85848F171DBFE1A70050DC12, 85848F1A1DBFE1F70050DC12, ); isa = PBXResourcesBuildPhase; runOnlyForDeploymentPostprocessing = 0; }; 8576CCED152E1559008F8C62 = { fileRef = F5C0879F08A0C47B01A8012F; isa = PBXBuildFile; settings = { }; }; 8576CCEE152E1559008F8C62 = { fileRef = F5C087A108A0C4AF01A8012F; isa = PBXBuildFile; settings = { }; }; 8576CCEF152E1559008F8C62 = { fileRef = 85FC29710DD7B28300A80101; isa = PBXBuildFile; settings = { }; }; 8576CCF0152E1559008F8C62 = { buildActionMask = 2147483647; files = ( 8576CCF1152E1559008F8C62, 8576CCF2152E1559008F8C62, 8576CCF3152E1559008F8C62, 8576CCF4152E1559008F8C62, 8576CCF5152E1559008F8C62, 8576CCF6152E1559008F8C62, 8576CCF7152E1559008F8C62, 85D69C7C17629757000AC90B, ); isa = PBXSourcesBuildPhase; runOnlyForDeploymentPostprocessing = 0; }; 8576CCF1152E1559008F8C62 = { fileRef = 29B97316FDCFA39411CA2CEA; isa = PBXBuildFile; settings = { ATTRIBUTES = ( ); }; }; 8576CCF2152E1559008F8C62 = { fileRef = F5F5F93807FD8CAD01A80101; isa = PBXBuildFile; settings = { }; }; 8576CCF3152E1559008F8C62 = { fileRef = F5F5F93A07FD8CAD01A80101; isa = PBXBuildFile; settings = { }; }; 8576CCF4152E1559008F8C62 = { fileRef = F56A03FB080AC70701A80101; isa = PBXBuildFile; settings = { }; }; 8576CCF5152E1559008F8C62 = { fileRef = F5BE3AF7080C6A3601A80101; isa = PBXBuildFile; settings = { }; }; 8576CCF6152E1559008F8C62 = { fileRef = F5C84D6108142DF201A80101; isa = PBXBuildFile; settings = { }; }; 8576CCF7152E1559008F8C62 = { fileRef = F5EFB6450818FE6001A80101; isa = PBXBuildFile; settings = { }; }; 8576CCF8152E1559008F8C62 = { buildActionMask = 2147483647; files = ( 8576CCF9152E1559008F8C62, ); isa = PBXFrameworksBuildPhase; runOnlyForDeploymentPostprocessing = 0; }; 8576CCF9152E1559008F8C62 = { fileRef = 1058C7A1FEA54F0111CA2CBB; isa = PBXBuildFile; settings = { }; }; 8576CCFA152E1559008F8C62 = { isa = PBXFileReference; lastKnownFileType = text.xml; path = "Info-FTP.plist"; refType = 4; sourceTree = ""; }; 8576CCFB152E1559008F8C62 = { explicitFileType = wrapper.application; includeInIndex = 0; isa = PBXFileReference; path = FTP.app; refType = 3; sourceTree = BUILT_PRODUCTS_DIR; }; 85848F121DBFE1A70050DC12 = { isa = PBXFileReference; lastKnownFileType = wrapper.nib; name = GetName.nib; path = Resources/GetName.nib; refType = 4; sourceTree = ""; }; 85848F131DBFE1A70050DC12 = { fileEncoding = 30; isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = InfoPlist.strings; path = Resources/InfoPlist.strings; refType = 4; sourceTree = ""; }; 85848F141DBFE1A70050DC12 = { isa = PBXFileReference; lastKnownFileType = wrapper.nib; name = MainMenu.nib; path = Resources/MainMenu.nib; refType = 4; sourceTree = ""; }; 85848F151DBFE1A70050DC12 = { fileRef = 85848F121DBFE1A70050DC12; isa = PBXBuildFile; settings = { }; }; 85848F161DBFE1A70050DC12 = { fileRef = 85848F131DBFE1A70050DC12; isa = PBXBuildFile; settings = { }; }; 85848F171DBFE1A70050DC12 = { fileRef = 85848F141DBFE1A70050DC12; isa = PBXBuildFile; settings = { }; }; 85848F181DBFE1F70050DC12 = { children = ( 85848F191DBFE1F70050DC12, 85848F1B1DBFE2040050DC12, 85848F1C1DBFE20A0050DC12, ); isa = PBXVariantGroup; name = Localizable.strings; path = ""; refType = 4; sourceTree = ""; }; 85848F191DBFE1F70050DC12 = { fileEncoding = 30; isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = English; path = Resources/English.lproj/Localizable.strings; refType = 4; sourceTree = ""; }; 85848F1A1DBFE1F70050DC12 = { fileRef = 85848F181DBFE1F70050DC12; isa = PBXBuildFile; settings = { }; }; 85848F1B1DBFE2040050DC12 = { isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = German; path = Resources/German.lproj/Localizable.strings; refType = 4; sourceTree = ""; }; 85848F1C1DBFE20A0050DC12 = { isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = Italian; path = Resources/Italian.lproj/Localizable.strings; refType = 4; sourceTree = ""; }; 85D69C7917629757000AC90B = { fileEncoding = 30; isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GetNameController.h; refType = 4; sourceTree = ""; }; 85D69C7A17629757000AC90B = { fileEncoding = 30; isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = GetNameController.m; refType = 4; sourceTree = ""; }; 85D69C7B17629757000AC90B = { fileRef = 85D69C7917629757000AC90B; isa = PBXBuildFile; settings = { }; }; 85D69C7C17629757000AC90B = { fileRef = 85D69C7A17629757000AC90B; isa = PBXBuildFile; settings = { }; }; 85D69CD717651E24000AC90B = { fileEncoding = 30; isa = PBXFileReference; lastKnownFileType = text; path = ChangeLog; refType = 4; sourceTree = ""; }; 85D69CD817651E24000AC90B = { fileRef = 85D69CD717651E24000AC90B; isa = PBXBuildFile; settings = { }; }; 85FC29710DD7B28300A80101 = { isa = PBXFileReference; lastKnownFileType = image.icns; path = FTP_icon_osx.icns; refType = 4; sourceTree = ""; }; //850 //851 //852 //853 //854 //F50 //F51 //F52 //F53 //F54 F56A03FB080AC70701A80101 = { fileEncoding = 30; isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = localclient.m; refType = 4; sourceTree = ""; }; F56A03FD080AC71101A80101 = { fileEncoding = 30; isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = localclient.h; refType = 4; sourceTree = ""; }; F5BE3AF6080C6A3601A80101 = { fileEncoding = 30; isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = fileTable.h; refType = 4; sourceTree = ""; }; F5BE3AF7080C6A3601A80101 = { fileEncoding = 30; isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = fileTable.m; refType = 4; sourceTree = ""; }; F5C0879F08A0C47B01A8012F = { isa = PBXFileReference; lastKnownFileType = image.tiff; path = arrow_right.tiff; refType = 4; sourceTree = ""; }; F5C087A108A0C4AF01A8012F = { isa = PBXFileReference; lastKnownFileType = image.tiff; path = arrow_left.tiff; refType = 4; sourceTree = ""; }; F5C84D6008142DF201A80101 = { fileEncoding = 30; isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = fileElement.h; refType = 4; sourceTree = ""; }; F5C84D6108142DF201A80101 = { fileEncoding = 30; isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = fileElement.m; refType = 4; sourceTree = ""; }; F5EFB6450818FE6001A80101 = { fileEncoding = 30; isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = client.m; refType = 4; sourceTree = ""; }; F5EFB6470818FE6E01A80101 = { fileEncoding = 30; isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = client.h; refType = 4; sourceTree = ""; }; F5F5F93707FD8CAD01A80101 = { fileEncoding = 30; isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AppController.h; refType = 4; sourceTree = ""; }; F5F5F93807FD8CAD01A80101 = { fileEncoding = 30; isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = AppController.m; refType = 4; sourceTree = ""; }; F5F5F93907FD8CAD01A80101 = { fileEncoding = 30; isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ftpclient.h; refType = 4; sourceTree = ""; }; F5F5F93A07FD8CAD01A80101 = { fileEncoding = 30; isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = ftpclient.m; refType = 4; sourceTree = ""; }; }; rootObject = 29B97313FDCFA39411CA2CEA; } FTP-0.6/GetNameController.m0000664000175000017500000000421413040104063015172 0ustar multixmultix/* -*- mode: objc -*- Project: FTP Copyright (C) 2013-2016 Free Software Foundation Author: Riccardo Mottola Created: 2013-06-05 Controller class to get an new name from the user in a panel dialog. This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #import #import #import "GetNameController.h" @implementation GetNameController : NSObject - (id)init { if ((self = [super init])) { [NSBundle loadNibNamed: @"GetName" owner: self]; [panel setDelegate: self]; [labelField setStringValue:NSLocalizedString(@"Name:", @"Name:")]; [cancelButton setTitle:NSLocalizedString(@"Cancel", @"Cancel")]; [okButton setTitle:NSLocalizedString(@"Ok", @"Ok")]; } return self; } -(NSInteger)runAsModal { [panel makeFirstResponder: textField]; returnCode = NSAlertErrorReturn; [NSApp runModalForWindow: panel]; return returnCode; } -(void)setTitle:(NSString *)title { [panel setTitle:title]; } -(void)setMessage:(NSString *)desc { [messageField setStringValue:desc]; } -(void)setName:(NSString *)name { [textField setStringValue:name]; } -(NSString *)name; { return [textField stringValue]; } -(IBAction)okPressed:(id)sender { returnCode = NSAlertDefaultReturn; [panel performClose:self]; } -(IBAction)cancelPressed:(id)sender { returnCode = NSAlertAlternateReturn; [panel performClose:self]; } - (void)windowWillClose:(NSNotification *)aNotification { [NSApp stopModalWithCode: returnCode]; } @end FTP-0.6/Info-FTP.plist0000664000175000017500000000140313151733471014042 0ustar multixmultix CFBundleDevelopmentRegion English CFBundleExecutable FTP CFBundleIconFile FTP_icon_osx CFBundleIdentifier org.gap.FTP CFBundleInfoDictionaryVersion 6.0 CFBundlePackageType APPL CFBundleSignature ???? CFBundleVersion 0.6 NSMainNibFile MainMenu NSPrincipalClass NSApplication FTP-0.6/fileElement.h0000664000175000017500000000277412750205530014053 0ustar multixmultix/* Project: FTP Copyright (C) 2005-2016 Riccardo Mottola Author: Riccardo Mottola Created: 2005-04-18 Single element of a file listing This application is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This application is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License for more details. You should have received a copy of the GNU General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #import @interface FileElement : NSObject { NSString *fileName; NSString *filePath; NSString *linkTargetName; BOOL isDir; BOOL isLink; unsigned long long size; NSDate *modifDate; } - (id)initWithPath:(NSString *)path andAttributes:(NSDictionary *)attribs; - (id)initWithLsLine :(char *)line; - (NSDictionary *)attributes; - (NSString *)name; - (void)setName: (NSString *)n; - (NSString *)path; - (void)setPath: (NSString *)p; - (NSString *)linkTargetName; - (BOOL)isDir; - (BOOL)isLink; - (void)setIsLink:(BOOL)flag; - (unsigned long long)size; @end FTP-0.6/fileTable.h0000664000175000017500000000317513040104063013475 0ustar multixmultix/* Project: FTP Copyright (C) 2005-2016 Riccardo Mottola Author: Riccardo Mottola Created: 2005-04-12 Table class for file listing This application is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This application is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License for more details. You should have received a copy of the GNU General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #import #import "fileElement.h" #define TAG_FILENAME @"filename" #if !defined (GNUSTEP) && (MAC_OS_X_VERSION_MAX_ALLOWED <= MAC_OS_X_VERSION_10_4) #ifndef NSInteger #define NSInteger int #endif #ifndef NSUInteger #define NSUInteger unsigned #endif #endif enum sortOrderDef { ascending, descending, undefined }; @interface FileTable : NSObject { NSMutableArray *fileStructs; NSMutableArray *sortedArray; NSString *sortByIdent; enum sortOrderDef sortOrder; } - (void)initData:(NSArray *)fnames; - (void)clear; - (FileElement *)elementAtIndex:(NSUInteger)index; - (void)generateSortedArray; - (void)addObject:(FileElement *)object; - (void)removeObject:(FileElement *)object; - (void)sortByIdent:(NSString *)idStr; - (BOOL)containsFileName:(NSString *)name; @end FTP-0.6/fileTable.m0000664000175000017500000001320113040104063013471 0ustar multixmultix/* Project: FTP Copyright (C) 2005-2016 Riccardo Mottola Author: Riccardo Mottola Created: 2005-04-12 Table class for file listing This application is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This application is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License for more details. You should have received a copy of the GNU General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #import "fileTable.h" #import "fileElement.h" #import "AppController.h" /* The sortedArray is just an array of pointers to the original unsorted file elements */ NSComparisonResult compareFileStructs(id e1, id e2, void *context) { NSString *s1; NSString *s2; NSComparisonResult r; enum sortOrderDef sortOrder; s1 = [(FileElement *)e1 name]; s2 = [(FileElement *)e2 name]; sortOrder = *(enum sortOrderDef *)context; r = [s1 compare: s2]; if (sortOrder == descending) { if (r == NSOrderedAscending) r = NSOrderedDescending; else if (r == NSOrderedDescending) r = NSOrderedAscending; } return r; } @implementation FileTable - (void)initData:(NSArray *)fnames { sortByIdent = nil; if (fileStructs) { [fileStructs release]; [sortedArray release]; } fileStructs = [[NSMutableArray arrayWithArray:fnames] retain]; sortedArray = [[NSMutableArray arrayWithCapacity: [fileStructs count]] retain]; [self generateSortedArray]; sortOrder = undefined; } - (void)dealloc { [fileStructs release]; [sortedArray release]; [super dealloc]; } - (void)clear { [fileStructs release]; fileStructs = nil; [sortedArray release]; sortedArray = nil; } - (void)generateSortedArray { NSUInteger i; [sortedArray removeAllObjects]; for (i = 0; i < [fileStructs count]; i++) { FileElement *fe; fe = [fileStructs objectAtIndex: i]; [sortedArray addObject: fe]; } } - (void)addObject:(FileElement *)object { /* add the file element to the storage */ [fileStructs addObject:object]; /* keep the sorting map array in sync */ [sortedArray addObject:object]; if (sortOrder != undefined) { [sortedArray sortUsingFunction:compareFileStructs context:&sortOrder]; } } - (void)removeObject:(FileElement *)object { NSUInteger index; index = [fileStructs indexOfObject:object]; if (index == NSNotFound) { NSLog(@"Object not found, internal error"); return; } /* remove object from storage */ [fileStructs removeObject:object]; index = [sortedArray indexOfObject:object]; if (index != NSNotFound) [sortedArray removeObjectAtIndex:index]; if (sortOrder != undefined) { [sortedArray sortUsingFunction:compareFileStructs context:&sortOrder]; } } /** returns the object after resolving sorting */ - (FileElement *)elementAtIndex:(NSUInteger)index { return [sortedArray objectAtIndex:index]; } - (void)sortByIdent:(NSString *)idStr { if ([idStr isEqualToString: sortByIdent]) { if (sortOrder == ascending) sortOrder = descending; else sortOrder = ascending; } else { NSLog(@"Sort by: %@", idStr); sortOrder = ascending; } sortByIdent = idStr; [sortedArray sortUsingFunction:compareFileStructs context:&sortOrder]; } /* methods implemented to follow the informal NSTableView protocol */ - (NSInteger)numberOfRowsInTableView:(NSTableView *)aTableView { return [sortedArray count]; } - (id)tableView:(NSTableView *)aTableView objectValueForTableColumn:(NSTableColumn *)aTableColumn row:(NSInteger)rowIndex { id theElement; theElement = NULL; NSParameterAssert(rowIndex >= 0 && rowIndex < [sortedArray count]); if ([[aTableColumn identifier] isEqualToString:TAG_FILENAME]) theElement = [[sortedArray objectAtIndex:rowIndex] name]; else NSLog(@"unknown table column ident"); return theElement; } /* --- drag and drop --- */ - (NSDragOperation)tableView:(NSTableView *)aTableView validateDrop:(id )info proposedRow:(NSInteger)row proposedDropOperation:(NSTableViewDropOperation)operation { NSPasteboard *pboard; pboard = [info draggingPasteboard]; if ([[pboard types] containsObject:NSFilenamesPboardType]) { NSArray *paths; paths = [pboard propertyListForType:NSFilenamesPboardType]; if ([paths count] > 0) { if ([[aTableView target] dropValidate:self paths:paths]) return NSDragOperationEvery; } } return NSDragOperationNone; } - (BOOL)tableView:(NSTableView *)aTableView acceptDrop:(id )info row:(NSInteger)row dropOperation:(NSTableViewDropOperation)operation { NSPasteboard *pboard; pboard = [info draggingPasteboard]; if ([[pboard types] containsObject:NSFilenamesPboardType]) { NSArray *paths; paths = [pboard propertyListForType:NSFilenamesPboardType]; if ([paths count] > 0) { [[aTableView target] dropAction:self paths:paths]; } } return NO; } - (BOOL)containsFileName:(NSString *)name { BOOL found; unsigned i; found = NO; i = 0; while (!found && i < [fileStructs count]) { FileElement *fe; fe = [fileStructs objectAtIndex:i]; found = [[fe name] isEqualToString:name]; i++; } return found; } @end FTP-0.6/arrow_left.tiff0000664000175000017500000000211612650250074014457 0ustar multixmultixMM*     t(R/---ҮQwLLLiii cccLLL <"""j<""" cccLLL jjj vLLL/---ҮQ FTP-0.6/localclient.m0000664000175000017500000000671413040104063014106 0ustar multixmultix/* Project: FTP Copyright (C) 2005-2016 Riccardo Mottola Author: Riccardo Mottola Created: 2005-04-09 Local filesystem class This application is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This application is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License for more details. You should have received a copy of the GNU General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #import "localclient.h" #import "fileElement.h" @implementation LocalClient - (id)init { if (!(self = [super init])) return nil; homeDir = [NSHomeDirectory() retain]; return self; } /* creates a new directory If the path is absolute, use it directly, else append to wokding directory */ - (BOOL)createNewDir:(NSString *)dir { NSFileManager *fm; NSString *localPath; BOOL isDir; fm = [NSFileManager defaultManager]; if ([dir isAbsolutePath]) { NSLog(@"%@ is an absolute path", dir); localPath = dir; } else { NSLog(@"%@ is a relative path", dir); localPath = [[self workingDir] stringByAppendingPathComponent:dir]; } if ([fm fileExistsAtPath:localPath isDirectory:&isDir] == YES) return isDir; if ([fm createDirectoryAtPath:localPath attributes:nil] == NO) return NO; else return YES; } - (bycopy NSArray *)dirContents { NSFileManager *fm; NSArray *fileNames; NSEnumerator *en; NSString *fileName; NSMutableArray *listArr; FileElement *aFile; fm = [NSFileManager defaultManager]; fileNames = [fm directoryContentsAtPath:workingDir]; if (fileNames == nil) return nil; listArr = [NSMutableArray arrayWithCapacity:[fileNames count]]; en = [fileNames objectEnumerator]; while ((fileName = [en nextObject])) { NSString *p; NSDictionary *attr; p = [workingDir stringByAppendingPathComponent:fileName]; attr = [fm fileAttributesAtPath :p traverseLink:YES]; aFile = [[FileElement alloc] initWithPath:p andAttributes:attr]; [listArr addObject:aFile]; [aFile release]; } return [NSArray arrayWithArray:listArr]; } - (BOOL)deleteFile:(FileElement *)file beingAt:(int)depth { NSFileManager *fm; fm = [NSFileManager defaultManager]; if ([fm removeFileAtPath:[file path] handler:nil] == NO) { NSLog(@"an error occoured during local delete"); return NO; } return YES; } - (BOOL)renameFile:(FileElement *)file to:(NSString *)name { NSFileManager *fm; NSString *newFullPath; if (file == nil) return NO; if (name == nil) return NO; fm = [NSFileManager defaultManager]; newFullPath = [[[file path] stringByDeletingLastPathComponent] stringByAppendingPathComponent:name]; if ([fm movePath:[file path] toPath:newFullPath handler:nil] == NO) { NSLog(@"Error during local file renaming"); return NO; } [file setPath:newFullPath]; return YES; } @end FTP-0.6/AppController.m0000664000175000017500000007143713062270301014410 0ustar multixmultix/* Project: FTP Copyright (C) 2005-2016 Riccardo Mottola Author: Riccardo Mottola Created: 2005-03-30 Application Controller This application is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This application is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License for more details. You should have received a copy of the GNU General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #import "AppController.h" #import "fileElement.h" #import "GetNameController.h" @implementation fileTransmitParms @end @implementation AppController - (id)init { NSFont *font; if ((self = [super init])) { connMode = defaultMode; threadRunning = NO; font = [NSFont userFixedPitchFontOfSize: 0]; textAttributes = [NSMutableDictionary dictionaryWithObject:font forKey:NSFontAttributeName]; [textAttributes retain]; } return self; } - (void)dealloc { [doConnection invalidate]; [doConnection release]; [textAttributes release]; [super dealloc]; } - (void)awakeFromNib { NSMenu *menu; NSMenuItem *mi; /* connection panel */ [connServerBox setTitle:NSLocalizedString(@"Server Address and Port", @"Server Address and Port")]; [connAccountBox setTitle:NSLocalizedString(@"Account", @"Account")]; [connectPanel setTitle:NSLocalizedString(@"Connect", @"Connect")]; [connAnon setTitle:NSLocalizedString(@"Anonymous", @"Anonymous connection")]; [connCancelButt setTitle:NSLocalizedString(@"Cancel", @"Cancel")]; [connConnectButt setTitle:NSLocalizedString(@"Connect (action)", @"Connect (action)")]; /* main window */ [[localPath itemAtIndex:0] setTitle:NSLocalizedString(@"local view", @"local view")]; [[remotePath itemAtIndex:0] setTitle:NSLocalizedString(@"remote view", @"remote view")]; [[[localView tableColumnWithIdentifier:@"filename"] headerCell] setStringValue:NSLocalizedString(@"Name", @"filename table")]; [[[remoteView tableColumnWithIdentifier:@"filename"] headerCell] setStringValue:NSLocalizedString(@"Name", @"filename table")]; /* menus */ mi = [mainMenu itemWithTitle:@"Local"]; menu = [mi submenu]; [menu setTitle:NSLocalizedString(@"Local", @"Local")]; mi = [menu itemWithTag:1]; [mi setTitle:NSLocalizedString(@"Rename...", @"Rename...")]; mi = [menu itemWithTag:2]; [mi setTitle:NSLocalizedString(@"New Folder...", @"New Folder....")]; mi = [menu itemWithTag:3]; [mi setTitle:NSLocalizedString(@"Delete", @"Delete")]; mi = [menu itemWithTag:4]; [mi setTitle:NSLocalizedString(@"Refresh", @"Refresh")]; mi = [mainMenu itemWithTitle:@"Remote"]; menu = [mi submenu]; [menu setTitle:NSLocalizedString(@"Remote", @"Remote")]; mi = [menu itemWithTag:1]; [mi setTitle:NSLocalizedString(@"Rename...", @"Rename...")]; mi = [menu itemWithTag:2]; [mi setTitle:NSLocalizedString(@"New Folder...", @"New Folder....")]; mi = [menu itemWithTag:3]; [mi setTitle:NSLocalizedString(@"Delete", @"Delete")]; mi = [menu itemWithTag:4]; [mi setTitle:NSLocalizedString(@"Refresh", @"Refresh")]; /* log */ [logWin setTitle:NSLocalizedString(@"Connection Log", @"Connection Log")]; [logTextField setSelectable:YES]; [logTextField setEditable:NO]; } - (void)applicationDidFinishLaunching:(NSNotification *)aNotif { NSArray *dirList; NSUserDefaults *defaults; NSString *readValue; NSPort *port1; NSPort *port2; NSArray *portArray; /* read the user preferences */ defaults = [NSUserDefaults standardUserDefaults]; readValue = [defaults stringForKey:connectionModeKey]; /* if no value was set for the key we set passive as mode */ if ([readValue isEqualToString:@"default"]) connMode = defaultMode; else if ([readValue isEqualToString:@"port"] ) connMode = portMode; else if ([readValue isEqualToString:@"passive"] || readValue == nil) connMode = passiveMode; else NSLog(@"Unrecognized value in user preferences for %@: %@", connectionModeKey, readValue); /* set double actions for tables */ [localView setTarget:self]; [localView setDoubleAction:@selector(listDoubleClick:)]; [remoteView setTarget:self]; [remoteView setDoubleAction:@selector(listDoubleClick:)]; /* initialize drag-n-drop code */ [localView registerForDraggedTypes:[NSArray arrayWithObject:NSFilenamesPboardType]]; [remoteView registerForDraggedTypes:[NSArray arrayWithObject:NSFilenamesPboardType]]; /* startup code */ local = [[LocalClient alloc] init]; [local setWorkingDir:[local homeDir]]; dirList = [local dirContents]; [progBar setDoubleValue:0.0]; // reset the progress bar /* we create a data source and set the tableviews */ localTableData = [[FileTable alloc] init]; [localTableData initData:dirList]; [localView setDataSource:localTableData]; remoteTableData = [[FileTable alloc] init]; [remoteView setDataSource:remoteTableData]; /* we update the path menu */ [self updatePath :localPath :[local workDirSplit]]; // #### and a release of this array ?!? // we set up distributed objects port1 = [NSPort port]; port2 = [NSPort port]; doConnection = [[NSConnection alloc] initWithReceivePort:port1 sendPort:port2]; [doConnection setRootObject:self]; /* Ports switched here. */ portArray = [NSArray arrayWithObjects:port2, port1, nil]; [NSThread detachNewThreadSelector: @selector(connectWithPorts:) toTarget: [FtpClient class] withObject: portArray]; /* show the connection panel */ [connectPanel makeKeyAndOrderFront:self]; return; } - (NSApplicationTerminateReply)applicationShouldTerminate:(id)sender { return NSTerminateNow; } - (void)applicationWillTerminate:(NSNotification *)aNotif { } - (BOOL)application:(NSApplication *)application openFile:(NSString *)fileName { return NO; } /** update the pop-up menu with a new path */ - (void)updatePath :(NSPopUpButton *)path :(NSArray *)pathArray { [path removeAllItems]; [path addItemsWithTitles:pathArray]; } /** reads directory contents and reads refreshes the table */ - (void)readDirWith:(Client *)client toTable:(FileTable *)t andView:(NSTableView*)tv { NSArray *dirList; if ((dirList = [client dirContents]) == nil) return; [t initData:dirList]; [tv deselectAll:self]; [tv reloadData]; } /** performs the action of the path pull-down menu it navigates upwards the tree and works for both the local and remote path */ - (IBAction)changePathFromMenu:(id)sender { Client *theClient; NSTableView *theView; FileTable *theTable; NSString *thePath; NSArray *items; int selectedIndex; unsigned i; if (sender == localPath) { theClient = local; theView = localView; theTable = localTableData; } else { theClient = ftp; theView = remoteView; theTable = remoteTableData; } thePath = [NSString string]; selectedIndex = [sender indexOfItem:[sender selectedItem]]; items = [sender itemTitles]; for (i = [items count] - 1; i >= selectedIndex; i--) thePath = [thePath stringByAppendingPathComponent: [items objectAtIndex:i]]; [theClient changeWorkingDir:thePath]; [self readDirWith:theClient toTable:theTable andView:theView]; [self updatePath :sender :[theClient workDirSplit]]; } /* perform the action of a double click in a table element a directory should be opened, a file down or uploaded The same method works for local and remote, detecting them */ - (IBAction)listDoubleClick:(id)sender { Client *theClient; NSTableView *theView; FileTable *theTable; int elementIndex; FileElement *fileEl; NSString *thePath; NSPopUpButton *thePathMenu; if (threadRunning) { NSLog(@"thread was still running"); return; } theView = sender; if (theView == localView) { theClient = local; theTable = localTableData; thePathMenu = localPath; } else { theClient = ftp; theTable = remoteTableData; thePathMenu = remotePath; } elementIndex = [sender selectedRow]; if (elementIndex < 0) { NSLog(@"error: double click with nothing selected"); return; } fileEl = [theTable elementAtIndex:elementIndex]; NSLog(@"element: %@ %d", [fileEl name], [fileEl isDir]); thePath = [NSString stringWithString:[theClient workingDir]]; thePath = [thePath stringByAppendingPathComponent: [fileEl name]]; if ([fileEl isDir]) { [theClient changeWorkingDir:thePath]; [self readDirWith:theClient toTable:theTable andView:theView]; [self updatePath :thePathMenu :[theClient workDirSplit]]; } else { if (theView == localView) { [self performStoreFile]; } else { [self performRetrieveFile]; } } } - (BOOL)dropValidate:(id)sender paths:(NSArray *)paths { if (threadRunning) { NSLog(@"thread was still running"); return NO; } if (sender == localTableData) { /* the local view opens the file or the directory, it can be just one */ if ([paths count] != 1) return NO; } return YES; } - (void)dropAction:(id)sender paths:(NSArray *)paths { NSUInteger i; NSFileManager *fm; NSMutableArray *arr; arr = [[NSMutableArray alloc] initWithCapacity:[paths count]]; fm = [NSFileManager defaultManager]; for (i = 0; i < [paths count]; i++) { NSDictionary *attr; NSString *path; FileElement *fEl; path = [paths objectAtIndex:i]; attr = [fm fileAttributesAtPath:path traverseLink:YES]; fEl = [[FileElement alloc] initWithPath:path andAttributes:attr]; [arr addObject:fEl]; [fEl release]; } /* locally, we accept only a directory and change to it remotely, we store everything */ if (sender == localTableData) { NSString *fileOrPath; NSString *thePath; NSFileManager *fm; BOOL isDir; fileOrPath = [paths objectAtIndex:0]; fm = [NSFileManager defaultManager]; if ([fm fileExistsAtPath:fileOrPath isDirectory:&isDir] == NO) { [arr release]; return; } if (!isDir) thePath = [fileOrPath stringByDeletingLastPathComponent]; else thePath = fileOrPath; NSLog(@"trimmed path to: %@", thePath); [local changeWorkingDir:thePath]; [self readDirWith:local toTable:localTableData andView:localView]; [self updatePath :localPath :[local workDirSplit]]; } else if (sender == remoteTableData) { NSLog(@"will upload: %@", arr); [self storeFiles]; } [arr release]; } - (void)tableView:(NSTableView *)tableView didClickTableColumn:(NSTableColumn *)tableColumn { if (tableView == localView) { [localTableData sortByIdent: [tableColumn identifier]]; [localView reloadData]; } else { [remoteTableData sortByIdent: [tableColumn identifier]]; [remoteView reloadData]; } } - (void)setInterfaceEnabled:(BOOL)flag { [localView setEnabled:flag]; [remoteView setEnabled:flag]; [localPath setEnabled:flag]; [remotePath setEnabled:flag]; [buttUpload setEnabled:flag]; [buttDownload setEnabled:flag]; } - (void)setThreadRunningState:(BOOL)flag { threadRunning = flag; [self setInterfaceEnabled:!flag]; } /** retrieves using selection, by constructing an array and calling retrieveFiles */ - (void)performRetrieveFile { NSEnumerator *elemEnum; FileElement *fileEl; id currEl; /* make a copy of the selection */ [filesInProcess release]; filesInProcess = [[NSMutableArray alloc] init]; elemEnum = [remoteView selectedRowEnumerator]; while ((currEl = [elemEnum nextObject]) != nil) { fileEl = [remoteTableData elementAtIndex:[currEl intValue]]; [filesInProcess addObject:fileEl]; } [self retrieveFiles]; } /** stores using selection, by constructing an array and calling storeFiles */ - (void)performStoreFile { NSEnumerator *elemEnum; FileElement *fileEl; id currEl; /* make a copy of the selection */ [filesInProcess release]; filesInProcess = [[NSMutableArray alloc] init]; elemEnum = [localView selectedRowEnumerator]; while ((currEl = [elemEnum nextObject]) != nil) { fileEl = [localTableData elementAtIndex:[currEl intValue]]; [filesInProcess addObject:fileEl]; } [self storeFiles]; } /** Retrieves Array of FileElements */ - (void)retrieveFiles { if([filesInProcess count] > 0) { FileElement *fEl; [self setThreadRunningState:YES]; fEl = [filesInProcess objectAtIndex:0]; NSLog(@"should download (performRETRIEVE): %@", [fEl name]); [ftp retrieveFile:fEl to:local]; } } /* called by the worker thread when the element got processed */ - (oneway void)fileRetrieved:(BOOL)success { FileElement *fEl; fEl = [filesInProcess objectAtIndex:0]; if (success) { if (![localTableData containsFileName:[fEl name]]) { FileElement *fEl2; fEl2 = [[FileElement alloc] initWithPath:[[local workingDir] stringByAppendingPathComponent:[fEl name]] andAttributes:[fEl attributes]]; [localTableData addObject:fEl2]; [fEl2 release]; } } [filesInProcess removeObjectAtIndex:0]; if ([filesInProcess count] > 0) { [self retrieveFiles]; } else { [localView deselectAll:self]; [localView reloadData]; [self setThreadRunningState:NO]; [filesInProcess release]; filesInProcess = nil; } } /** Stores Array of FileElements */ - (void)storeFiles { if([filesInProcess count] > 0) { FileElement *fEl; [self setThreadRunningState:YES]; fEl = [filesInProcess objectAtIndex:0]; NSLog(@"should download (performStore): %@", [fEl name]); [ftp storeFile:fEl from:local]; } } /* called by the worker thread when the element got processed */ - (oneway void)fileStored:(BOOL)success { FileElement *fEl; fEl = [filesInProcess objectAtIndex:0]; if (success) { if (![remoteTableData containsFileName:[fEl name]]) { FileElement *fEl2; fEl2 = [[FileElement alloc] initWithPath:[[ftp workingDir] stringByAppendingPathComponent:[fEl name]] andAttributes:[fEl attributes]]; [remoteTableData addObject:fEl2]; [fEl2 release]; } } [filesInProcess removeObjectAtIndex:0]; if ([filesInProcess count] > 0) { [self storeFiles]; } else { [remoteView deselectAll:self]; [remoteView reloadData]; [self setThreadRunningState:NO]; [filesInProcess release]; filesInProcess = nil; } } - (IBAction)downloadButton:(id)sender { if (threadRunning) { NSLog(@"thread was still running"); return; } [self performRetrieveFile]; } - (IBAction)uploadButton:(id)sender { if (threadRunning) { NSLog(@"thread was still running"); return; } [self performStoreFile]; } - (IBAction)localDelete:(id)sender { NSEnumerator *elemEnum; FileElement *fileEl; id currEl; NSMutableArray *selArray; NSUInteger i; /* make a copy of the selection */ selArray = [[NSMutableArray alloc] init]; elemEnum = [localView selectedRowEnumerator]; while ((currEl = [elemEnum nextObject]) != nil) { fileEl = [localTableData elementAtIndex:[currEl intValue]]; [selArray addObject:fileEl]; } /* perform deletes */ for (i = 0; i < [selArray count]; i++) { fileEl = [selArray objectAtIndex:i]; if([local deleteFile:fileEl beingAt:0]) [localTableData removeObject:fileEl]; } [localView deselectAll:self]; [localView reloadData]; [selArray release]; } - (IBAction)remoteDelete:(id)sender { NSEnumerator *elemEnum; FileElement *fileEl; id currEl; NSMutableArray *selArray; NSUInteger i; /* make a copy of the selection */ selArray = [[NSMutableArray alloc] init]; elemEnum = [remoteView selectedRowEnumerator]; while ((currEl = [elemEnum nextObject]) != nil) { fileEl = [remoteTableData elementAtIndex:[currEl intValue]]; [selArray addObject:fileEl]; } /* perform deletes */ for (i = 0; i < [selArray count]; i++) { fileEl = [selArray objectAtIndex:i]; if ([ftp deleteFile:fileEl beingAt:0]) [remoteTableData removeObject:fileEl]; } [remoteView deselectAll:self]; [remoteView reloadData]; [selArray release]; } - (IBAction)localRename:(id)sender { GetNameController *nameGetter; NSInteger alertReturn; NSEnumerator *elemEnum; FileElement *fileEl; id currEl; elemEnum = [localView selectedRowEnumerator]; while ((currEl = [elemEnum nextObject]) != nil) { fileEl = [localTableData elementAtIndex:[currEl intValue]]; nameGetter = [[GetNameController alloc] init]; [nameGetter setName:[fileEl name]]; [nameGetter setTitle:@"Rename"]; [nameGetter setMessage:@"Rename"]; alertReturn = [nameGetter runAsModal]; if (alertReturn == NSAlertDefaultReturn) { NSString *name; name = [nameGetter name]; NSLog(@"New name: %@", name); [local renameFile:fileEl to:name]; } [nameGetter release]; } [localView reloadData]; } - (IBAction)remoteRename:(id)sender { GetNameController *nameGetter; NSInteger alertReturn; NSEnumerator *elemEnum; FileElement *fileEl; id currEl; elemEnum = [remoteView selectedRowEnumerator]; while ((currEl = [elemEnum nextObject]) != nil) { fileEl = [remoteTableData elementAtIndex:[currEl intValue]]; nameGetter = [[GetNameController alloc] init]; [nameGetter setName:[fileEl name]]; [nameGetter setTitle:@"Rename"]; [nameGetter setMessage:@"Rename"]; alertReturn = [nameGetter runAsModal]; if (alertReturn == NSAlertDefaultReturn) { NSString *name; name = [nameGetter name]; NSLog(@"New name: %@", name); [ftp renameFile:fileEl to:name]; } [nameGetter release]; } [remoteView reloadData]; } - (IBAction)localNewFolder:(id)sender { GetNameController *nameGetter; NSInteger alertReturn; nameGetter = [[GetNameController alloc] init]; [nameGetter setName:@"New Folder"]; [nameGetter setTitle:@"New Folder"]; [nameGetter setMessage:@"New Folder"]; alertReturn = [nameGetter runAsModal]; if (alertReturn == NSAlertDefaultReturn) { NSString *name; NSString *fullPath; name = [nameGetter name]; fullPath = [[local workingDir] stringByAppendingPathComponent:name]; if ([local createNewDir:fullPath]) { FileElement *fileEl; NSDictionary *attrs; attrs = [NSDictionary dictionaryWithObjectsAndKeys: NSFileTypeDirectory, NSFileType, NULL]; fileEl = [[FileElement alloc] initWithPath:fullPath andAttributes:attrs]; [localTableData addObject:fileEl]; [fileEl release]; [localView reloadData]; } } [nameGetter release]; } - (IBAction)remoteNewFolder:(id)sender { GetNameController *nameGetter; NSInteger alertReturn; nameGetter = [[GetNameController alloc] init]; [nameGetter setName:@"New Folder"]; [nameGetter setTitle:@"New Folder"]; [nameGetter setMessage:@"New Folder"]; alertReturn = [nameGetter runAsModal]; if (alertReturn == NSAlertDefaultReturn) { NSString *name; NSString *fullPath; name = [nameGetter name]; fullPath = [[ftp workingDir] stringByAppendingPathComponent:name]; if ([ftp createNewDir:fullPath]) { FileElement *fileEl; NSDictionary *attrs; attrs = [NSDictionary dictionaryWithObjectsAndKeys: NSFileTypeDirectory, NSFileType, NULL]; fileEl = [[FileElement alloc] initWithPath:fullPath andAttributes:attrs]; [remoteTableData addObject:fileEl]; [fileEl release]; [remoteView reloadData]; } } [nameGetter release]; } - (IBAction)localRefresh:(id)sender { [self readDirWith:local toTable:localTableData andView:localView]; } - (IBAction)remoteRefresh:(id)sender { [self readDirWith:ftp toTable:remoteTableData andView:remoteView]; } - (oneway void)setTransferBegin:(in bycopy NSString *)name :(unsigned long long)size { [infoMessage setStringValue:name]; [progBar setDoubleValue:0]; beginTimeVal = [NSDate timeIntervalSinceReferenceDate]; transferSize = size; NSLog(@"begin transfer size: %llu", transferSize); if (transferSize == 0) { [progBar setIndeterminate:YES]; [progBar startAnimation:nil]; } [mainWin displayIfNeeded]; } - (oneway void)setTransferProgress:(in bycopy NSNumber *)bytesTransferred { NSTimeInterval currTimeVal; float speed; NSString *speedStr; NSString *sizeStr; double percent; unsigned long long bytes; bytes = [bytesTransferred unsignedLongLongValue]; currTimeVal = [NSDate timeIntervalSinceReferenceDate]; speed = (float)((double)bytes / (double)(currTimeVal - beginTimeVal)); if (transferSize > 0) { percent = ((double)bytes / (double)transferSize) * 100; [progBar setDoubleValue:percent]; } speedStr = [NSString alloc]; if (speed < 1024) speedStr = [speedStr initWithFormat:@"%3.2fB/s", speed]; else if (speed < 1024*1024) speedStr = [speedStr initWithFormat:@"%3.2fKB/s", speed/1024]; else speedStr = [speedStr initWithFormat:@"%3.2fMB/s", speed/(1024*1024)]; [infoSpeed setStringValue:speedStr]; [speedStr release]; sizeStr = [NSString alloc]; if (transferSize < 1024 && transferSize != 0) /* except 0, which means unknown */ sizeStr = [sizeStr initWithFormat:@"%3.2f : %3.2f B", (float)bytes, (float)transferSize]; else if (transferSize < 1024*1024) sizeStr = [sizeStr initWithFormat:@"%3.2f : %3.2f KB", (double)bytes/1024, (double)transferSize/1024]; else sizeStr = [sizeStr initWithFormat:@"%3.2f : %3.2f MB", (double)bytes/(1024*1024), (double)transferSize/(1024*1024)]; [infoSize setStringValue:sizeStr]; [sizeStr release]; } - (oneway void)setTransferEnd:(in bycopy NSNumber *)bytesTransferred { NSTimeInterval currTimeVal; NSTimeInterval deltaT; float speed; NSString *speedStr; NSString *sizeStr; double percent; unsigned long long bytes; bytes = [bytesTransferred unsignedLongLongValue]; currTimeVal = [NSDate timeIntervalSinceReferenceDate]; deltaT = (currTimeVal - beginTimeVal); speed = (float)((double)bytes / deltaT); NSLog(@"Elapsed time: %f", (float)deltaT); percent = ((double)bytes / (double)transferSize) * 100; speedStr = [NSString alloc]; if (speed < 1024) speedStr = [speedStr initWithFormat:@"%3.2fB/s", speed]; else if (speed < 1024*1024) speedStr = [speedStr initWithFormat:@"%3.2fKB/s", speed/1024]; else speedStr = [speedStr initWithFormat:@"%3.2fMB/s", speed/(1024*1024)]; [infoSpeed setStringValue:speedStr]; [speedStr release]; sizeStr = [NSString alloc]; if (transferSize < 1024) sizeStr = [sizeStr initWithFormat:@"%3.2f : %3.2f B", (float)bytes, (float)transferSize]; else if (transferSize < 1024*1024) sizeStr = [sizeStr initWithFormat:@"%3.2f : %3.2f KB", (double)bytes/1024, (double)transferSize/1024]; else sizeStr = [sizeStr initWithFormat:@"%3.2f : %3.2f MB", (double)bytes/(1024*1024), (double)transferSize/(1024*1024)]; [infoSize setStringValue:sizeStr]; [sizeStr release]; if ([progBar isIndeterminate]) { [progBar stopAnimation:nil]; [progBar setIndeterminate:NO]; } [progBar setDoubleValue:percent]; [mainWin displayIfNeeded]; } - (IBAction)disconnect:(id)sender { [ftp disconnect]; [mainWin setTitle:@"FTP"]; [remotePath removeAllItems]; [remotePath addItemWithTitle:@"Remote View"]; [remoteTableData clear]; [remoteView reloadData]; [self setThreadRunningState:NO]; } - (IBAction)showPrefPanel:(id)sender { [prefPanel makeKeyAndOrderFront:self]; switch (connMode) { case defaultMode: [portType selectCellWithTag:0]; break; case portMode: [portType selectCellWithTag:1]; break; case passiveMode: [portType selectCellWithTag:2]; break; default: NSLog(@"Unexpected mode on pref pane setup."); } } - (IBAction)prefSave:(id)sender { NSUserDefaults *defaults; defaults = [NSUserDefaults standardUserDefaults]; switch ([[portType selectedCell] tag]) { case 0: //default NSLog(@"default"); connMode = defaultMode; [ftp setPortDefault]; [defaults setObject:@"default" forKey:connectionModeKey]; break; case 1: //port NSLog(@"port"); connMode = portMode; [ftp setPortPort]; [defaults setObject:@"port" forKey:connectionModeKey]; break; case 2: // passive NSLog(@"passive"); connMode = passiveMode; [ftp setPortPassive]; [defaults setObject:@"passive" forKey:connectionModeKey]; break; default: NSLog(@"unexpected selection"); } [prefPanel performClose:nil]; } - (IBAction)prefCancel:(id)sender { [prefPanel performClose:nil]; } - (IBAction)showFtpLog:(id)sender { [logWin makeKeyAndOrderFront:self]; } /** Called by the server object to register itself. */ - (void)setServer:(id)anObject { ftp = (FtpClient*)[anObject retain]; } - (oneway void)appendTextToLog:(NSString *)textChunk { NSAttributedString *attrStr; attrStr = [[NSAttributedString alloc] initWithString: textChunk attributes: textAttributes]; /* add the textChunk to the NSTextView's backing store as an attributed string */ [[logTextField textStorage] appendAttributedString: attrStr]; [[NSRunLoop currentRunLoop] runUntilDate:[NSDate distantPast]]; [logTextField scrollRangeToVisible:NSMakeRange([[logTextField string] length], 0)]; [attrStr autorelease]; } /* --- connection panel methods --- */ - (IBAction)showConnPanel:(id)sender { [connectPanel makeKeyAndOrderFront:self]; } - (IBAction)connectConn:(id)sender { NSArray *dirList; char tempStr[1024]; NSString *u; NSString *p; [connectPanel performClose:nil]; [mainWin makeKeyAndOrderFront:self]; ftp = [ftp initWithController:self :connMode]; [[connAddress stringValue] getCString:tempStr]; if ([ftp connect:[connPort intValue] :tempStr] < 0) { NSRunAlertPanel(@"Error", @"Connection failed.\nCheck that you typed the host name correctly.", @"Ok", nil, nil); NSLog(@"connection failed in connectConn"); return; } if ([connAnon state] == NSOnState) { u = @"anonymous"; p = @"user@myhost.com"; } else { u = [connUser stringValue]; p = [connPass stringValue]; } if ([ftp authenticate:u :p] < 0) { NSRunAlertPanel(@"Error", @"Authentication failed.\nCheck that your username and password are correct.", @"Ok", nil, nil); NSLog(@"authentication failed."); return; } else { [ftp setWorkingDir:[ftp homeDir]]; if ((dirList = [ftp dirContents]) == nil) return; [remoteTableData initData:dirList]; [remoteView reloadData]; /* update the path menu */ [self updatePath :remotePath :[ftp workDirSplit]]; /* set the window title */ [mainWin setTitle:[connAddress stringValue]]; } } - (IBAction)cancelConn:(id)sender { [connectPanel performClose:nil]; } - (IBAction)anonymousConn:(id)sender { if ([connAnon state] == NSOnState) { [connUser setEnabled:NO]; [connPass setEnabled:NO]; } else { [connUser setEnabled:YES]; [connPass setEnabled:YES]; } } - (void)showAlertDialog:(NSString *)message { [message retain]; NSRunAlertPanel(@"Attention", message, @"Ok", nil, nil); [message release]; } - (connectionModes)connectionMode { return connMode; } @end FTP-0.6/FTP_icon_osx.icns0000664000175000017500000014323012650250074014654 0ustar multixmultixicnsƘich#H\@????????????????G?\@????????????????G?ih32½]uDz}zqspyK١p˨ɯ˓׌Ρ꠩є{^쳮彠엾ѓjήˊķՓyאǤ}v˓qуාnwё󌷱ϷŠmqhҹŠTE]I۾ٯȋ!ʊʋؽɸǵ⿳ŸͻɛIJګ̰αȱ˿ݭج˵л¯z!|qnh{Ĺt!}_t}z|mٷح͹x"twơνܶȱ}#}ڳϞ۱ΪدŹ|#p~νq\dmܯ̼Ծ߳z#ppŲQ@JHKayډ۟ϻڢ~#˭{fCގcҪ#t˲~xtFFiљ!nxsYEE á͏]qĥPb:Q)̣z޹9e.N |۷JlCg1/~ݹ_o'C@՝ⴸdj.34#ߝy㼿ol *=|ea2&(ߝqƳj.56㺪S9CDGÒƍgf:TYϝțuLt۝̜el| qظt\s ¤׿Qn׻~trik[q5ҋVǤް㡛伓̅ǛߊÓtyU⫫府“pށfͫɆðۆǐxs֍Š{xppջzn״hrvÐ3Ҿδ~د"bfh\}δۅҰ"H5O=ܓѩ"оvJKanƴ"ݫzVHGT`\z~lfccyξƵ"pzeliƳ"ź"ֵױÿς֚İܚپע;؂ΟӽŢĥνѡϞۺۥ¿t郃Ҷŭ֘˻i!uԏwwӽصףĶd!oʽМrѬÚg"ϼϽŲ̥n#zŁզĝǝk#h͸֥ٽ°̳ӣk#iƦxQf{֔ӑƯ͎n#˰فVܬ#÷^¶~!ӻOʰ؍ʢĿ̿ۏūѴ՝չҼ͸Ʒɮʶ߽ɥݝĴ k׻s ¤ֿLzȲyulmgwCrڕطڪדل͙ƮxQ⶙~cʨĂqҊʝwtnvm|{贇eoj 򅰬лͲ"[>34jE)biaͳ"Wn`wvTwJϿ=Ȱ{ʷYg<y׿jiyN̼@ם̨ywQAƵŻZCüǺ_DųzzƾpC{Ѵ}ŹCיȦˏɸDҐ̲ȦʚиDʓҬuyدȧѢҸDƈƃuvҙ}᫔ƹƤЪɸDq}Xͬ쨀Ҕֱ̤ѫոEr{^|뷮ԓֽӨѲD~tћ^}lǧܱϡѷ׸Dи|ץӵjYsĻИңּ׸DݳǞoÉZzŎ쫑yĺۥջָDݶ๓g˦^n毠ڶ|apʡާȽԭD״ൕaբqͻךԩӏsrogo⮈خDݲ礁j٣אӟturw^|ȹ殉ޮDתܕynwurľ͍ժyyuU[ruxé筊ʺDѭ֔vmў|޹շ{nntwؿ䫍ѽҮEڱޓyxǏķqv֕׿¨ܧ߱νӭDܬȊb᭛ɬεڹЎ⹜ɮK䩥{lҔŭ·뿽⾔J帧{l⊮»ެ濕ƺ̟I氬ȥmkֵz{Ӻǝ˟Hncg]c]Qbd`нٟ̚GҖrvrryyhXNVJZwBmʹèӨF깬߰mTrL>U]wI.Ѽҫ¾8W^@,+25:93^ҨƻՠF~nOJT]focrүݠG̯ݟGΪH沫̫ʺݠ݀2ƤIƤ 彫߀ ↓DҮʿܟDŹѯD곜ƽþ鮮D侮лŭݠD俳ʻߺϽ ݲϳ~4~xwi׹ʷϵߠD컬⽜{pŭwۻ˻һD龧㿪Ĵյ䰤avֳмԚDðޮӷѴóɻbrѲĭȵDʨإָٵ¢μر`uǭŲDȦӓ§d~òÿڛDɣύղ﷩ŸթkƪěD֮ӗ˻ݯжո|ŨӻïМCպٛշҴ~̺|C̞нα־ϡַ담äŻƿzCʥٶ阸乨͹½z̞Lϰɽ¤Ѵᓹ⾯űĶzVûָΧĪݵ՚뽧Ŀÿx\ݹ{rxjvniehnw޻Ϫ֥˺Ķt[Ɨtq_eX^gcpr}}{iac̭زխæ͹oZ٣}f^Takfiriqgatusi]ȸټѽ׹ĭ{С[᷎jV\QhyocjһӨɟطưt]ŏ\Wfi|ĺ~ڴмҸпۯʹs̞^f[t}qw»Ƽ׵нǩҲܰѾ}ԝ_ܔ`wt}¿µƻҲϭ׳Ծֲͼʹ`hyڿũ¤ƴӽ̚ȝֺǽ¶}a}ۿïȚʽ԰֣ɾطĹ|̛anʴŽb`w̛Șʺ˵޵ĩabjɽlONxvx˓̧ɝɽഫķ|_csp½u}YbdLMOahZOfȕᰳ̡ǯκ߳w_ڒklrvDZykYOBBQgEG=CGDo֠䷚Ęճɼοٹz˝-ro|pvIJ}oQ?B@DLHMH<;KNba`yԀ.—zⴑȫ⼿޽ڽ}ԝ_Аwɮwqw}~oaif`XD.<77B=4MPK\dvryRxϤq؍ȶܼǷຸส˝_݉ƱzonLUepxs[fW~bquW[ݧtsѾʦռ״̝ ⍒̀Qݸro]ACsoUqžٰɼҵ̝_ӏwڤz{fF4Bu{U]ٹعY{՝_ӑwtοտs{x}dGC@J{b]׮ջdOߝ]גynʿĦttunk[:PcCyeͿùq^\ܗxd߿ƸsjnbUXY0N^*;J0'@*缢qµxwh]xa2276DD+A*~sоtopeHr]'A2.<48,D*ܴtҷepNug2B=&X49ª*غpmú~vhVp\8?4#EB$*=W*ٺmoŴ}jao\)C-J@+0-HOj=˶໓״ߠ\?ݱ̬ԄKP1"$*(#R޼xӸР2R䋙ڠڜt`B?KRZcUi޼zǷՠ\&evۧ]UJEDKL^dlnɽӟ]/[D痄z~t}zxnjrn{~ηȺߟ]'ϲSJޝwoQILIFO\b`iekmTpwxuy|xswyxe_`gj|ɷР0޸O׈I櫚ĦZHFEL?ALHRVZden||nvn\]Q\UNUjfqt~ؽƳ7uOawyy}ʫӹDz՟:SpDݯzzsmmx{{|re_nkcilpԤ¾ƳП PQ읋D㶏zymlfkh_^_hN@DHONP[gq~ĺ̸؟ ^G͘ւDۡ{w|vzxpnmdTQS\\[[VSV[]^bhhszܻ˹П ǁ=Dؚþێкڽʬ̠ÚMD߱ҦѾIJʱ̠ǢZӂƅDݲͻ͡տǩ͠׫~ɌDݤʽuorqr{xп˳wqkl_ġɾҾƠߠޯȒ݀D⭛خjbqrs|ȻnʣϻϿ˧ ʝD߱ڳ̧ޢ¹۾ޕWjӾλǧԚȯD䵠ՠɩȨ˹ؼᾮXh⻘D˖ΫЩް۷įФUk岓³ηĻDǃ׬޶οȴҷ[t㬛־ʼțǣ߉D|߶Υ꫚еԺ̛b⮐ƶкěԜD̚ˈ٩ՠŻƪˬtܭɽʹ}М񼅵CɧΊ߽ͬɨзʹ޷wڨĹŲi酃Cܭٽ߰ȱģβƓΩ焬ߪƸg̝ QCÿоȸ׶̿Щ׺台֞˴Ǵi̞ ꊷW`܃IŤ׸ǿҶȨۊԤǾg^8õϭϺѻĿĘת͑এʼe\uJ}å~wwvux߸ĿҾپدǟ͜תɾc[ӆĤ{k`_|ͻҺáХ̢Эò^ZФsovƵʴ}fW̹ѾбDZ ŹjС[ڷU_wźgfȭɽ˚úɵğµe]Ō\f˿ҥǰɬ̶ƴ˖c̞^afŲѩ÷Dzɦ˵̖ųnԝ_ߕ^뼩港ɥƠϦ̳|v`dϺֺ׺˰Ƚִ¥kݛayž٬ҿˢ͕⿱ǣl̛aiǪƹÐ罺ž߿ѠrZiGÿħ|qÇݨ˜޷̾ӟm_w]szƼwb`pῊբÒŮҞg_ډ|vξlZFIVi͒{جۻͧIJʧjĝ_}inqfQGPftǒӶo֦}ӻ۰֯ͬm͝_ʇȯxntzzk`rz}ylX`]VQKJ`szŕe}{亨Աڬզŝ_݂ҺztrWeuǶͼטi؆bǰα䳮ǜƝ_↯˾dHdУƝ_ӉԼ¸qIOѬصɡNpѝ_Ѝ˽ֹXOРƤZCڝ]ՐȿvYֻjP\ܓƺ;fƶϹYSvZ٘üƼ̲ڿ*໠wXOXۓÿvvyտcJyWԕ¾˾ڴﯡ}z۪UטİڴSҕֿөPҐijǸĬPϕ÷zՓr֙Bž}Ӛxvs{¾ҹǽЯ0ϛŽ|Ķ*؜;­ ڎƾ*ؕκ*ϙ{*ŷ*ȿ*©̿**縧ƾ~*Ͽ*ծʸrƪ*д¼*ԴǺ*ճȼ*Ӳĩ*ݮ§*ٱ˼â*۳ʮ*ҵs*ݹֽo*ϵůǴŤi*ؾ½ʻDZt*Žȥ(Ԯû|'ஔþqv%Śoi{ϼrU#ǓkPWXP ˢq^glϽgb~߁ѻ{zisؽuqnkgrhgfqjt̿»ֶǿ ˧{r{߀ƼҼ4Қ_AP]PP[MYɭpkfbWX[Ra{~5٨L0PzѾrxzvuqlluwbhg8d7mvȍe`MS?| Ҷ#Lj`_wOֶ~wԚZCp2~wɲyQh1xt`iE@͕ܭ|{JAҕSCغ^DʾҴvCzׄڹCߜڽיܸDɫӶڥݖФly~qҀ$ة˧܍xjynϔv⥋DՊdyN}ŤxӋ~ѪġՌgxտQz殨|&ՊжϾDՉtnˑTtgÿ㍘اɸеDЃ؟xϫ^Onóɒ~ʼζḊƔhҽ}QtʼŇ硊q÷DΎ괊`ǚRhĽ쪚ԭzsYjś̿úDΐ㭍ZДh}ɶӑ֤υiif]h|ѼD̍zdԗ½҇ЗjmimSuóмĄDNjٍuhnlkƇңpokKQilpϾļuu=ʐԋqiʕt{۰Ӵrfel|o~չrPJ>̣݊qvнgnѐֺϼ؞gf)<Dɶyx~ϹYޥǥɯֲȈN]wS 4ǽry̿a͎Ĩ绲鷹0ʣûBfkA:q{c܀أ]}[C-&&*-96Rm2fɰ]:Wvnba^jwnwv[MjegKbJkE2KTo:ϹA0Ykvtv}cSe\pZNT3!"$%,*#U\'Ys}qmwwijwnpeWXgo|~>WwgHDQW^h^m\TygirjidkqrtfHfq?.f۰vsu~1%co}eR\XY]ebEdr6Bˀ(Ͼ]|WltjqܯyJgK 8ϼŷ}$^gobayOկ}Pq^*ύƼ&alo`WaO̱ZU4"bjsbPDå[E׀DļȻþø 1_ll_S9ʕ_.ZDþ 4XmejP(aMD QaugaFDYguuU<*زلځ4UsqhWD8ςƅDϺXuy[WHZɌDӭ|weߠVjn_UL`ǀD׽˿Șu Vpn[`[n݊D]zԚ̞ϧcqxdpt݈D^s̝~fr}oz|}̈D\v۽lqvwt~{eՈ߀=aǶTwjnsvrhDgכ[L]^|xtMDyѽт=N`mr{sfBMӋC}غ ц,LOitwp`U*wCվ `#C^tcV\H9C .5k|fVMi܃Dϻ^׉,`sh=6̴̼~\h2xQ:ƭ|vyƹy[oJ~qȧƽrea~ĶxZkvwɥhXƾС ڷUcMɚpgھ| É[nEѱ~ƶy_m4ӟ׀_]ڪųaKΜ̼µ |S֯ª mK̛ܫǭ]l߀0vݥҀú_{^uкej|ۨӹ{ϝ_ڋxɶgKNbќ깗̷۝-}glȴyYPb~ߕ.ǼѪ_ʋǮwmry{lbxqvshYTVmܚz晴׷˷ٝ_݆ս|wu_n|ך͂񒉯յ̼ݝމWҒ}\wɱ۝ ЍPӌӆV`ֳՙY АP։ٗfaӾrQ ՒOڒәcѹg וJՈԭoٯ̹Ƴ}hZ֚҃û̟̯ͨzjXٕЇؐ̚fWԖɎɳUי̏?Ӗʐ#ՒπDž!PҘɃ痏 כ?€欑0ҜҾ~ٝ׾ ސӹ ؗд*Ϛϳ~̀Ѷžӹ ëζϰ繫ϫ$Ԁ*կѝĪԵ֫*ֵԮ*ճد*ղڮޯ߷ ۲޽۳ sݸހpϴj*ؼx*֮ⷡؤ ౕ޹}vˤrhz϶}Y#ɕkOTͬWP ͢q]dlfa|߁ѽzyhr~ؽromkgqhfepgr̿ſÿֶt8mk@ " *-,-% ) wtGAMTbo_\٬g&v'" *c N$ *- W M) .x'[p]u~mUK0M OH&;#]Ixt5C  3j7ySz]Մ8b-fqX!/] ӕ)ֲko#Ӿxzu9 @:.  8Z 4)  w+vm+-%HV_5u;Oa@q.q-+.u6!]!2K }O+)2y* 'Bu֟E+P}ɉw`6FTP-0.6/client.m0000664000175000017500000000526213040104062013067 0ustar multixmultix/* Project: FTP Copyright (C) 2005-2016 Free Software Foundation Author: Riccardo Mottola Created: 2005-04-21 Generic client class, to be subclassed. This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #import "client.h" @implementation Client /* initializer */ /* we set possibly unused stuff to NULL */ - (id)init { if (!(self = [super init])) return nil; controller = nil; return self; } - (id)initWithController:(id)cont { if (!(self = [super init])) return nil; controller = cont; return self; } - (void)dealloc { if (homeDir) [homeDir release]; if (workingDir) [workingDir release]; if (workingDir) [workingDir release]; [super dealloc]; } - (bycopy NSString *)workingDir { return workingDir; } - (bycopy NSString *)homeDir { return homeDir; } - (void)setWorkingDirWithCString:(char *)dir { [self setWorkingDir:[NSString stringWithCString:dir]]; } - (void)setWorkingDir:(NSString *)dir { if (workingDir) [workingDir release]; workingDir = [[NSString stringWithString:dir] retain]; } - (void)changeWorkingDir:(NSString *)dir { [self setWorkingDir:dir]; } - (bycopy NSArray *)workDirSplit { NSMutableArray *reversedList; NSArray *list; NSEnumerator *en; NSString *currElement; list = [workingDir pathComponents]; reversedList = [NSMutableArray arrayWithCapacity:[list count]]; en = [list reverseObjectEnumerator]; while ((currElement = [en nextObject])) [reversedList addObject:currElement]; return reversedList; } - (bycopy NSArray *)dirContents { NSLog(@"override me! dirContents superclass method"); return nil; } - (BOOL)createNewDir:(NSString *)dir { NSLog(@"override me! createNewDir superclass method"); return NO; } - (BOOL)deleteFile:(FileElement *)file beingAt:(int)depth { NSLog(@"override me! deleteFile superclass method"); return NO; } - (BOOL)renameFile:(FileElement *)file to:(NSString *)name { NSLog(@"override me! renameFile superclass method"); return NO; } @end