forked from premiere/premiere-libtorrent
make sparse_end support unbuffered files
This commit is contained in:
parent
4706807300
commit
f23607bc05
17
src/file.cpp
17
src/file.cpp
|
@ -1812,13 +1812,24 @@ typedef struct _FILE_ALLOCATED_RANGE_BUFFER {
|
||||||
error_code ec;
|
error_code ec;
|
||||||
size_type file_size = get_size(ec);
|
size_type file_size = get_size(ec);
|
||||||
if (ec) return start;
|
if (ec) return start;
|
||||||
in.FileOffset.QuadPart = start;
|
|
||||||
in.Length.QuadPart = file_size - start;
|
if (m_open_mode & no_buffer)
|
||||||
|
{
|
||||||
|
boost::uint64_t mask = size_alignment()-1;
|
||||||
|
in.FileOffset.QuadPart = start & (~mask);
|
||||||
|
in.Length.QuadPart = ((file_size + mask) & ~mask) - in.FileOffset.QuadPart;
|
||||||
|
TORRENT_ASSERT((in.Length.QuadPart & mask) == 0);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
in.FileOffset.QuadPart = start;
|
||||||
|
in.Length.QuadPart = file_size - start;
|
||||||
|
}
|
||||||
|
|
||||||
if (!DeviceIoControl(m_file_handle, FSCTL_QUERY_ALLOCATED_RANGES
|
if (!DeviceIoControl(m_file_handle, FSCTL_QUERY_ALLOCATED_RANGES
|
||||||
, &in, sizeof(FILE_ALLOCATED_RANGE_BUFFER)
|
, &in, sizeof(FILE_ALLOCATED_RANGE_BUFFER)
|
||||||
, &buffer, sizeof(FILE_ALLOCATED_RANGE_BUFFER), &bytes_returned, 0))
|
, &buffer, sizeof(FILE_ALLOCATED_RANGE_BUFFER), &bytes_returned, 0))
|
||||||
{
|
{
|
||||||
int err = GetLastError();
|
|
||||||
if (GetLastError() != ERROR_INSUFFICIENT_BUFFER) return start;
|
if (GetLastError() != ERROR_INSUFFICIENT_BUFFER) return start;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue