/* * Copyright (c) 2021-2023 Huawei Device Co., Ltd. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #ifndef OHOS_DISTRIBUTED_SCHED_SERVICE_H #define OHOS_DISTRIBUTED_SCHED_SERVICE_H #include #include #include #include #include "app_mgr_interface.h" #include "app_state_observer.h" #include "distributed_sched_stub.h" #include "distributed_sched_continuation.h" #include "dms_callback_task.h" #ifdef SUPPORT_DISTRIBUTED_FORM_SHARE #include "form_mgr_interface.h" #endif #include "iremote_object.h" #include "iremote_proxy.h" #ifdef SUPPORT_DISTRIBUTED_MISSION_MANAGER #include "mission/distributed_mission_info.h" #include "nocopyable.h" #endif #include "single_instance.h" #include "system_ability.h" namespace OHOS { namespace DistributedSchedule { class ConnectAbilitySession; enum class ServiceRunningState { STATE_NO_START, STATE_RUNNING }; enum class TargetComponent { HARMONY_COMPONENT, }; struct ConnectInfo { CallerInfo callerInfo; sptr callbackWrapper; AppExecFwk::ElementName element; }; struct ProcessDiedNotifyInfo { std::string remoteDeviceId; CallerInfo callerInfo; TargetComponent targetComponent; }; struct CallInfo { int32_t connectToken; std::string remoteDeviceId; }; struct ObserverInfo { sptr appStateObserver; std::string srcDeviceId; int32_t connectToken; std::string dstBundleName; std::string dstAbilityName; sptr srcConnect; sptr token; }; class DistributedSchedService : public SystemAbility, public DistributedSchedStub { DECLARE_SYSTEM_ABILITY(DistributedSchedService); DECLARE_SINGLE_INSTANCE_BASE(DistributedSchedService); public: ~DistributedSchedService() = default; void OnStart() override; void OnStop() override; int32_t Dump(int32_t fd, const std::vector& args) override; void DeviceOnlineNotify(const std::string& deviceId); void DeviceOfflineNotify(const std::string& deviceId); int32_t StartRemoteAbility(const OHOS::AAFwk::Want& want, int32_t callerUid, int32_t requestCode, uint32_t accessToken) override; int32_t StartAbilityFromRemote(const OHOS::AAFwk::Want& want, const OHOS::AppExecFwk::AbilityInfo& abilityInfo, int32_t requestCode, const CallerInfo& callerInfo, const AccountInfo& accountInfo) override; int32_t SendResultFromRemote(OHOS::AAFwk::Want& want, int32_t requestCode, const CallerInfo& callerInfo, const AccountInfo& accountInfo, int32_t resultCode) override; int32_t ContinueMission(const std::string& srcDeviceId, const std::string& dstDeviceId, int32_t missionId, const sptr& callback, const OHOS::AAFwk::WantParams& wantParams) override; int32_t ContinueMission(const std::string& srcDeviceId, const std::string& dstDeviceId, const std::string& bundleName, const sptr& callback, const OHOS::AAFwk::WantParams& wantParams) override; int32_t DealDSchedEventResult(const OHOS::AAFwk::Want& want, int32_t status); int32_t StartContinuation(const OHOS::AAFwk::Want& want, int32_t missionId, int32_t callerUid, int32_t status, uint32_t accessToken) override; void NotifyCompleteContinuation(const std::u16string& devId, int32_t sessionId, bool isSuccess) override; int32_t NotifyContinuationResultFromRemote(int32_t sessionId, bool isSuccess) override; int32_t NotifyDSchedEventResultFromRemote(const std::string type, int32_t dSchedEventResult) override; void NotifyContinuationCallbackResult(int32_t missionId, int32_t resultCode); void NotifyDSchedEventCallbackResult(const std::string type, int32_t resultCode); int32_t NotifyFreeInstallResult(const CallbackTaskItem item, int32_t resultCode); int32_t ConnectRemoteAbility(const OHOS::AAFwk::Want& want, const sptr& connect, int32_t callerUid, int32_t callerPid, uint32_t accessToken) override; int32_t DisconnectRemoteAbility(const sptr& connect, int32_t callerUid, uint32_t accessToken) override; int32_t ConnectAbilityFromRemote(const OHOS::AAFwk::Want& want, const AppExecFwk::AbilityInfo& abilityInfo, const sptr& connect, const CallerInfo& callerInfo, const AccountInfo& accountInfo) override; int32_t DisconnectAbilityFromRemote(const sptr& connect, int32_t uid, const std::string& sourceDeviceId) override; int32_t NotifyProcessDiedFromRemote(const CallerInfo& callerInfo) override; #ifdef SUPPORT_DISTRIBUTED_MISSION_MANAGER int32_t GetMissionInfos(const std::string& deviceId, int32_t numMissions, std::vector& missionInfos) override; int32_t NotifyMissionsChangedFromRemote(const std::vector& missionInfos, const CallerInfo& callerInfo) override; int32_t GetRemoteMissionSnapshotInfo(const std::string& networkId, int32_t missionId, std::unique_ptr& missionSnapshot) override; int32_t StartSyncRemoteMissions(const std::string& devId, bool fixConflict, int64_t tag) override; int32_t StartSyncMissionsFromRemote(const CallerInfo& callerInfo, std::vector& missionInfos) override; int32_t StopSyncRemoteMissions(const std::string& devId) override; int32_t StopSyncMissionsFromRemote(const CallerInfo& callerInfo) override; int32_t RegisterMissionListener(const std::u16string& devId, const sptr& obj) override; int32_t RegisterDSchedEventListener(const std::string& type, const sptr& obj) override; int32_t UnRegisterDSchedEventListener(const std::string& type, const sptr& obj) override; int32_t RegisterOnListener(const std::string& type, const sptr& obj) override; int32_t RegisterOffListener(const std::string& type, const sptr& obj) override; int32_t UnRegisterMissionListener(const std::u16string& devId, const sptr& obj) override; int32_t SetMissionContinueState(int32_t missionId, const AAFwk::ContinueState &state) override; #endif void ProcessConnectDied(const sptr& connect); void ProcessDeviceOffline(const std::string& deviceId); void DumpConnectInfo(std::string& info); void DumpSessionsLocked(const std::list& sessionsList, std::string& info); void DumpElementLocked(const std::list& elementsList, std::string& info); int32_t StartRemoteAbilityByCall(const OHOS::AAFwk::Want& want, const sptr& connect, int32_t callerUid, int32_t callerPid, uint32_t accessToken) override; int32_t ReleaseRemoteAbility(const sptr& connect, const AppExecFwk::ElementName &element) override; int32_t StartAbilityByCallFromRemote(const OHOS::AAFwk::Want& want, const sptr& connect, const CallerInfo& callerInfo, const AccountInfo& accountInfo) override; int32_t ReleaseAbilityFromRemote(const sptr& connect, const AppExecFwk::ElementName &element, const CallerInfo& callerInfo) override; #ifdef SUPPORT_DISTRIBUTED_FORM_SHARE int32_t StartRemoteShareForm(const std::string& remoteDeviceId, const AppExecFwk::FormShareInfo& formShareInfo) override; int32_t StartShareFormFromRemote( const std::string& remoteDeviceId, const AppExecFwk::FormShareInfo& formShareInfo) override; void ProcessFormMgrDied(const wptr& remote); #endif void ProcessCallerDied(const sptr& connect, int32_t deviceType); void ProcessCalleeDied(const sptr& connect); void ProcessCallResult(const sptr& calleeConnect, const sptr& callerConnect); int32_t StartRemoteFreeInstall(const OHOS::AAFwk::Want& want, int32_t callerUid, int32_t requestCode, uint32_t accessToken, const sptr& callback) override; int32_t StartFreeInstallFromRemote(const FreeInstallInfo& info, int64_t taskId) override; int32_t NotifyCompleteFreeInstallFromRemote(int64_t taskId, int32_t resultCode) override; int32_t NotifyCompleteFreeInstall(const FreeInstallInfo& info, int64_t taskId, int32_t resultCode); int32_t GetDistributedComponentList(std::vector& distributedComponents) override; void SetContinuationTimeout(int32_t missionId, int32_t timeout); void RemoveContinuationTimeout(int32_t missionId); std::string GetContinuaitonDevice(int32_t missionId); int32_t NotifyStateChangedFromRemote(int32_t abilityState, int32_t connectToken, const AppExecFwk::ElementName& element) override; int32_t NotifyStateChanged(int32_t abilityState, AppExecFwk::ElementName& element, const sptr& token); int32_t StopRemoteExtensionAbility(const OHOS::AAFwk::Want& want, int32_t callerUid, uint32_t accessToken, int32_t extensionType) override; int32_t StopExtensionAbilityFromRemote(const OHOS::AAFwk::Want& remoteWant, const CallerInfo& callerInfo, const AccountInfo& accountInfo, int32_t extensionType) override; private: DistributedSchedService(); bool Init(); void InitCommonEventListener(); void RemoteConnectAbilityMappingLocked(const sptr& connect, const std::string& localDeviceId, const std::string& remoteDeviceId, const AppExecFwk::ElementName& element, const CallerInfo& callerInfo, TargetComponent targetComponent); int32_t DisconnectEachRemoteAbilityLocked(const std::string& localDeviceId, const std::string& remoteDeviceId, const sptr& connect); sptr GetRemoteDms(const std::string& remoteDeviceId); static bool GetLocalDeviceId(std::string& localDeviceId); bool CheckDeviceId(const std::string& localDeviceId, const std::string& remoteDeviceId); bool CheckDeviceIdFromRemote(const std::string& localDeviceId, const std::string& destinationDeviceId, const std::string& sourceDeviceId); void NotifyDeviceOfflineToAppLocked(const sptr& connect, const ConnectAbilitySession& session); int32_t NotifyApp(const sptr& connect, const AppExecFwk::ElementName& element, int32_t errCode); void NotifyProcessDiedAll(const std::list& notifyList); void NotifyProcessDied(const std::string& remoteDeviceId, const CallerInfo& callerInfo, TargetComponent targetComponent); int32_t CheckDistributedConnectLocked(const CallerInfo& callerInfo) const; void DecreaseConnectLocked(int32_t uid); static int32_t GetUidLocked(const std::list& sessionList); int32_t TryConnectRemoteAbility(const OHOS::AAFwk::Want& want, const sptr& connect, const CallerInfo& callerInfo); int32_t ContinueLocalMissionDealFreeInstall(OHOS::AAFwk::Want& want, int32_t missionId, const std::string& dstDeviceId, const sptr& callback); #ifdef SUPPORT_DISTRIBUTED_FORM_SHARE sptr GetFormMgrProxy(); #endif int32_t CleanMission(int32_t missionId); int32_t SetCallerInfo(int32_t callerUid, std::string localDeviceId, uint32_t accessToken, CallerInfo& callerInfo); int32_t SetWantForContinuation(AAFwk::Want& newWant, int32_t missionId); int32_t ContinueLocalMission(const std::string& dstDeviceId, int32_t missionId, const sptr& callback, const OHOS::AAFwk::WantParams& wantParams); int32_t ContinueAbilityWithTimeout(const std::string& dstDeviceId, int32_t missionId, const sptr& callback, uint32_t remoteBundleVersion = 0); int32_t ContinueRemoteMission(const std::string& srcDeviceId, const std::string& dstDeviceId, int32_t missionId, const sptr& callback, const OHOS::AAFwk::WantParams& wantParams); int32_t ContinueRemoteMission(const std::string& srcDeviceId, const std::string& dstDeviceId, const std::string& bundleName, const sptr& callback, const OHOS::AAFwk::WantParams& wantParams); int32_t TryStartRemoteAbilityByCall(const OHOS::AAFwk::Want& want, const sptr& connect, const CallerInfo& callerInfo); int32_t StartLocalAbility(const FreeInstallInfo& info, int64_t taskId, int32_t resultCode); int32_t StartAbility(const OHOS::AAFwk::Want& want, int32_t requestCode); int32_t HandleRemoteNotify(const FreeInstallInfo& info, int64_t taskId, int32_t resultCode); void ReportDistributedComponentChange(const CallerInfo& callerInfo, int32_t changeType, int32_t componentType, int32_t deviceType); void ReportDistributedComponentChange(const ConnectInfo& connectInfo, int32_t changeType, int32_t componentType, int32_t deviceType); void HandleLocalCallerDied(const sptr& connect); void SaveCallerComponent(const OHOS::AAFwk::Want& want, const sptr& connect, const CallerInfo& callerInfo); void RemoveCallerComponent(const sptr& connect); void ProcessCalleeOffline(const std::string& deviceId); void GetConnectComponentList(std::vector& distributedComponents); void GetCallComponentList(std::vector& distributedComponents); void ProcessFreeInstallOffline(const std::string& deviceId); bool RegisterAppStateObserver(const OHOS::AAFwk::Want& want, const CallerInfo& callerInfo, const sptr& srcConnect, const sptr& callbackWrapper); void UnregisterAppStateObserver(const sptr& callbackWrapper); sptr GetAppManager(); int32_t CheckTargetPermission(const OHOS::AAFwk::Want& want, const CallerInfo& callerInfo, const AccountInfo& accountInfo, int32_t flag, bool needQueryExtension); int32_t SaveConnectToken(const OHOS::AAFwk::Want& want, const sptr& connect); void SetCleanMissionFlag(const OHOS::AAFwk::Want& want, int32_t missionId); void RemoveConnectAbilityInfo(const std::string& deviceId); ErrCode QueryOsAccount(int32_t& activeAccountId); std::shared_ptr dschedContinuation_; std::map, std::list> distributedConnectAbilityMap_; std::map, ConnectInfo> connectAbilityMap_; std::unordered_map trackingUidMap_; std::mutex distributedLock_; std::mutex connectLock_; sptr connectDeathRecipient_; #ifdef SUPPORT_DISTRIBUTED_FORM_SHARE sptr formMgrDeathRecipient_; sptr formMgrProxy_; std::mutex formMgrLock_; #endif std::mutex calleeLock_; std::map, ConnectInfo> calleeMap_; sptr callerDeathRecipient_; std::shared_ptr dmsCallbackTask_; std::shared_ptr componentChangeHandler_; std::mutex callerLock_; std::map, std::list> callerMap_; sptr callerDeathRecipientForLocalDevice_; std::mutex observerLock_; std::map, ObserverInfo> observerMap_; std::mutex callLock_; std::map, CallInfo> callMap_; std::mutex tokenMutex_; std::mutex registerMutex_; std::atomic token_ {0}; std::map> bundleNameMap_; }; class ConnectAbilitySession { public: ConnectAbilitySession(const std::string& sourceDeviceId, const std::string& destinationDeviceId, const CallerInfo& callerInfo, TargetComponent targetComponent = TargetComponent::HARMONY_COMPONENT); ~ConnectAbilitySession() = default; const std::string& GetSourceDeviceId() const { return sourceDeviceId_; } const std::string& GetDestinationDeviceId() const { return destinationDeviceId_; } std::list GetElementsList() const { return elementsList_; } CallerInfo GetCallerInfo() const { return callerInfo_; } TargetComponent GetTargetComponent() const { return targetComponent_; } bool IsSameCaller(const CallerInfo& callerInfo); void AddElement(const AppExecFwk::ElementName& element); private: std::string sourceDeviceId_; std::string destinationDeviceId_; std::list elementsList_; CallerInfo callerInfo_; TargetComponent targetComponent_; }; class CallerDeathRecipient : public IRemoteObject::DeathRecipient { public: CallerDeathRecipient() = default; explicit CallerDeathRecipient(int32_t deviceType) { deviceType_ = deviceType; } ~CallerDeathRecipient() override = default; void OnRemoteDied(const wptr& remote) override; private: int32_t deviceType_ = IDistributedSched::CALLEE; }; } // namespace DistributedSchedule } // namespace OHOS #endif // OHOS_DISTRIBUTED_SCHED_SERVICE_H