• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2022-2022 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 
16 #define LOG_TAG "HiViewAdapter"
17 
18 #include "hiview_adapter.h"
19 
20 #include <unistd.h>
21 
22 #include <thread>
23 #include <algorithm>
24 #include "def.h"
25 #include "pasteboard_hilog.h"
26 
27 namespace OHOS {
28 using namespace HiviewDFX;
29 namespace MiscServices {
30 namespace {
31 const std::map<int, std::string> EVENT_COVERT_TABLE = {
32     { DfxCodeConstant::PASTEBOARD_FAULT, "PASTEBOARD_FAULT" },
33     { DfxCodeConstant::TIME_CONSUMING_STATISTIC, "TIME_CONSUMING_STATISTIC" },
34     { DfxCodeConstant::PASTEBOARD_BEHAVIOUR, "PASTEBOARD_BEHAVIOUR" },
35 };
36 const std::string DOMAIN_STR = std::string(HiviewDFX::HiSysEvent::Domain::PASTEBOARD);
37 } // namespace
38 
39 bool HiViewAdapter::running_ = false;
40 std::mutex HiViewAdapter::runMutex_;
41 std::mutex HiViewAdapter::timeConsumingMutex_;
42 std::mutex HiViewAdapter::behaviourMutex_;
43 std::vector<std::map<int, int>> HiViewAdapter::copyTimeConsumingStat_;
44 std::vector<std::map<int, int>> HiViewAdapter::pasteTimeConsumingStat_;
45 std::vector<std::map<int, int>> HiViewAdapter::remotePasteTimeConsumingStat_;
46 
47 std::map<std::string, int> HiViewAdapter::copyPasteboardBehaviour_;
48 std::map<std::string, int> HiViewAdapter::pastePasteboardBehaviour_;
49 std::map<std::string, int> HiViewAdapter::remotePastePasteboardBehaviour_;
50 
51 std::map<int, int> HiViewAdapter::dataMap_ = HiViewAdapter::InitDataMap();
52 std::map<int, int> HiViewAdapter::timeMap_ = HiViewAdapter::InitTimeMap();
53 
InitDataMap()54 std::map<int, int> HiViewAdapter::InitDataMap()
55 {
56     std::map<int, int> dataMap;
57     dataMap.insert(std::pair<int, int>(
58         static_cast<int>(DataRange::DR_ZERO_TO_HUNDRED_KB), static_cast<int>(DataConsumingLevel::DATA_LEVEL_ONE)));
59     dataMap.insert(std::pair<int, int>(static_cast<int>(DataRange::DR_HUNDRED_TO_FIVE_HUNDREDS_KB),
60         static_cast<int>(DataConsumingLevel::DATA_LEVEL_TWO)));
61     dataMap.insert(std::pair<int, int>(static_cast<int>(DataRange::DR_FIVE_HUNDREDS_TO_THOUSAND_KB),
62         static_cast<int>(DataConsumingLevel::DATA_LEVEL_THREE)));
63     dataMap.insert(std::pair<int, int>(
64         static_cast<int>(DataRange::DR_ONE_TO_FIVE_MB), static_cast<int>(DataConsumingLevel::DATA_LEVEL_FOUR)));
65     dataMap.insert(std::pair<int, int>(
66         static_cast<int>(DataRange::DR_FIVE_TO_TEN_MB), static_cast<int>(DataConsumingLevel::DATA_LEVEL_FIVE)));
67     dataMap.insert(std::pair<int, int>(
68         static_cast<int>(DataRange::DR_TEN_TO_FIFTY_MB), static_cast<int>(DataConsumingLevel::DATA_LEVEL_SIX)));
69     dataMap.insert(std::pair<int, int>(
70         static_cast<int>(DataRange::DR_OVER_FIFTY_MB), static_cast<int>(DataConsumingLevel::DATA_LEVEL_SEVEN)));
71     return dataMap;
72 }
73 
InitTimeMap()74 std::map<int, int> HiViewAdapter::InitTimeMap()
75 {
76     std::map<int, int> timeMap;
77     timeMap.insert(std::pair<int, int>(static_cast<int>(TimeConsumingStatistic::TCS_TIME_CONSUMING_LEVEL_ONE),
78         static_cast<int>(TimeConsumingLevel::TIME_LEVEL_ONE)));
79     timeMap.insert(std::pair<int, int>(static_cast<int>(TimeConsumingStatistic::TCS_TIME_CONSUMING_LEVEL_TWO),
80         static_cast<int>(TimeConsumingLevel::TIME_LEVEL_TWO)));
81     timeMap.insert(std::pair<int, int>(static_cast<int>(TimeConsumingStatistic::TCS_TIME_CONSUMING_LEVEL_THREE),
82         static_cast<int>(TimeConsumingLevel::TIME_LEVEL_THREE)));
83     timeMap.insert(std::pair<int, int>(static_cast<int>(TimeConsumingStatistic::TCS_TIME_CONSUMING_LEVEL_FOUR),
84         static_cast<int>(TimeConsumingLevel::TIME_LEVEL_FOUR)));
85     timeMap.insert(std::pair<int, int>(static_cast<int>(TimeConsumingStatistic::TCS_TIME_CONSUMING_LEVEL_FIVE),
86         static_cast<int>(TimeConsumingLevel::TIME_LEVEL_FIVE)));
87     timeMap.insert(std::pair<int, int>(static_cast<int>(TimeConsumingStatistic::TCS_TIME_CONSUMING_LEVEL_SIX),
88         static_cast<int>(TimeConsumingLevel::TIME_LEVEL_SIX)));
89     timeMap.insert(std::pair<int, int>(static_cast<int>(TimeConsumingStatistic::TCS_TIME_CONSUMING_LEVEL_SEVEN),
90         static_cast<int>(TimeConsumingLevel::TIME_LEVEL_SEVEN)));
91     timeMap.insert(std::pair<int, int>(static_cast<int>(TimeConsumingStatistic::TCS_TIME_CONSUMING_LEVEL_EIGHT),
92         static_cast<int>(TimeConsumingLevel::TIME_LEVEL_EIGHT)));
93     timeMap.insert(std::pair<int, int>(static_cast<int>(TimeConsumingStatistic::TCS_TIME_CONSUMING_LEVEL_NINE),
94         static_cast<int>(TimeConsumingLevel::TIME_LEVEL_NINE)));
95     timeMap.insert(std::pair<int, int>(static_cast<int>(TimeConsumingStatistic::TCS_TIME_CONSUMING_LEVEL_TEN),
96         static_cast<int>(TimeConsumingLevel::TIME_LEVEL_TEN)));
97     timeMap.insert(std::pair<int, int>(static_cast<int>(TimeConsumingStatistic::TCS_TIME_CONSUMING_LEVEL_ELEVEN),
98         static_cast<int>(TimeConsumingLevel::TIME_LEVEL_ELEVEN)));
99     return timeMap;
100 }
101 
ReportPasteboardFault(int dfxCode,const PasteboardFaultMsg & msg)102 void HiViewAdapter::ReportPasteboardFault(int dfxCode, const PasteboardFaultMsg &msg)
103 {
104     constexpr const char *USER_ID = "USER_ID";
105     constexpr const char *ERROR_TYPE = "ERROR_TYPE";
106     int ret = HiSysEvent::Write(DOMAIN_STR, CoverEventID(dfxCode), HiSysEvent::EventType::FAULT, USER_ID, msg.userId,
107         ERROR_TYPE, msg.errorCode);
108     if (ret != 0) {
109         PASTEBOARD_HILOGD(
110             PASTEBOARD_MODULE_SERVICE, "hisysevent write failed! ret %{public}d. errCode %{public}d", ret, dfxCode);
111     }
112 }
113 
InitializeTimeConsuming(int initFlag)114 void HiViewAdapter::InitializeTimeConsuming(int initFlag)
115 {
116     constexpr const int DATA_LEVEL_NUMBERS = 7;
117     std::map<int, int> initTimeConsuming;
118     initTimeConsuming.insert(std::pair<int, int>(static_cast<int>(TimeConsumingLevel::TIME_LEVEL_ONE), 0));
119     initTimeConsuming.insert(std::pair<int, int>(static_cast<int>(TimeConsumingLevel::TIME_LEVEL_TWO), 0));
120     initTimeConsuming.insert(std::pair<int, int>(static_cast<int>(TimeConsumingLevel::TIME_LEVEL_THREE), 0));
121     initTimeConsuming.insert(std::pair<int, int>(static_cast<int>(TimeConsumingLevel::TIME_LEVEL_FOUR), 0));
122     initTimeConsuming.insert(std::pair<int, int>(static_cast<int>(TimeConsumingLevel::TIME_LEVEL_FIVE), 0));
123     initTimeConsuming.insert(std::pair<int, int>(static_cast<int>(TimeConsumingLevel::TIME_LEVEL_SIX), 0));
124     initTimeConsuming.insert(std::pair<int, int>(static_cast<int>(TimeConsumingLevel::TIME_LEVEL_SEVEN), 0));
125     initTimeConsuming.insert(std::pair<int, int>(static_cast<int>(TimeConsumingLevel::TIME_LEVEL_EIGHT), 0));
126     initTimeConsuming.insert(std::pair<int, int>(static_cast<int>(TimeConsumingLevel::TIME_LEVEL_NINE), 0));
127     initTimeConsuming.insert(std::pair<int, int>(static_cast<int>(TimeConsumingLevel::TIME_LEVEL_TEN), 0));
128     initTimeConsuming.insert(std::pair<int, int>(static_cast<int>(TimeConsumingLevel::TIME_LEVEL_ELEVEN), 0));
129 
130     if (initFlag == INIT_COPY_TIME_SONSUMING) {
131         for (int i = 0; i < DATA_LEVEL_NUMBERS; ++i) {
132             copyTimeConsumingStat_.push_back(initTimeConsuming);
133             PASTEBOARD_HILOGD(PASTEBOARD_MODULE_SERVICE, "copyTimeConsumingStat_.push_back");
134         }
135     } else if (initFlag == INIT_PASTE_TIME_SONSUMING) {
136         for (int i = 0; i < DATA_LEVEL_NUMBERS; ++i) {
137             pasteTimeConsumingStat_.push_back(initTimeConsuming);
138             PASTEBOARD_HILOGD(PASTEBOARD_MODULE_SERVICE, "pasteTimeConsumingStat_.push_back");
139         }
140     } else {
141         for (int i = 0; i < DATA_LEVEL_NUMBERS; ++i) {
142             remotePasteTimeConsumingStat_.push_back(initTimeConsuming);
143             PASTEBOARD_HILOGD(PASTEBOARD_MODULE_SERVICE, "remotePasteTimeConsumingStat_.push_back");
144         }
145     }
146 }
147 
ReportTimeConsumingStatistic(const TimeConsumingStat & stat)148 void HiViewAdapter::ReportTimeConsumingStatistic(const TimeConsumingStat &stat)
149 {
150     std::lock_guard<std::mutex> lock(timeConsumingMutex_);
151     if (copyTimeConsumingStat_.empty()) {
152         InitializeTimeConsuming(INIT_COPY_TIME_SONSUMING);
153     }
154     if (pasteTimeConsumingStat_.empty()) {
155         InitializeTimeConsuming(INIT_PASTE_TIME_SONSUMING);
156     }
157     if (remotePasteTimeConsumingStat_.empty()) {
158         InitializeTimeConsuming(INIT_REMOTE_PASTE_TIME_SONSUMING);
159     }
160 
161     if (stat.pasteboardState == static_cast<int>(StatisticPasteboardState::SPS_COPY_STATE)) {
162         PASTEBOARD_HILOGD(PASTEBOARD_MODULE_SERVICE, "hisysevent pasteboard state is %{public}d", stat.pasteboardState);
163         auto iter = dataMap_.find(stat.dataSize);
164         if (iter != dataMap_.end()) {
165             CopyTimeConsuming(stat, iter->second);
166         } else {
167             PASTEBOARD_HILOGD(PASTEBOARD_MODULE_SERVICE, "wrong data level");
168         }
169     } else if ((stat.pasteboardState == static_cast<int>(StatisticPasteboardState::SPS_PASTE_STATE)) ||
170                (stat.pasteboardState == static_cast<int>(StatisticPasteboardState::SPS_REMOTE_PASTE_STATE))) {
171         PASTEBOARD_HILOGD(PASTEBOARD_MODULE_SERVICE, "hisysevent pasteboard state is %{public}d", stat.pasteboardState);
172         auto iter = dataMap_.find(stat.dataSize);
173         if (iter != dataMap_.end()) {
174             PasteTimeConsuming(stat, iter->second);
175         } else {
176             PASTEBOARD_HILOGD(PASTEBOARD_MODULE_SERVICE, "wrong data level");
177         }
178     } else {
179         PASTEBOARD_HILOGD(
180             PASTEBOARD_MODULE_SERVICE, "hisysevent wrong pasteboard state! errCode %{public}d", stat.pasteboardState);
181     }
182 }
183 
CopyTimeConsumingCount(int dataLevel,int timeLevel)184 void HiViewAdapter::CopyTimeConsumingCount(int dataLevel, int timeLevel)
185 {
186     if (static_cast<int>(copyTimeConsumingStat_.size()) <= dataLevel) {
187         return;
188     }
189     auto it = copyTimeConsumingStat_[dataLevel].find(timeLevel);
190     if (it != copyTimeConsumingStat_[dataLevel].end()) {
191         (it->second)++;
192     } else {
193         PASTEBOARD_HILOGD(
194             PASTEBOARD_MODULE_SERVICE, "hisysevent wrong copy time level, tiem level:  %{public}d", timeLevel);
195     }
196 }
197 
PasteTimeConsumingCount(int dataLevel,int timeLevel)198 void HiViewAdapter::PasteTimeConsumingCount(int dataLevel, int timeLevel)
199 {
200     if (static_cast<int>(pasteTimeConsumingStat_.size()) <= dataLevel) {
201         return;
202     }
203     auto it = pasteTimeConsumingStat_[dataLevel].find(timeLevel);
204     if (it != pasteTimeConsumingStat_[dataLevel].end()) {
205         (it->second)++;
206     } else {
207         PASTEBOARD_HILOGD(
208             PASTEBOARD_MODULE_SERVICE, "hisysevent wrong copy time level, tiem level:  %{public}d", timeLevel);
209     }
210 }
211 
RemotePasteTimeConsumingCount(int dataLevel,int timeLevel)212 void HiViewAdapter::RemotePasteTimeConsumingCount(int dataLevel, int timeLevel)
213 {
214     if (static_cast<int>(remotePasteTimeConsumingStat_.size()) <= dataLevel) {
215         return;
216     }
217     auto it = remotePasteTimeConsumingStat_[dataLevel].find(timeLevel);
218     if (it != remotePasteTimeConsumingStat_[dataLevel].end()) {
219         (it->second)++;
220     } else {
221         PASTEBOARD_HILOGD(
222             PASTEBOARD_MODULE_SERVICE, "hisysevent wrong copy time level, tiem level:  %{public}d", timeLevel);
223     }
224 }
225 
CopyTimeConsuming(const TimeConsumingStat & stat,int level)226 void HiViewAdapter::CopyTimeConsuming(const TimeConsumingStat &stat, int level)
227 {
228     auto iter = timeMap_.find(stat.timeConsuming);
229     if (iter != timeMap_.end()) {
230         CopyTimeConsumingCount(level, iter->second);
231     } else {
232         PASTEBOARD_HILOGD(PASTEBOARD_MODULE_SERVICE, "wrong time level");
233     }
234 }
235 
PasteTimeConsuming(const TimeConsumingStat & stat,int level)236 void HiViewAdapter::PasteTimeConsuming(const TimeConsumingStat &stat, int level)
237 {
238     auto iter = timeMap_.find(stat.timeConsuming);
239     if (iter != timeMap_.end()) {
240         if (stat.pasteboardState == SPS_PASTE_STATE) {
241             PasteTimeConsumingCount(level, iter->second);
242         } else {
243             RemotePasteTimeConsumingCount(level, iter->second);
244         }
245     } else {
246         PASTEBOARD_HILOGD(PASTEBOARD_MODULE_SERVICE, "wrong time level");
247     }
248 }
249 
ReportPasteboardBehaviour(const PasteboardBehaviourMsg & msg)250 void HiViewAdapter::ReportPasteboardBehaviour(const PasteboardBehaviourMsg &msg)
251 {
252     std::lock_guard<std::mutex> lock(behaviourMutex_);
253 
254     if (msg.pasteboardState == static_cast<int>(BehaviourPasteboardState::BPS_COPY_STATE)) {
255         auto it = copyPasteboardBehaviour_.find(msg.bundleName);
256         if (it != copyPasteboardBehaviour_.end()) {
257             (it->second)++;
258         } else {
259             copyPasteboardBehaviour_.insert(std::pair<std::string, int>(msg.bundleName, 1));
260         }
261     } else if (msg.pasteboardState == static_cast<int>(BehaviourPasteboardState::BPS_PASTE_STATE)) {
262         auto it = pastePasteboardBehaviour_.find(msg.bundleName);
263         if (it != pastePasteboardBehaviour_.end()) {
264             (it->second)++;
265         } else {
266             pastePasteboardBehaviour_.insert(std::pair<std::string, int>(msg.bundleName, 1));
267         }
268     } else if (msg.pasteboardState == static_cast<int>(BehaviourPasteboardState::BPS_REMOTE_PASTE_STATE)) {
269         auto it = remotePastePasteboardBehaviour_.find(msg.bundleName);
270         if (it != remotePastePasteboardBehaviour_.end()) {
271             (it->second)++;
272         } else {
273             remotePastePasteboardBehaviour_.insert(std::pair<std::string, int>(msg.bundleName, 1));
274         }
275     } else {
276         PASTEBOARD_HILOGD(
277             PASTEBOARD_MODULE_SERVICE, "hisysevent wrong pasteboard state! errCode %{public}d", msg.pasteboardState);
278     }
279 }
280 
GetDataLevel(int dataLevel)281 const char *HiViewAdapter::GetDataLevel(int dataLevel)
282 {
283     constexpr const char *WRONG_LEVEL = "WRONG_LEVEL";
284     switch (dataLevel) {
285         case static_cast<int>(DataConsumingLevel::DATA_LEVEL_ONE): {
286             return ZERO_TO_HUNDRED_KB;
287         }
288         case static_cast<int>(DataConsumingLevel::DATA_LEVEL_TWO): {
289             return HUNDRED_TO_FIVE_HUNDREDS_KB;
290         }
291         case static_cast<int>(DataConsumingLevel::DATA_LEVEL_THREE): {
292             return FIVE_HUNDREDS_TO_THOUSAND_KB;
293         }
294         case static_cast<int>(DataConsumingLevel::DATA_LEVEL_FOUR): {
295             return ONE_TO_FIVE_MB;
296         }
297         case static_cast<int>(DataConsumingLevel::DATA_LEVEL_FIVE): {
298             return FIVE_TO_TEN_MB;
299         }
300         case static_cast<int>(DataConsumingLevel::DATA_LEVEL_SIX): {
301             return TEN_TO_FIFTY_MB;
302         }
303         case static_cast<int>(DataConsumingLevel::DATA_LEVEL_SEVEN): {
304             return OVER_FIFTY_MB;
305         }
306         default: {
307             return WRONG_LEVEL;
308         }
309     }
310 }
311 
InvokeTimeConsuming()312 void HiViewAdapter::InvokeTimeConsuming()
313 {
314     std::lock_guard<std::mutex> lock(timeConsumingMutex_);
315     ReportStatisticEvent(copyTimeConsumingStat_, COPY_STATE);
316     copyTimeConsumingStat_.clear();
317     ReportStatisticEvent(pasteTimeConsumingStat_, PASTE_STATE);
318     pasteTimeConsumingStat_.clear();
319     ReportStatisticEvent(remotePasteTimeConsumingStat_, REMOTE_PASTE_STATE);
320     remotePasteTimeConsumingStat_.clear();
321 }
322 
ReportStatisticEvent(const std::vector<std::map<int,int>> & timeConsumingStat,const std::string & pasteboardState)323 void HiViewAdapter::ReportStatisticEvent(
324     const std::vector<std::map<int, int>> &timeConsumingStat, const std::string &pasteboardState)
325 {
326     if (timeConsumingStat.empty()) {
327         PASTEBOARD_HILOGD(PASTEBOARD_MODULE_SERVICE, "hisysevent timeConsumingStat is empty.");
328         return;
329     }
330     for (std::int32_t i = 0; i < static_cast<int>(timeConsumingStat.size()); ++i) {
331         std::string buffMsg = ": [";
332         for (std::int32_t j = TimeConsumingLevel::TIME_LEVEL_ONE; j <= TimeConsumingLevel::TIME_LEVEL_ELEVEN; ++j) {
333             buffMsg = buffMsg + std::to_string(timeConsumingStat[i].at(j)) + ",";
334         }
335         buffMsg += "]";
336 
337         int ret = -1;
338         if (pasteboardState == REMOTE_PASTE_STATE) {
339             std::string netType = "WIFI";
340             ret = HiSysEvent::Write(DOMAIN_STR, CoverEventID(DfxCodeConstant::TIME_CONSUMING_STATISTIC),
341                 HiSysEvent::EventType::STATISTIC, PASTEBOARD_STATE, pasteboardState, NET_TYPE, netType, DATA_LEVEL,
342                 GetDataLevel(i), CONSUMING_DATA, buffMsg);
343         } else {
344             ret = HiSysEvent::Write(DOMAIN_STR, CoverEventID(DfxCodeConstant::TIME_CONSUMING_STATISTIC),
345                 HiSysEvent::EventType::STATISTIC, PASTEBOARD_STATE, pasteboardState, DATA_LEVEL, GetDataLevel(i),
346                 CONSUMING_DATA, buffMsg);
347         }
348 
349         if (ret != HiviewDFX::SUCCESS) {
350             PASTEBOARD_HILOGD(
351                 PASTEBOARD_MODULE_SERVICE, "hisysevent write failed! ret = %{public}d, i = %{public}d.", ret, i);
352         }
353     }
354 }
355 
ReportBehaviour(std::map<std::string,int> & behaviour,const char * pasteboardState)356 void HiViewAdapter::ReportBehaviour(std::map<std::string, int> &behaviour, const char *pasteboardState)
357 {
358     PASTEBOARD_HILOGD(PASTEBOARD_MODULE_SERVICE, "ReportBehaviour  enter");
359     if (!behaviour.empty()) {
360         std::vector<std::pair<std::string, int>> vec;
361         constexpr const int TOTAL_APP_NUMBERS = 10;
362 
363         for (auto it = behaviour.begin(); it != behaviour.end(); ++it) {
364             vec.push_back(std::pair<std::string, int>(it->first, it->second));
365         }
366 // sort
367         sort(vec.begin(), vec.end(), [](std::pair<std::string, int>a, std::pair<std::string, int>b) {
368             return a.second > b.second;
369         });
370 
371 // init container for report.
372         std::vector<std::string> appPackName;
373         for (int i = 0; i < TOTAL_APP_NUMBERS; ++i) {
374             appPackName.push_back("default");
375         }
376 
377 // push in container.
378         int j = 0;
379         for (auto iter = vec.begin(); iter != vec.end(); ++iter) {
380             appPackName[j] = iter->first + " :" + std::to_string(iter->second);
381             ++j;
382         }
383         PASTEBOARD_HILOGD(PASTEBOARD_MODULE_SERVICE, "ReportBehaviour report  ");
384         int ret = HiSysEvent::Write(DOMAIN_STR, CoverEventID(DfxCodeConstant::PASTEBOARD_BEHAVIOUR),
385             HiSysEvent::EventType::BEHAVIOR,
386             PASTEBOARD_STATE, pasteboardState,
387             TOP_ONE_APP, appPackName[0],
388             TOP_TOW_APP, appPackName[1],
389             TOP_THREE_APP, appPackName[2],
390             TOP_FOUR_APP, appPackName[3],
391             TOP_FIVE_APP, appPackName[4],
392             TOP_SIX_APP, appPackName[5],
393             TOP_SEVEN_APP, appPackName[6],
394             TOP_EIGHT_APP, appPackName[7],
395             TOP_NINE_APP, appPackName[8],
396             TOP_TEN_APP, appPackName[9]);
397         if (ret != HiviewDFX::SUCCESS) {
398             PASTEBOARD_HILOGD(PASTEBOARD_MODULE_SERVICE, "hisysevent write failed! ret %{public}d.", ret);
399         }
400     } else {
401         PASTEBOARD_HILOGD(PASTEBOARD_MODULE_SERVICE, "behaviour is empty!");
402     }
403     PASTEBOARD_HILOGD(PASTEBOARD_MODULE_SERVICE, "ReportBehaviour end");
404 }
405 
InvokePasteBoardBehaviour()406 void HiViewAdapter::InvokePasteBoardBehaviour()
407 {
408     std::lock_guard<std::mutex> lock(behaviourMutex_);
409     if (!copyPasteboardBehaviour_.empty()) {
410         ReportBehaviour(copyPasteboardBehaviour_, COPY_STATE);
411         copyPasteboardBehaviour_.clear();
412     } else {
413         PASTEBOARD_HILOGD(PASTEBOARD_MODULE_SERVICE, "InvokePasteBoardBehaviour :copyPasteboardBehaviour_ is empty ");
414     }
415     if (!pastePasteboardBehaviour_.empty()) {
416         ReportBehaviour(pastePasteboardBehaviour_, PASTE_STATE);
417         pastePasteboardBehaviour_.clear();
418     } else {
419         PASTEBOARD_HILOGD(PASTEBOARD_MODULE_SERVICE, "InvokePasteBoardBehaviour :pastePasteboardBehaviour_ is empty ");
420     }
421     if (!remotePastePasteboardBehaviour_.empty()) {
422         ReportBehaviour(remotePastePasteboardBehaviour_, REMOTE_PASTE_STATE);
423         remotePastePasteboardBehaviour_.clear();
424     } else {
425         PASTEBOARD_HILOGD(PASTEBOARD_MODULE_SERVICE, "remotePastePasteboardBehaviour_ is empty ");
426     }
427 }
428 
StartTimerThread()429 void HiViewAdapter::StartTimerThread()
430 {
431     PASTEBOARD_HILOGD(PASTEBOARD_MODULE_SERVICE, "StartTimerThread enter");
432     std::lock_guard<std::mutex> lock(runMutex_);
433     if (running_) {
434         return;
435     }
436     running_ = true;
437     auto fun = []() {
438         while (true) {
439             PASTEBOARD_HILOGD(PASTEBOARD_MODULE_SERVICE, "StartTimerThread while");
440             time_t current = time(nullptr);
441             if (current == -1) {
442                 sleep(ONE_HOUR_IN_SECONDS);
443                 continue;
444             }
445 
446             tm localTime = { 0 };
447             tm *result = localtime_r(&current, &localTime);
448             if (result == nullptr) {
449                 sleep(ONE_HOUR_IN_SECONDS);
450                 continue;
451             }
452             int currentHour = localTime.tm_hour;
453             int currentMin = localTime.tm_min;
454             PASTEBOARD_HILOGD(PASTEBOARD_MODULE_SERVICE, "StartTimerThread get");
455             if ((EXEC_MIN_TIME - currentMin) != EXEC_MIN_TIME) {
456                 int nHours = EXEC_HOUR_TIME - currentHour;
457                 int nMin = EXEC_MIN_TIME - currentMin;
458                 int nTime = (nMin) * ONE_MINUTE_IN_SECONDS + (nHours) * ONE_HOUR_IN_SECONDS;
459                 PASTEBOARD_HILOGD(PASTEBOARD_MODULE_SERVICE,
460                     " StartTimerThread if needHours=%{public}d,needMin=%{public}d,needTime=%{public}d", nHours,
461                     nMin, nTime);
462                 sleep(nTime);
463                 PASTEBOARD_HILOGD(PASTEBOARD_MODULE_SERVICE, "StartTimerThread invoke");
464                 InvokePasteBoardBehaviour();
465                 InvokeTimeConsuming();
466             } else {
467                 PASTEBOARD_HILOGD(PASTEBOARD_MODULE_SERVICE, "StartTimerThread sleep");
468                 sleep(ONE_HOUR_IN_SECONDS * (ONE_DAY_IN_HOURS - currentHour));
469                 current = time(nullptr);
470                 InvokePasteBoardBehaviour();
471                 InvokeTimeConsuming();
472             }
473                 PASTEBOARD_HILOGD(PASTEBOARD_MODULE_SERVICE, "StartTimerThread end");
474         }
475     };
476     std::thread th = std::thread(fun);
477     th.detach();
478 }
479 
CoverEventID(int dfxCode)480 std::string HiViewAdapter::CoverEventID(int dfxCode)
481 {
482     std::string sysEventID = "";
483     auto operatorIter = EVENT_COVERT_TABLE.find(dfxCode);
484     if (operatorIter != EVENT_COVERT_TABLE.end()) {
485         sysEventID = operatorIter->second;
486     }
487     return sysEventID;
488 }
489 } // namespace MiscServices
490 } // namespace OHOS
491