summaryrefslogtreecommitdiff
path: root/src/BitfieldMan.cc
diff options
context:
space:
mode:
authorTatsuhiro Tsujikawa <tatsuhiro.t@gmail.com>2009-06-30 17:03:57 +0000
committerTatsuhiro Tsujikawa <tatsuhiro.t@gmail.com>2009-06-30 17:03:57 +0000
commitcf19dce8553d8a05f5d307835ea3c429d9eb63f2 (patch)
tree7326cc88a21d711218179d722c667dfaeaae249b /src/BitfieldMan.cc
parentcece2bc896b941d0c9b9d441460b5d32989268bd (diff)
2009-07-01 Tatsuhiro Tsujikawa <t-tujikawa@users.sourceforge.net>
HTTP pipelining is now working. Fixed Segmention fault in BitfieldMan's copy ctor. * src/AbstractCommand.cc * src/BitfieldMan.cc * src/BitfieldMan.h * src/DownloadCommand.cc * src/HttpDownloadCommand.cc * src/HttpRequest.cc * src/SegmentMan.cc * src/SegmentMan.h * test/BitfieldManTest.cc * test/SegmentManTest.cc
Diffstat (limited to 'src/BitfieldMan.cc')
-rw-r--r--src/BitfieldMan.cc25
1 files changed, 24 insertions, 1 deletions
diff --git a/src/BitfieldMan.cc b/src/BitfieldMan.cc
index 2569c691..26e0fc2e 100644
--- a/src/BitfieldMan.cc
+++ b/src/BitfieldMan.cc
@@ -96,7 +96,7 @@ BitfieldMan::BitfieldMan(const BitfieldMan& bitfieldMan)
memcpy(bitfield, bitfieldMan.bitfield, bitfieldLength);
memcpy(useBitfield, bitfieldMan.useBitfield, bitfieldLength);
filterEnabled = bitfieldMan.filterEnabled;
- if(filterBitfield) {
+ if(filterEnabled) {
filterBitfield = new unsigned char[bitfieldLength];
memcpy(filterBitfield, bitfieldMan.filterBitfield, bitfieldLength);
} else {
@@ -612,6 +612,29 @@ void BitfieldMan::removeFilter(uint64_t offset, uint64_t length) {
updateCache();
}
+void BitfieldMan::addNotFilter(uint64_t offset, uint64_t length)
+{
+ // TODO1.5 Create ensureFilterBitfield() to initialize this
+ if(!filterBitfield) {
+ filterBitfield = new unsigned char[bitfieldLength];
+ memset(filterBitfield, 0, bitfieldLength);
+ }
+ if(length > 0 && blocks > 0) {
+ size_t startBlock = offset/blockLength;
+ if(blocks <= startBlock) {
+ startBlock = blocks;
+ }
+ size_t endBlock = (offset+length-1)/blockLength;
+ for(size_t i = 0; i < startBlock; ++i) {
+ setFilterBit(i);
+ }
+ for(size_t i = endBlock+1; i < blocks; ++i) {
+ setFilterBit(i);
+ }
+ }
+ updateCache();
+}
+
void BitfieldMan::enableFilter() {
if(!filterBitfield) {
filterBitfield = new unsigned char[bitfieldLength];