Vold之CommandLinstener 4 模块分析

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。

你可能感兴趣的:(Vold之CommandLinstener 4 模块分析)