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_request( self: &mut AbilityStub, code: u32, data: Pin<&mut MessageParcel>, reply: Pin<&mut MessageParcel>, ) -> i3240         fn on_remote_request(
41             self: &mut AbilityStub,
42             code: u32,
43             data: Pin<&mut MessageParcel>,
44             reply: Pin<&mut MessageParcel>,
45         ) -> i32;
46 
dump(self: &mut AbilityStub, fd: i32, args: Vec<String>) -> i3247         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;
LoadSystemAbility(said: i32, timeout: i32) -> UniquePtr<SptrIRemoteObject>63         fn LoadSystemAbility(said: i32, timeout: i32) -> UniquePtr<SptrIRemoteObject>;
64 
LoadSystemAbilityWithCallback(said: i32, on_success: fn(), on_fail: fn()) -> i3265         fn LoadSystemAbilityWithCallback(said: i32, on_success: fn(), on_fail: fn()) -> i32;
66 
GetSystemAbility(said: i32) -> UniquePtr<SptrIRemoteObject>67         fn GetSystemAbility(said: i32) -> UniquePtr<SptrIRemoteObject>;
68 
GetContextManager() -> UniquePtr<SptrIRemoteObject>69         fn GetContextManager() -> UniquePtr<SptrIRemoteObject>;
70 
CheckSystemAbility(said: i32) -> UniquePtr<SptrIRemoteObject>71         fn CheckSystemAbility(said: i32) -> UniquePtr<SptrIRemoteObject>;
72 
GetSystemAbilityWithDeviceId( said: i32, deviceId: &CxxString, ) -> UniquePtr<SptrIRemoteObject>73         fn GetSystemAbilityWithDeviceId(
74             said: i32,
75             deviceId: &CxxString,
76         ) -> UniquePtr<SptrIRemoteObject>;
77 
RemoveSystemAbility(said: i32) -> i3278         fn RemoveSystemAbility(said: i32) -> i32;
79 
CheckSystemAbilityWithDeviceId( said: i32, deviceId: &CxxString, ) -> UniquePtr<SptrIRemoteObject>80         fn CheckSystemAbilityWithDeviceId(
81             said: i32,
82             deviceId: &CxxString,
83         ) -> UniquePtr<SptrIRemoteObject>;
84 
ListSystemAbilities() -> Vec<String>85         fn ListSystemAbilities() -> Vec<String>;
ListSystemAbilitiesWithDumpFlag(dump_flag: u32) -> Vec<String>86         fn ListSystemAbilitiesWithDumpFlag(dump_flag: u32) -> Vec<String>;
87 
SubscribeSystemAbility( said: i32, on_add: fn(i32, &str), on_remove: fn(i32, &str), ) -> UniquePtr<UnSubscribeSystemAbilityHandler>88         fn SubscribeSystemAbility(
89             said: i32,
90             on_add: fn(i32, &str),
91             on_remove: fn(i32, &str),
92         ) -> UniquePtr<UnSubscribeSystemAbilityHandler>;
93 
UnSubscribe(self: Pin<&mut UnSubscribeSystemAbilityHandler>)94         fn UnSubscribe(self: Pin<&mut UnSubscribeSystemAbilityHandler>);
AddOnDemandSystemAbilityInfo(said: i32, localAbilityManagerName: &str) -> i3295         fn AddOnDemandSystemAbilityInfo(said: i32, localAbilityManagerName: &str) -> i32;
96 
UnloadSystemAbility(said: i32) -> i3297         fn UnloadSystemAbility(said: i32) -> i32;
CancelUnloadSystemAbility(said: i32) -> i3298         fn CancelUnloadSystemAbility(said: i32) -> i32;
UnloadAllIdleSystemAbility() -> i3299         fn UnloadAllIdleSystemAbility() -> i32;
GetSystemProcessInfo(said: i32) -> SystemProcessInfo100         fn GetSystemProcessInfo(said: i32) -> SystemProcessInfo;
101 
GetRunningSystemProcess() -> Vec<SystemProcessInfo>102         fn GetRunningSystemProcess() -> Vec<SystemProcessInfo>;
SendStrategy( s_type: i32, saids: Vec<i32>, level: i32, action: Pin<&mut CxxString>, ) -> i32103         fn SendStrategy(
104             s_type: i32,
105             saids: Vec<i32>,
106             level: i32,
107             action: Pin<&mut CxxString>,
108         ) -> i32;
109 
GetCommonEventExtraDataIdlist( said: i32, extraids: &mut Vec<i64>, event_name: &CxxString, ) -> i32110         fn GetCommonEventExtraDataIdlist(
111             said: i32,
112             extraids: &mut Vec<i64>,
113             event_name: &CxxString,
114         ) -> i32;
115 
AddSystemAbility( said: i32, ability: Box<AbilityStub>, config: AddSystemAbilityConfig, ) -> i32116         fn AddSystemAbility(
117             said: i32,
118             ability: Box<AbilityStub>,
119             config: AddSystemAbilityConfig,
120         ) -> i32;
121 
SubscribeSystemProcess( on_start: fn(&SystemProcessInfo), on_stop: fn(&SystemProcessInfo), ) -> UniquePtr<UnSubscribeSystemProcessHandler>122         fn SubscribeSystemProcess(
123             on_start: fn(&SystemProcessInfo),
124             on_stop: fn(&SystemProcessInfo),
125         ) -> UniquePtr<UnSubscribeSystemProcessHandler>;
126 
UnSubscribe(self: Pin<&mut UnSubscribeSystemProcessHandler>)127         fn UnSubscribe(self: Pin<&mut UnSubscribeSystemProcessHandler>);
128 
GetOnDemandReasonExtraData(extra_data_id: i64, parcel: Pin<&mut MessageParcel>) -> i32129         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 {
new<A: RemoteStub + 'static>(remote: A) -> Self138     pub fn new<A: RemoteStub + 'static>(remote: A) -> Self {
139         Self {
140             remote: RemoteStubWrapper::new(remote),
141         }
142     }
143 
on_remote_request( &mut self, code: u32, data: Pin<&mut MessageParcel>, reply: Pin<&mut MessageParcel>, ) -> i32144     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 
dump(&mut self, fd: i32, args: Vec<String>) -> i32153     fn dump(&mut self, fd: i32, args: Vec<String>) -> i32 {
154         self.remote.dump(fd, args)
155     }
156 }
157