<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ThinkChat2.0新版上線,更智能更精彩,支持會話、畫圖、視頻、閱讀、搜索等,送10W Token,即刻開啟你的AI之旅 廣告
                Vold使用CL模塊的流程是: · 使用new創建一個CommandListener對象; · 調用CL的startListener函數。 來看這兩個函數。 1. 創建CommandListener的分析 和NetlinkerHandler一樣,CommandListener也有一個相對不簡單的派生關系,它的家族圖譜如圖9-5所示: :-: ![](http://img.blog.csdn.net/20150802164411883?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center) 圖9-5 CommandListener家族圖譜 根據上圖可以知道: - CL定義了一些和Command相關的內部類,這里采用了設計模式中的Command模式,每個命令的處理函數都是runCommand。注意,上圖只列出了部分Command類。 - CL也是從SocketListener派生的,不過它是Socket的監聽(listen)端。 下面看它的代碼: **CommandListener.cpp** ~~~ CommandListener::CommandListener() : FrameworkListener("vold") { //CL模塊支持的命令 registerCmd(new DumpCmd()); registerCmd(new VolumeCmd()); registerCmd(new AsecCmd()); registerCmd(new ShareCmd()); registerCmd(new StorageCmd()); registerCmd(new XwarpCmd()); } /* registerCmd函數將Command保存到mCommands中,mCommands的定義為一個列表,如下: typedef android::List<FrameworkCommand *>FrameworkCommandCollection; */ voidFrameworkListener::registerCmd(FrameworkCommand *cmd) { mCommands->push_back(cmd); } ~~~ 從上面的代碼可知,CommandListener的基類是FrameworkListener,而FrameworkListener又從SocketListener類派生。之前在分析NM模塊的NetLinkerHandler時,已介紹過SocketListener相關的知識了,所以此處不再贅述,只總結一下CL創建后的結果,它們是: - CL會創建一個監聽端的socket,這樣就可以接收客戶端的鏈接。 - 客戶端發送命令給CL,CL則從mCommands中找到對應的命令,并交給該命令的runCommand函數處理。 下面來關注第二個函數startListener,這個函數由SocketListener實現。 2. startListener的分析和數據處理 其實在分析NetlinkerHandler時,已經介紹了startListener函數,這里再簡單回顧一下,有些具體內容和本章對NetlinkerHandler的分析有關。 **SocketListener.cpp** ~~~ int SocketListener::startListener() { if(!mSocketName && mSock == -1) { ...... errno = EINVAL; return -1; } else if (mSocketName) { //mSOcketName為字符串“vold”。android_get_control_socket函數返回 //對應的socket句柄 if((mSock = android_get_control_socket(mSocketName)) < 0) { ...... return -1; } } //CL模塊是監聽端 if(mListen && listen(mSock, 4) < 0) { ...... return -1; } elseif (!mListen) mClients->push_back(new SocketClient(mSock)); if(pipe(mCtrlPipe)) { ...... return -1; } //創建工作線程threadStart if(pthread_create(&mThread, NULL, SocketListener::threadStart, this)) { return -1; } return0; } ~~~ 當CL收到數據時,會調用onDataAvailable函數,它由FrameworkListener實現。 **FrameworkListener.cpp** ~~~ boolFrameworkListener::onDataAvailable(SocketClient *c) { charbuffer[255]; intlen; //讀取數據 if((len = read(c->getSocket(), buffer, sizeof(buffer) -1)) < 0) { ...... return errno; } elseif (!len) return false; intoffset = 0; int i; for (i= 0; i < len; i++) { if(buffer[i] == '\0') { //分發命令,最終會調用對應命令對象的runCommand進行函數處理。 dispatchCommand(c, buffer + offset); offset = i + 1; } } returntrue; } ~~~ dispatchCommand最終會根據收到的命令名(如“Volume”,“Share”等)來調用對應的命令對象(如VolumeCmd,ShareCmd)的runCommand函數以處理請求。這一塊非常簡單,這里就不再詳述了。 3. CL模塊的總結 CL模塊的主要工作是: - 建立一個監聽端的socket。 - 接收客戶端的連接和請求,并調用對應Command對象的runComand函數處理。 目前,CL模塊唯一的客戶端就是MountService。來看看它。
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看