From: <ho...@us...> - 2008-08-15 00:10:49
|
Revision: 13589 http://bibdesk.svn.sourceforge.net/bibdesk/?rev=13589&view=rev Author: hofman Date: 2008-08-15 00:10:57 +0000 (Fri, 15 Aug 2008) Log Message: ----------- Use cocoa apple event descriptor to create descriptor for setting finder comment. Modified Paths: -------------- trunk/bibdesk/NSFileManager_BDSKExtensions.m Modified: trunk/bibdesk/NSFileManager_BDSKExtensions.m =================================================================== --- trunk/bibdesk/NSFileManager_BDSKExtensions.m 2008-08-14 21:59:45 UTC (rev 13588) +++ trunk/bibdesk/NSFileManager_BDSKExtensions.m 2008-08-15 00:10:57 UTC (rev 13589) @@ -476,36 +476,6 @@ return success; } -// Sets a file ref descriptor from a path, without following symlinks -// Based on OAAppKit's fillAEDescFromPath and an example in http://www.cocoadev.com/index.pl?FSMakeFSSpec -static OSErr BDSKFillAEDescFromPath(AEDesc *fileRefDescPtr, NSString *path, BOOL isSymLink) -{ - FSRef fileRef; - AEDesc fileRefDesc; - OSErr err; - - bzero(&fileRef, sizeof(fileRef)); - - err = FSPathMakeRefWithOptions((UInt8 *)[path fileSystemRepresentation], kFSPathMakeRefDoNotFollowLeafSymlink, &fileRef, NULL); - - if (err != noErr) - return err; - - AEInitializeDesc(&fileRefDesc); - err = AECreateDesc(typeFSRef, &fileRef, sizeof(fileRef), &fileRefDesc); - - // Omni says the Finder isn't very good at coercions, so we have to do this ourselves; however we don't want to lose symlinks - if (err == noErr){ - if(isSymLink == NO) - err = AECoerceDesc(&fileRefDesc, typeAlias, fileRefDescPtr); - else - err = AEDuplicateDesc(&fileRefDesc, fileRefDescPtr); - } - AEDisposeDesc(&fileRefDesc); - - return err; -} - static OSType finderSignatureBytes = 'MACS'; // Sets the Finder comment (Spotlight comment) field via the Finder; this method takes 0.01s to execute, vs. 0.5s for NSAppleScript @@ -517,9 +487,11 @@ NSString *path = [fileURL path]; BOOL isSymLink = [[[self fileAttributesAtPath:path traverseLink:NO] objectForKey:NSFileType] isEqualToString:NSFileTypeSymbolicLink]; BOOL success = YES; - NSAppleEventDescriptor *commentTextDesc; + NSAppleEventDescriptor *commentTextDesc = [NSAppleEventDescriptor descriptorWithString:comment]; + FSRef fileRef; + NSAppleEventDescriptor *fileDesc = nil; OSErr err; - AEDesc fileDesc, builtEvent; + AEDesc builtEvent; const char *eventFormat = "'----': 'obj '{ " // Direct object is the file comment we want to modify " form: enum(prop), " // ... the comment is an object's property... @@ -534,13 +506,22 @@ " }, " "data: @"; // The data is what we want to set the direct object to. - commentTextDesc = [NSAppleEventDescriptor descriptorWithString:comment]; - + // Create an apple event descriptor from a path, without following symlinks + // Based on OAAppKit's fillAEDescFromPath and an example in http://www.cocoadev.com/index.pl?FSMakeFSSpec + bzero(&fileRef, sizeof(fileRef)); + err = FSPathMakeRefWithOptions((UInt8 *)[path fileSystemRepresentation], kFSPathMakeRefDoNotFollowLeafSymlink, &fileRef, NULL); + if (err != noErr) { + fileDesc = [NSAppleEventDescriptor descriptorWithDescriptorType:typeFSRef bytes:&fileRef length:sizeof(fileRef)]; + // Omni says the Finder isn't very good at coercions, so we have to do this ourselves; however we don't want to lose symlinks + if (isSymLink == NO) + fileDesc = [fileDesc coerceToDescriptorType:typeAlias]; + if (fileDesc == nil) + err = fnfErr; + } + AEInitializeDesc(&builtEvent); - err = BDSKFillAEDescFromPath(&fileDesc, path, isSymLink); - if (err == noErr) err = AEBuildAppleEvent(kAECoreSuite, kAESetData, typeApplSignature, &finderSignatureBytes, sizeof(finderSignatureBytes), @@ -549,7 +530,6 @@ eventFormat, &fileDesc, [commentTextDesc aeDesc]); - AEDisposeDesc(&fileDesc); if (err == noErr) err = AESendMessage(&builtEvent, NULL, kAENoReply, kAEDefaultTimeout); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ama...@us...> - 2008-08-24 05:18:51
|
Revision: 13611 http://bibdesk.svn.sourceforge.net/bibdesk/?rev=13611&view=rev Author: amaxwell Date: 2008-08-24 05:19:00 +0000 (Sun, 24 Aug 2008) Log Message: ----------- Revert to tested, working code. Something here was crashing reliably. Modified Paths: -------------- trunk/bibdesk/NSFileManager_BDSKExtensions.m Modified: trunk/bibdesk/NSFileManager_BDSKExtensions.m =================================================================== --- trunk/bibdesk/NSFileManager_BDSKExtensions.m 2008-08-24 05:09:07 UTC (rev 13610) +++ trunk/bibdesk/NSFileManager_BDSKExtensions.m 2008-08-24 05:19:00 UTC (rev 13611) @@ -39,12 +39,12 @@ #import "NSFileManager_BDSKExtensions.h" #import "BDSKStringConstants.h" -#import <OmniFoundation/OmniFoundation.h> +#import <OmniFoundation/OFResourceFork.h> #import "NSURL_BDSKExtensions.h" #import "NSObject_BDSKExtensions.h" #import "BDSKVersionNumber.h" #import "NSError_BDSKExtensions.h" -#import <SkimNotes/SkimNotes.h> +#import <SkimNotes/SKNExtendedAttributeManager.h> /* The WLDragMapHeaderStruct stuff was borrowed from CocoaTech Foundation, http://www.cocoatech.com (BSD licensed). This is used for creating WebLoc files, which are a resource-only Finder clipping. Apple provides no API for creating them, so apparently everyone just reverse-engineers the resource file format and creates them. Since I have no desire to mess with ResEdit anymore, we're borrowing this code directly and using Omni's resource fork methods to create the file. Note that you can check the contents of a resource fork in Terminal with `cat somefile/rsrc`, not that it's incredibly helpful. @@ -476,6 +476,36 @@ return success; } +// Sets a file ref descriptor from a path, without following symlinks +// Based on OAAppKit's fillAEDescFromPath and an example in http://www.cocoadev.com/index.pl?FSMakeFSSpec +static OSErr BDSKFillAEDescFromPath(AEDesc *fileRefDescPtr, NSString *path, BOOL isSymLink) +{ + FSRef fileRef; + AEDesc fileRefDesc; + OSErr err; + + bzero(&fileRef, sizeof(fileRef)); + + err = FSPathMakeRefWithOptions((UInt8 *)[path fileSystemRepresentation], kFSPathMakeRefDoNotFollowLeafSymlink, &fileRef, NULL); + + if (err != noErr) + return err; + + AEInitializeDesc(&fileRefDesc); + err = AECreateDesc(typeFSRef, &fileRef, sizeof(fileRef), &fileRefDesc); + + // Omni says the Finder isn't very good at coercions, so we have to do this ourselves; however we don't want to lose symlinks + if (err == noErr){ + if(isSymLink == NO) + err = AECoerceDesc(&fileRefDesc, typeAlias, fileRefDescPtr); + else + err = AEDuplicateDesc(&fileRefDesc, fileRefDescPtr); + } + AEDisposeDesc(&fileRefDesc); + + return err; +} + static OSType finderSignatureBytes = 'MACS'; // Sets the Finder comment (Spotlight comment) field via the Finder; this method takes 0.01s to execute, vs. 0.5s for NSAppleScript @@ -487,11 +517,9 @@ NSString *path = [fileURL path]; BOOL isSymLink = [[[self fileAttributesAtPath:path traverseLink:NO] objectForKey:NSFileType] isEqualToString:NSFileTypeSymbolicLink]; BOOL success = YES; - NSAppleEventDescriptor *commentTextDesc = [NSAppleEventDescriptor descriptorWithString:comment]; - FSRef fileRef; - NSAppleEventDescriptor *fileDesc = nil; + NSAppleEventDescriptor *commentTextDesc; OSErr err; - AEDesc builtEvent; + AEDesc fileDesc, builtEvent; const char *eventFormat = "'----': 'obj '{ " // Direct object is the file comment we want to modify " form: enum(prop), " // ... the comment is an object's property... @@ -506,22 +534,13 @@ " }, " "data: @"; // The data is what we want to set the direct object to. - // Create an apple event descriptor from a path, without following symlinks - // Based on OAAppKit's fillAEDescFromPath and an example in http://www.cocoadev.com/index.pl?FSMakeFSSpec - bzero(&fileRef, sizeof(fileRef)); - err = FSPathMakeRefWithOptions((UInt8 *)[path fileSystemRepresentation], kFSPathMakeRefDoNotFollowLeafSymlink, &fileRef, NULL); + commentTextDesc = [NSAppleEventDescriptor descriptorWithString:comment]; - if (err != noErr) { - fileDesc = [NSAppleEventDescriptor descriptorWithDescriptorType:typeFSRef bytes:&fileRef length:sizeof(fileRef)]; - // Omni says the Finder isn't very good at coercions, so we have to do this ourselves; however we don't want to lose symlinks - if (isSymLink == NO) - fileDesc = [fileDesc coerceToDescriptorType:typeAlias]; - if (fileDesc == nil) - err = fnfErr; - } AEInitializeDesc(&builtEvent); + err = BDSKFillAEDescFromPath(&fileDesc, path, isSymLink); + if (err == noErr) err = AEBuildAppleEvent(kAECoreSuite, kAESetData, typeApplSignature, &finderSignatureBytes, sizeof(finderSignatureBytes), @@ -530,6 +549,7 @@ eventFormat, &fileDesc, [commentTextDesc aeDesc]); + AEDisposeDesc(&fileDesc); if (err == noErr) err = AESendMessage(&builtEvent, NULL, kAENoReply, kAEDefaultTimeout); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ama...@us...> - 2008-10-18 05:34:48
|
Revision: 13736 http://bibdesk.svn.sourceforge.net/bibdesk/?rev=13736&view=rev Author: amaxwell Date: 2008-10-18 05:34:42 +0000 (Sat, 18 Oct 2008) Log Message: ----------- Use self instead of +defaultManager in category. Modified Paths: -------------- trunk/bibdesk/NSFileManager_BDSKExtensions.m Modified: trunk/bibdesk/NSFileManager_BDSKExtensions.m =================================================================== --- trunk/bibdesk/NSFileManager_BDSKExtensions.m 2008-10-18 05:28:09 UTC (rev 13735) +++ trunk/bibdesk/NSFileManager_BDSKExtensions.m 2008-10-18 05:34:42 UTC (rev 13736) @@ -356,20 +356,19 @@ } - (NSString *)newestLyXPipePath { - NSFileManager *fm = [NSFileManager defaultManager]; - NSString *appSupportPath = [fm applicationSupportDirectory:kUserDomain]; - NSDirectoryEnumerator *dirEnum = [fm enumeratorAtPath:appSupportPath]; + NSString *appSupportPath = [self applicationSupportDirectory:kUserDomain]; + NSDirectoryEnumerator *dirEnum = [self enumeratorAtPath:appSupportPath]; NSString *file; NSString *lyxPipePath = nil; BDSKVersionNumber *version = nil; while (file = [dirEnum nextObject]) { NSString *fullPath = [appSupportPath stringByAppendingPathComponent:file]; - NSDictionary *fileAttributes = [fm fileAttributesAtPath:fullPath traverseLink:YES]; + NSDictionary *fileAttributes = [self fileAttributesAtPath:fullPath traverseLink:YES]; if ([[fileAttributes fileType] isEqualToString:NSFileTypeDirectory]) { [dirEnum skipDescendents]; NSString *pipePath = [fullPath stringByAppendingPathComponent:@".lyxpipe.in"]; - if ([file hasPrefix:@"LyX"] && [fm fileExistsAtPath:pipePath]) { + if ([file hasPrefix:@"LyX"] && [self fileExistsAtPath:pipePath]) { if (version == nil) { lyxPipePath = pipePath; } else { @@ -388,7 +387,7 @@ } if (lyxPipePath == nil) { NSString *pipePath = [[NSHomeDirectory() stringByAppendingPathComponent:@".lyx"] stringByAppendingPathComponent:@"lyxpipe.in"]; - if ([fm fileExistsAtPath:pipePath]) + if ([self fileExistsAtPath:pipePath]) lyxPipePath = pipePath; } return lyxPipePath; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ho...@us...> - 2009-01-28 13:01:34
|
Revision: 14160 http://bibdesk.svn.sourceforge.net/bibdesk/?rev=14160&view=rev Author: hofman Date: 2009-01-28 13:01:18 +0000 (Wed, 28 Jan 2009) Log Message: ----------- Use consistent naming for method to remove EAs Modified Paths: -------------- trunk/bibdesk/NSFileManager_BDSKExtensions.m Modified: trunk/bibdesk/NSFileManager_BDSKExtensions.m =================================================================== --- trunk/bibdesk/NSFileManager_BDSKExtensions.m 2009-01-28 10:03:15 UTC (rev 14159) +++ trunk/bibdesk/NSFileManager_BDSKExtensions.m 2009-01-28 13:01:18 UTC (rev 14160) @@ -861,7 +861,7 @@ if (tags) return [[SKNExtendedAttributeManager sharedNoSplitManager] setExtendedAttributeNamed:OPEN_META_TAGS_KEY toPropertyListValue:tags atPath:path options:kSKNXattrNoCompress error:error]; else - return [[SKNExtendedAttributeManager sharedNoSplitManager] removeExtendedAttribute:OPEN_META_TAGS_KEY atPath:path traverseLink:YES error:error]; + return [[SKNExtendedAttributeManager sharedNoSplitManager] removeExtendedAttributeNamed:OPEN_META_TAGS_KEY atPath:path traverseLink:YES error:error]; } - (NSNumber *)openMetaRatingAtPath:(NSString *)path error:(NSError **)error { @@ -872,7 +872,7 @@ if (rating) return [[SKNExtendedAttributeManager sharedNoSplitManager] setExtendedAttributeNamed:OPEN_META_RATING_KEY toPropertyListValue:rating atPath:path options:kSKNXattrNoCompress error:error]; else - return [[SKNExtendedAttributeManager sharedNoSplitManager] removeExtendedAttribute:OPEN_META_RATING_KEY atPath:path traverseLink:YES error:error]; + return [[SKNExtendedAttributeManager sharedNoSplitManager] removeExtendedAttributeNamed:OPEN_META_RATING_KEY atPath:path traverseLink:YES error:error]; } @end This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ho...@us...> - 2009-02-07 18:52:01
|
Revision: 14241 http://bibdesk.svn.sourceforge.net/bibdesk/?rev=14241&view=rev Author: hofman Date: 2009-02-07 18:51:53 +0000 (Sat, 07 Feb 2009) Log Message: ----------- Don't compile deprecated download config code when compiling for 10.5 only. Modified Paths: -------------- trunk/bibdesk/NSFileManager_BDSKExtensions.m Modified: trunk/bibdesk/NSFileManager_BDSKExtensions.m =================================================================== --- trunk/bibdesk/NSFileManager_BDSKExtensions.m 2009-02-07 18:48:04 UTC (rev 14240) +++ trunk/bibdesk/NSFileManager_BDSKExtensions.m 2009-02-07 18:51:53 UTC (rev 14241) @@ -300,62 +300,40 @@ // note: IC is not thread safe - (NSURL *)downloadFolderURL; { - if (floor(NSAppKitVersionNumber) > NSAppKitVersionNumber10_4) { - - const OSType dlFolder = 'down'; // 10.5 Folders.h: kDownloadsFolderType = 'down' /* Refers to the ~/Downloads folder*/ - FSRef folderRef; - OSStatus err = FSFindFolder(kUserDomain, dlFolder, TRUE, &folderRef); - CFURLRef folderURL = NULL; - if (noErr == err) - folderURL = CFURLCreateFromFSRef(CFAllocatorGetDefault(), &folderRef); - - if (NULL != folderURL) - return [(id)folderURL autorelease]; - - // otherwise continue and try IC, which has been deprecated for years and leaks like a sieve - } + OSStatus err = fnfErr; + FSRef pathRef; + CFURLRef downloadsURL = NULL; - NSAssert([NSThread inMainThread], @"InternetConfig is not thread safe"); - OSStatus err; - ICInstance inst; - ICAttr junk = 0; - ICFileSpec spec; - - static CFURLRef pathURL = NULL; - static BOOL alreadyTried = NO; - - if (NO == alreadyTried) { - - alreadyTried = YES; - +#if MAC_OS_X_VERSION_MIN_REQUIRED <= MAC_OS_X_VERSION_10_4 + if (floor(NSAppKitVersionNumber) > NSAppKitVersionNumber10_4) { +#endif + err = FSFindFolder(kUserDomain, kDownloadsFolderType, TRUE, &pathRef); +#if MAC_OS_X_VERSION_MIN_REQUIRED <= MAC_OS_X_VERSION_10_4 + } else { + ICInstance inst; + ICAttr junk = 0; + ICFileSpec spec; long size = sizeof(ICFileSpec); - FSRef pathRef; - err = ICStart(&inst, 'BDSK'); - - if (noErr == err) + err = ICStart(&inst, 'SKim'); + if (noErr == err) { err = ICBegin(inst, icReadOnlyPerm); - - if (err == noErr) - { - //Get the downloads folder - err = ICGetPref(inst, kICDownloadFolder, &junk, &spec, &size); - if (noErr == err) { + if (err == noErr) { + err = ICGetPref(inst, kICDownloadFolder, &junk, &spec, &size); ICEnd(inst); - ICStop(inst); + if (err == noErr) + err = FSpMakeFSRef(&(spec.fss), &pathRef); } - // convert FSSpec to FSRef - err = FSpMakeFSRef(&(spec.fss), &pathRef); - - if(err == noErr) - pathURL = CFURLCreateFromFSRef(CFAllocatorGetDefault(), &pathRef); - - + ICStop(inst); } } - return (NSURL *)pathURL; +#endif + if(err == noErr) + downloadsURL = CFURLCreateFromFSRef(CFAllocatorGetDefault(), &pathRef); + + return (NSURL *)downloadsURL; } - (NSString *)newestLyXPipePath { This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ho...@us...> - 2009-02-07 18:52:29
|
Revision: 14242 http://bibdesk.svn.sourceforge.net/bibdesk/?rev=14242&view=rev Author: hofman Date: 2009-02-07 18:52:24 +0000 (Sat, 07 Feb 2009) Log Message: ----------- autorelease return value Modified Paths: -------------- trunk/bibdesk/NSFileManager_BDSKExtensions.m Modified: trunk/bibdesk/NSFileManager_BDSKExtensions.m =================================================================== --- trunk/bibdesk/NSFileManager_BDSKExtensions.m 2009-02-07 18:51:53 UTC (rev 14241) +++ trunk/bibdesk/NSFileManager_BDSKExtensions.m 2009-02-07 18:52:24 UTC (rev 14242) @@ -333,7 +333,7 @@ if(err == noErr) downloadsURL = CFURLCreateFromFSRef(CFAllocatorGetDefault(), &pathRef); - return (NSURL *)downloadsURL; + return [(NSURL *)downloadsURL autorelease]; } - (NSString *)newestLyXPipePath { This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ho...@us...> - 2009-02-13 22:55:05
|
Revision: 14276 http://bibdesk.svn.sourceforge.net/bibdesk/?rev=14276&view=rev Author: hofman Date: 2009-02-13 21:40:35 +0000 (Fri, 13 Feb 2009) Log Message: ----------- add a comment about OpenMeta's use of private domain Modified Paths: -------------- trunk/bibdesk/NSFileManager_BDSKExtensions.m Modified: trunk/bibdesk/NSFileManager_BDSKExtensions.m =================================================================== --- trunk/bibdesk/NSFileManager_BDSKExtensions.m 2009-02-13 21:33:55 UTC (rev 14275) +++ trunk/bibdesk/NSFileManager_BDSKExtensions.m 2009-02-13 21:40:35 UTC (rev 14276) @@ -830,6 +830,7 @@ // These are just definitions for special EA names and the format of their values // They're saved as serialized property list values, which is the same as SKNExtendedAttributeManager does without splitting and compression // See http://code.google.com/p/openmeta/ for some documentation and sample code +// Probably we should not write them, because really the com.apple.metadata domain is private to Apple, http://ironicsoftware.com/community/comments.php?DiscussionID=632&page=1 - (NSArray *)openMetaTagsAtPath:(NSString *)path error:(NSError **)error { return [[SKNExtendedAttributeManager sharedNoSplitManager] propertyListFromExtendedAttributeNamed:OPEN_META_TAGS_KEY atPath:path traverseLink:YES error:error]; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ho...@us...> - 2009-02-27 00:54:36
|
Revision: 14508 http://bibdesk.svn.sourceforge.net/bibdesk/?rev=14508&view=rev Author: hofman Date: 2009-02-27 00:54:28 +0000 (Fri, 27 Feb 2009) Log Message: ----------- invert a check in creating the path to a file Modified Paths: -------------- trunk/bibdesk/NSFileManager_BDSKExtensions.m Modified: trunk/bibdesk/NSFileManager_BDSKExtensions.m =================================================================== --- trunk/bibdesk/NSFileManager_BDSKExtensions.m 2009-02-26 23:48:04 UTC (rev 14507) +++ trunk/bibdesk/NSFileManager_BDSKExtensions.m 2009-02-27 00:54:28 UTC (rev 14508) @@ -569,7 +569,7 @@ success = YES; else if ([self fileExistsAtPath:directory isDirectory:&isDir] == NO) success = [self createPathToFile:directory attributes:attributes] && [self createDirectoryAtPath:directory attributes:attributes]; - else if (isDir == NO) + else if (isDir) success = YES; return success; } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ho...@us...> - 2009-04-16 09:16:55
|
Revision: 15063 http://bibdesk.svn.sourceforge.net/bibdesk/?rev=15063&view=rev Author: hofman Date: 2009-04-16 09:16:46 +0000 (Thu, 16 Apr 2009) Log Message: ----------- reorganize code Modified Paths: -------------- trunk/bibdesk/NSFileManager_BDSKExtensions.m Modified: trunk/bibdesk/NSFileManager_BDSKExtensions.m =================================================================== --- trunk/bibdesk/NSFileManager_BDSKExtensions.m 2009-04-16 05:00:20 UTC (rev 15062) +++ trunk/bibdesk/NSFileManager_BDSKExtensions.m 2009-04-16 09:16:46 UTC (rev 15063) @@ -292,6 +292,94 @@ return path; } +// note: IC is not thread safe +- (NSURL *)downloadFolderURL; +{ + OSStatus err = fnfErr; + FSRef pathRef; + CFURLRef downloadsURL = NULL; + +#if MAC_OS_X_VERSION_MIN_REQUIRED <= MAC_OS_X_VERSION_10_4 + if (floor(NSAppKitVersionNumber) > NSAppKitVersionNumber10_4) { +#endif + err = FSFindFolder(kUserDomain, kDownloadsFolderType, TRUE, &pathRef); +#if MAC_OS_X_VERSION_MIN_REQUIRED <= MAC_OS_X_VERSION_10_4 + } else { + ICInstance inst; + ICAttr junk = 0; + ICFileSpec spec; + long size = sizeof(ICFileSpec); + + err = ICStart(&inst, 'SKim'); + if (noErr == err) { + err = ICBegin(inst, icReadOnlyPerm); + + if (err == noErr) { + err = ICGetPref(inst, kICDownloadFolder, &junk, &spec, &size); + ICEnd(inst); + if (err == noErr) + err = FSpMakeFSRef(&(spec.fss), &pathRef); + } + + ICStop(inst); + } + } +#endif + if(err == noErr) + downloadsURL = CFURLCreateFromFSRef(CFAllocatorGetDefault(), &pathRef); + + return [(NSURL *)downloadsURL autorelease]; +} + +- (NSString *)newestLyXPipePath { + NSString *appSupportPath = [self applicationSupportDirectory:kUserDomain]; + NSDirectoryEnumerator *dirEnum = [self enumeratorAtPath:appSupportPath]; + NSString *file; + NSString *lyxPipePath = nil; + BDSKVersionNumber *version = nil; + + while (file = [dirEnum nextObject]) { + NSString *fullPath = [appSupportPath stringByAppendingPathComponent:file]; + NSDictionary *fileAttributes = [self fileAttributesAtPath:fullPath traverseLink:YES]; + if ([[fileAttributes fileType] isEqualToString:NSFileTypeDirectory]) { + [dirEnum skipDescendents]; + NSString *pipePath = [fullPath stringByAppendingPathComponent:@".lyxpipe.in"]; + if ([file hasPrefix:@"LyX"] && [self fileExistsAtPath:pipePath]) { + if (version == nil) { + lyxPipePath = pipePath; + } else { + BDSKVersionNumber *fileVersion = nil; + if ([file hasPrefix:@"LyX-"]) + fileVersion = [[[BDSKVersionNumber alloc] initWithVersionString:[file substringFromIndex:4]] autorelease]; + else + fileVersion = [[[BDSKVersionNumber alloc] initWithVersionString:@""] autorelease]; + if ([fileVersion compareToVersionNumber:version] == NSOrderedDescending) { + lyxPipePath = pipePath; + version = fileVersion; + } + } + } + } + } + if (lyxPipePath == nil) { + NSString *pipePath = [[NSHomeDirectory() stringByAppendingPathComponent:@".lyx"] stringByAppendingPathComponent:@"lyxpipe.in"]; + if ([self fileExistsAtPath:pipePath]) + lyxPipePath = pipePath; + } + return lyxPipePath; +} + +- (BOOL)copyFileFromSharedSupportToApplicationSupport:(NSString *)fileName overwrite:(BOOL)overwrite{ + NSString *targetPath = [[self currentApplicationSupportPathForCurrentUser] stringByAppendingPathComponent:fileName]; + NSString *sourcePath = [[[NSBundle mainBundle] sharedSupportPath] stringByAppendingPathComponent:fileName]; + if ([self fileExistsAtPath:targetPath]) { + if (overwrite == NO) + return NO; + [self removeFileAtPath:targetPath handler:nil]; + } + return [self copyPath:sourcePath toPath:targetPath handler:nil]; +} + #pragma mark Temporary files and directories // This method is copied and modified from NSFileManager-OFExtensions.m @@ -478,94 +566,6 @@ return fullPath; } -// note: IC is not thread safe -- (NSURL *)downloadFolderURL; -{ - OSStatus err = fnfErr; - FSRef pathRef; - CFURLRef downloadsURL = NULL; - -#if MAC_OS_X_VERSION_MIN_REQUIRED <= MAC_OS_X_VERSION_10_4 - if (floor(NSAppKitVersionNumber) > NSAppKitVersionNumber10_4) { -#endif - err = FSFindFolder(kUserDomain, kDownloadsFolderType, TRUE, &pathRef); -#if MAC_OS_X_VERSION_MIN_REQUIRED <= MAC_OS_X_VERSION_10_4 - } else { - ICInstance inst; - ICAttr junk = 0; - ICFileSpec spec; - long size = sizeof(ICFileSpec); - - err = ICStart(&inst, 'SKim'); - if (noErr == err) { - err = ICBegin(inst, icReadOnlyPerm); - - if (err == noErr) { - err = ICGetPref(inst, kICDownloadFolder, &junk, &spec, &size); - ICEnd(inst); - if (err == noErr) - err = FSpMakeFSRef(&(spec.fss), &pathRef); - } - - ICStop(inst); - } - } -#endif - if(err == noErr) - downloadsURL = CFURLCreateFromFSRef(CFAllocatorGetDefault(), &pathRef); - - return [(NSURL *)downloadsURL autorelease]; -} - -- (NSString *)newestLyXPipePath { - NSString *appSupportPath = [self applicationSupportDirectory:kUserDomain]; - NSDirectoryEnumerator *dirEnum = [self enumeratorAtPath:appSupportPath]; - NSString *file; - NSString *lyxPipePath = nil; - BDSKVersionNumber *version = nil; - - while (file = [dirEnum nextObject]) { - NSString *fullPath = [appSupportPath stringByAppendingPathComponent:file]; - NSDictionary *fileAttributes = [self fileAttributesAtPath:fullPath traverseLink:YES]; - if ([[fileAttributes fileType] isEqualToString:NSFileTypeDirectory]) { - [dirEnum skipDescendents]; - NSString *pipePath = [fullPath stringByAppendingPathComponent:@".lyxpipe.in"]; - if ([file hasPrefix:@"LyX"] && [self fileExistsAtPath:pipePath]) { - if (version == nil) { - lyxPipePath = pipePath; - } else { - BDSKVersionNumber *fileVersion = nil; - if ([file hasPrefix:@"LyX-"]) - fileVersion = [[[BDSKVersionNumber alloc] initWithVersionString:[file substringFromIndex:4]] autorelease]; - else - fileVersion = [[[BDSKVersionNumber alloc] initWithVersionString:@""] autorelease]; - if ([fileVersion compareToVersionNumber:version] == NSOrderedDescending) { - lyxPipePath = pipePath; - version = fileVersion; - } - } - } - } - } - if (lyxPipePath == nil) { - NSString *pipePath = [[NSHomeDirectory() stringByAppendingPathComponent:@".lyx"] stringByAppendingPathComponent:@"lyxpipe.in"]; - if ([self fileExistsAtPath:pipePath]) - lyxPipePath = pipePath; - } - return lyxPipePath; -} - -- (BOOL)copyFileFromSharedSupportToApplicationSupport:(NSString *)fileName overwrite:(BOOL)overwrite{ - NSString *targetPath = [[self currentApplicationSupportPathForCurrentUser] stringByAppendingPathComponent:fileName]; - NSString *sourcePath = [[[NSBundle mainBundle] sharedSupportPath] stringByAppendingPathComponent:fileName]; - if ([self fileExistsAtPath:targetPath]) { - if (overwrite == NO) - return NO; - [self removeFileAtPath:targetPath handler:nil]; - } - return [self copyPath:sourcePath toPath:targetPath handler:nil]; -} - #pragma mark Creating paths - (BOOL)createPathToFile:(NSString *)path attributes:(NSDictionary *)attributes; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ho...@us...> - 2009-04-16 09:57:26
|
Revision: 15064 http://bibdesk.svn.sourceforge.net/bibdesk/?rev=15064&view=rev Author: hofman Date: 2009-04-16 09:57:15 +0000 (Thu, 16 Apr 2009) Log Message: ----------- move repeating code around FSFindFolder to a separate static function Modified Paths: -------------- trunk/bibdesk/NSFileManager_BDSKExtensions.m Modified: trunk/bibdesk/NSFileManager_BDSKExtensions.m =================================================================== --- trunk/bibdesk/NSFileManager_BDSKExtensions.m 2009-04-16 09:16:46 UTC (rev 15063) +++ trunk/bibdesk/NSFileManager_BDSKExtensions.m 2009-04-16 09:57:15 UTC (rev 15064) @@ -179,29 +179,33 @@ [pool release]; } +static NSString *findSpecialFolder(FSVolumeRefNum domain, OSType folderType, Boolean createFolder) { + FSRef foundRef; + OSStatus err = noErr; + + err = FSFindFolder(domain, folderType, createFolder, &foundRef); + if (err == noErr) + NSLog(@"Error %d: the system was unable to find your folder of type %i in domain %i.", err, folderType, domain); + + CFURLRef url = CFURLCreateFromFSRef(kCFAllocatorDefault, &foundRef); + NSString *retStr = nil; + + if(url != nil){ + retStr = [(NSURL *)url path]; + CFRelease(url); + } + + return retStr; +} + - (NSString *)currentApplicationSupportPathForCurrentUser{ static NSString *path = nil; if(path == nil){ - FSRef foundRef; - OSStatus err = noErr; + path = findSpecialFolder(kUserDomain, kApplicationSupportFolderType, kCreateFolder); - err = FSFindFolder(kUserDomain, kApplicationSupportFolderType, kCreateFolder, &foundRef); - if(err != noErr){ - NSLog(@"Error %d: the system was unable to find your Application Support folder.", err); - return nil; - } - - CFURLRef url = CFURLCreateFromFSRef(kCFAllocatorDefault, &foundRef); - - if(url != nil){ - path = [(NSURL *)url path]; - CFRelease(url); - } - NSString *appName = [[NSBundle mainBundle] objectForInfoDictionaryKey:(NSString *)kCFBundleNameKey]; - if(appName == nil) [NSException raise:NSObjectNotAvailableException format:NSLocalizedString(@"Unable to find CFBundleIdentifier for %@", @"Exception message"), [NSApp description]]; @@ -224,47 +228,15 @@ } - (NSString *)applicationSupportDirectory:(SInt16)domain{ - - FSRef foundRef; - OSStatus err = noErr; - - err = FSFindFolder(domain, - kApplicationSupportFolderType, - kCreateFolder, - &foundRef); - NSAssert1( err == noErr, @"Error %d: the system was unable to find your Application Support folder.", err); - - CFURLRef url = CFURLCreateFromFSRef(kCFAllocatorDefault, &foundRef); - NSString *retStr = nil; - - if(url != nil){ - retStr = [(NSURL *)url path]; - CFRelease(url); - } - - return retStr; + return findSpecialFolder(domain, kApplicationSupportFolderType, kCreateFolder); } - (NSString *)applicationsDirectory{ + NSString *path = findSpecialFolder(kLocalDomain, kApplicationSupportFolderType, kDontCreateFolder); - NSString *path = nil; - FSRef foundRef; - OSStatus err = noErr; - CFURLRef url = NULL; - BOOL isDir = YES; - - err = FSFindFolder(kLocalDomain, kApplicationsFolderType, kDontCreateFolder, &foundRef); - if(err == noErr){ - url = CFURLCreateFromFSRef(kCFAllocatorDefault, &foundRef); - } - - if(url != NULL){ - path = [(NSURL *)url path]; - CFRelease(url); - } - if(path == nil){ path = @"/Applications"; + BOOL isDir; if([self fileExistsAtPath:path isDirectory:&isDir] == NO || isDir == NO){ NSLog(@"The system was unable to find your Applications folder.", @""); return nil; @@ -275,21 +247,7 @@ } - (NSString *)desktopDirectory { - FSRef foundRef; - OSStatus err = FSFindFolder(kUserDomain, kDesktopFolderType, kCreateFolder, &foundRef); - NSString *path = nil; - - NSAssert1( err == noErr, @"Error %d: the system was unable to find your Desktop folder.", err); - - if (err == noErr) { - CFURLRef url = CFURLCreateFromFSRef(kCFAllocatorDefault, &foundRef); - if(url != nil){ - path = [(NSURL *)url path]; - CFRelease(url); - } - } - - return path; + return findSpecialFolder(kUserDomain, kDesktopFolderType, kCreateFolder); } // note: IC is not thread safe @@ -437,14 +395,12 @@ - (NSString *)temporaryDirectoryForFileSystemContainingPath:(NSString *)path error:(NSError **)outError; /*" Returns the path to the 'Temporary Items' folder on the same filesystem as the given path. Returns an error if there is a problem (for example, iDisk doesn't have temporary folders). The returned directory should be only readable by the calling user, so files written into this directory can be written with the desired final permissions without worrying about security (the expectation being that you'll soon call -exchangeFileAtPath:withFileAtPath:). "*/ { + // The file in question might not exist yet. This loop assumes that it will terminate due to '/' always being valid. OSErr err; FSRef ref; - - - // The file in question might not exist yet. This loop assumes that it will terminate due to '/' always being valid. NSString *attempt = path; while (YES) { - CFURLRef url = (CFURLRef)[[[NSURL alloc] initFileURLWithPath:attempt] autorelease]; + CFURLRef url = (CFURLRef)[NSURL fileURLWithPath:attempt]; if (CFURLGetFSRef((CFURLRef)url, &ref)) break; attempt = [attempt stringByDeletingLastPathComponent]; @@ -459,26 +415,13 @@ return nil; } - FSRef temporaryItemsRef; - err = FSFindFolder(catalogInfo.volume, kTemporaryFolderType, kCreateFolder, &temporaryItemsRef); - if (err != noErr) { + NSString *temporaryItemsPath = findSpecialFolder(catalogInfo.volume, kTemporaryFolderType, kCreateFolder); + if (temporaryItemsPath == nil) { NSError *error = [NSError errorWithDomain:NSOSStatusErrorDomain code:err userInfo:nil]; // underlying error if (outError) *outError = [NSError localErrorWithCode:kBDSKCannotFindTemporaryDirectoryError localizedDescription:[NSString stringWithFormat:@"Unable to find temporary items directory for '%@'", path] underlyingError:error]; - return nil; } - CFURLRef temporaryItemsURL; - temporaryItemsURL = CFURLCreateFromFSRef(kCFAllocatorDefault, &temporaryItemsRef); - if (!temporaryItemsURL) { - if (outError) - *outError = [NSError localErrorWithCode:kBDSKCannotFindTemporaryDirectoryError localizedDescription:[NSString stringWithFormat:@"Unable to create URL to temporary items directory for '%@'", path]]; - return nil; - } - - NSString *temporaryItemsPath = [[[(NSURL *)temporaryItemsURL path] copy] autorelease]; - [(id)temporaryItemsURL release]; - return temporaryItemsPath; } @@ -511,12 +454,8 @@ return temporaryFilePath; } -// This method is copied and modified from NSFileManager-OFExtensions.m -- (NSString *)temporaryFileWithBasename:(NSString *)fileName; -{ - if(nil == fileName) - fileName = [[NSProcessInfo processInfo] globallyUniqueString]; - return [self uniqueFilePathWithName:fileName atPath:temporaryBaseDirectory]; +- (NSString *)temporaryFileWithBasename:(NSString *)fileName { + return [self uniqueFilePathWithName:fileName atPath:temporaryBaseDirectory ?: [[NSProcessInfo processInfo] globallyUniqueString]]; } // This method is subject to a race condition in our temporary directory if we pass the same baseName to this method and temporaryFileWithBasename: simultaneously; hence the lock in uniqueFilePathWithName:atPath:, even though it and temporaryFileWithBasename: are not thread safe or secure. @@ -544,7 +483,6 @@ return finalPath; } -// This method is copied and modified from NSFileManager-OFExtensions.m - (NSString *)uniqueFilePathWithName:(NSString *)fileName atPath:(NSString *)directory { // could expand this path? NSParameterAssert([directory isAbsolutePath]); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ho...@us...> - 2009-04-16 10:28:41
|
Revision: 15065 http://bibdesk.svn.sourceforge.net/bibdesk/?rev=15065&view=rev Author: hofman Date: 2009-04-16 10:28:36 +0000 (Thu, 16 Apr 2009) Log Message: ----------- simplify method to get a writable file on the same volume as a path, collapse several methods into one and use our own method to create a unique file name Modified Paths: -------------- trunk/bibdesk/NSFileManager_BDSKExtensions.m Modified: trunk/bibdesk/NSFileManager_BDSKExtensions.m =================================================================== --- trunk/bibdesk/NSFileManager_BDSKExtensions.m 2009-04-16 09:57:15 UTC (rev 15064) +++ trunk/bibdesk/NSFileManager_BDSKExtensions.m 2009-04-16 10:28:36 UTC (rev 15065) @@ -124,7 +124,6 @@ @implementation NSFileManager (BDSKExtensions) -static NSLock *tempFilenameLock; static NSString *temporaryBaseDirectory = nil; // we can't use +initialize in a category, and +load is too dangerous @@ -159,14 +158,6 @@ [pool release]; } -__attribute__((constructor)) -static void createTempFilenameLock() -{ - NSAutoreleasePool *pool = [NSAutoreleasePool new]; - tempFilenameLock = [[NSLock alloc] init]; - [pool release]; -} - __attribute__((destructor)) static void destroyTemporaryDirectory() { @@ -341,60 +332,15 @@ #pragma mark Temporary files and directories // This method is copied and modified from NSFileManager-OFExtensions.m -- (NSString *)uniqueFilenameFromName:(NSString *)filename error:(NSError **)outError; +// Note that due to the permissions behavior of FSFindFolder, this shouldn't have the security problems that raw calls to -uniqueFilenameFromName: may have. +- (NSString *)temporaryPathForWritingToPath:(NSString *)path error:(NSError **)outError +/*" Returns a unique filename in the -temporaryDirectoryForFileSystemContainingPath: for the filesystem containing the given path. The returned path is suitable for writing to and then replacing the input path using -replaceFileAtPath:withFileAtPath:handler:. This means that the result should never be equal to the input path. If no suitable temporary items folder is found and allowOriginalDirectory is NO, this will raise. If allowOriginalDirectory is YES, on the other hand, this will return a file name in the same folder. Note that passing YES for allowOriginalDirectory could potentially result in security implications of the form noted with -uniqueFilenameFromName:. "*/ { - // We either aren't allowing the original, or it exists. - NSString *extension = [filename pathExtension]; - NSString *baseFilename = [filename stringByDeletingPathExtension]; - unsigned int triesLeft = 10; - NSMutableString *tempFilename = [NSMutableString string]; + BDSKPRECONDITION(![NSString isEmptyString:path]); - while (triesLeft--) { - unsigned int tempFilenameNumber = 1; - - [tempFilenameLock lock]; - @try { - do { - [tempFilename setString:baseFilename]; - [tempFilename appendFormat:@"-%d", tempFilenameNumber++]; - if ([extension length]) - [tempFilename appendFormat:@".%@", extension]; - } while ([self fileExistsAtPath:tempFilename]); - } - @catch (id e) { - [tempFilenameLock unlock]; - [tempFilename release]; - tempFilename = nil; - [e raise]; - } - [tempFilenameLock unlock]; - - int fd = open((const char *)[self fileSystemRepresentationWithPath:tempFilename], O_EXCL | O_WRONLY | O_CREAT | O_TRUNC, 0666); - if (fd != -1) { - close(fd); // no unlink, were are on the 'create' branch - return tempFilename; - } - if (errno != EEXIST) { - // TODO: Not sure whether EACCES or EEXIST has precedence if both could be returned. - // TODO: EINTR? - // Probably EACCES, we aren't going to recover. - NSError *error = [NSError errorWithDomain:NSPOSIXErrorDomain code:errno userInfo:nil]; // underlying error - if (outError) - *outError = [NSError localErrorWithCode:kBDSKCannotCreateTemporaryFileError localizedDescription:[NSString stringWithFormat:@"Unable to create unique file from %@.", filename] underlyingError:error]; - return nil; - } - } + NSString *tempFileName = nil; - if (outError) - *outError = [NSError localErrorWithCode:kBDSKCannotCreateTemporaryFileError localizedDescription:[NSString stringWithFormat:@"Unable to find a variant of %@ that didn't already exist.", filename]]; - return nil; -} - -// This method is copied and modified from NSFileManager-OFExtensions.m -// Note that if this returns an error, a common course of action would be to put the temporary file in the same folder as the original file. This has the same security problems as -uniqueFilenameFromName:, of course, so we don't want to do that by default. The calling code should make this decision. -- (NSString *)temporaryDirectoryForFileSystemContainingPath:(NSString *)path error:(NSError **)outError; -/*" Returns the path to the 'Temporary Items' folder on the same filesystem as the given path. Returns an error if there is a problem (for example, iDisk doesn't have temporary folders). The returned directory should be only readable by the calling user, so files written into this directory can be written with the desired final permissions without worrying about security (the expectation being that you'll soon call -exchangeFileAtPath:withFileAtPath:). "*/ -{ + // first find the Temporary Items folder for the volume containing path // The file in question might not exist yet. This loop assumes that it will terminate due to '/' always being valid. OSErr err; FSRef ref; @@ -415,43 +361,43 @@ return nil; } - NSString *temporaryItemsPath = findSpecialFolder(catalogInfo.volume, kTemporaryFolderType, kCreateFolder); - if (temporaryItemsPath == nil) { + NSString *tempItemsPath = findSpecialFolder(catalogInfo.volume, kTemporaryFolderType, kCreateFolder); + if (tempItemsPath == nil) { NSError *error = [NSError errorWithDomain:NSOSStatusErrorDomain code:err userInfo:nil]; // underlying error if (outError) *outError = [NSError localErrorWithCode:kBDSKCannotFindTemporaryDirectoryError localizedDescription:[NSString stringWithFormat:@"Unable to find temporary items directory for '%@'", path] underlyingError:error]; } - return temporaryItemsPath; -} - -// This method is copied and modified from NSFileManager-OFExtensions.m -// Note that due to the permissions behavior of FSFindFolder, this shouldn't have the security problems that raw calls to -uniqueFilenameFromName: may have. -- (NSString *)temporaryPathForWritingToPath:(NSString *)path error:(NSError **)outError -/*" Returns a unique filename in the -temporaryDirectoryForFileSystemContainingPath: for the filesystem containing the given path. The returned path is suitable for writing to and then replacing the input path using -replaceFileAtPath:withFileAtPath:handler:. This means that the result should never be equal to the input path. If no suitable temporary items folder is found and allowOriginalDirectory is NO, this will raise. If allowOriginalDirectory is YES, on the other hand, this will return a file name in the same folder. Note that passing YES for allowOriginalDirectory could potentially result in security implications of the form noted with -uniqueFilenameFromName:. "*/ -{ - BDSKPRECONDITION(![NSString isEmptyString:path]); - - NSString *temporaryFilePath = nil; - NSString *dir = [self temporaryDirectoryForFileSystemContainingPath:path error:outError]; - if (dir) { - temporaryFilePath = [dir stringByAppendingPathComponent:[path lastPathComponent]]; + if (tempItemsPath) { // Don't pass in paths that are already inside Temporary Items or you might get back the same path you passed in. - BDSKASSERT(![temporaryFilePath isEqualToString:path]); - temporaryFilePath = [self uniqueFilenameFromName:temporaryFilePath error:outError]; + if (tempFileName = [self uniqueFilePathWithName:[path lastPathComponent] atPath:tempItemsPath]) { + int fd = open((const char *)[self fileSystemRepresentationWithPath:tempFileName], O_EXCL | O_WRONLY | O_CREAT | O_TRUNC, 0666); + if (fd != -1) + close(fd); // no unlink, were are on the 'create' branch + else if (errno != EEXIST) + tempFileName = nil; + } } - if (!temporaryFilePath) { + if (tempFileName == nil) { if (outError) *outError = nil; // Ignore any previous error // Try to use the same directory. Can't just call -uniqueFilenameFromName:path since we want a NEW file name (-uniqueFilenameFromName: would just return the input path and the caller expecting a path where it can put something temporarily, i.e., different from the input path). - temporaryFilePath = [self uniqueFilenameFromName:path error:outError]; + if (tempFileName = [self uniqueFilePathWithName:[path lastPathComponent] atPath:[path stringByDeletingLastPathComponent]]) { + int fd = open((const char *)[self fileSystemRepresentationWithPath:tempFileName], O_EXCL | O_WRONLY | O_CREAT | O_TRUNC, 0666); + if (fd != -1) + close(fd); // no unlink, were are on the 'create' branch + else if (errno != EEXIST) + tempFileName = nil; + } } - BDSKPOSTCONDITION(!temporaryFilePath || [self fileExistsAtPath:temporaryFilePath]); - BDSKPOSTCONDITION(!temporaryFilePath || (![path isEqualToString:temporaryFilePath])); + if (tempFileName == nil && outError) + *outError = [NSError localErrorWithCode:kBDSKCannotCreateTemporaryFileError localizedDescription:[NSString stringWithFormat:@"Unable to create unique file for %@.", path]]; - return temporaryFilePath; + BDSKPOSTCONDITION(!tempFileName || [self fileExistsAtPath:tempFileName] || ![path isEqualToString:tempFileName]); + + return tempFileName; } - (NSString *)temporaryFileWithBasename:(NSString *)fileName { This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ho...@us...> - 2009-04-16 22:55:36
|
Revision: 15072 http://bibdesk.svn.sourceforge.net/bibdesk/?rev=15072&view=rev Author: hofman Date: 2009-04-16 22:55:26 +0000 (Thu, 16 Apr 2009) Log Message: ----------- invert error check Modified Paths: -------------- trunk/bibdesk/NSFileManager_BDSKExtensions.m Modified: trunk/bibdesk/NSFileManager_BDSKExtensions.m =================================================================== --- trunk/bibdesk/NSFileManager_BDSKExtensions.m 2009-04-16 21:41:46 UTC (rev 15071) +++ trunk/bibdesk/NSFileManager_BDSKExtensions.m 2009-04-16 22:55:26 UTC (rev 15072) @@ -173,20 +173,21 @@ static NSString *findSpecialFolder(FSVolumeRefNum domain, OSType folderType, Boolean createFolder) { FSRef foundRef; OSStatus err = noErr; + CFURLRef url = NULL; + NSString *path = nil; err = FSFindFolder(domain, folderType, createFolder, &foundRef); - if (err == noErr) + if (err != noErr) NSLog(@"Error %d: the system was unable to find your folder of type %i in domain %i.", err, folderType, domain); + else + url = CFURLCreateFromFSRef(kCFAllocatorDefault, &foundRef); - CFURLRef url = CFURLCreateFromFSRef(kCFAllocatorDefault, &foundRef); - NSString *retStr = nil; - - if(url != nil){ - retStr = [(NSURL *)url path]; + if(url != NULL){ + path = [(NSURL *)url path]; CFRelease(url); } - return retStr; + return path; } - (NSString *)currentApplicationSupportPathForCurrentUser{ This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ho...@us...> - 2009-05-07 09:36:42
|
Revision: 15280 http://bibdesk.svn.sourceforge.net/bibdesk/?rev=15280&view=rev Author: hofman Date: 2009-05-07 09:36:38 +0000 (Thu, 07 May 2009) Log Message: ----------- NSString does not have an unsignedIntValue, so use intValue Modified Paths: -------------- trunk/bibdesk/NSFileManager_BDSKExtensions.m Modified: trunk/bibdesk/NSFileManager_BDSKExtensions.m =================================================================== --- trunk/bibdesk/NSFileManager_BDSKExtensions.m 2009-05-07 04:58:29 UTC (rev 15279) +++ trunk/bibdesk/NSFileManager_BDSKExtensions.m 2009-05-07 09:36:38 UTC (rev 15280) @@ -1008,7 +1008,7 @@ NSParameterAssert(0 != nsEncoding); CFStringEncoding cfEncoding = CFStringConvertNSStringEncodingToEncoding(nsEncoding); CFStringRef name = CFStringConvertEncodingToIANACharSetName(cfEncoding); - NSString *encodingString = [NSString stringWithFormat:@"%@;%ld", name, (long)cfEncoding]; + NSString *encodingString = [NSString stringWithFormat:@"%@;%u", name, cfEncoding]; return [[SKNExtendedAttributeManager sharedNoSplitManager] setExtendedAttributeNamed:@"com.apple.TextEncoding" toValue:[encodingString dataUsingEncoding:NSUTF8StringEncoding] atPath:path options:0 error:error]; } @@ -1036,7 +1036,7 @@ // currently only two elements, but may become arbitrarily long in future if ([array count] >= 2) { - CFStringEncoding cfEncoding = [[array objectAtIndex:1] unsignedIntValue]; + CFStringEncoding cfEncoding = [[array objectAtIndex:1] intValue]; nsEncoding = CFStringConvertEncodingToNSStringEncoding(cfEncoding); } else if ([array count] > 0) { This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ho...@us...> - 2009-05-08 17:05:16
|
Revision: 15288 http://bibdesk.svn.sourceforge.net/bibdesk/?rev=15288&view=rev Author: hofman Date: 2009-05-08 17:05:08 +0000 (Fri, 08 May 2009) Log Message: ----------- don't get problems with unique file names without extension Modified Paths: -------------- trunk/bibdesk/NSFileManager_BDSKExtensions.m Modified: trunk/bibdesk/NSFileManager_BDSKExtensions.m =================================================================== --- trunk/bibdesk/NSFileManager_BDSKExtensions.m 2009-05-08 14:14:56 UTC (rev 15287) +++ trunk/bibdesk/NSFileManager_BDSKExtensions.m 2009-05-08 17:05:08 UTC (rev 15288) @@ -445,7 +445,10 @@ @synchronized(self) { // if the file exists, try /directory/filename-i.extension while([self fileExistsAtPath:fullPath]) - fullPath = [directory stringByAppendingPathComponent:[[NSString stringWithFormat:@"%@-%lu", baseName, (unsigned long)++i] stringByAppendingPathExtension:extension]]; + fullPath = [directory stringByAppendingPathComponent:[NSString stringWithFormat:@"%@-%lu", baseName, (unsigned long)++i]]; + if (extension) + fullPath = [fullPath stringByAppendingPathExtension:extension]; + } return fullPath; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ho...@us...> - 2009-06-09 22:43:07
|
Revision: 15401 http://bibdesk.svn.sourceforge.net/bibdesk/?rev=15401&view=rev Author: hofman Date: 2009-06-09 22:42:05 +0000 (Tue, 09 Jun 2009) Log Message: ----------- fix grouping in unique filename method Modified Paths: -------------- trunk/bibdesk/NSFileManager_BDSKExtensions.m Modified: trunk/bibdesk/NSFileManager_BDSKExtensions.m =================================================================== --- trunk/bibdesk/NSFileManager_BDSKExtensions.m 2009-06-09 20:55:43 UTC (rev 15400) +++ trunk/bibdesk/NSFileManager_BDSKExtensions.m 2009-06-09 22:42:05 UTC (rev 15401) @@ -443,12 +443,12 @@ // this method is always invoked from the main thread, but we don't want multiple threads in temporaryBaseDirectory (which may be passed as directory here); could make the lock conditional, but performance isn't a concern here @synchronized(self) { - // if the file exists, try /directory/filename-i.extension - while([self fileExistsAtPath:fullPath]) - fullPath = [directory stringByAppendingPathComponent:[NSString stringWithFormat:@"%@-%lu", baseName, (unsigned long)++i]]; - if (extension) - fullPath = [fullPath stringByAppendingPathExtension:extension]; - + // if the file exists, try /directory/filename-i.extension + while([self fileExistsAtPath:fullPath]) { + fullPath = [directory stringByAppendingPathComponent:[NSString stringWithFormat:@"%@-%lu", baseName, (unsigned long)++i]]; + if (extension) + fullPath = [fullPath stringByAppendingPathExtension:extension]; + } } return fullPath; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ho...@us...> - 2009-06-29 10:26:42
|
Revision: 15473 http://bibdesk.svn.sourceforge.net/bibdesk/?rev=15473&view=rev Author: hofman Date: 2009-06-29 10:26:40 +0000 (Mon, 29 Jun 2009) Log Message: ----------- delete directory content in thread safe delete method, FSDeleteObject only works for empty directories Modified Paths: -------------- trunk/bibdesk/NSFileManager_BDSKExtensions.m Modified: trunk/bibdesk/NSFileManager_BDSKExtensions.m =================================================================== --- trunk/bibdesk/NSFileManager_BDSKExtensions.m 2009-06-29 04:58:39 UTC (rev 15472) +++ trunk/bibdesk/NSFileManager_BDSKExtensions.m 2009-06-29 10:26:40 UTC (rev 15473) @@ -624,6 +624,79 @@ return exists; } +// The following function is copied from Apple's MoreFilesX sample project + +struct FSDeleteContainerGlobals +{ + OSErr result; /* result */ + ItemCount actualObjects; /* number of objects returned */ + FSCatalogInfo catalogInfo; /* FSCatalogInfo */ +}; +typedef struct FSDeleteContainerGlobals FSDeleteContainerGlobals; + +static +void +FSDeleteContainerLevel( + const FSRef *container, + FSDeleteContainerGlobals *theGlobals) +{ + /* level locals */ + FSIterator iterator; + FSRef itemToDelete; + UInt16 nodeFlags; + + /* Open FSIterator for flat access and give delete optimization hint */ + theGlobals->result = FSOpenIterator(container, kFSIterateFlat + kFSIterateDelete, &iterator); + require_noerr(theGlobals->result, FSOpenIterator); + + /* delete the contents of the directory */ + do + { + /* get 1 item to delete */ + theGlobals->result = FSGetCatalogInfoBulk(iterator, 1, &theGlobals->actualObjects, + NULL, kFSCatInfoNodeFlags, &theGlobals->catalogInfo, + &itemToDelete, NULL, NULL); + if ( (noErr == theGlobals->result) && (1 == theGlobals->actualObjects) ) + { + /* save node flags in local in case we have to recurse */ + nodeFlags = theGlobals->catalogInfo.nodeFlags; + + /* is it a file or directory? */ + if ( 0 != (nodeFlags & kFSNodeIsDirectoryMask) ) + { + /* it's a directory -- delete its contents before attempting to delete it */ + FSDeleteContainerLevel(&itemToDelete, theGlobals); + } + /* are we still OK to delete? */ + if ( noErr == theGlobals->result ) + { + /* is item locked? */ + if ( 0 != (nodeFlags & kFSNodeLockedMask) ) + { + /* then attempt to unlock it (ignore result since FSDeleteObject will set it correctly) */ + theGlobals->catalogInfo.nodeFlags = nodeFlags & ~kFSNodeLockedMask; + (void) FSSetCatalogInfo(&itemToDelete, kFSCatInfoNodeFlags, &theGlobals->catalogInfo); + } + /* delete the item */ + theGlobals->result = FSDeleteObject(&itemToDelete); + } + } + } while ( noErr == theGlobals->result ); + + /* we found the end of the items normally, so return noErr */ + if ( errFSNoMoreItems == theGlobals->result ) + { + theGlobals->result = noErr; + } + + /* close the FSIterator (closing an open iterator should never fail) */ + verify_noerr(FSCloseIterator(iterator)); + +FSOpenIterator: + + return; +} + - (BOOL)deleteObjectAtFileURL:(NSURL *)fileURL error:(NSError **)error{ NSParameterAssert(fileURL != nil); NSParameterAssert([fileURL isFileURL]); @@ -642,13 +715,28 @@ } } - if(NO == success && error != nil) + if(NO == success && error != NULL) *error = [NSError errorWithDomain:NSCocoaErrorDomain code:0 userInfo:[NSDictionary dictionaryWithObject:NSLocalizedString(@"File does not exist.", @"Error description") forKey:NSLocalizedDescriptionKey]]; if(success){ - success = (noErr == FSDeleteObject(&fileRef)); - if(NO == success && error != nil) + FSCatalogInfo catalogInfo; + success = (noErr == FSGetCatalogInfo(&fileRef, kFSCatInfoNodeFlags, &catalogInfo, NULL, NULL, NULL)); + if(NO == success && error != NULL) *error = [NSError errorWithDomain:NSCocoaErrorDomain code:0 userInfo:[NSDictionary dictionaryWithObject:NSLocalizedString(@"Unable to delete file.", @"Error description") forKey:NSLocalizedDescriptionKey]]; + + if(success && 0 != (catalogInfo.nodeFlags & kFSNodeIsDirectoryMask)){ + FSDeleteContainerGlobals theGlobals; + FSDeleteContainerLevel(&fileRef, &theGlobals); + success = (noErr == theGlobals.result); + if(NO == success && error != NULL) + *error = [NSError errorWithDomain:NSCocoaErrorDomain code:0 userInfo:[NSDictionary dictionaryWithObject:NSLocalizedString(@"Unable to delete directory contents.", @"Error description") forKey:NSLocalizedDescriptionKey]]; + } + + if(success){ + success = (noErr == FSDeleteObject(&fileRef)); + if(NO == success && error != NULL) + *error = [NSError errorWithDomain:NSCocoaErrorDomain code:0 userInfo:[NSDictionary dictionaryWithObject:NSLocalizedString(@"Unable to delete file.", @"Error description") forKey:NSLocalizedDescriptionKey]]; + } } return success; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ho...@us...> - 2009-07-12 10:04:23
|
Revision: 15522 http://bibdesk.svn.sourceforge.net/bibdesk/?rev=15522&view=rev Author: hofman Date: 2009-07-12 10:04:16 +0000 (Sun, 12 Jul 2009) Log Message: ----------- only copy finder comment on 10.4, because NSFileManager on 10.5 already preserves it Modified Paths: -------------- trunk/bibdesk/NSFileManager_BDSKExtensions.m Modified: trunk/bibdesk/NSFileManager_BDSKExtensions.m =================================================================== --- trunk/bibdesk/NSFileManager_BDSKExtensions.m 2009-07-12 05:00:43 UTC (rev 15521) +++ trunk/bibdesk/NSFileManager_BDSKExtensions.m 2009-07-12 10:04:16 UTC (rev 15522) @@ -860,11 +860,13 @@ success = CFURLGetFSRef((CFURLRef)dstURL, &dstDirRef); OSErr err = noErr; - NSString *comment = [self commentForURL:srcURL]; + NSString *comment = nil FSRef newObjectRef; - - // unfortunately, FSCopyObjectSync does not copy Spotlight comments (and neither does NSFileManager) rdar://problem/4531819 + // unfortunately, FSCopyObjectSync does not copy Spotlight comments on Tiger (and neither does NSFileManager) rdar://problem/4531819 + if (floor(NSAppKitVersionNumber) <= NSAppKitVersionNumber10_4) + comment = [self commentForURL:srcURL]; + err = FSCopyObjectSync(&srcFileRef, &dstDirRef, NULL, &newObjectRef, 0); // set the file comment if necessary @@ -876,8 +878,8 @@ } else { err = coreFoundationUnknownErr; } - } - + } + if(NO == success && error != nil){ NSString *errorMessage = nil; if(noErr != err) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ho...@us...> - 2009-12-14 12:28:46
|
Revision: 16333 http://bibdesk.svn.sourceforge.net/bibdesk/?rev=16333&view=rev Author: hofman Date: 2009-12-14 12:28:36 +0000 (Mon, 14 Dec 2009) Log Message: ----------- fix searching for applications folder Modified Paths: -------------- trunk/bibdesk/NSFileManager_BDSKExtensions.m Modified: trunk/bibdesk/NSFileManager_BDSKExtensions.m =================================================================== --- trunk/bibdesk/NSFileManager_BDSKExtensions.m 2009-12-14 12:14:10 UTC (rev 16332) +++ trunk/bibdesk/NSFileManager_BDSKExtensions.m 2009-12-14 12:28:36 UTC (rev 16333) @@ -228,7 +228,7 @@ } - (NSString *)applicationsDirectory{ - NSString *path = findSpecialFolder(kLocalDomain, kApplicationSupportFolderType, kDontCreateFolder); + NSString *path = findSpecialFolder(kLocalDomain, kApplicationsFolderType, kDontCreateFolder); if(path == nil){ path = @"/Applications"; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ho...@us...> - 2009-12-14 12:59:24
|
Revision: 16336 http://bibdesk.svn.sourceforge.net/bibdesk/?rev=16336&view=rev Author: hofman Date: 2009-12-14 12:59:12 +0000 (Mon, 14 Dec 2009) Log Message: ----------- create appsupport directory if needed. get app folder from local domain. rename method. Modified Paths: -------------- trunk/bibdesk/NSFileManager_BDSKExtensions.m Modified: trunk/bibdesk/NSFileManager_BDSKExtensions.m =================================================================== --- trunk/bibdesk/NSFileManager_BDSKExtensions.m 2009-12-14 12:47:40 UTC (rev 16335) +++ trunk/bibdesk/NSFileManager_BDSKExtensions.m 2009-12-14 12:59:12 UTC (rev 16336) @@ -180,7 +180,7 @@ static NSString *path = nil; if(path == nil){ - path = [NSSearchPathForDirectoriesInDomains(NSApplicationDirectory, NSUserDomainMask, YES) firstObject]; + path = [NSSearchPathForDirectoriesInDomains(NSApplicationSupportDirectory, NSUserDomainMask, YES) firstObject]; NSString *appName = [[NSBundle mainBundle] objectForInfoDictionaryKey:(NSString *)kCFBundleNameKey]; if(appName == nil) @@ -194,7 +194,7 @@ BOOL pathIsDir; dirExists = [self fileExistsAtPath:path isDirectory:&pathIsDir]; if(dirExists == NO || pathIsDir == NO) - [self createDirectoryAtPath:path withIntermediateDirectories:NO attributes:nil error:NULL]; + [self createDirectoryAtPath:path withIntermediateDirectories:YES attributes:nil error:NULL]; // make sure it was created dirExists = [self fileExistsAtPath:path isDirectory:&pathIsDir]; NSAssert1(dirExists && pathIsDir, @"Unable to create folder %@", path); @@ -205,7 +205,7 @@ } - (NSString *)applicationsDirectory{ - NSString *path = [NSSearchPathForDirectoriesInDomains(NSApplicationDirectory, NSUserDomainMask, YES) firstObject]; + NSString *path = [NSSearchPathForDirectoriesInDomains(NSApplicationDirectory, NSLocalDomainMask, YES) firstObject]; if (path == nil) { path = @"/Applications"; @@ -229,7 +229,7 @@ return downloadsPath ? [NSURL fileURLWithPath:downloadsPath] : nil; } -- (NSString *)newestLyXPipePath { +- (NSString *)latestLyXPipePath { NSString *appSupportPath = [NSSearchPathForDirectoriesInDomains(NSApplicationSupportDirectory, NSUserDomainMask, YES) firstObject]; NSDirectoryEnumerator *dirEnum = [self enumeratorAtPath:appSupportPath]; NSString *file; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ho...@us...> - 2010-03-21 09:57:10
|
Revision: 16775 http://bibdesk.svn.sourceforge.net/bibdesk/?rev=16775&view=rev Author: hofman Date: 2010-03-21 09:57:03 +0000 (Sun, 21 Mar 2010) Log Message: ----------- copy template files from sharedsupport, not from app support Modified Paths: -------------- trunk/bibdesk/NSFileManager_BDSKExtensions.m Modified: trunk/bibdesk/NSFileManager_BDSKExtensions.m =================================================================== --- trunk/bibdesk/NSFileManager_BDSKExtensions.m 2010-03-21 06:34:38 UTC (rev 16774) +++ trunk/bibdesk/NSFileManager_BDSKExtensions.m 2010-03-21 09:57:03 UTC (rev 16775) @@ -282,12 +282,13 @@ NSString *applicationSupport = [self currentApplicationSupportPathForCurrentUser]; NSString *templates = @"Templates"; NSString *templatesPath = [applicationSupport stringByAppendingPathComponent:templates]; - BOOL success = NO; + BOOL success = YES; if ([self fileExistsAtPath:templatesPath isDirectory:&success] == NO) success = [self createDirectoryAtPath:templatesPath withIntermediateDirectories:NO attributes:nil error:NULL]; if (success) { - for (NSString *file in [self contentsOfDirectoryAtPath:templatesPath error:NULL]) { + NSString *sourcePath = [[[NSBundle mainBundle] sharedSupportPath] stringByAppendingPathComponent:templates]; + for (NSString *file in [self contentsOfDirectoryAtPath:sourcePath error:NULL]) { if ([file hasPrefix:@"."] == NO) [self copyFileFromSharedSupportToApplicationSupport:[templates stringByAppendingPathComponent:file] overwrite:overwrite]; } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ho...@us...> - 2010-10-02 09:38:04
|
Revision: 17168 http://bibdesk.svn.sourceforge.net/bibdesk/?rev=17168&view=rev Author: hofman Date: 2010-10-02 09:37:57 +0000 (Sat, 02 Oct 2010) Log Message: ----------- remove unneeded alternative and wrong temporary directory path Modified Paths: -------------- trunk/bibdesk/NSFileManager_BDSKExtensions.m Modified: trunk/bibdesk/NSFileManager_BDSKExtensions.m =================================================================== --- trunk/bibdesk/NSFileManager_BDSKExtensions.m 2010-10-02 06:36:29 UTC (rev 17167) +++ trunk/bibdesk/NSFileManager_BDSKExtensions.m 2010-10-02 09:37:57 UTC (rev 17168) @@ -375,7 +375,7 @@ } - (NSString *)temporaryFileWithBasename:(NSString *)fileName { - return [self uniqueFilePathWithName:fileName atPath:temporaryBaseDirectory ?: [[NSProcessInfo processInfo] globallyUniqueString]]; + return [self uniqueFilePathWithName:fileName atPath:temporaryBaseDirectory]; } // This method is subject to a race condition in our temporary directory if we pass the same baseName to this method and temporaryFileWithBasename: simultaneously; hence the lock in uniqueFilePathWithName:atPath:, even though it and temporaryFileWithBasename: are not thread safe or secure. This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ho...@us...> - 2011-11-14 10:46:15
|
Revision: 18216 http://bibdesk.svn.sourceforge.net/bibdesk/?rev=18216&view=rev Author: hofman Date: 2011-11-14 10:46:08 +0000 (Mon, 14 Nov 2011) Log Message: ----------- use new OpenMeta location for tags and ratings, why did they have to change this? Modified Paths: -------------- trunk/bibdesk/NSFileManager_BDSKExtensions.m Modified: trunk/bibdesk/NSFileManager_BDSKExtensions.m =================================================================== --- trunk/bibdesk/NSFileManager_BDSKExtensions.m 2011-11-14 07:35:10 UTC (rev 18215) +++ trunk/bibdesk/NSFileManager_BDSKExtensions.m 2011-11-14 10:46:08 UTC (rev 18216) @@ -78,8 +78,8 @@ #import <SkimNotesBase/SkimNotesBase.h> #import <CoreServices/CoreServices.h> -#define OPEN_META_TAGS_KEY @"com.apple.metadata:kOMUserTags" -#define OPEN_META_RATING_KEY @"com.apple.metadata:kOMStarRating" +#define OPEN_META_TAGS_KEY @"com.apple.metadata:kMDItemOMUserTags" +#define OPEN_META_RATING_KEY @"com.apple.metadata:kMDItemStarRating" /* The WLDragMapHeaderStruct stuff was borrowed from CocoaTech Foundation, http://www.cocoatech.com (BSD licensed). This is used for creating WebLoc files, which are a resource-only Finder clipping. Apple provides no API for creating them, so apparently everyone just reverse-engineers the resource file format and creates them. Since I have no desire to mess with ResEdit anymore, we're borrowing this code directly and using Omni's resource fork methods to create the file. Note that you can check the contents of a resource fork in Terminal with `cat somefile/rsrc`, not that it's incredibly helpful. This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ho...@us...> - 2011-11-14 13:15:35
|
Revision: 18217 http://bibdesk.svn.sourceforge.net/bibdesk/?rev=18217&view=rev Author: hofman Date: 2011-11-14 13:15:28 +0000 (Mon, 14 Nov 2011) Log Message: ----------- write openmeta tag time when writing tags, unused Modified Paths: -------------- trunk/bibdesk/NSFileManager_BDSKExtensions.m Modified: trunk/bibdesk/NSFileManager_BDSKExtensions.m =================================================================== --- trunk/bibdesk/NSFileManager_BDSKExtensions.m 2011-11-14 10:46:08 UTC (rev 18216) +++ trunk/bibdesk/NSFileManager_BDSKExtensions.m 2011-11-14 13:15:28 UTC (rev 18217) @@ -79,54 +79,9 @@ #import <CoreServices/CoreServices.h> #define OPEN_META_TAGS_KEY @"com.apple.metadata:kMDItemOMUserTags" +#define OPEN_META_TAG_TIME_KEY @"com.apple.metadata:kMDItemOMUserTagTime" #define OPEN_META_RATING_KEY @"com.apple.metadata:kMDItemStarRating" -/* -The WLDragMapHeaderStruct stuff was borrowed from CocoaTech Foundation, http://www.cocoatech.com (BSD licensed). This is used for creating WebLoc files, which are a resource-only Finder clipping. Apple provides no API for creating them, so apparently everyone just reverse-engineers the resource file format and creates them. Since I have no desire to mess with ResEdit anymore, we're borrowing this code directly and using Omni's resource fork methods to create the file. Note that you can check the contents of a resource fork in Terminal with `cat somefile/rsrc`, not that it's incredibly helpful. -*/ - -#if !__LP64__ -#pragma options align=mac68k -#endif - -typedef struct WLDragMapHeaderStruct -{ - long mapVersion; // always 1 - long unused1; // always 0 - long unused2; // always 0 - short unused; - short numEntries; // number of repeating WLDragMapEntries -} WLDragMapHeaderStruct; - -typedef struct WLDragMapEntryStruct -{ - OSType type; - short unused; // always 0 - ResID resID; // always 128 or 256? - long unused1; // always 0 - long unused2; // always 0 -} WLDragMapEntryStruct; - -#if !__LP64__ -#pragma options align=reset -#endif - -@interface WLDragMapEntry : NSObject -{ - OSType _type; - ResID _resID; -} - -+ (id)entryWithType:(OSType)type resID:(NSInteger)resID; -+ (NSData*)dragDataWithEntries:(NSArray*)entries; - -- (OSType)type; -- (ResID)resID; -- (NSData*)entryData; - -@end - - @implementation NSFileManager (BDSKExtensions) static NSString *temporaryBaseDirectory = nil; @@ -880,10 +835,13 @@ } - (BOOL)setOpenMetaTags:(NSArray *)tags atPath:(NSString *)path error:(NSError **)error { - if (tags) + if (tags) { + [[SKNExtendedAttributeManager sharedNoSplitManager] setExtendedAttributeNamed:OPEN_META_TAG_TIME_KEY toPropertyListValue:[NSDate date] atPath:path options:kSKNXattrNoCompress error:error]; return [[SKNExtendedAttributeManager sharedNoSplitManager] setExtendedAttributeNamed:OPEN_META_TAGS_KEY toPropertyListValue:tags atPath:path options:kSKNXattrNoCompress error:error]; - else + } else { + [[SKNExtendedAttributeManager sharedNoSplitManager] removeExtendedAttributeNamed:OPEN_META_TAG_TIME_KEY atPath:path traverseLink:YES error:error]; return [[SKNExtendedAttributeManager sharedNoSplitManager] removeExtendedAttributeNamed:OPEN_META_TAGS_KEY atPath:path traverseLink:YES error:error]; + } } - (NSNumber *)openMetaRatingAtPath:(NSString *)path error:(NSError **)error { @@ -898,66 +856,3 @@ } @end - -@implementation WLDragMapEntry - -- (id)initWithType:(OSType)type resID:(NSInteger)resID; -{ - self = [super init]; - - _type = type; - _resID = resID; - - return self; -} - -+ (id)entryWithType:(OSType)type resID:(NSInteger)resID; -{ - WLDragMapEntry* result = [[WLDragMapEntry alloc] initWithType:type resID:resID]; - - return [result autorelease]; -} - -- (OSType)type; -{ - return _type; -} - -- (ResID)resID; -{ - return _resID; -} - -- (NSData*)entryData; -{ - WLDragMapEntryStruct result; - - // zero the structure - memset(&result, 0, sizeof(result)); - - result.type = _type; - result.resID = _resID; - - return [NSData dataWithBytes:&result length:sizeof(result)]; -} - -+ (NSData*)dragDataWithEntries:(NSArray*)entries; -{ - NSMutableData *result; - WLDragMapHeaderStruct header; - - // zero the structure - memset(&header, 0, sizeof(WLDragMapHeaderStruct)); - - header.mapVersion = 1; - header.numEntries = [entries count]; - - result = [NSMutableData dataWithBytes:&header length:sizeof(WLDragMapHeaderStruct)]; - - for (WLDragMapEntry *entry in entries) - [result appendData:[entry entryData]]; - - return result; -} - -@end This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ho...@us...> - 2013-12-11 18:12:53
|
Revision: 19543 http://sourceforge.net/p/bibdesk/svn/19543 Author: hofman Date: 2013-12-11 18:12:48 +0000 (Wed, 11 Dec 2013) Log Message: ----------- make sure temporary file name is not nil Modified Paths: -------------- trunk/bibdesk/NSFileManager_BDSKExtensions.m Modified: trunk/bibdesk/NSFileManager_BDSKExtensions.m =================================================================== --- trunk/bibdesk/NSFileManager_BDSKExtensions.m 2013-12-11 15:52:11 UTC (rev 19542) +++ trunk/bibdesk/NSFileManager_BDSKExtensions.m 2013-12-11 18:12:48 UTC (rev 19543) @@ -330,6 +330,8 @@ } - (NSString *)temporaryFileWithBasename:(NSString *)fileName { + if (fileName == nil) + fileName = [(NSString *)BDCreateUniqueString() autorelease]; return [self uniqueFilePathWithName:fileName atPath:temporaryBaseDirectory]; } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ho...@us...> - 2014-03-10 11:05:46
|
Revision: 19666 http://sourceforge.net/p/bibdesk/svn/19666 Author: hofman Date: 2014-03-10 11:05:41 +0000 (Mon, 10 Mar 2014) Log Message: ----------- fix search for newest lyx pipe path, version was essentially ignored Modified Paths: -------------- trunk/bibdesk/NSFileManager_BDSKExtensions.m Modified: trunk/bibdesk/NSFileManager_BDSKExtensions.m =================================================================== --- trunk/bibdesk/NSFileManager_BDSKExtensions.m 2014-03-10 10:32:34 UTC (rev 19665) +++ trunk/bibdesk/NSFileManager_BDSKExtensions.m 2014-03-10 11:05:41 UTC (rev 19666) @@ -198,18 +198,10 @@ [dirEnum skipDescendents]; NSString *pipePath = [fullPath stringByAppendingPathComponent:@".lyxpipe.in"]; if ([file hasPrefix:@"LyX"] && [self fileExistsAtPath:pipePath]) { - if (version == nil) { + BDSKVersionNumber *fileVersion = [[[BDSKVersionNumber alloc] initWithVersionString:([file hasPrefix:@"LyX-"] ? [file substringFromIndex:4] : @"")] autorelease]; + if (version == nil || [fileVersion compare:version] == NSOrderedDescending) { lyxPipePath = pipePath; - } else { - BDSKVersionNumber *fileVersion = nil; - if ([file hasPrefix:@"LyX-"]) - fileVersion = [[[BDSKVersionNumber alloc] initWithVersionString:[file substringFromIndex:4]] autorelease]; - else - fileVersion = [[[BDSKVersionNumber alloc] initWithVersionString:@""] autorelease]; - if ([fileVersion compare:version] == NSOrderedDescending) { - lyxPipePath = pipePath; - version = fileVersion; - } + version = fileVersion; } } } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |