2008-11-17 Tatsuhiro Tsujikawa <t-tujikawa@users.sourceforge.net>

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
pull/1/head
Tatsuhiro Tsujikawa 2008-11-17 12:07:24 +00:00
parent 644f707519
commit b0029fa4bf
7 changed files with 28 additions and 10 deletions

View File

@ -1,3 +1,14 @@
2008-11-17 Tatsuhiro Tsujikawa <t-tujikawa@users.sourceforge.net>
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 <t-tujikawa@users.sourceforge.net>
Fixed the bug that causes segmentation fault/bus error during executing

View File

@ -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.");

View File

@ -72,7 +72,7 @@ public:
virtual void truncate(uint64_t length);
virtual uint64_t size() const;
virtual uint64_t size();
virtual void enableDirectIO();

View File

@ -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

View File

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

View File

@ -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;

View File

@ -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