/* */ #ifndef D_WR_DISK_CACHE_ENTRY_H #define D_WR_DISK_CACHE_ENTRY_H #include "common.h" #include #include "SharedHandle.h" #include "a2functional.h" #include "error_code.h" namespace aria2 { class DiskAdaptor; class WrDiskCache; class WrDiskCacheEntry { public: struct DataCell { // Where the data is going to be put in DiskAdaptor int64_t goff; // data must be len+offset bytes. Thus, the cached data is // [data+offset, data+offset+len). unsigned char *data; size_t offset; size_t len; // valid memory range from data+offset size_t capacity; bool operator<(const DataCell& rhs) const { return goff < rhs.goff; } }; typedef std::set > DataCellSet; WrDiskCacheEntry(const SharedHandle& diskAdaptor); ~WrDiskCacheEntry(); // Flushes the cached data to the disk and deletes them. void writeToDisk(); // Deletes cached data without flushing to the disk. void clear(); // Caches |dataCell| bool cacheData(DataCell* dataCell); // Appends into last dataCell in set_ if the region is // contagious. Returns the number of copied bytes. size_t append(int64_t goff, const unsigned char *data, size_t len); size_t getSize() const { return size_; } void setSizeKey(size_t sizeKey) { sizeKey_ = sizeKey; } size_t getSizeKey() const { return sizeKey_; } void setLastUpdate(int64_t clock) { lastUpdate_ = clock; } int64_t getLastUpdate() const { return lastUpdate_; } bool operator<(const WrDiskCacheEntry& rhs) const { return sizeKey_ > rhs.sizeKey_ || (sizeKey_ == rhs.sizeKey_ && lastUpdate_ < rhs.lastUpdate_); } enum { CACHE_ERR_SUCCESS, CACHE_ERR_ERROR }; int getError() const { return error_; } error_code::Value getErrorCode() const { return errorCode_; } const DataCellSet& getDataSet() const { return set_; } private: void deleteDataCells(); size_t sizeKey_; int64_t lastUpdate_; size_t size_; DataCellSet set_; int error_; error_code::Value errorCode_; SharedHandle diskAdaptor_; }; } // namespace aria2 #endif // D_WR_DISK_CACHE_ENTRY_H