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