📄 smplfsys.cpp
字号:
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,
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;
}
void
CSimpleFileObject::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.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -