1a34a8711Sopenharmony_ci// Copyright (C) 2024 Huawei Device Co., Ltd. 2a34a8711Sopenharmony_ci// Licensed under the Apache License, Version 2.0 (the "License"); 3a34a8711Sopenharmony_ci// you may not use this file except in compliance with the License. 4a34a8711Sopenharmony_ci// You may obtain a copy of the License at 5a34a8711Sopenharmony_ci// 6a34a8711Sopenharmony_ci// http://www.apache.org/licenses/LICENSE-2.0 7a34a8711Sopenharmony_ci// 8a34a8711Sopenharmony_ci// Unless required by applicable law or agreed to in writing, software 9a34a8711Sopenharmony_ci// distributed under the License is distributed on an "AS IS" BASIS, 10a34a8711Sopenharmony_ci// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 11a34a8711Sopenharmony_ci// See the License for the specific language governing permissions and 12a34a8711Sopenharmony_ci// limitations under the License. 13a34a8711Sopenharmony_ci 14a34a8711Sopenharmony_ciuse std::fs::File; 15a34a8711Sopenharmony_ciuse std::sync::Arc; 16a34a8711Sopenharmony_ci 17a34a8711Sopenharmony_ciuse crate::parcel::MsgParcel; 18a34a8711Sopenharmony_ciuse crate::IpcResult; 19a34a8711Sopenharmony_ci 20a34a8711Sopenharmony_ci/// Impl this trait to build a remote stub, that can be published to 21a34a8711Sopenharmony_ci/// SystemAbilityManager and handle remote requests. 22a34a8711Sopenharmony_cipub trait RemoteStub { 23a34a8711Sopenharmony_ci /// core method for RemoteStub, that handle remote request. 24a34a8711Sopenharmony_ci fn on_remote_request(&self, code: u32, data: &mut MsgParcel, reply: &mut MsgParcel) -> i32; 25a34a8711Sopenharmony_ci 26a34a8711Sopenharmony_ci /// Dump the contents. 27a34a8711Sopenharmony_ci fn dump(&self, _file: File, _args: Vec<String>) -> i32 { 28a34a8711Sopenharmony_ci 0 29a34a8711Sopenharmony_ci } 30a34a8711Sopenharmony_ci 31a34a8711Sopenharmony_ci // RemoteStub Descriptor 32a34a8711Sopenharmony_ci fn descriptor(&self) -> &'static str { 33a34a8711Sopenharmony_ci "" 34a34a8711Sopenharmony_ci } 35a34a8711Sopenharmony_ci} 36a34a8711Sopenharmony_ci 37a34a8711Sopenharmony_ciimpl<R: RemoteStub> RemoteStub for Arc<R> { 38a34a8711Sopenharmony_ci fn on_remote_request(&self, code: u32, data: &mut MsgParcel, reply: &mut MsgParcel) -> i32 { 39a34a8711Sopenharmony_ci R::on_remote_request(self, code, data, reply) 40a34a8711Sopenharmony_ci } 41a34a8711Sopenharmony_ci 42a34a8711Sopenharmony_ci fn dump(&self, file: File, args: Vec<String>) -> i32 { 43a34a8711Sopenharmony_ci R::dump(self, file, args) 44a34a8711Sopenharmony_ci } 45a34a8711Sopenharmony_ci fn descriptor(&self) -> &'static str { 46a34a8711Sopenharmony_ci R::descriptor(self) 47a34a8711Sopenharmony_ci } 48a34a8711Sopenharmony_ci} 49a34a8711Sopenharmony_ci 50a34a8711Sopenharmony_ci#[cfg(test)] 51a34a8711Sopenharmony_cimod test { 52a34a8711Sopenharmony_ci use std::fs::{self, OpenOptions}; 53a34a8711Sopenharmony_ci use std::os::fd::AsRawFd; 54a34a8711Sopenharmony_ci 55a34a8711Sopenharmony_ci use super::*; 56a34a8711Sopenharmony_ci use crate::remote::RemoteObj; 57a34a8711Sopenharmony_ci 58a34a8711Sopenharmony_ci const TEST_NUM: i32 = 2024; 59a34a8711Sopenharmony_ci struct TestStub; 60a34a8711Sopenharmony_ci impl RemoteStub for TestStub { 61a34a8711Sopenharmony_ci fn on_remote_request(&self, code: u32, data: &mut MsgParcel, reply: &mut MsgParcel) -> i32 { 62a34a8711Sopenharmony_ci 0 63a34a8711Sopenharmony_ci } 64a34a8711Sopenharmony_ci fn dump(&self, _file: File, _args: Vec<String>) -> i32 { 65a34a8711Sopenharmony_ci TEST_NUM 66a34a8711Sopenharmony_ci } 67a34a8711Sopenharmony_ci fn descriptor(&self) -> &'static str { 68a34a8711Sopenharmony_ci "TEST STUB" 69a34a8711Sopenharmony_ci } 70a34a8711Sopenharmony_ci } 71a34a8711Sopenharmony_ci 72a34a8711Sopenharmony_ci #[test] 73a34a8711Sopenharmony_ci fn remote_stub() { 74a34a8711Sopenharmony_ci let remote = RemoteObj::from_stub(TestStub).unwrap(); 75a34a8711Sopenharmony_ci assert_eq!("TEST STUB", remote.interface_descriptor().unwrap()); 76a34a8711Sopenharmony_ci let file = File::create("ipc_rust_test_temp").unwrap(); 77a34a8711Sopenharmony_ci assert_eq!(TEST_NUM, remote.dump(file.as_raw_fd(), &[])); 78a34a8711Sopenharmony_ci fs::remove_file("ipc_rust_test_temp").unwrap(); 79a34a8711Sopenharmony_ci } 80a34a8711Sopenharmony_ci} 81