Xc's Blog

Aria2 源码阅读 - SegmentMan

2018/05/23 Share

SegmentMan是负责Aria2中某一次的下载的类(This class holds the download progress of the one download entry.)。职责包括:分割下载块,保存下载配置等。

变量

  • totalSize : long long int

    总共需要下载的字节数,如果是分块传输编码Chunked transfer encoding,或者Content-Length不存在,则这个字段为0

  • isSplittable : 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
      7
      typedef struct {
      int cuid;
      long long int sp;
      long long int ep;
      long long int ds;
      bool finish;
      } Segment;
  • 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的已下载数量相加

CATALOG
  1. 1. 变量
  2. 2. 私有方法
  3. 3. 公共方法