1ca0551cfSopenharmony_ci/*
2ca0551cfSopenharmony_ci * Copyright (C) 2023 Huawei Device Co., Ltd.
3ca0551cfSopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
4ca0551cfSopenharmony_ci * you may not use this file except in compliance with the License.
5ca0551cfSopenharmony_ci * You may obtain a copy of the License at
6ca0551cfSopenharmony_ci *
7ca0551cfSopenharmony_ci *     http://www.apache.org/licenses/LICENSE-2.0
8ca0551cfSopenharmony_ci *
9ca0551cfSopenharmony_ci * Unless required by applicable law or agreed to in writing, software
10ca0551cfSopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
11ca0551cfSopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12ca0551cfSopenharmony_ci * See the License for the specific language governing permissions and
13ca0551cfSopenharmony_ci * limitations under the License.
14ca0551cfSopenharmony_ci */
15ca0551cfSopenharmony_ci#![allow(unused_variables)]
16ca0551cfSopenharmony_ci
17ca0551cfSopenharmony_ci//! IPC test server
18ca0551cfSopenharmony_ci
19ca0551cfSopenharmony_ciextern crate ipc_rust;
20ca0551cfSopenharmony_ciextern crate rust_idl_ipc_test_service;
21ca0551cfSopenharmony_ci
22ca0551cfSopenharmony_ciuse std::ptr;
23ca0551cfSopenharmony_ciuse std::ffi::{c_char, CString};
24ca0551cfSopenharmony_ci
25ca0551cfSopenharmony_ciuse ipc_rust::{IRemoteBroker, join_work_thread, Result, add_service};
26ca0551cfSopenharmony_ciuse rust_idl_ipc_test_service::{IIdlTestService, IdlTestServiceStub};
27ca0551cfSopenharmony_ci
28ca0551cfSopenharmony_ciconst IPC_TEST_SERVICE_ID: i32 = 1118;
29ca0551cfSopenharmony_ci
30ca0551cfSopenharmony_ci#[repr(C)]
31ca0551cfSopenharmony_cistruct TokenInfoParams {
32ca0551cfSopenharmony_ci    dcaps_num: i32,
33ca0551cfSopenharmony_ci    perms_num: i32,
34ca0551cfSopenharmony_ci    acls_num: i32,
35ca0551cfSopenharmony_ci    dcaps: *const *const c_char,
36ca0551cfSopenharmony_ci    perms: *const *const c_char,
37ca0551cfSopenharmony_ci    acls: *const *const c_char,
38ca0551cfSopenharmony_ci    process_name: *const c_char,
39ca0551cfSopenharmony_ci    apl_str: *const c_char,
40ca0551cfSopenharmony_ci}
41ca0551cfSopenharmony_ci
42ca0551cfSopenharmony_cifn init_access_token()
43ca0551cfSopenharmony_ci{
44ca0551cfSopenharmony_ci    let name = CString::new("com.ipc.test").expect("process name is invalid");
45ca0551cfSopenharmony_ci    let apl = CString::new("normal").expect("apl string is invalid");
46ca0551cfSopenharmony_ci    let mut param = TokenInfoParams {
47ca0551cfSopenharmony_ci        dcaps_num: 0,
48ca0551cfSopenharmony_ci        perms_num: 0,
49ca0551cfSopenharmony_ci        acls_num: 0,
50ca0551cfSopenharmony_ci        dcaps: ptr::null(),
51ca0551cfSopenharmony_ci        perms: ptr::null(),
52ca0551cfSopenharmony_ci        acls: ptr::null(),
53ca0551cfSopenharmony_ci        process_name: name.as_ptr(),
54ca0551cfSopenharmony_ci        apl_str: apl.as_ptr(),
55ca0551cfSopenharmony_ci    };
56ca0551cfSopenharmony_ci
57ca0551cfSopenharmony_ci    unsafe {
58ca0551cfSopenharmony_ci        let token_id = GetAccessTokenId(&mut param as *mut TokenInfoParams);
59ca0551cfSopenharmony_ci        SetSelfTokenID(token_id);
60ca0551cfSopenharmony_ci    }
61ca0551cfSopenharmony_ci}
62ca0551cfSopenharmony_ci
63ca0551cfSopenharmony_ciextern "C" {
64ca0551cfSopenharmony_ci    fn GetAccessTokenId(tokenInfo: *mut TokenInfoParams) -> u64;
65ca0551cfSopenharmony_ci    fn SetSelfTokenID(tokenID: u64) -> i32;
66ca0551cfSopenharmony_ci}
67ca0551cfSopenharmony_ci
68ca0551cfSopenharmony_ci/// test.ipc.ITestService type
69ca0551cfSopenharmony_cipub struct TestService;
70ca0551cfSopenharmony_ci
71ca0551cfSopenharmony_ciimpl IIdlTestService for TestService {
72ca0551cfSopenharmony_ci    fn idl_ipc_test_basic_001(&self) -> Result<()> {
73ca0551cfSopenharmony_ci        println!("idl_ipc_test_basic_001 start");
74ca0551cfSopenharmony_ci        Ok(())
75ca0551cfSopenharmony_ci    }
76ca0551cfSopenharmony_ci
77ca0551cfSopenharmony_ci    fn idl_ipc_test_basic_002(&self) -> Result<()> {
78ca0551cfSopenharmony_ci        println!("idl_ipc_test_basic_002 start");
79ca0551cfSopenharmony_ci        Ok(())
80ca0551cfSopenharmony_ci    }
81ca0551cfSopenharmony_ci
82ca0551cfSopenharmony_ci    fn idl_ipc_test_basic_101(&self, i_bool: &bool) -> Result<bool>{
83ca0551cfSopenharmony_ci        println!("idl_ipc_test_basic_101 start -> {}", i_bool);
84ca0551cfSopenharmony_ci        Ok(!i_bool)
85ca0551cfSopenharmony_ci    }
86ca0551cfSopenharmony_ci
87ca0551cfSopenharmony_ci    fn idl_ipc_test_basic_102(&self, i_byte: &i8) -> Result<i8>{
88ca0551cfSopenharmony_ci        println!("idl_ipc_test_basic_102 start -> {}", i_byte);
89ca0551cfSopenharmony_ci        Ok(i_byte * 2)
90ca0551cfSopenharmony_ci    }
91ca0551cfSopenharmony_ci
92ca0551cfSopenharmony_ci    fn idl_ipc_test_basic_103(&self, i_short: &i16) -> Result<i16>{
93ca0551cfSopenharmony_ci        println!("idl_ipc_test_basic_103 start -> {}", i_short);
94ca0551cfSopenharmony_ci        Ok(i_short * 2)
95ca0551cfSopenharmony_ci    }
96ca0551cfSopenharmony_ci
97ca0551cfSopenharmony_ci    fn idl_ipc_test_basic_104(&self, i_int: &i32) -> Result<i32>{
98ca0551cfSopenharmony_ci        println!("idl_ipc_test_basic_104 start -> {}", i_int);
99ca0551cfSopenharmony_ci        Ok(i_int * 2)
100ca0551cfSopenharmony_ci    }
101ca0551cfSopenharmony_ci
102ca0551cfSopenharmony_ci    fn idl_ipc_test_basic_105(&self, i_long: &i64) -> Result<i64>{
103ca0551cfSopenharmony_ci        println!("idl_ipc_test_basic_105 start -> {}", i_long);
104ca0551cfSopenharmony_ci        Ok(i_long * 2)
105ca0551cfSopenharmony_ci    }
106ca0551cfSopenharmony_ci
107ca0551cfSopenharmony_ci    fn idl_ipc_test_basic_106(&self, i_float: &f32) -> Result<f32>{
108ca0551cfSopenharmony_ci        println!("idl_ipc_test_basic_106 start -> {}", i_float);
109ca0551cfSopenharmony_ci        Ok(*i_float * 2.0)
110ca0551cfSopenharmony_ci    }
111ca0551cfSopenharmony_ci
112ca0551cfSopenharmony_ci    fn idl_ipc_test_basic_107(&self, i_double: &f64) -> Result<f64>{
113ca0551cfSopenharmony_ci        println!("idl_ipc_test_basic_107 start -> {}", i_double);
114ca0551cfSopenharmony_ci        Ok(*i_double * 2.0)
115ca0551cfSopenharmony_ci    }
116ca0551cfSopenharmony_ci
117ca0551cfSopenharmony_ci    fn idl_ipc_test_basic_108(&self, i_string: &str) -> Result<String>{
118ca0551cfSopenharmony_ci        println!("idl_ipc_test_basic_108 start -> {}", i_string);
119ca0551cfSopenharmony_ci        let mut result = String::from(i_string);
120ca0551cfSopenharmony_ci        result.push_str(i_string);
121ca0551cfSopenharmony_ci        Ok(result.to_string())
122ca0551cfSopenharmony_ci    }
123ca0551cfSopenharmony_ci
124ca0551cfSopenharmony_ci    fn idl_ipc_test_basic_199(&self, i_bool: &bool, i_long: &i64, i_float: &f32,
125ca0551cfSopenharmony_ci        i_double: &f64, i_string: &str) -> Result<bool>{
126ca0551cfSopenharmony_ci        println!("idl_ipc_test_basic_199 start -> {} - {} - {} - {} - {}", i_bool, i_long, i_float, i_double, i_string);
127ca0551cfSopenharmony_ci        Ok(true)
128ca0551cfSopenharmony_ci    }
129ca0551cfSopenharmony_ci}
130ca0551cfSopenharmony_ci
131ca0551cfSopenharmony_ciimpl IRemoteBroker for TestService {}
132ca0551cfSopenharmony_ci
133ca0551cfSopenharmony_cifn main() {
134ca0551cfSopenharmony_ci    init_access_token();
135ca0551cfSopenharmony_ci    // create stub
136ca0551cfSopenharmony_ci    let service = IdlTestServiceStub::new_remote_stub(TestService).expect("create TestService success");
137ca0551cfSopenharmony_ci    add_service(&service.as_object().expect("get IIdlTestService service failed"),
138ca0551cfSopenharmony_ci        IPC_TEST_SERVICE_ID).expect("add server to samgr failed");
139ca0551cfSopenharmony_ci    println!("join to ipc work thread");
140ca0551cfSopenharmony_ci    join_work_thread();
141ca0551cfSopenharmony_ci}
142