This is Controller.m in view mode; [Download] [Up]
#import "Controller.h"
#import "FtpSession.h"
#import "FtpHost.h"
#import "FtpFileSystem.h"
#import "NiftyMatrix.h"
#import "NXmystd.h"
#import "objc/objc-runtime.h"
#import "parser.h"
#import "ObjectError.h"
#define DIRCACHE DIRCACHE3
#define DIRCACHE3 ".NeXT/.YFtpDirectoryCache3"
#define DIRCACHE2 ".NeXT/.YFtpDirectoryCache2"
#define DIRCACHE1 ".NeXT/.YFtpDirectoryCache"
#define DEFAULTOBJECTVERSION 6
int my_chdir(const char *path);
void my_unchdir();
NXAtom emptyString;
// For GatorFTP
@interface ClickCell:TextFieldCell
@end
@implementation ClickCell
@end
@implementation Controller
- appDidInit:sender
{
NXTypedStream *stream;
char buf[1000];
sprintf(buf,"-%s@",NXUserName());
[defaultUserField setStringValue:"ftp"];
[defaultPassField setStringValue:buf];
[defaultPathField setStringValue:"/pub"];
[defaultLocalPathField setStringValue:NXHomeDirectory()];
//malloc_debug(7);
[ObjectError setup];
objc_setMultithreaded(YES);
[NXConnection setDefaultTimeout:-1];
//parseHostAndFile("on fp server cis.uni-muenchen.de bla \n in the file /pub/next/Yftp.tar.gz !!");
[[NXApp appListener] setServicesDelegate:self];
sessionList = [[List alloc] init];
emptyString = NXUniqueString("");
chdir(NXHomeDirectory());
if ((stream = NXOpenTypedStreamForFile(DIRCACHE3, NX_READONLY)))
{
int v;
LOGF("Reading dircache !!!");
NXReadType(stream,@encode(int),&v);
[Object setVersion:v];
if (v >= 6)
{
NXAtom s;
NXReadType(stream,"%",&s);[defaultUserField setStringValue:s];
NXReadType(stream,"%",&s);[defaultPassField setStringValue:s];
NXReadType(stream,"%",&s);[defaultPathField setStringValue:s];
NXReadType(stream,"%",&s);[defaultLocalPathField setStringValue:s];
}
hostList = NXReadObject(stream);
browserList = NXReadObject(stream);
NXCloseTypedStream(stream);
}
else if ((stream = NXOpenTypedStreamForFile(DIRCACHE2, NX_READONLY)))
{
LOGF("Reading OLD V2 dircache !!!");
[Object setVersion:2];
hostList = NXReadObject(stream);
browserList = NXReadObject(stream);
NXCloseTypedStream(stream);
}
else if ((stream = NXOpenTypedStreamForFile(DIRCACHE1, NX_READONLY)))
{
LOGF("Reading OLD V1 dircache !!!");
[Object setVersion:1];
hostList = NXReadObject(stream);
browserList = NXReadObject(stream);
NXCloseTypedStream(stream);
}
else
{
chdir([[NXBundle mainBundle] directory]);
system("gzip -d < default.cache.gz > ~/.NeXT/.YFtpDirectoryCache3");
chdir(NXHomeDirectory());
stream = NXOpenTypedStreamForFile(DIRCACHE3, NX_READONLY);
if (stream)
{
int v;
LOGF("Reading DEFAULT DIRCACHE !!!");
NXReadType(stream,@encode(int),&v);
[Object setVersion:v];
hostList = NXReadObject(stream);
browserList = NXReadObject(stream);
NXCloseTypedStream(stream);
}
else
{
puts("NO dircache found !");
hostList = [[List alloc] init];
browserList = [[List alloc] init];
}
}
if ([Object version] <= 5) // Try to read .gatorftprc
{
[self openGatorWindow:self];
}
// setup the hostBrowser
//puts("browser setup");
[[hostBrowser window] setFrameUsingName:"hostBrowser"];
[[hostBrowser window] setFrameAutosaveName:"hostBrowser"];
[hostBrowser setDelegate:self];
[hostBrowser setDoubleAction:@selector(hostDoubleClicked)];
[hostBrowser setMatrixClass:[NiftyMatrix class]];
[hostBrowser acceptArrowKeys:YES andSendActionMessages:YES];
[hostBrowser loadColumnZero];
//puts("browser setup done");
[addButton setIcon:"NXreturnSign"];
[loginButton setIcon:"NXreturnSign"];
[self showHostWindow:self];
// just for testing
//ftp = [[FtpSession alloc] initForHost:"localhost" user:"ftp" pass:"yoda@"];
//[sessionList addObject:ftp];
chdir([[NXBundle mainBundle] directory]);
[versionStrings readFromFile:"version.strings"];
LOGF("compile version: %s\n",[versionStrings valueForStringKey:"Version"]);
LOGF("cache version: %d\n",[Object version]);
//defaultAppIconView = [[NXApp appIcon] contentView];
//LOGF("appicon = %p,class = %s",defaultAppIconView,[defaultAppIconView name]);
chdir("/");
return self;
}
- appWillTerminate:sender;
{
[[NXApp windowList] makeObjectsPerform:@selector(close)];
/*
puts("forking");
if (fork())
{
sleep(5);
puts("child exiting");
exit(0);
}
sleep(10);
puts("parent exiting");
*/
[self writeDirCache:self];
return self;
}
- writeDirCache:sender;
{
NXTypedStream *stream;
[cachePanel makeKeyAndOrderFront:self];
my_chdir(NXHomeDirectory());
stream = NXOpenTypedStreamForFile(DIRCACHE, NX_WRITEONLY);
if (stream)
{
int v=DEFAULTOBJECTVERSION;
NXAtom s;
LOGF("Writing DIRCACHE !!!");
[Object setVersion:v];
NXWriteType(stream,@encode(int),&v);
if ([Object version] != 4)
{
s=[self defaultUser];NXWriteType(stream,"%",&s);
s=[self defaultPass];NXWriteType(stream,"%",&s);
s=[self defaultPath];NXWriteType(stream,"%",&s);
s=[self defaultLocalPath];NXWriteType(stream,"%",&s);
}
NXWriteObject(stream,hostList);
NXWriteObject(stream,browserList);
NXCloseTypedStream(stream);
}
else
{
NXBeep();
NXRunAlertPanel("ERROR","Couldnt WRITE dircache !!! !",NULL,NULL,NULL);
}
[cachePanel close];
my_unchdir();
return self;
}
- savingHost:(const char *)host;
{
//LOGF("%s,%p",host, cacheSaveHostField);
[cacheSaveHostField setStringValue:host];
[[cacheSaveHostField window] display];
return self;
}
- emptyCache:sender;
{
puts("emptying CACHE");
[hostList makeObjectsPerform:@selector(debugClearFileSystem)];
[browserList makeObjectsPerform:@selector(debugClearFileSystem)];
[hostBrowser loadColumnZero];
return self;
}
- purgeCache:sender;
{
puts("removing CACHE");
chdir(NXHomeDirectory());
unlink(DIRCACHE);
chdir("/");
hostList = [[List alloc] init];
browserList = [[List alloc] init];
[hostBrowser loadColumnZero];
return self;
}
- showHostWindow:sender;
{
[hostWindow makeKeyAndOrderFront:self];
[hostField setTextDelegate:self];
[hostField setStringValue:[[hostBrowser selectedCell] stringValue]];
[hostField selectText:self];
[self updateHostTextField];
return self;
}
- (int) browser:sender fillMatrix:matrix inColumn:(int)column;
{
int i;
int rows,cols;
id cell,obj;
[matrix getNumRows:&rows numCols:&cols];
//printf("fillHostMatrix: rows = %d,cols = %d\n",rows,cols);
if (cols != 1)
{
NXBeep();
exit(-1);
}
for (i=0;i<[browserList count];i++)
{
obj = [browserList objectAt:i];
cell = [matrix cellAt:i:0];
//printf("cell = %p,i=%d\n",cell,i);
if ( ! cell )
{
[matrix insertRowAt:i];
cell = [matrix cellAt:i:0];
//printf("new cell = %p,i=%d\n",cell,i);
}
[cell setStringValue:[obj name]];
[cell setLeaf:YES];
[cell setLoaded:YES];
}
return i;
}
- browserClick:sender;
{
id cell = [sender selectedCell];
if (cell)
[hostField setStringValue:[cell stringValue]];
[hostField selectText:self];
[self updateHostTextField];
return self;
}
- matrixDidShuffle:sender;
{
id cellList = [sender cellList];
int i,count = [cellList count];
[browserList empty];
for (i=0;i<count;i++)
{
[browserList addObject:[self ftpHostForName:NXUniqueString([[cellList objectAt:i] stringValue])]];
}
[self updateHostTextField];
return self;
}
- clickLoginButton;
{
[loginButton performClick:self];
return self;
}
- hostDoubleClicked;
{
[[self loginHost:self] autoLoginHost:self];
return self;
}
- loginHost:sender;
{
NXAtom name = NXUniqueString([hostField stringValue]);
id ftpHost;
id session;
if (name == emptyString)
return nil;
ftpHost = [self ftpHostForName:name];
[hostWindow performClose:self];
session = [ftpHost startSession];
[sessionList addObject:session];
return session;
}
- pressedEnter:sender;
{
NXAtom name = NXUniqueString([hostField stringValue]);
id ftpHost;
[hostField selectText:self];
if (name == emptyString)
return nil;
ftpHost = [self ftpHostForName:name];
if ([browserList indexOf:ftpHost] == NX_NOT_IN_LIST)
{
[addButton performClick:self];
}
else
{
[loginButton performClick:self];
}
[self updateHostTextField];
return self;
}
- addHost:sender;
{
NXAtom name = NXUniqueString([hostField stringValue]);
id ftpHost;
[hostField selectText:self];
if (name == emptyString)
return nil;
ftpHost = [self ftpHostForName:name];
//printf("name=%s,ftphost=%p,browserlist=%p\n",name,ftpHost,browserList);
[browserList addObjectIfAbsent:ftpHost];
[hostBrowser loadColumnZero];
[hostBrowser setPath:[ftpHost name]];
[self updateHostTextField];
return self;
}
- renameHost:sender;
{
NXAtom s = NXUniqueString([hostField stringValue]);
NXAtom t = NXUniqueString([[hostBrowser selectedCell] stringValue]);
id host = [self ftpHostForName:t];
if (strcmp(s,t)==0)
{
int i = [browserList indexOf:host];
[browserList removeObject:host];
[hostList removeObject:host];
if (i >= [browserList count])
i = [browserList count] - 1;
[hostBrowser loadColumnZero];
[hostBrowser setPath:[[browserList objectAt:i] name]];
[hostField setStringValue:[[browserList objectAt:i] name]];
//[host free];
}
else
{
[host renameTo:s];
[hostBrowser loadColumnZero];
[hostBrowser setPath:s];
}
[self updateHostTextField];
return self;
}
- textDidGetKeys:sender isEmpty:(BOOL)flag;
{
[self updateHostTextField];
return self;
}
- updateHostTextField;
{
NXAtom s = NXUniqueString([hostField stringValue]);
NXAtom t = NXUniqueString([[hostBrowser selectedCell] stringValue]);
if (!s || !*s)
{
[renameButton setEnabled:NO];
[addButton setEnabled:NO];
[loginButton setEnabled:NO];
[addButton setIconPosition:NX_TITLEONLY];
[loginButton setIconPosition:NX_TITLEONLY];
}
else
{
[loginButton setEnabled:YES];
if (s == t)
{
[renameButton setEnabled:YES];
[addButton setEnabled:NO];
[renameButton setTitle:"REMOVE"];
[addButton setIconPosition:NX_TITLEONLY];
[loginButton setIconPosition:NX_ICONRIGHT];
}
else
{
int i,count = [browserList count];
BOOL found = NO;
for (i=0;i<count;i++)
{
if (s==[[browserList objectAt:i] name])
{
found = TRUE;
break;
}
}
[renameButton setTitle:"Rename"];
if (found)
{
[renameButton setEnabled:NO];
[addButton setEnabled:NO];
[addButton setIconPosition:NX_TITLEONLY];
[loginButton setIconPosition:NX_ICONRIGHT];
}
else
{
[renameButton setEnabled:YES];
[addButton setEnabled:YES];
[addButton setIconPosition:NX_ICONRIGHT];
[loginButton setIconPosition:NX_TITLEONLY];
}
}
}
return self;
}
- openGatorWindow:sender;
{
NXTypedStream *stream;
my_chdir(NXHomeDirectory());
stream = NXOpenTypedStreamForFile(".gatorftprc", NX_READONLY);
my_unchdir();
if (stream)
{
id gatorScrollView,gatorList;
int i;
LOGF("Reading GATORFTPRC !!!");
gatorScrollView = NXReadObject(stream);
NXCloseTypedStream(stream);
[gatorBox setContentView:gatorScrollView];
[gatorBox display];
[[gatorBox window] makeKeyAndOrderFront:self];
if ([NXApp runModalFor:[gatorBox window]])
{
gatorList = [[gatorScrollView docView] cellList];
for (i=0;i<[gatorList count];i++)
{
id ftpHost;
NXAtom host;
NXAtom defaultDir = NULL;
char s[1000];
char *s1;
strcpy(s,[[gatorList objectAt:i] stringValue]);
s1 = strchr(s,'\n');
if (s1)
{
*s1 = '\0';
s1++;
if (strncmp(s1,":Directory:",strlen(":Directory:")) == 0)
{
char *s2 = strchr(s1,'\n');
if (s2)
*s2 = '\0';
s1+= strlen(":Directory:");
while(*s1 == ' ')
s1++;
defaultDir = NXUniqueString(s1);
}
}
host = NXUniqueString(s);
LOGF("GATORHost: %s",host);
if (defaultDir)
LOGF("GATORdir: %s",defaultDir);
ftpHost = [self ftpHostForName:host];
[browserList addObjectIfAbsent:ftpHost];
if (defaultDir)
[ftpHost setPath:NXUniqueString(defaultDir)];
}
[hostBrowser loadColumnZero];
[hostBrowser display];
}
[[gatorBox window] close];
}
else
NXRunAlertPanel([NXApp appName],"You are lucky, you don't have a .gatorftprc !",NULL,NULL,NULL);
return self;
}
- gatorOK:sender;
{
[NXApp stopModal:1];
return self;
}
- gatorCancel:sender;
{
[NXApp stopModal:0];
return self;
}
- ftpHostForName:(NXAtom)name;
{
int i,count = [hostList count];
id host=nil;
for (i=0;i<count;i++)
{
host = [hostList objectAt:i];
//printf("looking for %s, found %s\n",name,[host name]);
if (name == [host name])
{
return host;
}
}
//printf("creating %s\n",name);
host = [[FtpHost alloc] initForName:name];
[hostList addObject:host];
return host;
}
- openPreferences:sender;
{
[preferencesPanel makeKeyAndOrderFront:self];
[defaultForm selectTextAt:0];
return self;
}
// Methods forwarded to Ftp
// none :)
// Methods received from Ftp
- ftpDidActivate:sender
{
activeFtp = sender;
return self;
}
- setProgress:(long)pos :(long)len from:sender;
{
if (sender == activeFtp)
{
if (pos == -1)
{
NXPoint thePoint = {8,8};
[[NXApp appIcon] setContentView:defaultAppIconView];
[defaultAppIconView display];
[defaultAppIconView lockFocus];
[[NXImage findImageNamed:"appicon"] composite:NX_SOVER toPoint:&thePoint];
[defaultAppIconView unlockFocus];
[[defaultAppIconView window] flushWindow];
}
else
{
[[NXApp appIcon] setContentView:progressIconView];
[progressView setMinValue:0];
if (len != -1)
{
[progressView setMaxValue:len];
[progressView setFloatValue:pos*0.995];
[fileProgressField setIntValue:pos];
[fileLengthField setIntValue:len];
}
else
{
[progressView setMaxValue:0];
[fileLengthField setStringValue:"???"];
}
[[NXApp appIcon] display];
}
}
return self;
}
- (NXAtom) defaultUser;
{
return NXUniqueString([defaultUserField stringValue]);
}
- (NXAtom) defaultPass;
{
return NXUniqueString([defaultPassField stringValue]);
}
- (NXAtom) defaultPath;
{
return NXUniqueString([defaultPathField stringValue]);
}
- (NXAtom) defaultLocalPath;
{
return NXUniqueString([defaultLocalPathField stringValue]);
}
// help functions for regetPanel
- (int) showRegetPanelForFile:(const char *)name;
{
[regetPanelHostField setStringValue:name];
return [NXApp runModalFor:regetPanel];
}
- regetPanelButtonPressed:sender;
{
if ([sender selectedCell])
{
[NXApp stopModal:[[sender selectedCell] tag]];
[regetPanel close];
}
return self;
}
- ftpService: (id)pasteboard
userData:(const char *)userData
error:(char **)msg
{
char *buffer, *data;
int length;
[pasteboard types]; // pretend to check the pasteboard types
// read the ASCII data from the pasteboard
if ([pasteboard readType:NXAsciiPboardType data:&data
length:&length])
{
buffer = malloc(length+1);
strncpy(buffer,data,length);
buffer[length]='\0';
parseHostAndFile(buffer);
free(buffer);
if (serviceHost)
{
id ftpHost;
LOGF("host = %s,filename = %s",serviceHost,serviceFile);
ftpHost = [self ftpHostForName:serviceHost];
if ([browserList indexOf:ftpHost] == NX_NOT_IN_LIST)
{
[browserList addObject:ftpHost];
[hostBrowser loadColumnZero];
}
if (serviceFile)
[ftpHost setPath:serviceFile];
[sessionList addObject:[ftpHost startSession]];
[hostWindow close];
}
else
{
NXRunAlertPanel(NULL,"couldn't find host or file info in selection !",NULL,NULL,NULL);
}
}
return self;
}
@end
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.