diff options
Diffstat (limited to 'source/core/stream.cpp')
| -rw-r--r-- | source/core/stream.cpp | 364 |
1 files changed, 180 insertions, 184 deletions
diff --git a/source/core/stream.cpp b/source/core/stream.cpp index 580ea5884..62e9092af 100644 --- a/source/core/stream.cpp +++ b/source/core/stream.cpp @@ -4,217 +4,213 @@ #endif #include "slang-io.h" -namespace CoreLib +namespace Slang { - namespace IO + FileStream::FileStream(const Slang::String & fileName, FileMode fileMode) { - using namespace CoreLib::Basic; - FileStream::FileStream(const CoreLib::Basic::String & fileName, FileMode fileMode) - { - Init(fileName, fileMode, fileMode==FileMode::Open?FileAccess::Read:FileAccess::Write, FileShare::None); - } - FileStream::FileStream(const CoreLib::Basic::String & fileName, FileMode fileMode, FileAccess access, FileShare share) - { - Init(fileName, fileMode, access, share); - } - void FileStream::Init(const CoreLib::Basic::String & fileName, FileMode fileMode, FileAccess access, FileShare share) + Init(fileName, fileMode, fileMode==FileMode::Open?FileAccess::Read:FileAccess::Write, FileShare::None); + } + FileStream::FileStream(const Slang::String & fileName, FileMode fileMode, FileAccess access, FileShare share) + { + Init(fileName, fileMode, access, share); + } + void FileStream::Init(const Slang::String & fileName, FileMode fileMode, FileAccess access, FileShare share) + { + const wchar_t * mode = L"rt"; + const char* modeMBCS = "rt"; + switch (fileMode) { - const wchar_t * mode = L"rt"; - const char* modeMBCS = "rt"; - switch (fileMode) + case Slang::FileMode::Create: + if (access == FileAccess::Read) + throw ArgumentException("Read-only access is incompatible with Create mode."); + else if (access == FileAccess::ReadWrite) { - case CoreLib::IO::FileMode::Create: - if (access == FileAccess::Read) - throw ArgumentException("Read-only access is incompatible with Create mode."); - else if (access == FileAccess::ReadWrite) - { - mode = L"w+b"; - modeMBCS = "w+b"; - this->fileAccess = FileAccess::ReadWrite; - } - else - { - mode = L"wb"; - modeMBCS = "wb"; - this->fileAccess = FileAccess::Write; - } - break; - case CoreLib::IO::FileMode::Open: - if (access == FileAccess::Read) - { - mode = L"rb"; - modeMBCS = "rb"; - this->fileAccess = FileAccess::Read; - } - else if (access == FileAccess::ReadWrite) - { - mode = L"r+b"; - modeMBCS = "r+b"; - this->fileAccess = FileAccess::ReadWrite; - } - else - { - mode = L"wb"; - modeMBCS = "wb"; - this->fileAccess = FileAccess::Write; - } - break; - case CoreLib::IO::FileMode::CreateNew: - if (File::Exists(fileName)) - { - throw IOException("Failed opening '" + fileName + "', file already exists."); - } - if (access == FileAccess::Read) - throw ArgumentException("Read-only access is incompatible with Create mode."); - else if (access == FileAccess::ReadWrite) - { - mode = L"w+b"; - this->fileAccess = FileAccess::ReadWrite; - } - else - { - mode = L"wb"; - this->fileAccess = FileAccess::Write; - } - break; - case CoreLib::IO::FileMode::Append: - if (access == FileAccess::Read) - throw ArgumentException("Read-only access is incompatible with Append mode."); - else if (access == FileAccess::ReadWrite) - { - mode = L"a+b"; - this->fileAccess = FileAccess::ReadWrite; - } - else - { - mode = L"ab"; - this->fileAccess = FileAccess::Write; - } - break; - default: - break; + mode = L"w+b"; + modeMBCS = "w+b"; + this->fileAccess = FileAccess::ReadWrite; } - int shFlag; -#ifdef _WIN32 - switch (share) + else { - case CoreLib::IO::FileShare::None: - shFlag = _SH_DENYRW; - break; - case CoreLib::IO::FileShare::ReadOnly: - shFlag = _SH_DENYWR; - break; - case CoreLib::IO::FileShare::WriteOnly: - shFlag = _SH_DENYRD; - break; - case CoreLib::IO::FileShare::ReadWrite: - shFlag = _SH_DENYNO; - break; - default: - throw ArgumentException("Invalid file share mode."); - break; + mode = L"wb"; + modeMBCS = "wb"; + this->fileAccess = FileAccess::Write; } - if (share == CoreLib::IO::FileShare::None) -#pragma warning(suppress:4996) - handle = _wfopen(fileName.ToWString(), mode); - else - handle = _wfsopen(fileName.ToWString(), mode, shFlag); -#else - handle = fopen(fileName.Buffer(), modeMBCS); -#endif - if (!handle) + break; + case Slang::FileMode::Open: + if (access == FileAccess::Read) + { + mode = L"rb"; + modeMBCS = "rb"; + this->fileAccess = FileAccess::Read; + } + else if (access == FileAccess::ReadWrite) + { + mode = L"r+b"; + modeMBCS = "r+b"; + this->fileAccess = FileAccess::ReadWrite; + } + else { - throw IOException("Cannot open file '" + fileName + "'"); + mode = L"wb"; + modeMBCS = "wb"; + this->fileAccess = FileAccess::Write; } + break; + case Slang::FileMode::CreateNew: + if (File::Exists(fileName)) + { + throw IOException("Failed opening '" + fileName + "', file already exists."); + } + if (access == FileAccess::Read) + throw ArgumentException("Read-only access is incompatible with Create mode."); + else if (access == FileAccess::ReadWrite) + { + mode = L"w+b"; + this->fileAccess = FileAccess::ReadWrite; + } + else + { + mode = L"wb"; + this->fileAccess = FileAccess::Write; + } + break; + case Slang::FileMode::Append: + if (access == FileAccess::Read) + throw ArgumentException("Read-only access is incompatible with Append mode."); + else if (access == FileAccess::ReadWrite) + { + mode = L"a+b"; + this->fileAccess = FileAccess::ReadWrite; + } + else + { + mode = L"ab"; + this->fileAccess = FileAccess::Write; + } + break; + default: + break; } - FileStream::~FileStream() + int shFlag; +#ifdef _WIN32 + switch (share) { - Close(); + case Slang::FileShare::None: + shFlag = _SH_DENYRW; + break; + case Slang::FileShare::ReadOnly: + shFlag = _SH_DENYWR; + break; + case Slang::FileShare::WriteOnly: + shFlag = _SH_DENYRD; + break; + case Slang::FileShare::ReadWrite: + shFlag = _SH_DENYNO; + break; + default: + throw ArgumentException("Invalid file share mode."); + break; } - Int64 FileStream::GetPosition() - { -#ifdef _WIN32 - fpos_t pos; - fgetpos(handle, &pos); - return pos; + if (share == Slang::FileShare::None) +#pragma warning(suppress:4996) + handle = _wfopen(fileName.ToWString(), mode); + else + handle = _wfsopen(fileName.ToWString(), mode, shFlag); #else - fpos64_t pos; - fgetpos64(handle, &pos); - return *(Int64*)(&pos); + handle = fopen(fileName.Buffer(), modeMBCS); #endif - } - void FileStream::Seek(SeekOrigin origin, Int64 offset) + if (!handle) { - int _origin; - switch (origin) - { - case CoreLib::IO::SeekOrigin::Start: - _origin = SEEK_SET; - endReached = false; - break; - case CoreLib::IO::SeekOrigin::End: - _origin = SEEK_END; - endReached = true; - break; - case CoreLib::IO::SeekOrigin::Current: - _origin = SEEK_CUR; - endReached = false; - break; - default: - throw NotSupportedException("Unsupported seek origin."); - break; - } + throw IOException("Cannot open file '" + fileName + "'"); + } + } + FileStream::~FileStream() + { + Close(); + } + Int64 FileStream::GetPosition() + { #ifdef _WIN32 - int rs = _fseeki64(handle, offset, _origin); + fpos_t pos; + fgetpos(handle, &pos); + return pos; #else - int rs = fseek(handle, (int)offset, _origin); + fpos64_t pos; + fgetpos64(handle, &pos); + return *(Int64*)(&pos); #endif - if (rs != 0) - { - throw IOException("FileStream seek failed."); - } - } - Int64 FileStream::Read(void * buffer, Int64 length) - { - auto bytes = fread_s(buffer, (size_t)length, 1, (size_t)length, handle); - if (bytes == 0 && length > 0) - { - if (!feof(handle)) - throw IOException("FileStream read failed."); - else if (endReached) - throw EndOfStreamException("End of file is reached."); - endReached = true; - } - return (int)bytes; - } - Int64 FileStream::Write(const void * buffer, Int64 length) + } + void FileStream::Seek(SeekOrigin origin, Int64 offset) + { + int _origin; + switch (origin) { - auto bytes = (Int64)fwrite(buffer, 1, (size_t)length, handle); - if (bytes < length) - { - throw IOException("FileStream write failed."); - } - return bytes; + case Slang::SeekOrigin::Start: + _origin = SEEK_SET; + endReached = false; + break; + case Slang::SeekOrigin::End: + _origin = SEEK_END; + endReached = true; + break; + case Slang::SeekOrigin::Current: + _origin = SEEK_CUR; + endReached = false; + break; + default: + throw NotSupportedException("Unsupported seek origin."); + break; } - bool FileStream::CanRead() +#ifdef _WIN32 + int rs = _fseeki64(handle, offset, _origin); +#else + int rs = fseek(handle, (int)offset, _origin); +#endif + if (rs != 0) { - return ((int)fileAccess & (int)FileAccess::Read) != 0; + throw IOException("FileStream seek failed."); } - bool FileStream::CanWrite() + } + Int64 FileStream::Read(void * buffer, Int64 length) + { + auto bytes = fread_s(buffer, (size_t)length, 1, (size_t)length, handle); + if (bytes == 0 && length > 0) { - return ((int)fileAccess & (int)FileAccess::Write) != 0; + if (!feof(handle)) + throw IOException("FileStream read failed."); + else if (endReached) + throw EndOfStreamException("End of file is reached."); + endReached = true; } - void FileStream::Close() + return (int)bytes; + } + Int64 FileStream::Write(const void * buffer, Int64 length) + { + auto bytes = (Int64)fwrite(buffer, 1, (size_t)length, handle); + if (bytes < length) { - if (handle) - { - fclose(handle); - handle = 0; - } + throw IOException("FileStream write failed."); } - bool FileStream::IsEnd() + return bytes; + } + bool FileStream::CanRead() + { + return ((int)fileAccess & (int)FileAccess::Read) != 0; + } + bool FileStream::CanWrite() + { + return ((int)fileAccess & (int)FileAccess::Write) != 0; + } + void FileStream::Close() + { + if (handle) { - return endReached; + fclose(handle); + handle = 0; } } + bool FileStream::IsEnd() + { + return endReached; + } } |
