Revision: 28390
          http://sourceforge.net/p/bibdesk/svn/28390
Author:   hofman
Date:     2023-10-05 14:38:09 +0000 (Thu, 05 Oct 2023)
Log Message:
-----------
Move method to actually move a file for auto-filing to BDSKFiler class, and 
return error as dictionary

Modified Paths:
--------------
    trunk/bibdesk/BDSKFiler.h
    trunk/bibdesk/BDSKFiler.m

Modified: trunk/bibdesk/BDSKFiler.h
===================================================================
--- trunk/bibdesk/BDSKFiler.h   2023-10-03 16:08:55 UTC (rev 28389)
+++ trunk/bibdesk/BDSKFiler.h   2023-10-05 14:38:09 UTC (rev 28390)
@@ -123,11 +123,6 @@
 */
 - (void)movePapers:(NSArray *)paperInfos forField:(NSString *)field 
fromDocument:(BibDocument *)doc options:(BDSKFilerOptions)masks 
actionName:(NSString *)actionName;
 
-@end
-
-
-@interface NSFileManager (BDSKFilerExtensions)
-
 /*!
        @method         moveItemAtURL:toURL:force:error:
        @abstract       Extension to movePath:toPath:handler: which can handle 
symlinks and aliases, and allows for forcing a move when otherwise move errors 
occur.
@@ -134,9 +129,9 @@
        @param          fileURL The URL to the file to move.
        @param          newFileURL The URL where the file should move to.
        @param          ignoredFlag Ignore potential errors that may occur 
forcing the move.
-       @param          error An NSError object set when an error occurs.
+       @param          errorInfo A dictionary containing information about the 
problem.
        @discussion -
 */
-- (BOOL)moveItemAtURL:(NSURL *)fileURL toURL:(NSURL *)newFileURL 
ignoring:(BDSKFilerError)ignoredError  error:(NSError **)error;
+- (BOOL)moveItemAtURL:(NSURL *)fileURL toURL:(NSURL *)newFileURL 
ignoring:(BDSKFilerError)ignoredError  errorInfo:(NSDictionary **)errorInfo;
 
 @end

Modified: trunk/bibdesk/BDSKFiler.m
===================================================================
--- trunk/bibdesk/BDSKFiler.m   2023-10-03 16:08:55 UTC (rev 28389)
+++ trunk/bibdesk/BDSKFiler.m   2023-10-05 14:38:09 UTC (rev 28390)
@@ -228,6 +228,7 @@
                 NSMutableDictionary *info = [NSMutableDictionary 
dictionaryWithCapacity:6];
                 [info setValue:file forKey:BDSKFilerFileKey];
                 [info setValue:oldPath forKey:BDSKFilerOldPathKey];
+                [info setValue:newPath forKey:BDSKFilerNewPathKey];
                 [info setValue:pub forKey:BDSKFilerPublicationKey];
             
                 if (check && (ignoredError & BDSKIncompleteFieldsErrorMask) == 
0 && NO == (isLinkedFiles ? [pub canSetURLForLinkedFile:file] : [pub 
canSetURLForField:field])) {
@@ -235,7 +236,6 @@
                     [info setValue:NSLocalizedString(@"Incomplete information 
to generate file name.",@"") forKey:BDSKFilerStatusKey];
                     [info setValue:[NSNumber numberWithInteger:ignoredError | 
BDSKIncompleteFieldsErrorMask] forKey:BDSKFilerFlagKey];
                     [info setValue:NSLocalizedString(@"Move anyway.",@"") 
forKey:BDSKFilerFixKey];
-                    [info setValue:newPath forKey:BDSKFilerNewPathKey];
                     [errorInfoDicts addObject:info];
                     
                 } else if ([[newPath lastPathComponent] length] > 255 && 
(ignoredError & BDSKFileNameTooLongErrorMask) == 0) {
@@ -243,7 +243,6 @@
                     [info setValue:NSLocalizedString(@"The file name is too 
long.",@"") forKey:BDSKFilerStatusKey];
                     [info setValue:[NSNumber numberWithInteger:ignoredError | 
BDSKFileNameTooLongErrorMask] forKey:BDSKFilerFlagKey];
                     [info setValue:NSLocalizedString(@"Move anyway.",@"") 
forKey:BDSKFilerFixKey];
-                    [info setValue:newPath forKey:BDSKFilerNewPathKey];
                     [errorInfoDicts addObject:info];
                     
                 } else if ([NSString isEmptyString:newPath] || [oldPath 
isEqualToString:newPath]) {
@@ -260,23 +259,18 @@
                         field:field oldValues:[NSArray 
arrayWithObject:oldPath] newValues:[NSArray arrayWithObject:newPath]
                         completionHandler:^(BOOL cancelled){
                         
-                        NSError *error = nil;
-                        
+                        NSDictionary *errorInfo = nil;
+
                         if (cancelled && (ignoredError & 
BDSKCancelledErrorMask) == 0) {
                             
                             [info setValue:NSLocalizedString(@"The move was 
cancelled.",@"") forKey:BDSKFilerStatusKey];
                             [info setValue:[NSNumber 
numberWithInteger:ignoredError | BDSKCancelledErrorMask] 
forKey:BDSKFilerFlagKey];
                             [info setValue:NSLocalizedString(@"Move 
anyway.",@"") forKey:BDSKFilerFixKey];
-                            [info setValue:newPath forKey:BDSKFilerNewPathKey];
                             [errorInfoDicts addObject:info];
 
-                        } else if (NO == [[NSFileManager defaultManager] 
moveItemAtURL:[NSURL fileURLWithPath:oldPath isDirectory:NO] toURL:[NSURL 
fileURLWithPath:newPath isDirectory:NO] ignoring:ignoredError error:&error]){
+                        } else if (NO == [self moveItemAtURL:[NSURL 
fileURLWithPath:oldPath isDirectory:NO] toURL:[NSURL fileURLWithPath:newPath 
isDirectory:NO] ignoring:ignoredError errorInfo:&errorInfo]){
                             
-                            NSDictionary *errorInfo = [error userInfo];
-                            [info setValue:[errorInfo 
objectForKey:NSLocalizedRecoverySuggestionErrorKey] forKey:BDSKFilerFixKey];
-                            [info setValue:[errorInfo 
objectForKey:NSLocalizedDescriptionKey] forKey:BDSKFilerStatusKey];
-                            [info setValue:[NSNumber 
numberWithInteger:ignoredError | [error code]] forKey:BDSKFilerFlagKey];
-                            [info setValue:newPath forKey:BDSKFilerNewPathKey];
+                            [info addEntriesFromDictionary:errorInfo];
                             [errorInfoDicts addObject:info];
                             
                         } else {
@@ -353,12 +347,8 @@
     filePaperInfo(0);
 }
 
-@end
-
-
-@implementation NSFileManager (BDSKFilerExtensions)
-
-- (BOOL)moveItemAtURL:(NSURL *)fileURL toURL:(NSURL *)newFileURL 
ignoring:(BDSKFilerError)ignoredError error:(NSError **)error{
+- (BOOL)moveItemAtURL:(NSURL *)fileURL toURL:(NSURL *)newFileURL 
ignoring:(BDSKFilerError)ignoredError errorInfo:(NSDictionary **)errorInfo{
+    NSFileManager *fm = [NSFileManager defaultManager];
     NSURL *resolvedURL = nil;
     NSURL *resolvedNewURL = nil;
     NSString *status = nil;
@@ -379,19 +369,19 @@
     }else if([resolvedNewURL checkResourceIsReachableAndReturnError:NULL]){
         if([resolvedURL checkResourceIsReachableAndReturnError:NULL]){
             if((ignoredError & BDSKTargetFileExistsErrorMask) != 0){
-                NSURL *backupURL = [self 
desktopFileURLWithBasename:[resolvedNewURL lastPathComponent]];
-                if(NO == [self moveItemAtURL:resolvedNewURL toURL:backupURL 
ignoring:BDSKNoError error:NULL] &&
+                NSURL *backupURL = [fm 
desktopFileURLWithBasename:[resolvedNewURL lastPathComponent]];
+                if(NO == [self moveItemAtURL:resolvedNewURL toURL:backupURL 
ignoring:BDSKNoError errorInfo:NULL] &&
                     [resolvedNewURL 
checkResourceIsReachableAndReturnError:NULL] &&
-                    ![self removeItemAtURL:resolvedNewURL error:NULL]){
+                    ![fm removeItemAtURL:resolvedNewURL error:NULL]){
                     status = NSLocalizedString(@"Unable to remove existing 
file at target location.", @"AutoFile error message");
                     statusFlag = BDSKTargetFileExistsErrorMask | 
BDSKCannotRemoveFileErrorMask;
                     // cleanup: move back backup
-                    if(![self moveItemAtURL:backupURL toURL:resolvedNewURL 
error:NULL] && [resolvedNewURL checkResourceIsReachableAndReturnError:NULL]){
-                        [self removeItemAtURL:backupURL error:NULL];
+                    if(![fm moveItemAtURL:backupURL toURL:resolvedNewURL 
error:NULL] && [resolvedNewURL checkResourceIsReachableAndReturnError:NULL]){
+                        [fm removeItemAtURL:backupURL error:NULL];
                     }
                 }
             }else{
-                if([self isDeletableFileAtPath:[resolvedNewURL path]]){
+                if([fm isDeletableFileAtPath:[resolvedNewURL path]]){
                     status = NSLocalizedString(@"File exists at target 
location.", @"AutoFile error message");
                     fix = NSLocalizedString(@"Overwrite existing file.", 
@"AutoFile fix");
                 }else{
@@ -409,7 +399,7 @@
     }else if(NO == [resolvedURL checkResourceIsReachableAndReturnError:NULL]){
         status = NSLocalizedString(@"Original file does not exist.", 
@"AutoFile error message");
         statusFlag = BDSKSourceFileDoesNotExistErrorMask;
-    }else if((ignoredError & BDSKCannotMoveFileErrorMask) == 0 && NO == [self 
isDeletableFileAtPath:[resolvedURL path]]){
+    }else if((ignoredError & BDSKCannotMoveFileErrorMask) == 0 && NO == [fm 
isDeletableFileAtPath:[resolvedURL path]]){
         status = NSLocalizedString(@"Unable to move read-only file.", 
@"AutoFile error message");
         fix = NSLocalizedString(@"Copy original file.", @"AutoFile fix");
         statusFlag = BDSKCannotMoveFileErrorMask;
@@ -416,11 +406,11 @@
     }
     if(statusFlag == BDSKNoError && ignoreMove == NO){
         // create parent directories if necessary (OmniFoundation)
-        if (NO == [self createPathToURL:resolvedNewURL attributes:nil]) {
+        if (NO == [fm createPathToURL:resolvedNewURL attributes:nil]) {
             status = NSLocalizedString(@"Unable to create parent directory.", 
@"AutoFile error message");
             statusFlag = BDSKCannotCreateParentErrorMask;
         }else{
-            NSString *fileType = [[self attributesOfItemAtPath:[resolvedURL 
path] error:NULL] fileType];
+            NSString *fileType = [[fm attributesOfItemAtPath:[resolvedURL 
path] error:NULL] fileType];
             if([fileType isEqualToString:NSFileTypeDirectory] && [[NSWorkspace 
sharedWorkspace] isFilePackageAtPath:[resolvedURL path]] == NO && ignoredError 
!= BDSKCannotMoveFileErrorMask &&
                [[NSUserDefaults standardUserDefaults] 
boolForKey:BDSKWarnOnMoveFolderKey]){
                 NSAlert *alert = [[[NSAlert alloc] init] autorelease];
@@ -439,31 +429,31 @@
                 statusFlag = BDSKCannotMoveFileErrorMask;
             }else if([fileType isEqualToString:NSFileTypeSymbolicLink]){
                 // unfortunately NSFileManager cannot reliably move symlinks...
-                NSString *pathContent = [self 
destinationOfSymbolicLinkAtPath:[resolvedURL path] error:NULL];
+                NSString *pathContent = [fm 
destinationOfSymbolicLinkAtPath:[resolvedURL path] error:NULL];
                 if([pathContent isAbsolutePath] == NO){// it links to a 
relative path
                     pathContent = [[[[resolvedURL 
URLByDeletingLastPathComponent] URLByAppendingPathComponent:pathContent 
isDirectory:NO] URLByStandardizingPath] path];
                     pathContent = [pathContent 
relativePathFromPath:[[resolvedNewURL path] stringByDeletingLastPathComponent]];
                 }
-                if(![self createSymbolicLinkAtURL:resolvedNewURL 
withDestinationURL:[NSURL fileURLWithPath:pathContent isDirectory:NO] 
error:NULL]){
+                if(![fm createSymbolicLinkAtURL:resolvedNewURL 
withDestinationURL:[NSURL fileURLWithPath:pathContent isDirectory:NO] 
error:NULL]){
                     status = NSLocalizedString(@"Unable to move symbolic 
link.", @"AutoFile error message");
                     statusFlag = BDSKCannotMoveFileErrorMask;
                 }else{
-                    if(![self removeItemAtURL:resolvedURL error:NULL]){
+                    if(![fm removeItemAtURL:resolvedURL error:NULL]){
                         if ((ignoredError & BDSKCannotRemoveFileErrorMask) == 
0){
                             status = NSLocalizedString(@"Unable to remove 
original.", @"AutoFile error message");
                             fix = NSLocalizedString(@"Copy original file.", 
@"AutoFile fix");
                             statusFlag = BDSKCannotRemoveFileErrorMask;
                             //cleanup: remove new file
-                            [self removeItemAtURL:resolvedNewURL error:NULL];
+                            [fm removeItemAtURL:resolvedNewURL error:NULL];
                         }
                     }
                 }
-            }else if([self moveItemAtURL:resolvedURL toURL:resolvedNewURL 
error:NULL]){
+            }else if([fm moveItemAtURL:resolvedURL toURL:resolvedNewURL 
error:NULL]){
                 if([[resolvedURL pathExtension] 
isCaseInsensitiveEqual:@"pdf"]){
                     NSURL *notesURL = [[resolvedURL 
URLByDeletingPathExtension] URLByAppendingPathExtension:@"skim"];
                     NSURL *newNotesURL = [[resolvedNewURL 
URLByDeletingPathExtension] URLByAppendingPathExtension:@"skim"];
                     if([notesURL checkResourceIsReachableAndReturnError:NULL] 
&& [newNotesURL checkResourceIsReachableAndReturnError:NULL] == NO){
-                        [self moveItemAtURL:notesURL toURL:newNotesURL 
error:NULL];
+                        [fm moveItemAtURL:notesURL toURL:newNotesURL 
error:NULL];
                     }
                 }
             }else if([resolvedNewURL 
checkResourceIsReachableAndReturnError:NULL]){ // error remove original file
@@ -472,8 +462,8 @@
                     fix = NSLocalizedString(@"Copy original file.", @"AutoFile 
fix");
                     statusFlag = BDSKCannotRemoveFileErrorMask;
                     // cleanup: move back
-                    if(![self moveItemAtURL:resolvedNewURL toURL:resolvedURL 
error:NULL] && [resolvedURL checkResourceIsReachableAndReturnError:NULL]){
-                        [self removeItemAtURL:resolvedNewURL error:NULL];
+                    if(![fm moveItemAtURL:resolvedNewURL toURL:resolvedURL 
error:NULL] && [resolvedURL checkResourceIsReachableAndReturnError:NULL]){
+                        [fm removeItemAtURL:resolvedNewURL error:NULL];
                     }
                 }
             }else{ // other error while moving file
@@ -484,13 +474,8 @@
     }
     
     if(statusFlag != BDSKNoError){
-        if(error){
-            NSMutableDictionary *userInfo = [NSMutableDictionary 
dictionaryWithObjectsAndKeys:status, NSLocalizedDescriptionKey, nil];
-            if (fix != nil)
-                [userInfo setObject:fix 
forKey:NSLocalizedRecoverySuggestionErrorKey];
-            *error = [NSError errorWithDomain:BDSKFilerErrorDomain 
code:statusFlag userInfo:userInfo];
-            //NSLog(@"error \"%@\" occurred; suggested fix is \"%@\"", *error, 
fix);
-        }
+        if(errorInfo)
+            *errorInfo = [NSDictionary dictionaryWithObjectsAndKeys:[NSNumber 
numberWithInteger:ignoredError | statusFlag], BDSKFilerFlagKey, status, 
BDSKFilerStatusKey, fix, BDSKFilerFixKey, nil];
         return NO;
     }
     return YES;

This was sent by the SourceForge.net collaborative development platform, the 
world's largest Open Source development site.



_______________________________________________
Bibdesk-commit mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/bibdesk-commit

Reply via email to