1 /* 2 * Copyright (c) 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 #ifndef OHOS_AAFWK_CONNECTION_STATE_MANAGER_H 17 #define OHOS_AAFWK_CONNECTION_STATE_MANAGER_H 18 19 #include <mutex> 20 #include <unordered_map> 21 #include "cpp/mutex.h" 22 23 #include "task_handler_wrap.h" 24 #include "application_state_observer_stub.h" 25 #include "connection_state_item.h" 26 #include "connection_observer_controller.h" 27 #ifdef WITH_DLP 28 #include "dlp_connection_info.h" 29 #include "dlp_state_item.h" 30 #endif // WITH_DLP 31 32 namespace OHOS { 33 namespace AAFwk { 34 /** 35 * @class ConnectionStateManager 36 * ConnectionStateManager manage connection states. 37 */ 38 class ConnectionStateManager : public std::enable_shared_from_this<ConnectionStateManager> { 39 DECLARE_DELAYED_SINGLETON(ConnectionStateManager) 40 public: 41 /** 42 * Get process name of a pid. 43 * 44 * @param pid target pid. 45 * @return process name of target pid. 46 */ 47 static std::string GetProcessNameByPid(int32_t pid); 48 49 /** 50 * init manager. 51 * 52 */ 53 void Init(const std::shared_ptr<TaskHandlerWrap> &handler = nullptr); 54 55 /** 56 * register connection state observer. 57 * 58 * @param observer callback of client. 59 * @return Returns ERR_OK if success. 60 */ 61 int RegisterObserver(const sptr<AbilityRuntime::IConnectionObserver> &observer); 62 63 /** 64 * unregister connection state observer. 65 * 66 * @param observer callback of client. 67 * @return Returns ERR_OK if success. 68 */ 69 int UnregisterObserver(const sptr<AbilityRuntime::IConnectionObserver> &observer); 70 71 /** 72 * add an connection to manager. 73 * 74 * @param connectionRecord connection record info. 75 */ 76 void AddConnection(std::shared_ptr<ConnectionRecord> connectionRecord); 77 78 /** 79 * remove an connection. 80 * 81 * @param connectionRecord connection record info. 82 * @param isCallerDied whether caller was died. 83 */ 84 void RemoveConnection(std::shared_ptr<ConnectionRecord> connectionRecord, bool isCallerDied); 85 86 /** 87 * add a data ability acquired information to manager. 88 * 89 * @param caller caller of data ability. 90 * @param record target data ability. 91 */ 92 void AddDataAbilityConnection(const DataAbilityCaller &caller, 93 const std::shared_ptr<DataAbilityRecord> &record); 94 95 /** 96 * remove a data ability acquired information from manager. 97 * 98 * @param caller caller of data ability. 99 * @param record target data ability. 100 */ 101 void RemoveDataAbilityConnection(const DataAbilityCaller &caller, 102 const std::shared_ptr<DataAbilityRecord> &record); 103 104 /** 105 * handle when data ability was died. 106 * 107 * @param record target data ability. 108 */ 109 void HandleDataAbilityDied(const std::shared_ptr<DataAbilityRecord> &record); 110 111 /** 112 * handle when data ability caller was died. 113 * 114 * @param callerPid caller pid of data ability. 115 */ 116 void HandleDataAbilityCallerDied(int32_t callerPid); 117 118 #ifdef WITH_DLP 119 /** 120 * add dlp manager to manager. 121 * 122 * @param dlpManger dlp manager record. 123 */ 124 void AddDlpManager(const std::shared_ptr<AbilityRecord> &dlpManger); 125 126 /** 127 * remove dlp manager from manager. 128 * 129 * @param dlpManger dlp manager record. 130 */ 131 void RemoveDlpManager(const std::shared_ptr<AbilityRecord> &dlpManger); 132 133 /** 134 * a dlp ability was started. 135 * 136 * @param dlpAbility dlp manager record. 137 */ 138 void AddDlpAbility(const std::shared_ptr<AbilityRecord> &dlpAbility); 139 140 /** 141 * a dlp ability was terminated. 142 * 143 * @param dlpAbility dlp manager record. 144 */ 145 void RemoveDlpAbility(const std::shared_ptr<AbilityRecord> &dlpAbility); 146 #endif // WITH_DLP 147 148 /** 149 * handle app process died. 150 * 151 * @param pid app process pid. 152 */ 153 void HandleAppDied(int32_t pid); 154 155 #ifdef WITH_DLP 156 /** 157 * get exist dlp connection infos. 158 * 159 * @param infos output dlp connection result. 160 */ 161 void GetDlpConnectionInfos(std::vector<AbilityRuntime::DlpConnectionInfo> &infos); 162 #endif // WITH_DLP 163 164 /** 165 * Get exist connection data including Extension and Data connection. 166 * 167 * @param infos output connection result. 168 */ 169 void GetConnectionData(std::vector<AbilityRuntime::ConnectionData> &connectionData); 170 171 private: 172 bool CheckDataAbilityConnectionParams(const DataAbilityCaller &caller, 173 const std::shared_ptr<DataAbilityRecord> &record) const; 174 175 private: 176 class InnerAppStateObserver : public AppExecFwk::ApplicationStateObserverStub { 177 public: 178 using ProcessDiedHandler = std::function<void(int32_t)>; InnerAppStateObserver(const ProcessDiedHandler handler)179 explicit InnerAppStateObserver(const ProcessDiedHandler handler) : handler_(handler) {} 180 ~InnerAppStateObserver() = default; OnForegroundApplicationChanged(const AppExecFwk::AppStateData & appStateData)181 void OnForegroundApplicationChanged(const AppExecFwk::AppStateData &appStateData) {} OnAbilityStateChanged(const AppExecFwk::AbilityStateData & abilityStateData)182 void OnAbilityStateChanged(const AppExecFwk::AbilityStateData &abilityStateData) {} OnExtensionStateChanged(const AppExecFwk::AbilityStateData & abilityStateData)183 void OnExtensionStateChanged(const AppExecFwk::AbilityStateData &abilityStateData) {} OnProcessCreated(const AppExecFwk::ProcessData & processData)184 void OnProcessCreated(const AppExecFwk::ProcessData &processData) {} OnProcessStateChanged(const AppExecFwk::ProcessData & processData)185 void OnProcessStateChanged(const AppExecFwk::ProcessData &processData) {} OnApplicationStateChanged(const AppExecFwk::AppStateData & appStateData)186 void OnApplicationStateChanged(const AppExecFwk::AppStateData &appStateData) {} OnProcessDied(const AppExecFwk::ProcessData & processData)187 void OnProcessDied(const AppExecFwk::ProcessData &processData) 188 { 189 if (handler_) { 190 handler_(processData.pid); 191 } 192 } 193 194 private: 195 ProcessDiedHandler handler_; 196 }; 197 198 bool AddConnectionInner(std::shared_ptr<ConnectionRecord> connectionRecord, 199 AbilityRuntime::ConnectionData &data); 200 bool RemoveConnectionInner(std::shared_ptr<ConnectionRecord> connectionRecord, 201 AbilityRuntime::ConnectionData &data); 202 bool AddDataAbilityConnectionInner(const DataAbilityCaller &caller, 203 const std::shared_ptr<DataAbilityRecord> &record, AbilityRuntime::ConnectionData &data); 204 bool RemoveDataAbilityConnectionInner(const DataAbilityCaller &caller, 205 const std::shared_ptr<DataAbilityRecord> &record, AbilityRuntime::ConnectionData &data); 206 void HandleCallerDied(int32_t callerPid); 207 std::shared_ptr<ConnectionStateItem> RemoveDiedCaller(int32_t callerPid); 208 void HandleDataAbilityDiedInner(const sptr<IRemoteObject> &abilityToken, 209 std::vector<AbilityRuntime::ConnectionData> &allData); 210 211 #ifdef WITH_DLP 212 bool HandleDlpAbilityInner(const std::shared_ptr<AbilityRecord> &dlpAbility, 213 bool isAdd, AbilityRuntime::DlpStateData &dlpData); 214 #endif // WITH_DLP 215 216 void InitAppStateObserver(); 217 218 private: 219 std::shared_ptr<ConnectionObserverController> observerController_; 220 221 ffrt::mutex stateLock_; 222 std::unordered_map<int32_t, std::shared_ptr<ConnectionStateItem>> connectionStates_; 223 224 #ifdef WITH_DLP 225 ffrt::mutex dlpLock_; 226 std::unordered_map<int32_t, std::shared_ptr<DlpStateItem>> dlpItems_; 227 #endif // WITH_DLP 228 229 sptr<InnerAppStateObserver> appStateObserver_; 230 std::shared_ptr<TaskHandlerWrap> handler_; 231 232 int32_t retry_ = 0; 233 }; 234 } // namespace AAFwk 235 } // namespace OHOS 236 #endif // OHOS_AAFWK_CONNECTION_STATE_MANAGER_H 237