1 /* 2 * Copyright (c) 2021-2024 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 "datashare_manager.h" 27 #include "distributed_sched_stub.h" 28 #include "distributed_sched_continuation.h" 29 #include "dms_callback_task.h" 30 #include "dsched_collaborate_callback_mgr.h" 31 #ifdef SUPPORT_DISTRIBUTED_FORM_SHARE 32 #include "form_mgr_interface.h" 33 #endif 34 #include "iremote_object.h" 35 #include "iremote_proxy.h" 36 #ifdef SUPPORT_DISTRIBUTED_MISSION_MANAGER 37 #include "mission/distributed_mission_focused_listener.h" 38 #include "mission/distributed_mission_info.h" 39 #include "nocopyable.h" 40 #endif 41 #include "dsched_continue.h" 42 #include "dsched_continue_event.h" 43 #include "single_instance.h" 44 #include "system_ability.h" 45 46 namespace OHOS { 47 namespace DistributedSchedule { 48 class ConnectAbilitySession; 49 50 enum class ServiceRunningState { 51 STATE_NO_START, 52 STATE_RUNNING 53 }; 54 55 enum class TargetComponent { 56 HARMONY_COMPONENT, 57 }; 58 59 struct ConnectInfo { 60 CallerInfo callerInfo; 61 sptr<IRemoteObject> callbackWrapper; 62 AppExecFwk::ElementName element; 63 }; 64 65 struct ProcessDiedNotifyInfo { 66 std::string remoteDeviceId; 67 CallerInfo callerInfo; 68 TargetComponent targetComponent; 69 }; 70 71 struct CallInfo { 72 int32_t connectToken; 73 std::string remoteDeviceId; 74 }; 75 76 struct ObserverInfo { 77 sptr<AppStateObserver> appStateObserver; 78 std::string srcDeviceId; 79 int32_t connectToken; 80 std::string dstBundleName; 81 std::string dstAbilityName; 82 sptr<IRemoteObject> srcConnect; 83 sptr<IRemoteObject> token; 84 }; 85 86 class DistributedSchedService : public SystemAbility, public DistributedSchedStub { 87 DECLARE_SYSTEM_ABILITY(DistributedSchedService); 88 DECLARE_SINGLE_INSTANCE_BASE(DistributedSchedService); 89 90 public: 91 ~DistributedSchedService() = default; 92 void OnStart(const SystemAbilityOnDemandReason &startReason) override; 93 void OnStop(const SystemAbilityOnDemandReason &stopReason) override; 94 void OnActive(const SystemAbilityOnDemandReason &activeReason) override; 95 96 /** 97 * @brief If SA is pulled by root and not networked with other devices, uninstall SA after creating the database 98 * 99 * @param startReason, The reason why SA was pulled up. 100 */ 101 void HandleBootStart(const SystemAbilityOnDemandReason &startReason); 102 bool DoStart(); 103 int32_t Dump(int32_t fd, const std::vector<std::u16string>& args) override; 104 void DeviceOnlineNotify(const std::string& deviceId); 105 void DeviceOfflineNotify(const std::string& deviceId); 106 void DurationStart(const std::string srcDeviceId, const std::string dstDeviceId); 107 108 int32_t StartRemoteAbility(const OHOS::AAFwk::Want& want, int32_t callerUid, int32_t requestCode, 109 uint32_t accessToken) override; 110 int32_t StartAbilityFromRemote(const OHOS::AAFwk::Want& want, 111 const OHOS::AppExecFwk::AbilityInfo& abilityInfo, int32_t requestCode, const CallerInfo& callerInfo, 112 const AccountInfo& accountInfo) override; 113 int32_t SendResultFromRemote(OHOS::AAFwk::Want& want, int32_t requestCode, 114 const CallerInfo& callerInfo, const AccountInfo& accountInfo, int32_t resultCode) override; 115 int32_t ContinueMission(const std::string& srcDeviceId, const std::string& dstDeviceId, 116 int32_t missionId, const sptr<IRemoteObject>& callback, const OHOS::AAFwk::WantParams& wantParams) override; 117 int32_t ProcessContinueLocalMission(const std::string& srcDeviceId, const std::string& dstDeviceId, 118 const std::string& bundleName, const sptr<IRemoteObject>& callback, 119 const OHOS::AAFwk::WantParams& wantParams); 120 int32_t ProcessContinueRemoteMission(const std::string& srcDeviceId, const std::string& dstDeviceId, 121 const std::string& bundleName, const sptr<IRemoteObject>& callback, 122 const OHOS::AAFwk::WantParams& wantParams); 123 int32_t ContinueMission(const std::string& srcDeviceId, const std::string& dstDeviceId, 124 const std::string& bundleName, const sptr<IRemoteObject>& callback, 125 const OHOS::AAFwk::WantParams& wantParams) override; 126 int32_t DealDSchedEventResult(const OHOS::AAFwk::Want& want, int32_t status); 127 bool GetIsFreeInstall(int32_t missionId); 128 int32_t StartContinuation(const OHOS::AAFwk::Want& want, int32_t missionId, int32_t callerUid, 129 int32_t status, uint32_t accessToken) override; 130 void NotifyCompleteContinuation(const std::u16string& devId, int32_t sessionId, bool isSuccess) override; 131 int32_t NotifyContinuationResultFromRemote(int32_t sessionId, bool isSuccess, const std::string dstInfo) override; 132 int32_t NotifyDSchedEventResultFromRemote(const std::string type, int32_t dSchedEventResult) override; 133 void NotifyContinuationCallbackResult(int32_t missionId, int32_t resultCode); 134 void NotifyDSchedEventCallbackResult(int32_t resultCode); 135 void NotifyDSchedEventCallbackResult(int32_t resultCode, const EventNotify& event); 136 int32_t NotifyFreeInstallResult(const CallbackTaskItem item, int32_t resultCode); 137 int32_t ConnectRemoteAbility(const OHOS::AAFwk::Want& want, const sptr<IRemoteObject>& connect, 138 int32_t callerUid, int32_t callerPid, uint32_t accessToken) override; 139 int32_t DisconnectRemoteAbility(const sptr<IRemoteObject>& connect, int32_t callerUid, 140 uint32_t accessToken) override; 141 int32_t ConnectAbilityFromRemote(const OHOS::AAFwk::Want& want, const AppExecFwk::AbilityInfo& abilityInfo, 142 const sptr<IRemoteObject>& connect, const CallerInfo& callerInfo, const AccountInfo& accountInfo) override; 143 int32_t DisconnectAbilityFromRemote(const sptr<IRemoteObject>& connect, 144 int32_t uid, const std::string& sourceDeviceId) override; 145 int32_t NotifyProcessDiedFromRemote(const CallerInfo& callerInfo) override; 146 #ifdef SUPPORT_DISTRIBUTED_MISSION_MANAGER 147 int32_t GetMissionInfos(const std::string& deviceId, int32_t numMissions, 148 std::vector<AAFwk::MissionInfo>& missionInfos) override; 149 int32_t NotifyMissionsChangedFromRemote(const std::vector<DstbMissionInfo>& missionInfos, 150 const CallerInfo& callerInfo) override; 151 int32_t GetRemoteMissionSnapshotInfo(const std::string& networkId, int32_t missionId, 152 std::unique_ptr<AAFwk::MissionSnapshot>& missionSnapshot) override; 153 int32_t StartSyncRemoteMissions(const std::string& devId, bool fixConflict, int64_t tag) override; 154 int32_t StartSyncMissionsFromRemote(const CallerInfo& callerInfo, 155 std::vector<DstbMissionInfo>& missionInfos) override; 156 int32_t StopSyncRemoteMissions(const std::string& devId) override; 157 int32_t StopSyncMissionsFromRemote(const CallerInfo& callerInfo) override; 158 int32_t RegisterMissionListener(const std::u16string& devId, const sptr<IRemoteObject>& obj) override; 159 int32_t RegisterOnListener(const std::string& type, const sptr<IRemoteObject>& obj) override; 160 int32_t RegisterOffListener(const std::string& type, const sptr<IRemoteObject>& obj) override; 161 int32_t UnRegisterMissionListener(const std::u16string& devId, const sptr<IRemoteObject>& obj) override; 162 int32_t SetMissionContinueState(int32_t missionId, const AAFwk::ContinueState &state) override; 163 void OnAddSystemAbility(int32_t systemAbilityId, const std::string& deviceId) override; 164 #endif 165 int32_t RegisterDSchedEventListener(const DSchedEventType& type, const sptr<IRemoteObject>& obj) override; 166 int32_t UnRegisterDSchedEventListener(const DSchedEventType& type, const sptr<IRemoteObject>& obj) override; 167 int32_t GetContinueInfo(std::string& dstNetworkId, std::string& srcNetworkId) override; 168 int32_t GetDSchedEventInfo(const DSchedEventType &type, std::vector<EventNotify> &events) override; 169 void ProcessConnectDied(const sptr<IRemoteObject>& connect); 170 void ProcessDeviceOffline(const std::string& deviceId); 171 void DumpConnectInfo(std::string& info); 172 void DumpSessionsLocked(const std::list<ConnectAbilitySession>& sessionsList, std::string& info); 173 void DumpElementLocked(const std::list<AppExecFwk::ElementName>& elementsList, std::string& info); 174 int32_t StartRemoteAbilityByCall(const OHOS::AAFwk::Want& want, const sptr<IRemoteObject>& connect, 175 int32_t callerUid, int32_t callerPid, uint32_t accessToken) override; 176 int32_t ReleaseRemoteAbility(const sptr<IRemoteObject>& connect, 177 const AppExecFwk::ElementName &element) override; 178 int32_t StartAbilityByCallFromRemote(const OHOS::AAFwk::Want& want, const sptr<IRemoteObject>& connect, 179 const CallerInfo& callerInfo, const AccountInfo& accountInfo) override; 180 int32_t ReleaseAbilityFromRemote(const sptr<IRemoteObject>& connect, const AppExecFwk::ElementName &element, 181 const CallerInfo& callerInfo) override; 182 #ifdef SUPPORT_DISTRIBUTED_FORM_SHARE 183 int32_t StartRemoteShareForm(const std::string& remoteDeviceId, 184 const AppExecFwk::FormShareInfo& formShareInfo) override; 185 int32_t StartShareFormFromRemote( 186 const std::string& remoteDeviceId, const AppExecFwk::FormShareInfo& formShareInfo) override; 187 void ProcessFormMgrDied(const wptr<IRemoteObject>& remote); 188 #endif 189 void ProcessCallerDied(const sptr<IRemoteObject>& connect, int32_t deviceType); 190 void ProcessCalleeDied(const sptr<IRemoteObject>& connect); 191 void ProcessCallResult(const sptr<IRemoteObject>& calleeConnect, const sptr<IRemoteObject>& callerConnect); 192 int32_t StartRemoteFreeInstall(const OHOS::AAFwk::Want& want, int32_t callerUid, int32_t requestCode, 193 uint32_t accessToken, const sptr<IRemoteObject>& callback) override; 194 int32_t StartFreeInstallFromRemote(const FreeInstallInfo& info, int64_t taskId) override; 195 int32_t NotifyCompleteFreeInstallFromRemote(int64_t taskId, int32_t resultCode) override; 196 int32_t NotifyCompleteFreeInstall(const FreeInstallInfo& info, int64_t taskId, int32_t resultCode); 197 int32_t GetDistributedComponentList(std::vector<std::string>& distributedComponents) override; 198 void SetContinuationTimeout(int32_t missionId, int32_t timeout); 199 void RemoveContinuationTimeout(int32_t missionId); 200 std::string GetContinuaitonDevice(int32_t missionId); 201 int32_t NotifyStateChangedFromRemote(int32_t abilityState, int32_t connectToken, 202 const AppExecFwk::ElementName& element) override; 203 int32_t NotifyStateChanged(int32_t abilityState, AppExecFwk::ElementName& element, 204 const sptr<IRemoteObject>& token); 205 int32_t StopRemoteExtensionAbility(const OHOS::AAFwk::Want& want, int32_t callerUid, 206 uint32_t accessToken, int32_t extensionType) override; 207 int32_t StopExtensionAbilityFromRemote(const OHOS::AAFwk::Want& remoteWant, const CallerInfo& callerInfo, 208 const AccountInfo& accountInfo, int32_t extensionType) override; 209 int32_t CheckTargetPermission(const OHOS::AAFwk::Want& want, const CallerInfo& callerInfo, 210 const AccountInfo& accountInfo, int32_t flag, bool needQueryExtension); 211 int32_t CheckTargetPermission4DiffBundle(const OHOS::AAFwk::Want& want, const CallerInfo& callerInfo, 212 const AccountInfo& accountInfo, int32_t flag, bool needQueryExtension); 213 ErrCode QueryOsAccount(int32_t& activeAccountId); 214 215 private: 216 DistributedSchedService(); 217 bool Init(); 218 void InitDataShareManager(); 219 void InitMissionManager(); 220 void InitCommonEventListener(); 221 int32_t GetCallerInfo(const std::string &localDeviceId, int32_t callerUid, uint32_t accessToken, 222 CallerInfo &callerInfo); 223 void RemoteConnectAbilityMappingLocked(const sptr<IRemoteObject>& connect, const std::string& localDeviceId, 224 const std::string& remoteDeviceId, const AppExecFwk::ElementName& element, const CallerInfo& callerInfo, 225 TargetComponent targetComponent); 226 int32_t DisconnectEachRemoteAbilityLocked(const std::string& localDeviceId, 227 const std::string& remoteDeviceId, const sptr<IRemoteObject>& connect); 228 sptr<IDistributedSched> GetRemoteDms(const std::string& remoteDeviceId); 229 static bool GetLocalDeviceId(std::string& localDeviceId); 230 bool CheckDeviceId(const std::string& localDeviceId, const std::string& remoteDeviceId); 231 bool CheckDeviceIdFromRemote(const std::string& localDeviceId, 232 const std::string& destinationDeviceId, const std::string& sourceDeviceId); 233 void NotifyDeviceOfflineToAppLocked(const sptr<IRemoteObject>& connect, const ConnectAbilitySession& session); 234 int32_t NotifyApp(const sptr<IRemoteObject>& connect, const AppExecFwk::ElementName& element, int32_t errCode); 235 void NotifyProcessDiedAll(const std::list<ProcessDiedNotifyInfo>& notifyList); 236 void NotifyProcessDied(const std::string& remoteDeviceId, const CallerInfo& callerInfo, 237 TargetComponent targetComponent); 238 int32_t CheckDistributedConnectLocked(const CallerInfo& callerInfo) const; 239 void DecreaseConnectLocked(int32_t uid); 240 static int32_t GetUidLocked(const std::list<ConnectAbilitySession>& sessionList); 241 int32_t TryConnectRemoteAbility(const OHOS::AAFwk::Want& want, 242 const sptr<IRemoteObject>& connect, const CallerInfo& callerInfo); 243 int32_t ContinueLocalMissionDealFreeInstall(OHOS::AAFwk::Want& want, int32_t missionId, 244 const std::string& dstDeviceId, const sptr<IRemoteObject>& callback); 245 #ifdef SUPPORT_DISTRIBUTED_FORM_SHARE 246 sptr<AppExecFwk::IFormMgr> GetFormMgrProxy(); 247 #endif 248 int32_t SetCallerInfo(int32_t callerUid, std::string localDeviceId, uint32_t accessToken, CallerInfo& callerInfo); 249 int32_t SetWantForContinuation(AAFwk::Want& newWant, int32_t missionId); 250 int32_t ContinueLocalMission(const std::string& dstDeviceId, int32_t missionId, 251 const sptr<IRemoteObject>& callback, const OHOS::AAFwk::WantParams& wantParams); 252 int32_t ContinueAbilityWithTimeout(const std::string& dstDeviceId, int32_t missionId, 253 const sptr<IRemoteObject>& callback, uint32_t remoteBundleVersion = 0); 254 int32_t ContinueRemoteMission(const std::string& srcDeviceId, const std::string& dstDeviceId, int32_t missionId, 255 const sptr<IRemoteObject>& callback, const OHOS::AAFwk::WantParams& wantParams); 256 int32_t ContinueRemoteMission(const std::string& srcDeviceId, const std::string& dstDeviceId, 257 const std::string& bundleName, const sptr<IRemoteObject>& callback, const OHOS::AAFwk::WantParams& wantParams); 258 int32_t TryStartRemoteAbilityByCall(const OHOS::AAFwk::Want& want, const sptr<IRemoteObject>& connect, 259 const CallerInfo& callerInfo); 260 int32_t StartLocalAbility(const FreeInstallInfo& info, int64_t taskId, int32_t resultCode); 261 int32_t StartAbility(const OHOS::AAFwk::Want& want, int32_t requestCode); 262 int32_t HandleRemoteNotify(const FreeInstallInfo& info, int64_t taskId, int32_t resultCode); 263 void ReportDistributedComponentChange(const CallerInfo& callerInfo, int32_t changeType, 264 int32_t componentType, int32_t deviceType); 265 void ReportDistributedComponentChange(const ConnectInfo& connectInfo, int32_t changeType, 266 int32_t componentType, int32_t deviceType); 267 void HandleLocalCallerDied(const sptr<IRemoteObject>& connect); 268 void SaveCallerComponent(const OHOS::AAFwk::Want& want, const sptr<IRemoteObject>& connect, 269 const CallerInfo& callerInfo); 270 void RemoveCallerComponent(const sptr<IRemoteObject>& connect); 271 void ProcessCalleeOffline(const std::string& deviceId); 272 void GetConnectComponentList(std::vector<std::string>& distributedComponents); 273 void GetCallComponentList(std::vector<std::string>& distributedComponents); 274 void ProcessFreeInstallOffline(const std::string& deviceId); 275 bool RegisterAppStateObserver(const OHOS::AAFwk::Want& want, const CallerInfo& callerInfo, 276 const sptr<IRemoteObject>& srcConnect, const sptr<IRemoteObject>& callbackWrapper); 277 void UnregisterAppStateObserver(const sptr<IRemoteObject>& callbackWrapper); 278 sptr<AppExecFwk::IAppMgr> GetAppManager(); 279 int32_t SaveConnectToken(const OHOS::AAFwk::Want& want, const sptr<IRemoteObject>& connect); 280 void SetCleanMissionFlag(const OHOS::AAFwk::Want& want, int32_t missionId); 281 void RemoveConnectAbilityInfo(const std::string& deviceId); 282 void InitWifiStateListener(); 283 void InitWifiSemiStateListener(); 284 void NotifyContinuateEventResult(int32_t resultCode, const EventNotify& event); 285 void InitDeviceCfg(); 286 void NotifyCollaborateEventResult(int32_t resultCode, const EventNotify& event); 287 void GetContinueEventInfo(int32_t callingUid, std::vector<EventNotify> &events); 288 void GetCollaborateEventInfo(int32_t callingUid, std::vector<EventNotify> &events); 289 void GetCollaborateEventsByCallers(int32_t callingUid, const std::string &callingBundleName, 290 std::vector<EventNotify> &events); 291 void GetCollaborateEventsByCallees(int32_t callingUid, const std::string &callingBundleName, 292 std::vector<EventNotify> &events); 293 void GetCurSrcCollaborateEvent(const CallerInfo &callerInfo, const AppExecFwk::ElementName &element, 294 DSchedEventState state, int32_t ret, EventNotify &event); 295 void GetCurDestCollaborateEvent(const CallerInfo &callerInfo, const AppExecFwk::ElementName &element, 296 DSchedEventState state, int32_t ret, EventNotify &event); 297 void NotifyCollaborateEventWithSessions(const std::list<ConnectAbilitySession> &sessionsList, 298 DSchedEventState state, int32_t ret); 299 bool CheckCallingUid(); 300 301 private: 302 std::shared_ptr<DSchedContinuation> dschedContinuation_; 303 std::shared_ptr<DSchedCollaborationCallbackMgr> collaborateCbMgr_; 304 std::map<sptr<IRemoteObject>, std::list<ConnectAbilitySession>> distributedConnectAbilityMap_; 305 std::map<sptr<IRemoteObject>, ConnectInfo> connectAbilityMap_; 306 std::unordered_map<int32_t, uint32_t> trackingUidMap_; 307 std::mutex distributedLock_; 308 std::mutex connectLock_; 309 sptr<IRemoteObject::DeathRecipient> connectDeathRecipient_; 310 #ifdef SUPPORT_DISTRIBUTED_FORM_SHARE 311 sptr<IRemoteObject::DeathRecipient> formMgrDeathRecipient_; 312 sptr<AppExecFwk::IFormMgr> formMgrProxy_; 313 std::mutex formMgrLock_; 314 #endif 315 std::mutex calleeLock_; 316 std::map<sptr<IRemoteObject>, ConnectInfo> calleeMap_; 317 sptr<IRemoteObject::DeathRecipient> callerDeathRecipient_; 318 std::shared_ptr<DmsCallbackTask> dmsCallbackTask_; 319 std::shared_ptr<AppExecFwk::EventHandler> componentChangeHandler_; 320 std::mutex callerLock_; 321 std::map<sptr<IRemoteObject>, std::list<ConnectAbilitySession>> callerMap_; 322 sptr<IRemoteObject::DeathRecipient> callerDeathRecipientForLocalDevice_; 323 std::mutex observerLock_; 324 std::map<sptr<IRemoteObject>, ObserverInfo> observerMap_; 325 std::mutex callLock_; 326 std::map<sptr<IRemoteObject>, CallInfo> callMap_; 327 std::mutex tokenMutex_; 328 std::mutex registerMutex_; 329 std::atomic<int32_t> token_ {0}; 330 std::map<std::string, sptr<AppStateObserver>> bundleNameMap_; 331 sptr<DistributedMissionFocusedListener> missionFocusedListener_ = nullptr; 332 }; 333 334 class ConnectAbilitySession { 335 public: 336 ConnectAbilitySession(const std::string& sourceDeviceId, const std::string& destinationDeviceId, 337 const CallerInfo& callerInfo, TargetComponent targetComponent = TargetComponent::HARMONY_COMPONENT); 338 ~ConnectAbilitySession() = default; 339 GetSourceDeviceId()340 const std::string& GetSourceDeviceId() const 341 { 342 return sourceDeviceId_; 343 } 344 GetDestinationDeviceId()345 const std::string& GetDestinationDeviceId() const 346 { 347 return destinationDeviceId_; 348 } 349 GetElementsList()350 std::list<AppExecFwk::ElementName> GetElementsList() const 351 { 352 return elementsList_; 353 } 354 GetCallerInfo()355 CallerInfo GetCallerInfo() const 356 { 357 return callerInfo_; 358 } 359 GetTargetComponent()360 TargetComponent GetTargetComponent() const 361 { 362 return targetComponent_; 363 } 364 365 bool IsSameCaller(const CallerInfo& callerInfo); 366 void AddElement(const AppExecFwk::ElementName& element); 367 368 private: 369 std::string sourceDeviceId_; 370 std::string destinationDeviceId_; 371 std::list<AppExecFwk::ElementName> elementsList_; 372 CallerInfo callerInfo_; 373 TargetComponent targetComponent_; 374 }; 375 376 class CallerDeathRecipient : public IRemoteObject::DeathRecipient { 377 public: 378 CallerDeathRecipient() = default; CallerDeathRecipient(int32_t deviceType)379 explicit CallerDeathRecipient(int32_t deviceType) 380 { 381 deviceType_ = deviceType; 382 } 383 ~CallerDeathRecipient() override = default; 384 void OnRemoteDied(const wptr<IRemoteObject>& remote) override; 385 private: 386 int32_t deviceType_ = IDistributedSched::CALLEE; 387 }; 388 } // namespace DistributedSchedule 389 } // namespace OHOS 390 #endif // OHOS_DISTRIBUTED_SCHED_SERVICE_H 391