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