1 /*
2 * Copyright (C) 2023 Huawei Device Co., Ltd.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *
7 * http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 */
15
16 //! fusion IPC client.
17
18 #![allow(dead_code)]
19 #![allow(unused_variables)]
20
21 mod frameworks;
22
23 use std::ffi::{ c_char, CStr, CString };
24 use std::os::fd::AsRawFd;
25 use hilog_rust::{ error, hilog, HiLogLabel, LogType };
26 use fusion_utils_rust::call_debug_enter;
27 use fusion_data_rust::{ AllocSocketPairParam, CDragData, DragData };
28 use frameworks::FusionFrameworks;
29
30 const LOG_LABEL: HiLogLabel = HiLogLabel {
31 log_type: LogType::LogCore,
32 domain: 0xD002220,
33 tag: "fusion_client"
34 };
35
36 /// # Safety
37 #[no_mangle]
fusion_alloc_socket_fd(program_name: *const c_char, module_type: i32, client_fd: *mut i32, token_type: *mut i32) -> i3238 unsafe extern "C" fn fusion_alloc_socket_fd(program_name: *const c_char, module_type: i32,
39 client_fd: *mut i32, token_type: *mut i32) -> i32
40 {
41 call_debug_enter!("fusion_alloc_socket_fd");
42 if program_name.is_null() {
43 error!(LOG_LABEL, "program_name is null");
44 return -1;
45 };
46 let param = match AllocSocketPairParam::from_c(program_name, module_type) {
47 Ok(param) => { param }
48 Err(err) => {
49 error!(LOG_LABEL, "Failed parsing AllocSocketPairParam");
50 return i32::from(err);
51 }
52 };
53 let fw = FusionFrameworks::get_instance().unwrap();
54 fw.alloc_socket_pair(¶m).map_or_else(
55 |err| { i32::from(err) },
56 |(fdesc, t)| {
57 *client_fd = fdesc.as_raw_fd();
58 *token_type = t;
59 0
60 }
61 )
62 }
63
64 /// # Safety
65 #[no_mangle]
fusion_start_drag(c_drag_data: *mut CDragData) -> i3266 unsafe extern "C" fn fusion_start_drag(c_drag_data: *mut CDragData) -> i32
67 {
68 c_drag_data.as_mut().map_or(-1, |c_drag_data_ref| {
69 let drag_data = DragData::from_c(c_drag_data_ref);
70 let fw = FusionFrameworks::get_instance().unwrap();
71 fw.start_drag(&drag_data).map_or_else(|err| { i32::from(err) }, |_| { 0 })
72 })
73 }
74
75 /// # Safety
76 #[no_mangle]
fusion_register_coordination_listener() -> i3277 unsafe extern "C" fn fusion_register_coordination_listener() -> i32
78 {
79 let fw = FusionFrameworks::get_instance().unwrap();
80 fw.register_coordination_listener().map_or_else(|err| { i32::from(err) }, |_| { 0 })
81 }
82
83 /// # Safety
84 #[no_mangle]
fusion_unregister_coordination_listener() -> i3285 unsafe extern "C" fn fusion_unregister_coordination_listener() -> i32
86 {
87 let fw = FusionFrameworks::get_instance().unwrap();
88 fw.unregister_coordination_listener().map_or_else(|err| { i32::from(err) }, |_| { 0 })
89 }
90
91 /// # Safety
92 #[no_mangle]
fusion_enable_coordination(user_data: i32) -> i3293 unsafe extern "C" fn fusion_enable_coordination(user_data: i32) -> i32
94 {
95 let fw = FusionFrameworks::get_instance().unwrap();
96 fw.enable_coordination(user_data).map_or_else(|err| { i32::from(err) }, |_| { 0 })
97 }
98
99 /// # Safety
100 #[no_mangle]
fusion_disable_coordination(user_data: i32) -> i32101 unsafe extern "C" fn fusion_disable_coordination(user_data: i32) -> i32
102 {
103 let fw = FusionFrameworks::get_instance().unwrap();
104 fw.disable_coordination(user_data).map_or_else(|err| { i32::from(err) }, |_| { 0 })
105 }
106
107 /// # Safety
108 #[no_mangle]
fusion_start_coordination(user_data: i32, remote_network_id: *const c_char, start_device_id: i32) -> i32109 unsafe extern "C" fn fusion_start_coordination(user_data: i32,
110 remote_network_id: *const c_char, start_device_id: i32) -> i32
111 {
112 if remote_network_id.is_null() {
113 error!(LOG_LABEL, "remote_network_id is null");
114 return -1;
115 }
116 let remote_network_id: String = match CStr::from_ptr(remote_network_id).to_str() {
117 Ok(id) => { id.to_string() }
118 Err(_) => {
119 error!(LOG_LABEL, "Invalid network id");
120 return -1;
121 }
122 };
123 let fw = FusionFrameworks::get_instance().unwrap();
124 fw.start_coordination(user_data, &remote_network_id,
125 start_device_id).map_or_else(|err| { i32::from(err) }, |_| { 0 })
126 }
127
128 /// # Safety
129 #[no_mangle]
fusion_stop_coordination(user_data: i32, is_unchained: i32) -> i32130 unsafe extern "C" fn fusion_stop_coordination(user_data: i32, is_unchained: i32) -> i32
131 {
132 let fw = FusionFrameworks::get_instance().unwrap();
133 fw.stop_coordination(user_data, is_unchained).map_or_else(|err| { i32::from(err) }, |_| { 0 })
134 }
135
136 /// # Safety
137 #[no_mangle]
fusion_get_coordination_state(user_data: i32, device_id: *const c_char) -> i32138 unsafe extern "C" fn fusion_get_coordination_state(user_data: i32, device_id: *const c_char) -> i32
139 {
140 if device_id.is_null() {
141 error!(LOG_LABEL, "device_id is null");
142 return -1;
143 }
144 let device_id: String = match CStr::from_ptr(device_id).to_str() {
145 Ok(id) => { id.to_string() }
146 Err(_) => {
147 error!(LOG_LABEL, "Invalid device id");
148 return -1;
149 }
150 };
151 let fw = FusionFrameworks::get_instance().unwrap();
152 fw.get_coordination_state(user_data, &device_id).map_or_else(|err| { i32::from(err) }, |_| { 0 })
153 }
154