• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2024-2025 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 #include "event_write_handler.h"
17 
18 #include "event_write_strategy_factory.h"
19 #include "hiview_logger.h"
20 
21 namespace OHOS {
22 namespace HiviewDFX {
23 DEFINE_LOG_TAG("HiView-EventExportFlow");
HandleRequest(RequestPtr req)24 bool EventWriteHandler::HandleRequest(RequestPtr req)
25 {
26     auto writeReq = BaseRequest::DownCastTo<EventWriteRequest>(req);
27     for (const auto& event : writeReq->events) {
28         if (event == nullptr) {
29             HIVIEW_LOGE("invalid event");
30             Rollback();
31             return false;
32         }
33         auto packager = GetEventPackager(event, writeReq);
34         if (packager == nullptr ||
35             !packager->AppendEvent(event->domain, event->name, event->eventStr)) {
36             HIVIEW_LOGE("failed to append event to event writer");
37             Rollback();
38             return false;
39         }
40     }
41     if (!writeReq->isQueryCompleted) {
42         return true;
43     }
44     for (const auto& packager : packagers_) {
45         if (packager.second == nullptr) {
46             continue;
47         }
48         if (!packager.second->Package()) {
49             HIVIEW_LOGE("failed to write export event");
50             Rollback();
51             return false;
52         }
53     }
54     Finish();
55     return true;
56 }
57 
GetEventPackager(const std::shared_ptr<CachedEvent> event,std::shared_ptr<EventWriteRequest> writeReq)58 std::shared_ptr<ExportEventPackager> EventWriteHandler::GetEventPackager(
59     const std::shared_ptr<CachedEvent> event, std::shared_ptr<EventWriteRequest> writeReq)
60 {
61     auto strategy = EventWriteStrategyFactory::GetWriteStrategy(StrategyType::ZIP_JSON_FILE);
62     if (strategy == nullptr) {
63         HIVIEW_LOGW("write strategy is null");
64         return nullptr;
65     }
66     std::string packagerKey = strategy->GetPackagerKey(event);
67     if (packagerKey.empty()) {
68         HIVIEW_LOGW("pacakger key is empty");
69         return nullptr;
70     }
71     auto iter = packagers_.find(packagerKey);
72     if (iter == packagers_.end()) {
73         HIVIEW_LOGI("create packager: [%{public}s][%{public}s][%{public}" PRId32 "]",
74             event->version.systemVersion.c_str(), event->version.patchVersion.c_str(), event->uid);
75         auto packager = std::make_shared<ExportEventPackager>(writeReq->moduleName, writeReq->exportDir,
76             event->version, event->uid, writeReq->maxSingleFileSize);
77             packagers_.emplace(packagerKey, packager);
78         return packager;
79     }
80     return iter->second;
81 }
82 
Finish()83 void EventWriteHandler::Finish()
84 {
85     for (const auto& packager : packagers_) {
86         if (packager.second == nullptr) {
87             continue;
88         }
89         packager.second->HandlePackagedFiles();
90     }
91 }
92 
Rollback()93 void EventWriteHandler::Rollback()
94 {
95     for (const auto& packager : packagers_) {
96         if (packager.second == nullptr) {
97             continue;
98         }
99         packager.second->ClearPackagedFiles();
100     }
101 }
102 } // HiviewDFX
103 } // OHOS
104