📄 cmacfile_carbon.cpp
字号:
break; case SEEK_CUR: pos = mWriteFile->GetCurPos() + offset; break; case SEEK_END: pos = (mWriteFile->GetBufSize() - 1) - offset; break; } mWriteFile->Seek(pos); } else { switch(fromWhere) { case SEEK_SET: fromWhere = fsFromStart; break; case SEEK_CUR: fromWhere = fsFromMark; break; case SEEK_END: fromWhere = fsFromLEOF; break; } err = ::SetFPos(mRefNum, fromWhere, offset); // returning eofErr was causing problems for ChunkyRes during http play if (err == eofErr) { err = ::SetEOF(mRefNum, offset); err = ::SetFPos(mRefNum, fromWhere, offset); err = HXR_OK; } long pos; ::GetFPos(mRefNum,(long *)&pos); if(!err && mBufferedRead) { long count; ::GetEOF(mRefNum, &count); mBufferFile->PreLoad(pos,count - offset); } /* if(!theErr && mBufferedWrite) { mWriteFile->Seek(pos); } */ } mLastError = err; return(err != noErr ? HXR_INVALID_FILE : 0); }// Tell ULONG32 CMacFile::Tell(void){ ULONG32 pos; if (m_pseudoFileHandle) { pos = m_pseudoFileOffset; mLastError = noErr; } else { mLastError = ::GetFPos(mRefNum,(long *)&pos); } return(pos); }// callback could be at interrupt timepascal void ReadCallback(ParamBlockRec* pb){ OSErr theErr = (*pb).ioParam.ioResult; gReadCount = pb->ioParam.ioActCount; gReadDone = TRUE;}/* Read reads up to count bytes of data into buf. returns the number of bytes read, EOF, or -1 if the read failed */ULONG32 CMacFile::Read (char *buf, ULONG32 count){ OSErr theErr = noErr; if (m_pseudoFileHandle) { INT32 actualCount; theErr = Read(buf, count, &actualCount); count = actualCount; } else { if(mBufferedRead) { count = Copy(buf,count); if(count == 0) theErr = eofErr; } else { // can't do synchronous read at interrupt time if (IsRunningNativeOnMacOSX() || IsMacInCooperativeThread()) { theErr = ::FSRead(mRefNum, (long *)&count, buf); } else { // async i/o - callback could be at interrupt time #if 1 ParamBlockRec pb; gReadCount = 0; gReadDone = FALSE; pb.ioParam.ioRefNum = mRefNum; pb.ioParam.ioBuffer = buf; pb.ioParam.ioReqCount = count; pb.ioParam.ioPosMode=fsAtMark; pb.ioParam.ioCompletion = gReadCallbackUPP; theErr = PBReadAsync(&pb); UINT32 timeout = TickCount() + 60L; while (!gReadDone && timeout-TickCount() > 0) { } count = gReadCount; #endif } } if (theErr == eofErr && count > 0) { theErr = noErr; } } mLastError = theErr; return(mLastError ? 0 : count); //smplfsys::read assumes we return 0 for eof}/* Read reads up to count bytes of data into buf. returns the number of bytes read, EOF, or -1 if the read failed */INT16 CMacFile::Read (char *buf, INT32 count, INT32 *actualCount){OSErr theErr = noErr; long readCount = (long) count; if (m_pseudoFileHandle) { // read from our pseudo-file SInt32 remainingBytes; remainingBytes = m_pseudoFileSize - m_pseudoFileOffset; if (remainingBytes <= 0) { // we've already exhausted the buffer theErr = eofErr; } else { // some bytes remain to be "read" so read them directly // from the resource into the caller's buffer if (remainingBytes < count) { count = remainingBytes; } ReadPartialResource(m_pseudoFileHandle, m_pseudoFileOffset, buf, count); theErr = ResError(); HX_ASSERT(theErr == noErr); // while we don't expect any errors, -188 (resourceInMemory) isn't fatal if (theErr == noErr || theErr == resourceInMemory) { // update our pseudo-file pointer readCount = count; m_pseudoFileOffset += count; theErr = noErr; } } } else { if(mBufferedRead) { readCount = Copy(buf,readCount); if(readCount == 0) theErr = eofErr; } else { if (IsRunningNativeOnMacOSX() || IsMacInCooperativeThread()) theErr = ::FSRead(mRefNum, &readCount, buf); else { // async i/o - callback could be at interrupt time #if 0 ParamBlockRec pb; // IOCompletionUPP proc = NewIOCompletionProc(ReadCallback); gReadCount = 0; gReadDone = FALSE; pb.ioParam.ioRefNum = mRefNum; pb.ioParam.ioBuffer = buf; pb.ioParam.ioReqCount = count; pb.ioParam.ioPosMode=fsAtMark; pb.ioParam.ioCompletion = m_CompletionProc; theErr = PBReadAsync(&pb); EventRecord theEvent; long sleepTime=10; long timeout = 0; // timeout, in case file read can't complete while (!gReadDone && timeout < 100) { ::WaitNextEvent(everyEvent, &theEvent, sleepTime, nil); timeout++; } count = gReadCount; #endif } } } if(theErr == eofErr && readCount > 0) theErr = noErr; if (actualCount) { *actualCount = (INT32) readCount; } return(theErr);}/* Write writes up to count bytes of data from buf. returns the number of bytes written, or -1 if the write failed */ULONG32 CMacFile::Write(const char *buf, ULONG32 count){ HX_ASSERT(!m_pseudoFileHandle); OSErr theErr = noErr; if (IsRunningNativeOnMacOSX() || IsMacInCooperativeThread()) { if(mAppendMode) { theErr = ::SetFPos(mRefNum,fsFromLEOF,0L); } if(!theErr) { if(mBufferedWrite) { mWriteFile->write_data((Ptr)buf,(long)count); } else { theErr = ::FSWrite(mRefNum, (long *)&count, buf); //check_noerr(theErr); a disk full error may occur } } mLastError = theErr;// return(theErr ? -1 : count); } else { if(mBufferedWrite) { mWriteFile->write_data((Ptr)buf,(long)count); } mLastError = theErr; } return ((theErr == noErr) ? count : -1);}/* Write writes up to count bytes of data from buf. returns the number of bytes written, or -1 if the write failed */INT16 CMacFile::Write(const char *buf, INT32 count, INT32 *actualCount){ HX_ASSERT(!m_pseudoFileHandle); OSErr theErr = noErr; *actualCount = 0; if (IsRunningNativeOnMacOSX() || IsMacInCooperativeThread()) { long writeCount = 0; if(mAppendMode) theErr = ::SetFPos(mRefNum, fsFromLEOF, 0L); if(!theErr) { writeCount = count; theErr = ::FSWrite(mRefNum, &writeCount, buf); } *actualCount = (INT32) writeCount; } //check_noerr(theErr); a disk full error may occur // elsewhere the file code expects a negative actualCount when // the write failed if (theErr != noErr) *actualCount = -1; return(theErr);}void CMacFile::SetFileType(OSType creator, OSType type){ sFileType = type; sCreator = creator;}long CMacFile::Copy(Ptr destBuf, long numBytes){ long count; // check for buffered i/o if(mBufferedRead) count = mBufferFile->Copy(destBuf,numBytes); else count = 0; return(count);}HX_RESULT CMacFile::set_buffered_read (char buffered){ Boolean OK = TRUE; HX_ASSERT(!m_pseudoFileHandle); // If this file is setup for writing then we don't want to do any buffered reading. if (m_mode & O_WRONLY) return HXR_OK; if (m_mode & O_RDWR) return HXR_OK; mBufferedRead = 0; return HXR_OK; //HACK! - this needs to be redone! // set up buffered read object if necessary if(buffered && !mBufferedRead) { if(mBufferFile == NULL) { mBufferFile = new CBufferFile; OK = mBufferFile != NULL; } if(OK) OK = mBufferFile->Specify(mRefNum); } else if(!buffered && mBufferedRead) { if(mBufferFile != NULL) { delete mBufferFile; mBufferFile = NULL; } } mBufferedRead = buffered != 0; if(OK) Seek(0,SEEK_SET); return(OK ? HXR_OK : HXR_OUTOFMEMORY);}HX_RESULT CMacFile::set_buffered_write (char buffered){Boolean OK = TRUE; HX_ASSERT(!m_pseudoFileHandle); // set up buffered read object if necessary if(buffered && !mBufferedWrite) { if(mWriteFile == NULL) { mWriteFile = new CWriteFile; OK = mWriteFile != NULL; } if(OK) { OK = mWriteFile->Specify(mRefNum,Tell()); } } else if(!buffered && mBufferedWrite) { if(mWriteFile != NULL) { delete mWriteFile; mWriteFile = NULL; } } mBufferedWrite = buffered != 0; return(OK ? HXR_OK : HXR_OUTOFMEMORY);}// This seems to exist solely so FileIO::status can get the size and an error value;// Otherwise, it's redundant with GetSizeINT16 CMacFile::FileSize(long *size){ if (m_pseudoFileSize) { *size = m_pseudoFileSize; return 0; } return ::GetEOF(mRefNum, size);}BOOL CMacFile::GetTemporaryFileName(const char *tag, char* name, UINT32 ulBufLen){ // we'll make a temp name like tag_2345 CHXString tempNameTemplate(tag); tempNameTemplate += "_%SUB%"; CHXDirSpecifier tempDirSpec = CHXFileSpecUtils::GetSystemTempDirectory(); CHXFileSpecifier tempFileSpec = CHXFileSpecUtils::GetUniqueTempFileSpec( tempDirSpec, (const char *) tempNameTemplate, "%SUB%"); // copy the temp path to the supplied buffer, name name[0] = '\0'; if (tempFileSpec.IsSet()) { CHXString strPath = tempFileSpec.GetPathName(); SafeStrCpy(name, (const char *) strPath, ulBufLen); return TRUE; } return FALSE; }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -