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

📄 smplfsys.cpp

📁 linux下的一款播放器
💻 CPP
📖 第 1 页 / 共 5 页
字号:
                        //                        // Clear the progressive download failure flag                        rbProgFail = FALSE;                        // Finish the DoRead                        return FinishDoRead(actual, pBuffer);                    }                }            } /* if (m_pProgDownMon->HasBeenProgressive()) else */        }        else /* if (actual < ulCount) */        {            // The read succeeded            //            // Reset the not progressive retry count            m_pProgDownMon->ResetNotProgressiveRetryCount();            // Clear the progressive download failure flag            rbProgFail = FALSE;            // Finish the DoRead            return FinishDoRead(actual, pBuffer);        }    }    else /* if (m_pProgDownMon) */#endif /* #if defined(HELIX_FEATURE_PROGDOWN) */    {        // Clear the progressive download failure flag        rbProgFail = FALSE;        // Finish the DoRead        return FinishDoRead(actual, pBuffer);    }#else /* #ifndef _MACINTOSH */    BOOL bAtInterrupt = FALSE;    if (m_pInterruptState)    {	bAtInterrupt = m_pInterruptState->AtInterruptTime();    }    m_bAsyncReadPending = TRUE;    theErr = m_pDataFile->SafeRead(ulCount, bAtInterrupt);#endif /* #ifndef _MACINTOSH #else */    return theErr;}/************************************************************************ *  Method: *	IHXFileObject::Write *  Purpose: *	Writes a buffer of data to the file and asynchronously notifies *	the caller via the IHXFileResponse interface passed in to Init, *	of the completeness of the operation. */STDMETHODIMP CSimpleFileObject::Write(IHXBuffer* pBuffer){    if (m_nFd == -1 || !(m_ulFlags & HX_FILE_WRITE))    {	return HXR_UNEXPECTED;    }    pBuffer->AddRef();#ifdef _MACINTOSH	BOOL bAtInterrupt = FALSE;	if (m_pInterruptState)	{	    bAtInterrupt = m_pInterruptState->AtInterruptTime();	}    UINT32 actual = m_pDataFile->SafeWrite(pBuffer, bAtInterrupt);#else    UINT32 actual = m_pDataFile->Write(pBuffer);#endif    pBuffer->Release();    if (actual > 0)    {	m_ulPos += actual;    }    if(actual == pBuffer->GetSize())	m_pFileResponse->WriteDone(HXR_OK);    else	m_pFileResponse->WriteDone(HXR_FAILED);    return HXR_OK;}/************************************************************************ *  Method: *	IHXFileObject::Seek *  Purpose: *	Seeks to an offset in the file and asynchronously notifies *	the caller via the IHXFileResponse interface passed in to Init, *	of the completeness of the operation. */STDMETHODIMP CSimpleFileObject::Seek(ULONG32 ulOffset, BOOL bRelative){    MLOG_GEN(NULL, "CSimpleFileObject::Seek(%lu,%lu) this=0x%08x tick=%lu\n",             ulOffset, bRelative, this, HX_GET_BETTERTICKCOUNT());    HX_LOG_BLOCK( "CSimpleFileObject::Seek" );    if((m_nFd == -1) && m_bCanBeReOpened)    {	DPRINTF(0x5d000000, ("CSFO::Seek() -- _OpenFile()\n"));	_OpenFile(m_ulFlags);    }    if (m_nFd != -1)    {	/* remove any pending callbacks */        if (m_pStackCallback) m_pStackCallback->Cancel(m_pScheduler);#if defined(HELIX_FEATURE_PROGDOWN)        // Seeks can interrupt other seeks, and cancel them        // out. Therefore, if we had scheduled a callback to        // handle a failed seek or a failed read, then we need        // to cancel that callback.        if (m_pProgDownMon && m_pProgDownMon->IsCallbackPending())        {            m_pProgDownMon->CancelCallback();        }#endif /* #if defined(HELIX_FEATURE_PROGDOWN) */	AddRef(); // Make sure we do not destruct on possible ReadDone	/*	 *  Seek cancels pending Reads.	 */	if (m_bReadPending)	{	    ActualAsyncReadDone(HXR_CANCELLED, NULL);	}	int whence = SEEK_SET;	if(bRelative)	    whence = SEEK_CUR;#ifndef _MACINTOSH        // Save the pending seek parameters        m_ulPendingSeekOffset = ulOffset;        m_usPendingSeekWhence = (UINT16) whence;        // Do the seek        HX_RESULT seekDoneResult = HXR_OK;        HX_RESULT result = DoSeek(seekDoneResult);        // Undo the AddRef();        Release();	return ((result == HXR_OK) ? seekDoneResult : result);#else	BOOL bAtInterrupt = FALSE;	if (m_pInterruptState)	{	    bAtInterrupt = m_pInterruptState->AtInterruptTime();	}	m_eSeekReason = EXTERNAL_SEEK;	HX_RESULT seekDoneResult = m_pDataFile->SafeSeek(ulOffset, whence, bAtInterrupt);	Release();	return seekDoneResult;#endif    }    return HXR_UNEXPECTED;}HX_RESULT CSimpleFileObject::DoSeek(REF(HX_RESULT) rSeekDoneResult){    MLOG_PD(NULL, "CSimpleFileObject::DoSeek() this=0x%08x tick=%lu offset=%lu whence=%u\n",            this, HX_GET_BETTERTICKCOUNT(), m_ulPendingSeekOffset, m_usPendingSeekWhence);    HX_RESULT result = m_pDataFile->Seek(m_ulPendingSeekOffset,                                         m_usPendingSeekWhence);    if (result == HXR_OK)    {	if (m_usPendingSeekWhence == SEEK_SET)	{	    m_ulPos = m_ulPendingSeekOffset;	}	else	{	    m_ulPos += m_ulPendingSeekOffset;	}    }#if defined(HELIX_FEATURE_PROGDOWN)    // For the purposes of progressive download, we    // will assume that seeking never fails. We will    // add the assert below to catch anytime it does.    // If we are finding that this assert is tripping,    // then we need to add equivalent support in DoSeek()    // for progressive download that we have in DoRead().    HX_ASSERT(SUCCEEDED(result));#endif /* #if defined(HELIX_FEATURE_PROGDOWN) */    rSeekDoneResult = ActualAsyncSeekDone(result);    return result;}void CSimpleFileObject::SeekBackwards(UINT32 ulNumBytes){    if (m_pDataFile && ulNumBytes)    {        // Get the current offset        UINT32 ulCurOffset = m_pDataFile->Tell();        // Make sure the number of bytes we         // are supposed to back up is not greater        // than the current offset        if (ulNumBytes > ulCurOffset) ulNumBytes = ulCurOffset;        // Compute the new absolute offset        UINT32 ulNewOffset = ulCurOffset - ulNumBytes;        // Seek the data file to this offset        m_pDataFile->Seek(ulNewOffset, SEEK_SET);    }}HX_RESULT CSimpleFileObject::FinishDoRead(UINT32 actual, REF(IHXBuffer*) pBuffer){    /*     * If they get to the end of the file, then close it and reset.     */    if (actual > 0 && pBuffer)    {        m_ulPos += actual;    }#if defined(HELIX_FEATURE_PROGDOWN)    if (m_ulSize && (!m_bProgDownEnabled || (m_pProgDownMon && !m_pProgDownMon->HasBeenProgressive())))#else    if (m_ulSize)#endif    {        if(m_ulPos >= m_ulSize)        {	    DPRINTF(0x5d000000, ("CSFO::Read() -- m_pDataFile->Close()\n"));	    m_pDataFile->Close();	    m_nFd = -1;	    if (m_pDescriptorReg)	    {	        m_pDescriptorReg->UnRegisterDescriptors(1);	    }	    m_bCanBeReOpened = 1;        }    }    /* ignore return value from readdone! */    ActualAsyncReadDone((actual > 0 && pBuffer) ? HXR_OK : HXR_FAILED, pBuffer);    // Release our reference on the buffer!    HX_RELEASE(pBuffer);    return HXR_OK;}STDMETHODIMP CSimpleFileObject::InitDirHandler(    IHXDirHandlerResponse*    /*IN*/  pDirResponse){    m_pDirResponse = pDirResponse;    m_pDirResponse->AddRef();    m_pDirResponse->InitDirHandlerDone(HXR_OK);    return HXR_OK;}STDMETHODIMP CSimpleFileObject::CloseDirHandler(){    // Members must not be accessed after async ...Done() response    if (m_pDirResponse)    {	IHXDirHandlerResponse *pTmpDirResponse = m_pDirResponse;	m_pDirResponse = NULL;	pTmpDirResponse->CloseDirHandlerDone(HXR_OK);	pTmpDirResponse->Release();    }    return HXR_OK;}STDMETHODIMP CSimpleFileObject::MakeDir(){    CHXString strFileName;    HX_RESULT retVal = HXR_OK;    UpdateFileNameMember();    GetFullPathname(m_pFilename, &strFileName);#if defined (_WINDOWS ) || defined (_WIN32)    if (CreateDirectory(OS_STRING((const char*) strFileName), 0) == 0)    {	retVal = HXR_FAIL;    }#elif defined (_UNIX)    if (mkdir((const char*) strFileName, 0755) < 0)    {	retVal = HXR_FAIL;    }#elif defined (_MACINTOSH)    //XXXGH...don't know how to do this on Mac    retVal = HXR_FAIL;#else    XHXDirectory* pHXDirectory = XHXDirectory::Construct(&m_pFileSystem->m_pCommonObj);    retVal = HXR_OUTOFMEMORY;    if (pHXDirectory)    {	retVal = HXR_FAIL;	pHXDirectory->SetPath((const char*) strFileName);	if (pHXDirectory->Create())	{	    retVal = HXR_OK;	}	delete pHXDirectory;    }#endif    m_pDirResponse->MakeDirDone(retVal);    return HXR_OK;}STDMETHODIMP CSimpleFileObject::ReadDir(){    const char* pDirname = 0;    if (!m_pDirList)    {	CHXString strFileName;	UpdateFileNameMember();	GetFullPathname(m_pFilename, &strFileName);	m_pDirList =	    CFindFile::CreateFindFile((const char*)strFileName, 0, "*");	if (!m_pDirList)	{	    m_pDirResponse->ReadDirDone(HXR_FAIL, 0);	    return HXR_OK;	}	pDirname = m_pDirList->FindFirst();    }    else    {	pDirname = m_pDirList->FindNext();    }    if (!pDirname)    {	delete m_pDirList;	m_pDirList = 0;	m_pDirResponse->ReadDirDone(HXR_FILE_NOT_FOUND, 0);	return HXR_OK;    }    HX_RESULT result;    if (!m_pCommonClassFactory)    {	result = m_pContext->QueryInterface(IID_IHXCommonClassFactory,	                                    (void **)&m_pCommonClassFactory);	if (HXR_OK != result)	{	    return result;	}    }    IHXBuffer* pBuffer = 0;    result = m_pCommonClassFactory->CreateInstance(CLSID_IHXBuffer,                                                   (void**)&pBuffer);    if (HXR_OK != result)    {	return result;    }    pBuffer->Set((Byte*)pDirname, strlen(pDirname)+1);    m_pDirResponse->ReadDirDone(HXR_OK, pBuffer);    pBuffer->Release();    return HXR_OK;}/************************************************************************ * Method: *	IHXFileObject::Stat * Purpose: *	Collects information about the file that is returned to the *	caller in an IHXStat object */STDMETHODIMP CSimpleFileObject::Stat(IHXFileStatResponse* pFileStatResponse){    MLOG_GEN(NULL, "CSimpleFileObject::Stat(0x%08x) this=0x%08x\n", pFileStatResponse, this);    HX_LOG_BLOCK( "CSimpleFileObject::Stat" );    struct stat StatBuffer;    CHXString	strFileName;#ifdef _MACINTOSH        // if fstat fails#ifdef _MAC_MACHO	GetFullPathname(m_pFilename, &strFileName);        int res = stat(strFileName, &StatBuffer);#else        int res = stat(m_pFilename, &StatBuffer);#endif	if ( res != 0 )	{		// return failure code		return HXR_FAIL;	}#else    if(m_nFd == -1)    {	CHXString   strURL;	UpdateFileNameMember();	strURL = m_pFilename;	GetFullPathname(strURL, &strFileName);	m_pDataFile->Bind((const char *)strFileName);    }    if (m_pDataFile->Stat(&StatBuffer) != HXR_OK)    {	pFileStatResponse->StatDone(HXR_FAIL,	    0,	    0,	    0,	    0,	    0);	return HXR_OK;    }#endif    /*     * XXXSMP:     *    We we need this because RealPix opens up tons of files     *    just to stat them.  If you are reading this comment     *    and the date is past July 31, then please yell at     *    Sujal.     */#if !defined(_MACINTOSH)    if(m_nFd != -1)    {	DPRINTF(0x5d000000, ("CSFO::Stat() -- m_pDataFile->Close()\n"));	if (m_pDescriptorReg)	{	    m_pDescriptorReg->UnRegisterDescriptors(1);	}	m_pDataFile->Close();	m_nFd = -1;	m_bCanBeReOpened = 1;    }#endif    m_ulSize = StatBuffer.st_size;    pFileStatResponse->StatDone(HXR_OK,				StatBuffer.st_size,				StatBuffer.st_ctime,				StatBuffer.st_atime,

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -