This is FtpSession.m in view mode; [Download] [Up]
#import "FtpSession.h" #import "FtpConnection.h" #import "FtpFileSystem.h" #import "FtpFile.h" #import "FtpDirectory.h" #import "FtpBrowserCell.h" #import "FtpHost.h" #import "Controller.h" #import "DirPanel.h" #import "NXmystd.h" #import <remote/NXProxy.h> #import <sys/timeb.h> void ftime(struct timeb *tp); // This is defined nowhere in the headers ! int my_chdir(const char *path); void my_unchdir(); FILE *my_fopen(const char *path,const char *name,const char *mode); @implementation FtpSession - initForHost:host; { [super init]; //puts("1"); if (! [NXApp loadNibSection:"YftpWindow.nib" owner:self withNames:NO]) return nil; //puts("2"); controller = [NXApp delegate]; ftpHost = host; ftpConn = fileSystem = nil; username = [ftpHost user]; password = [ftpHost pass]; localpath = [ftpHost localPath]; //printf("saved localpath:%s\n",localpath); if (![self testPath:localpath]) { localpath = NXUniqueString(NXHomeDirectory()); } //printf("localpath = %s\n",localpath); [self showLoginPanel:self]; lastprogressupdatetime = 0; return self; } - showLoginPanel:sender; { [userField setStringValue:username]; [userField selectText:self]; [passField setStringValue:"<default>"]; [passField setTextGray:NX_DKGRAY]; [passField setTextDelegate:self]; //printf("init: gray = %f,DKGRAY=%f,gray == DKGRAY: %s\n",[passField textGray],NX_DKGRAY,[passField textGray] == NX_DKGRAY?"YES":"NO"); [loginPanel setFrameUsingName:"loginPanel"]; [loginPanel setFrameAutosaveName:"loginPanel"]; [loginPanel makeKeyAndOrderFront:self]; [loginPanel setTitle:[ftpHost name]]; return self; } - free; { ftpConn = [ftpConn free]; fileSystem = [fileSystem free]; loginPanel = [loginPanel free]; loginPanel = [loginPanel free]; defaultPanel = [defaultPanel free]; return [super free]; } - autoLoginHost:sender; { if ([ftpHost useDefaultPass] == 2) [passField selectText:self]; else [self loginHost:self]; return self; } - loginHost:sender; { //puts("logging in now !!!"); username = NXUniqueString([userField stringValue]); //printf("loginHopst: gray = %f,DKGRAY=%f\n",[passField textGray],NX_DKGRAY); if ([passField textGray] > NX_LTGRAY) { //puts("fetch password"); password = NXUniqueString([passField stringValue]); } else password = [ftpHost pass]; if (username == emptyString || password == emptyString) return nil; [passField setStringValue:""]; [loginPanel close]; //printf("username = %s,password = %s\n",username,password); fileSystem = [ftpHost fileSystemForUser:username]; if (!ftpConn) ftpConn = [[FtpConnection alloc] initFromSession:self]; [fileSystem createDirsForPath:[ftpHost path]]; [browser reuseColumns:NO]; [browser setDelegate:fileSystem]; [browser setTarget:self]; [browser setDoubleAction:@selector(browserCellDoubleClicked:)]; //[browser setMatrixClass:[FtpMatrix class]]; [browser setCellClass:[FtpBrowserCell class]]; //[browser setMinColumnWidth:20]; [browser setMaxVisibleColumns:3]; //[browser setMinColumnWidth:1]; [browser acceptArrowKeys:YES andSendActionMessages:YES]; [browser tile]; [browser loadColumnZero]; [browser setTitle:"/" ofColumn:0]; [browser setPath:[ftpHost path]]; [browser display]; { char buf[1000]; sprintf(buf,"%s@%s",username,[ftpHost name]); [[browser window] setTitle:buf]; [[browser window] setFrameUsingName:buf]; [[browser window] setFrameAutosaveName:buf]; [[browser window] makeKeyAndOrderFront:self]; [[browser window] setDelegate:self]; } [consoleText setSelectable:YES]; [progressView setMinValue:0]; [progressView setMaxValue:1]; [progressView setIntValue:0]; // setup the queueBrowser (by Peter Lount) //puts("queue browser setup"); [queueBrowser setDelegate:ftpConn]; [queueBrowser setAction:@selector(singleClickInQueueBrowser)]; [queueBrowser setDoubleAction:@selector(doubleClickInQueueBrowser)]; //[queueBrowser setMatrixClass:[NiftyMatrix class]]; [queueBrowser loadColumnZero]; //puts("queue browser setup done"); return self; } - (BOOL) textWillChange:sender; { //printf("textWillChange: gray = %f,DKGRAY=%f\n",[passField textGray],NX_DKGRAY); if ([passField textGray] < NX_LTGRAY) { int len = [sender textLength]; //puts("textWill...."); [sender setSel:0:len]; [sender replaceSel:""]; [sender setSel:0:0]; [passField setTextGray:NX_WHITE]; [passField display]; } return NO; } - openDefaultPanel:sender; { [userDefaultField setStringValue:[ftpHost realUser]]; [passDefaultField setStringValue:[ftpHost realPass]]; [useUserDefaultRadio setState:[ftpHost useDefaultUser]]; [usePassDefaultRadio setState:[ftpHost useDefaultPass]]; [self defaultSwitchClicked:self]; [hostDefaultField setStringValue:[ftpHost name]]; [defaultPanel makeKeyAndOrderFront:self]; [userDefaultField selectText:self]; return self; } - defaultOk:sender; { [ftpHost setUser:NXUniqueString([userDefaultField stringValue])]; [ftpHost setPass:NXUniqueString([passDefaultField stringValue])]; [ftpHost setUseDefaultUser:[useUserDefaultRadio state]]; [ftpHost setUseDefaultPass:[usePassDefaultRadio state]]; [userField setStringValue:[ftpHost user]]; [passField setStringValue:"<default>"]; [passField setTextGray:NX_DKGRAY]; [passField setTextDelegate:self]; [defaultPanel close]; [loginPanel makeKeyAndOrderFront:self]; [userField selectText:self]; return self; } - defaultCancel:sender; { [defaultPanel close]; [loginPanel makeKeyAndOrderFront:self]; return self; } - defaultSwitchClicked:sender; { [userDefaultField setEnabled:![useUserDefaultRadio state]]; [passDefaultField setEnabled:![usePassDefaultRadio state]]; if (sender == useUserDefaultRadio && ![useUserDefaultRadio state]) [userDefaultField selectText:self]; if (sender == usePassDefaultRadio && ![usePassDefaultRadio state]) [passDefaultField selectText:self]; return self; } - openLocalPathPanel:sender; { //printf("localpath = %s\n",localpath); [localPathPanel makeKeyAndOrderFront:self]; [localPathField setStringValue:localpath]; [localPathField selectText:self]; return self; } - okLocalPath:sender; { const char *newpath = [localPathField stringValue]; if ([self testPath:newpath]) { localpath = NXUniqueString(newpath); [localPathPanel performClose:self]; } else { NXBeep(); NXRunAlertPanel(NULL,"Directory not found",NULL,NULL,NULL); return nil; } return self; } - testPath:(const char *)path; { char buf[1000]; if (path) strcpy(buf,path); else strcpy(buf,NXHomeDirectory()); if (my_chdir(path)) { chdir(NXHomeDirectory()); if (chdir(path)) { my_unchdir(); return nil; } //sprintf(buf,"%s/%s",NXHomeDirectory(),path); } my_unchdir(); return self; } - openDirPanel:sender; { id panel = [SavePanel new]; [panel setDirectory:localpath]; [panel setPrompt:"Directory:"]; if ([panel dirPanelRunModal] == NX_CANCELTAG) return nil; [localPathField setStringValue:[panel directory]]; [localPathField selectText:self]; return self; } - okDefaultLocalPath:sender; { if ([self okLocalPath:self]) [ftpHost setLocalPath:localpath]; return self; } - setRemotePath:sender; { char path[1000]; [browser getPath:path toColumn:[browser lastColumn]]; [ftpHost setPath:NXUniqueString(path)]; return self; } - (NXAtom) user; { return username; } - (NXAtom) pass; { return password; } - ftpHost; { return ftpHost; } - fileSystem; { return fileSystem; } - ftpConn; { return ftpConn; } - (NXAtom) hostName; { return [ftpHost name]; } - deactivateWindow; { [NXApp deactivateSelf]; return self; } // window delegate methods - windowDidBecomeKey:sender; { active = TRUE; [controller ftpDidActivate:self]; [controller setProgress:-1:-1 from:self]; return self; } - windowWillClose:sender; { if ([browserWindow isDocEdited]) { if (NX_ALERTDEFAULT != NXRunAlertPanel("Warning","There are filetransfers in progress. Really disconnect ?","OK","Cancel",NULL)) return NO; } [ftpConn terminate]; return YES; } - showQueue:sender; // (by Peter Lount) { /* Show the queue and set it's title to that of it's window with the word 'Queue' appended so that it's easy to find in the list of windows. */ char aCharBuffer[401]; sprintf(aCharBuffer, "%s - Queue", [ftpHost name]); [queueWindow setTitle: aCharBuffer]; [queueWindow orderFront:self]; return self; } - showConsole:sender; // (by Peter Lount) { /* Show the console and set it's title to that of it's window with the word 'Console' appended so that it's easy to find in the list of windows. */ char aCharBuffer[401]; sprintf(aCharBuffer, "%s - Console", [ftpHost name]); [[consoleText window] setTitle: aCharBuffer]; [[consoleText window] orderFront:self]; return self; } - (void oneway) console:(const char *)string; { int len = [consoleText textLength]; [consoleText setSel:len:len]; [consoleText replaceSel:string]; [consoleText scrollSelToVisible]; } - showStatus:(const char *)string; { [statusField setStringValue:string]; [queueStatusField setStringValue:string]; return self; } - showFilename:(const char *)string; { [queueFilenameField setStringValue:string]; return self; } - setProgressSize:(long)x; { [progressView setMinValue:0]; if (x != -1) { [progressView setMaxValue:x]; [fileLengthField setIntValue:x]; } else { [progressView setMaxValue:0]; [fileLengthField setStringValue:"unknown"]; } [progressView setIntValue:0]; [fileProgressField setIntValue:0]; return self; } - showProgress:(long)x; { long now; struct timeb tp; int len = [fileLengthField intValue]; ftime(&tp); now = tp.time*1000 + tp.millitm; if (now > lastprogressupdatetime + 20 || len <= x) { [progressView setFloatValue:x*0.995]; [fileProgressField setIntValue:x]; if (active) [controller setProgress:x:len from:self]; } lastprogressupdatetime = now; return self; } - (void) setDirty:(BOOL)flag; { [browserWindow setDocEdited:flag]; } - validateBrowser; { [browserWindow disableDisplay]; //[browser validateVisibleColumns]; [[browser delegate] validateBrowser:browser]; [browserWindow reenableDisplay]; [browserWindow displayIfNeeded]; return self; } - browserCellSelected:sender; { id list = nil; int i; LOGF("start"); [browserWindow disableDisplay]; //list = [sender cellList]; //for (i=[list count]-1;i>=0;i--) // [[[list objectAt:i] file] setSelected:NO]; list = [sender getSelectedCells:nil]; //printf("list count = %d\n",[list count]); for (i=[list count]-1;i>=0;i--) { id dir = [[list objectAt:i] file]; //puts([dir name]); //[dir setSelected:YES]; if (![dir isDir]) continue; if ([dir needsCheck] || [dir needsUpdate]) { //puts("dir needs check"); [dir setShouldTransferIfNeeded]; [ftpConn addToQueue:dir]; } //[dir addSubDirsToCheckTo:ftpConn]; } [self validateBrowser]; [list free]; [browserWindow reenableDisplay]; [browserWindow displayIfNeeded]; LOGF("ende"); return self; } - browserCellDoubleClicked:sender; { id obj = [[sender selectedCell] file]; [obj setShouldAutoOpen:YES]; [self getIt:obj]; return self; } - pressedGetButton:sender; { static id list = nil; int i; [browserWindow disableDisplay]; if (!list) list = [[List alloc] init]; [browser getSelectedCells:list]; //printf("list count = %d\n",[list count]); for (i=[list count]-1;i>=0;i--) { [self getIt:[[[list objectAt:i] file] setShouldAutoOpen:NO]]; } [self validateBrowser]; [list empty]; [browserWindow reenableDisplay]; //[browserWindow displayIfNeeded]; [browserWindow display]; return self; } - getIt:obj; { FILE *fp; const char *name=[obj name]; [obj setShouldReget:NO]; [obj setLocalName:NULL]; [obj setLocalPath:localpath]; if ([obj isDir]) { [obj setShouldTransferAlways]; [ftpConn addToQueue:obj]; return self; } fp = my_fopen(localpath,name,"r"); fclose(fp); if (fp) { while(1) { int res = [controller showRegetPanelForFile:[obj name]]; if (res == 0) { [obj setShouldReget:NO]; break; } else if (res == 1) { [obj setShouldReget:YES]; break; } else if (res == 2) { id savePanel = [SavePanel new]; int ok = [savePanel runModalForDirectory:localpath file:name]; const char *filename = [savePanel filename]; if (ok != NX_OKTAG) continue; if (filename && strrchr(filename,'/')) { [obj setLocalPath:[savePanel directory]]; [obj setLocalName:strrchr(filename,'/')+1]; break; } } else return self; } } //LOGF("localpath = %s,localName = %s in file %s\n",localpath,[obj localName],[obj name]); [ftpConn addToQueue:obj]; return self; } /* Queue Browser methods (by Peter Lount) */ - queueBrowser; { return queueBrowser; } - queueAbortButtonPressed:sender; { [ftpConn abortCurrentTransfer]; return self; } @end
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.