You've already forked UnrealEngineUWP
mirror of
https://github.com/izzy2lost/UnrealEngineUWP.git
synced 2026-03-26 18:15:20 -07:00
146 lines
3.3 KiB
C++
146 lines
3.3 KiB
C++
// Copyright Epic Games, Inc. All Rights Reserved.
|
|
|
|
#include "AsioFile.h"
|
|
#include "Containers/StringConv.h"
|
|
|
|
#if !PLATFORM_WINDOWS
|
|
#include <sys/file.h>
|
|
#include <errno.h>
|
|
#endif
|
|
|
|
namespace UE {
|
|
namespace Trace {
|
|
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
FAsioFile::FAsioFile(asio::io_context& IoContext, UPTRINT OsHandle)
|
|
#if PLATFORM_WINDOWS
|
|
: Handle(IoContext, HANDLE(OsHandle))
|
|
#else
|
|
: StreamDescriptor(IoContext, OsHandle)
|
|
#endif
|
|
{
|
|
}
|
|
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
bool FAsioFile::IsOpen() const
|
|
{
|
|
#if PLATFORM_WINDOWS
|
|
return Handle.is_open();
|
|
#else
|
|
return StreamDescriptor.is_open();
|
|
#endif
|
|
}
|
|
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
void FAsioFile::Close()
|
|
{
|
|
#if PLATFORM_WINDOWS
|
|
Handle.close();
|
|
#else
|
|
StreamDescriptor.close();
|
|
#endif
|
|
}
|
|
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
bool FAsioFile::Write(const void* Src, uint32 Size, FAsioIoSink* Sink, uint32 Id)
|
|
{
|
|
if (!SetSink(Sink, Id))
|
|
{
|
|
return false;
|
|
}
|
|
|
|
#if PLATFORM_WINDOWS
|
|
asio::async_write_at(
|
|
Handle,
|
|
Offset,
|
|
#else
|
|
asio::async_write(
|
|
StreamDescriptor,
|
|
#endif
|
|
asio::buffer(Src, Size),
|
|
[this] (const asio::error_code& ErrorCode, size_t BytesWritten)
|
|
{
|
|
Offset += BytesWritten;
|
|
return OnIoComplete(ErrorCode, BytesWritten);
|
|
}
|
|
);
|
|
|
|
return true;
|
|
}
|
|
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
bool FAsioFile::Read(void* Dest, uint32 Size, FAsioIoSink* Sink, uint32 Id)
|
|
{
|
|
return ReadSome(Dest, Size, Sink, Id);
|
|
}
|
|
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
bool FAsioFile::ReadSome(void* Dest, uint32 DestSize, FAsioIoSink* Sink, uint32 Id)
|
|
{
|
|
if (!SetSink(Sink, Id))
|
|
{
|
|
return false;
|
|
}
|
|
|
|
#if PLATFORM_WINDOWS
|
|
Handle.async_read_some_at(
|
|
Offset,
|
|
#else
|
|
StreamDescriptor.async_read_some(
|
|
#endif
|
|
asio::buffer(Dest, DestSize),
|
|
[this] (const asio::error_code& ErrorCode, size_t BytesRead)
|
|
{
|
|
Offset += BytesRead;
|
|
return OnIoComplete(ErrorCode, BytesRead);
|
|
}
|
|
);
|
|
|
|
return true;
|
|
}
|
|
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
FAsioWriteable* FAsioFile::WriteFile(asio::io_context& IoContext, const TCHAR* Path)
|
|
{
|
|
#if PLATFORM_WINDOWS
|
|
HANDLE Handle = CreateFileW(Path, GENERIC_WRITE, FILE_SHARE_READ, nullptr,
|
|
CREATE_ALWAYS, FILE_FLAG_OVERLAPPED|FILE_ATTRIBUTE_NORMAL, nullptr);
|
|
if (Handle == INVALID_HANDLE_VALUE)
|
|
{
|
|
return nullptr;
|
|
}
|
|
return new FAsioFile(IoContext, UPTRINT(Handle));
|
|
#else
|
|
int File = open(TCHAR_TO_ANSI(Path), O_WRONLY|O_CREAT, 0666);
|
|
if (!File)
|
|
{
|
|
return nullptr;
|
|
}
|
|
return new FAsioFile(IoContext, UPTRINT(File));
|
|
#endif
|
|
}
|
|
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
FAsioReadable* FAsioFile::ReadFile(asio::io_context& IoContext, const TCHAR* Path)
|
|
{
|
|
#if PLATFORM_WINDOWS
|
|
HANDLE Handle = CreateFileW(Path, GENERIC_READ, FILE_SHARE_READ|FILE_SHARE_WRITE,
|
|
nullptr, OPEN_EXISTING, FILE_FLAG_OVERLAPPED, nullptr);
|
|
if (Handle == INVALID_HANDLE_VALUE)
|
|
{
|
|
return nullptr;
|
|
}
|
|
return new FAsioFile(IoContext, UPTRINT(Handle));
|
|
#else
|
|
int File = open(TCHAR_TO_ANSI(Path), O_RDONLY, 0444);
|
|
if (!File)
|
|
{
|
|
return nullptr;
|
|
}
|
|
return new FAsioFile(IoContext, UPTRINT(File));
|
|
#endif
|
|
}
|
|
|
|
} // namespace Trace
|
|
} // namespace UE
|