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

📄 smplfsys.cpp

📁 linux下的一款播放器
💻 CPP
📖 第 1 页 / 共 5 页
字号:
				StatBuffer.st_mtime,				StatBuffer.st_mode);    return HXR_OK;}/************************************************************************ *  Method: *	IHXFileObject::Advise *  Purpose: *	To pass information to the File Object */STDMETHODIMP CSimpleFileObject::Advise(ULONG32 ulInfo){    MLOG_GEN(NULL, "CSimpleFileObject::Advise(%s) this=0x%08x\n",             (ulInfo == HX_FILEADVISE_RANDOMACCESS ? "HX_FILEADVISE_RANDOMACCESS" :                (ulInfo == HX_FILEADVISE_SYNCACCESS ? "HX_FILEADVISE_SYNCACCESS" :                   (ulInfo == HX_FILEADVISE_ASYNCACCESS ? "HX_FILEADVISE_ASYNCACCESS" :                      (ulInfo == HX_FILEADVISE_RANDOMACCESSONLY ? "HX_FILEADVISE_RANDOMACCESSONLY" :                         (ulInfo == HX_FILEADVISE_ANYACCESS ? "HX_FILEADVISE_ANYACCESS" : "Unknown"))))),             this);    HX_RESULT retVal = HXR_FAIL;#ifndef _MACINTOSH    if (ulInfo == HX_FILEADVISE_SYNCACCESS)    {	m_bAsyncAccess = FALSE;	retVal = HXR_OK;    }    else if (ulInfo == HX_FILEADVISE_ASYNCACCESS)    {	m_bAsyncAccess = TRUE;	retVal = HXR_OK;    }#if defined(HELIX_FEATURE_PROGDOWN)    else if (ulInfo == HX_FILEADVISE_RANDOMACCESS)    {        retVal = HXR_OK;        if (m_pProgDownMon && m_bProgDownEnabled)        {            // Has this file ever been progressive?            if (m_pProgDownMon->HasBeenProgressive())            {                // It has been in the past, but                // is it currently progressive?                if (m_pProgDownMon->IsProgressive())                {                    // Set the linear return value                    retVal = HXR_ADVISE_PREFER_LINEAR;                }            }            else            {                // Manually monitor the file size. This                // will trigger HasBeenProgressive() to                 // be true if the file is progressive                m_pProgDownMon->MonitorFileSize();                // Are we now progressive?                if (m_pProgDownMon->HasBeenProgressive())                {                    // Set the linear return value                    retVal = HXR_ADVISE_PREFER_LINEAR;                    // Begin the monitoring of the file size                    m_pProgDownMon->BeginSizeMonitoring();                }            }        }    }#endif /* #if defined(HELIX_FEATURE_PROGDOWN) */#endif	// _MACINTOSH    MLOG_GEN(NULL, "\treturn %s\n",             (retVal == HXR_OK ? "HXR_OK" :                (retVal == HXR_FAIL ? "HXR_FAIL" :                   (retVal == HXR_ADVISE_PREFER_LINEAR ? "HXR_ADVISE_PREFER_LINEAR" :                      "Unknown"))));    return retVal;}/************************************************************************ *	Method: *	    IHXFileObject::GetFileObjectFromPool *	Purpose: *      To get another FileObject from the same pool. */STDMETHODIMP CSimpleFileObject::GetFileObjectFromPool (    IHXGetFileFromSamePoolResponse* response){    HX_RESULT lReturnVal = HXR_FAILED;    CSimpleFileObject* pFileObject = 0;    CHXString new_path;    CHXString strFileName;    CHXString strURL;    IUnknown* pUnknown = 0;    char* pNewPath    = 0;    char* pSeparator  = 0;    UpdateFileNameMember();    if(!m_pFilename)    {	pNewPath = new char[strlen(m_base_path) + 1];	strcpy(pNewPath, m_base_path); /* Flawfinder: ignore */    }    else    {	strURL = m_pFilename;	// Make a nice local file name from the URL!	GetFullPathname(strURL, &strFileName);	pNewPath = new char[strlen(strFileName) + 1];	strcpy(pNewPath, (const char*)strFileName); /* Flawfinder: ignore */	pSeparator = ::strrchr(pNewPath, OS_SEPARATOR_CHAR);	if(pSeparator)	{	    /* Separator will be added in seturl */	    *pSeparator = 0;	}	else	{	    // started w/filename. no separator implies no path	    pNewPath[0] = 0;	}    }    new_path = pNewPath;    if (pNewPath)    {	delete [] pNewPath;	pNewPath = 0;    }    pFileObject = new CSimpleFileObject(new_path,					m_pFileSystem,					m_pContext,					m_ulMaxIterationLevel);    if (!pFileObject)    {	return HXR_OUTOFMEMORY;    }    lReturnVal = pFileObject->QueryInterface(IID_IUnknown,					     (void**)&pUnknown);    response->FileObjectReady(lReturnVal == HXR_OK ?			      HXR_OK : HXR_FAILED,			      pUnknown);    if(pUnknown)    {	pUnknown->Release();	pUnknown = NULL;    }    return lReturnVal;}// IHXFileExists interface/************************************************************************ *	Method: *	    IHXFileExists::DoesExist *	Purpose: */STDMETHODIMP CSimpleFileObject::DoesExist(const char* /*IN*/  pPath,				IHXFileExistsResponse* /*IN*/  pFileResponse){    BOOL bExists = FALSE;    BOOL bPlusURL = FALSE;    CHXString   strFileName;    CHXString	strPath;    CHXString   plusFileName;    CHXString   plusPath;    strPath = pPath;    bPlusURL = HXXFile::IsPlusURL(pPath);    if (bPlusURL)    {	INT32 index = strPath.ReverseFind('+');	plusFileName = strPath.Right(strPath.GetLength() - (index+1));	strPath = strPath.Left(index);	index = strPath.ReverseFind('/');	if (index >= 0)	{	    plusPath = strPath.Left(index+1);	    plusPath = plusPath + plusFileName;	}	else	{	    plusPath = plusFileName;	}	HXXFile::GetReasonableLocalFileName(plusPath);	GetFullPathname(plusPath, &plusFileName);    }    // Make a nice local file name from the URL!    HXXFile::GetReasonableLocalFileName(strPath);    GetFullPathname(strPath, &strFileName);#ifdef _MACINTOSH    CHXDataFile*	    pDataFile = 0; /* cross-platform file object */    pDataFile = CHXDataFile::Construct();    if (pDataFile->Open((const char*)strFileName,O_RDONLY) == HXR_OK)    {	if (bPlusURL)	{	    if (pDataFile->Open((const char*)plusFileName,O_RDONLY) == HXR_OK)	    {		bExists = TRUE;	    }	}	else	{	    bExists = TRUE;	}    }    delete pDataFile;#else    struct stat statbuf;    m_pDataFile->Bind((const char *)strFileName);    if (m_pDataFile->Stat(&statbuf) == 0)    {	if (bPlusURL)	{	    m_pDataFile->Bind((const char *)plusFileName);	    if (m_pDataFile->Stat(&statbuf) == 0)	    {		DPRINTF(0x5d000000, ("CSFO::DoesExist() -- both r TRUE\n"));		bExists = TRUE;	    }	}	else	{	    DPRINTF(0x5d000000, ("CSFO::DoesExist() -- TRUE\n"));	    bExists = TRUE;	}    }    else	DPRINTF(0x5d000000, ("CSFO::DoesExist() -- FALSE\n"));#endif    pFileResponse->DoesExistDone(bExists);    return HXR_OK;}/************************************************************************ *	Method: *	    Private interface::OpenFile *	Purpose: *	    This common method is used from Init() and GetFileObjectFromPool() */STDMETHODIMP CSimpleFileObject::_OpenFile(ULONG32     ulFlags){    HX_LOG_BLOCK( "CSimpleFileObject::_OpenFile" );    DPRINTF(0x5d000000, ("CSFO::_OpenFile(%lu)\n", ulFlags));    HX_RESULT lReturnVal = HXR_OK;    IHXUserImpersonation* pUserImpersonationThis = NULL;    CHXString strFileName;    CHXString strURL;    m_ulFlags = ulFlags;    UpdateFileNameMember();    strURL = m_pFilename;    // Make a nice local file name from the URL!    GetFullPathname(strURL, &strFileName);    if (m_pUnknownUserContext)    {	m_pUnknownUserContext->QueryInterface(IID_IHXUserImpersonation,	    (void**)&pUserImpersonationThis);    }    if (pUserImpersonationThis)    {	// see ntauth plugin	pUserImpersonationThis->Start();    }    UINT16 flags = 0;#ifdef _MACINTOSH    // use native modes    if (ulFlags & HX_FILE_READ)	flags |= O_RDONLY;    if (ulFlags & HX_FILE_WRITE)	flags |= O_WRONLY;    if (ulFlags & HX_FILE_BINARY)	flags |= O_BINARY;    if (!ulFlags)    {	flags = O_RDONLY | O_BINARY;	m_ulFlags = HX_FILE_READ | HX_FILE_BINARY;    }    // XXXGH must do HX_FILE_REPLACE for MAC    m_pDataFile = (CMacAsyncFile*) CMacAsyncFile::Construct();    m_pDataFile->SetAsyncResponse(m_pAsyncFileResponse);    BOOL bAtInterrupt = FALSE;    if (m_pInterruptState)    {         bAtInterrupt = m_pInterruptState->AtInterruptTime();    }    m_nFd = m_pDataFile->SafeOpen((const char*)strFileName,flags, 0, bAtInterrupt);#else    if (ulFlags & HX_FILE_READ)	flags |= HX_FILEFLAG_READ;    if (ulFlags & HX_FILE_WRITE)	flags |= HX_FILEFLAG_WRITE;    if (ulFlags & HX_FILE_BINARY)	flags |= HX_FILEFLAG_BINARY;    if (!ulFlags)    {	flags = HX_FILEFLAG_READ | HX_FILEFLAG_BINARY;	m_ulFlags = HX_FILE_READ | HX_FILE_BINARY;    }    DPRINTF(0x5d000000, ("CSFO::_OpenFile() -- flags(%u)\n", flags));    HX_ASSERT(m_pDataFile);    MLOG_GEN(NULL, "CSimpleFileObject::_OpenFile() this=0x%08x tick=%lu filename=%s\n",             this, HX_GET_BETTERTICKCOUNT(), (const char*) strFileName);    m_pDataFile->Bind((const char *)strFileName);    if (HXR_OK == m_pDataFile->Open((UINT16)m_ulFlags))    {	m_nFd = m_pDataFile->GetFd();	DPRINTF(0x5d000000, ("CSFO::_OpenFile() "		"-- fd(%d), filename(%s)\n", m_nFd,		((const char *)strFileName) ? (const char *)strFileName : "NULL"));    }    else    {	m_nFd = -1;    }#endif    if (pUserImpersonationThis)    {	pUserImpersonationThis->Stop();    }    /* InitDone may result in close/destruction of this object.Mime mapper     * is only interested in the mimetype. This is the sequence of events:     * InitDone->FinishSetup->Close MimeMapper.. Release it. load right ff     * hand over file system to the file format.     * So by the time control returns back here, this object may already be     * closed, resulting in m_nFd = -1     */    if (m_nFd != -1)    {	lReturnVal = HXR_OK;    }    else if (pUserImpersonationThis)    {	lReturnVal = HXR_NOT_AUTHORIZED;    }    else    {	DPRINTF(0x5d000000, ("Error: file missing\n"));	lReturnVal = HXR_DOC_MISSING;    }    HX_RELEASE(pUserImpersonationThis);    if (lReturnVal == HXR_OK)    {	if (!m_pDescriptorReg)	{	    m_pContext->QueryInterface(IID_IHXDescriptorRegistration,						(void **)&m_pDescriptorReg);	}	if (m_pDescriptorReg)	{	    m_pDescriptorReg->RegisterDescriptors(1);	}    }    return lReturnVal;}voidCSimpleFileObject::UpdateFileNameMember(){    const char* pURL;    if (m_base_path.GetLength() > 0)    {       /* Running on the Server, do this without wasting CPU! */       if (m_pRequest->GetURL(pURL) != HXR_OK)       {	   HX_VECTOR_DELETE(m_pFilename);	   return;       }       UINT32 ulIndex = 0;       while (pURL[ulIndex] != 0)       {	   // HP - allow '$' in directory/file names	   //	   // still need to take care of that obsolete $ sign option:	   // rtsp://moe.cr.prognet.com/ambush.rm$1:00	   // time after the $ is assumed to be the start time.	   //	   // the solution is to compare the string following the $ to	   // a properly formed time. If the string is a time and only	   // a time, then we know its the old-style start-time option	   // otherwise, '$' is part of the directory/file name and we	   // will keep it.	   if (pURL[ulIndex] == '$')	   {	       const char* pszOption = &pURL[ulIndex + 1];	       if (::TimeParse(pszOption))	       {		   goto strip_and_duplicate;	       }	   }	   else	   {#if !defined(_MACINTOSH) && !defined(_MAC_UNIX)	// ? # and + are legal in Mac file names and shouldn't be stripped (yes, we're seeing a file name, not a URL here)	       switch (pURL[ulIndex])	       {	       case '?':	       case '#':	       case '+':		   goto strip_and_duplicate;	       default:		   break;	       }#endif	   }	   ulIndex++;       }       HX_VECTOR_DELETE(m_pFilename);#if defined(_MACINTOSH) || defined(_MAC_UNIX)       m_pFilename = new_string(pURL); // on Mac, new_path_string mangles legal filenames which have / or \ in them#else       m_pFilename = new_path_string(pURL);#endif       return;strip_and_duplicate:       HX_VECTOR_DELETE(m_pFilename);#if defined(_MACINTOSH) || defined(_MAC_UNIX)       m_pFilename = new_string(pURL); // on Mac, new_path_string mangles legal filenames which have / or \ in them#else       m_pFilename = new_path_string(pURL);#endif       m_

⌨️ 快捷键说明

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