1 // Copyright (C) 2024 Huawei Device Co., Ltd.
2 // Licensed under the Apache License, Version 2.0 (the "License");
3 // you may not use this file except in compliance with the License.
4 // You may obtain a copy of the License at
5 //
6 //     http://www.apache.org/licenses/LICENSE-2.0
7 //
8 // Unless required by applicable law or agreed to in writing, software
9 // distributed under the License is distributed on an "AS IS" BASIS,
10 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
11 // See the License for the specific language governing permissions and
12 // limitations under the License.
13 
14 use std::pin::Pin;
15 
16 pub(crate) use ffi::*;
17 use ipc::cxx_share::RemoteStubWrapper;
18 use ipc::remote::RemoteStub;
19 
20 #[cxx::bridge(namespace = "OHOS::SamgrRust")]
21 mod ffi {
22 
23     #[derive(Debug)]
24     struct SystemProcessInfo {
25         processName: String,
26         pid: i32,
27         uid: i32,
28     }
29 
30     struct AddSystemAbilityConfig {
31         is_distributed: bool,
32         dump_flags: u32,
33         capability: String,
34         permission: String,
35     }
36 
37     extern "Rust" {
38         type AbilityStub;
39 
on_remote_requestnull40         fn on_remote_request(
41             self: &mut AbilityStub,
42             code: u32,
43             data: Pin<&mut MessageParcel>,
44             reply: Pin<&mut MessageParcel>,
45         ) -> i32;
46 
dumpnull47         fn dump(self: &mut AbilityStub, fd: i32, args: Vec<String>) -> i32;
48 
49     }
50 
51     unsafe extern "C++" {
52         include!("system_ability_manager_wrapper.h");
53         include!("status_change_wrapper.h");
54 
55         #[namespace = OHOS]
56         type SptrIRemoteObject = ipc::cxx_share::SptrIRemoteObject;
57 
58         #[namespace = "OHOS"]
59         type MessageParcel = ipc::cxx_share::MessageParcel;
60 
61         pub type UnSubscribeSystemAbilityHandler;
62         pub type UnSubscribeSystemProcessHandler;
LoadSystemAbilitynull63         fn LoadSystemAbility(said: i32, timeout: i32) -> UniquePtr<SptrIRemoteObject>;
64 
LoadSystemAbilityWithCallbacknull65         fn LoadSystemAbilityWithCallback(said: i32, on_success: fn(), on_fail: fn()) -> i32;
66 
GetSystemAbilitynull67         fn GetSystemAbility(said: i32) -> UniquePtr<SptrIRemoteObject>;
68 
GetContextManagernull69         fn GetContextManager() -> UniquePtr<SptrIRemoteObject>;
70 
CheckSystemAbilitynull71         fn CheckSystemAbility(said: i32) -> UniquePtr<SptrIRemoteObject>;
72 
GetSystemAbilityWithDeviceIdnull73         fn GetSystemAbilityWithDeviceId(
74             said: i32,
75             deviceId: &CxxString,
76         ) -> UniquePtr<SptrIRemoteObject>;
77 
RemoveSystemAbilitynull78         fn RemoveSystemAbility(said: i32) -> i32;
79 
CheckSystemAbilityWithDeviceIdnull80         fn CheckSystemAbilityWithDeviceId(
81             said: i32,
82             deviceId: &CxxString,
83         ) -> UniquePtr<SptrIRemoteObject>;
84 
ListSystemAbilitiesnull85         fn ListSystemAbilities() -> Vec<String>;
ListSystemAbilitiesWithDumpFlagnull86         fn ListSystemAbilitiesWithDumpFlag(dump_flag: u32) -> Vec<String>;
87 
SubscribeSystemAbilitynull88         fn SubscribeSystemAbility(
89             said: i32,
90             on_add: fn(i32, &str),
91             on_remove: fn(i32, &str),
92         ) -> UniquePtr<UnSubscribeSystemAbilityHandler>;
93 
UnSubscribenull94         fn UnSubscribe(self: Pin<&mut UnSubscribeSystemAbilityHandler>);
AddOnDemandSystemAbilityInfonull95         fn AddOnDemandSystemAbilityInfo(said: i32, localAbilityManagerName: &str) -> i32;
96 
UnloadSystemAbilitynull97         fn UnloadSystemAbility(said: i32) -> i32;
CancelUnloadSystemAbilitynull98         fn CancelUnloadSystemAbility(said: i32) -> i32;
UnloadAllIdleSystemAbilitynull99         fn UnloadAllIdleSystemAbility() -> i32;
GetSystemProcessInfonull100         fn GetSystemProcessInfo(said: i32) -> SystemProcessInfo;
101 
GetRunningSystemProcessnull102         fn GetRunningSystemProcess() -> Vec<SystemProcessInfo>;
SendStrategynull103         fn SendStrategy(
104             s_type: i32,
105             saids: Vec<i32>,
106             level: i32,
107             action: Pin<&mut CxxString>,
108         ) -> i32;
109 
GetCommonEventExtraDataIdlistnull110         fn GetCommonEventExtraDataIdlist(
111             said: i32,
112             extraids: &mut Vec<i64>,
113             event_name: &CxxString,
114         ) -> i32;
115 
AddSystemAbilitynull116         fn AddSystemAbility(
117             said: i32,
118             ability: Box<AbilityStub>,
119             config: AddSystemAbilityConfig,
120         ) -> i32;
121 
SubscribeSystemProcessnull122         fn SubscribeSystemProcess(
123             on_start: fn(&SystemProcessInfo),
124             on_stop: fn(&SystemProcessInfo),
125         ) -> UniquePtr<UnSubscribeSystemProcessHandler>;
126 
UnSubscribenull127         fn UnSubscribe(self: Pin<&mut UnSubscribeSystemProcessHandler>);
128 
GetOnDemandReasonExtraDatanull129         fn GetOnDemandReasonExtraData(extra_data_id: i64, parcel: Pin<&mut MessageParcel>) -> i32;
130     }
131 }
132 
133 pub struct AbilityStub {
134     remote: RemoteStubWrapper,
135 }
136 
137 impl AbilityStub {
newnull138     pub fn new<A: RemoteStub + 'static>(remote: A) -> Self {
139         Self {
140             remote: RemoteStubWrapper::new(remote),
141         }
142     }
143 
on_remote_requestnull144     fn on_remote_request(
145         &mut self,
146         code: u32,
147         data: Pin<&mut MessageParcel>,
148         reply: Pin<&mut MessageParcel>,
149     ) -> i32 {
150         self.remote.on_remote_request(code, data, reply)
151     }
152 
dumpnull153     fn dump(&mut self, fd: i32, args: Vec<String>) -> i32 {
154         self.remote.dump(fd, args)
155     }
156 }
157