ULONGLONG CMultiFiles::Seek(LONGLONG lOff, UINT nFrom) { LARGE_INTEGER llNewPos; LARGE_INTEGER llOff; if (m_strFiles.GetCount() == 1) { llOff.QuadPart = lOff; SetFilePointerEx (m_hFile, llOff, &llNewPos, nFrom); return llNewPos.QuadPart; } else { LONGLONG lAbsolutePos = GetAbsolutePosition(lOff, nFrom); int nNewPart = 0; ULONGLONG llSum = 0; while (m_FilesSize[nNewPart]+llSum <= lAbsolutePos) { llSum += m_FilesSize[nNewPart]; nNewPart++; } OpenPart (nNewPart); llOff.QuadPart = lAbsolutePos - llSum; SetFilePointerEx (m_hFile, llOff, &llNewPos, FILE_BEGIN); return llSum + llNewPos.QuadPart; } }
BOOL CMultiFiles::Open(LPCTSTR lpszFileName, UINT nOpenFlags) { Reset(); m_strFiles.Add (lpszFileName); return OpenPart(0); }
BOOL CMultiFiles::OpenFiles(CAtlList<CHdmvClipInfo::PlaylistItem>& files, UINT nOpenFlags) { POSITION pos = files.GetHeadPosition(); LARGE_INTEGER llSize; int nPos = 0; REFERENCE_TIME rtDur = 0; Reset(); while(pos) { CHdmvClipInfo::PlaylistItem& s = files.GetNext(pos); m_strFiles.Add(s.m_strFileName); if (!OpenPart(nPos)) return false; llSize.QuadPart = 0; GetFileSizeEx (m_hFile, &llSize); m_llTotalLength += llSize.QuadPart; m_FilesSize.Add (llSize.QuadPart); m_rtPtsOffsets.Add (rtDur); rtDur += s.Duration(); nPos++; } if (files.GetCount() > 1) ClosePart(); return TRUE; }
UINT CMultiFiles::Read(void* lpBuf, UINT nCount) { DWORD dwRead; do { if (!ReadFile(m_hFile, lpBuf, nCount, &dwRead, NULL)) { break; } if (dwRead != nCount && (m_nCurPart < 0 || (size_t)m_nCurPart < m_strFiles.GetCount()-1)) { OpenPart (m_nCurPart+1); lpBuf = (void*)((BYTE*)lpBuf + dwRead); nCount -= dwRead; } } while (nCount != dwRead && (m_nCurPart < 0 || (size_t)m_nCurPart < m_strFiles.GetCount()-1)); return dwRead; }