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