Пример #1
0
__int64 MultiFileReader::GetFileSize()
{
  return m_endPosition - m_startPosition;
  if (m_cachedFileSize==0)
  {
    RefreshTSBufferFile();
    RefreshFileSize();
  }
  return m_cachedFileSize;
}
Пример #2
0
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;
}
Пример #3
0
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;
}