__int64 MultiFileReader::GetFileSize() { return m_endPosition - m_startPosition; if (m_cachedFileSize==0) { RefreshTSBufferFile(); RefreshFileSize(); } return m_cachedFileSize; }
HRESULT MultiFileReader::Read(PBYTE pbData, ULONG lDataLength, ULONG *dwReadBytes) { HRESULT hr; // If the file has already been closed, don't continue if (m_TSBufferFile.IsFileInvalid()) return S_FALSE; RefreshTSBufferFile(); RefreshFileSize(); if (m_currentPosition < m_startPosition) m_currentPosition = m_startPosition; // Find out which file the currentPosition is in. MultiFileReaderFile *file = NULL; std::vector<MultiFileReaderFile *>::iterator it = m_tsFiles.begin(); for ( ; it < m_tsFiles.end() ; it++ ) { file = *it; if (m_currentPosition < (file->startPosition + file->length)) break; }; if(!file) { LogDebug("MultiFileReader::no file"); return S_FALSE; } if (m_currentPosition < (file->startPosition + file->length)) { if (m_TSFileId != file->filePositionId) { m_TSFile.CloseFile(); m_TSFile.SetFileName(file->filename); m_TSFile.OpenFile(); m_TSFileId = file->filePositionId; if (m_bDebugOutput) { USES_CONVERSION; TCHAR sz[MAX_PATH+128]; wsprintf(sz, TEXT("Current File Changed to %s\n"), W2T(file->filename)); //::OutputDebugString(sz); } } __int64 seekPosition = m_currentPosition - file->startPosition; m_TSFile.SetFilePointer(seekPosition, FILE_BEGIN); __int64 posSeeked=m_TSFile.GetFilePointer(); if (posSeeked!=seekPosition) { LogDebug("SEEK FAILED"); } ULONG bytesRead = 0; __int64 bytesToRead = file->length - seekPosition; if (lDataLength > bytesToRead) { hr = m_TSFile.Read(pbData, (ULONG)bytesToRead, &bytesRead); if (FAILED(hr)) { LogDebug("READ FAILED1"); } m_currentPosition += bytesToRead; hr = this->Read(pbData + bytesToRead, lDataLength - (ULONG)bytesToRead, dwReadBytes); if (FAILED(hr)) { LogDebug("READ FAILED2"); } *dwReadBytes += bytesRead; } else { hr = m_TSFile.Read(pbData, lDataLength, dwReadBytes); if (FAILED(hr)) { LogDebug("READ FAILED2"); } m_currentPosition += lDataLength; } } else { // The current position is past the end of the last file *dwReadBytes = 0; } return S_OK; }
long MultiFileReader::Read(unsigned char* pbData, unsigned long lDataLength, unsigned long *dwReadBytes) { long hr; // If the file has already been closed, don't continue if (m_TSBufferFile.IsFileInvalid()) return S_FALSE; RefreshTSBufferFile(); RefreshFileSize(); if (m_currentPosition < m_startPosition) m_currentPosition = m_startPosition; // Find out which file the currentPosition is in. MultiFileReaderFile *file = NULL; std::vector<MultiFileReaderFile *>::iterator it = m_tsFiles.begin(); for ( ; it < m_tsFiles.end() ; it++ ) { file = *it; if (m_currentPosition < (file->startPosition + file->length)) break; }; if(!file) { XBMC->Log(LOG_DEBUG, "MultiFileReader::no file"); return S_FALSE; } if (m_currentPosition < (file->startPosition + file->length)) { if (m_TSFileId != file->filePositionId) { m_TSFile.CloseFile(); m_TSFile.SetFileName(file->filename.c_str()); m_TSFile.OpenFile(); m_TSFileId = file->filePositionId; if (m_bDebugOutput) { XBMC->Log(LOG_DEBUG, "MultiFileReader::Read() Current File Changed to %s\n", file->filename.c_str()); } } int64_t seekPosition = m_currentPosition - file->startPosition; m_TSFile.SetFilePointer(seekPosition, FILE_BEGIN); int64_t posSeeked=m_TSFile.GetFilePointer(); if (posSeeked!=seekPosition) { XBMC->Log(LOG_DEBUG, "SEEK FAILED"); } unsigned long bytesRead = 0; int64_t bytesToRead = file->length - seekPosition; if (lDataLength > bytesToRead) { hr = m_TSFile.Read(pbData, (unsigned long)bytesToRead, &bytesRead); if (FAILED(hr)) { XBMC->Log(LOG_DEBUG, "READ FAILED1"); } m_currentPosition += bytesToRead; hr = this->Read(pbData + bytesToRead, lDataLength - (unsigned long)bytesToRead, dwReadBytes); if (FAILED(hr)) { XBMC->Log(LOG_DEBUG, "READ FAILED2"); } *dwReadBytes += bytesRead; } else { hr = m_TSFile.Read(pbData, lDataLength, dwReadBytes); if (FAILED(hr)) { XBMC->Log(LOG_DEBUG, "READ FAILED2"); } m_currentPosition += lDataLength; } } else { // The current position is past the end of the last file *dwReadBytes = 0; } return S_OK; }