From: <ama...@us...> - 2008-01-12 05:16:06
|
Revision: 12433 http://bibdesk.svn.sourceforge.net/bibdesk/?rev=12433&view=rev Author: amaxwell Date: 2008-01-11 21:16:11 -0800 (Fri, 11 Jan 2008) Log Message: ----------- Move safe save override to a loadable bundle that can build against Leopard. Compiled only as part of the BibDesk+QuickLook target. Modified Paths: -------------- trunk/bibdesk/BDSKAppController.m trunk/bibdesk/BibDocument.m trunk/bibdesk/Bibdesk.xcodeproj/project.pbxproj Added Paths: ----------- trunk/bibdesk/BibDocument_Leopard.h trunk/bibdesk/BibDocument_Leopard.m trunk/bibdesk/Leopard-Info.plist Modified: trunk/bibdesk/BDSKAppController.m =================================================================== --- trunk/bibdesk/BDSKAppController.m 2008-01-12 05:15:03 UTC (rev 12432) +++ trunk/bibdesk/BDSKAppController.m 2008-01-12 05:16:11 UTC (rev 12433) @@ -112,6 +112,9 @@ // make sure we use Spotlight's plugins on 10.4 and later SKLoadDefaultExtractorPlugIns(); + if (floor(NSAppKitVersionNumber) > NSAppKitVersionNumber10_4) + [[NSBundle bundleWithPath:[[NSBundle mainBundle] pathForResource:@"Leopard" ofType:@"bundle"]] load]; + [NSDateFormatter setDefaultFormatterBehavior:NSDateFormatterBehavior10_4]; OFPreferenceWrapper *pw = [OFPreferenceWrapper sharedPreferenceWrapper]; Modified: trunk/bibdesk/BibDocument.m =================================================================== --- trunk/bibdesk/BibDocument.m 2008-01-12 05:15:03 UTC (rev 12432) +++ trunk/bibdesk/BibDocument.m 2008-01-12 05:16:11 UTC (rev 12433) @@ -927,125 +927,6 @@ [super runModalSavePanelForSaveOperation:saveOperation delegate:delegate didSaveSelector:didSaveSelector contextInfo:contextInfo]; } -- (BOOL)writeSafelyToURL:(NSURL *)absoluteURL ofType:(NSString *)typeName forSaveOperation:(NSSaveOperationType)saveOperation error:(NSError **)outError; -{ - BOOL didSave = [super writeSafelyToURL:absoluteURL ofType:typeName forSaveOperation:saveOperation error:outError]; - -#ifdef MAC_OS_X_VERSION_10_5 && (MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_5) - - /* - This is a workaround for https://sourceforge.net/tracker/index.php?func=detail&aid=1867790&group_id=61487&atid=497423 - Filed as rdar://problem/5679370 - - I'm not sure what the semantics of this operation are for NSAutosaveOperation, so it's excluded (but uses a different code path anyway, at least on Leopard). This also doesn't get hit for save-as or save-to since they don't do a safe-save, but they're handled anyway. FSExchangeObjects apparently avoids the bugs in FSPathReplaceObject, but doesn't preserve all of the metadata that those do. It's a shame that Apple can't preserve the file content as well as they preserve the metadata; I'd rather lose the ACLs than lose my bibliography. - - TODO: xattr handling, package vs. flat file (overwrite directory)? - xattrs from BibDesk seem to be preserved, so I'm not going to bother with that. - - TESTED: On AFP volume served by 10.4.11 Server, saving from 10.5.1 client; on AFP volume served by 10.5.1 client, saving from 10.5.1 client. Autosave, Save-As, and Save were tested. Saving to a local HFS+ volume doesn't hit this code path, and neither does saving to a FAT-32 thumb drive. - - */ - - if (floor(NSAppKitVersionNumber) > NSAppKitVersionNumber10_4 && NO == didSave && [absoluteURL isFileURL] && NSAutosaveOperation != saveOperation) { - - // this will create a new file on the same volume as the original file, which we will overwrite - // FSExchangeObjects requires both files to be on the same volume - NSString *tmpPath = [[NSFileManager defaultManager] temporaryPathForWritingToPath:[absoluteURL path] allowOriginalDirectory:YES error:outError]; - NSURL *saveToURL = nil; - - // at this point, we're guaranteed that absoluteURL is non-nil and is a fileURL, but the file may not exist - - // save to or save as; file doesn't exist, so overwrite it - if (NSSaveOperation != saveOperation) - saveToURL = absoluteURL; - else if (nil != tmpPath) - saveToURL = [NSURL fileURLWithPath:tmpPath]; - - // if tmpPath failed, saveToURL is nil - if (nil != saveToURL) - didSave = [self writeToURL:saveToURL ofType:typeName forSaveOperation:saveOperation originalContentsURL:absoluteURL error:outError]; - - if (didSave) { - NSMutableDictionary *fattrs = [NSMutableDictionary dictionary]; - [fattrs addEntriesFromDictionary:[self fileAttributesToWriteToURL:saveToURL ofType:typeName forSaveOperation:saveOperation originalContentsURL:absoluteURL error:outError]]; - - // copy POSIX permissions from the old file - NSNumber *posixPerms = nil; - - if ([[NSFileManager defaultManager] fileExistsAtPath:[absoluteURL path]]) - posixPerms = [[[NSFileManager defaultManager] fileAttributesAtPath:[absoluteURL path] traverseLink:YES] objectForKey:NSFilePosixPermissions]; - - if (nil != posixPerms) - [fattrs setObject:posixPerms forKey:NSFilePosixPermissions]; - - // not checking return value here; non-critical - if ([fattrs count]) - [[NSFileManager defaultManager] changeFileAttributes:fattrs atPath:[saveToURL path]]; - } - - // If this is not an overwriting operation, we already saved to absoluteURL, and we're done - // If this is an overwriting operation, do an atomic swap of the files - if (didSave && NSSaveOperation == saveOperation) { - - FSRef originalRef, newRef; - OSStatus err = coreFoundationUnknownErr; - - FSCatalogInfo catalogInfo; - if (CFURLGetFSRef((CFURLRef)absoluteURL, &originalRef)) - err = noErr; - - if (noErr == err) - err = FSGetCatalogInfo(&originalRef, kFSCatInfoVolume, &catalogInfo, NULL, NULL, NULL); - - GetVolParmsInfoBuffer infoBuffer; - err = FSGetVolumeParms(catalogInfo.volume, &infoBuffer, sizeof(GetVolParmsInfoBuffer)); - - if (noErr == err) { - - // only meaningful in v3 or greater GetVolParmsInfoBuffer - SInt32 vmExtAttr = infoBuffer.vMExtendedAttributes; - - // in v2 or less or v3 without HFS+ support, the File Manager will implement FSExchangeObjects if bHasFileIDs is set - - // MoreFilesX.h has macros that show how to read the bitfields for the enums - if (infoBuffer.vMVersion > 2 && (vmExtAttr & (1L << bSupportsHFSPlusAPIs)) != 0 && (vmExtAttr & (1L << bSupportsFSExchangeObjects)) != 0) - err = noErr; - else if ((infoBuffer.vMVersion <= 2 || (vmExtAttr & (1L << bSupportsHFSPlusAPIs)) == 0) && (infoBuffer.vMAttrib & (1L << bHasFileIDs)) != 0) - err = noErr; - else - err = errFSUnknownCall; - - // do an atomic swap of the files - // On an AFP volume (Server 10.4.11), xattrs from the original file are preserved using either function - - if (noErr == err && CFURLGetFSRef((CFURLRef)saveToURL, &newRef)) { - // this avoids breaking aliases and FSRefs - err = FSExchangeObjects(&newRef, &originalRef); - } - else /* if we couldn't get an FSRef or bSupportsFSExchangeObjects is not supported */ { - // rename() is atomic, but it probably breaks aliases and FSRefs - // FSExchangeObjects() uses exchangedata() so there's no point in trying that - err = rename([[saveToURL path] fileSystemRepresentation], [[absoluteURL path] fileSystemRepresentation]); - } - } - - if (noErr != err) { - didSave = NO; - if (outError) *outError = [NSError errorWithDomain:NSOSStatusErrorDomain code:err userInfo:nil]; - } - else if ([self keepBackupFile] == NO) { - // not checking return value here; non-critical, and fails if rename() was used - [[NSFileManager defaultManager] removeFileAtPath:[saveToURL path] handler:nil]; - } - } - } -#else -#warning Safe save may be broken on Leopard -#endif - - return didSave; -} - - (BOOL)saveToURL:(NSURL *)absoluteURL ofType:(NSString *)typeName forSaveOperation:(NSSaveOperationType)saveOperation error:(NSError **)outError{ // Set the string encoding according to the popup. Added: trunk/bibdesk/BibDocument_Leopard.h =================================================================== --- trunk/bibdesk/BibDocument_Leopard.h (rev 0) +++ trunk/bibdesk/BibDocument_Leopard.h 2008-01-12 05:16:11 UTC (rev 12433) @@ -0,0 +1,44 @@ +// +// BibDocument_Leopard.h +// Bibdesk +// +// Created by Adam Maxwell on 1/11/08. +/* + This software is Copyright (c) 2008 + Adam Maxwell. All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + + - Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + - Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + + - Neither the name of Adam Maxwell nor the names of any + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#import <Cocoa/Cocoa.h> +#import "BibDocument.h" + +@interface BibDocument (Leopard) + +@end Added: trunk/bibdesk/BibDocument_Leopard.m =================================================================== --- trunk/bibdesk/BibDocument_Leopard.m (rev 0) +++ trunk/bibdesk/BibDocument_Leopard.m 2008-01-12 05:16:11 UTC (rev 12433) @@ -0,0 +1,165 @@ +// +// BibDocument_Leopard.m +// Bibdesk +// +// Created by Adam Maxwell on 1/11/08. +/* + This software is Copyright (c) 2008 + Adam Maxwell. All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + + - Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + - Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + + - Neither the name of Adam Maxwell nor the names of any + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#import "BibDocument_Leopard.h" + +// Omni's framework headers won't allow us to compile with 10.4 as min version and 10.5 as SDK. It may work to build this target with 10.5/10.5 settings and link against the Omni frameworks, but I'm not sure. +@interface NSFileManager (BDSKOFExtensions) +- (NSString *)temporaryPathForWritingToPath:(NSString *)aPath allowOriginalDirectory:(BOOL)allow error:(NSError **)outError; +@end + +@implementation BibDocument (Leopard) + +- (BOOL)writeSafelyToURL:(NSURL *)absoluteURL ofType:(NSString *)typeName forSaveOperation:(NSSaveOperationType)saveOperation error:(NSError **)outError; +{ + BOOL didSave = [super writeSafelyToURL:absoluteURL ofType:typeName forSaveOperation:saveOperation error:outError]; + + /* + This is a workaround for https://sourceforge.net/tracker/index.php?func=detail&aid=1867790&group_id=61487&atid=497423 + Filed as rdar://problem/5679370 + + I'm not sure what the semantics of this operation are for NSAutosaveOperation, so it's excluded (but uses a different code path anyway, at least on Leopard). This also doesn't get hit for save-as or save-to since they don't do a safe-save, but they're handled anyway. FSExchangeObjects apparently avoids the bugs in FSPathReplaceObject, but doesn't preserve all of the metadata that those do. It's a shame that Apple can't preserve the file content as well as they preserve the metadata; I'd rather lose the ACLs than lose my bibliography. + + TODO: xattr handling, package vs. flat file (overwrite directory)? + xattrs from BibDesk seem to be preserved, so I'm not going to bother with that. + + TESTED: On AFP volume served by 10.4.11 Server, saving from 10.5.1 client; on AFP volume served by 10.5.1 client, saving from 10.5.1 client. Autosave, Save-As, and Save were tested. Saving to a local HFS+ volume doesn't hit this code path, and neither does saving to a FAT-32 thumb drive. + + */ + + NSParameterAssert(floor(NSAppKitVersionNumber) > NSAppKitVersionNumber10_4); + + if (NO == didSave && [absoluteURL isFileURL] && NSAutosaveOperation != saveOperation) { + + NSFileManager *fileManager = [NSFileManager defaultManager]; + + // this will create a new file on the same volume as the original file, which we will overwrite + // FSExchangeObjects requires both files to be on the same volume + NSString *tmpPath = [fileManager temporaryPathForWritingToPath:[absoluteURL path] allowOriginalDirectory:YES error:outError]; + NSURL *saveToURL = nil; + + // at this point, we're guaranteed that absoluteURL is non-nil and is a fileURL, but the file may not exist + + // save to or save as; file doesn't exist, so overwrite it + if (NSSaveOperation != saveOperation) + saveToURL = absoluteURL; + else if (nil != tmpPath) + saveToURL = [NSURL fileURLWithPath:tmpPath]; + + // if tmpPath failed, saveToURL is nil + if (nil != saveToURL) + didSave = [self writeToURL:saveToURL ofType:typeName forSaveOperation:saveOperation originalContentsURL:absoluteURL error:outError]; + + if (didSave) { + NSMutableDictionary *fattrs = [NSMutableDictionary dictionary]; + [fattrs addEntriesFromDictionary:[self fileAttributesToWriteToURL:saveToURL ofType:typeName forSaveOperation:saveOperation originalContentsURL:absoluteURL error:outError]]; + + // copy POSIX permissions from the old file + NSNumber *posixPerms = nil; + + if ([fileManager fileExistsAtPath:[absoluteURL path]]) + posixPerms = [[fileManager fileAttributesAtPath:[absoluteURL path] traverseLink:YES] objectForKey:NSFilePosixPermissions]; + + if (nil != posixPerms) + [fattrs setObject:posixPerms forKey:NSFilePosixPermissions]; + + // not checking return value here; non-critical + if ([fattrs count]) + [fileManager changeFileAttributes:fattrs atPath:[saveToURL path]]; + } + + // If this is not an overwriting operation, we already saved to absoluteURL, and we're done + // If this is an overwriting operation, do an atomic swap of the files + if (didSave && NSSaveOperation == saveOperation) { + + FSRef originalRef, newRef; + OSStatus err = coreFoundationUnknownErr; + + FSCatalogInfo catalogInfo; + if (CFURLGetFSRef((CFURLRef)absoluteURL, &originalRef)) + err = noErr; + + if (noErr == err) + err = FSGetCatalogInfo(&originalRef, kFSCatInfoVolume, &catalogInfo, NULL, NULL, NULL); + + GetVolParmsInfoBuffer infoBuffer; + err = FSGetVolumeParms(catalogInfo.volume, &infoBuffer, sizeof(GetVolParmsInfoBuffer)); + + if (noErr == err) { + + // only meaningful in v3 or greater GetVolParmsInfoBuffer + SInt32 vmExtAttr = infoBuffer.vMExtendedAttributes; + + // in v2 or less or v3 without HFS+ support, the File Manager will implement FSExchangeObjects if bHasFileIDs is set + + // MoreFilesX.h has macros that show how to read the bitfields for the enums + if (infoBuffer.vMVersion > 2 && (vmExtAttr & (1L << bSupportsHFSPlusAPIs)) != 0 && (vmExtAttr & (1L << bSupportsFSExchangeObjects)) != 0) + err = noErr; + else if ((infoBuffer.vMVersion <= 2 || (vmExtAttr & (1L << bSupportsHFSPlusAPIs)) == 0) && (infoBuffer.vMAttrib & (1L << bHasFileIDs)) != 0) + err = noErr; + else + err = errFSUnknownCall; + + // do an atomic swap of the files + // On an AFP volume (Server 10.4.11), xattrs from the original file are preserved using either function + + if (noErr == err && CFURLGetFSRef((CFURLRef)saveToURL, &newRef)) { + // this avoids breaking aliases and FSRefs + err = FSExchangeObjects(&newRef, &originalRef); + } + else /* if we couldn't get an FSRef or bSupportsFSExchangeObjects is not supported */ { + // rename() is atomic, but it probably breaks aliases and FSRefs + // FSExchangeObjects() uses exchangedata() so there's no point in trying that + err = rename([[saveToURL path] fileSystemRepresentation], [[absoluteURL path] fileSystemRepresentation]); + } + } + + if (noErr != err) { + didSave = NO; + if (outError) *outError = [NSError errorWithDomain:NSOSStatusErrorDomain code:err userInfo:nil]; + } + else if ([self keepBackupFile] == NO) { + // not checking return value here; non-critical, and fails if rename() was used + [fileManager removeFileAtPath:[saveToURL path] handler:nil]; + } + } + } + return didSave; +} + +@end Modified: trunk/bibdesk/Bibdesk.xcodeproj/project.pbxproj =================================================================== --- trunk/bibdesk/Bibdesk.xcodeproj/project.pbxproj 2008-01-12 05:15:03 UTC (rev 12432) +++ trunk/bibdesk/Bibdesk.xcodeproj/project.pbxproj 2008-01-12 05:16:11 UTC (rev 12433) @@ -35,11 +35,13 @@ buildConfigurationList = F9CA0C8A0CDF944C0059D36D /* Build configuration list for PBXAggregateTarget "BibDesk+QuickLook" */; buildPhases = ( F9CA0C890CDF944C0059D36D /* CopyFiles */, + F93C37D70D387DB0006EB558 /* CopyFiles */, ); dependencies = ( F911D6C10CFE8EBD0009C77B /* PBXTargetDependency */, F9CA0C810CDF93E30059D36D /* PBXTargetDependency */, F9CA0C7F0CDF93D80059D36D /* PBXTargetDependency */, + F93C37D10D387D54006EB558 /* PBXTargetDependency */, ); name = "BibDesk+QuickLook"; productName = "BibDesk+QuickLook"; @@ -442,6 +444,9 @@ F92F4E470788DEDD001B8F82 /* genericBibDocIcon.tiff in Resources */ = {isa = PBXBuildFile; fileRef = F92F4E460788DEDD001B8F82 /* genericBibDocIcon.tiff */; }; F92F4E4F0788DEFC001B8F82 /* BibPref_Files.m in Sources */ = {isa = PBXBuildFile; fileRef = F92F4E4D0788DEFC001B8F82 /* BibPref_Files.m */; }; F938408A0906DD1F00FC37F2 /* scripthook.tiff in Resources */ = {isa = PBXBuildFile; fileRef = F93840890906DD1F00FC37F2 /* scripthook.tiff */; }; + F93C37B70D387BCB006EB558 /* BibDocument_Leopard.m in Sources */ = {isa = PBXBuildFile; fileRef = F93C37B30D387B76006EB558 /* BibDocument_Leopard.m */; }; + F93C37E60D387EA5006EB558 /* Leopard.bundle in CopyFiles */ = {isa = PBXBuildFile; fileRef = F93C37AC0D387AEE006EB558 /* Leopard.bundle */; }; + F93C38180D38820B006EB558 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */; }; F940D10A0B5568E400B5917A /* BDSKReferParser.m in Sources */ = {isa = PBXBuildFile; fileRef = F940D1080B5568E400B5917A /* BDSKReferParser.m */; }; F941135509B549BF00EE8463 /* BDSKEditorTextView.m in Sources */ = {isa = PBXBuildFile; fileRef = F941135309B549BF00EE8463 /* BDSKEditorTextView.m */; }; F941B7EB08AA574200F04ECD /* BDSKOverlay.m in Sources */ = {isa = PBXBuildFile; fileRef = F941B7E908AA574200F04ECD /* BDSKOverlay.m */; }; @@ -600,6 +605,13 @@ remoteGlobalIDString = 8DD76F960486AA7600D96B5E; remoteInfo = SkimNotesAgent; }; + F93C37D00D387D54006EB558 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */; + proxyType = 1; + remoteGlobalIDString = F93C37AB0D387AEE006EB558 /* Leopard */; + remoteInfo = Leopard; + }; F95CC112087F54BF002C5694 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = F95CC0C6087F53AE002C5694 /* BibImporter.xcodeproj */; @@ -861,6 +873,16 @@ ); runOnlyForDeploymentPostprocessing = 0; }; + F93C37D70D387DB0006EB558 /* CopyFiles */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = BibDesk.app/Contents/Resources; + dstSubfolderSpec = 16; + files = ( + F93C37E60D387EA5006EB558 /* Leopard.bundle in CopyFiles */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; F95CC0ED087F542F002C5694 /* CopyFiles */ = { isa = PBXCopyFilesBuildPhase; buildActionMask = 2147483647; @@ -1460,6 +1482,10 @@ F9377F550B423A4C00ECCB3A /* yaz.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = yaz.xcodeproj; path = vendorsrc/indexdata/yaz/objc/yaz.xcodeproj; sourceTree = "<group>"; }; F93840890906DD1F00FC37F2 /* scripthook.tiff */ = {isa = PBXFileReference; lastKnownFileType = image.tiff; name = scripthook.tiff; path = Images/scripthook.tiff; sourceTree = "<group>"; }; F93C35DF0D35D97B006EB558 /* French */ = {isa = PBXFileReference; lastKnownFileType = wrapper.nib; name = French; path = French.lproj/BDSKFileMigration.nib; sourceTree = "<group>"; }; + F93C37AC0D387AEE006EB558 /* Leopard.bundle */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = Leopard.bundle; sourceTree = BUILT_PRODUCTS_DIR; }; + F93C37AD0D387AEE006EB558 /* Leopard-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "Leopard-Info.plist"; sourceTree = "<group>"; }; + F93C37B20D387B76006EB558 /* BibDocument_Leopard.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BibDocument_Leopard.h; sourceTree = "<group>"; }; + F93C37B30D387B76006EB558 /* BibDocument_Leopard.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = BibDocument_Leopard.m; sourceTree = "<group>"; }; F940D1070B5568E400B5917A /* BDSKReferParser.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BDSKReferParser.h; sourceTree = "<group>"; }; F940D1080B5568E400B5917A /* BDSKReferParser.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = BDSKReferParser.m; sourceTree = "<group>"; }; F941135209B549BF00EE8463 /* BDSKEditorTextView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BDSKEditorTextView.h; sourceTree = "<group>"; }; @@ -1730,6 +1756,14 @@ ); runOnlyForDeploymentPostprocessing = 0; }; + F93C37AA0D387AEE006EB558 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + F93C38180D38820B006EB558 /* Cocoa.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ @@ -1776,6 +1810,7 @@ 8D1107320486CEB800E47090 /* BibDesk.app */, 275E270707838EE30070398A /* TestBibItem.bundle */, 27CD032407D82C7400806B7E /* TestComplexString.bundle */, + F93C37AC0D387AEE006EB558 /* Leopard.bundle */, ); name = Products; sourceTree = "<group>"; @@ -1834,6 +1869,7 @@ 29B97323FDCFA39411CA2CEA /* Frameworks */, 19C28FACFE9D520D11CA2CBB /* Products */, F95C5EDE0D10F5F100C81970 /* Configurations */, + F93C37DD0D387DEE006EB558 /* Leopard */, ); name = BibDesk; sourceTree = "<group>"; @@ -2682,6 +2718,16 @@ name = Products; sourceTree = "<group>"; }; + F93C37DD0D387DEE006EB558 /* Leopard */ = { + isa = PBXGroup; + children = ( + F93C37B20D387B76006EB558 /* BibDocument_Leopard.h */, + F93C37B30D387B76006EB558 /* BibDocument_Leopard.m */, + F93C37AD0D387AEE006EB558 /* Leopard-Info.plist */, + ); + name = Leopard; + sourceTree = "<group>"; + }; F95C5EDE0D10F5F100C81970 /* Configurations */ = { isa = PBXGroup; children = ( @@ -2936,6 +2982,23 @@ productReference = 8D1107320486CEB800E47090 /* BibDesk.app */; productType = "com.apple.product-type.application"; }; + F93C37AB0D387AEE006EB558 /* Leopard */ = { + isa = PBXNativeTarget; + buildConfigurationList = F93C37B10D387AF4006EB558 /* Build configuration list for PBXNativeTarget "Leopard" */; + buildPhases = ( + F93C37A80D387AEE006EB558 /* Resources */, + F93C37A90D387AEE006EB558 /* Sources */, + F93C37AA0D387AEE006EB558 /* Frameworks */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = Leopard; + productName = Leopard; + productReference = F93C37AC0D387AEE006EB558 /* Leopard.bundle */; + productType = "com.apple.product-type.bundle"; + }; /* End PBXNativeTarget section */ /* Begin PBXProject section */ @@ -3004,6 +3067,7 @@ 275E270607838EE30070398A /* TestBibItem */, 27CD032307D82C7400806B7E /* TestComplexString */, F9CA0C7A0CDF93D10059D36D /* BibDesk+QuickLook */, + F93C37AB0D387AEE006EB558 /* Leopard */, ); }; /* End PBXProject section */ @@ -3348,6 +3412,13 @@ ); runOnlyForDeploymentPostprocessing = 0; }; + F93C37A80D387AEE006EB558 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; /* End PBXResourcesBuildPhase section */ /* Begin PBXRezBuildPhase section */ @@ -3804,6 +3875,14 @@ ); runOnlyForDeploymentPostprocessing = 0; }; + F93C37A90D387AEE006EB558 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + F93C37B70D387BCB006EB558 /* BibDocument_Leopard.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; /* End PBXSourcesBuildPhase section */ /* Begin PBXTargetDependency section */ @@ -3827,6 +3906,11 @@ name = SkimNotesAgent; targetProxy = F92BACF30BCC00EB008D5BC3 /* PBXContainerItemProxy */; }; + F93C37D10D387D54006EB558 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = F93C37AB0D387AEE006EB558 /* Leopard */; + targetProxy = F93C37D00D387D54006EB558 /* PBXContainerItemProxy */; + }; F9AF562C0BEA4160009B16D5 /* PBXTargetDependency */ = { isa = PBXTargetDependency; name = BTParse; @@ -4464,6 +4548,81 @@ /* End PBXVariantGroup section */ /* Begin XCBuildConfiguration section */ + F93C37AE0D387AF4006EB558 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + COPY_PHASE_STRIP = NO; + GCC_DYNAMIC_NO_PIC = NO; + GCC_ENABLE_FIX_AND_CONTINUE = YES; + GCC_MODEL_TUNING = G5; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PRECOMPILE_PREFIX_HEADER = YES; + GCC_PREFIX_HEADER = "$(SYSTEM_LIBRARY_DIR)/Frameworks/AppKit.framework/Headers/AppKit.h"; + INFOPLIST_FILE = "Leopard-Info.plist"; + INSTALL_PATH = "$(HOME)/Library/Bundles"; + MACOSX_DEPLOYMENT_TARGET = 10.4; + OTHER_LDFLAGS = ( + "-framework", + Foundation, + "-framework", + AppKit, + ); + PREBINDING = NO; + PRODUCT_NAME = Leopard; + SDKROOT = /Developer/SDKs/MacOSX10.5.sdk; + WRAPPER_EXTENSION = bundle; + ZERO_LINK = YES; + }; + name = Debug; + }; + F93C37AF0D387AF4006EB558 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + COPY_PHASE_STRIP = YES; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + GCC_ENABLE_FIX_AND_CONTINUE = NO; + GCC_MODEL_TUNING = G5; + GCC_PRECOMPILE_PREFIX_HEADER = YES; + GCC_PREFIX_HEADER = "$(SYSTEM_LIBRARY_DIR)/Frameworks/AppKit.framework/Headers/AppKit.h"; + INFOPLIST_FILE = "Leopard-Info.plist"; + INSTALL_PATH = "$(HOME)/Library/Bundles"; + MACOSX_DEPLOYMENT_TARGET = 10.4; + OTHER_LDFLAGS = ( + "-framework", + Foundation, + "-framework", + AppKit, + ); + PREBINDING = NO; + PRODUCT_NAME = Leopard; + SDKROOT = /Developer/SDKs/MacOSX10.5.sdk; + WRAPPER_EXTENSION = bundle; + ZERO_LINK = NO; + }; + name = Release; + }; + F93C37B00D387AF4006EB558 /* Test */ = { + isa = XCBuildConfiguration; + buildSettings = { + GCC_ENABLE_FIX_AND_CONTINUE = YES; + GCC_MODEL_TUNING = G5; + GCC_PRECOMPILE_PREFIX_HEADER = YES; + GCC_PREFIX_HEADER = "$(SYSTEM_LIBRARY_DIR)/Frameworks/AppKit.framework/Headers/AppKit.h"; + INFOPLIST_FILE = "Leopard-Info.plist"; + INSTALL_PATH = "$(HOME)/Library/Bundles"; + OTHER_LDFLAGS = ( + "-framework", + Foundation, + "-framework", + AppKit, + ); + PREBINDING = NO; + PRODUCT_NAME = Leopard; + WRAPPER_EXTENSION = bundle; + ZERO_LINK = YES; + }; + name = Test; + }; F993F1BD08553A61007A7657 /* Debug */ = { isa = XCBuildConfiguration; baseConfigurationReference = F95C5E970D10E87C00C81970 /* BibDesk-Debug.xcconfig */; @@ -4989,6 +5148,16 @@ /* End XCBuildConfiguration section */ /* Begin XCConfigurationList section */ + F93C37B10D387AF4006EB558 /* Build configuration list for PBXNativeTarget "Leopard" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + F93C37AE0D387AF4006EB558 /* Debug */, + F93C37AF0D387AF4006EB558 /* Release */, + F93C37B00D387AF4006EB558 /* Test */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Debug; + }; F993F1BC08553A61007A7657 /* Build configuration list for PBXNativeTarget "BibDesk" */ = { isa = XCConfigurationList; buildConfigurations = ( Added: trunk/bibdesk/Leopard-Info.plist =================================================================== --- trunk/bibdesk/Leopard-Info.plist (rev 0) +++ trunk/bibdesk/Leopard-Info.plist 2008-01-12 05:16:11 UTC (rev 12433) @@ -0,0 +1,20 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> +<plist version="1.0"> +<dict> + <key>CFBundleDevelopmentRegion</key> + <string>English</string> + <key>CFBundleExecutable</key> + <string>${EXECUTABLE_NAME}</string> + <key>CFBundleIdentifier</key> + <string>net.sourceforge.bibdesk.leopard</string> + <key>CFBundleInfoDictionaryVersion</key> + <string>6.0</string> + <key>CFBundlePackageType</key> + <string>BNDL</string> + <key>CFBundleSignature</key> + <string>????</string> + <key>CFBundleVersion</key> + <string>1.0</string> +</dict> +</plist> This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |