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