This is FtpFileSystem.m in view mode; [Download] [Up]
#import "FtpFileSystem.h"
#import "FtpDirectory.h"
#import "FtpHost.h"
#import "FtpSession.h"
#import "FtpConnection.h"
#import "NXmystd.h"
@implementation FtpFileSystem
- initForHost:host andUser:(NXAtom) user;
{
[super init];
myhost = host;
myuser = user;
rootDir = [[FtpDirectory alloc] initForName:"." withParent:nil];
return self;
}
- free;
{
rootDir = [rootDir free];
return [super free];
}
- write:(NXTypedStream *)stream;
{
[super write:stream];
NXWriteTypes(stream,"%@@",&myuser,&myhost,&rootDir);
return self;
}
- read:(NXTypedStream *)stream;
{
[super read:stream];
NXReadTypes(stream,"%@@",&myuser,&myhost,&rootDir);
return self;
}
- getDirForPath:(const char *)path;
{
char *s,*s2,*sorig;
id dir;
int len;
len = strlen(path);
sorig = s = calloc(len+1,sizeof(char));
strcpy(s,path);
dir = rootDir;
while ( *s && dir )
{
while (*s == '/')
s++;
if ( !*s )
break;
s2 = strchr(s,'/');
if ( !s2 )
{
dir = [dir getDirWithName:s];
*s='\0';
break;
}
*s2 = '\0';
dir = [dir getDirWithName:s];
s = s2+1;
}
free(sorig);
return dir;
}
- createDirsForPath:(const char *)path;
{
char *s,*s2,*sorig;
id dir;
int len;
len = strlen(path);
sorig = s = calloc(len+1,sizeof(char));
strcpy(s,path);
dir = rootDir;
//LOGF("%s",path);
while ( *s )
{
id parent;
while (*s == '/')
s++;
if ( !*s )
break;
s2 = strchr(s,'/');
parent = dir;
if ( !s2 )
{
id file = [dir getObjWithName:s];
if (!file)
{
file = [[FtpFile alloc] initForName:NXUniqueString(s) withParent:parent];
[parent add:file];
//LOGF("added file");
}
break;
}
*s2 = '\0';
dir = [parent getDirWithName:s];
if (!dir)
{
dir = [[FtpDirectory alloc] initForName:NXUniqueString(s) withParent:parent];
[parent add:dir];
//LOGF("added dir");
}
//LOGF("s=%s,dir=%s,parent=%s",s,[dir path],[parent path]);
s = s2+1;
}
free(sorig);
return self;
}
- rootDir;
{
return rootDir;
}
// NXBrowser delegate methods
- (int) browser:sender fillMatrix:matrix inColumn:(int)column;
{
id dir;
char path[1000];
//LOGF("browser:%p fillMatrix:%p inColumn:%d\n",sender,matrix,column);
[sender getPath:path toColumn:column];
//LOGF("fillMatrix: path for this column: %s\n",path);
dir = [self getDirForPath:path];
if (dir)
{
//LOGF("fillMatrix: dir for this column:%s\n",[dir name]);
//LOGF("fillMatrix: path:%s\n",[dir path]);
if ([dir needsCheck] || [dir needsUpdate])
{
//LOGF("dir needs update");
//printf("target=%p,ftpConn=%p\n",[sender target],[[sender target] ftpConn]);
[dir setShouldTransferIfNeeded];
[[[sender target] ftpConn] addToQueue:dir];
}
//[sender validateVisibleColumns];
//[dir addSubDirsToCheckTo:[[sender target] ftpConn]];
return [dir fillMatrix:matrix];
}
else
{
puts("ERROR: dir not found");
return 0;
}
}
- (BOOL) browser:sender columnIsValid:(int) column;
{
id dir;
char path[1000];
//printf("browser:%p columnIsValid:%d\n",sender,column);
[sender getPath:path toColumn:column];
//printf("isValid: path for this column: %s\n",path);
dir = [self getDirForPath:path];
if (dir)
{
BOOL needsDisplay = [dir needsDisplay];
//LOGF("dir for column#%d:%s\n",column,[dir name]);
//printf("isValid: path:%s\n",[dir path]);
//LOGF(needsDisplay?"needs Display":"needs NO Display");
return !needsDisplay;
}
//LOGF("no dir found");
return NO;
}
- validateBrowser:browser;
{
int i;
id delegate = [browser delegate];
for (i=0;i<=[browser lastColumn];i++)
{
if (![delegate browser:browser columnIsValid:i])
{
[delegate browser:browser fillMatrix:[browser matrixInColumn:i] inColumn:i];
[browser setNeedsDisplay:YES];
}
}
return self;
}
@end
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.