Core: Update Stream interface

Add Open Mode to Stream level, Add IsReadable() and IsWritable()


Former-commit-id: 0da5fa798c0f3bd3bf1545cb57f6bc923b222de8
This commit is contained in:
Lynix 2015-11-17 13:19:44 +01:00
parent fb920f0016
commit 8371ce068f
14 changed files with 114 additions and 102 deletions

View File

@ -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<>

View File

@ -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

View File

@ -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)
{
}
}

View File

@ -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

View File

@ -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)
{
}
}

View File

@ -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

View File

@ -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;
}
}

View File

@ -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;
@ -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)

View File

@ -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)

View File

@ -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;

View File

@ -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);

View File

@ -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;
}
} }

View File

@ -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;

View File

@ -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);