MoreFiles.c

/*
    File:       MoreFiles.c
    
    Description:The long lost high-level and FSSpec File Manager functions.
 
    Author:     JL
 
    Copyright:  Copyright: © 1992-1999 by Apple Computer, Inc.
                all rights reserved.
    
    Disclaimer: 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.
    
    Change History (most recent first):
                6/25/99 Updated for Metrowerks Codewarror Pro 2.1(KG)
 
*/
#include <Types.h>
#include <Errors.h>
#include <Files.h>
 
#define __COMPILINGMOREFILES
 
#include "MoreFiles.h"
#include "MoreFilesExtras.h"
 
/*****************************************************************************/
 
pascal  OSErr   HGetVolParms(ConstStr255Param volName,
                             short vRefNum,
                             GetVolParmsInfoBuffer *volParmsInfo,
                             long *infoSize)
{
    HParamBlockRec pb;
    OSErr error;
 
    pb.ioParam.ioNamePtr = (StringPtr)volName;
    pb.ioParam.ioVRefNum = vRefNum;
    pb.ioParam.ioBuffer = (Ptr)volParmsInfo;
    pb.ioParam.ioReqCount = *infoSize;
    error = PBHGetVolParmsSync(&pb);
    if ( error == noErr )
    {
        *infoSize = pb.ioParam.ioActCount;
    }
    return ( error );
}
 
/*****************************************************************************/
 
pascal  OSErr   HCreateMinimum(short vRefNum,
                               long dirID,
                               ConstStr255Param fileName)
{
    HParamBlockRec pb;
 
    pb.fileParam.ioNamePtr = (StringPtr)fileName;
    pb.fileParam.ioVRefNum = vRefNum;
    pb.ioParam.ioVersNum = 0;
    pb.fileParam.ioDirID = dirID;
    return ( PBHCreateSync(&pb) );
}
 
/*****************************************************************************/
 
pascal  OSErr   FSpCreateMinimum(const FSSpec *spec)
{
    return ( HCreateMinimum(spec->vRefNum, spec->parID, spec->name) );
}
 
/*****************************************************************************/
 
pascal  OSErr   ExchangeFiles(short vRefNum,
                              long srcDirID,
                              ConstStr255Param srcName,
                              long dstDirID,
                              ConstStr255Param dstName)
{
    HParamBlockRec pb;
 
    pb.fidParam.ioVRefNum = vRefNum;
    pb.fidParam.ioSrcDirID = srcDirID;
    pb.fidParam.ioNamePtr = (StringPtr)srcName;
    pb.fidParam.ioDestDirID = dstDirID;
    pb.fidParam.ioDestNamePtr = (StringPtr)dstName;
    return ( PBExchangeFilesSync(&pb) );
}
 
/*****************************************************************************/
 
pascal  OSErr   ResolveFileIDRef(ConstStr255Param volName,
                                 short vRefNum,
                                 long fileID,
                                 long *parID,
                                 StringPtr fileName)
{
    HParamBlockRec pb;
    OSErr error;
    Str255 tempStr;
    
    tempStr[0] = 0;
    if ( volName != NULL )
    {
        BlockMoveData(volName, tempStr, volName[0] + 1);
    }
    pb.fidParam.ioNamePtr = (StringPtr)tempStr;
    pb.fidParam.ioVRefNum = vRefNum;
    pb.fidParam.ioFileID = fileID;
    error = PBResolveFileIDRefSync(&pb);
    if ( error == noErr )
    {
        *parID = pb.fidParam.ioSrcDirID;
        if ( fileName != NULL )
        {
            BlockMoveData(tempStr, fileName, tempStr[0] + 1);
        }
    }
    return ( error );
}
 
/*****************************************************************************/
 
pascal  OSErr   FSpResolveFileIDRef(ConstStr255Param volName,
                                    short vRefNum,
                                    long fileID,
                                    FSSpec *spec)
{
    OSErr   error;
    
    error = DetermineVRefNum(volName, vRefNum, &(spec->vRefNum));
    if ( error == noErr )
    {
        error = ResolveFileIDRef(volName, vRefNum, fileID, &(spec->parID), spec->name);
    }
    return ( error );
}
 
