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