From f8f26bfb4011c9977655e601e396f36b4a3159a2 Mon Sep 17 00:00:00 2001 From: Riley Testut Date: Thu, 3 Dec 2020 14:52:21 -0600 Subject: [PATCH] =?UTF-8?q?[AltServer]=20Fixes=20=E2=80=9CRSTPlaceholderVi?= =?UTF-8?q?ew.nib=20couldn=E2=80=99t=20be=20saved=E2=80=9D=20error?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- AltServer/Devices/ALTDeviceManager.mm | 22 ++++++++++++++++++---- 1 file changed, 18 insertions(+), 4 deletions(-) diff --git a/AltServer/Devices/ALTDeviceManager.mm b/AltServer/Devices/ALTDeviceManager.mm index ce1267e7..80f2a3f9 100644 --- a/AltServer/Devices/ALTDeviceManager.mm +++ b/AltServer/Devices/ALTDeviceManager.mm @@ -297,6 +297,9 @@ NSNotificationName const ALTDeviceManagerDeviceDidDisconnectNotification = @"ALT NSError *writeError = nil; if (![self writeDirectory:appBundleURL toDestinationURL:destinationURL client:afc progress:nil error:&writeError]) { + int removeResult = afc_remove_path_and_contents(afc, stagingURL.relativePath.fileSystemRepresentation); + NSLog(@"Remove staging app result: %@", @(removeResult)); + return finish(writeError); } @@ -430,7 +433,7 @@ NSNotificationName const ALTDeviceManagerDeviceDidDisconnectNotification = @"ALT else { NSURL *destinationFileURL = [destinationURL URLByAppendingPathComponent:fileURL.lastPathComponent isDirectory:NO]; - if (![self writeFile:fileURL toDestinationURL:destinationFileURL client:afc error:error]) + if (![self writeFile:fileURL toDestinationURL:destinationFileURL progress:progress client:afc error:error]) { return NO; } @@ -442,7 +445,7 @@ NSNotificationName const ALTDeviceManagerDeviceDidDisconnectNotification = @"ALT return YES; } -- (BOOL)writeFile:(NSURL *)fileURL toDestinationURL:(NSURL *)destinationURL client:(afc_client_t)afc error:(NSError **)error +- (BOOL)writeFile:(NSURL *)fileURL toDestinationURL:(NSURL *)destinationURL progress:(NSProgress *)progress client:(afc_client_t)afc error:(NSError **)error { NSFileHandle *fileHandle = [NSFileHandle fileHandleForReadingAtPath:fileURL.path]; if (fileHandle == nil) @@ -458,8 +461,16 @@ NSNotificationName const ALTDeviceManagerDeviceDidDisconnectNotification = @"ALT NSData *data = [fileHandle readDataToEndOfFile]; uint64_t af = 0; - if ((afc_file_open(afc, destinationURL.relativePath.fileSystemRepresentation, AFC_FOPEN_WRONLY, &af) != AFC_E_SUCCESS) || af == 0) + + int openResult = afc_file_open(afc, destinationURL.relativePath.fileSystemRepresentation, AFC_FOPEN_WRONLY, &af); + if (openResult != AFC_E_SUCCESS || af == 0) { + if (openResult == AFC_E_OBJECT_IS_DIR) + { + NSLog(@"Treating file as directory: %@ %@", fileURL, destinationURL); + return [self writeDirectory:fileURL toDestinationURL:destinationURL client:afc progress:progress error:error]; + } + if (error) { *error = [NSError errorWithDomain:NSCocoaErrorDomain code:NSFileWriteUnknownError userInfo:@{NSURLErrorKey: destinationURL}]; @@ -475,10 +486,12 @@ NSNotificationName const ALTDeviceManagerDeviceDidDisconnectNotification = @"ALT { uint32_t count = 0; - if (afc_file_write(afc, af, (const char *)data.bytes + bytesWritten, (uint32_t)data.length - bytesWritten, &count) != AFC_E_SUCCESS) + int writeResult = afc_file_write(afc, af, (const char *)data.bytes + bytesWritten, (uint32_t)data.length - bytesWritten, &count); + if (writeResult != AFC_E_SUCCESS) { if (error) { + NSLog(@"Failed writing file with error: %@ (%@ %@)", @(writeResult), fileURL, destinationURL); *error = [NSError errorWithDomain:NSCocoaErrorDomain code:NSFileWriteUnknownError userInfo:@{NSURLErrorKey: destinationURL}]; } @@ -493,6 +506,7 @@ NSNotificationName const ALTDeviceManagerDeviceDidDisconnectNotification = @"ALT { if (error) { + NSLog(@"Failed writing file due to mismatched sizes: %@ vs %@ (%@ %@)", @(bytesWritten), @(data.length), fileURL, destinationURL); *error = [NSError errorWithDomain:NSCocoaErrorDomain code:NSFileWriteUnknownError userInfo:@{NSURLErrorKey: destinationURL}]; }