android /system/vold源码分析(6)
来源:互联网 发布:java爬虫技术视频教程 编辑:程序博客网 时间:2024/05/29 14:49
接着分析CommandListener,FrameworkListener是它的直接父类。
FrameworkListener类的代码:
FrameworkCommand即是执行的命令。实际上在CommandListener的构造函数中即注册了多个命令:
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());}
0 0
- android /system/vold源码分析(6)
- android /system/vold源码分析(1)
- android /system/vold源码分析(2)
- android /system/vold源码分析(3)
- android /system/vold源码分析(4)
- android /system/vold源码分析(5)
- android /system/vold源码分析(7)
- android /system/vold源码分析(8)
- Android-vold源码分析之startListener(6)
- Android-vold源码分析之startListener(6)
- Android-vold源码分析之handleBlockEvent(5)
- Android-vold源码分析之runCommand(7)
- Android-vold源码分析之handleBlockEvent(5)
- Android-vold源码分析之runCommand(7)
- Android磁盘管理-之vold源码分析
- Android-vold源码分析之handleBlockEvent
- Android-vold源码分析之startListener
- Android-vold源码分析之runCommand
- Android程序安装后应用图标不显示的问题
- linux密码破解
- 设计模式—模板设计模式
- Solr4.7从数据库导数据
- PAT 1097 Deduplication on a Linked List (25)
- android /system/vold源码分析(6)
- 动态添加TextView
- 网络通信协议
- c++:角色类
- 你看你看南昌的互联网创业孵化基地众生相-2016年6月江西IDC排行榜与发展报告
- 九度OJ - 1209 - 最小邮票数
- 通过layer-list多图层叠加效果实现圆角功能
- sublime text3开启和使用xdebug
- VS2013+FFMPEG开发环境配置