/* ** Apple Macintosh Developer Technical Support ** ** FSSpec compatibility functions. ** ** by Jim Luther, Apple Developer Technical Support Emeritus ** ** File: FSpCompat.h ** ** Copyright © 1992-1998 Apple Computer, Inc. ** All rights reserved. ** ** You may incorporate this sample code into your applications without ** restriction, though the sample code has been provided "AS IS" and the ** responsibility for its operation is 100% yours. However, what you are ** not permitted to do is to redistribute the source as "DSC Sample Code" ** after having made changes. If you're going to re-distribute the source, ** we require that you make it clear in the source that the code was ** descended from Apple Sample Code, but that you've made changes. */ #ifndef __FSPCOMPAT__ #define __FSPCOMPAT__ #include #include #include "Optimization.h" #ifdef __cplusplus extern "C" { #endif /*****************************************************************************/ pascal OSErr FSMakeFSSpecCompat(short vRefNum, long dirID, ConstStr255Param fileName, FSSpec *spec); /* ¦ Initialize a FSSpec record. The FSMakeFSSpecCompat function fills in the fields of an FSSpec record. If the file system can't create the FSSpec, then the compatibility code creates a FSSpec that is exactly like an FSSpec except that spec.name for a file may not have the same capitalization as the file's catalog entry on the disk volume. That is because fileName is parsed to get the name instead of getting the name back from the file system. This works fine with System 6 where FSMakeSpec isn't available. vRefNum input: Volume specification. dirID input: Directory ID. fileName input: Pointer to object name, or nil when dirID specifies a directory that's the object. spec output: A file system specification to be filled in by FSMakeFSSpecCompat. Result Codes noErr 0 No error nsvErr -35 Volume doesnÕt exist fnfErr -43 File or directory does not exist (FSSpec is still valid) */ /*****************************************************************************/ pascal OSErr FSpOpenDFCompat(const FSSpec *spec, char permission, short *refNum); /* ¦ Open a file's data fork. The FSpOpenDFCompat function opens the data fork of the file specified by spec. Differences from FSpOpenDF: If FSpOpenDF isn't available, FSpOpenDFCompat uses PHBOpen because System 6 doesn't support PBHOpenDF. This means FSpOpenDFCompat could accidentally open a driver if the spec->name begins with a period. spec input: An FSSpec record specifying the file whose data fork is to be opened. permission input: A constant indicating the desired file access permissions. refNum output: A reference number of an access path to the file's data fork. Result Codes noErr 0 No error nsvErr -35 No such volume ioErr -36 I/O error bdNamErr -37 Bad filename tmfoErr -42 Too many files open fnfErr -43 File not found opWrErr -49 File already open for writing permErr -54 Attempt to open locked file for writing dirNFErr -120 Directory not found or incomplete pathname afpAccessDenied -5000 User does not have the correct access to the file __________ See also: FSpOpenAware */ /*****************************************************************************/ pascal OSErr FSpOpenRFCompat(const FSSpec *spec, char permission, short *refNum); /* ¦ Open a file's resource fork. The FSpOpenRFCompat function opens the resource fork of the file specified by spec. spec input: An FSSpec record specifying the file whose resource fork is to be opened. permission input: A constant indicating the desired file access permissions. refNum output: A reference number of an access path to the file's resource fork. Result Codes noErr 0 No error nsvErr -35 No such volume ioErr -36 I/O error bdNamErr -37 Bad filename tmfoErr -42 Too many files open fnfErr -43 File not found opWrErr -49 File already open for writing permErr -54 Attempt to open locked file for writing dirNFErr -120 Directory not found or incomplete pathname afpAccessDenied -5000 User does not have the correct access to the file __________ See also: FSpOpenRFAware */ /*****************************************************************************/ pascal OSErr FSpCreateCompat(const FSSpec *spec, OSType creator, OSType fileType, ScriptCode scriptTag); /* ¦ Create a new file. The FSpCreateCompat function creates a new file with the specified type, creator, and script code. Differences from FSpCreate: FSpCreateCompat correctly sets the fdScript in the file's FXInfo record to scriptTag if the problem isn't fixed in the File Manager code. spec input: An FSSpec record specifying the file to create. creator input: The creator of the new file. fileType input The file type of the new file. scriptCode input: The code of the script system in which the file name is to be displayed. Result Codes noErr 0 No error dirFulErr -33 File directory full dskFulErr -34 Disk is full nsvErr -35 No such volume ioErr -36 I/O error bdNamErr -37 Bad filename fnfErr -43 Directory not found or incomplete pathname wPrErr -44 Hardware volume lock vLckdErr -46 Software volume lock dupFNErr -48 Duplicate filename and version dirNFErrdirNFErr -120 Directory not found or incomplete pathname afpAccessDenied -5000 User does not have the correct access afpObjectTypeErr -5025 A directory exists with that name */ /*****************************************************************************/ pascal OSErr FSpDirCreateCompat(const FSSpec *spec, ScriptCode scriptTag, long *createdDirID); /* ¦ Create a new directory. The FSpDirCreateCompat function creates a new directory and returns the directory ID of the newDirectory. spec input: An FSSpec record specifying the directory to create. scriptCode input: The code of the script system in which the directory name is to be displayed. createdDirID output: The directory ID of the directory that was created. Result Codes noErr 0 No error dirFulErr -33 File directory full dskFulErr -34 Disk is full nsvErr -35 No such volume ioErr -36 I/O error bdNamErr -37 Bad filename fnfErr -43 Directory not found or incomplete pathname wPrErr -44 Hardware volume lock vLckdErr -46 Software volume lock dupFNErr -48 Duplicate filename and version dirNFErrdirNFErr -120 Directory not found or incomplete pathname wrgVolTypErr -123 Not an HFS volume afpAccessDenied -5000 User does not have the correct access */ /*****************************************************************************/ pascal OSErr FSpDeleteCompat(const FSSpec *spec); /* ¦ Delete a file or directory. The FSpDeleteCompat function deletes a file or directory. spec input: An FSSpec record specifying the file or directory to delete. Result Codes noErr 0 No error nsvErr -35 No such volume ioErr -36 I/O error bdNamErr -37 Bad filename fnfErr -43 File not found wPrErr -44 Hardware volume lock fLckdErr -45 File is locked vLckdErr -46 Software volume lock fBsyErr -47 File busy, directory not empty, or working directory control block open dirNFErrdirNFErr -120 Directory not found or incomplete pathname afpAccessDenied -5000 User does not have the correct access */ /*****************************************************************************/ pascal OSErr FSpGetFInfoCompat(const FSSpec *spec, FInfo *fndrInfo); /* ¦ Get the finder information for a file. The FSpGetFInfoCompat function gets the finder information for a file. spec input: An FSSpec record specifying the file. fndrInfo output: If the object is a file, then its FInfo. Result Codes noErr 0 No error nsvErr -35 No such volume ioErr -36 I/O error bdNamErr -37 Bad filename fnfErr -43 File not found paramErr -50 No default volume dirNFErrdirNFErr -120 Directory not found or incomplete pathname afpAccessDenied -5000 User does not have the correct access afpObjectTypeErr -5025 Directory not found or incomplete pathname __________ Also see: FSpGetDInfo */ /*****************************************************************************/ pascal OSErr FSpSetFInfoCompat(const FSSpec *spec, const FInfo *fndrInfo); /* ¦ Set the finder information for a file. The FSpSetFInfoCompat function sets the finder information for a file. spec input: An FSSpec record specifying the file. fndrInfo input: The FInfo. Result Codes noErr 0 No error nsvErr -35 No such volume ioErr -36 I/O error bdNamErr -37 Bad filename fnfErr -43 File not found wPrErr -44 Hardware volume lock fLckdErr -45 File is locked vLckdErr -46 Software volume lock dirNFErrdirNFErr -120 Directory not found or incomplete pathname afpAccessDenied -5000 User does not have the correct access afpObjectTypeErr -5025 Object was a directory __________ Also see: FSpSetDInfo */ /*****************************************************************************/ pascal OSErr FSpSetFLockCompat(const FSSpec *spec); /* ¦ Lock a file. The FSpSetFLockCompat function locks a file. spec input: An FSSpec record specifying the file. Result Codes noErr 0 No error nsvErr -35 No such volume ioErr -36 I/O error fnfErr -43 File not found wPrErr -44 Hardware volume lock vLckdErr -46 Software volume lock dirNFErrdirNFErr -120 Directory not found or incomplete pathname afpAccessDenied -5000 User does not have the correct access to the file afpObjectTypeErr -5025 Folder locking not supported by volume */ /*****************************************************************************/ pascal OSErr FSpRstFLockCompat(const FSSpec *spec); /* ¦ Unlock a file. The FSpRstFLockCompat function unlocks a file. spec input: An FSSpec record specifying the file. Result Codes noErr 0 No error nsvErr -35 No such volume ioErr -36 I/O error fnfErr -43 File not found wPrErr -44 Hardware volume lock vLckdErr -46 Software volume lock dirNFErrdirNFErr -120 Directory not found or incomplete pathname afpAccessDenied -5000 User does not have the correct access to the file afpObjectTypeErr -5025 Folder locking not supported by volume */ /*****************************************************************************/ pascal OSErr FSpRenameCompat(const FSSpec *spec, ConstStr255Param newName); /* ¦ Rename a file or directory. The FSpRenameCompat function renames a file or directory. spec input: An FSSpec record specifying the file. newName input: The new name of the file or directory. Result Codes noErr 0 No error dirFulErr -33 File directory full dskFulErr -34 Volume is full nsvErr -35 No such volume ioErr -36 I/O error bdNamErr -37 Bad filename fnfErr -43 File not found wPrErr -44 Hardware volume lock fLckdErr -45 File is locked vLckdErr -46 Software volume lock dupFNErr -48 Duplicate filename and version paramErr -50 No default volume fsRnErr -59 Problem during rename dirNFErrdirNFErr -120 Directory not found or incomplete pathname afpAccessDenied -5000 User does not have the correct access to the file */ /*****************************************************************************/ pascal OSErr FSpCatMoveCompat(const FSSpec *source, const FSSpec *dest); /* ¦ Move a file or directory to a different location on on the same volume. The FSpCatMoveCompat function moves a file or directory to a different location on on the same volume. source input: An FSSpec record specifying the file or directory. dest input: An FSSpec record specifying the name and location of the directory into which the source file or directory is to be moved. Result Codes noErr 0 No error nsvErr -35 No such volume ioErr -36 I/O error bdNamErr -37 Bad filename or attempt to move into a file fnfErr -43 File not found wPrErr -44 Hardware volume lock fLckdErr -45 Target directory is locked vLckdErr -46 Software volume lock dupFNErr -48 Duplicate filename and version paramErr -50 No default volume badMovErr -122 Attempt to move into offspring wrgVolTypErr -123 Not an HFS volume afpAccessDenied -5000 User does not have the correct access to the file */ /*****************************************************************************/ pascal OSErr FSpExchangeFilesCompat(const FSSpec *source, const FSSpec *dest); /* ¦ Exchange the data stored in two files on the same volume. The FSpExchangeFilesCompat function swaps the data in two files by changing the information in the volume's catalog and, if the files are open, in the file control blocks. Differences from FSpExchangeFiles: Correctly exchanges files on volumes that don't support PBExchangeFiles. FSpExchangeFiles attempts to support volumes that don't support PBExchangeFiles, but in System 7, 7.0.1, 7.1, and 7 Pro, the compatibility code just doesn't work on volumes that don't support PBExchangeFiles (even though you may get a noErr result). System Update 3.0 and System 7.5 and later have the problems in FSpExchangeFiles corrected. Result Codes noErr 0 No error nsvErr -35 Volume not found ioErr -36 I/O error fnfErr -43 File not found fLckdErr -45 File is locked vLckdErr -46 Volume is locked or read-only paramErr -50 Function not supported by volume volOfflinErr -53 Volume is offline wrgVolTypErr -123 Not an HFS volume diffVolErr -1303 Files on different volumes afpAccessDenied -5000 User does not have the correct access afpObjectTypeErr -5025 Object is a directory, not a file afpSameObjectErr -5038 Source and destination files are the same */ /*****************************************************************************/ pascal short FSpOpenResFileCompat(const FSSpec *spec, SignedByte permission); /* ¦ Open a file's resource file. The FSpOpenResFileCompat function opens the resource file specified by spec. spec input: An FSSpec record specifying the file whose resource file is to be opened. permission input: A constant indicating the desired file access permissions. function result output: A resource file reference number, or if there's an error -1. Result Codes noErr 0 No error nsvErr Ð35 No such volume ioErr Ð36 I/O error bdNamErr Ð37 Bad filename or volume name (perhaps zero length) eofErr Ð39 End of file tmfoErr Ð42 Too many files open fnfErr Ð43 File not found opWrErr Ð49 File already open with write permission permErr Ð54 Permissions error (on file open) extFSErr Ð58 Volume belongs to an external file system memFullErr Ð108 Not enough room in heap zone dirNFErr Ð120 Directory not found mapReadErr Ð199 Map inconsistent with operation */ /*****************************************************************************/ pascal void FSpCreateResFileCompat(const FSSpec *spec, OSType creator, OSType fileType, ScriptCode scriptTag); /* ¦ Create a resource file. The FSpCreateResFileCompat function creates a new resource file with the specified type, creator, and script code. Differences from FSpCreateResFile: FSpCreateResFileCompat correctly sets the fdScript in the file's FXInfo record to scriptTag if the problem isn't fixed in the File Manager code. spec input: An FSSpec record specifying the resource file to create. creator input: The creator of the new file. fileType input The file type of the new file. scriptCode input: The code of the script system in which the file name is to be displayed. Result Codes noErr 0 No error dirFulErr Ð33 Directory full dskFulErr Ð34 Disk full nsvErr Ð35 No such volume ioErr Ð36 I/O error bdNamErr Ð37 Bad filename or volume name (perhaps zero length) tmfoErr Ð42 Too many files open wPrErrw Ð44 Disk is write-protected fLckdErr Ð45 File is locked */ /*****************************************************************************/ #ifdef __cplusplus } #endif #include "OptimizationEnd.h" #endif /* __FSPCOMPAT__ */