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 }