1 /* 2 * Copyright (C) 2021 Huawei Device Co., Ltd. 3 * Licensed under the Apache License, Version 2.0 (the "License"); 4 * you may not use this file except in compliance with the License. 5 * You may obtain a copy of the License at 6 * 7 * http://www.apache.org/licenses/LICENSE-2.0 8 * 9 * Unless required by applicable law or agreed to in writing, software 10 * distributed under the License is distributed on an "AS IS" BASIS, 11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 * See the License for the specific language governing permissions and 13 * limitations under the License. 14 */ 15 #ifndef SP_THREAD_SOCKET_H 16 #define SP_THREAD_SOCKET_H 17 #include "sp_server_socket.h" 18 #include "sp_task.h" 19 #include "ByTrace.h" 20 #include <thread> 21 #include "GpuCounter.h" 22 namespace OHOS { 23 namespace SmartPerf { 24 enum class SocketConnectType { 25 CMD_SOCKET, 26 EDITOR_SOCKET, 27 }; 28 29 enum class SocketErrorType { 30 OK, 31 TOKEN_CHECK_FAILED, 32 INIT_FAILED, 33 START_FAILED, 34 STOP_FAILED, 35 START_RECORD_FAILED, 36 STOP_RECORD_FAILED, 37 }; 38 class SpThreadSocket { 39 public: GetInstance()40 static SpThreadSocket &GetInstance() 41 { 42 static SpThreadSocket instance; 43 return instance; 44 } 45 46 std::string MapToString(std::map<std::string, std::string>& dataMap) const; 47 std::string SplitMsg(const std::string &recvBuf) const; 48 void Process(ProtoType type); 49 SocketErrorType CheckTcpToken(const std::string& recvStr, SpServerSocket &spSocket, 50 const std::string& recvStrNoToken) const; 51 SocketErrorType CheckUdpToken(const std::string& recvStr) const; 52 void TypeTcp(SpServerSocket &spSocket); 53 void InitRecv(const std::string& recvStr, SpServerSocket &spSocket, SocketConnectType type) const; 54 void StartRecv(SpServerSocket &spSocket); 55 void StartRecvRealtime(SpServerSocket &spSocket) const; 56 void StopRecvRealtime(SpServerSocket &spSocket); 57 void StartRecvRecord(SpServerSocket &spSocket) const; 58 void StopRecvRecord(SpServerSocket &spSocket) const; 59 void SendTokenFailedMessage(SpServerSocket &socket, const std::string &message) const; 60 void DealMsg(const std::string& recvStr, SpServerSocket &spSocket, SocketErrorType tokenStatus); 61 void EditorRecv(const std::string& recvStr, const SpServerSocket &spSocket) const; 62 void BackDesktop() const; 63 void HandleMsg(SpServerSocket &spSocket); 64 void HeartbeatDetection(const std::string& recvBuf); 65 void UdpStartInitFunc(const std::string& recvBuf, SpServerSocket &spSocket); 66 void HandleUDPMsg(SpServerSocket &spSocket, std::map<std::string, std::string>& data, std::string& retCode, 67 std::unordered_map<MessageType, std::string>::const_iterator iterator); 68 void SocketHeartbeat() const; 69 void FetchCpuStats(SpServerSocket &spSocket, std::map<std::string, std::string>& data) const; 70 void HandleNullMsg(SpServerSocket &spSocket, SpProfiler *profiler, std::string& retCode, 71 const std::string& recvBuf, std::unordered_map<MessageType, std::string>::const_iterator iterator); 72 void HandleNullAddMsg(SpServerSocket &spSocket, SpProfiler *profiler, std::string& retCode, 73 const std::string& recvBuf, std::unordered_map<MessageType, std::string>::const_iterator iterator); 74 void UdpStartMessProcess(SpServerSocket &spSocket, SpProfiler *profiler, std::string& retCode, 75 const std::string& recvBuf, std::unordered_map<MessageType, std::string>::const_iterator iterator); 76 std::string SocketErrorTypeToString(SocketErrorType errorType) const; 77 void GetSocketPort(const std::string& buffer); 78 void ResetValue(std::string retCode) const; 79 void GetProcessIdByPkgName(std::unordered_map<MessageType, std::string>::const_iterator iterator); 80 std::string SpGetPkg(const std::string &spMsg) const; 81 std::string SpGetPid(const std::string &spMsg) const; 82 bool IsPreset(const std::string &spMsg) const; 83 void SetToken(const std::string& token); 84 std::string GetToken() const; 85 void SetNeedUdpToken(bool isNeed); 86 void ConnectAndSendFile(SpServerSocket &spSocket, const std::string filePath); 87 int FileSocketConnect(); 88 int SendFile(const std::string& filePath); 89 void StartHapCollecting(SpServerSocket &spSocket); 90 void RemoveToken(std::string &recvMessage); 91 void HandleMsgTrace(std::string& recvMessage); 92 private: 93 bool flagRunning = false; 94 bool socketConnect = true; 95 std::string checkToken = ""; // 拉起测试时校验 96 bool isNeedUdpToken = true; // 如果是hdc shell拉起,不需要校验token以兼容旧版本 97 GpuCounter &gpuCounter = GpuCounter::GetInstance(); 98 const std::string traceOriginPath = "/data/log/hiview/unified_collection/trace/special/"; 99 const std::string indexFilePath = "/data/local/tmp/smartperf/1/t_index_info.csv"; 100 const std::string gpuCounterfilePath = "/data/local/tmp/smartperfDevice"; 101 const std::string dubaiXpower = "/data/service/el2/100/xpower/dubai.db"; 102 const std::string dubaiFilePath = "/data/local/tmp/dubai/dubai.db"; 103 std::string tracefilePath = ""; 104 const std::string logFilePath = "/data/local/tmp/spdaemonlog/logfile.tar.gz"; 105 int sendFileSocket = -1; 106 int sendFileSocketPort = -1; 107 static const int fileSocketBufferSize = 8192; 108 char fileSocketBuffer[fileSocketBufferSize] = {}; 109 bool isSetPid = false; 110 SPTask &spTask = SPTask::GetInstance(); 111 std::thread udpStartCollect; 112 ~SpThreadSocket()113 ~SpThreadSocket() 114 { 115 if (udpStartCollect.joinable()) { 116 udpStartCollect.join(); 117 } 118 } 119 std::shared_ptr<TaskManager> taskMgr_ {nullptr}; 120 ByTrace &bytrace = ByTrace::GetInstance(); 121 bool firstFlag = true; 122 }; 123 } 124 } 125 #endif