This is FtpConnection.m in view mode; [Download] [Up]
#import "FtpConnection.h"
#import "FtpSubThread.h"
#import "FtpSession.h"
#import "FtpDirectory.h"
#import "NXmystd.h"
#import <remote/NXProxy.h>
int my_chdir(const char *path);
void my_unchdir();
FILE *my_fopen(const char *path,const char *name,const char *mode);
@implementation FtpConnection
- initFromSession:aSession;
{
id nxConn;
[super init];
session = aSession;
[session showFilename:""];
queue = [[List alloc] init];
// fire up the FtpSubThread
status = FTP_NOCONN;
connecttries=0;
nxConn = [NXConnection registerRoot:[[FtpSubThread alloc] init]];
[nxConn runInNewThread];
//[nxConn setDelegate:self];
[nxConn registerForInvalidationNotification:self];
// get the proxy for the FtpConnection instance back from the NXConnection
ftpSub = [NXConnection connectToPort:[nxConn inPort]];
//printf("self = %p, ftpSub = %p,inPort = %p,outPort = %p\n",self, ftpSub,[nxConn inPort],[nxConn outPort]);
// finally, run our side of the connection
[[ftpSub connectionForProxy] runFromAppKit];
// tell the subthread to connect to host (this is a oneway message, which returns immediately)
[ftpSub setFtpConnection:self];
[ftpSub connectToHost:[session hostName]];
// ftpSub will tell us when its finished...
return self;
}
- free;
{
queue = [queue free];
ftpSub = [ftpSub free];
return [super free];
}
- terminate;
{
[ftpSub closeConnection];
return self;
}
- senderIsInvalid:sender;
{
ERRORF("%p",sender);
return self;
}
- addToQueue:obj;
{
id firstObj = [queue objectAt:0];
if (status == FTP_CONNECTIONLOST)
{
connecttries=0;
[ftpSub connectToHost:[session hostName]];
}
if (!firstObj)
[queue addObject:obj];
else
{
if (([obj isDir] || [obj isReadme]) && [firstObj isFile] && ![firstObj isReadme])
shouldinterrupt = YES;
[queue removeObject:obj];
if ([obj isFile] && ![obj isReadme])
[queue addObject:obj];
else
[queue insertObject:obj at:0];
}
[obj setTransferStatus:1];
[self ping];
[[session queueBrowser] loadColumnZero];
return self;
}
- (BOOL)isInQueue:obj;
{
return [queue indexOf:obj] != NX_NOT_IN_LIST;
}
- removeFromQueue:obj;
{
[queue removeObject:obj];
[obj setTransferStatus:0];
[self ping];
[[session queueBrowser] loadColumnZero];
return self;
}
- ping;
{
id obj = [queue objectAt:0];
//printf("ping status:%d\n",status);
if (status == FTP_OK)
{
shouldinterrupt = NO;
if (obj)
{
char *aCharBufferPtr[1000];
[obj fullPath:aCharBufferPtr];
//printf("PING: obj %s\n",[obj name]);
[session showFilename:aCharBufferPtr];
[obj setTransferStatus:2];
if ([obj isDir])
{
status = FTP_LISTINGDIR;
[ftpSub listDir:obj];
}
else
{
status = FTP_GETTINGFILE;
//puts("ping [ftpSub getFile:obj]");
//LOGF("filename = |%s|",[obj name]);
[ftpSub getFile:obj];
//LOGF("filename = |%s|",[obj name]);
//puts("ping after [ftpSub getFile:obj]");
}
currentFile = obj;
}
else
{
[session showFilename:""];
currentFile = obj;
}
}
[session setDirty:[queue count]?YES:NO];
[session validateBrowser];
return self;
}
- (BOOL)isTransferring;
{
return (status == FTP_LISTINGDIR || status == FTP_GETTINGFILE);
}
- abortCurrentTransfer;
{
if (currentFile)
{
shouldinterrupt = YES;
[self removeFromQueue:currentFile];
}
return self;
}
- getDirForPath:(const char *)path;
{
return [[session fileSystem] getDirForPath:path];
}
- (void oneway) console:(const char *)string;
{
[session console:string];
}
// FtpResult protocol methods
- (void oneway) show:(const char *)string;
{
[session showStatus:string];
}
- (void oneway) connected;
{
status = FTP_CONNECTED;
[session showStatus:"connected to host"];
[ftpSub loginAsUser:[session user] withPassword:[session pass]];
}
- (void oneway) connectFailed:(const char *)error;
{
status = FTP_ERROR;
[session showStatus:error];
}
- (void oneway) loggedIn;
{
status = FTP_OK;
[session showStatus:"login successful"];
[self ping];
}
- (void oneway) loginFailed:(const char *)error;
{
status = FTP_ERROR;
[session showStatus:error];
}
- (void oneway) checkingDir:dir;
{
char buf[1000];
if (status != FTP_LISTINGDIR)
return;
sprintf(buf,"checking directory '%s'",[dir path]);
status = FTP_LISTINGDIR;
[session showStatus:buf];
[session validateBrowser];
}
- (void oneway) listingDir:dir;
{
char buf[1000];
if (status != FTP_LISTINGDIR)
return;
sprintf(buf,"retrieving directory '%s'",[dir path]);
status = FTP_LISTINGDIR;
[session showStatus:buf];
[session validateBrowser];
}
- (void oneway) dirListed:dir;
{
if (status != FTP_LISTINGDIR)
return;
status = FTP_OK;
connecttries=0;
[session showStatus:"directory retrieved"];
[self removeFromQueue:dir];
}
- (void oneway) retrievingFile:file;
{
char buf[1000];
if (status != FTP_GETTINGFILE)
return;
sprintf(buf,"transferring file '%s'",[file name]);
status = FTP_GETTINGFILE;
[session showStatus:buf];
[session setProgressSize:[file fileSize]];
[session validateBrowser];
}
- (void oneway) fileRetrieved:file;
{
char buf[1000];
if (status != FTP_GETTINGFILE)
return;
status = FTP_OK;
connecttries=0;
[session showStatus:"filetransfer successful"];
[self removeFromQueue:file];
if ([file shouldAutoOpen])
{
LOGF("%s should Autoopen",[file name]);
//[NXApp deactivateSelf];
[session deactivateWindow];
my_chdir([file localPath]);
sprintf(buf,"open %s",[file localName]);
system(buf);
my_unchdir();
}
}
- (void oneway) fileInterrupted:file;
{
if (status != FTP_GETTINGFILE)
return;
status = FTP_OK;
[session showStatus:"filetransfer interrupted"];
[file setShouldReget:YES];
[self ping];
}
- (void oneway) fileRetrievingFailed:(const char *)error;
{
status = FTP_ERROR;
[session showStatus:error];
}
- (void oneway) transferError:obj:(const char *)error;
{
if (status != FTP_OK && status != FTP_LISTINGDIR && status != FTP_GETTINGFILE)
return;
status = FTP_OK;
[session showStatus:error];
[self removeFromQueue:obj];
[[obj parentDir] setShouldTransferAlways];
[self addToQueue:[obj parentDir]];
}
- (void oneway) socketError:(const char *)error;
{
if (status != FTP_OK && status != FTP_LISTINGDIR && status != FTP_GETTINGFILE)
return;
status = FTP_ERROR;
[session showStatus:error];
}
- (void oneway) unrecoverableError:(const char *)error;
{
status = FTP_ERROR;
[session showStatus:error];
}
- (void oneway) connectionLost:(const char *)error;
{
if (status != FTP_OK && status != FTP_LISTINGDIR && status != FTP_GETTINGFILE)
return;
status = FTP_CONNECTIONLOST;
[session showStatus:error];
connecttries++;
if (connecttries <3)
[ftpSub connectToHost:[session hostName]];
return;
}
- (void oneway) loggingOut;
{
status = FTP_LOGGEDIN;
[session showStatus:"logging out"];
}
- (void oneway) loggedOut;
{
status = FTP_NOCONN;
[session showStatus:"connection closed"];
}
- (BOOL) shouldStopAtPosition:(long)pos;
{
//printf("pos = %d, shouldinterrupt = %d\n",pos,(int)shouldinterrupt);
[session showProgress:pos];
if (shouldinterrupt)
return YES;
else
return NO;
}
/*
Queue Browser delegate methods (by Peter Lount)
*/
- (int) browser:sender fillMatrix:matrix inColumn:(int)column;
{
int i;
int rows,
cols;
id cell,
obj;
char aCharBufferPtr[1000];
[matrix getNumRows:&rows numCols:&cols];
// printf("fillQueueMatrix: rows = %d,cols = %d\n",rows,cols);
if (cols != 1)
{
NXBeep();
exit(-1);
}
for (i=0;i<[queue count];i++)
{
obj = [queue 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]];
[obj fullPath:aCharBufferPtr];
[cell setStringValue:aCharBufferPtr];
[cell setLeaf:YES];
[cell setLoaded:YES];
}
return i;
}
- singleClickInQueueBrowser:sender;
{
/*
id cell = [sender selectedCell];
if (cell)
[hostField setStringValue:[cell stringValue]];
[hostField selectText:self];
*/
return self;
}
- doubleClickInQueueBrowser:sender;
{
/*
id cell = [sender selectedCell];
*/
return self;
}
- matrixDidShuffle:sender; // we could use this to change the order of transfers
{
/*
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])]];
}
*/
return self;
}
@end
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.