Implemented fs::file::get_handle

This commit is contained in:
Nekotekina 2017-08-22 21:05:51 +03:00
parent a68983b551
commit d0e171784c
2 changed files with 41 additions and 2 deletions

View File

@ -772,7 +772,7 @@ fs::file::file(const std::string& path, bs_t<open_mode> mode)
return; return;
} }
class windows_file final : public file_base class windows_file final : public file_base, public get_native_handle
{ {
const HANDLE m_handle; const HANDLE m_handle;
@ -879,6 +879,11 @@ fs::file::file(const std::string& path, bs_t<open_mode> mode)
return size.QuadPart; return size.QuadPart;
} }
native_handle get() override
{
return m_handle;
}
}; };
m_file = std::make_unique<windows_file>(handle); m_file = std::make_unique<windows_file>(handle);
@ -902,7 +907,7 @@ fs::file::file(const std::string& path, bs_t<open_mode> mode)
return; return;
} }
class unix_file final : public file_base class unix_file final : public file_base, public get_native_handle
{ {
const int m_fd; const int m_fd;
@ -991,6 +996,11 @@ fs::file::file(const std::string& path, bs_t<open_mode> mode)
return file_info.st_size; return file_info.st_size;
} }
native_handle get() override
{
return m_fd;
}
}; };
m_file = std::make_unique<unix_file>(fd); m_file = std::make_unique<unix_file>(fd);
@ -1066,6 +1076,20 @@ fs::file::file(const void* ptr, std::size_t size)
m_file = std::make_unique<memory_stream>(ptr, size); m_file = std::make_unique<memory_stream>(ptr, size);
} }
fs::native_handle fs::file::get_handle() const
{
if (auto getter = dynamic_cast<get_native_handle*>(m_file.get()))
{
return getter->get();
}
#ifdef _WIN32
return INVALID_HANDLE_VALUE;
#else
return -1;
#endif
}
void fs::dir::xnull() const void fs::dir::xnull() const
{ {
fmt::throw_exception<std::logic_error>("fs::dir is null"); fmt::throw_exception<std::logic_error>("fs::dir is null");

View File

@ -10,6 +10,12 @@
namespace fs namespace fs
{ {
#ifdef _WIN32
using native_handle = void*;
#else
using native_handle = int;
#endif
// File open mode flags // File open mode flags
enum class open_mode : u32 enum class open_mode : u32
{ {
@ -55,6 +61,12 @@ namespace fs
s64 ctime; s64 ctime;
}; };
// Native handle getter
struct get_native_handle
{
virtual native_handle get() = 0;
};
// File handle base // File handle base
struct file_base struct file_base
{ {
@ -347,6 +359,9 @@ namespace fs
if (seek(0), !read(result)) xfail(); if (seek(0), !read(result)) xfail();
return result; return result;
} }
// Get native handle if available
native_handle get_handle() const;
}; };
class dir final class dir final