From 89dc7e4875478a00ad5646690ddf8add04cb288f Mon Sep 17 00:00:00 2001 From: Ingo Weinhold Date: Thu, 15 Apr 2010 22:19:27 +0000 Subject: [PATCH] Added private BPositionIO derived classes BFileIO and BFileDescriptorIO which wrap a FILE* respectively a file descriptor. git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@36324 a95241bf-73f2-0310-859d-f6bbb57e9c96 --- headers/private/storage/FileDescriptorIO.h | 43 +++++++ headers/private/storage/FileIO.h | 46 +++++++ src/kits/storage/FileDescriptorIO.cpp | 94 ++++++++++++++ src/kits/storage/FileIO.cpp | 138 +++++++++++++++++++++ src/kits/storage/Jamfile | 2 + 5 files changed, 323 insertions(+) create mode 100644 headers/private/storage/FileDescriptorIO.h create mode 100644 headers/private/storage/FileIO.h create mode 100644 src/kits/storage/FileDescriptorIO.cpp create mode 100644 src/kits/storage/FileIO.cpp diff --git a/headers/private/storage/FileDescriptorIO.h b/headers/private/storage/FileDescriptorIO.h new file mode 100644 index 0000000000..a7f702cbd3 --- /dev/null +++ b/headers/private/storage/FileDescriptorIO.h @@ -0,0 +1,43 @@ +/* + * Copyright 2009-2010, Ingo Weinhold, ingo_weinhold@gmx.de. + * Distributed under the terms of the MIT License. + */ +#ifndef _FILE_DESCRIPTOR_IO_H +#define _FILE_DESCRIPTOR_IO_H + + +#include + + +class BFileDescriptorIO : public BPositionIO { +public: + BFileDescriptorIO(int fd, + bool takeOverOwnership = false); + virtual ~BFileDescriptorIO(); + + virtual ssize_t Read(void *buffer, size_t size); + virtual ssize_t Write(const void *buffer, size_t size); + + virtual ssize_t ReadAt(off_t position, void *buffer, + size_t size); + virtual ssize_t WriteAt(off_t position, const void *buffer, + size_t size); + + virtual off_t Seek(off_t position, uint32 seekMode); + virtual off_t Position() const; + + virtual status_t SetSize(off_t size); + virtual status_t GetSize(off_t* size) const; + +private: + BFileDescriptorIO( + const BFileDescriptorIO& other); + BFileDescriptorIO& operator=(const BFileDescriptorIO& other); + +private: + int fFD; + bool fOwnsFD; +}; + + +#endif // _FILE_DESCRIPTOR_IO_H diff --git a/headers/private/storage/FileIO.h b/headers/private/storage/FileIO.h new file mode 100644 index 0000000000..f45b3d3bc7 --- /dev/null +++ b/headers/private/storage/FileIO.h @@ -0,0 +1,46 @@ +/* + * Copyright 2009-2010, Ingo Weinhold, ingo_weinhold@gmx.de. + * Distributed under the terms of the MIT License. + */ +#ifndef _FILE_IO_H +#define _FILE_IO_H + + +#include + +#include + + +class BFileIO : public BPositionIO { +public: + BFileIO(FILE* file, + bool takeOverOwnership = false); + virtual ~BFileIO(); + + virtual ssize_t Read(void *buffer, size_t size); + virtual ssize_t Write(const void *buffer, size_t size); + + virtual ssize_t ReadAt(off_t position, void *buffer, + size_t size); + virtual ssize_t WriteAt(off_t position, const void *buffer, + size_t size); + + virtual off_t Seek(off_t position, uint32 seekMode); + virtual off_t Position() const; + + virtual status_t SetSize(off_t size); + virtual status_t GetSize(off_t* size) const; + +private: + BFileIO(const BFileIO& other); + BFileIO& operator=(const BFileIO& other); + + off_t _Seek(off_t position, uint32 seekMode) const; + +private: + FILE* fFile; + bool fOwnsFile; +}; + + +#endif // _FILE_IO_H diff --git a/src/kits/storage/FileDescriptorIO.cpp b/src/kits/storage/FileDescriptorIO.cpp new file mode 100644 index 0000000000..7bdb6b5734 --- /dev/null +++ b/src/kits/storage/FileDescriptorIO.cpp @@ -0,0 +1,94 @@ +/* + * Copyright 2009-2010, Ingo Weinhold, ingo_weinhold@gmx.de. + * Distributed under the terms of the MIT License. + */ + + +#include + +#include +#include +#include +#include + + +BFileDescriptorIO::BFileDescriptorIO(int fd, bool takeOverOwnership) + : + fFD(fd), + fOwnsFD(takeOverOwnership) +{ +} + + +BFileDescriptorIO::~BFileDescriptorIO() +{ + if (fOwnsFD) + close(fFD); +} + + +ssize_t +BFileDescriptorIO::Read(void *buffer, size_t size) +{ + ssize_t bytesRead = read(fFD, buffer, size); + return bytesRead >= 0 ? bytesRead : errno; +} + + +ssize_t +BFileDescriptorIO::Write(const void *buffer, size_t size) +{ + ssize_t bytesWritten = write(fFD, buffer, size); + return bytesWritten >= 0 ? bytesWritten : errno; +} + + +ssize_t +BFileDescriptorIO::ReadAt(off_t position, void *buffer, size_t size) +{ + ssize_t bytesRead = pread(fFD, buffer, size, position); + return bytesRead >= 0 ? bytesRead : errno; +} + + +ssize_t +BFileDescriptorIO::WriteAt(off_t position, const void *buffer, size_t size) +{ + ssize_t bytesWritten = pwrite(fFD, buffer, size, position); + return bytesWritten >= 0 ? bytesWritten : errno; +} + + +off_t +BFileDescriptorIO::Seek(off_t position, uint32 seekMode) +{ + off_t result = lseek(fFD, position, seekMode); + return result >= 0 ? result : errno; +} + + +off_t +BFileDescriptorIO::Position() const +{ + off_t result = lseek(fFD, 0, SEEK_CUR); + return result >= 0 ? result : errno; +} + + +status_t +BFileDescriptorIO::SetSize(off_t size) +{ + return ftruncate(fFD, size) == 0 ? B_OK : errno; +} + + +status_t +BFileDescriptorIO::GetSize(off_t* size) const +{ + struct stat st; + if (fstat(fFD, &st) < 0) + return errno; + + *size = st.st_size; + return B_OK; +} diff --git a/src/kits/storage/FileIO.cpp b/src/kits/storage/FileIO.cpp new file mode 100644 index 0000000000..b10e2af8bd --- /dev/null +++ b/src/kits/storage/FileIO.cpp @@ -0,0 +1,138 @@ +/* + * Copyright 2009-2010, Ingo Weinhold, ingo_weinhold@gmx.de. + * Distributed under the terms of the MIT License. + */ + + +#include + +#include +#include + + +BFileIO::BFileIO(FILE* file, bool takeOverOwnership) + : + fFile(file), + fOwnsFile(takeOverOwnership) +{ +} + + +BFileIO::~BFileIO() +{ + if (fOwnsFile && fFile != NULL) + fclose(fFile); +} + + +ssize_t +BFileIO::Read(void *buffer, size_t size) +{ + errno = B_OK; + ssize_t bytesRead = fread(buffer, 1, size, fFile); + return bytesRead >= 0 ? bytesRead : errno; +} + + +ssize_t +BFileIO::Write(const void *buffer, size_t size) +{ + errno = B_OK; + ssize_t bytesRead = fwrite(buffer, 1, size, fFile); + return bytesRead >= 0 ? bytesRead : errno; +} + + +ssize_t +BFileIO::ReadAt(off_t position, void *buffer, size_t size) +{ + // save the old position and seek to the requested one + off_t oldPosition = _Seek(position, SEEK_SET); + if (oldPosition < 0) + return oldPosition; + + // read + ssize_t result = BFileIO::Read(buffer, size); + + // seek back + fseeko(fFile, oldPosition, SEEK_SET); + + return result; +} + + +ssize_t +BFileIO::WriteAt(off_t position, const void *buffer, size_t size) +{ + // save the old position and seek to the requested one + off_t oldPosition = _Seek(position, SEEK_SET); + if (oldPosition < 0) + return oldPosition; + + // write + ssize_t result = BFileIO::Write(buffer, size); + + // seek back + fseeko(fFile, oldPosition, SEEK_SET); + + return result; +} + + +off_t +BFileIO::Seek(off_t position, uint32 seekMode) +{ + if (fseeko(fFile, position, seekMode) < 0) + return errno; + + return BFileIO::Position(); +} + + +off_t +BFileIO::Position() const +{ + off_t result = ftello(fFile); + return result >= 0 ? result : errno; +} + + +status_t +BFileIO::SetSize(off_t size) +{ + return B_UNSUPPORTED; +} + + +status_t +BFileIO::GetSize(off_t* _size) const +{ + // save the current position and seek to the end + off_t position = _Seek(0, SEEK_END); + if (position < 0) + return position; + + // get the size (position at end) and seek back + off_t size = _Seek(position, SEEK_SET); + if (size < 0) + return size; + + *_size = size; + return B_OK; +} + + +off_t +BFileIO::_Seek(off_t position, uint32 seekMode) const +{ + // save the current position + off_t oldPosition = ftello(fFile); + if (oldPosition < 0) + return errno; + + // seek to the requested position + if (fseeko(fFile, position, seekMode) < 0) + return errno; + + return oldPosition; +} diff --git a/src/kits/storage/Jamfile b/src/kits/storage/Jamfile index f72aeb8f28..7788eca938 100644 --- a/src/kits/storage/Jamfile +++ b/src/kits/storage/Jamfile @@ -21,6 +21,8 @@ MergeObject storage_kit.o : Entry.cpp EntryList.cpp File.cpp + FileDescriptorIO.cpp + FileIO.cpp FindDirectory.cpp Mime.cpp MimeType.cpp