Changeset 3353

Show
Ignore:
Timestamp:
09/06/06 21:45:15 (2 years ago)
Author:
timothy
Message:

Fixed the grossly erroneous file transfer rate. #600

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • trunk/Chat Core/MVIRCFileTransfer.m

    r3344 r3353  
    3535} 
    3636 
    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 do 
    43         } 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  
    11037@implementation MVIRCUploadFileTransfer 
    11138+ (id) transferWithSourceFile:(NSString *) path toUser:(MVChatUser *) user passively:(BOOL) passive { 
     
    218145- (void) socket:(AsyncSocket *) sock didConnectToHost:(NSString *) host port:(UInt16) port { 
    219146        [self _setStatus:MVFileTransferNormalStatus]; 
     147        [self _setStartDate:[NSDate date]]; 
     148 
    220149        [[NSNotificationCenter defaultCenter] postNotificationOnMainThreadWithName:MVFileTransferStartedNotification object:self]; 
    221150 
     
    475404- (void) socket:(AsyncSocket *) sock didConnectToHost:(NSString *) host port:(UInt16) port { 
    476405        [self _setStatus:MVFileTransferNormalStatus]; 
     406        [self _setStartDate:[NSDate date]]; 
    477407 
    478408        [[NSNotificationCenter defaultCenter] postNotificationOnMainThreadWithName:MVFileTransferStartedNotification object:self]; 
  • trunk/Colloquy.xcodeproj/project.pbxproj

    r3350 r3353  
    19111911                        isa = PBXProject; 
    19121912                        buildConfigurationList = 1C041A700854E97700A5A5BA /* Build configuration list for PBXProject "Colloquy" */; 
     1913                        compatibilityVersion = "Xcode 2.4"; 
    19131914                        hasScannedForEncodings = 1; 
    19141915                        knownRegions = ( 
     
    19601961                        ); 
    19611962                        projectRoot = ""; 
     1963                        shouldCheckCompatibility = 1; 
    19621964                        targets = ( 
    19631965                                1CB2CCF5052DDC560094AAA4 /* Colloquy (Application) */, 
  • trunk/Controllers/MVFileTransferController.h

    r3072 r3353  
    2323 
    2424- (void) downloadFileAtURL:(NSURL *) url toLocalFile:(NSString *) path; 
    25 - (void) addFileTransfer:(id) transfer; 
     25- (void) addFileTransfer:(MVFileTransfer *) transfer; 
    2626 
    2727- (IBAction) stopSelectedTransfer:(id) sender; 
  • trunk/Controllers/MVFileTransferController.m

    r3346 r3353  
    4242        val = (unsigned int) ( secs / (float) stop ); 
    4343        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]]]; 
    4545        if( longFormat && i > 0 ) { 
    4646                unsigned int rest = (unsigned int) ( (unsigned int) secs % stop ); 
     
    4949                if( rest > 0 ) { 
    5050                        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]]]; 
    5252                } 
    5353        } 
     
    251251 
    252252        NSMutableDictionary *info = [NSMutableDictionary dictionary]; 
    253         [info setObject:[NSNumber numberWithUnsignedLong:0] forKey:@"transfered"]; 
    254         [info setObject:[NSNumber numberWithUnsignedInt: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"]; 
    256256        [info setObject:download forKey:@"controller"]; 
    257257        [info setObject:url forKey:@"url"]; 
     
    266266} 
    267267 
    268 - (void) addFileTransfer:(id) transfer { 
     268- (void) addFileTransfer:(MVFileTransfer *) transfer { 
    269269        NSParameterAssert( transfer != nil ); 
    270270 
     
    272272        NSMutableDictionary *info = nil; 
    273273        while( ( info = [enumerator nextObject] ) ) 
    274                 if( [[info objectForKey:@"transfer"] isEqualTo:transfer] ) 
     274                if( [[info objectForKey:@"controller"] isEqualTo:transfer] ) 
    275275                        return; 
    276276 
    277277        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"]; 
    280281        [info setObject:[NSNumber numberWithUnsignedLongLong:[transfer finalSize]] forKey:@"size"]; 
    281282        if( [transfer isDownload] ) [info setObject:[(MVDownloadFileTransfer *)transfer destination] forKey:@"path"]; 
    282283        else if( [transfer isUpload] ) [info setObject:[(MVUploadFileTransfer *)transfer source] forKey:@"path"]; 
    283         [info setObject:transfer forKey:@"controller"]; 
    284284 
    285285        [_transferStorage addObject:info]; 
     
    296296                info = [self _infoForTransferAtIndex:[currentFiles selectedRow]]; 
    297297                [[info objectForKey:@"controller"] cancel]; 
    298                 [info setObject:[NSNumber numberWithUnsignedInt:MVFileTransferStoppedStatus] forKey:@"status"]; 
     298                [info setObject:[NSNumber numberWithUnsignedLong:MVFileTransferStoppedStatus] forKey:@"status"]; 
    299299        } 
    300300 
     
    330330 
    331331- (IBAction) revealSelectedFile:(id) sender { 
    332         NSDictionary *info = nil; 
    333332        if( [currentFiles numberOfSelectedRows] == 1 ) { 
    334                 info = [self _infoForTransferAtIndex:[currentFiles selectedRow]]; 
     333                NSDictionary *info = [self _infoForTransferAtIndex:[currentFiles selectedRow]]; 
    335334                [[NSWorkspace sharedWorkspace] selectFile:[info objectForKey:@"path"] inFileViewerRootedAtPath:@""]; 
    336335        } 
     
    344343        NSMutableString *string = [NSMutableString string]; 
    345344        id row = nil; 
    346         unsigned i = 0; 
     345 
    347346        [[NSPasteboard generalPasteboard] declareTypes:[NSArray arrayWithObjects:NSFilenamesPboardType,NSStringPboardType,nil] owner:self]; 
     347 
    348348        while( ( row = [enumerator nextObject] ) ) { 
    349                 i = [row unsignedIntValue]; 
     349                unsigned i = [row unsignedIntValue]; 
    350350                [array addObject:[[self _infoForTransferAtIndex:i] objectForKey:@"path"]]; 
    351351                [string appendString:[[[self _infoForTransferAtIndex:i] objectForKey:@"path"] lastPathComponent]]; 
    352352                if( ! [[[enumerator allObjects] lastObject] isEqual:row] ) [string appendString:@"\n"]; 
    353353        } 
     354 
    354355        [[NSPasteboard generalPasteboard] setPropertyList:array forType:NSFilenamesPboardType]; 
    355356        [[NSPasteboard generalPasteboard] setString:string forType:NSStringPboardType]; 
     
    387388                [cell setMainText:[[NSFileManager defaultManager] displayNameAtPath:path]]; 
    388389        } 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]; 
    391393                NSString *imageName = @"pending"; 
    392394                if( status == MVFileTransferErrorStatus ) imageName = @"error"; 
     
    531533        while( ( info = [enumerator nextObject] ) ) { 
    532534                if( [info objectForKey:@"controller"] == download ) { 
    533                         [info setObject:[NSNumber numberWithUnsignedLong:0] forKey:@"transfered"]; 
     535                        [info setObject:[NSNumber numberWithUnsignedLongLong:0] forKey:@"transfered"]; 
    534536 
    535537                        unsigned long size = [response expectedContentLength]; 
     
    555557                if( [info objectForKey:@"controller"] == download ) { 
    556558                        NSTimeInterval timeslice = [[info objectForKey:@"started"] timeIntervalSinceNow] * -1; 
    557                         unsigned long long transfered = [[info objectForKey:@"transfered"] unsignedIntValue] + length; 
    558  
    559                         [info setObject:[NSNumber numberWithUnsignedInt: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"]; 
    561563 
    562564                        if( transfered > [[info objectForKey:@"size"] unsignedLongLongValue] ) 
    563                                 [info setObject:[NSNumber numberWithUnsignedLong:transfered] forKey:@"size"]; 
     565                                [info setObject:[NSNumber numberWithUnsignedLongLong:transfered] forKey:@"size"]; 
    564566 
    565567                        if( transfered != [[info objectForKey:@"size"] unsignedLongLongValue] ) 
     
    587589        while( ( info = [enumerator nextObject] ) ) { 
    588590                if( [info objectForKey:@"controller"] == download ) { 
    589                         [info setObject:[NSNumber numberWithUnsignedInt:MVFileTransferDoneStatus] forKey:@"status"]; 
     591                        [info setObject:[NSNumber numberWithUnsignedLong:MVFileTransferDoneStatus] forKey:@"status"]; 
    590592 
    591593                        [[NSWorkspace sharedWorkspace] noteFileSystemChanged:[info objectForKey:@"path"]]; 
     
    613615        while( ( info = [enumerator nextObject] ) ) { 
    614616                if( [info objectForKey:@"controller"] == download ) { 
    615                         [info setObject:[NSNumber numberWithUnsignedInt:MVFileTransferErrorStatus] forKey:@"status"]; 
     617                        [info setObject:[NSNumber numberWithUnsignedLong:MVFileTransferErrorStatus] forKey:@"status"]; 
    616618                        [currentFiles reloadData]; 
    617619                        break; 
     
    773775                while( ( info = [enumerator nextObject] ) ) { 
    774776                        if( [info objectForKey:@"controller"] == download ) { 
    775                                 [info setObject:[NSNumber numberWithUnsignedInt:MVFileTransferStoppedStatus] forKey:@"status"]; 
     777                                [info setObject:[NSNumber numberWithUnsignedLong:MVFileTransferStoppedStatus] forKey:@"status"]; 
    776778                                break; 
    777779                        } 
     
    806808        while( ( info = [enumerator nextObject] ) ) { 
    807809                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                        } 
    832833                } else if( [controller isKindOfClass:[WebDownload class]] ) { 
    833834                        totalSizeDown += [[info objectForKey:@"size"] unsignedLongValue]; 
     
    904905        if( [[info objectForKey:@"controller"] isKindOfClass:[MVFileTransfer class]] ) { 
    905906                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"]; 
    908908                [info setObject:[transfer user] forKey:@"user"]; 
    909909        }