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。