📄 macbin3.c
字号:
HLock(data); err = FSWrite(dfRefNum,&inOutCount,*data); HUnlock(data); FSClose(dfRefNum); } } DisposeHandle(data); } return err;}static Handle EncodeMacbinary(FSSpec *file){ Handle result = nil; FInfo fndrInfo; FXInfo fndrXInfo; OSErr err; CInfoPBRec pb; short dfRefNum, rfRefNum; long ioCount; char buffer[128]; char header[128]; char comment[256]; long resourceForkLength, dataForkLength, commentLength; memset(&header, 0, sizeof(header)); err = FSpGetFInfo(file, &fndrInfo); memset(&pb, 0, sizeof(CInfoPBRec)); pb.hFileInfo.ioNamePtr = file->name; pb.hFileInfo.ioVRefNum = file->vRefNum; pb.hFileInfo.ioFDirIndex = 0; //query a file pb.hFileInfo.ioDirID = file->parID; err = PBGetCatInfo(&pb,false); fndrXInfo = pb.hFileInfo.ioFlXFndrInfo; BYTE_AT_OFFSET(header, kFileNameLengthOffset) = file->name[0]; BlockMoveData( &(file->name[1]), PTR_AT_OFFSET(header, kFileNameOffset), file->name[0]); LONG_AT_OFFSET(header, kFileTypeOffset) = fndrInfo.fdType; LONG_AT_OFFSET(header, kFileCreatorOffset) = fndrInfo.fdCreator; BYTE_AT_OFFSET(header, kFinderFlagsHiOffset) = (fndrInfo.fdFlags & 0xFF00) >> 8; BYTE_AT_OFFSET(header, kFinderFlagsLowOffset) = (fndrInfo.fdFlags & 0x00FF); WORD_AT_OFFSET(header, kFileVPositionOffset) = fndrInfo.fdLocation.v; WORD_AT_OFFSET(header, kFileHPositionOffset) = fndrInfo.fdLocation.h; WORD_AT_OFFSET(header, kFileFolderIDOffset) = fndrInfo.fdFldr; LONG_AT_OFFSET(header, kFileCreationDateOffset) = pb.hFileInfo.ioFlCrDat; LONG_AT_OFFSET(header, kFileModificationDateOffset) = pb.hFileInfo.ioFlMdDat; LONG_AT_OFFSET(header, kMacbinarySigOffset) = 'mBIN'; BYTE_AT_OFFSET(header, kFilenameScriptOffset) = fndrXInfo.fdScript; BYTE_AT_OFFSET(header, kExtendedFinderFlagsOffset) = fndrXInfo.fdXFlags; LONG_AT_OFFSET(header, kTotalFileLengthOffset) = 0; WORD_AT_OFFSET(header, kSecondaryHeaderLengthOffset) = 0; WORD_AT_OFFSET(header, kCurrentVersionOffset) = 130; WORD_AT_OFFSET(header, kMinimumVersionOffset) = 129; err = FSpOpenDF(file,fsRdPerm,&dfRefNum); if(err == noErr) { err = GetEOF(dfRefNum,&dataForkLength); LONG_AT_OFFSET(header, kDataForkLengthOffset) = dataForkLength; } else { dfRefNum = 0; } err = FSpOpenRF(file,fsRdPerm,&rfRefNum); if(err == noErr) { err = GetEOF(rfRefNum,&resourceForkLength); LONG_AT_OFFSET(header, kResourceForkLengthOffset) = resourceForkLength; } else { rfRefNum = 0; } memset(comment, 0, 256); if(GetDesktopComment(file, comment, &commentLength) != noErr) commentLength = 0; WORD_AT_OFFSET(header, kGetInfoCommentLengthOffset) = commentLength; WORD_AT_OFFSET(header, kCRCOffset) = crc32( 0, (unsigned char*) &header, 124); result = TempNewHandle(0, &err); if(result) { err = PtrAndHand(&header,result,128); if(dfRefNum && dataForkLength) { err = noErr; while(dataForkLength > 0 && err == noErr) { ioCount = 128; err = FSRead(dfRefNum,&ioCount,&buffer); if(err == noErr || err == eofErr) err = PtrAndHand(&buffer,result,128); dataForkLength -= ioCount; } } if(rfRefNum && resourceForkLength) { err = noErr; while(resourceForkLength > 0 && err == noErr) { ioCount = 128; err = FSRead(rfRefNum,&ioCount,&buffer); if(err == noErr || err == eofErr) err = PtrAndHand(&buffer,result,128); resourceForkLength -= ioCount; } } if(commentLength) { PtrAndHand(&comment,result,commentLength); } } if(rfRefNum) FSClose(rfRefNum); if(dfRefNum) FSClose(dfRefNum); return result;}#endif /* INCLUDE_ENCODE_MACBINARY */#ifdef INCLUDE_DECODE_MACBINARYstatic OSErr SetDesktopComment(FSSpec *file, char*comment, long length){ DTPBRec pb; OSErr err; pb.ioCompletion = nil; pb.ioNamePtr = NULL; pb.ioVRefNum = file->vRefNum; err = PBDTGetPath(&pb); if(err == noErr) { pb.ioNamePtr = file->name; pb.ioDTBuffer = comment; pb.ioDirID = file->parID; pb.ioDTReqCount = length; err = PBDTSetComment(&pb, false); } return err;}OSErr DecodeMacBinaryFile(FSSpec *source){ Handle data = nil; OSErr err; short dfRefNum = 0; long size; FSSpec McBin_source; memcpy(McBin_source.name,source->name,source->name[0]+1); McBin_source.vRefNum = source->vRefNum; McBin_source.parID = source->parID; err = FSpOpenDF(source, fsRdPerm, &dfRefNum); if(!err) { err = GetEOF(dfRefNum, &size); data = TempNewHandle(size, &err); if(data) { HLock(data); err = FSRead(dfRefNum,&size,*data); HUnlock(data); } FSClose(dfRefNum); } if(data && err == noErr) { err = DecodeMacBinary(data, source); DisposeHandle(data); }#ifdef DELETE_MACBINARY_SOURCE if (err == noErr) err = FSpDelete(&McBin_source);#endif return err;}static OSErr DecodeMacBinary(Handle data, FSSpec *destination){ Handle result = nil; FInfo fndrInfo; OSErr err; CInfoPBRec pb; short dfRefNum, rfRefNum; long ioCount; char header[128]; char comment[256]; long resourceForkLength, dataForkLength, commentLength; Boolean isMacBinaryFile = false; short headerEnd = 128; long rfOffset; long maxDataLen; memset(&pb, 0, sizeof(CInfoPBRec)); pb.hFileInfo.ioNamePtr = destination->name; pb.hFileInfo.ioVRefNum = destination->vRefNum; pb.hFileInfo.ioFDirIndex = 0; /* query a file */ pb.hFileInfo.ioDirID = destination->parID; err = PBGetCatInfo(&pb,false); maxDataLen = pb.hFileInfo.ioFlLgLen; HLock(data); memcpy(header, *data, 128); /* already checked with FSpIsMacBinary() */ isMacBinaryFile = HeaderIsMacBinary(header, nil, maxDataLen);; if(!isMacBinaryFile) return paramErr; if(WORD_AT_OFFSET(header, kSecondaryHeaderLengthOffset)) { headerEnd = WORD_AT_OFFSET(header, kSecondaryHeaderLengthOffset); headerEnd = (headerEnd + 127) & ~127L; } resourceForkLength = LONG_AT_OFFSET(header, kResourceForkLengthOffset); dataForkLength = LONG_AT_OFFSET(header, kDataForkLengthOffset); commentLength = WORD_AT_OFFSET(header, kGetInfoCommentLengthOffset); memcpy( destination->name, PTR_AT_OFFSET(header, kFileNameLengthOffset), BYTE_AT_OFFSET(header, kFileNameLengthOffset)); fndrInfo.fdType = LONG_AT_OFFSET(header, kFileTypeOffset); fndrInfo.fdCreator = LONG_AT_OFFSET(header, kFileCreatorOffset); fndrInfo.fdFlags = BYTE_AT_OFFSET(header, kFinderFlagsHiOffset); fndrInfo.fdFlags << 8; fndrInfo.fdFlags |= BYTE_AT_OFFSET(header, kFinderFlagsLowOffset); fndrInfo.fdLocation.v = WORD_AT_OFFSET(header, kFileVPositionOffset); fndrInfo.fdLocation.h = WORD_AT_OFFSET(header, kFileHPositionOffset); fndrInfo.fdFldr = WORD_AT_OFFSET(header, kFileFolderIDOffset);/* index = 1; checkFile = *destination; while(FSpExists(&checkFile)) { checkFile = *destination; if(index < 10) checkFile.name[++checkFile.name[0]] = '0' + index; else checkFile.name[++checkFile.name[0]] = ('a' - 10) + index; index++; } *destination = checkFile;*/ err = FSpCreate(destination, fndrInfo.fdCreator, fndrInfo.fdType, smSystemScript); dfRefNum = 0; if(err == noErr) { err = FSpOpenDF(destination, fsRdWrPerm, &dfRefNum); } if(err == noErr && dfRefNum) { ioCount = dataForkLength; err = FSWrite(dfRefNum,&ioCount,*data + headerEnd); FSClose(dfRefNum); } rfRefNum = 0; if(err == noErr) { err = FSpOpenRF(destination, fsRdWrPerm, &rfRefNum); } rfOffset = headerEnd + dataForkLength; rfOffset = (rfOffset + 127) & ~127L; if(err == noErr && rfRefNum) { ioCount = resourceForkLength; err = FSWrite(rfRefNum,&ioCount,*data + rfOffset); FSClose(rfRefNum); } rfOffset += resourceForkLength; rfOffset = (rfOffset + 127) & ~127L; if(err == noErr) { FSpSetFInfo(destination,&fndrInfo); memset(&pb, 0, sizeof(CInfoPBRec)); pb.hFileInfo.ioNamePtr = destination->name; pb.hFileInfo.ioVRefNum = destination->vRefNum; pb.hFileInfo.ioFDirIndex = 0; /* query a file */ pb.hFileInfo.ioDirID = destination->parID; err = PBGetCatInfo(&pb,false); if(err == noErr) { pb.hFileInfo.ioDirID = destination->parID; pb.hFileInfo.ioFlCrDat = LONG_AT_OFFSET(header, kFileCreationDateOffset); pb.hFileInfo.ioFlMdDat = LONG_AT_OFFSET(header, kFileModificationDateOffset); pb.hFileInfo.ioFlXFndrInfo.fdXFlags = BYTE_AT_OFFSET(header, kExtendedFinderFlagsOffset); pb.hFileInfo.ioFlXFndrInfo.fdScript = BYTE_AT_OFFSET(header, kFilenameScriptOffset); err = PBSetCatInfo(&pb, false); } if(commentLength) { memcpy(comment,*data + rfOffset, commentLength); SetDesktopComment(destination, comment, commentLength); } } HUnlock(data); return err;}#endif /* INCLUDE_DECODE_MACBINARY */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -