125 |
read(pFile->hFileRead, &ChunkID, 4); |
read(pFile->hFileRead, &ChunkID, 4); |
126 |
read(pFile->hFileRead, &ullCurrentChunkSize, pFile->FileOffsetSize); |
read(pFile->hFileRead, &ullCurrentChunkSize, pFile->FileOffsetSize); |
127 |
#elif defined(WIN32) |
#elif defined(WIN32) |
128 |
if (SetFilePointerEx(pFile->hFileRead, filePos, NULL/*new pos pointer*/, FILE_BEGIN)) { |
const LARGE_INTEGER liFilePos = { .QuadPart = filePos }; |
129 |
|
if (SetFilePointerEx(pFile->hFileRead, liFilePos, NULL/*new pos pointer*/, FILE_BEGIN)) { |
130 |
DWORD dwBytesRead; |
DWORD dwBytesRead; |
131 |
ReadFile(pFile->hFileRead, &ChunkID, 4, &dwBytesRead, NULL); |
ReadFile(pFile->hFileRead, &ChunkID, 4, &dwBytesRead, NULL); |
132 |
ReadFile(pFile->hFileRead, &ullCurrentChunkSize, pFile->FileOffsetSize, &dwBytesRead, NULL); |
ReadFile(pFile->hFileRead, &ullCurrentChunkSize, pFile->FileOffsetSize, &dwBytesRead, NULL); |
185 |
write(pFile->hFileWrite, &ullNewChunkSize, pFile->FileOffsetSize); |
write(pFile->hFileWrite, &ullNewChunkSize, pFile->FileOffsetSize); |
186 |
} |
} |
187 |
#elif defined(WIN32) |
#elif defined(WIN32) |
188 |
if (SetFilePointerEx(pFile->hFileWrite, filePos, NULL/*new pos pointer*/, FILE_BEGIN)) { |
const LARGE_INTEGER liFilePos = { .QuadPart = filePos }; |
189 |
|
if (SetFilePointerEx(pFile->hFileWrite, liFilePos, NULL/*new pos pointer*/, FILE_BEGIN)) { |
190 |
DWORD dwBytesWritten; |
DWORD dwBytesWritten; |
191 |
WriteFile(pFile->hFileWrite, &uiNewChunkID, 4, &dwBytesWritten, NULL); |
WriteFile(pFile->hFileWrite, &uiNewChunkID, 4, &dwBytesWritten, NULL); |
192 |
WriteFile(pFile->hFileWrite, &ullNewChunkSize, pFile->FileOffsetSize, &dwBytesWritten, NULL); |
WriteFile(pFile->hFileWrite, &ullNewChunkSize, pFile->FileOffsetSize, &dwBytesWritten, NULL); |
331 |
} |
} |
332 |
readWords /= WordSize; |
readWords /= WordSize; |
333 |
#elif defined(WIN32) |
#elif defined(WIN32) |
334 |
if (!SetFilePointerEx(pFile->hFileRead, ullStartPos + ullPos, NULL/*new pos pointer*/, FILE_BEGIN)) |
const LARGE_INTEGER liFilePos = { .QuadPart = ullStartPos + ullPos }; |
335 |
|
if (!SetFilePointerEx(pFile->hFileRead, liFilePos, NULL/*new pos pointer*/, FILE_BEGIN)) |
336 |
return 0; |
return 0; |
337 |
DWORD readWords; |
DWORD readWords; |
338 |
ReadFile(pFile->hFileRead, pData, WordCount * WordSize, &readWords, NULL); //FIXME: does not work for reading buffers larger than 2GB (even though this should rarely be the case in practice) |
ReadFile(pFile->hFileRead, pData, WordCount * WordSize, &readWords, NULL); //FIXME: does not work for reading buffers larger than 2GB (even though this should rarely be the case in practice) |
416 |
if (writtenWords < 1) throw Exception("POSIX IO Error while trying to write chunk data"); |
if (writtenWords < 1) throw Exception("POSIX IO Error while trying to write chunk data"); |
417 |
writtenWords /= WordSize; |
writtenWords /= WordSize; |
418 |
#elif defined(WIN32) |
#elif defined(WIN32) |
419 |
if (!SetFilePointerEx(pFile->hFileWrite, ullStartPos + ullPos, NULL/*new pos pointer*/, FILE_BEGIN)) { |
const LARGE_INTEGER liFilePos = { .QuadPart = ullStartPos + ullPos }; |
420 |
|
if (!SetFilePointerEx(pFile->hFileWrite, liFilePos, NULL/*new pos pointer*/, FILE_BEGIN)) { |
421 |
throw Exception("Could not seek to position " + ToString(ullPos) + |
throw Exception("Could not seek to position " + ToString(ullPos) + |
422 |
" in chunk (" + ToString(ullStartPos + ullPos) + " in file)"); |
" in chunk (" + ToString(ullStartPos + ullPos) + " in file)"); |
423 |
} |
} |
807 |
#if POSIX |
#if POSIX |
808 |
if (lseek(pFile->hFileRead, ullStartPos, SEEK_SET) == -1) return NULL; |
if (lseek(pFile->hFileRead, ullStartPos, SEEK_SET) == -1) return NULL; |
809 |
#elif defined(WIN32) |
#elif defined(WIN32) |
810 |
if (!SetFilePointerEx(pFile->hFileRead, ullStartPos, NULL/*new pos pointer*/, FILE_BEGIN)) return NULL; |
const LARGE_INTEGER liFilePos = { .QuadPart = ullStartPos }; |
811 |
|
if (!SetFilePointerEx(pFile->hFileRead, liFilePos, NULL/*new pos pointer*/, FILE_BEGIN)) return NULL; |
812 |
#else |
#else |
813 |
if (fseeko(pFile->hFileRead, ullStartPos, SEEK_SET)) return NULL; |
if (fseeko(pFile->hFileRead, ullStartPos, SEEK_SET)) return NULL; |
814 |
#endif // POSIX |
#endif // POSIX |
912 |
throw Exception("Writing Chunk data (from RAM) failed"); |
throw Exception("Writing Chunk data (from RAM) failed"); |
913 |
} |
} |
914 |
#elif defined(WIN32) |
#elif defined(WIN32) |
915 |
SetFilePointerEx(pFile->hFileWrite, ullWritePos, NULL/*new pos pointer*/, FILE_BEGIN); |
const LARGE_INTEGER liFilePos = { .QuadPart = ullWritePos }; |
916 |
|
SetFilePointerEx(pFile->hFileWrite, liFilePos, NULL/*new pos pointer*/, FILE_BEGIN); |
917 |
DWORD dwBytesWritten; |
DWORD dwBytesWritten; |
918 |
WriteFile(pFile->hFileWrite, pChunkData, ullNewChunkSize, &dwBytesWritten, NULL); //FIXME: won't save chunks larger than 2GB ! |
WriteFile(pFile->hFileWrite, pChunkData, ullNewChunkSize, &dwBytesWritten, NULL); //FIXME: won't save chunks larger than 2GB ! |
919 |
if (dwBytesWritten != ullNewChunkSize) { |
if (dwBytesWritten != ullNewChunkSize) { |
942 |
lseek(pFile->hFileWrite, ullWritePos + ullOffset, SEEK_SET); |
lseek(pFile->hFileWrite, ullWritePos + ullOffset, SEEK_SET); |
943 |
iBytesMoved = write(pFile->hFileWrite, pCopyBuffer, iBytesMoved); |
iBytesMoved = write(pFile->hFileWrite, pCopyBuffer, iBytesMoved); |
944 |
#elif defined(WIN32) |
#elif defined(WIN32) |
945 |
SetFilePointerEx(pFile->hFileRead, ullStartPos + ullCurrentDataOffset + ullOffset, NULL/*new pos pointer*/, FILE_BEGIN); |
LARGE_INTEGER liFilePos = { .QuadPart = ullStartPos + ullCurrentDataOffset + ullOffset }; |
946 |
|
SetFilePointerEx(pFile->hFileRead, liFilePos, NULL/*new pos pointer*/, FILE_BEGIN); |
947 |
ReadFile(pFile->hFileRead, pCopyBuffer, iBytesMoved, &iBytesMoved, NULL); |
ReadFile(pFile->hFileRead, pCopyBuffer, iBytesMoved, &iBytesMoved, NULL); |
948 |
SetFilePointerEx(pFile->hFileWrite, ullWritePos + ullOffset, NULL/*new pos pointer*/, FILE_BEGIN); |
liFilePos.QuadPart = ullWritePos + ullOffset; |
949 |
|
SetFilePointerEx(pFile->hFileWrite, liFilePos, NULL/*new pos pointer*/, FILE_BEGIN); |
950 |
WriteFile(pFile->hFileWrite, pCopyBuffer, iBytesMoved, &iBytesMoved, NULL); |
WriteFile(pFile->hFileWrite, pCopyBuffer, iBytesMoved, &iBytesMoved, NULL); |
951 |
#else |
#else |
952 |
fseeko(pFile->hFileRead, ullStartPos + ullCurrentDataOffset + ullOffset, SEEK_SET); |
fseeko(pFile->hFileRead, ullStartPos + ullCurrentDataOffset + ullOffset, SEEK_SET); |
976 |
lseek(pFile->hFileWrite, ullStartPos + ullNewChunkSize, SEEK_SET); |
lseek(pFile->hFileWrite, ullStartPos + ullNewChunkSize, SEEK_SET); |
977 |
write(pFile->hFileWrite, &cPadByte, 1); |
write(pFile->hFileWrite, &cPadByte, 1); |
978 |
#elif defined(WIN32) |
#elif defined(WIN32) |
979 |
SetFilePointerEx(pFile->hFileWrite, ullStartPos + ullNewChunkSize, NULL/*new pos pointer*/, FILE_BEGIN); |
const LARGE_INTEGER liFilePos = { .QuadPart = ullStartPos + ullNewChunkSize }; |
980 |
|
SetFilePointerEx(pFile->hFileWrite, liFilePos, NULL/*new pos pointer*/, FILE_BEGIN); |
981 |
DWORD dwBytesWritten; |
DWORD dwBytesWritten; |
982 |
WriteFile(pFile->hFileWrite, &cPadByte, 1, &dwBytesWritten, NULL); |
WriteFile(pFile->hFileWrite, &cPadByte, 1, &dwBytesWritten, NULL); |
983 |
#else |
#else |
1375 |
lseek(pFile->hFileRead, filePos + CHUNK_HEADER_SIZE(pFile->FileOffsetSize), SEEK_SET); |
lseek(pFile->hFileRead, filePos + CHUNK_HEADER_SIZE(pFile->FileOffsetSize), SEEK_SET); |
1376 |
read(pFile->hFileRead, &ListType, 4); |
read(pFile->hFileRead, &ListType, 4); |
1377 |
#elif defined(WIN32) |
#elif defined(WIN32) |
1378 |
SetFilePointerEx(pFile->hFileRead, filePos + CHUNK_HEADER_SIZE(pFile->FileOffsetSize), NULL/*new pos pointer*/, FILE_BEGIN); |
const LARGE_INTEGER liFilePos = { .QuadPart = filePos + CHUNK_HEADER_SIZE(pFile->FileOffsetSize) }; |
1379 |
|
SetFilePointerEx(pFile->hFileRead, liFilePos, NULL/*new pos pointer*/, FILE_BEGIN); |
1380 |
DWORD dwBytesRead; |
DWORD dwBytesRead; |
1381 |
ReadFile(pFile->hFileRead, &ListType, 4, &dwBytesRead, NULL); |
ReadFile(pFile->hFileRead, &ListType, 4, &dwBytesRead, NULL); |
1382 |
#else |
#else |
1400 |
lseek(pFile->hFileWrite, filePos + CHUNK_HEADER_SIZE(pFile->FileOffsetSize), SEEK_SET); |
lseek(pFile->hFileWrite, filePos + CHUNK_HEADER_SIZE(pFile->FileOffsetSize), SEEK_SET); |
1401 |
write(pFile->hFileWrite, &ListType, 4); |
write(pFile->hFileWrite, &ListType, 4); |
1402 |
#elif defined(WIN32) |
#elif defined(WIN32) |
1403 |
SetFilePointerEx(pFile->hFileWrite, filePos + CHUNK_HEADER_SIZE(pFile->FileOffsetSize), NULL/*new pos pointer*/, FILE_BEGIN); |
const LARGE_INTEGER liFilePos = { .QuadPart = filePos + CHUNK_HEADER_SIZE(pFile->FileOffsetSize) }; |
1404 |
|
SetFilePointerEx(pFile->hFileWrite, liFilePos, NULL/*new pos pointer*/, FILE_BEGIN); |
1405 |
DWORD dwBytesWritten; |
DWORD dwBytesWritten; |
1406 |
WriteFile(pFile->hFileWrite, &ListType, 4, &dwBytesWritten, NULL); |
WriteFile(pFile->hFileWrite, &ListType, 4, &dwBytesWritten, NULL); |
1407 |
#else |
#else |
1909 |
lseek(hFileWrite, ullPos + positiveSizeDiff, SEEK_SET); |
lseek(hFileWrite, ullPos + positiveSizeDiff, SEEK_SET); |
1910 |
iBytesMoved = write(hFileWrite, pCopyBuffer, iBytesMoved); |
iBytesMoved = write(hFileWrite, pCopyBuffer, iBytesMoved); |
1911 |
#elif defined(WIN32) |
#elif defined(WIN32) |
1912 |
SetFilePointerEx(hFileRead, ullPos, NULL/*new pos pointer*/, FILE_BEGIN); |
LARGE_INTEGER liFilePos = { .QuadPart = ullPos }; |
1913 |
|
SetFilePointerEx(hFileRead, liFilePos, NULL/*new pos pointer*/, FILE_BEGIN); |
1914 |
ReadFile(hFileRead, pCopyBuffer, iBytesMoved, &iBytesMoved, NULL); |
ReadFile(hFileRead, pCopyBuffer, iBytesMoved, &iBytesMoved, NULL); |
1915 |
SetFilePointerEx(hFileWrite, ullPos + positiveSizeDiff, NULL/*new pos pointer*/, FILE_BEGIN); |
liFilePos.QuadPart = ullPos + positiveSizeDiff; |
1916 |
|
SetFilePointerEx(hFileWrite, liFilePos, NULL/*new pos pointer*/, FILE_BEGIN); |
1917 |
WriteFile(hFileWrite, pCopyBuffer, iBytesMoved, &iBytesMoved, NULL); |
WriteFile(hFileWrite, pCopyBuffer, iBytesMoved, &iBytesMoved, NULL); |
1918 |
#else |
#else |
1919 |
fseeko(hFileRead, ullPos, SEEK_SET); |
fseeko(hFileRead, ullPos, SEEK_SET); |
2053 |
if (ftruncate(hFileWrite, ullNewSize) < 0) |
if (ftruncate(hFileWrite, ullNewSize) < 0) |
2054 |
throw Exception("Could not resize file \"" + Filename + "\""); |
throw Exception("Could not resize file \"" + Filename + "\""); |
2055 |
#elif defined(WIN32) |
#elif defined(WIN32) |
2056 |
|
const LARGE_INTEGER liFilePos = { .QuadPart = ullNewSize }; |
2057 |
if ( |
if ( |
2058 |
!SetFilePointerEx(hFileWrite, ullNewSize, NULL/*new pos pointer*/, FILE_BEGIN) || |
!SetFilePointerEx(hFileWrite, liFilePos, NULL/*new pos pointer*/, FILE_BEGIN) || |
2059 |
!SetEndOfFile(hFileWrite) |
!SetEndOfFile(hFileWrite) |
2060 |
) throw Exception("Could not resize file \"" + Filename + "\""); |
) throw Exception("Could not resize file \"" + Filename + "\""); |
2061 |
#else |
#else |
2217 |
} |
} |
2218 |
#elif defined(WIN32) |
#elif defined(WIN32) |
2219 |
file_offset_t File::__GetFileSize(HANDLE hFile) const { |
file_offset_t File::__GetFileSize(HANDLE hFile) const { |
2220 |
PLARGE_INTEGER size; |
LARGE_INTEGER size; |
2221 |
if (!GetFileSizeEx(hFile, &size)) |
if (!GetFileSizeEx(hFile, &size)) |
2222 |
throw Exception("Windows FS error: could not determine file size"); |
throw Exception("Windows FS error: could not determine file size"); |
2223 |
return size; |
return size.QuadPart; |
2224 |
} |
} |
2225 |
#else // standard C functions |
#else // standard C functions |
2226 |
file_offset_t File::__GetFileSize(FILE* hFile) const { |
file_offset_t File::__GetFileSize(FILE* hFile) const { |