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