/*****************************************************************************/
 
pascal  OSErr   CreateFileIDRef(short vRefNum,
                                long parID,
                                ConstStr255Param fileName,
                                long *fileID)
{
    HParamBlockRec pb;
    OSErr error;
 
    pb.fidParam.ioNamePtr = (StringPtr)fileName;
    pb.fidParam.ioVRefNum = vRefNum;
    pb.fidParam.ioSrcDirID = parID;
    error = PBCreateFileIDRefSync(&pb);
    if ( (error == noErr) || (error == fidExists) || (error == afpIDExists) )
    {
        *fileID = pb.fidParam.ioFileID;
    }
    return ( error );
}
 
/*****************************************************************************/
 
pascal  OSErr   FSpCreateFileIDRef(const FSSpec *spec,
                                   long *fileID)
{
    return ( CreateFileIDRef(spec->vRefNum, spec->parID, spec->name, fileID) );
}
 
/*****************************************************************************/
 
pascal  OSErr   DeleteFileIDRef(ConstStr255Param volName,
                                short vRefNum,
                                long fileID)
{
    HParamBlockRec pb;
 
    pb.fidParam.ioNamePtr = (StringPtr)volName;
    pb.fidParam.ioVRefNum = vRefNum;
    pb.fidParam.ioFileID = fileID;
    return ( PBDeleteFileIDRefSync(&pb) );
}
 
/*****************************************************************************/
 
pascal  OSErr   FlushFile(short refNum)
{
    ParamBlockRec pb;
 
    pb.ioParam.ioRefNum = refNum;
    return ( PBFlushFileSync(&pb) );
}
 
/*****************************************************************************/
 
pascal  OSErr   LockRange(short refNum,
                          long rangeLength,
                          long rangeStart)
{
    ParamBlockRec pb;
 
    pb.ioParam.ioRefNum = refNum;
    pb.ioParam.ioReqCount = rangeLength;
    pb.ioParam.ioPosMode = fsFromStart;
    pb.ioParam.ioPosOffset = rangeStart;
    return ( PBLockRangeSync(&pb) );
}
 
/*****************************************************************************/
 
pascal  OSErr   UnlockRange(short refNum,
                            long rangeLength,
                            long rangeStart)
{
    ParamBlockRec pb;
 
    pb.ioParam.ioRefNum = refNum;
    pb.ioParam.ioReqCount = rangeLength;
    pb.ioParam.ioPosMode = fsFromStart;
    pb.ioParam.ioPosOffset = rangeStart;
    return ( PBUnlockRangeSync(&pb) );
}
 
/*****************************************************************************/
 
pascal  OSErr   GetForeignPrivs(short vRefNum,
                                long dirID,
                                ConstStr255Param name,
                                void *foreignPrivBuffer,
                                long *foreignPrivSize,
                                long *foreignPrivInfo1,
                                long *foreignPrivInfo2,
                                long *foreignPrivInfo3,
                                long *foreignPrivInfo4)
{
    HParamBlockRec pb;
    OSErr error;
 
    pb.foreignPrivParam.ioNamePtr = (StringPtr)name;
    pb.foreignPrivParam.ioVRefNum = vRefNum;
    pb.foreignPrivParam.ioForeignPrivDirID = dirID; 
    pb.foreignPrivParam.ioForeignPrivBuffer = (Ptr)foreignPrivBuffer;
    pb.foreignPrivParam.ioForeignPrivReqCount = *foreignPrivSize;
    error = PBGetForeignPrivsSync(&pb);
    *foreignPrivSize = pb.foreignPrivParam.ioForeignPrivActCount;
    *foreignPrivInfo1 = pb.foreignPrivParam.ioForeignPrivInfo1;
    *foreignPrivInfo2 = pb.foreignPrivParam.ioForeignPrivInfo2;
    *foreignPrivInfo3 = pb.foreignPrivParam.ioForeignPrivInfo3;
    *foreignPrivInfo4 = pb.foreignPrivParam.ioForeignPrivInfo4;
    return ( error );
}
 
/*****************************************************************************/
 
