Core: Update Stream interface
Add Open Mode to Stream level, Add IsReadable() and IsWritable() Former-commit-id: 0da5fa798c0f3bd3bf1545cb57f6bc923b222de8
This commit is contained in:
parent
fb920f0016
commit
8371ce068f
|
|
@ -32,7 +32,7 @@ namespace Nz
|
||||||
public:
|
public:
|
||||||
File();
|
File();
|
||||||
File(const String& filePath);
|
File(const String& filePath);
|
||||||
File(const String& filePath, unsigned int openMode);
|
File(const String& filePath, UInt32 openMode);
|
||||||
File(const File&) = delete;
|
File(const File&) = delete;
|
||||||
File(File&& file) noexcept;
|
File(File&& file) noexcept;
|
||||||
~File();
|
~File();
|
||||||
|
|
@ -71,7 +71,7 @@ namespace Nz
|
||||||
bool SetCursorPos(UInt64 offset) override;
|
bool SetCursorPos(UInt64 offset) override;
|
||||||
void SetEndianness(Endianness endianness);
|
void SetEndianness(Endianness endianness);
|
||||||
bool SetFile(const String& filePath);
|
bool SetFile(const String& filePath);
|
||||||
bool SetOpenMode(unsigned int openMode);
|
bool SetOpenMode(UInt32 openMode);
|
||||||
|
|
||||||
using OutputStream::Write;
|
using OutputStream::Write;
|
||||||
std::size_t Write(const void* buffer, std::size_t size) override;
|
std::size_t Write(const void* buffer, std::size_t size) override;
|
||||||
|
|
@ -102,8 +102,8 @@ namespace Nz
|
||||||
|
|
||||||
Endianness m_endianness;
|
Endianness m_endianness;
|
||||||
String m_filePath;
|
String m_filePath;
|
||||||
|
UInt32 m_openMode;
|
||||||
FileImpl* m_impl;
|
FileImpl* m_impl;
|
||||||
unsigned int m_openMode;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
template<>
|
template<>
|
||||||
|
|
|
||||||
|
|
@ -23,7 +23,12 @@ namespace Nz
|
||||||
|
|
||||||
virtual std::size_t Read(void* buffer, std::size_t size) = 0;
|
virtual std::size_t Read(void* buffer, std::size_t size) = 0;
|
||||||
virtual String ReadLine(unsigned int lineSize = 0);
|
virtual String ReadLine(unsigned int lineSize = 0);
|
||||||
|
|
||||||
|
protected:
|
||||||
|
inline InputStream();
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#include <Nazara/Core/InputStream.inl>
|
||||||
|
|
||||||
#endif // NAZARA_INPUTSTREAM_HPP
|
#endif // NAZARA_INPUTSTREAM_HPP
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,11 @@
|
||||||
|
// Copyright (C) 2015 Jérôme Leclercq
|
||||||
|
// This file is part of the "Nazara Engine - Core module"
|
||||||
|
// For conditions of distribution and use, see copyright notice in Config.hpp
|
||||||
|
|
||||||
|
namespace Nz
|
||||||
|
{
|
||||||
|
inline InputStream::InputStream() :
|
||||||
|
Stream(OpenMode_Current)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -22,7 +22,12 @@ namespace Nz
|
||||||
bool Write(const ByteArray& byteArray);
|
bool Write(const ByteArray& byteArray);
|
||||||
bool Write(const String& string);
|
bool Write(const String& string);
|
||||||
virtual std::size_t Write(const void* buffer, std::size_t size) = 0;
|
virtual std::size_t Write(const void* buffer, std::size_t size) = 0;
|
||||||
|
|
||||||
|
protected:
|
||||||
|
inline OutputStream();
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#include <Nazara/Core/OutputStream.inl>
|
||||||
|
|
||||||
#endif // NAZARA_OUTPUTSTREAM_HPP
|
#endif // NAZARA_OUTPUTSTREAM_HPP
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,11 @@
|
||||||
|
// Copyright (C) 2015 Jérôme Leclercq
|
||||||
|
// This file is part of the "Nazara Engine - Core module"
|
||||||
|
// For conditions of distribution and use, see copyright notice in Config.hpp
|
||||||
|
|
||||||
|
namespace Nz
|
||||||
|
{
|
||||||
|
inline OutputStream::OutputStream() :
|
||||||
|
Stream(OpenMode_Current)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -16,7 +16,6 @@ namespace Nz
|
||||||
class NAZARA_CORE_API Stream
|
class NAZARA_CORE_API Stream
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
Stream() = default;
|
|
||||||
Stream(const Stream&) = default;
|
Stream(const Stream&) = default;
|
||||||
Stream(Stream&&) = default;
|
Stream(Stream&&) = default;
|
||||||
virtual ~Stream();
|
virtual ~Stream();
|
||||||
|
|
@ -24,17 +23,26 @@ namespace Nz
|
||||||
virtual UInt64 GetCursorPos() const = 0;
|
virtual UInt64 GetCursorPos() const = 0;
|
||||||
virtual String GetDirectory() const;
|
virtual String GetDirectory() const;
|
||||||
virtual String GetPath() const;
|
virtual String GetPath() const;
|
||||||
unsigned int GetStreamOptions() const;
|
inline UInt32 GetOpenMode() const;
|
||||||
|
inline UInt32 GetStreamOptions() const;
|
||||||
|
|
||||||
|
inline bool IsReadable() const;
|
||||||
|
inline bool IsWritable() const;
|
||||||
|
|
||||||
virtual bool SetCursorPos(UInt64 offset) = 0;
|
virtual bool SetCursorPos(UInt64 offset) = 0;
|
||||||
void SetStreamOptions(unsigned int options);
|
void SetStreamOptions(UInt32 options);
|
||||||
|
|
||||||
Stream& operator=(const Stream&) = default;
|
Stream& operator=(const Stream&) = default;
|
||||||
Stream& operator=(Stream&&) = default;
|
Stream& operator=(Stream&&) = default;
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
unsigned int m_streamOptions = 0;
|
inline Stream(UInt32 openMode);
|
||||||
|
|
||||||
|
UInt32 m_openMode;
|
||||||
|
UInt32 m_streamOptions;
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#include <Nazara/Core/Stream.inl>
|
||||||
|
|
||||||
#endif // NAZARA_STREAM_HPP
|
#endif // NAZARA_STREAM_HPP
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,37 @@
|
||||||
|
// Copyright (C) 2015 Jérôme Leclercq
|
||||||
|
// This file is part of the "Nazara Engine - Core module"
|
||||||
|
// For conditions of distribution and use, see copyright notice in Config.hpp
|
||||||
|
|
||||||
|
namespace Nz
|
||||||
|
{
|
||||||
|
inline Stream::Stream(UInt32 openMode) :
|
||||||
|
m_openMode(openMode),
|
||||||
|
m_streamOptions(0)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
inline UInt32 Stream::GetOpenMode() const
|
||||||
|
{
|
||||||
|
return m_openMode;
|
||||||
|
}
|
||||||
|
|
||||||
|
inline UInt32 Stream::GetStreamOptions() const
|
||||||
|
{
|
||||||
|
return m_streamOptions;
|
||||||
|
}
|
||||||
|
|
||||||
|
inline bool Stream::IsReadable() const
|
||||||
|
{
|
||||||
|
return m_openMode & OpenMode_ReadOnly || m_openMode & OpenMode_ReadWrite;
|
||||||
|
}
|
||||||
|
|
||||||
|
inline bool Stream::IsWritable() const
|
||||||
|
{
|
||||||
|
return m_openMode & OpenMode_ReadWrite || m_openMode & OpenMode_WriteOnly;
|
||||||
|
}
|
||||||
|
|
||||||
|
inline void Stream::SetStreamOptions(UInt32 options)
|
||||||
|
{
|
||||||
|
m_streamOptions = options;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -31,29 +31,28 @@
|
||||||
namespace Nz
|
namespace Nz
|
||||||
{
|
{
|
||||||
File::File() :
|
File::File() :
|
||||||
|
Stream(OpenMode_Current),
|
||||||
m_endianness(Endianness_Unknown),
|
m_endianness(Endianness_Unknown),
|
||||||
m_impl(nullptr),
|
m_impl(nullptr)
|
||||||
m_openMode(OpenMode_Current)
|
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
File::File(const String& filePath) :
|
File::File(const String& filePath) :
|
||||||
m_endianness(Endianness_Unknown),
|
File()
|
||||||
m_impl(nullptr),
|
|
||||||
m_openMode(OpenMode_Current)
|
|
||||||
{
|
{
|
||||||
SetFile(filePath);
|
SetFile(filePath);
|
||||||
}
|
}
|
||||||
|
|
||||||
File::File(const String& filePath, unsigned int openMode) :
|
File::File(const String& filePath, UInt32 openMode) :
|
||||||
m_endianness(Endianness_Unknown),
|
File()
|
||||||
m_impl(nullptr),
|
|
||||||
m_openMode(openMode)
|
|
||||||
{
|
{
|
||||||
Open(filePath, openMode);
|
Open(filePath, openMode);
|
||||||
}
|
}
|
||||||
|
|
||||||
File::File(File&& file) noexcept :
|
File::File(File&& file) noexcept :
|
||||||
|
Stream(std::move(file)),
|
||||||
|
InputStream(std::move(file)),
|
||||||
|
OutputStream(std::move(file)),
|
||||||
m_endianness(file.m_endianness),
|
m_endianness(file.m_endianness),
|
||||||
m_filePath(std::move(file.m_filePath)),
|
m_filePath(std::move(file.m_filePath)),
|
||||||
m_impl(file.m_impl),
|
m_impl(file.m_impl),
|
||||||
|
|
@ -127,19 +126,8 @@ namespace Nz
|
||||||
{
|
{
|
||||||
NazaraLock(m_mutex)
|
NazaraLock(m_mutex)
|
||||||
|
|
||||||
#if NAZARA_CORE_SAFE
|
NazaraAssert(IsOpen(), "File is not open");
|
||||||
if (!IsOpen())
|
NazaraAssert(IsWritable(), "File not opened with write access");
|
||||||
{
|
|
||||||
NazaraError("File not opened");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if ((m_openMode & OpenMode_ReadWrite) == 0 && (m_openMode & OpenMode_WriteOnly) == 0)
|
|
||||||
{
|
|
||||||
NazaraError("Cannot flush file without write access");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
m_impl->Flush();
|
m_impl->Flush();
|
||||||
}
|
}
|
||||||
|
|
@ -155,13 +143,7 @@ namespace Nz
|
||||||
{
|
{
|
||||||
NazaraLock(m_mutex)
|
NazaraLock(m_mutex)
|
||||||
|
|
||||||
#if NAZARA_CORE_SAFE
|
NazaraAssert(IsOpen(), "File is not opened");
|
||||||
if (!IsOpen())
|
|
||||||
{
|
|
||||||
NazaraError("File not opened");
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
return m_impl->GetCursorPos();
|
return m_impl->GetCursorPos();
|
||||||
}
|
}
|
||||||
|
|
@ -219,19 +201,8 @@ namespace Nz
|
||||||
{
|
{
|
||||||
NazaraLock(m_mutex)
|
NazaraLock(m_mutex)
|
||||||
|
|
||||||
#if NAZARA_CORE_SAFE
|
NazaraAssert(IsOpen(), "File is not opened");
|
||||||
if (!IsOpen())
|
NazaraAssert(IsReadable(), "File not opened with read access");
|
||||||
{
|
|
||||||
NazaraError("File not opened");
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
if ((m_openMode & OpenMode_ReadOnly) == 0 && (m_openMode & OpenMode_ReadWrite) == 0)
|
|
||||||
{
|
|
||||||
NazaraError("File not opened with read access");
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
if (size == 0)
|
if (size == 0)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
@ -245,7 +216,7 @@ namespace Nz
|
||||||
|
|
||||||
m_impl->SetCursorPos(CursorPosition_AtCurrent, size);
|
m_impl->SetCursorPos(CursorPosition_AtCurrent, size);
|
||||||
|
|
||||||
return static_cast<std::size_t>(m_impl->GetCursorPos()-currentPos);
|
return static_cast<std::size_t>(m_impl->GetCursorPos() - currentPos);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -327,13 +298,7 @@ namespace Nz
|
||||||
{
|
{
|
||||||
NazaraLock(m_mutex)
|
NazaraLock(m_mutex)
|
||||||
|
|
||||||
#if NAZARA_CORE_SAFE
|
NazaraAssert(IsOpen(), "File is not opened");
|
||||||
if (!IsOpen())
|
|
||||||
{
|
|
||||||
NazaraError("File not opened");
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
return m_impl->SetCursorPos(pos, offset);
|
return m_impl->SetCursorPos(pos, offset);
|
||||||
}
|
}
|
||||||
|
|
@ -342,13 +307,7 @@ namespace Nz
|
||||||
{
|
{
|
||||||
NazaraLock(m_mutex)
|
NazaraLock(m_mutex)
|
||||||
|
|
||||||
#if NAZARA_CORE_SAFE
|
NazaraAssert(IsOpen(), "File is not opened");
|
||||||
if (!IsOpen())
|
|
||||||
{
|
|
||||||
NazaraError("File not opened");
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
return m_impl->SetCursorPos(CursorPosition_AtBegin, offset);
|
return m_impl->SetCursorPos(CursorPosition_AtBegin, offset);
|
||||||
}
|
}
|
||||||
|
|
@ -418,10 +377,11 @@ namespace Nz
|
||||||
|
|
||||||
std::size_t File::Write(const void* buffer, std::size_t size)
|
std::size_t File::Write(const void* buffer, std::size_t size)
|
||||||
{
|
{
|
||||||
NazaraAssert(IsOpen(), "File is not open");
|
|
||||||
NazaraAssert(m_openMode & OpenMode_ReadWrite || m_openMode & OpenMode_WriteOnly, "File not opened with write access");
|
|
||||||
NazaraLock(m_mutex)
|
NazaraLock(m_mutex)
|
||||||
|
|
||||||
|
NazaraAssert(IsOpen(), "File is not opened");
|
||||||
|
NazaraAssert(IsWritable(), "File not opened with write access");
|
||||||
|
|
||||||
if (!buffer || size == 0)
|
if (!buffer || size == 0)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
|
|
@ -430,26 +390,11 @@ namespace Nz
|
||||||
|
|
||||||
std::size_t File::Write(const void* buffer, std::size_t typeSize, unsigned int count)
|
std::size_t File::Write(const void* buffer, std::size_t typeSize, unsigned int count)
|
||||||
{
|
{
|
||||||
NazaraLock(m_mutex)
|
|
||||||
|
|
||||||
#if NAZARA_CORE_SAFE
|
|
||||||
if (!IsOpen())
|
|
||||||
{
|
|
||||||
NazaraError("File not opened");
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
if ((m_openMode & OpenMode_ReadWrite) == 0 && (m_openMode & OpenMode_WriteOnly) == 0)
|
|
||||||
{
|
|
||||||
NazaraError("File not opened with write access");
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
if (!buffer || count == 0 || typeSize == 0)
|
if (!buffer || count == 0 || typeSize == 0)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
std::size_t bytesWritten;
|
NazaraLock(m_mutex)
|
||||||
|
|
||||||
if (m_endianness != Endianness_Unknown && m_endianness != GetPlatformEndianness() && typeSize != 1)
|
if (m_endianness != Endianness_Unknown && m_endianness != GetPlatformEndianness() && typeSize != 1)
|
||||||
{
|
{
|
||||||
std::unique_ptr<char[]> buf(new char[count*typeSize]);
|
std::unique_ptr<char[]> buf(new char[count*typeSize]);
|
||||||
|
|
@ -458,12 +403,10 @@ namespace Nz
|
||||||
for (unsigned int i = 0; i < count; ++i)
|
for (unsigned int i = 0; i < count; ++i)
|
||||||
SwapBytes(&buf[i*typeSize], typeSize);
|
SwapBytes(&buf[i*typeSize], typeSize);
|
||||||
|
|
||||||
bytesWritten = m_impl->Write(buf.get(), count*typeSize);
|
return Write(buf.get(), count*typeSize);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
bytesWritten = m_impl->Write(buffer, count*typeSize);
|
return Write(buffer, count*typeSize);
|
||||||
|
|
||||||
return bytesWritten;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
File& File::operator=(const String& filePath)
|
File& File::operator=(const String& filePath)
|
||||||
|
|
|
||||||
|
|
@ -10,6 +10,7 @@
|
||||||
namespace Nz
|
namespace Nz
|
||||||
{
|
{
|
||||||
MemoryStream::MemoryStream(const void* ptr, UInt64 size) :
|
MemoryStream::MemoryStream(const void* ptr, UInt64 size) :
|
||||||
|
Stream(OpenMode_ReadOnly),
|
||||||
m_ptr(reinterpret_cast<const UInt8*>(ptr)),
|
m_ptr(reinterpret_cast<const UInt8*>(ptr)),
|
||||||
m_pos(0),
|
m_pos(0),
|
||||||
m_size(size)
|
m_size(size)
|
||||||
|
|
|
||||||
|
|
@ -18,6 +18,7 @@ namespace Nz
|
||||||
|
|
||||||
void FileImpl::Close()
|
void FileImpl::Close()
|
||||||
{
|
{
|
||||||
|
if (m_fileDescriptor != -1)
|
||||||
close(m_fileDescriptor);
|
close(m_fileDescriptor);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -48,7 +49,7 @@ namespace Nz
|
||||||
return static_cast<UInt64>(position);
|
return static_cast<UInt64>(position);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool FileImpl::Open(const String& filePath, unsigned int mode)
|
bool FileImpl::Open(const String& filePath, UInt32 mode)
|
||||||
{
|
{
|
||||||
int flags;
|
int flags;
|
||||||
mode_t permissions = S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH;
|
mode_t permissions = S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH;
|
||||||
|
|
|
||||||
|
|
@ -36,7 +36,7 @@ namespace Nz
|
||||||
bool EndOfFile() const;
|
bool EndOfFile() const;
|
||||||
void Flush();
|
void Flush();
|
||||||
UInt64 GetCursorPos() const;
|
UInt64 GetCursorPos() const;
|
||||||
bool Open(const String& filePath, unsigned int mode);
|
bool Open(const String& filePath, UInt32 mode);
|
||||||
std::size_t Read(void* buffer, std::size_t size);
|
std::size_t Read(void* buffer, std::size_t size);
|
||||||
bool SetCursorPos(CursorPosition pos, Int64 offset);
|
bool SetCursorPos(CursorPosition pos, Int64 offset);
|
||||||
std::size_t Write(const void* buffer, std::size_t size);
|
std::size_t Write(const void* buffer, std::size_t size);
|
||||||
|
|
|
||||||
|
|
@ -18,14 +18,4 @@ namespace Nz
|
||||||
{
|
{
|
||||||
return String();
|
return String();
|
||||||
}
|
}
|
||||||
|
|
||||||
unsigned int Stream::GetStreamOptions() const
|
|
||||||
{
|
|
||||||
return m_streamOptions;
|
|
||||||
}
|
|
||||||
|
|
||||||
void Stream::SetStreamOptions(unsigned int options)
|
|
||||||
{
|
|
||||||
m_streamOptions = options;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -54,7 +54,7 @@ namespace Nz
|
||||||
return position.QuadPart;
|
return position.QuadPart;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool FileImpl::Open(const String& filePath, unsigned int mode)
|
bool FileImpl::Open(const String& filePath, UInt32 mode)
|
||||||
{
|
{
|
||||||
DWORD access;
|
DWORD access;
|
||||||
DWORD shareMode = FILE_SHARE_READ;
|
DWORD shareMode = FILE_SHARE_READ;
|
||||||
|
|
|
||||||
|
|
@ -29,7 +29,7 @@ namespace Nz
|
||||||
bool EndOfFile() const;
|
bool EndOfFile() const;
|
||||||
void Flush();
|
void Flush();
|
||||||
UInt64 GetCursorPos() const;
|
UInt64 GetCursorPos() const;
|
||||||
bool Open(const String& filePath, unsigned int mode);
|
bool Open(const String& filePath, UInt32 mode);
|
||||||
std::size_t Read(void* buffer, std::size_t size);
|
std::size_t Read(void* buffer, std::size_t size);
|
||||||
bool SetCursorPos(CursorPosition pos, Int64 offset);
|
bool SetCursorPos(CursorPosition pos, Int64 offset);
|
||||||
std::size_t Write(const void* buffer, std::size_t size);
|
std::size_t Write(const void* buffer, std::size_t size);
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue