5 // Created by Nicolas BRULEZ on 07/04/11.
6 // Copyright 2011 Parrot. All rights reserved.
10 #import <utils/ardrone_ftp.h>
12 #import "ConstantsAndMacros.h"
16 * List of different FTPs opened, the key is the hex value of the ftp pointer
17 * Used inside "C to Obj-C callback to get the correct delegate/callback from
18 * multi-thread/multi-ftp contexts.
20 static NSMutableDictionary *listOfFtps = nil;
22 @implementation ARDroneFTPCallbackArg
25 @synthesize operation;
27 - (id)initWithStatus:(ARDFTP_RESULT)_status withProgress:(float)_progress withFileList:(char *)_fileList withOperation:(FTP_OPERATION)_operation
34 if (nil != _fileList && 0 < strlen (_fileList))
36 fileList = [[NSString stringWithCString:_fileList encoding:NSASCIIStringEncoding] copy];
38 operation = _operation;
43 - (void)setFileList:(char *)_fileList
45 if (nil != _fileList && 0 < strlen (_fileList))
47 fileList = [[NSString stringWithCString:_fileList encoding:NSASCIIStringEncoding] copy];
58 - (NSString *)fileList
60 return [[fileList copy] autorelease];
65 ARDFTP_RESULT convertStatus (_ftp_status status)
67 ARDFTP_RESULT retVal = ARDFTP_FAIL;
74 retVal = ARDFTP_SUCCESS;
77 retVal = ARDFTP_TIMEOUT;
80 retVal = ARDFTP_BADSIZE;
83 retVal = ARDFTP_SAMESIZE;
86 retVal = ARDFTP_PROGRESS;
92 retVal = ARDFTP_ABORT;
100 void wrapperCallback (_ftp_status status, void *arg, _ftp_t *ftp)
102 NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
104 if (nil == listOfFtps) // Should never happen ... but just in case
110 ARDroneFTP *ardftp = [listOfFtps objectForKey:[NSString stringWithFormat:@"%x",ftp]];
113 ARDFTP_RESULT locStat = convertStatus(status);
114 ARDroneFTPCallbackArg *callbackArg = nil;
115 if (ARDFTP_PROGRESS == locStat && NULL != arg)
117 callbackArg = [[ARDroneFTPCallbackArg alloc] initWithStatus:locStat withProgress:*(float *)arg withFileList:nil withOperation:ardftp.currentOperation];
119 else if (ARDFTP_SUCCESS == locStat && NULL != arg && FTP_LIST == ardftp.currentOperation)
121 callbackArg = [[ARDroneFTPCallbackArg alloc] initWithStatus:locStat withProgress:0.0 withFileList:(char *)arg withOperation:ardftp.currentOperation];
126 callbackArg = [[ARDroneFTPCallbackArg alloc] initWithStatus:locStat withProgress:0.0 withFileList:nil withOperation:ardftp.currentOperation];
129 if (FTP_BUSY != locStat &&
130 FTP_PROGRESS != locStat) // Keep FTP busy if it was already busy before call, or if the current process is still in progress
135 [ardftp.delegate performSelector:ardftp.currentOpCallback withObject:[callbackArg autorelease]];
141 extern char drone_address[];
143 @implementation ARDroneFTP
144 @synthesize currentOperation;
145 @synthesize currentOpCallback;
146 @synthesize delegate;
150 + (id) anonymousUpdateFTPwithDelegate:(id)_delegate withDefaultCallback:(SEL)_callback
152 NSString *ip = [NSString stringWithCString:drone_address encoding:NSUTF8StringEncoding];
153 const int port = 5551;
155 ARDroneFTP *ftp = [[ARDroneFTP alloc] initAnonymousWithIP:ip withPort:port withDelegate:_delegate withDefaultCallback:_callback];
157 return [ftp autorelease];
160 + (id) updateFTPwithUser:(NSString *)user withPassword:(NSString *)password withDelegate:(id)_delegate withDefaultCallback:(SEL)_callback
162 NSString *ip = [NSString stringWithCString:drone_address encoding:NSUTF8StringEncoding];
163 const int port = 5551;
165 ARDroneFTP *ftp = [[ARDroneFTP alloc] initWithIP:ip withPort:port withUser:user withPassword:password withDelegate:_delegate withDefaultCallback:_callback];
167 return [ftp autorelease];
170 + (id) anonymousStandardFTPwithDelegate:(id)_delegate withDefaultCallback:(SEL)_callback
172 NSString *ip = [NSString stringWithCString:drone_address encoding:NSUTF8StringEncoding];
175 ARDroneFTP *ftp = [[ARDroneFTP alloc] initAnonymousWithIP:ip withPort:port withDelegate:_delegate withDefaultCallback:_callback];
177 return [ftp autorelease];
180 + (id) standardFTPwithUser:(NSString *)user withPassword:(NSString *)password withDelegate:(id)_delegate withDefaultCallback:(SEL)_callback
182 NSString *ip = [NSString stringWithCString:drone_address encoding:NSUTF8StringEncoding];
185 ARDroneFTP *ftp = [[ARDroneFTP alloc] initWithIP:ip withPort:port withUser:user withPassword:password withDelegate:_delegate withDefaultCallback:_callback];
187 return [ftp autorelease];
190 - (id)initAnonymousWithIP:(NSString *)ip withPort:(int)port withDelegate:(id)_delegate withDefaultCallback:(SEL)_callback
195 _ftp_status initResult = FTP_FAIL;
196 ftp = ftpConnect ([ip cStringUsingEncoding:NSASCIIStringEncoding],
201 if (FTP_FAILED (initResult))
203 NSLog(@"Connexion to FTP anonymous@%@:%d failed\n", ip, port);
205 delegate = _delegate;
206 defaultCallback = _callback;
208 currentOperation = FTP_NONE;
209 if (nil == listOfFtps)
211 listOfFtps = [[NSMutableDictionary alloc] initWithCapacity:1];
213 [listOfFtps setObject:self forKey:[NSString stringWithFormat:@"%x",ftp]];
218 - (id)initWithIP:(NSString *)ip withPort:(int)port withUser:(NSString *)user withPassword:(NSString *)password withDelegate:(id)_delegate withDefaultCallback:(SEL)_callback
223 _ftp_status initResult = FTP_FAIL;
224 ftp = ftpConnect ([ip cStringUsingEncoding:NSASCIIStringEncoding],
226 [user cStringUsingEncoding:NSASCIIStringEncoding],
227 [password cStringUsingEncoding:NSASCIIStringEncoding],
229 if (FTP_FAILED (initResult))
231 NSLog(@"Connexion to FTP %@@%@:%d failed\n", user, ip, port);
233 delegate = _delegate;
234 defaultCallback = _callback;
236 currentOperation = FTP_NONE;
237 if (nil == listOfFtps)
239 listOfFtps = [[NSMutableDictionary alloc] initWithCapacity:1];
241 [listOfFtps setObject:self forKey:[NSString stringWithFormat:@"%x",ftp]];
246 - (void)setDelegate:(id)_delegate
248 delegate = _delegate;
251 - (void)setDefaultCallback:(SEL)_callback
253 defaultCallback = _callback;
258 [listOfFtps removeObjectForKey:[NSString stringWithFormat:@"%x",ftp]];
260 if (![listOfFtps count])
262 [listOfFtps release];
269 - (bool)keepConnexionAlive
271 return ARDFTP_SUCCEEDED([self changeDirectoryTo:@"."]);
274 - (ARDFTP_RESULT)sendLocalFile:(NSString *)local toDistantFile:(NSString *)distant withResume:(BOOL)resume
276 return [self sendLocalFile:local toDistantFile:distant withResume:resume withCallback:defaultCallback];
279 - (ARDFTP_RESULT)sendLocalFile:(NSString *)local toDistantFile:(NSString *)distant withResume:(BOOL)resume withCallback:(SEL)_callback
285 _ftp_status retVal = FTP_FAIL;
287 currentOperation = FTP_SEND;
288 currentOpCallback = _callback;
290 if (nil != currentOpCallback)
292 retVal = ftpPut (ftp,
293 [local cStringUsingEncoding:NSASCIIStringEncoding],
294 [distant cStringUsingEncoding:NSASCIIStringEncoding],
298 return convertStatus(retVal);
301 - (ARDFTP_RESULT)sendSynchronouslyLocalFile:(NSString *)local toDistantFile:(NSString *)distant withResume:(BOOL)resume
307 _ftp_status retVal = FTP_FAIL;
309 currentOperation = FTP_SEND;
310 retVal = ftpPut (ftp,
311 [local cStringUsingEncoding:NSASCIIStringEncoding],
312 [distant cStringUsingEncoding:NSASCIIStringEncoding],
315 currentOperation = FTP_NONE;
317 return convertStatus(retVal);
320 - (ARDFTP_RESULT)getDistantFile:(NSString *)distant toLocalFile:(NSString *)local withResume:(BOOL)resume
322 return [self getDistantFile:distant toLocalFile:local withResume:resume withCallback:defaultCallback];
325 - (ARDFTP_RESULT)getDistantFile:(NSString *)distant toLocalFile:(NSString *)local withResume:(BOOL)resume withCallback:(SEL)_callback
331 _ftp_status retVal = FTP_FAIL;
333 currentOperation = FTP_GET;
334 currentOpCallback = _callback;
335 if (nil != currentOpCallback)
338 [distant cStringUsingEncoding:NSASCIIStringEncoding],
339 [local cStringUsingEncoding:NSASCIIStringEncoding],
343 return convertStatus(retVal);
346 - (ARDFTP_RESULT)getSynchronouslyDistantFile:(NSString *)distant toLocalFile:(NSString *)local withResume:(BOOL)resume
352 _ftp_status retVal = FTP_FAIL;
354 currentOperation = FTP_GET;
355 retVal = ftpGet (ftp,
356 [distant cStringUsingEncoding:NSASCIIStringEncoding],
357 [local cStringUsingEncoding:NSASCIIStringEncoding],
360 currentOperation = FTP_NONE;
362 return convertStatus(retVal);
365 - (ARDFTP_RESULT)listCurrentDirectory
367 return [self listCurrentDirectoryWithCallback:defaultCallback];
370 - (ARDFTP_RESULT)listCurrentDirectoryWithCallback:(SEL)_callback
376 _ftp_status retVal = FTP_FAIL;
378 currentOperation = FTP_LIST;
379 currentOpCallback = _callback;
380 if (nil != currentOpCallback)
382 retVal = ftpList(ftp,
386 return convertStatus (retVal);
389 - (ARDFTP_RESULT)listCurrentDirectoryIn:(NSString **)result
395 _ftp_status retVal = FTP_FAIL;
397 currentOperation = FTP_LIST;
399 retVal = ftpList (ftp,
402 currentOperation = FTP_NONE;
406 *result = [NSString stringWithCString:buffer encoding:NSASCIIStringEncoding];
408 return convertStatus(retVal);
411 - (ARDFTP_RESULT)removeDistantFile:(NSString *)distant
413 return convertStatus (ftpRemove (ftp,
414 [distant cStringUsingEncoding:NSASCIIStringEncoding]));
417 - (ARDFTP_RESULT)renameDistantFileFrom:(NSString *)origin to:(NSString *)dest
419 return convertStatus (ftpRename (ftp,
420 [origin cStringUsingEncoding:NSASCIIStringEncoding],
421 [dest cStringUsingEncoding:NSASCIIStringEncoding]));
424 - (ARDFTP_RESULT)renameDistantDirectoryFrom:(NSString *)origin to:(NSString *)dest
426 return [self renameDistantFileFrom:origin to:dest];
429 - (ARDFTP_RESULT)changeDirectoryTo:(NSString *)nextDir
431 return convertStatus (ftpCd (ftp,
432 [nextDir cStringUsingEncoding:NSASCIIStringEncoding]));
435 - (ARDFTP_RESULT)getWorkingDirectoryTo:(NSString **)result
437 char buffer [1024] = {0};
438 _ftp_status retVal = ftpPwd (ftp,
441 *result = [NSString stringWithCString:buffer encoding:NSASCIIStringEncoding];
442 return convertStatus (retVal);
445 - (ARDFTP_RESULT)createDirectoryNamed:(NSString *)dirName
447 return convertStatus (ftpMkdir (ftp,
448 [dirName cStringUsingEncoding:NSASCIIStringEncoding]));
451 - (ARDFTP_RESULT)removeDirectoryNamed:(NSString *)dirName
453 return convertStatus (ftpMkdir (ftp,
454 [dirName cStringUsingEncoding:NSASCIIStringEncoding]));
457 - (ARDFTP_RESULT)abortCurrentOperation
459 return convertStatus(ftpAbort (ftp));