Command是DownloadEngin执行的任务的基类,而AbstractCommand则基于Command添加了更多的功能。除了SleepCommand是直接继承Command的,其他所有的Command都是直接或者间接继承了AbstractCommand。
Command
Command的定义十分简单,只有一个protected的cuid字段和对应的get方法,一个构造函数,一个析构函数和一个execute方法1
2
3
4
5
6
7
8
9
10class 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列表中
checkSocketIsReadable
和checkSocketIsWritable
设置为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