⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 cmacfile_carbon.cpp

📁 linux下的一款播放器
💻 CPP
📖 第 1 页 / 共 2 页
字号:
				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 + -