pascal  OSErr   FSpGetForeignPrivs(const FSSpec *spec,
                                   void *foreignPrivBuffer,
                                   long *foreignPrivSize,
                                   long *foreignPrivInfo1,
                                   long *foreignPrivInfo2,
                                   long *foreignPrivInfo3,
                                   long *foreignPrivInfo4)
{
    return ( GetForeignPrivs(spec->vRefNum, spec->parID, spec->name,
                             foreignPrivBuffer, foreignPrivSize,
                             foreignPrivInfo1, foreignPrivInfo2,
                             foreignPrivInfo3, foreignPrivInfo4) );
}
 
/*****************************************************************************/
 
pascal  OSErr   SetForeignPrivs(short vRefNum,
                                long dirID,
                                ConstStr255Param name,
                                const void *foreignPrivBuffer,
                                long *foreignPrivSize,
                                long foreignPrivInfo1,
                                long foreignPrivInfo2,
                                long foreignPrivInfo3,
                                long foreignPrivInfo4)
{
    HParamBlockRec pb;
    OSErr error;
 
    pb.foreignPrivParam.ioNamePtr = (StringPtr)name;
    pb.foreignPrivParam.ioVRefNum = vRefNum;
    pb.foreignPrivParam.ioForeignPrivDirID = dirID; 
    pb.foreignPrivParam.ioForeignPrivBuffer = (Ptr)foreignPrivBuffer;
    pb.foreignPrivParam.ioForeignPrivReqCount = *foreignPrivSize;
    pb.foreignPrivParam.ioForeignPrivInfo1 = foreignPrivInfo1;
    pb.foreignPrivParam.ioForeignPrivInfo2 = foreignPrivInfo2;
    pb.foreignPrivParam.ioForeignPrivInfo3 = foreignPrivInfo3;
    pb.foreignPrivParam.ioForeignPrivInfo4 = foreignPrivInfo4;
    error = PBSetForeignPrivsSync(&pb);
    if ( error == noErr )
    {
        *foreignPrivSize = pb.foreignPrivParam.ioForeignPrivActCount;
    }
    return ( error );
}
 
/*****************************************************************************/
 
pascal  OSErr   FSpSetForeignPrivs(const FSSpec *spec,
                                   const void *foreignPrivBuffer,
                                   long *foreignPrivSize,
                                   long foreignPrivInfo1,
                                   long foreignPrivInfo2,
                                   long foreignPrivInfo3,
                                   long foreignPrivInfo4)
{
    return ( SetForeignPrivs(spec->vRefNum, spec->parID, spec->name,
                             foreignPrivBuffer, foreignPrivSize,
                             foreignPrivInfo1, foreignPrivInfo2,
                             foreignPrivInfo3, foreignPrivInfo4) );
}
 
/*****************************************************************************/
 
pascal  OSErr   HGetLogInInfo(ConstStr255Param volName,
                              short vRefNum,
                              short *loginMethod,
                              StringPtr userName)
{
    HParamBlockRec pb;
    OSErr error;
 
    pb.objParam.ioNamePtr = (StringPtr)volName;
    pb.objParam.ioVRefNum = vRefNum;
    pb.objParam.ioObjNamePtr = userName;
    error = PBHGetLogInInfoSync(&pb);
    if ( error == noErr )
    {
        *loginMethod = pb.objParam.ioObjType;
    }
    return ( error );
}
 
/*****************************************************************************/
 
pascal  OSErr   HGetDirAccess(short vRefNum,
                              long dirID,
                              ConstStr255Param name,
                              long *ownerID,
                              long *groupID,
                              long *accessRights)
{
    HParamBlockRec pb;
    OSErr error;
 
    pb.accessParam.ioNamePtr = (StringPtr)name;
    pb.accessParam.ioVRefNum = vRefNum;
    pb.fileParam.ioDirID = dirID;
    error = PBHGetDirAccessSync(&pb);
    if ( error == noErr )
    {
        *ownerID = pb.accessParam.ioACOwnerID;
        *groupID = pb.accessParam.ioACGroupID;
        *accessRights = pb.accessParam.ioACAccess;
    }
    return ( error );
}
 
/*****************************************************************************/
 
