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