• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 
2 /*
3  * Copyright (C) 2021 Huawei Device Co., Ltd.
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 #include <iostream>
17 #include <functional>
18 #include <vector>
19 #include <thread>
20 #include <future>
21 #include <map>
22 #include <mutex>
23 #include <climits>
24 #include "parameters.h"
25 #include "include/sp_csv_util.h"
26 #include "include/sdk_data_recv.h"
27 #include "include/GpuCounter.h"
28 #include "include/lock_frequency.h"
29 #include "include/sp_thread_socket.h"
30 #include "include/sp_profiler_factory.h"
31 #include "include/sp_log.h"
32 #include "include/sp_task.h"
33 #include "include/profiler_fps.h"
34 #include "include/heartbeat.h"
35 #include "include/control_call_cmd.h"
36 #include "include/sp_profiler_factory.h"
37 #include "include/Network.h"
38 #include "include/startup_delay.h"
39 #include "include/Dubai.h"
40 #include "include/GetLog.h"
41 #include "include/RAM.h"
42 namespace OHOS {
43 namespace SmartPerf {
44 std::string g_pkgName = "";
MapToString(std::map<std::string,std::string> dataMap) const45 std::string SpThreadSocket::MapToString(std::map<std::string, std::string> dataMap) const
46 {
47     std::string result;
48     int i = 0;
49     std::string splitStr = "";
50     for (auto iter = dataMap.cbegin(); iter != dataMap.cend(); ++iter) {
51         printf("%s = %s\n", iter->first.c_str(), iter->second.c_str());
52         if (i > 0) {
53             splitStr = "$$";
54         }
55         result += splitStr + iter->first.c_str() + "||" + iter->second.c_str();
56         i++;
57     }
58     return result;
59 }
SplitMsg(const std::string & recvBuf) const60 std::string SpThreadSocket::SplitMsg(const std::string &recvBuf) const
61 {
62     if (recvBuf.empty()) {
63         LOGE("SplitMsg recvBuf is null");
64         return recvBuf;
65     }
66     size_t pos = recvBuf.find("::");
67     if (pos != std::string::npos) {
68         std::vector<std::string> sps;
69         SPUtils::StrSplit(recvBuf, "::", sps);
70         if (sps.size() > 1) {
71             return sps[1];
72         } else {
73             LOGE("SplitMsg sps size is zreo");
74             return recvBuf;
75         }
76     } else {
77         return recvBuf;
78     }
79 }
80 
Process(ProtoType type)81 void SpThreadSocket::Process(ProtoType type)
82 {
83     std::cout << "Socket Process called!" << std::endl;
84     SpServerSocket spSocket;
85     spSocket.Init(type);
86     if (type == ProtoType::TCP) {
87         std::cout << "Socket TCP Init called!" << std::endl;
88         WLOGI("Socket TCP Init called!");
89         TypeTcp(spSocket);
90     }
91     if (type == ProtoType::UDP || type == ProtoType::UDPEX) {
92         SocketHeartbeat();
93         while (socketConnect == true) {
94             spSocket.Recvfrom();
95             HandleMsg(spSocket);
96         }
97     }
98     std::cout << "Socket Process finished!" << std::endl;
99     spSocket.Close();
100 }
CheckToken(std::string recvStr,SpServerSocket & spSocket,std::string recvStrNoToken) const101 SocketErrorType SpThreadSocket::CheckToken(std::string recvStr,
102     SpServerSocket &spSocket, std::string recvStrNoToken) const
103 {
104     if (recvStr.find_last_of(":") == std::string::npos) {
105         if (recvStr.find("SP_daemon -editor") != std::string::npos) {
106             LOGI("Received string contains 'SP_daemon -editor', token check passed.");
107             return SocketErrorType::OK;
108         } else {
109             LOGE("Token check failed: %s", recvStrNoToken.c_str());
110             return SocketErrorType::TOKEN_CHECK_FAILED;
111         }
112     }
113     std::string token = recvStr.substr(recvStr.find_last_of(":") + 1);
114     token = token.substr(0, token.find(' '));
115     std::string tcpToken = SPTask::GetInstance().GetTcpToken();
116     LOGD("Comparing token with TCP token...");
117     if (tcpToken == "" && token == "-SESSIONID") {
118         LOGI("Token is empty but received token is '-SESSIONID', token check passed.");
119         return SocketErrorType::OK;
120     }
121     if (token != tcpToken) {
122         LOGE("Token mismatch.");
123         return SocketErrorType::TOKEN_CHECK_FAILED;
124     }
125     LOGD("Token match");
126     return SocketErrorType::OK;
127 }
TypeTcp(SpServerSocket & spSocket)128 void SpThreadSocket::TypeTcp(SpServerSocket &spSocket)
129 {
130     SocketHeartbeat();
131     WLOGI("Socket TCP Init Finished, Wait Client Socket Connect...");
132     while (socketConnect == true) {
133         int procFd = spSocket.Accept();
134         std::cout << "Socket TCP procFd: " << procFd << std::endl;
135         while (procFd > 0) {
136             int reFd = spSocket.Recv();
137             if (reFd < 0) {
138                 WLOGE("Error receiving data, reFd: %d", reFd);
139                 break;
140             }
141             std::string recvStr = spSocket.RecvBuf();
142             std::string recvStrNoToken = recvStr.substr(0, recvStr.find("::"));
143             LOGD("TCP recv data:%s", recvStr.c_str());
144             WLOGD("Received data: %s", recvStrNoToken.c_str());
145             // 解析消息 分发处理
146             const SocketErrorType tokenStatus = CheckToken(recvStr, spSocket, recvStrNoToken);
147             WLOGD("Token check status: %d", tokenStatus);
148             DealMsg(recvStr, spSocket, tokenStatus);
149         }
150     }
151 }
152 // TCP
InitRecv(std::string recvStr,SpServerSocket & spSocket,SocketConnectType type) const153 void SpThreadSocket::InitRecv(std::string recvStr, SpServerSocket &spSocket, SocketConnectType type) const
154 {
155     std::string errorInfo;
156     std::string checkStr = recvStr.substr(std::string("init::").length());
157     if (!SPTask::GetInstance().CheckTcpParam(checkStr, errorInfo) &&
158         checkStr.find(SPTask::GetInstance().GetTcpToken()) == std::string::npos) {
159         WLOGE("Init error(%s)", errorInfo.c_str());
160         if (type == SocketConnectType::CMD_SOCKET) {
161             spSocket.Send("init::False,\"error\":" + errorInfo);
162         } else {
163             spSocket.Send(std::string("init::") + SocketErrorTypeToString(SocketErrorType::INIT_FAILED));
164         }
165         return;
166     }
167     if (recvStr.find("-lockfreq") != std::string::npos &&
168         SPTask::GetInstance().GetTcpToken() == "") {
169         WLOGE("'-lockfreq' must have a valid token.");
170         return;
171     }
172     ErrCode code = SPTask::GetInstance().InitTask(SplitMsg(recvStr));
173     if (type == SocketConnectType::CMD_SOCKET) {
174         spSocket.Send(std::string("init::") + ((code == ErrCode::OK) ? "True" : "False"));
175         WLOGI("Sent init::"  + ((code == ErrCode::OK) ? "True" : "False"));
176         return;
177     }
178     if (code == ErrCode::OK) {
179         spSocket.Send("init::True");
180         WLOGI("Sent init::True response");
181     } else {
182         spSocket.Send(std::string("init::") + SocketErrorTypeToString(SocketErrorType::INIT_FAILED));
183         WLOGE("Sent init::%d for failure", SocketErrorType::INIT_FAILED);
184     }
185 }
StartRecv(SpServerSocket & spSocket)186 void SpThreadSocket::StartRecv(SpServerSocket &spSocket)
187 {
188     if (flagRunning) {
189         spSocket.Send("SP_daemon is running");
190         return;
191     }
192     auto lambdaTask = [](const std::string &data) {
193         std::cout << data << std::endl;
194     };
195     ErrCode code = SPTask::GetInstance().StartTask(lambdaTask);
196     SPTask::GetInstance().StartRecord();
197     if (code == ErrCode::OK) {
198         spSocket.Send("start::True");
199         flagRunning = true;
200         WLOGI("Sent start::True message to socket.");
201     } else if (code == ErrCode::FAILED) {
202         spSocket.Send("start::False");
203         WLOGE("Sent start::False message to socket.");
204     }
205 }
StartRecvRealtime(SpServerSocket & spSocket) const206 void SpThreadSocket::StartRecvRealtime(SpServerSocket &spSocket) const
207 {
208     auto lambdaTask = [&spSocket](const std::string &data) { spSocket.Send(data); };
209     ErrCode code = SPTask::GetInstance().StartTask(lambdaTask);
210     if (code == ErrCode::OK) {
211         spSocket.Send("start::True");
212         WLOGI("Sent start::True message to socket.");
213     } else if (code == ErrCode::FAILED) {
214         spSocket.Send(std::string("start::") + SocketErrorTypeToString(SocketErrorType::START_FAILED));
215         WLOGE("Sent start::" + SocketErrorTypeToString(SocketErrorType::START_FAILED) + " message to socket.");
216     }
217 }
StopRecvRealtime(SpServerSocket & spSocket)218 void SpThreadSocket::StopRecvRealtime(SpServerSocket &spSocket)
219 {
220     ErrCode code = SPTask::GetInstance().StopTask();
221     if (code == ErrCode::OK) {
222         spSocket.Send("stop::True");
223         WLOGI("Sent stop::True message to socket.");
224         flagRunning = false;
225         spSocket.Close();
226     } else if (code == ErrCode::FAILED) {
227         spSocket.Send(std::string("stop::") + SocketErrorTypeToString(SocketErrorType::STOP_FAILED));
228         WLOGE("Sent stop::" + SocketErrorTypeToString(SocketErrorType::STOP_FAILED) + " message to socket.");
229     }
230 }
StartRecvRecord(SpServerSocket & spSocket) const231 void SpThreadSocket::StartRecvRecord(SpServerSocket &spSocket) const
232 {
233     ErrCode code = SPTask::GetInstance().StartRecord();
234     if (code == ErrCode::OK) {
235         spSocket.Send("startRecord::True");
236         WLOGI("Sent startRecord::True message to socket.");
237     } else {
238         spSocket.Send(std::string("startRecord::") + SocketErrorTypeToString(SocketErrorType::START_RECORD_FAILED));
239         WLOGE("Sent startRecord::" + SocketErrorTypeToString(SocketErrorType::START_RECORD_FAILED) +
240         " message to socket.");
241     }
242 }
StopRecvRecord(SpServerSocket & spSocket) const243 void SpThreadSocket::StopRecvRecord(SpServerSocket &spSocket) const
244 {
245     ErrCode code = SPTask::GetInstance().StopRecord();
246     if (code == ErrCode::OK) {
247         spSocket.Send("stopRecord::True");
248         WLOGI("Sent stopRecord::True message to socket.");
249     } else {
250         spSocket.Send(std::string("stopRecord::") + SocketErrorTypeToString(SocketErrorType::STOP_RECORD_FAILED));
251         WLOGE("Sent stopRecord::" + SocketErrorTypeToString(SocketErrorType::STOP_RECORD_FAILED) +
252         " message to socket.");
253     }
254 }
SendTokenFailedMessage(SpServerSocket & socket,std::string & message) const255 void SpThreadSocket::SendTokenFailedMessage(SpServerSocket &socket, std::string &message) const
256 {
257     if (message.find("init:::") != std::string::npos ||
258         message.find("start:::") != std::string::npos) {
259         WLOGI("Skipping token check failure for init::: or start::: command.");
260         return;
261     }
262     const std::vector<std::string> messageType = {
263         "init::",
264         "start::",
265         "stop::",
266         "startRecord::",
267         "stopRecord::",
268     };
269     for (auto it : messageType) {
270         if (message.find(it) != std::string::npos) {
271             WLOGE("Sending token check failed message for command: %s", it.c_str());
272             socket.Send(it + SocketErrorTypeToString(SocketErrorType::TOKEN_CHECK_FAILED));
273             return;
274         }
275     }
276     WLOGW("No matching command found for token check failure in message: %s", message.c_str());
277 }
DealMsg(std::string recvStr,SpServerSocket & spSocket,SocketErrorType tokenStatus)278 void SpThreadSocket::DealMsg(std::string recvStr, SpServerSocket &spSocket, SocketErrorType tokenStatus)
279 {
280     SocketHeartbeat();
281     if (tokenStatus == SocketErrorType::TOKEN_CHECK_FAILED) {
282         SendTokenFailedMessage(spSocket, recvStr);
283         return;
284     }
285     if (recvStr.find("init:::") != std::string::npos) {
286         WLOGI("Processing 'init:::' command.");
287         InitRecv(recvStr, spSocket, SocketConnectType::CMD_SOCKET);
288     } else if (recvStr.find("start:::") != std::string::npos) {
289         WLOGI("Processing 'start:::' command.");
290         StartRecv(spSocket);
291     } else if (recvStr.find("init::") != std::string::npos) {
292         WLOGI("Processing 'init::' command.");
293         InitRecv(recvStr, spSocket, SocketConnectType::EDITOR_SOCKET);
294     } else if (recvStr.find("start::") != std::string::npos) {
295         WLOGI("Processing 'start::' command.");
296         StartRecvRealtime(spSocket);
297     } else if (recvStr.find("stop::") != std::string::npos) {
298         WLOGI("Processing 'stop::' command.");
299         StopRecvRealtime(spSocket);
300     } else if (recvStr.find("startRecord::") != std::string::npos) {
301         WLOGI("Processing 'startRecord::' command.");
302         StartRecvRecord(spSocket);
303     } else if (recvStr.find("stopRecord::") != std::string::npos) {
304         WLOGI("Processing 'stopRecord::' command.");
305         StopRecvRecord(spSocket);
306     } else if (recvStr.find("SP_daemon -editor") != std::string::npos) {
307         EditorRecv(recvStr, spSocket);
308     } else {
309         WLOGW("Received unknown command: %s", recvStr.c_str());
310     }
311 }
EditorRecv(std::string recvStr,const SpServerSocket & spSocket) const312 void SpThreadSocket::EditorRecv(std::string recvStr, const SpServerSocket &spSocket) const
313 {
314     std::vector<std::string> vec;
315     size_t size = recvStr.size();
316     size_t j = 0;
317     for (size_t i = 0; i < size; i++) {
318         if (recvStr[i] == ' ') {
319             vec.push_back(recvStr.substr(j, i - j));
320             j = i + 1;
321         }
322     }
323     vec.push_back(recvStr.substr(j, size - j));
324     const int type = 2;
325     if (vec[type] == "findAppPage") {
326         BackDesktop();
327     }
328     OHOS::SmartPerf::ControlCallCmd controlCallCmd;
329     std::string result = controlCallCmd.GetResult(vec);
330     spSocket.Send(result);
331 }
BackDesktop() const332 void SpThreadSocket::BackDesktop() const
333 {
334     std::string cmdResult;
335     std::string uinput = CMD_COMMAND_MAP.at(CmdCommand::UINPUT_BACK);
336     SPUtils::LoadCmd(uinput, cmdResult);
337 }
338 // UDP
HandleMsg(SpServerSocket & spSocket) const339 void SpThreadSocket::HandleMsg(SpServerSocket &spSocket) const
340 {
341     std::string retCode = "";
342     auto iterator = MESSAGE_MAP.begin();
343     while (iterator != MESSAGE_MAP.end()) {
344         std::string recvBuf = spSocket.RecvBuf();
345         if (recvBuf.size() != 0) {
346             Heartbeat &heartbeat = Heartbeat::GetInstance();
347             heartbeat.UpdatestartTime();
348         }
349         if (!SPUtils::IsSubString(recvBuf, iterator->second)) {
350             ++iterator;
351             continue;
352         }
353         LOGD("UDP recv : %s", recvBuf.c_str());
354         SpProfiler *profiler = SpProfilerFactory::GetProfilerItem(iterator->first);
355         if (profiler == nullptr) {
356             HandleNullMsg(spSocket, profiler, retCode, recvBuf, iterator);
357         } else {
358             std::map<std::string, std::string> data;
359             if (iterator->first == MessageType::CATCH_NETWORK_TRAFFIC) {
360                 Network::GetInstance().IsFindHap();
361                 profiler->ItemData(); // record the collection point for the first time,no need to return
362                 data["network_traffic"] = "true";
363             } else if (iterator->first == MessageType::GET_NETWORK_TRAFFIC) {
364                 Network::GetInstance().IsStopFindHap();
365                 data = profiler->ItemData();
366                 data["network_traffic"] = "true";
367             } else if (iterator->first == MessageType::GET_LOG) {
368                     data = GetLogProcess(profiler, recvBuf);
369             } else {
370                 GetProcessIdByPkgName(iterator);
371                 data = profiler->ItemData();
372             }
373             HandleUDPMsg(spSocket, data, retCode, iterator);
374         }
375         LOGD("sendData key(%d) content(%s)", iterator->first, retCode.c_str());
376         break;
377     }
378 }
379 
HandleUDPMsg(SpServerSocket & spSocket,std::map<std::string,std::string> data,std::string retCode,std::unordered_map<MessageType,std::string>::const_iterator iterator) const380 void SpThreadSocket::HandleUDPMsg(SpServerSocket &spSocket, std::map<std::string, std::string> data,
381     std::string retCode, std::unordered_map<MessageType, std::string>::const_iterator iterator) const
382 {
383     std::cout << "iterator->first: " << static_cast<int>(iterator->first) << std::endl;
384     if (iterator->first == MessageType::GET_CUR_FPS) {
385         ProfilerFPS::isLowCurFps = true;
386         std::string resultfps = "vfps||";
387         for (auto iter = data.cbegin(); iter != data.cend(); ++iter) {
388             if (iter->first != "fpsJitters") {
389                 std::string temp = iter->second + "@@";
390                 resultfps += std::string(temp.c_str());
391             }
392         }
393         spSocket.Sendto(resultfps);
394         LOGD("UDP send Cur_resultfps = %s", resultfps.c_str());
395     } else if (iterator->first == MessageType::GET_CPU_FREQ_LOAD) {
396         FetchCpuStats(spSocket, data);
397     } else if (iterator->first == MessageType::GET_LOG) {
398         if (GetLog::GetInstance().GetLogFileSocketPort() == -1) {
399             return;
400         }
401         int logSocket = -1;
402         int connectCount = 0;
403         const int maxTryCount = 2;
404 
405         while (logSocket < 0) {
406             WLOGI("Connect file log socket, try times: %d", connectCount + 1);
407             if (connectCount > maxTryCount) {
408                 WLOGE("Connect file log socket failed");
409                 return;
410             }
411             connectCount++;
412             logSocket = GetLog::GetInstance().LogFileSocketConnect();
413         }
414 
415         int ret = GetLog::GetInstance().SendLogFile();
416         if (ret < 0) {
417             return;
418         }
419     } else {
420         retCode = MapToString(data);
421         spSocket.Sendto(retCode);
422         LOGD("UDP send retCode = %s", retCode.c_str());
423     }
424 }
SocketHeartbeat() const425 void SpThreadSocket::SocketHeartbeat() const
426 {
427     Heartbeat &heartbeat = Heartbeat::GetInstance();
428     heartbeat.UpdatestartTime();
429 }
FetchCpuStats(SpServerSocket & spSocket,std::map<std::string,std::string> data) const430 void SpThreadSocket::FetchCpuStats(SpServerSocket &spSocket, std::map<std::string, std::string> data) const
431 {
432     std::string resultCpuFrequency = "";
433     std::string resultCpuUsage = "";
434     std::string resultCpu = "";
435     int cpuFrequencyNum = 0;
436     int cpuUsageNum = 0;
437     int cpuFlag = 1;
438     while (cpuFlag) {
439         resultCpuFrequency = "cpu" + std::to_string(cpuFrequencyNum) + "Frequency";
440         resultCpuUsage = "cpu" + std::to_string(cpuUsageNum) + "Usage";
441         auto iterCpuFrequency = data.find(resultCpuFrequency);
442         auto iterCpuUsage = data.find(resultCpuUsage);
443         if (iterCpuFrequency != data.end()) {
444             resultCpuFrequency += "||" + iterCpuFrequency->second;
445             resultCpu += "$$" + resultCpuFrequency;
446             cpuFrequencyNum++;
447         } else {
448             cpuFlag = 0;
449         }
450         if (iterCpuUsage != data.end()) {
451             resultCpuUsage += "||" + iterCpuUsage->second;
452             resultCpu += "$$" + resultCpuUsage;
453             cpuUsageNum++;
454         } else {
455             cpuFlag = 0;
456         }
457     }
458     spSocket.Sendto(resultCpu);
459     LOGD("UDP send resultCpu = %s", resultCpu.c_str());
460 }
HandleNullMsg(SpServerSocket & spSocket,SpProfiler * profiler,std::string retCode,std::string recvBuf,std::unordered_map<MessageType,std::string>::const_iterator iterator) const461 void SpThreadSocket::HandleNullMsg(SpServerSocket &spSocket, SpProfiler *profiler, std::string retCode,
462     std::string recvBuf, std::unordered_map<MessageType, std::string>::const_iterator iterator) const
463 {
464     if (iterator->first == MessageType::SET_PKG_NAME) {
465         if (recvBuf.find("smartperf") != std::string::npos) {
466             retCode = SplitMsg(recvBuf);
467             if (retCode.find("smartperf") != std::string::npos) {
468                 Dubai::dubaiPkgName = retCode;
469                 LOGD("UDP send dubaiPkgName: (%s)", Dubai::dubaiPkgName.c_str());
470             }
471         } else {
472             g_pkgName = SplitMsg(recvBuf);
473             LOGD("UDP recv g_pkgName (%s)", g_pkgName.c_str());
474         }
475         spSocket.Sendto(retCode);
476         LOGD("UDP send PkgName = %s", retCode.c_str());
477     } else if (profiler == nullptr && (iterator->first == MessageType::GET_APP_TYPE)) {
478         retCode = SplitMsg(recvBuf);
479         std::thread rStart([this, retCode]() { this->ResetValue(retCode); });
480         rStart.detach();
481     } else if (profiler == nullptr && (iterator->first == MessageType::GET_DAEMON_VERSION)) {
482         retCode = "Version: " + SPUtils::GetVersion();
483         spSocket.Sendto(retCode);
484     } else if (profiler == nullptr && (iterator->first == MessageType::SET_GAME_VIEW)) {
485         retCode = SplitMsg(recvBuf);
486         SpProfilerFactory::SetProfilerGameLayer(retCode);
487     } else if (iterator->first == MessageType::CATCH_TRACE_CONFIG ||
488         iterator->first == MessageType::CATCH_TRACE_CMD) {
489         SpProfilerFactory::SetByTrace(SplitMsg(recvBuf));
490     } else if (iterator->first == MessageType::GET_CPU_NUM) {
491         retCode = SPUtils::GetCpuNum();
492         spSocket.Sendto(retCode);
493         LOGD("UDP send cpuNum = %s", retCode.c_str());
494     } else if (iterator->first == MessageType::BACK_TO_DESKTOP) {
495         BackDesktop();
496     } else {
497         HandleNullAddMsg(spSocket, profiler, retCode, recvBuf, iterator);
498     }
499 }
500 
GetProcessIdByPkgName(std::unordered_map<MessageType,std::string>::const_iterator iterator) const501 void SpThreadSocket::GetProcessIdByPkgName(std::unordered_map<MessageType, std::string>::const_iterator iterator) const
502 {
503     if (iterator->first == MessageType::GET_FPS_AND_JITTERS || iterator->first == MessageType::GET_CUR_FPS ||
504         iterator->first == MessageType::GET_RAM_INFO) {
505         if (!SpProfilerFactory::editorFlag) {
506             LOGD("SpProfilerFactory::g_pkgName(%s)", g_pkgName.c_str());
507             std::string processId = "";
508             OHOS::SmartPerf::StartUpDelay sp;
509             processId = sp.GetPidByPkg(g_pkgName);
510             SpProfilerFactory::SetProfilerPidByPkg(processId);
511             SpProfilerFactory::SetProfilerPkg(g_pkgName);
512         }
513     }
514 }
515 
ResetValue(std::string retCode) const516 void SpThreadSocket::ResetValue(std::string retCode) const
517 {
518     ProfilerFPS &pfps = ProfilerFPS::GetInstance();
519     pfps.isGameApp = SPUtils::GetIsGameApp(retCode);
520     pfps.firstDump = true;
521     RAM &ram = RAM::GetInstance();
522     ram.SetHapFirstFlag();
523 }
HandleNullAddMsg(SpServerSocket & spSocket,SpProfiler * profiler,std::string retCode,std::string recvBuf,std::unordered_map<MessageType,std::string>::const_iterator iterator) const524 void SpThreadSocket::HandleNullAddMsg(SpServerSocket &spSocket, SpProfiler *profiler, std::string retCode,
525     std::string recvBuf, std::unordered_map<MessageType, std::string>::const_iterator iterator) const
526 {
527     Dubai &db = Dubai::GetInstance();
528     if (iterator->first == MessageType::START_DUBAI_DB) {
529         if (recvBuf.find("smartperf") != std::string::npos) {
530             retCode = SplitMsg(recvBuf);
531             if (retCode.find("smartperf") != std::string::npos) {
532                 db.dubaiPkgName = retCode;
533                 LOGD("UDP send dubaiPkgName: (%s)", db.dubaiPkgName.c_str());
534             }
535         }
536         std::thread dStart([&db]() { db.CallBeginAndFinish(); });
537         dStart.detach();
538     } else if (iterator->first == MessageType::SET_DUBAI_DB) {
539         db.CallBeginAndFinish();
540         db.isDumpDubaiFinish = true;
541         ProfilerFPS::isLowCurFps = false;
542         retCode = db.CallMoveDubaiDbFinished();
543         LOGD("UDP send GetDubaiDb Message: (%s)", retCode.c_str());
544         spSocket.Sendto(retCode);
545         LOGD("UDP send DuBai get finish");
546     } else if (iterator->first == MessageType::CHECK_UDP_STATUS) {
547         retCode = "UDP status is normal";
548         spSocket.Sendto(retCode);
549         LOGD("UDP status is normal");
550     } else {
551         retCode = iterator->second;
552         spSocket.Sendto(retCode);
553         LOGD("UDP sendData: (%s)", retCode.c_str());
554     }
555 }
556 
SocketErrorTypeToString(SocketErrorType errorType) const557 std::string SpThreadSocket::SocketErrorTypeToString(SocketErrorType errorType) const
558 {
559     switch (errorType) {
560         case SocketErrorType::OK:
561             return "OK";
562         case SocketErrorType::TOKEN_CHECK_FAILED:
563             return "TOKEN_CHECK_FAILED";
564         case SocketErrorType::INIT_FAILED:
565             return "INIT_FAILED";
566         case SocketErrorType::START_FAILED:
567             return "START_FAILED";
568         case SocketErrorType::STOP_FAILED:
569             return "STOP_FAILED";
570         case SocketErrorType::START_RECORD_FAILED:
571             return "START_RECORD_FAILED";
572         case SocketErrorType::STOP_RECORD_FAILED:
573             return "STOP_RECORD_FAILED";
574         default:
575             return "UNKNOWN";
576     }
577 }
GetLogProcess(SpProfiler * profilerItem,std::string buffer) const578 std::map<std::string, std::string> SpThreadSocket::GetLogProcess(SpProfiler *profilerItem, std::string buffer) const
579 {
580     if (buffer.find("::") != std::string::npos) {
581         int port = std::stoi(buffer.substr(buffer.find("::") + 2));
582         WLOGI("Get File log UDP message received, port is %d", port);
583         // Init log file socket and file process
584         GetLog::GetInstance().SetLogFileSocket(-1);
585         GetLog::GetInstance().SetLogFileSocketPort(port);
586         return profilerItem->ItemData();
587     } else {
588         WLOGE("Get File log UDP message received, but port is not found");
589         GetLog::GetInstance().SetLogFileSocketPort(-1);
590     }
591 
592     return std::map<std::string, std::string>();
593 }
594 }
595 }