1 /* 2 * Copyright (c) 2021-2023 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_DISTRIBUTED_SCHED_SERVICE_H 17 #define OHOS_DISTRIBUTED_SCHED_SERVICE_H 18 19 #include <memory> 20 #include <mutex> 21 #include <set> 22 #include <unordered_map> 23 24 #include "app_mgr_interface.h" 25 #include "app_state_observer.h" 26 #include "distributed_sched_stub.h" 27 #include "distributed_sched_continuation.h" 28 #include "dms_callback_task.h" 29 #ifdef SUPPORT_DISTRIBUTED_FORM_SHARE 30 #include "form_mgr_interface.h" 31 #endif 32 #include "iremote_object.h" 33 #include "iremote_proxy.h" 34 #ifdef SUPPORT_DISTRIBUTED_MISSION_MANAGER 35 #include "mission/distributed_mission_info.h" 36 #include "nocopyable.h" 37 #endif 38 #include "single_instance.h" 39 #include "system_ability.h" 40 41 namespace OHOS { 42 namespace DistributedSchedule { 43 class ConnectAbilitySession; 44 45 enum class ServiceRunningState { 46 STATE_NO_START, 47 STATE_RUNNING 48 }; 49 50 enum class TargetComponent { 51 HARMONY_COMPONENT, 52 }; 53 54 struct ConnectInfo { 55 CallerInfo callerInfo; 56 sptr<IRemoteObject> callbackWrapper; 57 AppExecFwk::ElementName element; 58 }; 59 60 struct ProcessDiedNotifyInfo { 61 std::string remoteDeviceId; 62 CallerInfo callerInfo; 63 TargetComponent targetComponent; 64 }; 65 66 struct CallInfo { 67 int32_t connectToken; 68 std::string remoteDeviceId; 69 }; 70 71 struct ObserverInfo { 72 sptr<AppStateObserver> appStateObserver; 73 std::string srcDeviceId; 74 int32_t connectToken; 75 std::string dstBundleName; 76 std::string dstAbilityName; 77 sptr<IRemoteObject> srcConnect; 78 sptr<IRemoteObject> token; 79 }; 80 81 class DistributedSchedService : public SystemAbility, public DistributedSchedStub { 82 DECLARE_SYSTEM_ABILITY(DistributedSchedService); 83 DECLARE_SINGLE_INSTANCE_BASE(DistributedSchedService); 84 85 public: 86 ~DistributedSchedService() = default; 87 void OnStart() override; 88 void OnStop() override; 89 int32_t Dump(int32_t fd, const std::vector<std::u16string>& args) override; 90 void DeviceOnlineNotify(const std::string& deviceId); 91 void DeviceOfflineNotify(const std::string& deviceId); 92 93 int32_t StartRemoteAbility(const OHOS::AAFwk::Want& want, int32_t callerUid, int32_t requestCode, 94 uint32_t accessToken) override; 95 int32_t StartAbilityFromRemote(const OHOS::AAFwk::Want& want, 96 const OHOS::AppExecFwk::AbilityInfo& abilityInfo, int32_t requestCode, const CallerInfo& callerInfo, 97 const AccountInfo& accountInfo) override; 98 int32_t SendResultFromRemote(OHOS::AAFwk::Want& want, int32_t requestCode, 99 const CallerInfo& callerInfo, const AccountInfo& accountInfo, int32_t resultCode) override; 100 int32_t ContinueMission(const std::string& srcDeviceId, const std::string& dstDeviceId, 101 int32_t missionId, const sptr<IRemoteObject>& callback, const OHOS::AAFwk::WantParams& wantParams) override; 102 int32_t ContinueMission(const std::string& srcDeviceId, const std::string& dstDeviceId, 103 const std::string& bundleName, const sptr<IRemoteObject>& callback, 104 const OHOS::AAFwk::WantParams& wantParams) override; 105 int32_t StartContinuation(const OHOS::AAFwk::Want& want, int32_t missionId, int32_t callerUid, 106 int32_t status, uint32_t accessToken) override; 107 void NotifyCompleteContinuation(const std::u16string& devId, int32_t sessionId, bool isSuccess) override; 108 int32_t NotifyContinuationResultFromRemote(int32_t sessionId, bool isSuccess) override; 109 void NotifyContinuationCallbackResult(int32_t missionId, int32_t resultCode); 110 int32_t NotifyFreeInstallResult(const CallbackTaskItem item, int32_t resultCode); 111 int32_t ConnectRemoteAbility(const OHOS::AAFwk::Want& want, const sptr<IRemoteObject>& connect, 112 int32_t callerUid, int32_t callerPid, uint32_t accessToken) override; 113 int32_t DisconnectRemoteAbility(const sptr<IRemoteObject>& connect, int32_t callerUid, 114 uint32_t accessToken) override; 115 int32_t ConnectAbilityFromRemote(const OHOS::AAFwk::Want& want, const AppExecFwk::AbilityInfo& abilityInfo, 116 const sptr<IRemoteObject>& connect, const CallerInfo& callerInfo, const AccountInfo& accountInfo) override; 117 int32_t DisconnectAbilityFromRemote(const sptr<IRemoteObject>& connect, 118 int32_t uid, const std::string& sourceDeviceId) override; 119 int32_t NotifyProcessDiedFromRemote(const CallerInfo& callerInfo) override; 120 #ifdef SUPPORT_DISTRIBUTED_MISSION_MANAGER 121 int32_t GetMissionInfos(const std::string& deviceId, int32_t numMissions, 122 std::vector<AAFwk::MissionInfo>& missionInfos) override; 123 int32_t NotifyMissionsChangedFromRemote(const std::vector<DstbMissionInfo>& missionInfos, 124 const CallerInfo& callerInfo) override; 125 int32_t GetRemoteMissionSnapshotInfo(const std::string& networkId, int32_t missionId, 126 std::unique_ptr<AAFwk::MissionSnapshot>& missionSnapshot) override; 127 int32_t StartSyncRemoteMissions(const std::string& devId, bool fixConflict, int64_t tag) override; 128 int32_t StartSyncMissionsFromRemote(const CallerInfo& callerInfo, 129 std::vector<DstbMissionInfo>& missionInfos) override; 130 int32_t StopSyncRemoteMissions(const std::string& devId) override; 131 int32_t StopSyncMissionsFromRemote(const CallerInfo& callerInfo) override; 132 int32_t RegisterMissionListener(const std::u16string& devId, const sptr<IRemoteObject>& obj) override; 133 int32_t RegisterOnListener(const std::string& type, const sptr<IRemoteObject>& obj) override; 134 int32_t RegisterOffListener(const std::string& type, const sptr<IRemoteObject>& obj) override; 135 int32_t UnRegisterMissionListener(const std::u16string& devId, const sptr<IRemoteObject>& obj) override; 136 int32_t SetMissionContinueState(int32_t missionId, const AAFwk::ContinueState &state) override; 137 #endif 138 void ProcessConnectDied(const sptr<IRemoteObject>& connect); 139 void ProcessDeviceOffline(const std::string& deviceId); 140 void DumpConnectInfo(std::string& info); 141 void DumpSessionsLocked(const std::list<ConnectAbilitySession>& sessionsList, std::string& info); 142 void DumpElementLocked(const std::list<AppExecFwk::ElementName>& elementsList, std::string& info); 143 int32_t StartRemoteAbilityByCall(const OHOS::AAFwk::Want& want, const sptr<IRemoteObject>& connect, 144 int32_t callerUid, int32_t callerPid, uint32_t accessToken) override; 145 int32_t ReleaseRemoteAbility(const sptr<IRemoteObject>& connect, 146 const AppExecFwk::ElementName &element) override; 147 int32_t StartAbilityByCallFromRemote(const OHOS::AAFwk::Want& want, const sptr<IRemoteObject>& connect, 148 const CallerInfo& callerInfo, const AccountInfo& accountInfo) override; 149 int32_t ReleaseAbilityFromRemote(const sptr<IRemoteObject>& connect, const AppExecFwk::ElementName &element, 150 const CallerInfo& callerInfo) override; 151 #ifdef SUPPORT_DISTRIBUTED_FORM_SHARE 152 int32_t StartRemoteShareForm(const std::string& remoteDeviceId, 153 const AppExecFwk::FormShareInfo& formShareInfo) override; 154 int32_t StartShareFormFromRemote( 155 const std::string& remoteDeviceId, const AppExecFwk::FormShareInfo& formShareInfo) override; 156 void ProcessFormMgrDied(const wptr<IRemoteObject>& remote); 157 #endif 158 void ProcessCallerDied(const sptr<IRemoteObject>& connect, int32_t deviceType); 159 void ProcessCalleeDied(const sptr<IRemoteObject>& connect); 160 void ProcessCallResult(const sptr<IRemoteObject>& calleeConnect, const sptr<IRemoteObject>& callerConnect); 161 int32_t StartRemoteFreeInstall(const OHOS::AAFwk::Want& want, int32_t callerUid, int32_t requestCode, 162 uint32_t accessToken, const sptr<IRemoteObject>& callback) override; 163 int32_t StartFreeInstallFromRemote(const FreeInstallInfo& info, int64_t taskId) override; 164 int32_t NotifyCompleteFreeInstallFromRemote(int64_t taskId, int32_t resultCode) override; 165 int32_t NotifyCompleteFreeInstall(const FreeInstallInfo& info, int64_t taskId, int32_t resultCode); 166 int32_t GetDistributedComponentList(std::vector<std::string>& distributedComponents) override; 167 void SetContinuationTimeout(int32_t missionId, int32_t timeout); 168 void RemoveContinuationTimeout(int32_t missionId); 169 std::string GetContinuaitonDevice(int32_t missionId); 170 int32_t NotifyStateChangedFromRemote(int32_t abilityState, int32_t connectToken, 171 const AppExecFwk::ElementName& element) override; 172 int32_t NotifyStateChanged(int32_t abilityState, AppExecFwk::ElementName& element, 173 const sptr<IRemoteObject>& token); 174 int32_t StopRemoteExtensionAbility(const OHOS::AAFwk::Want& want, int32_t callerUid, 175 uint32_t accessToken, int32_t extensionType) override; 176 int32_t StopExtensionAbilityFromRemote(const OHOS::AAFwk::Want& remoteWant, const CallerInfo& callerInfo, 177 const AccountInfo& accountInfo, int32_t extensionType) override; 178 private: 179 DistributedSchedService(); 180 bool Init(); 181 void RemoteConnectAbilityMappingLocked(const sptr<IRemoteObject>& connect, const std::string& localDeviceId, 182 const std::string& remoteDeviceId, const AppExecFwk::ElementName& element, const CallerInfo& callerInfo, 183 TargetComponent targetComponent); 184 int32_t DisconnectEachRemoteAbilityLocked(const std::string& localDeviceId, 185 const std::string& remoteDeviceId, const sptr<IRemoteObject>& connect); 186 sptr<IDistributedSched> GetRemoteDms(const std::string& remoteDeviceId); 187 static bool GetLocalDeviceId(std::string& localDeviceId); 188 bool CheckDeviceId(const std::string& localDeviceId, const std::string& remoteDeviceId); 189 bool CheckDeviceIdFromRemote(const std::string& localDeviceId, 190 const std::string& destinationDeviceId, const std::string& sourceDeviceId); 191 void NotifyDeviceOfflineToAppLocked(const sptr<IRemoteObject>& connect, const ConnectAbilitySession& session); 192 int32_t NotifyApp(const sptr<IRemoteObject>& connect, const AppExecFwk::ElementName& element, int32_t errCode); 193 void NotifyProcessDiedAll(const std::list<ProcessDiedNotifyInfo>& notifyList); 194 void NotifyProcessDied(const std::string& remoteDeviceId, const CallerInfo& callerInfo, 195 TargetComponent targetComponent); 196 int32_t CheckDistributedConnectLocked(const CallerInfo& callerInfo) const; 197 void DecreaseConnectLocked(int32_t uid); 198 static int32_t GetUidLocked(const std::list<ConnectAbilitySession>& sessionList); 199 int32_t TryConnectRemoteAbility(const OHOS::AAFwk::Want& want, 200 const sptr<IRemoteObject>& connect, const CallerInfo& callerInfo); 201 int32_t PrecheckContinueLocalMission(const std::string& dstDeviceId, int32_t missionId, 202 const sptr<IRemoteObject>& callback); 203 #ifdef SUPPORT_DISTRIBUTED_FORM_SHARE 204 sptr<AppExecFwk::IFormMgr> GetFormMgrProxy(); 205 #endif 206 int32_t CleanMission(int32_t missionId); 207 int32_t SetCallerInfo(int32_t callerUid, std::string localDeviceId, uint32_t accessToken, CallerInfo& callerInfo); 208 int32_t SetWantForContinuation(AAFwk::Want& newWant, int32_t missionId); 209 int32_t ContinueLocalMission(const std::string& dstDeviceId, int32_t missionId, 210 const sptr<IRemoteObject>& callback, const OHOS::AAFwk::WantParams& wantParams); 211 int32_t ContinueAbilityWithTimeout(const std::string& dstDeviceId, int32_t missionId, 212 const sptr<IRemoteObject>& callback, uint32_t remoteBundleVersion = 0); 213 int32_t ContinueRemoteMission(const std::string& srcDeviceId, const std::string& dstDeviceId, int32_t missionId, 214 const sptr<IRemoteObject>& callback, const OHOS::AAFwk::WantParams& wantParams); 215 int32_t ContinueRemoteMission(const std::string& srcDeviceId, const std::string& dstDeviceId, 216 const std::string& bundleName, const sptr<IRemoteObject>& callback, const OHOS::AAFwk::WantParams& wantParams); 217 int32_t TryStartRemoteAbilityByCall(const OHOS::AAFwk::Want& want, const sptr<IRemoteObject>& connect, 218 const CallerInfo& callerInfo); 219 int32_t StartLocalAbility(const FreeInstallInfo& info, int64_t taskId, int32_t resultCode); 220 int32_t StartAbility(const OHOS::AAFwk::Want& want, int32_t requestCode); 221 int32_t HandleRemoteNotify(const FreeInstallInfo& info, int64_t taskId, int32_t resultCode); 222 void ReportDistributedComponentChange(const CallerInfo& callerInfo, int32_t changeType, 223 int32_t componentType, int32_t deviceType); 224 void ReportDistributedComponentChange(const ConnectInfo& connectInfo, int32_t changeType, 225 int32_t componentType, int32_t deviceType); 226 void HandleLocalCallerDied(const sptr<IRemoteObject>& connect); 227 void SaveCallerComponent(const OHOS::AAFwk::Want& want, const sptr<IRemoteObject>& connect, 228 const CallerInfo& callerInfo); 229 void RemoveCallerComponent(const sptr<IRemoteObject>& connect); 230 void ProcessCalleeOffline(const std::string& deviceId); 231 void GetConnectComponentList(std::vector<std::string>& distributedComponents); 232 void GetCallComponentList(std::vector<std::string>& distributedComponents); 233 void ProcessFreeInstallOffline(const std::string& deviceId); 234 bool RegisterAppStateObserver(const OHOS::AAFwk::Want& want, const CallerInfo& callerInfo, 235 const sptr<IRemoteObject>& srcConnect, const sptr<IRemoteObject>& callbackWrapper); 236 void UnregisterAppStateObserver(const sptr<IRemoteObject>& callbackWrapper); 237 sptr<AppExecFwk::IAppMgr> GetAppManager(); 238 int32_t CheckTargetPermission(const OHOS::AAFwk::Want& want, const CallerInfo& callerInfo, 239 const AccountInfo& accountInfo, int32_t flag, bool needQueryExtension); 240 int32_t SaveConnectToken(const OHOS::AAFwk::Want& want, const sptr<IRemoteObject>& connect); 241 void SetCleanMissionFlag(const OHOS::AAFwk::Want& want, int32_t missionId); 242 243 std::shared_ptr<DSchedContinuation> dschedContinuation_; 244 std::map<sptr<IRemoteObject>, std::list<ConnectAbilitySession>> distributedConnectAbilityMap_; 245 std::map<sptr<IRemoteObject>, ConnectInfo> connectAbilityMap_; 246 std::unordered_map<int32_t, uint32_t> trackingUidMap_; 247 std::mutex distributedLock_; 248 std::mutex connectLock_; 249 sptr<IRemoteObject::DeathRecipient> connectDeathRecipient_; 250 #ifdef SUPPORT_DISTRIBUTED_FORM_SHARE 251 sptr<IRemoteObject::DeathRecipient> formMgrDeathRecipient_; 252 sptr<AppExecFwk::IFormMgr> formMgrProxy_; 253 std::mutex formMgrLock_; 254 #endif 255 std::mutex calleeLock_; 256 std::map<sptr<IRemoteObject>, ConnectInfo> calleeMap_; 257 sptr<IRemoteObject::DeathRecipient> callerDeathRecipient_; 258 std::shared_ptr<DmsCallbackTask> dmsCallbackTask_; 259 std::shared_ptr<AppExecFwk::EventHandler> componentChangeHandler_; 260 std::mutex callerLock_; 261 std::map<sptr<IRemoteObject>, std::list<ConnectAbilitySession>> callerMap_; 262 sptr<IRemoteObject::DeathRecipient> callerDeathRecipientForLocalDevice_; 263 std::mutex observerLock_; 264 std::map<sptr<IRemoteObject>, ObserverInfo> observerMap_; 265 std::mutex callLock_; 266 std::map<sptr<IRemoteObject>, CallInfo> callMap_; 267 std::mutex tokenMutex_; 268 std::mutex registerMutex_; 269 std::atomic<int32_t> token_ {0}; 270 std::map<std::string, sptr<AppStateObserver>> bundleNameMap_; 271 }; 272 273 class ConnectAbilitySession { 274 public: 275 ConnectAbilitySession(const std::string& sourceDeviceId, const std::string& destinationDeviceId, 276 const CallerInfo& callerInfo, TargetComponent targetComponent = TargetComponent::HARMONY_COMPONENT); 277 ~ConnectAbilitySession() = default; 278 GetSourceDeviceId()279 const std::string& GetSourceDeviceId() const 280 { 281 return sourceDeviceId_; 282 } 283 GetDestinationDeviceId()284 const std::string& GetDestinationDeviceId() const 285 { 286 return destinationDeviceId_; 287 } 288 GetElementsList()289 std::list<AppExecFwk::ElementName> GetElementsList() const 290 { 291 return elementsList_; 292 } 293 GetCallerInfo()294 CallerInfo GetCallerInfo() const 295 { 296 return callerInfo_; 297 } 298 GetTargetComponent()299 TargetComponent GetTargetComponent() const 300 { 301 return targetComponent_; 302 } 303 304 bool IsSameCaller(const CallerInfo& callerInfo); 305 void AddElement(const AppExecFwk::ElementName& element); 306 307 private: 308 std::string sourceDeviceId_; 309 std::string destinationDeviceId_; 310 std::list<AppExecFwk::ElementName> elementsList_; 311 CallerInfo callerInfo_; 312 TargetComponent targetComponent_; 313 }; 314 315 class CallerDeathRecipient : public IRemoteObject::DeathRecipient { 316 public: 317 CallerDeathRecipient() = default; CallerDeathRecipient(int32_t deviceType)318 explicit CallerDeathRecipient(int32_t deviceType) 319 { 320 deviceType_ = deviceType; 321 } 322 ~CallerDeathRecipient() override = default; 323 void OnRemoteDied(const wptr<IRemoteObject>& remote) override; 324 private: 325 int32_t deviceType_ = IDistributedSched::CALLEE; 326 }; 327 } // namespace DistributedSchedule 328 } // namespace OHOS 329 #endif // OHOS_DISTRIBUTED_SCHED_SERVICE_H 330