From 7604b81deafcfb5dd7d1b67799b50384598147b5 Mon Sep 17 00:00:00 2001 From: Kalle Olavi Niemitalo Date: Sat, 27 Oct 2007 19:23:45 +0300 Subject: [PATCH] Encapsulate more queue management. --- TFUSBController.m | 80 +++++++++++++++++++++++++++++++++++-------------------- 1 file changed, 51 insertions(+), 29 deletions(-) diff --git a/TFUSBController.m b/TFUSBController.m index c1c4482..dcf8ff0 100644 --- a/TFUSBController.m +++ b/TFUSBController.m @@ -116,6 +116,11 @@ static int connectedSpeed; - (void) updateProgress:(NSDictionary*) inDict; - (NSString*) elapsedTime:(NSTimeInterval) totalSeconds; +// Queue management +- (BOOL) hasPriorityTransfer; +- (NSDictionary*) nextTransferAndQueue:(NSMutableArray**)queue; +- (void) removeTransfer:(NSDictionary*)transfer fromQueue:(NSMutableArray*)queue; + @end #define TopfieldVendorID 4571 @@ -594,6 +599,33 @@ initDevice(USBDeviceContext *device) return [NSString stringWithFormat:@"%c%i:%c%i:%c%i", hp, hours, mp, minutes, sp, seconds]; } +// --------------------------------------------------------------------------- +// Queues +// --------------------------------------------------------------------------- + +- (BOOL) hasPriorityTransfer { + return [priorityTransferQueue count] > 0; +} + +- (NSDictionary*) nextTransferAndQueue:(NSMutableArray**)queue { + if ([priorityTransferQueue count] > 0) { + *queue = priorityTransferQueue; + return [priorityTransferQueue objectAtIndex:0]; + } else if ([transferQueue count] > 0) { + *queue = transferQueue; + return [transferQueue objectAtIndex:0]; + } else { + *queue = nil; + return nil; + } +} + +- (void) removeTransfer:(NSDictionary*)transfer + fromQueue:(NSMutableArray*)queue +{ + [queue removeObjectIdenticalTo:transfer]; +} + @end // --------------------------------------------------------------------------- @@ -720,7 +752,7 @@ initDevice(USBDeviceContext *device) double amountReceived = 0xfe00 + offset; NSData* testData = [NSData dataWithBytes:&test_bigendian length:4]; while ([header isEqualToData:testData] && [[[self uiElements] isConnected] intValue]) { - if ([priorityTransferQueue count] != 0) { + if ([self hasPriorityTransfer]) { [self addTransfer:[NSDictionary dictionaryWithObjectsAndKeys: fileInfo,@"filename", currentPath,@"path", savePath,@"savePath", [NSNumber numberWithUnsignedLongLong:amountReceived],@"offset", @@ -821,7 +853,7 @@ initDevice(USBDeviceContext *device) NSFileHandle* fileHandle = [NSFileHandle fileHandleForReadingAtPath:fileToUpload]; [fileHandle seekToFileOffset:offset]; do { - if ([priorityTransferQueue count] != 0) { + if ([self hasPriorityTransfer]) { //break out and create a new transfer to continue it NSLog(@"pausing upload"); [self addTransfer:[NSDictionary dictionaryWithObjectsAndKeys: @@ -897,32 +929,28 @@ initDevice(USBDeviceContext *device) - (void) transfer:(id)sender { while ([[[self uiElements] isConnected] intValue]) { NSAutoreleasePool *pool=[[NSAutoreleasePool alloc] init]; - if ([priorityTransferQueue count] != 0 ) { - id currentTransfer = [priorityTransferQueue objectAtIndex:0]; - if ([[currentTransfer objectForKey:@"transferType"] isEqualToString:@"fileList"]) { + NSMutableArray* queue = nil; + NSDictionary* currentTransfer = [self nextTransferAndQueue:&queue]; + if (currentTransfer != nil) { + NSString* transferType = [currentTransfer objectForKey:@"transferType"]; + if ([transferType isEqualToString:@"fileList"]) { [self getFileListForPath:[currentTransfer objectForKey:@"path"]]; - [priorityTransferQueue removeObjectAtIndex:0]; -// NSLog(@"fL fin %i,p:%i",[transferQueue count],[priorityTransferQueue count]); } - else if ([[currentTransfer objectForKey:@"transferType"] isEqualToString:@"turbo"]) { + else if ([transferType isEqualToString:@"turbo"]) { // [self turnTurboOn:[[currentTransfer objectForKey:@"turboOn"] boolValue]]; - [priorityTransferQueue removeObjectAtIndex:0]; } - else if ([[currentTransfer objectForKey:@"transferType"] isEqualToString:@"rename"]) { + else if ([transferType isEqualToString:@"rename"]) { [self renameFile:[currentTransfer objectForKey:@"oldName"] withName:[currentTransfer objectForKey:@"newName"] atPath:[currentTransfer objectForKey:@"path"]]; - [priorityTransferQueue removeObjectAtIndex:0]; } - else if ([[currentTransfer objectForKey:@"transferType"] isEqualToString:@"newFolder"]) { + else if ([transferType isEqualToString:@"newFolder"]) { [self makeFolder:[currentTransfer objectForKey:@"newName"] atPath:[currentTransfer objectForKey:@"path"]]; - [priorityTransferQueue removeObjectAtIndex:0]; } - else if ([[currentTransfer objectForKey:@"transferType"] isEqualToString:@"delete"]) { + else if ([transferType isEqualToString:@"delete"]) { [self deleteFile:[currentTransfer objectForKey:@"file"] fromPath:[currentTransfer objectForKey:@"path"]]; - [priorityTransferQueue removeObjectAtIndex:0]; } - else if ([[currentTransfer objectForKey:@"transferType"] isEqualToString:@"pause"]) { + else if ([transferType isEqualToString:@"pause"]) { if ([transferQueue count] != 0) { NSArray* toPause = [transferQueue filteredArrayUsingPredicate: [NSPredicate predicateWithFormat:@"(filename = %@)", @@ -933,9 +961,8 @@ initDevice(USBDeviceContext *device) [transferQueue removeObjectsInArray:toPause]; } } - [priorityTransferQueue removeObjectAtIndex:0]; } - else if ([[currentTransfer objectForKey:@"transferType"] isEqualToString:@"resume"]) { + else if ([transferType isEqualToString:@"resume"]) { if ([pausedQueue count] != 0) { NSArray* toResume = [pausedQueue filteredArrayUsingPredicate: [NSPredicate predicateWithFormat:@"(filename = %@)", @@ -946,32 +973,27 @@ initDevice(USBDeviceContext *device) [pausedQueue removeObjectsInArray:toResume]; } } - [priorityTransferQueue removeObjectAtIndex:0]; } - } - else if ([transferQueue count] != 0) { - id currentTransfer = [transferQueue objectAtIndex:0]; - if ([[currentTransfer objectForKey:@"transferType"] isEqualToString:@"download"]) { + else if ([transferType isEqualToString:@"download"]) { [self getFile:[currentTransfer objectForKey:@"filename"] forPath:[currentTransfer objectForKey:@"path"] toSaveTo:[currentTransfer objectForKey:@"savePath"] beginAtOffset:[[currentTransfer objectForKey:@"offset"] unsignedLongLongValue] withLooping:[[currentTransfer objectForKey:@"looping"] boolValue] existingTime:[[currentTransfer objectForKey:@"existingTime"] intValue]]; - [transferQueue removeObjectAtIndex:0]; -// NSLog(@"dl fin %i,p:%i",[transferQueue count],[priorityTransferQueue count]); } - else if ([[currentTransfer objectForKey:@"transferType"] isEqualToString:@"upload"]) { -// NSLog(@"ul start %i,p:%i",[transferQueue count],[priorityTransferQueue count]); + else if ([transferType isEqualToString:@"upload"]) { [self uploadFile:[currentTransfer objectForKey:@"filename"] ofSize:[[currentTransfer objectForKey:@"fileSize"] unsignedLongLongValue] fromPath:[currentTransfer objectForKey:@"path"] withAttributes:[currentTransfer objectForKey:@"attributes"] atOffset:[[currentTransfer objectForKey:@"offset"] unsignedLongLongValue] existingTime:[[currentTransfer objectForKey:@"existingTime"] intValue]]; - [transferQueue removeObjectAtIndex:0]; -// NSLog(@"ul fin %i,p:%i",[transferQueue count],[priorityTransferQueue count]); } + else { + NSLog(@"Unrecognized transfer type: %@", transferType); + } + [self removeTransfer:currentTransfer fromQueue:queue]; } else usleep(100); [pool release]; -- 2.11.4.GIT