pascal  OSErr   FSpGetDirAccess(const FSSpec *spec,
                                long *ownerID,
                                long *groupID,
                                long *accessRights)
{
    return ( HGetDirAccess(spec->vRefNum, spec->parID, spec->name,
                           ownerID, groupID, accessRights) );
}
 
/*****************************************************************************/
 
pascal  OSErr   HSetDirAccess(short vRefNum,
                              long dirID,
                              ConstStr255Param name,
                              long ownerID,
                              long groupID,
                              long accessRights)
{
    HParamBlockRec pb;
 
    pb.accessParam.ioNamePtr = (StringPtr)name;
    pb.accessParam.ioVRefNum = vRefNum;
    pb.fileParam.ioDirID = dirID;
    pb.accessParam.ioACOwnerID = ownerID;
    pb.accessParam.ioACGroupID = groupID;
    pb.accessParam.ioACAccess = accessRights;
    return ( PBHSetDirAccessSync(&pb) );
}
 
/*****************************************************************************/
 
pascal  OSErr   FSpSetDirAccess(const FSSpec *spec,
                                long ownerID,
                                long groupID,
                                long accessRights)
{
    return ( HSetDirAccess(spec->vRefNum, spec->parID, spec->name,
                           ownerID, groupID, accessRights) );
}
 
/*****************************************************************************/
 
pascal  OSErr   HMapID(ConstStr255Param volName,
                       short vRefNum,
                       long ugID,
                       short objType,
                       StringPtr name)
{
    HParamBlockRec pb;
 
    pb.objParam.ioNamePtr = (StringPtr)volName;
    pb.objParam.ioVRefNum = vRefNum;
    pb.objParam.ioObjType = objType;
    pb.objParam.ioObjNamePtr = name;
    pb.objParam.ioObjID = ugID;
    return ( PBHMapIDSync(&pb) );
}
 
/*****************************************************************************/
 
pascal  OSErr   HMapName(ConstStr255Param volName,
                         short vRefNum,
                         ConstStr255Param name,
                         short objType,
                         long *ugID)
{
    HParamBlockRec pb;
    OSErr error;
 
    pb.objParam.ioNamePtr = (StringPtr)volName;
    pb.objParam.ioVRefNum = vRefNum;
    pb.objParam.ioObjType = objType;
    pb.objParam.ioObjNamePtr = (StringPtr)name;
    error = PBHMapNameSync(&pb);
    if ( error == noErr )
    {
        *ugID = pb.objParam.ioObjID;
    }
    return ( error );
}
 
/*****************************************************************************/
 
pascal  OSErr   HCopyFile(short srcVRefNum,
                          long srcDirID,
                          ConstStr255Param srcName,
                          short dstVRefNum,
                          long dstDirID,
                          ConstStr255Param dstPathname,
                          ConstStr255Param copyName)
{
    HParamBlockRec pb;
 
    pb.copyParam.ioVRefNum = srcVRefNum;
    pb.copyParam.ioDirID = srcDirID;
    pb.copyParam.ioNamePtr = (StringPtr)srcName;
    pb.copyParam.ioDstVRefNum = dstVRefNum;
    pb.copyParam.ioNewDirID = dstDirID;
    pb.copyParam.ioNewName = (StringPtr)dstPathname;
    pb.copyParam.ioCopyName = (StringPtr)copyName;
    return ( PBHCopyFileSync(&pb) );
}
 
/*****************************************************************************/
 
pascal  OSErr   FSpCopyFile(const FSSpec *srcSpec,
                            const FSSpec *dstSpec,
                            ConstStr255Param copyName)
{
    return ( HCopyFile(srcSpec->vRefNum, srcSpec->parID, srcSpec->name,
                       dstSpec->vRefNum, dstSpec->parID,
                       dstSpec->name, copyName) );
}
 
/*****************************************************************************/
 
