From 755e722cc87f8564537b766e46afeea2a459b53a Mon Sep 17 00:00:00 2001 From: Seamus Campbell Date: Wed, 4 Mar 2015 10:29:14 -0800 Subject: [PATCH] Fix double-escaping of input URI. Prefer supplied UTI if available. Modernize Objective-C usage. --- src/ios/FileOpener2.m | 64 ++++++++++++++++++------------------------- 1 file changed, 27 insertions(+), 37 deletions(-) diff --git a/src/ios/FileOpener2.m b/src/ios/FileOpener2.m index 1d4a306..2b32e6d 100644 --- a/src/ios/FileOpener2.m +++ b/src/ios/FileOpener2.m @@ -27,57 +27,47 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. #import @implementation FileOpener2 -@synthesize controller = docController; - (void) open: (CDVInvokedUrlCommand*)command { - NSString *path = [[command.arguments objectAtIndex:0] stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]; - //NSString *uti = [command.arguments objectAtIndex:1]; + NSString *path = [command.arguments objectAtIndex:0]; + NSString *uti = nil; + if (command.arguments.count > 1) { + uti = [command.arguments objectAtIndex:1]; + } CDVViewController* cont = (CDVViewController*)[ super viewController ]; - NSArray *dotParts = [path componentsSeparatedByString:@"."]; - NSString *fileExt = [dotParts lastObject]; - //NSString *fileExt = [[dotparts lastObject] stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding]; + if (!uti) { + NSArray *dotParts = [path componentsSeparatedByString:@"."]; + NSString *fileExt = [dotParts lastObject]; - NSString *uti = (__bridge NSString *)UTTypeCreatePreferredIdentifierForTag(kUTTagClassFilenameExtension, (__bridge CFStringRef)fileExt, NULL); + NSString *uti = (__bridge NSString *)UTTypeCreatePreferredIdentifierForTag(kUTTagClassFilenameExtension, (__bridge CFStringRef)fileExt, NULL); + } - dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ + dispatch_async(dispatch_get_main_queue(), ^{ //NSLog(@"path %@, uti:%@", path, uti); - NSURL *fileURL = nil; - - //fileURL = [NSURL URLWithString:path]; - fileURL = [NSURL fileURLWithPath:path]; + NSURL *fileURL = [NSURL fileURLWithPath:path]; localFile = fileURL.path; - dispatch_async(dispatch_get_main_queue(), ^{ + self.controller = [UIDocumentInteractionController interactionControllerWithURL:fileURL]; + self.controller.delegate = self; + self.controller.UTI = uti; - docController = [UIDocumentInteractionController interactionControllerWithURL:fileURL]; - docController.delegate = self; - docController.UTI = uti; + CGRect rect = CGRectMake(0, 0, 1000.0f, 150.0f); + CDVPluginResult* pluginResult = nil; + BOOL wasOpened = [docController presentOptionsMenuFromRect:rect inView:cont.view animated:NO]; - CGRect rect = CGRectMake(0, 0, 1000.0f, 150.0f); - CDVPluginResult* pluginResult = nil; - BOOL wasOpened = [docController presentOptionsMenuFromRect:rect inView:cont.view animated:NO]; - //presentOptionsMenuFromRect - //presentOpenInMenuFromRect - - if(wasOpened) { - pluginResult = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK messageAsString: @""]; - //NSLog(@"Success"); - } else { - NSDictionary *jsonObj = [ [NSDictionary alloc] - initWithObjectsAndKeys : - @"9", @"status", - @"Could not handle UTI", @"message", - nil - ]; - pluginResult = [CDVPluginResult resultWithStatus:CDVCommandStatus_ERROR messageAsDictionary:jsonObj]; - //NSLog(@"Could not handle UTI"); - } - [self.commandDelegate sendPluginResult:pluginResult callbackId:command.callbackId]; - }); + if(wasOpened) { + pluginResult = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK messageAsString: @""]; + } else { + NSDictionary *jsonObj = @{@"status" : @"9", + @"message" : @"Could not handle UTI"}; + pluginResult = [CDVPluginResult resultWithStatus:CDVCommandStatus_ERROR + messageAsDictionary:jsonObj]; + } + [self.commandDelegate sendPluginResult:pluginResult callbackId:command.callbackId]; }); }