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 cxx::{let_cxx_string, UniquePtr}; 15 use ipc::parcel::MsgParcel; 16 use ipc::remote::{RemoteObj, RemoteStub}; 17 18 use crate::wrapper::{ 19 GetCommonEventExtraDataIdlist, 20 AbilityStub, AddOnDemandSystemAbilityInfo, AddSystemAbility, AddSystemAbilityConfig, 21 CancelUnloadSystemAbility, CheckSystemAbility, CheckSystemAbilityWithDeviceId, 22 GetContextManager, GetOnDemandReasonExtraData, GetRunningSystemProcess, GetSystemAbility, 23 GetSystemAbilityWithDeviceId, GetSystemProcessInfo, ListSystemAbilities, 24 ListSystemAbilitiesWithDumpFlag, LoadSystemAbility, LoadSystemAbilityWithCallback, 25 RemoveSystemAbility, SendStrategy, SubscribeSystemAbility, SubscribeSystemProcess, 26 SystemProcessInfo, UnSubscribeSystemAbilityHandler, UnSubscribeSystemProcessHandler, 27 UnloadAllIdleSystemAbility, UnloadSystemAbility, 28 }; 29 use crate::DumpFlagPriority; 30 31 pub struct SystemAbilityManager; 32 33 unsafe impl Sync for SystemAbilityManager {} 34 unsafe impl Send for SystemAbilityManager {} 35 36 impl SystemAbilityManager { 37 /// # Example 38 /// ```rust 39 /// use samgr::manage::SystemAbilityManager; 40 /// 41 /// let context = SystemAbilityManager::get_context_manager(); 42 /// ``` get_context_manager() -> Option<RemoteObj>43 pub fn get_context_manager() -> Option<RemoteObj> { 44 info!("get context manager"); 45 RemoteObj::from_sptr(GetContextManager()) 46 } 47 48 /// let abilities = sysm.list_system_ability(); 49 /// 50 /// 51 /// # Example 52 /// ```rust 53 /// ``` list_system_abilities() -> Vec<String>54 pub fn list_system_abilities() -> Vec<String> { 55 info!("list system ability"); 56 ListSystemAbilities() 57 } 58 /// let abilities = sysm.list_system_ability(); 59 /// 60 /// 61 /// # Example 62 /// ```rust 63 /// ``` list_system_abilities_with_dump_flag(dump_flag: DumpFlagPriority) -> Vec<String>64 pub fn list_system_abilities_with_dump_flag(dump_flag: DumpFlagPriority) -> Vec<String> { 65 info!("list system ability"); 66 ListSystemAbilitiesWithDumpFlag(dump_flag as u32) 67 } 68 69 /// # Example 70 /// ```rust 71 /// use samgr::manage::SystemAbilityManager; 72 /// 73 /// let request_abilty = SystemAbilityManager::get_system_ability(3706, None); 74 /// ``` get_system_ability(said: i32) -> Option<RemoteObj>75 pub fn get_system_ability(said: i32) -> Option<RemoteObj> { 76 info!("get system ability {}", said); 77 RemoteObj::from_sptr(GetSystemAbility(said)) 78 } 79 80 /// # Example 81 /// ```rust 82 /// use samgr::manage::SystemAbilityManager; 83 /// ``` get_system_ability_with_device_id(said: i32, device_id: &str) -> Option<RemoteObj>84 pub fn get_system_ability_with_device_id(said: i32, device_id: &str) -> Option<RemoteObj> { 85 info!("get system ability {} with device id", said); 86 let_cxx_string!(id = device_id); 87 RemoteObj::from_sptr(GetSystemAbilityWithDeviceId(said, &id)) 88 } 89 90 /// # Example 91 /// ```rust 92 /// use samgr::definition::DOWNLOAD_SERVICE_ID; 93 /// use samgr::manage::SystemAbilityManager; 94 /// 95 /// let download_service = SystemAbilityManager::check_system_ability(DOWNLOAD_SERVICE_ID).unwrap(); 96 /// ``` check_system_ability(said: i32) -> Option<RemoteObj>97 pub fn check_system_ability(said: i32) -> Option<RemoteObj> { 98 info!("check system ability {}", said); 99 100 RemoteObj::from_sptr(CheckSystemAbility(said)) 101 } 102 check_system_ability_with_ability(said: i32, device_id: &str) -> Option<RemoteObj>103 pub fn check_system_ability_with_ability(said: i32, device_id: &str) -> Option<RemoteObj> { 104 info!("check system ability {} with device id", said); 105 let_cxx_string!(id = device_id); 106 RemoteObj::from_sptr(CheckSystemAbilityWithDeviceId(said, &id)) 107 } 108 109 /// # Example 110 /// ```rust 111 /// use samgr::definition::DOWNLOAD_SERVICE_ID; 112 /// use samgr::manage::SystemAbilityManager; 113 /// 114 /// SystemAbilityManager::remove_system_ability(DOWNLOAD_SERVICE_IDD); 115 /// ``` remove_system_ability(said: i32) -> i32116 pub fn remove_system_ability(said: i32) -> i32 { 117 info!("remove system ability {}", said); 118 RemoveSystemAbility(said) 119 } 120 121 /// Adds a new system ability add_systemability<A: RemoteStub + 'static>(said: i32, ability: A) -> i32122 pub fn add_systemability<A: RemoteStub + 'static>(said: i32, ability: A) -> i32 { 123 info!("add system ability {}", said); 124 let is_distributed = false; 125 let dump_flags = DumpFlagPriority::Default; 126 let capability = ""; 127 let permission = ""; 128 let stub = AbilityStub::new(ability); 129 AddSystemAbility( 130 said, 131 Box::new(stub), 132 AddSystemAbilityConfig { 133 is_distributed, 134 dump_flags: dump_flags as u32, 135 capability: capability.to_string(), 136 permission: permission.to_string(), 137 }, 138 ) 139 } 140 add_systemability_with_extra<A: RemoteStub + 'static>( said: i32, ability: A, is_distributed: bool, dump_flags: DumpFlagPriority, capability: &str, permission: &str, ) -> i32141 pub fn add_systemability_with_extra<A: RemoteStub + 'static>( 142 said: i32, 143 ability: A, 144 is_distributed: bool, 145 dump_flags: DumpFlagPriority, 146 capability: &str, 147 permission: &str, 148 ) -> i32 { 149 info!("add system ability {}", said); 150 let stub = AbilityStub::new(ability); 151 AddSystemAbility( 152 said, 153 Box::new(stub), 154 AddSystemAbilityConfig { 155 is_distributed, 156 dump_flags: dump_flags as u32, 157 capability: capability.to_string(), 158 permission: permission.to_string(), 159 }, 160 ) 161 } 162 load_system_ability(said: i32, timeout: i32) -> Option<RemoteObj>163 pub fn load_system_ability(said: i32, timeout: i32) -> Option<RemoteObj> { 164 info!("load system ability {}", said); 165 RemoteObj::from_sptr(LoadSystemAbility(said, timeout)) 166 } 167 load_system_ability_with_callback(said: i32, on_success: fn(), on_fail: fn()) -> i32168 pub fn load_system_ability_with_callback(said: i32, on_success: fn(), on_fail: fn()) -> i32 { 169 info!("load system ability {}", said); 170 LoadSystemAbilityWithCallback(said, on_success, on_fail) 171 } 172 subscribe_system_ability( said: i32, on_add: fn(i32, &str), on_remove: fn(i32, &str), ) -> UnsubscribeHandler173 pub fn subscribe_system_ability( 174 said: i32, 175 on_add: fn(i32, &str), 176 on_remove: fn(i32, &str), 177 ) -> UnsubscribeHandler { 178 info!("subscribe system ability {}", said); 179 UnsubscribeHandler::new(Unsubscribe::Ability(SubscribeSystemAbility( 180 said, on_add, on_remove, 181 ))) 182 } 183 184 /// # Example 185 /// ```rust 186 /// use samgr::definition::DOWNLOAD_SERVICE_ID; 187 /// use samgr::manage::SystemAbilityManager; 188 /// 189 /// SystemAbilityManager::remove_system_ability(DOWNLOAD_SERVICE_IDD); 190 /// ``` add_ondemand_system_ability_info(said: i32, local_ability_manager_name: &str) -> i32191 pub fn add_ondemand_system_ability_info(said: i32, local_ability_manager_name: &str) -> i32 { 192 info!("add ondemand system ability {} info", said); 193 194 AddOnDemandSystemAbilityInfo(said, local_ability_manager_name) 195 } 196 unload_system_ability(said: i32) -> i32197 pub fn unload_system_ability(said: i32) -> i32 { 198 info!("unload system ability {}", said); 199 UnloadSystemAbility(said) 200 } 201 cancel_unload_system_ability(said: i32) -> i32202 pub fn cancel_unload_system_ability(said: i32) -> i32 { 203 info!("cancel unload system ability {}", said); 204 CancelUnloadSystemAbility(said) 205 } 206 207 /// # Example 208 /// ```rust 209 /// use samgr::definition::DOWNLOAD_SERVICE_ID; 210 /// 211 /// SystemAbilityManager::unload_all_idle_system_ability(); 212 /// ``` unload_all_idle_system_ability(&self) -> i32213 pub fn unload_all_idle_system_ability(&self) -> i32 { 214 info!("unload all idle system ability"); 215 UnloadAllIdleSystemAbility() 216 } 217 get_system_process_info(said: i32) -> SystemProcessInfo218 pub fn get_system_process_info(said: i32) -> SystemProcessInfo { 219 info!("get system ability {} process info", said); 220 GetSystemProcessInfo(said) 221 } 222 get_running_system_process() -> Vec<SystemProcessInfo>223 pub fn get_running_system_process() -> Vec<SystemProcessInfo> { 224 info!("get running system ability process info"); 225 GetRunningSystemProcess() 226 } 227 228 /// send_strategy(s_type: i32, saids: Vec<i32>, level: i32, action: &str) -> i32229 pub fn send_strategy(s_type: i32, saids: Vec<i32>, level: i32, action: &str) -> i32 { 230 let_cxx_string!(action = action); 231 SendStrategy(s_type, saids, level, action) 232 } 233 get_common_event_extra_data_id_list(said: i32, extraids: &mut Vec<i64>, event_name: &str) -> i32234 pub fn get_common_event_extra_data_id_list(said: i32, extraids: &mut Vec<i64>, event_name: &str) -> i32 { 235 let_cxx_string!(event_name = event_name); 236 GetCommonEventExtraDataIdlist(said, extraids, &event_name) 237 } 238 subscribe_system_process( on_start: fn(&SystemProcessInfo), on_stop: fn(&SystemProcessInfo), ) -> UnsubscribeHandler239 pub fn subscribe_system_process( 240 on_start: fn(&SystemProcessInfo), 241 on_stop: fn(&SystemProcessInfo), 242 ) -> UnsubscribeHandler { 243 UnsubscribeHandler::new(Unsubscribe::Process(SubscribeSystemProcess( 244 on_start, on_stop, 245 ))) 246 } 247 get_on_demand_reason_extra_date(extra_data_id: i64, parcel: &mut MsgParcel) -> i32248 pub fn get_on_demand_reason_extra_date(extra_data_id: i64, parcel: &mut MsgParcel) -> i32 { 249 GetOnDemandReasonExtraData(extra_data_id, parcel.pin_mut().unwrap()) 250 } 251 } 252 253 enum Unsubscribe { 254 Ability(UniquePtr<UnSubscribeSystemAbilityHandler>), 255 Process(UniquePtr<UnSubscribeSystemProcessHandler>), 256 } 257 258 pub struct UnsubscribeHandler { 259 inner: Unsubscribe, 260 } 261 262 impl UnsubscribeHandler { new(inner: Unsubscribe) -> Self263 fn new(inner: Unsubscribe) -> Self { 264 Self { inner } 265 } 266 unsubscribe(self)267 pub fn unsubscribe(self) { 268 match self.inner { 269 Unsubscribe::Ability(mut p) => p.pin_mut().UnSubscribe(), 270 Unsubscribe::Process(mut p) => p.pin_mut().UnSubscribe(), 271 } 272 } 273 } 274