pascal  OSErr   HMoveRename(short vRefNum,
                            long srcDirID,
                            ConstStr255Param srcName,
                            long dstDirID,
                            ConstStr255Param dstpathName,
                            ConstStr255Param copyName)
{
    HParamBlockRec pb;
 
    pb.copyParam.ioVRefNum = vRefNum;
    pb.copyParam.ioDirID = srcDirID;
    pb.copyParam.ioNamePtr = (StringPtr)srcName;
    pb.copyParam.ioNewDirID = dstDirID;
    pb.copyParam.ioNewName = (StringPtr)dstpathName;
    pb.copyParam.ioCopyName = (StringPtr)copyName;
    return ( PBHMoveRenameSync(&pb) );
}
 
/*****************************************************************************/
 
pascal  OSErr   FSpMoveRename(const FSSpec *srcSpec,
                              const FSSpec *dstSpec,
                              ConstStr255Param copyName)
{
    OSErr   error;
    
    /* make sure the FSSpecs refer to the same volume */
    if ( srcSpec->vRefNum != dstSpec->vRefNum )
    {
        error = diffVolErr;
    }
    else
    {
        error = HMoveRename(srcSpec->vRefNum, srcSpec->parID, srcSpec->name, 
                            dstSpec->parID, dstSpec->name, copyName);
    }
    return ( error );
}
 
/*****************************************************************************/
 
pascal  OSErr   GetVolMountInfoSize(ConstStr255Param volName,
                                    short vRefNum,
                                    short *size)
{
    ParamBlockRec pb;
 
    pb.ioParam.ioNamePtr = (StringPtr)volName;
    pb.ioParam.ioVRefNum = vRefNum;
    pb.ioParam.ioBuffer = (Ptr)size;
    return ( PBGetVolMountInfoSize(&pb) );
}
 
/*****************************************************************************/
 
pascal  OSErr   GetVolMountInfo(ConstStr255Param volName,
                                short vRefNum,
                                void *volMountInfo)
{
    ParamBlockRec pb;
 
    pb.ioParam.ioNamePtr = (StringPtr)volName;
    pb.ioParam.ioVRefNum = vRefNum;
    pb.ioParam.ioBuffer = (Ptr)volMountInfo;
    return ( PBGetVolMountInfo(&pb) );
}
 
/*****************************************************************************/
 
pascal  OSErr   VolumeMount(const void *volMountInfo,
                            short *vRefNum)
{
    ParamBlockRec pb;
    OSErr error;
 
    pb.ioParam.ioBuffer = (Ptr)volMountInfo;
    error = PBVolumeMount(&pb);
    if ( error == noErr )
    {
        *vRefNum = pb.ioParam.ioVRefNum;
    }
    return ( error );
}
 
/*****************************************************************************/
 
pascal  OSErr   Share(short vRefNum,
                      long dirID,
                      ConstStr255Param name)
{
    HParamBlockRec pb;
 
    pb.fileParam.ioNamePtr = (StringPtr)name;
    pb.fileParam.ioVRefNum = vRefNum;
    pb.fileParam.ioDirID = dirID;
    return ( PBShareSync(&pb) );
}
 
/*****************************************************************************/
 
pascal  OSErr   FSpShare(const FSSpec *spec)
{
    return ( Share(spec->vRefNum, spec->parID, spec->name) );
}
 
/*****************************************************************************/
 
pascal  OSErr   Unshare(short vRefNum,
                        long dirID,
                        ConstStr255Param name)
{
    HParamBlockRec pb;
 
    pb.fileParam.ioNamePtr = (StringPtr)name;
    pb.fileParam.ioVRefNum = vRefNum;
    pb.fileParam.ioDirID = dirID;
    return ( PBUnshareSync(&pb) );
}
 
/*****************************************************************************/
 
pascal  OSErr   FSpUnshare(const FSSpec *spec)
{
    return ( Unshare(spec->vRefNum, spec->parID, spec->name) );
}
 
/*****************************************************************************/
 
pascal  OSErr   GetUGEntry(short objType,
                           StringPtr objName,
                           long *objID)
{
    HParamBlockRec pb;
    OSErr error;
 
    pb.objParam.ioObjType = objType;
    pb.objParam.ioObjNamePtr = objName;
    pb.objParam.ioObjID = *objID;
    error = PBGetUGEntrySync(&pb);
    if ( error == noErr )
    {
        *objID = pb.objParam.ioObjID;
    }
    return ( error );
}
 
/*****************************************************************************/