From 39c991c0f3ca33cffd9cf445b7bad619f8c6f23b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stephan=20A=C3=9Fmus?= Date: Fri, 26 May 2006 13:27:53 +0000 Subject: [PATCH] Added BPositionIO::GetSize() and implemented it by means of Seek() and Position(). This used up a virtual slot of BPositionIO. GetSize() needed to be implemented in BFile, which uses the BStatable version as before. This should hopefully be binary compatible. The only problem could be in source compatibility when there are classes inheriting from BPositionIO implementing their own GetSize(). git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@17593 a95241bf-73f2-0310-859d-f6bbb57e9c96 --- headers/os/storage/File.h | 1 + headers/os/support/DataIO.h | 2 +- src/kits/storage/File.cpp | 7 +++++++ src/kits/support/DataIO.cpp | 24 +++++++++++++++++++++++- 4 files changed, 32 insertions(+), 2 deletions(-) diff --git a/headers/os/storage/File.h b/headers/os/storage/File.h index 8dcfd94482..3512c4098d 100644 --- a/headers/os/storage/File.h +++ b/headers/os/storage/File.h @@ -57,6 +57,7 @@ public: virtual off_t Position() const; virtual status_t SetSize(off_t size); + virtual status_t GetSize(off_t* size) const; BFile &operator=(const BFile &file); diff --git a/headers/os/support/DataIO.h b/headers/os/support/DataIO.h index 357456dee4..8b3317aab4 100644 --- a/headers/os/support/DataIO.h +++ b/headers/os/support/DataIO.h @@ -80,9 +80,9 @@ public: virtual off_t Position() const = 0; virtual status_t SetSize(off_t size); + virtual status_t GetSize(off_t* size) const; private: - virtual void _ReservedPositionIO1(); virtual void _ReservedPositionIO2(); virtual void _ReservedPositionIO3(); virtual void _ReservedPositionIO4(); diff --git a/src/kits/storage/File.cpp b/src/kits/storage/File.cpp index ec01c911b2..e1cc37f796 100644 --- a/src/kits/storage/File.cpp +++ b/src/kits/storage/File.cpp @@ -460,6 +460,13 @@ BFile::SetSize(off_t size) return set_stat(statData, B_STAT_SIZE); } +// GetSize TODO: doxygen comment +status_t +BFile::GetSize(off_t* size) const +{ + return BStatable::GetSize(size); +} + // = //! Assigns another BFile to this BFile. /*! If the other BFile is uninitialized, this one will be too. Otherwise it diff --git a/src/kits/support/DataIO.cpp b/src/kits/support/DataIO.cpp index 1d067a1273..a887ef05e5 100644 --- a/src/kits/support/DataIO.cpp +++ b/src/kits/support/DataIO.cpp @@ -129,9 +129,31 @@ BPositionIO::SetSize(off_t size) return B_ERROR; } +// GetSize +status_t +BPositionIO::GetSize(off_t* size) const +{ + if (!size) + return B_BAD_VALUE; + + off_t currentPos = Position(); + if (currentPos < 0) + return (status_t)currentPos; + + *size = const_cast(this)->Seek(0, SEEK_END); + if (*size < 0) + return (status_t)*size; + + off_t pos = const_cast(this)->Seek(currentPos, SEEK_SET); + + if (pos != currentPos) + return pos < 0 ? (status_t)pos : B_ERROR; + + return B_OK; +} + // FBC -void BPositionIO::_ReservedPositionIO1(){} void BPositionIO::_ReservedPositionIO2(){} void BPositionIO::_ReservedPositionIO3(){} void BPositionIO::_ReservedPositionIO4(){}