android /system/vold源码分析(6)
2016-06-10 23:11
316 查看
接着分析CommandListener,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') { //可以有多条命令,它们之间使用\0分隔。
/* IMPORTANT: dispatchCommand() expects a zero-terminated string */
dispatchCommand(c, buffer + offset);
offset = i + 1;
}
}
return true;
}
调用dispatchCommand:void FrameworkListener::dispatchCommand(SocketClient *cli, char *data) {
分析命令的代码略,最终得到argv
for (i = mCommands->begin(); i != mCommands->end(); ++i) {
FrameworkCommand *c = *i;
if (!strcmp(argv[0], c->getCommand())) {
if (c->runCommand(cli, argc, argv)) {
SLOGW("Handler '%s' error (%s)", c->getCommand(), strerror(errno));
}
goto out;
}
}
cli->sendMsg(500, "Command not recognized", false);
FrameworkCommand即是执行的命令。实际上在CommandListener的构造函数中即注册了多个命令:CommandListener::CommandListener() :
FrameworkListener("vold", true) {
registerCmd(new DumpCmd());
registerCmd(new VolumeCmd());
registerCmd(new AsecCmd());
registerCmd(new ObbCmd());
registerCmd(new StorageCmd());
registerCmd(new XwarpCmd());
registerCmd(new CryptfsCmd());
registerCmd(new FstrimCmd());
}
FrameworkListener类的代码:
class FrameworkListener : public SocketListener { public: static const int CMD_ARGS_MAX = 26; /* 1 out of errorRate will be dropped */ int errorRate; private: int mCommandCount; bool mWithSeq; FrameworkCommandCollection *mCommands; public: FrameworkListener(const char *socketName); FrameworkListener(const char *socketName, bool withSeq); virtual ~FrameworkListener() {} protected: void registerCmd(FrameworkCommand *cmd); virtual bool onDataAvailable(SocketClient *c); private: void dispatchCommand(SocketClient *c, char *data); void init(const char *socketName, bool withSeq); };前面分析过了,当有数据到来时会调用onDataAvailalbe()方法:
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') { //可以有多条命令,它们之间使用\0分隔。
/* IMPORTANT: dispatchCommand() expects a zero-terminated string */
dispatchCommand(c, buffer + offset);
offset = i + 1;
}
}
return true;
}
调用dispatchCommand:void FrameworkListener::dispatchCommand(SocketClient *cli, char *data) {
分析命令的代码略,最终得到argv
for (i = mCommands->begin(); i != mCommands->end(); ++i) {
FrameworkCommand *c = *i;
if (!strcmp(argv[0], c->getCommand())) {
if (c->runCommand(cli, argc, argv)) {
SLOGW("Handler '%s' error (%s)", c->getCommand(), strerror(errno));
}
goto out;
}
}
cli->sendMsg(500, "Command not recognized", false);
FrameworkCommand即是执行的命令。实际上在CommandListener的构造函数中即注册了多个命令:CommandListener::CommandListener() :
FrameworkListener("vold", true) {
registerCmd(new DumpCmd());
registerCmd(new VolumeCmd());
registerCmd(new AsecCmd());
registerCmd(new ObbCmd());
registerCmd(new StorageCmd());
registerCmd(new XwarpCmd());
registerCmd(new CryptfsCmd());
registerCmd(new FstrimCmd());
}
相关文章推荐
- Android程序安装后应用图标不显示的问题
- android studio 上使用github提交代码
- Android 实现可以自由移动缩放的图片控件
- Android Touch事件传递机制
- 【Android开发细节】之【@id与@+id区别】
- Android 发布开源项目到jcenter
- Android学习笔记之ListView
- Android可以拖动位置的ListVeiw
- android 带两个点击按钮适配器+列表显示
- android /system/vold源码分析(5)
- 【转】 Android中退出程序的提示框
- Android初级教程小案例之单选框RadioGroup与复选框CheckBox
- Android初级教程小案例之单选框RadioGroup与复选框CheckBox
- Android 2016新技术
- android /system/vold源码分析(4)
- Android视图的绘制流程(上)——View的测量
- android中如何使用v7包
- Android初级教程Activity小案例(计算器乘法运算)
- 乐学成语(1)
- Android初级教程Activity小案例(计算器乘法运算)