1 /*
2 * Copyright (c) 2020 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 "ability_connect_mission.h"
17
18 #include <string.h>
19
20 #include "util/abilityms_log.h"
21
22 namespace OHOS {
~AbilityConnectMission()23 AbilityConnectMission::~AbilityConnectMission()
24 {
25 for (auto iterator = serviceRecords_.begin(); iterator != serviceRecords_.end(); ++iterator) {
26 auto record = *iterator;
27 delete record;
28 }
29 serviceRecords_.clear();
30 PRINTD("AbilityConnectMission", "Constructor");
31 }
32
PushServiceRecord(PageAbilityRecord & abilityRecord)33 void AbilityConnectMission::PushServiceRecord(PageAbilityRecord &abilityRecord)
34 {
35 serviceRecords_.emplace_back(&abilityRecord);
36 }
37
FindServiceRecord(uint64_t token) const38 PageAbilityRecord *AbilityConnectMission::FindServiceRecord(uint64_t token) const
39 {
40 for (const auto record : serviceRecords_) {
41 if (record != nullptr && record->GetToken() == token) {
42 return record;
43 }
44 }
45 return nullptr;
46 }
47
FindServiceRecord(const char * bundleName,const char * abilityName) const48 PageAbilityRecord *AbilityConnectMission::FindServiceRecord(const char *bundleName, const char *abilityName) const
49 {
50 CHECK_NULLPTR_RETURN_PTR(bundleName, "AbilityConnectMission", "invalid argument");
51 CHECK_NULLPTR_RETURN_PTR(abilityName, "AbilityConnectMission", "invalid argument");
52 for (const auto record : serviceRecords_) {
53 if (record != nullptr) {
54 const char *recordBundleName = record->GetAbilityInfo().bundleName;
55 const char *recordAbilityName = record->GetAbilityInfo().name;
56 if (recordBundleName == nullptr || recordAbilityName == nullptr) {
57 continue;
58 }
59 if (strcmp(recordBundleName, bundleName) == 0 && strcmp(recordAbilityName, abilityName) == 0) {
60 return record;
61 }
62 }
63 }
64 return nullptr;
65 }
66
FindServiceRecord(const SvcIdentity & connectSid,uint64_t abilityToken) const67 PageAbilityRecord *AbilityConnectMission::FindServiceRecord(const SvcIdentity &connectSid, uint64_t abilityToken) const
68 {
69 for (const auto record : serviceRecords_) {
70 if (record != nullptr && record->GetConnectRecord(connectSid, abilityToken) != nullptr) {
71 return record;
72 }
73 }
74 return nullptr;
75 }
76
RemoveServiceRecord(uint64_t token)77 void AbilityConnectMission::RemoveServiceRecord(uint64_t token)
78 {
79 for (auto iterator = serviceRecords_.begin(); iterator != serviceRecords_.end();) {
80 auto record = *iterator;
81 if (record != nullptr && record->GetToken() == token) {
82 iterator = serviceRecords_.erase(iterator);
83 delete record;
84 } else {
85 ++iterator;
86 }
87 }
88 }
89
RemoveServiceRecord(const char * bundleName)90 void AbilityConnectMission::RemoveServiceRecord(const char *bundleName)
91 {
92 CHECK_NULLPTR_RETURN(bundleName, "AbilityConnectMission", "invalid argument");
93 for (auto iterator = serviceRecords_.begin(); iterator != serviceRecords_.end();) {
94 auto record = *iterator;
95 if (record != nullptr && record->IsSamePageAbility(bundleName)) {
96 AbilityMsStatus status = record->StopAbilityDone();
97 if (!status.IsOk()) {
98 PRINTW("RemoveServiceRecord", "service disconnectDoneTransaction failed");
99 }
100 iterator = serviceRecords_.erase(iterator);
101 delete record;
102 } else {
103 ++iterator;
104 }
105 }
106 }
107
CountServiceInApp(const char * bundleName)108 int32_t AbilityConnectMission::CountServiceInApp(const char *bundleName)
109 {
110 if (bundleName == nullptr) {
111 return 0;
112 }
113 int32_t retVal = 0;
114 for (const auto record : serviceRecords_) {
115 if (record == nullptr) {
116 continue;
117 }
118 if (record->GetAbilityInfo().bundleName != nullptr &&
119 strcmp(record->GetAbilityInfo().bundleName, bundleName) == 0) {
120 retVal++;
121 }
122 }
123 return retVal;
124 }
125
126 #ifdef OHOS_DEBUG
DumpConnectMission() const127 AbilityMsStatus AbilityConnectMission::DumpConnectMission() const
128 {
129 if (serviceRecords_.empty()) {
130 return AbilityMsStatus::DumpStatus("");
131 }
132 std::string connectInfo = "ConnectMission: \n";
133 AbilityMsStatus result = AbilityMsStatus::DumpStatus(connectInfo.c_str());
134 for (const auto target : serviceRecords_) {
135 if (target != nullptr) {
136 result.DumpAppend(target->DumpAbilityRecord());
137 }
138 }
139 return result;
140 }
141 #endif
142
RemoveConnectRecordByPageToken(uint64_t token,const char * bundleName)143 void AbilityConnectMission::RemoveConnectRecordByPageToken(uint64_t token, const char *bundleName)
144 {
145 CHECK_NULLPTR_RETURN(bundleName, "AbilityConnectMission", "invalid argument");
146 for (auto iterator = serviceRecords_.begin(); iterator != serviceRecords_.end(); ++iterator) {
147 auto record = *iterator;
148 if (record != nullptr && record->GetAbilityInfo().bundleName != nullptr &&
149 strcmp(record->GetAbilityInfo().bundleName, bundleName) != 0) {
150 record->RemoveConnectRecordByPageToken(token);
151 }
152 }
153 }
154 } // namespace OHOS
155