Changeset 3353
- Timestamp:
- 09/06/06 21:45:15 (2 years ago)
- Files:
-
- trunk/Chat Core/MVIRCFileTransfer.m (modified) (3 diffs)
- trunk/Colloquy.xcodeproj/project.pbxproj (modified) (2 diffs)
- trunk/Controllers/MVFileTransferController.h (modified) (1 diff)
- trunk/Controllers/MVFileTransferController.m (modified) (16 diffs)
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
trunk/Chat Core/MVIRCFileTransfer.m
r3344 r3353 35 35 } 36 36 37 /*static void MVFileTransferClosed( FILE_DCC_REC *dcc ) {38 MVFileTransfer *self = [MVFileTransfer _transferForDCCFileRecord:dcc];39 if( ! self ) return;40 41 if( [self status] == MVFileTransferStoppedStatus ) {42 // nothing to do43 } else if( [self finalSize] != [self transfered] ) {44 NSDictionary *info = [[NSDictionary allocWithZone:nil] initWithObjectsAndKeys:@"The file transfer terminated unexpectedly.", NSLocalizedDescriptionKey, nil];45 NSError *error = [[NSError allocWithZone:nil] initWithDomain:MVFileTransferErrorDomain code:MVFileTransferUnexpectedlyEndedError userInfo:info];46 [self performSelectorOnMainThread:@selector( _postError: ) withObject:error waitUntilDone:NO];47 [error release];48 [info release];49 } else {50 [self _setStatus:MVFileTransferDoneStatus];51 NSNotification *note = [NSNotification notificationWithName:MVFileTransferFinishedNotification object:self];52 [[NSNotificationCenter defaultCenter] postNotificationOnMainThread:note];53 }54 }55 56 static void MVFileTransferErrorConnect( FILE_DCC_REC *dcc ) {57 MVFileTransfer *self = [MVFileTransfer _transferForDCCFileRecord:dcc];58 if( ! self ) return;59 60 [self performSelector:@selector( _destroying )];61 62 NSDictionary *info = [[NSDictionary allocWithZone:nil] initWithObjectsAndKeys:@"The file transfer connection could not be made.", NSLocalizedDescriptionKey, nil];63 NSError *error = [[NSError allocWithZone:nil] initWithDomain:MVFileTransferErrorDomain code:MVFileTransferConnectionError userInfo:info];64 [self performSelectorOnMainThread:@selector( _postError: ) withObject:error waitUntilDone:NO];65 [error release];66 [info release];67 }68 69 static void MVFileTransferErrorFileCreate( FILE_DCC_REC *dcc, char *filename ) {70 MVFileTransfer *self = [MVFileTransfer _transferForDCCFileRecord:dcc];71 if( ! self ) return;72 73 [self performSelector:@selector( _destroying )];74 75 NSDictionary *info = [[NSDictionary allocWithZone:nil] initWithObjectsAndKeys:@"The file %@ could not be created, please make sure you have write permissions in the %@ folder.", NSLocalizedDescriptionKey, nil];76 NSError *error = [[NSError allocWithZone:nil] initWithDomain:MVFileTransferErrorDomain code:MVFileTransferFileCreationError userInfo:info];77 [self performSelectorOnMainThread:@selector( _postError: ) withObject:error waitUntilDone:NO];78 [error release];79 [info release];80 }81 82 static void MVFileTransferErrorFileOpen( FILE_DCC_REC *dcc, char *filename, int errno ) {83 MVFileTransfer *self = [MVFileTransfer _transferForDCCFileRecord:dcc];84 if( ! self ) return;85 86 [self performSelector:@selector( _destroying )];87 88 NSError *ferror = [[NSError allocWithZone:nil] initWithDomain:NSPOSIXErrorDomain code:errno userInfo:nil];89 NSDictionary *info = [[NSDictionary allocWithZone:nil] initWithObjectsAndKeys:@"The file %@ could not be opened, please make sure you have read permissions for this file.", NSLocalizedDescriptionKey, ferror, @"NSUnderlyingErrorKey", nil];90 NSError *error = [[NSError allocWithZone:nil] initWithDomain:MVFileTransferErrorDomain code:MVFileTransferFileOpenError userInfo:info];91 [self performSelectorOnMainThread:@selector( _postError: ) withObject:error waitUntilDone:NO];92 [error release];93 [ferror release];94 [info release];95 }96 97 static void MVFileTransferErrorSendExists( FILE_DCC_REC *dcc, char *nick, char *filename ) {98 MVFileTransfer *self = [MVFileTransfer _transferForDCCFileRecord:dcc];99 if( ! self ) return;100 101 [self performSelector:@selector( _destroying )];102 103 NSDictionary *info = [[NSDictionary allocWithZone:nil] initWithObjectsAndKeys:@"The file %@ is already being offerend to %@.", NSLocalizedDescriptionKey, nil];104 NSError *error = [[NSError allocWithZone:nil] initWithDomain:MVFileTransferErrorDomain code:MVFileTransferAlreadyExistsError userInfo:info];105 [self performSelectorOnMainThread:@selector( _postError: ) withObject:error waitUntilDone:NO];106 [error release];107 [info release];108 } */109 110 37 @implementation MVIRCUploadFileTransfer 111 38 + (id) transferWithSourceFile:(NSString *) path toUser:(MVChatUser *) user passively:(BOOL) passive { … … 218 145 - (void) socket:(AsyncSocket *) sock didConnectToHost:(NSString *) host port:(UInt16) port { 219 146 [self _setStatus:MVFileTransferNormalStatus]; 147 [self _setStartDate:[NSDate date]]; 148 220 149 [[NSNotificationCenter defaultCenter] postNotificationOnMainThreadWithName:MVFileTransferStartedNotification object:self]; 221 150 … … 475 404 - (void) socket:(AsyncSocket *) sock didConnectToHost:(NSString *) host port:(UInt16) port { 476 405 [self _setStatus:MVFileTransferNormalStatus]; 406 [self _setStartDate:[NSDate date]]; 477 407 478 408 [[NSNotificationCenter defaultCenter] postNotificationOnMainThreadWithName:MVFileTransferStartedNotification object:self]; trunk/Colloquy.xcodeproj/project.pbxproj
r3350 r3353 1911 1911 isa = PBXProject; 1912 1912 buildConfigurationList = 1C041A700854E97700A5A5BA /* Build configuration list for PBXProject "Colloquy" */; 1913 compatibilityVersion = "Xcode 2.4"; 1913 1914 hasScannedForEncodings = 1; 1914 1915 knownRegions = ( … … 1960 1961 ); 1961 1962 projectRoot = ""; 1963 shouldCheckCompatibility = 1; 1962 1964 targets = ( 1963 1965 1CB2CCF5052DDC560094AAA4 /* Colloquy (Application) */, trunk/Controllers/MVFileTransferController.h
r3072 r3353 23 23 24 24 - (void) downloadFileAtURL:(NSURL *) url toLocalFile:(NSString *) path; 25 - (void) addFileTransfer:( id) transfer;25 - (void) addFileTransfer:(MVFileTransfer *) transfer; 26 26 27 27 - (IBAction) stopSelectedTransfer:(id) sender; trunk/Controllers/MVFileTransferController.m
r3346 r3353 42 42 val = (unsigned int) ( secs / (float) stop ); 43 43 use = ( val > 1 ? plural : desc ); 44 retval = [NSString stringWithFormat:@"% d%@", val, [use objectForKey:[NSNumber numberWithUnsignedInt:stop]]];44 retval = [NSString stringWithFormat:@"%u %@", val, [use objectForKey:[NSNumber numberWithUnsignedInt:stop]]]; 45 45 if( longFormat && i > 0 ) { 46 46 unsigned int rest = (unsigned int) ( (unsigned int) secs % stop ); … … 49 49 if( rest > 0 ) { 50 50 use = ( rest > 1 ? plural : desc ); 51 retval = [retval stringByAppendingFormat:@" % d%@", rest, [use objectForKey:[breaks objectAtIndex:i]]];51 retval = [retval stringByAppendingFormat:@" %u %@", rest, [use objectForKey:[breaks objectAtIndex:i]]]; 52 52 } 53 53 } … … 251 251 252 252 NSMutableDictionary *info = [NSMutableDictionary dictionary]; 253 [info setObject:[NSNumber numberWithUnsignedLong :0] forKey:@"transfered"];254 [info setObject:[NSNumber numberWith UnsignedInt:0] forKey:@"rate"];255 [info setObject:[NSNumber numberWithUnsignedLong :0] forKey:@"size"];253 [info setObject:[NSNumber numberWithUnsignedLongLong:0] forKey:@"transfered"]; 254 [info setObject:[NSNumber numberWithDouble:0.] forKey:@"rate"]; 255 [info setObject:[NSNumber numberWithUnsignedLongLong:0] forKey:@"size"]; 256 256 [info setObject:download forKey:@"controller"]; 257 257 [info setObject:url forKey:@"url"]; … … 266 266 } 267 267 268 - (void) addFileTransfer:( id) transfer {268 - (void) addFileTransfer:(MVFileTransfer *) transfer { 269 269 NSParameterAssert( transfer != nil ); 270 270 … … 272 272 NSMutableDictionary *info = nil; 273 273 while( ( info = [enumerator nextObject] ) ) 274 if( [[info objectForKey:@" transfer"] isEqualTo:transfer] )274 if( [[info objectForKey:@"controller"] isEqualTo:transfer] ) 275 275 return; 276 276 277 277 info = [NSMutableDictionary dictionary]; 278 [info setObject:[NSNumber numberWithUnsignedInt:0] forKey:@"rate"]; 279 [info setObject:[NSNumber numberWithUnsignedInt:[transfer status]] forKey:@"status"]; 278 [info setObject:transfer forKey:@"controller"]; 279 [info setObject:[NSNumber numberWithDouble:0.] forKey:@"rate"]; 280 [info setObject:[NSNumber numberWithUnsignedLong:[transfer status]] forKey:@"status"]; 280 281 [info setObject:[NSNumber numberWithUnsignedLongLong:[transfer finalSize]] forKey:@"size"]; 281 282 if( [transfer isDownload] ) [info setObject:[(MVDownloadFileTransfer *)transfer destination] forKey:@"path"]; 282 283 else if( [transfer isUpload] ) [info setObject:[(MVUploadFileTransfer *)transfer source] forKey:@"path"]; 283 [info setObject:transfer forKey:@"controller"];284 284 285 285 [_transferStorage addObject:info]; … … 296 296 info = [self _infoForTransferAtIndex:[currentFiles selectedRow]]; 297 297 [[info objectForKey:@"controller"] cancel]; 298 [info setObject:[NSNumber numberWithUnsigned Int:MVFileTransferStoppedStatus] forKey:@"status"];298 [info setObject:[NSNumber numberWithUnsignedLong:MVFileTransferStoppedStatus] forKey:@"status"]; 299 299 } 300 300 … … 330 330 331 331 - (IBAction) revealSelectedFile:(id) sender { 332 NSDictionary *info = nil;333 332 if( [currentFiles numberOfSelectedRows] == 1 ) { 334 info = [self _infoForTransferAtIndex:[currentFiles selectedRow]];333 NSDictionary *info = [self _infoForTransferAtIndex:[currentFiles selectedRow]]; 335 334 [[NSWorkspace sharedWorkspace] selectFile:[info objectForKey:@"path"] inFileViewerRootedAtPath:@""]; 336 335 } … … 344 343 NSMutableString *string = [NSMutableString string]; 345 344 id row = nil; 346 unsigned i = 0; 345 347 346 [[NSPasteboard generalPasteboard] declareTypes:[NSArray arrayWithObjects:NSFilenamesPboardType,NSStringPboardType,nil] owner:self]; 347 348 348 while( ( row = [enumerator nextObject] ) ) { 349 i = [row unsignedIntValue];349 unsigned i = [row unsignedIntValue]; 350 350 [array addObject:[[self _infoForTransferAtIndex:i] objectForKey:@"path"]]; 351 351 [string appendString:[[[self _infoForTransferAtIndex:i] objectForKey:@"path"] lastPathComponent]]; 352 352 if( ! [[[enumerator allObjects] lastObject] isEqual:row] ) [string appendString:@"\n"]; 353 353 } 354 354 355 [[NSPasteboard generalPasteboard] setPropertyList:array forType:NSFilenamesPboardType]; 355 356 [[NSPasteboard generalPasteboard] setString:string forType:NSStringPboardType]; … … 387 388 [cell setMainText:[[NSFileManager defaultManager] displayNameAtPath:path]]; 388 389 } else if( [[column identifier] isEqual:@"status"] ) { 389 id controller = [[self _infoForTransferAtIndex:row] objectForKey:@"controller"]; 390 MVFileTransferStatus status = [[[self _infoForTransferAtIndex:row] objectForKey:@"status"] unsignedLongValue]; 390 NSDictionary *info = [self _infoForTransferAtIndex:row]; 391 id controller = [info objectForKey:@"controller"]; 392 MVFileTransferStatus status = [[info objectForKey:@"status"] unsignedLongValue]; 391 393 NSString *imageName = @"pending"; 392 394 if( status == MVFileTransferErrorStatus ) imageName = @"error"; … … 531 533 while( ( info = [enumerator nextObject] ) ) { 532 534 if( [info objectForKey:@"controller"] == download ) { 533 [info setObject:[NSNumber numberWithUnsignedLong :0] forKey:@"transfered"];535 [info setObject:[NSNumber numberWithUnsignedLongLong:0] forKey:@"transfered"]; 534 536 535 537 unsigned long size = [response expectedContentLength]; … … 555 557 if( [info objectForKey:@"controller"] == download ) { 556 558 NSTimeInterval timeslice = [[info objectForKey:@"started"] timeIntervalSinceNow] * -1; 557 unsigned long long transfered = [[info objectForKey:@"transfered"] unsigned IntValue] + length;558 559 [info setObject:[NSNumber numberWithUnsigned Int:MVFileTransferNormalStatus] forKey:@"status"];560 [info setObject:[NSNumber numberWithUnsignedLong :transfered] forKey:@"transfered"];559 unsigned long long transfered = [[info objectForKey:@"transfered"] unsignedLongLongValue] + length; 560 561 [info setObject:[NSNumber numberWithUnsignedLong:MVFileTransferNormalStatus] forKey:@"status"]; 562 [info setObject:[NSNumber numberWithUnsignedLongLong:transfered] forKey:@"transfered"]; 561 563 562 564 if( transfered > [[info objectForKey:@"size"] unsignedLongLongValue] ) 563 [info setObject:[NSNumber numberWithUnsignedLong :transfered] forKey:@"size"];565 [info setObject:[NSNumber numberWithUnsignedLongLong:transfered] forKey:@"size"]; 564 566 565 567 if( transfered != [[info objectForKey:@"size"] unsignedLongLongValue] ) … … 587 589 while( ( info = [enumerator nextObject] ) ) { 588 590 if( [info objectForKey:@"controller"] == download ) { 589 [info setObject:[NSNumber numberWithUnsigned Int:MVFileTransferDoneStatus] forKey:@"status"];591 [info setObject:[NSNumber numberWithUnsignedLong:MVFileTransferDoneStatus] forKey:@"status"]; 590 592 591 593 [[NSWorkspace sharedWorkspace] noteFileSystemChanged:[info objectForKey:@"path"]]; … … 613 615 while( ( info = [enumerator nextObject] ) ) { 614 616 if( [info objectForKey:@"controller"] == download ) { 615 [info setObject:[NSNumber numberWithUnsigned Int:MVFileTransferErrorStatus] forKey:@"status"];617 [info setObject:[NSNumber numberWithUnsignedLong:MVFileTransferErrorStatus] forKey:@"status"]; 616 618 [currentFiles reloadData]; 617 619 break; … … 773 775 while( ( info = [enumerator nextObject] ) ) { 774 776 if( [info objectForKey:@"controller"] == download ) { 775 [info setObject:[NSNumber numberWithUnsigned Int:MVFileTransferStoppedStatus] forKey:@"status"];777 [info setObject:[NSNumber numberWithUnsignedLong:MVFileTransferStoppedStatus] forKey:@"status"]; 776 778 break; 777 779 } … … 806 808 while( ( info = [enumerator nextObject] ) ) { 807 809 id controller = [info objectForKey:@"controller"]; 808 if( [controller isKindOfClass:[MVUploadFileTransfer class]] ) { 809 totalSizeUp += [controller finalSize]; 810 totalTransferedUp += [controller transfered]; 811 812 NSTimeInterval timeslice = [[controller startDate] timeIntervalSinceNow] * -1; 813 if( [controller status] == MVFileTransferNormalStatus && [controller transfered] != [controller finalSize] ) 814 [info setObject:[NSNumber numberWithDouble:( ( [controller transfered] - [(MVUploadFileTransfer *)controller startOffset] ) / timeslice )] forKey:@"rate"]; 815 816 [info setObject:[NSNumber numberWithUnsignedInt:[controller status]] forKey:@"status"]; 817 818 upRate += [[info objectForKey:@"rate"] doubleValue]; 819 upCount++; 820 } else if( [controller isKindOfClass:[MVDownloadFileTransfer class]] ) { 821 totalSizeDown += [controller finalSize]; 822 totalTransferedDown += [controller transfered]; 823 824 NSTimeInterval timeslice = [[controller startDate] timeIntervalSinceNow] * -1; 825 if( [controller status] == MVFileTransferNormalStatus && [controller transfered] != [controller finalSize] ) 826 [info setObject:[NSNumber numberWithDouble:( ( [controller transfered] - [(MVDownloadFileTransfer *)controller startOffset] ) / timeslice )] forKey:@"rate"]; 827 828 [info setObject:[NSNumber numberWithUnsignedInt:[controller status]] forKey:@"status"]; 829 830 downRate += [[info objectForKey:@"rate"] doubleValue]; 831 downCount++; 810 if( [controller isKindOfClass:[MVFileTransfer class]] ) { 811 MVFileTransfer *transferController = controller; 812 NSTimeInterval timeslice = [[transferController startDate] timeIntervalSinceNow] * -1; 813 double currentRate = 0.; 814 815 if( [transferController status] == MVFileTransferNormalStatus && [transferController transfered] != [transferController finalSize] ) { 816 currentRate = ( ( [transferController transfered] - [transferController startOffset] ) / timeslice ); 817 [info setObject:[NSNumber numberWithDouble:currentRate] forKey:@"rate"]; 818 } else currentRate = [[info valueForKey:@"rate"] doubleValue]; 819 820 [info setObject:[NSNumber numberWithUnsignedLong:[transferController status]] forKey:@"status"]; 821 822 if( [transferController isUpload] ) { 823 totalSizeUp += [transferController finalSize]; 824 totalTransferedUp += [transferController transfered]; 825 upRate += currentRate; 826 upCount++; 827 } else { 828 totalSizeDown += [transferController finalSize]; 829 totalTransferedDown += [transferController transfered]; 830 downRate += currentRate; 831 downCount++; 832 } 832 833 } else if( [controller isKindOfClass:[WebDownload class]] ) { 833 834 totalSizeDown += [[info objectForKey:@"size"] unsignedLongValue]; … … 904 905 if( [[info objectForKey:@"controller"] isKindOfClass:[MVFileTransfer class]] ) { 905 906 MVFileTransfer *transfer = [info objectForKey:@"controller"]; 906 [info setObject:[NSNumber numberWithUnsignedLongLong:[transfer transfered]] forKey:@"transfered"]; 907 [info setObject:[NSNumber numberWithUnsignedInt:[transfer status]] forKey:@"status"]; 907 [info setObject:[NSNumber numberWithUnsignedLong:[transfer status]] forKey:@"status"]; 908 908 [info setObject:[transfer user] forKey:@"user"]; 909 909 }
