Vold之CommandLinstener 4 模块分析

来源:互联网 发布:淘宝抢购插件 编辑:程序博客网 时间:2024/05/18 11:26

Commandlinstener主要是建立监听端socket,与MountService客户端建立链接请求,当有数据进行逻辑交互时,调用相应的Command来进行处理。

CommandListener与NetlinkHandler有统统的父类,SocketListener,不过CommandListener是作为listener端,即服务端。

CommandListener的初始化以及startListener方法。

CommandListener::CommandListener() :                 FrameworkListener("vold", true) {    registerCmd(new DumpCmd());    registerCmd(new VolumeCmd());    registerCmd(new AsecCmd());    registerCmd(new ObbCmd());    registerCmd(new StorageCmd());    registerCmd(new CryptfsCmd());    registerCmd(new FstrimCmd());}

其初始化方法中,创建并加入Command的子类对象。客户端发送指令给CommandListener,CommandListener则从相应的Cmd中找到相应的Cmd并执行。
当CommandListener收到数据时,会调用onDataAvaliable方法,具体实现由FrameworkListener子类来实现:
FrameworkListener:

bool FrameworkListener::onDataAvailable(SocketClient *c) {    char buffer[CMD_BUF_SIZE];    int len;    len = TEMP_FAILURE_RETRY(read(c->getSocket(), buffer, sizeof(buffer)));    if (len < 0) {        SLOGE("read() failed (%s)", strerror(errno));        return false;    } else if (!len)        return false;   if(buffer[len-1] != '\0')        SLOGW("String is not zero-terminated");    int offset = 0;    int i;    for (i = 0; i < len; i++) {        if (buffer[i] == '\0') {            /* IMPORTANT: dispatchCommand() expects a zero-terminated string */            dispatchCommand(c, buffer + offset);            offset = i + 1;        }    }    return true;}

dispatchCommand方法最终会根据收到的命令,调用相应的Command执行其runCommand。

0 0
原创粉丝点击