• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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