ios: Move blocking operations to another thread

This commit is contained in:
Vishesh Handa
2019-06-03 18:57:51 +02:00
parent 3e563c3d0e
commit 1389fba579

View File

@ -42,92 +42,24 @@ NSString* GetDirectoryOfType(NSSearchPathDirectory dir) {
NSArray *sshPublicComponents = [NSArray arrayWithObjects:filesDir, @"ssh", @"id_rsa.pub", nil]; NSArray *sshPublicComponents = [NSArray arrayWithObjects:filesDir, @"ssh", @"id_rsa.pub", nil];
NSString *sshPublicKeyString = [NSString pathWithComponents:sshPublicComponents]; NSString *sshPublicKeyString = [NSString pathWithComponents:sshPublicComponents];
const char *sshPublicKeyPath = [sshPublicKeyString UTF8String];
NSArray *sshPrivateComponents = [NSArray arrayWithObjects:filesDir, @"ssh", @"id_rsa", nil];
NSString *sshPrivateKeyString = [NSString pathWithComponents:sshPrivateComponents];
const char *sshPrivateKeyPath = [sshPrivateKeyString UTF8String];
if ([@"getBaseDirectory" isEqualToString:method]) { if ([@"getBaseDirectory" isEqualToString:method]) {
result(filesDir); result(filesDir);
} }
else if ([@"gitClone" isEqualToString:method]) { else if ([@"gitClone" isEqualToString:method]) {
NSString *cloneUrl = arguments[@"cloneUrl"]; dispatch_async(dispatch_get_main_queue(), ^{
NSString *folderName = arguments[@"folderName"]; [self handleMethodCallAsync:call result:result];
});
if (cloneUrl == nil || [cloneUrl length] == 0) {
result([FlutterError errorWithCode:@"InvalidParams"
message:@"Invalid cloneUrl" details:nil]);
return;
}
if (folderName == nil || [folderName length] == 0) {
result([FlutterError errorWithCode:@"InvalidParams"
message:@"Invalid folderName" details:nil]);
return;
}
gj_set_ssh_keys_paths((char*) sshPublicKeyPath, (char*) sshPrivateKeyPath, "");
NSArray *components = [NSArray arrayWithObjects:filesDir, folderName, nil];
NSString* dirPath = [NSString pathWithComponents:components];
int err = gj_git_clone([cloneUrl UTF8String], [dirPath UTF8String]);
if (!handleError(result, err)) {
result(@YES);
return;
}
} }
else if ([@"gitPull" isEqualToString:method]) { else if ([@"gitPull" isEqualToString:method]) {
NSString *folderName = arguments[@"folderName"]; dispatch_async(dispatch_get_main_queue(), ^{
NSString *authorName = arguments[@"authorName"]; [self handleMethodCallAsync:call result:result];
NSString *authorEmail = arguments[@"authorEmail"]; });
if (folderName == nil || [folderName length] == 0) {
result([FlutterError errorWithCode:@"InvalidParams"
message:@"Invalid folderName" details:nil]);
return;
}
if (authorName == nil || [authorName length] == 0) {
result([FlutterError errorWithCode:@"InvalidParams"
message:@"Invalid authorName" details:nil]);
return;
}
if (authorEmail == nil || [authorEmail length] == 0) {
result([FlutterError errorWithCode:@"InvalidParams"
message:@"Invalid authorEmail" details:nil]);
return;
}
gj_set_ssh_keys_paths((char*) sshPublicKeyPath, (char*) sshPrivateKeyPath, "");
NSArray *components = [NSArray arrayWithObjects:filesDir, folderName, nil];
NSString* dirPath = [NSString pathWithComponents:components];
int err = gj_git_pull([dirPath UTF8String], [authorName UTF8String], [authorEmail UTF8String]);
if (!handleError(result, err)) {
result(@YES);
return;
}
} }
else if ([@"gitPush" isEqualToString:method]) { else if ([@"gitPush" isEqualToString:method]) {
NSString *folderName = arguments[@"folderName"]; dispatch_async(dispatch_get_main_queue(), ^{
[self handleMethodCallAsync:call result:result];
if (folderName == nil || [folderName length] == 0) { });
result([FlutterError errorWithCode:@"InvalidParams"
message:@"Invalid folderName" details:nil]);
return;
}
gj_set_ssh_keys_paths((char*) sshPublicKeyPath, (char*) sshPrivateKeyPath, "");
NSArray *components = [NSArray arrayWithObjects:filesDir, folderName, nil];
NSString* dirPath = [NSString pathWithComponents:components];
int err = gj_git_push([dirPath UTF8String]);
if (!handleError(result, err)) {
result(@YES);
return;
}
} }
else if ([@"gitAdd" isEqualToString:method]) { else if ([@"gitAdd" isEqualToString:method]) {
NSString *folderName = arguments[@"folderName"]; NSString *folderName = arguments[@"folderName"];
@ -252,49 +184,9 @@ NSString* GetDirectoryOfType(NSSearchPathDirectory dir) {
} }
} }
else if ([@"generateSSHKeys" isEqualToString:method]) { else if ([@"generateSSHKeys" isEqualToString:method]) {
NSString *comment = arguments[@"comment"]; dispatch_async(dispatch_get_main_queue(), ^{
[self handleMethodCallAsync:call result:result];
if (comment == nil || [comment length] == 0) { });
NSLog(@"generateSSHKeys: Using default comment");
comment = @"Generated on iOS";
}
NSArray *sshComponents = [NSArray arrayWithObjects:filesDir, @"ssh", nil];
NSString* sshDirPath = [NSString pathWithComponents:sshComponents];
NSError *error = nil;
[[NSFileManager defaultManager] createDirectoryAtPath:sshDirPath
withIntermediateDirectories:YES
attributes:nil
error:&error];
if (error != nil) {
NSLog(@"Create directory error: %@", error);
result([FlutterError errorWithCode:@"FAILED"
message:[error localizedDescription] details:nil]);
return;
}
int err = gj_generate_ssh_keys(sshPrivateKeyPath, sshPublicKeyPath, [comment UTF8String]);
if (handleError(result, err)) {
return;
}
NSString *content = [NSString stringWithContentsOfFile:sshPublicKeyString
encoding:NSUTF8StringEncoding error:&error];
if (error != nil) {
result([FlutterError errorWithCode:@"FAILED"
message:[error localizedDescription] details:nil]);
return;
}
if (content == nil || [content length] == 0) {
result([FlutterError errorWithCode:@"FAILED"
message:@"PublicKey File not found" details:nil]);
return;
}
result(content);
} }
else if ([@"getSSHPublicKey" isEqualToString:method]) { else if ([@"getSSHPublicKey" isEqualToString:method]) {
NSError *error = nil; NSError *error = nil;
@ -398,4 +290,154 @@ bool handleError(FlutterResult result, int err) {
return GetDirectoryOfType(NSDocumentDirectory); return GetDirectoryOfType(NSDocumentDirectory);
} }
- (void)handleMethodCallAsync:(FlutterMethodCall *)call result:(FlutterResult)result {
NSString *method = [call method];
NSDictionary *arguments = [call arguments];
NSLog(@"AsyncCalled %@", method);
if (arguments != nil) {
for (NSString *key in [arguments allKeys]) {
if ([key isEqualToString:@"privateKey"]) {
NSLog(@". privateKey: <hidden>");
continue;
}
NSLog(@". %@: %@", key, [arguments objectForKey:key]);
}
}
NSString* filesDir = [self getApplicationDocumentsDirectory];
NSArray *sshPublicComponents = [NSArray arrayWithObjects:filesDir, @"ssh", @"id_rsa.pub", nil];
NSString *sshPublicKeyString = [NSString pathWithComponents:sshPublicComponents];
const char *sshPublicKeyPath = [sshPublicKeyString UTF8String];
NSArray *sshPrivateComponents = [NSArray arrayWithObjects:filesDir, @"ssh", @"id_rsa", nil];
NSString *sshPrivateKeyString = [NSString pathWithComponents:sshPrivateComponents];
const char *sshPrivateKeyPath = [sshPrivateKeyString UTF8String];
if ([@"gitClone" isEqualToString:method]) {
NSString *cloneUrl = arguments[@"cloneUrl"];
NSString *folderName = arguments[@"folderName"];
if (cloneUrl == nil || [cloneUrl length] == 0) {
result([FlutterError errorWithCode:@"InvalidParams"
message:@"Invalid cloneUrl" details:nil]);
return;
}
if (folderName == nil || [folderName length] == 0) {
result([FlutterError errorWithCode:@"InvalidParams"
message:@"Invalid folderName" details:nil]);
return;
}
gj_set_ssh_keys_paths((char*) sshPublicKeyPath, (char*) sshPrivateKeyPath, "");
NSArray *components = [NSArray arrayWithObjects:filesDir, folderName, nil];
NSString* dirPath = [NSString pathWithComponents:components];
int err = gj_git_clone([cloneUrl UTF8String], [dirPath UTF8String]);
if (!handleError(result, err)) {
result(@YES);
return;
}
}
else if ([@"gitPull" isEqualToString:method]) {
NSString *folderName = arguments[@"folderName"];
NSString *authorName = arguments[@"authorName"];
NSString *authorEmail = arguments[@"authorEmail"];
if (folderName == nil || [folderName length] == 0) {
result([FlutterError errorWithCode:@"InvalidParams"
message:@"Invalid folderName" details:nil]);
return;
}
if (authorName == nil || [authorName length] == 0) {
result([FlutterError errorWithCode:@"InvalidParams"
message:@"Invalid authorName" details:nil]);
return;
}
if (authorEmail == nil || [authorEmail length] == 0) {
result([FlutterError errorWithCode:@"InvalidParams"
message:@"Invalid authorEmail" details:nil]);
return;
}
gj_set_ssh_keys_paths((char*) sshPublicKeyPath, (char*) sshPrivateKeyPath, "");
NSArray *components = [NSArray arrayWithObjects:filesDir, folderName, nil];
NSString* dirPath = [NSString pathWithComponents:components];
int err = gj_git_pull([dirPath UTF8String], [authorName UTF8String], [authorEmail UTF8String]);
if (!handleError(result, err)) {
result(@YES);
return;
}
}
else if ([@"gitPush" isEqualToString:method]) {
NSString *folderName = arguments[@"folderName"];
if (folderName == nil || [folderName length] == 0) {
result([FlutterError errorWithCode:@"InvalidParams"
message:@"Invalid folderName" details:nil]);
return;
}
gj_set_ssh_keys_paths((char*) sshPublicKeyPath, (char*) sshPrivateKeyPath, "");
NSArray *components = [NSArray arrayWithObjects:filesDir, folderName, nil];
NSString* dirPath = [NSString pathWithComponents:components];
int err = gj_git_push([dirPath UTF8String]);
if (!handleError(result, err)) {
result(@YES);
return;
}
}
else if ([@"generateSSHKeys" isEqualToString:method]) {
NSString *comment = arguments[@"comment"];
if (comment == nil || [comment length] == 0) {
NSLog(@"generateSSHKeys: Using default comment");
comment = @"Generated on iOS";
}
NSArray *sshComponents = [NSArray arrayWithObjects:filesDir, @"ssh", nil];
NSString* sshDirPath = [NSString pathWithComponents:sshComponents];
NSError *error = nil;
[[NSFileManager defaultManager] createDirectoryAtPath:sshDirPath
withIntermediateDirectories:YES
attributes:nil
error:&error];
if (error != nil) {
NSLog(@"Create directory error: %@", error);
result([FlutterError errorWithCode:@"FAILED"
message:[error localizedDescription] details:nil]);
return;
}
int err = gj_generate_ssh_keys(sshPrivateKeyPath, sshPublicKeyPath, [comment UTF8String]);
if (handleError(result, err)) {
return;
}
NSString *content = [NSString stringWithContentsOfFile:sshPublicKeyString
encoding:NSUTF8StringEncoding error:&error];
if (error != nil) {
result([FlutterError errorWithCode:@"FAILED"
message:[error localizedDescription] details:nil]);
return;
}
if (content == nil || [content length] == 0) {
result([FlutterError errorWithCode:@"FAILED"
message:@"PublicKey File not found" details:nil]);
return;
}
result(content);
}
}
@end @end