From b0029fa4bfe3e92ff42aef657f92fa38d007f894 Mon Sep 17 00:00:00 2001 From: Tatsuhiro Tsujikawa Date: Mon, 17 Nov 2008 12:07:24 +0000 Subject: [PATCH] 2008-11-17 Tatsuhiro Tsujikawa Rewritten ByteArrayDiskWriter::size() using seekg() and tellg(). Removed const qualifier from DiskWriter::size(). * src/AbstractDiskWriter.cc * src/AbstractDiskWriter.h * src/ByteArrayDiskWriter.cc * src/ByteArrayDiskWriter.h * src/DiskWriter.h * test/ByteArrayDiskWriterTest.cc --- ChangeLog | 11 +++++++++++ src/AbstractDiskWriter.cc | 2 +- src/AbstractDiskWriter.h | 2 +- src/ByteArrayDiskWriter.cc | 14 +++++++++++--- src/ByteArrayDiskWriter.h | 5 +---- src/DiskWriter.h | 2 +- test/ByteArrayDiskWriterTest.cc | 2 ++ 7 files changed, 28 insertions(+), 10 deletions(-) diff --git a/ChangeLog b/ChangeLog index 23bce9be9..2b453c913 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,14 @@ +2008-11-17 Tatsuhiro Tsujikawa + + Rewritten ByteArrayDiskWriter::size() using seekg() and tellg(). + Removed const qualifier from DiskWriter::size(). + * src/AbstractDiskWriter.cc + * src/AbstractDiskWriter.h + * src/ByteArrayDiskWriter.cc + * src/ByteArrayDiskWriter.h + * src/DiskWriter.h + * test/ByteArrayDiskWriterTest.cc + 2008-11-17 Tatsuhiro Tsujikawa Fixed the bug that causes segmentation fault/bus error during executing diff --git a/src/AbstractDiskWriter.cc b/src/AbstractDiskWriter.cc index d1ce0076b..d3a31f5a3 100644 --- a/src/AbstractDiskWriter.cc +++ b/src/AbstractDiskWriter.cc @@ -185,7 +185,7 @@ void AbstractDiskWriter::truncate(uint64_t length) } // TODO the file descriptor fd must be opened before calling this function. -uint64_t AbstractDiskWriter::size() const +uint64_t AbstractDiskWriter::size() { if(fd == -1) { throw DlAbortEx("File not opened."); diff --git a/src/AbstractDiskWriter.h b/src/AbstractDiskWriter.h index 5067bc62f..d459ee48a 100644 --- a/src/AbstractDiskWriter.h +++ b/src/AbstractDiskWriter.h @@ -72,7 +72,7 @@ public: virtual void truncate(uint64_t length); - virtual uint64_t size() const; + virtual uint64_t size(); virtual void enableDirectIO(); diff --git a/src/ByteArrayDiskWriter.cc b/src/ByteArrayDiskWriter.cc index 011ed25b7..dbe22cc39 100644 --- a/src/ByteArrayDiskWriter.cc +++ b/src/ByteArrayDiskWriter.cc @@ -66,9 +66,10 @@ void ByteArrayDiskWriter::openExistingFile(const std::string& filename, void ByteArrayDiskWriter::writeData(const unsigned char* data, size_t dataLength, off_t position) { - if(size() < (uint64_t)position) { - buf.seekp(size(), std::ios::beg); - for(uint64_t i = size(); i < (uint64_t)position; ++i) { + uint64_t length = size(); + if(length < (uint64_t)position) { + buf.seekp(length, std::ios::beg); + for(uint64_t i = length; i < (uint64_t)position; ++i) { buf.put('\0'); } } else { @@ -85,4 +86,11 @@ ssize_t ByteArrayDiskWriter::readData(unsigned char* data, size_t len, off_t pos return buf.gcount(); } +uint64_t ByteArrayDiskWriter::size() +{ + buf.seekg(0, std::ios::end); + buf.clear(); + return buf.tellg(); +} + } // namespace aria2 diff --git a/src/ByteArrayDiskWriter.h b/src/ByteArrayDiskWriter.h index 313fd04e0..2f8007c8d 100644 --- a/src/ByteArrayDiskWriter.h +++ b/src/ByteArrayDiskWriter.h @@ -63,10 +63,7 @@ public: // Not implemented yet virtual void truncate(uint64_t length) {} - virtual uint64_t size() const - { - return buf.str().size(); - } + virtual uint64_t size(); virtual void enableDirectIO() {} diff --git a/src/DiskWriter.h b/src/DiskWriter.h index c57e8846d..2084826e3 100644 --- a/src/DiskWriter.h +++ b/src/DiskWriter.h @@ -77,7 +77,7 @@ public: virtual void truncate(uint64_t length) = 0; // Returns file length - virtual uint64_t size() const = 0; + virtual uint64_t size() = 0; virtual void enableDirectIO() = 0; diff --git a/test/ByteArrayDiskWriterTest.cc b/test/ByteArrayDiskWriterTest.cc index 2e6c52bdd..002367c4d 100644 --- a/test/ByteArrayDiskWriterTest.cc +++ b/test/ByteArrayDiskWriterTest.cc @@ -43,6 +43,7 @@ void ByteArrayDiskWriterTest::testWriteAndRead() { buf[c] = '\0'; CPPUNIT_ASSERT_EQUAL(std::string("ello World !!"), std::string(buf)); + CPPUNIT_ASSERT_EQUAL((uint64_t)14, bw.size()); } void ByteArrayDiskWriterTest::testWriteAndRead2() { @@ -58,6 +59,7 @@ void ByteArrayDiskWriterTest::testWriteAndRead2() { buf[c] = '\0'; CPPUNIT_ASSERT_EQUAL(std::string("Hello From Mars"), std::string(buf)); + CPPUNIT_ASSERT_EQUAL((uint64_t)15, bw.size()); } } // namespace aria2