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的已下载数量相加