SegmentMan是负责Aria2中某一次的下载的类(This class holds the download progress of the one download entry.)。职责包括:分割下载块,保存下载配置等。
变量
totalSize : long long int总共需要下载的字节数,如果是分块传输编码
Chunked transfer encoding,或者Content-Length不存在,则这个字段为0isSplittable : bool表示该下载是否可分,即是否启用多线程下载,当总共需要下载的字节数不可知时,会被DownloadCommand设为0
downloadStarted : bool是否开始下载,默认是false
segments : vector<Segment>Segment是一个简单的结构体,表示一个文件下载的分块。
代码如下,它有5个字段:- sp和ep是文件分块的开始和结束的偏移量。这两个变量会被用于http头中:
Range: bytes=sp-ep - ds表示已经下载的字节数量
- finish表示区块下载是否下载完成
- cuid 表示一个唯一的ID
1
2
3
4
5
6
7typedef struct {
int cuid;
long long int sp;
long long int ep;
long long int ds;
bool finish;
} Segment;
- sp和ep是文件分块的开始和结束的偏移量。这两个变量会被用于http头中:
filename : string文件名,如果没有成功获得文件名,则为长度为0的string
dir : string下载目录
ufilename : string用户指定的文件名
logger : *Logger用来打印日志的类
SEGMENT_FILE_EXTENSION : const ".aria2"分区文件的后缀
私有方法
read(*FILE file) : void从保存的aria2文件中,并且载入配置
openSegFile(string segFilename, string mode) : *FILE打开保存的aria2文件
公共方法
getFilePath() : string将目录和文件名组合返回文件的路径,如果文件名为空,则返回默认值index.html
getSegmentFilePath() : string将文件路径和分区文件的后缀组合成新的文件名
unregisterId(int cuid) : void将segments里所有的cuid匹配的segment的cuid设置为0
getSegment(Segment& segment, int cuid) : bool返回cuid相匹配的Segment, 并且填充到传入的指针中。
如果能找到匹配cuid的segment,返回对应的cuid的。
如果为segments为空,则返回一个对应的cuid的0值的segment,并将segment push到segments中。
如果没有找到,并且
isSplittable为false,则返回false。如果没有找到,但是存在finish为false,且cuid为0的segment,则设定cuid,并返回。
如果没有找到,但是存在finish为false的segment,且segment的未完成的大小大于512K(524288 Byte),则将此segment分裂成为两个,将新的segment push进segments并返回。
updateSegment(const Segment& segment) : void遍历segments,找出cuid,sp,ep相匹配的值,并进行替换。
从结果上是更新了符合条件的Segment的ds和finsh字段segmentFileExists() : bool返回分块文件对应的文件名(*.aria2)是否存在。如果分块不可分,则直接返回false
load() : void从segments信息文件载入segments,如果分块不可分,则不进行任何操作
save() : void将segments信息保存入(.aria2)文件如果分块不可分,则不进行任何操作
remove() : void移出.aria2文件
finished() : bool返回是否下载完成
removeIfFinished() : void如果下载完成,则移除.aria2文件
getDownloadedSize() : long long int返回已经下载的文件大小。
计算方式:遍历segments,将所有的segment的已下载数量相加