From 3cf5e5a97afe8fc7877b528cf19130bef0d68bad Mon Sep 17 00:00:00 2001 From: Jules Laplace Date: Thu, 10 Sep 2020 14:35:21 +0200 Subject: build the app --- .../src/ios/NSString+SSURLEncoding.h | 5 ++ .../src/ios/NSString+SSURLEncoding.m | 30 ++++++++ .../src/ios/NSString+URLEncoding.h | 5 -- .../src/ios/NSString+URLEncoding.m | 30 -------- .../src/ios/SocialSharing.m | 80 ++++++++++++++++------ 5 files changed, 93 insertions(+), 57 deletions(-) create mode 100644 StoneIsland/plugins/cordova-plugin-x-socialsharing/src/ios/NSString+SSURLEncoding.h create mode 100644 StoneIsland/plugins/cordova-plugin-x-socialsharing/src/ios/NSString+SSURLEncoding.m delete mode 100644 StoneIsland/plugins/cordova-plugin-x-socialsharing/src/ios/NSString+URLEncoding.h delete mode 100644 StoneIsland/plugins/cordova-plugin-x-socialsharing/src/ios/NSString+URLEncoding.m (limited to 'StoneIsland/plugins/cordova-plugin-x-socialsharing/src/ios') diff --git a/StoneIsland/plugins/cordova-plugin-x-socialsharing/src/ios/NSString+SSURLEncoding.h b/StoneIsland/plugins/cordova-plugin-x-socialsharing/src/ios/NSString+SSURLEncoding.h new file mode 100644 index 00000000..71447b60 --- /dev/null +++ b/StoneIsland/plugins/cordova-plugin-x-socialsharing/src/ios/NSString+SSURLEncoding.h @@ -0,0 +1,5 @@ +#import + +@interface NSString (SSURLEncoding) +@property (readonly) NSString *URLEncodedString; +@end diff --git a/StoneIsland/plugins/cordova-plugin-x-socialsharing/src/ios/NSString+SSURLEncoding.m b/StoneIsland/plugins/cordova-plugin-x-socialsharing/src/ios/NSString+SSURLEncoding.m new file mode 100644 index 00000000..c8e746d3 --- /dev/null +++ b/StoneIsland/plugins/cordova-plugin-x-socialsharing/src/ios/NSString+SSURLEncoding.m @@ -0,0 +1,30 @@ +#import "NSString+SSURLEncoding.h" + +@implementation NSString (SSURLEncoding) +- (NSString*)URLEncodedString +{ + NSString* result = (NSString *)CFBridgingRelease( + CFURLCreateStringByAddingPercentEscapes( + kCFAllocatorDefault, + (CFStringRef)self, + CFSTR("#%"), // don't escape these + NULL, // allow escaping these + kCFStringEncodingUTF8 + ) + ); + + // we may have a URL with more than one '#' now - which iOS doesn't allow, so escape all but the first one + NSArray *parts = [result componentsSeparatedByString:@"#"]; + NSString *finalResult = parts[0]; + for (int i=1; i - -@interface NSString (URLEncoding) -@property (readonly) NSString *URLEncodedString; -@end diff --git a/StoneIsland/plugins/cordova-plugin-x-socialsharing/src/ios/NSString+URLEncoding.m b/StoneIsland/plugins/cordova-plugin-x-socialsharing/src/ios/NSString+URLEncoding.m deleted file mode 100644 index b737626c..00000000 --- a/StoneIsland/plugins/cordova-plugin-x-socialsharing/src/ios/NSString+URLEncoding.m +++ /dev/null @@ -1,30 +0,0 @@ -#import "NSString+URLEncoding.h" - -@implementation NSString (URLEncoding) -- (NSString*)URLEncodedString -{ - NSString* result = (NSString *)CFBridgingRelease( - CFURLCreateStringByAddingPercentEscapes( - kCFAllocatorDefault, - (CFStringRef)self, - CFSTR("#%"), // don't escape these - NULL, // allow escaping these - kCFStringEncodingUTF8 - ) - ); - - // we may have a URL with more than one '#' now - which iOS doesn't allow, so escape all but the first one - NSArray *parts = [result componentsSeparatedByString:@"#"]; - NSString *finalResult = parts[0]; - for (int i=1; i #import #import @@ -137,7 +137,7 @@ static NSString *const kShareOptionUrl = @"url"; #pragma GCC diagnostic ignored "-Wdeprecated-declarations" [activityVC setCompletionHandler:^(NSString *activityType, BOOL completed) { [self cleanupStoredFiles]; - NSDictionary * result = @{@"completed":@(completed), @"app":activityType}; + NSDictionary * result = @{@"completed":@(completed), @"app":activityType == nil ? @"" : activityType}; CDVPluginResult * pluginResult = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK messageAsDictionary:result]; [self.commandDelegate sendPluginResult:pluginResult callbackId:command.callbackId]; }]; @@ -361,21 +361,43 @@ static NSString *const kShareOptionUrl = @"url"; NSURL *file = [self getFile:path]; NSData* data = [fileManager contentsAtPath:file.path]; + if (!data) { + CDVPluginResult * pluginResult = [CDVPluginResult resultWithStatus:CDVCommandStatus_ERROR messageAsString:@"invalid attachment"]; + [self.commandDelegate sendPluginResult:pluginResult callbackId:command.callbackId]; + return; + } + NSString* fileName; NSString* mimeType; NSString* basename = [self getBasenameFromAttachmentPath:path]; - if ([basename hasPrefix:@"data:"]) { - mimeType = (NSString*)[[[basename substringFromIndex:5] componentsSeparatedByString: @";"] objectAtIndex:0]; - fileName = @"attachment."; - fileName = [fileName stringByAppendingString:(NSString*)[[mimeType componentsSeparatedByString: @"/"] lastObject]]; - NSString *base64content = (NSString*)[[basename componentsSeparatedByString: @","] lastObject]; - data = [SocialSharing dataFromBase64String:base64content]; - } else { - fileName = [basename pathComponents].lastObject; - mimeType = [self getMimeTypeFromFileExtension:[basename pathExtension]]; - } - [self.globalMailComposer addAttachmentData:data mimeType:mimeType fileName:fileName]; + //Find data anywhere in string + NSRange rangeData = [basename rangeOfString:@"data:"]; + if (rangeData.location == NSNotFound) + { + fileName = [basename pathComponents].lastObject; + mimeType = [self getMimeTypeFromFileExtension:[basename pathExtension]]; + } + else + { + mimeType = (NSString*)[[[basename substringFromIndex:rangeData.location+rangeData.length] componentsSeparatedByString: @";"] objectAtIndex:0]; + + //Find df anywhere in string + NSRange rangeDF = [basename rangeOfString:@"df:"]; + //If not found fallback to default name + if (rangeDF.location == NSNotFound) { + fileName = @"attachment."; + fileName = [fileName stringByAppendingString:(NSString*)[[mimeType componentsSeparatedByString: @"/"] lastObject]]; + } else { + //Found, apply name + fileName = (NSString*)[[[basename substringFromIndex:rangeDF.location+rangeDF.length] componentsSeparatedByString: @";"] objectAtIndex:0]; + } + + + NSString *base64content = (NSString*)[[basename componentsSeparatedByString: @","] lastObject]; + data = [SocialSharing dataFromBase64String:base64content]; + } + [self.globalMailComposer addAttachmentData:data mimeType:mimeType fileName:fileName]; } } @@ -479,7 +501,7 @@ static NSString *const kShareOptionUrl = @"url"; _command = command; [self.commandDelegate runInBackground:^{ picker.modalTransitionStyle = UIModalTransitionStyleCrossDissolve; - [[self getTopMostViewController] presentViewController:picker animated:YES completion:nil]; + [[self getTopMostViewController] presentViewController:picker animated:NO completion:nil]; }]; } else { CDVPluginResult * pluginResult = [CDVPluginResult resultWithStatus:CDVCommandStatus_ERROR messageAsString:@"not available"]; @@ -694,6 +716,7 @@ static NSString *const kShareOptionUrl = @"url"; -(NSURL*)getFile: (NSString *)fileName { NSURL *file = nil; if (fileName != (id)[NSNull null]) { + NSRange rangeData = [fileName rangeOfString:@"data:"]; if ([fileName hasPrefix:@"http"]) { NSURL *url = [NSURL URLWithString:fileName]; NSData *fileData = [NSData dataWithContentsOfURL:url]; @@ -706,14 +729,27 @@ static NSString *const kShareOptionUrl = @"url"; } else if ([fileName hasPrefix:@"file://"]) { // stripping the first 6 chars, because the path should start with / instead of file:// file = [NSURL fileURLWithPath:[fileName substringFromIndex:6]]; - } else if ([fileName hasPrefix:@"data:"]) { - // using a base64 encoded string - // extract some info from the 'fileName', which is for example: data:text/calendar;base64, - NSString *fileType = (NSString*)[[[fileName substringFromIndex:5] componentsSeparatedByString: @";"] objectAtIndex:0]; - fileType = (NSString*)[[fileType componentsSeparatedByString: @"/"] lastObject]; - NSString *base64content = (NSString*)[[fileName componentsSeparatedByString: @","] lastObject]; - NSData *fileData = [SocialSharing dataFromBase64String:base64content]; - file = [NSURL fileURLWithPath:[self storeInFile:[NSString stringWithFormat:@"%@.%@", @"file", fileType] fileData:fileData]]; + } else if (rangeData.location != NSNotFound ){ + //If found "data:" + NSString *fileType = (NSString*)[[[fileName substringFromIndex:rangeData.location+rangeData.length] componentsSeparatedByString: @";"] objectAtIndex:0]; + + NSString* attachmentName; + //Find df anywhere in string + NSRange rangeDF = [fileName rangeOfString:@"df:"]; + //If not found fallback to default name + if (rangeDF.location == NSNotFound) { + attachmentName = @"attachment."; + attachmentName = [attachmentName stringByAppendingString:(NSString*)[[fileType componentsSeparatedByString: @"/"] lastObject]]; + } else { + //Found, apply name + attachmentName = (NSString*)[[[fileName substringFromIndex:rangeDF.location+rangeDF.length] componentsSeparatedByString: @";"] objectAtIndex:0]; + } + + + NSString *base64content = (NSString*)[[fileName componentsSeparatedByString: @","] lastObject]; + NSData* data = [SocialSharing dataFromBase64String:base64content]; + file = [NSURL fileURLWithPath:[self storeInFile:attachmentName fileData:data]]; + } else { // assume anywhere else, on the local filesystem file = [NSURL fileURLWithPath:fileName]; -- cgit v1.2.3-70-g09d2