Xc's Blog

Aria2 源码阅读 - Command和AbstractCommand

2018/05/15 Share

Command是DownloadEngin执行的任务的基类,而AbstractCommand则基于Command添加了更多的功能。除了SleepCommand是直接继承Command的,其他所有的Command都是直接或者间接继承了AbstractCommand。

Command

Command的定义十分简单,只有一个protected的cuid字段和对应的get方法,一个构造函数,一个析构函数和一个execute方法

1
2
3
4
5
6
7
8
9
10
class Command {
protected:
int cuid;
public:
Command(int cuid):cuid(cuid) {}
virtual ~Command() {}
virtual bool execute() = 0;

int getCuid() const { return cuid; }
};

AbstractCommand

公共方法

  • AbstractCommand(int cuid, Request* req, DownloadEngine* e, Socket* s= NULL)

    构造函数
    将变量赋值给类属性
    Socket使用了传入的socket新建了Socket的拷贝,并且将socket加入downloadEngine的socket列表中
    checkSocketIsReadablecheckSocketIsWritable设置为false
    checkPoint设为0

  • ~AbstractCommand()

    析构方法
    将Socket从DownloadEngine的sockets列表中删除,回收socket内存

  • execute() : bool

protected 变量

  • req : Request*

    Request

  • e : DownloadEngine*

    DownloadEngine

  • socket : Socket*

    Socket

  • checkSocketIsReadable : bool

  • checkSocketIsWritable : bool

protected方法

  • virtual prepareForRetry() : bool

    使用当前Command的参数(cuid,req,e),新建一个新的command,加入DownloadEngine的下载列表中

  • virtual onError(Exception* e) : void

    Do nothing.

未实现的虚方法

  • executeInternal(Segment segment) : bool

私有变量

  • checkPoint : struct timeval

    检查点,表示时间的变量,过来检查当前是否超过该时间点一定时间

私有方法

  • updateCheckPoint() : void

    将checkPoint更新为现在的时间

  • isTimeoutDetected() : bool

    检查是否超时,判断条件是,当前是否已经过去检查点五秒以上,
    如果检查点为0,默认返回false

CATALOG
  1. 1. Command
  2. 2. AbstractCommand
    1. 2.1. 公共方法
    2. 2.2. protected 变量
    3. 2.3. protected方法
    4. 2.4. 未实现的虚方法
    5. 2.5. 私有变量
    6. 2.6. 私有方法