[CB-622] Progress events for downloads
Project: http://git-wip-us.apache.org/repos/asf/incubator-cordova-ios/repo Commit: http://git-wip-us.apache.org/repos/asf/incubator-cordova-ios/commit/31f894cf Tree: http://git-wip-us.apache.org/repos/asf/incubator-cordova-ios/tree/31f894cf Diff: http://git-wip-us.apache.org/repos/asf/incubator-cordova-ios/diff/31f894cf Branch: refs/heads/master Commit: 31f894cf5e6c546904cc036f98384078c9de3393 Parents: d1ff5a7 Author: Cory Thompson <coryjthomp...@gmail.com> Authored: Tue Sep 4 18:08:44 2012 +1000 Committer: Andrew Grieve <agri...@chromium.org> Committed: Thu Sep 20 22:35:11 2012 -0400 ---------------------------------------------------------------------- CordovaLib/Classes/CDVFileTransfer.h | 3 ++- CordovaLib/Classes/CDVFileTransfer.m | 24 +++++++++++++++++++----- 2 files changed, 21 insertions(+), 6 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-cordova-ios/blob/31f894cf/CordovaLib/Classes/CDVFileTransfer.h ---------------------------------------------------------------------- diff --git a/CordovaLib/Classes/CDVFileTransfer.h b/CordovaLib/Classes/CDVFileTransfer.h index 7ca96a3..d29d423 100755 --- a/CordovaLib/Classes/CDVFileTransfer.h +++ b/CordovaLib/Classes/CDVFileTransfer.h @@ -70,7 +70,8 @@ extern NSString* const kOptionsKeyCookie; @property (nonatomic, copy) NSString* source; @property (nonatomic, copy) NSString* target; @property (assign) int responseCode; // atomic -@property (nonatomic, assign) NSInteger bytesWritten; +@property (nonatomic, assign) NSInteger bytesTransfered; +@property (nonatomic, assign) NSInteger bytesExpected; @end; \ No newline at end of file http://git-wip-us.apache.org/repos/asf/incubator-cordova-ios/blob/31f894cf/CordovaLib/Classes/CDVFileTransfer.m ---------------------------------------------------------------------- diff --git a/CordovaLib/Classes/CDVFileTransfer.m b/CordovaLib/Classes/CDVFileTransfer.m index 3660486..055b66c 100755 --- a/CordovaLib/Classes/CDVFileTransfer.m +++ b/CordovaLib/Classes/CDVFileTransfer.m @@ -290,7 +290,7 @@ static CFIndex WriteDataToStream(NSData* data, CFWriteStreamRef stream) { [delegate.connection cancel]; [activeTransfers removeObjectForKey:objectId]; - CDVPlugin Result *result = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK messageAsDictionary: [self createFileTransferError:CONNECTION_ABORTED AndSource:delegate.source AndTarget:delegate.target]]; + CDVPluginResult *result = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK messageAsDictionary: [self createFileTransferError:CONNECTION_ABORTED AndSource:delegate.source AndTarget:delegate.target]]; [self writeJavascript:[result toErrorCallbackString:command.callbackId]]; @@ -380,7 +380,7 @@ static CFIndex WriteDataToStream(NSData* data, CFWriteStreamRef stream) { @implementation CDVFileTransferDelegate -@synthesize callbackId, connection, source, target, responseData, command, bytesWritten, direction, responseCode, objectId; +@synthesize callbackId, connection, source, target, responseData, command, bytesTransfered, bytesExpected, direction, responseCode, objectId; - (void)connectionDidFinishLoading:(NSURLConnection *)connection @@ -407,7 +407,7 @@ static CFIndex WriteDataToStream(NSData* data, CFWriteStreamRef stream) { if (uploadResponse != nil) { [uploadResult setObject: [uploadResponse stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding] forKey: @"response"]; } - [uploadResult setObject:[NSNumber numberWithInt: self.bytesWritten] forKey:@"bytesSent"]; + [uploadResult setObject:[NSNumber numberWithInt: self.bytesTransfered] forKey:@"bytesSent"]; [uploadResult setObject:[NSNumber numberWithInt:self.responseCode] forKey: @"responseCode"]; result = [CDVPluginResult resultWithStatus: CDVCommandStatus_OK messageAsDictionary: uploadResult]; } @@ -469,6 +469,7 @@ static CFIndex WriteDataToStream(NSData* data, CFWriteStreamRef stream) { { NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse *)response; self.responseCode = [httpResponse statusCode]; + self.bytesExpected = [response expectedContentLength]; } - (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error @@ -484,7 +485,20 @@ static CFIndex WriteDataToStream(NSData* data, CFWriteStreamRef stream) { - (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data { - [self.responseData appendData:data]; + self.bytesTransfered += data.length; + [self.responseData appendData:data]; + + BOOL lengthComputable = (self.bytesExpected != NSURLResponseUnknownLength); + NSMutableDictionary* downloadProgress = [NSMutableDictionary dictionaryWithCapacity:3]; + [downloadProgress setObject:[NSNumber numberWithBool: lengthComputable] forKey:@"lengthComputable"]; + [downloadProgress setObject:[NSNumber numberWithInt: self.bytesTransfered] forKey:@"loaded"]; + [downloadProgress setObject:[NSNumber numberWithInt: self.bytesExpected] forKey:@"total"]; + + CDVPluginResult* result = [CDVPluginResult resultWithStatus: CDVCommandStatus_OK messageAsDictionary: downloadProgress ]; + [result setKeepCallbackAsBool:true]; + [self.command writeJavascript:[result toSuccessCallbackString: callbackId ]]; + + } - (void)connection:(NSURLConnection *)connection didSendBodyData:(NSInteger)bytesWritten totalBytesWritten:(NSInteger)totalBytesWritten totalBytesExpectedToWrite:(NSInteger)totalBytesExpectedToWrite { @@ -497,7 +511,7 @@ static CFIndex WriteDataToStream(NSData* data, CFWriteStreamRef stream) { [result setKeepCallbackAsBool:true]; [self.command writeJavascript:[result toSuccessCallbackString: callbackId ]]; - self.bytesWritten = totalBytesWritten; + self.bytesTransfered = totalBytesWritten; } /* TESTING ONLY CODE // use ONLY for testing with self signed certificates