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//! General functionalities.
17
18#![allow(dead_code)]
19#![allow(unused_variables)]
20
21use std::ffi::{ c_char, CString };
22use std::fs::File;
23use std::os::fd::{ FromRawFd, RawFd };
24
25use hilog_rust::{ info, error, hilog, HiLogLabel, LogType };
26use ipc_rust::{ BorrowedMsgParcel, Deserialize, FileDesc, Serialize };
27
28use fusion_data_rust::{ IPlugin, AllocSocketPairParam, BasicParamID, CallingContext };
29use fusion_services_rust::FusionService;
30use fusion_utils_rust::{ call_debug_enter, FusionResult, FusionErrorCode };
31
32const LOG_LABEL: HiLogLabel = HiLogLabel {
33    log_type: LogType::LogCore,
34    domain: 0xD002220,
35    tag: "FusionBasicServer"
36};
37
38/// Module-level interface of general functionalities.
39#[derive(Default)]
40pub struct FusionBasicServer(i32);
41
42impl FusionBasicServer {
43    fn alloc_socket_pair(&self, data: &BorrowedMsgParcel, reply: &mut BorrowedMsgParcel) -> FusionResult<()>
44    {
45        let call_param = AllocSocketPairParam::deserialize(data).or(Err(FusionErrorCode::Fail))?;
46
47        if let Some(proxy) = FusionService::get_instance() {
48            let mut client_fd: RawFd = 0;
49            let mut token_type: i32 = 0;
50
51            proxy.alloc_socket_fd(call_param.program_name.as_str(),
52                call_param.module_type, &mut client_fd, &mut token_type)?;
53
54            let f = unsafe { File::from_raw_fd(client_fd) };
55            FileDesc::new(f).serialize(reply).or(Err(FusionErrorCode::Fail))?;
56            token_type.serialize(reply).or(Err(FusionErrorCode::Fail))?;
57            Ok(())
58        } else {
59            error!(LOG_LABEL, "No proxy");
60            Err(FusionErrorCode::Fail)
61        }
62    }
63}
64
65impl IPlugin for FusionBasicServer {
66    fn enable(&self, context: &CallingContext, data: &BorrowedMsgParcel,
67        reply: &mut BorrowedMsgParcel) -> FusionResult<()> {
68        call_debug_enter!("FusionBasicServer::enable");
69        Ok(())
70    }
71
72    fn disable(&self, context: &CallingContext, data: &BorrowedMsgParcel,
73        reply: &mut BorrowedMsgParcel) -> FusionResult<()> {
74        call_debug_enter!("FusionBasicServer::disable");
75        Ok(())
76    }
77
78    fn start(&self, context: &CallingContext, data: &BorrowedMsgParcel,
79        reply: &mut BorrowedMsgParcel) -> FusionResult<()> {
80        call_debug_enter!("FusionBasicServer::start");
81        error!(LOG_LABEL, "FusionBasicServer::start");
82        Err(FusionErrorCode::Fail)
83    }
84
85    fn stop(&self, context: &CallingContext, data: &BorrowedMsgParcel,
86        reply: &mut BorrowedMsgParcel) -> FusionResult<()> {
87        call_debug_enter!("FusionBasicServer::stop");
88        Ok(())
89    }
90
91    fn add_watch(&self, context: &CallingContext, id: u32, data: &BorrowedMsgParcel,
92        reply: &mut BorrowedMsgParcel) -> FusionResult<()> {
93        call_debug_enter!("FusionBasicServer::add_watch");
94        Ok(())
95    }
96
97    fn remove_watch(&self, context: &CallingContext, id: u32, data: &BorrowedMsgParcel,
98        reply: &mut BorrowedMsgParcel) -> FusionResult<()> {
99        call_debug_enter!("FusionBasicServer::remove_watch");
100        Ok(())
101    }
102
103    fn set_param(&self, context: &CallingContext, id: u32, data: &BorrowedMsgParcel,
104        reply: &mut BorrowedMsgParcel) -> FusionResult<()> {
105        call_debug_enter!("FusionBasicServer::set_param");
106        Ok(())
107    }
108
109    fn get_param(&self, context: &CallingContext, id: u32, data: &BorrowedMsgParcel,
110        reply: &mut BorrowedMsgParcel) -> FusionResult<()> {
111        call_debug_enter!("FusionBasicServer::get_param");
112        Ok(())
113    }
114
115    fn control(&self, context: &CallingContext, id: u32, data: &BorrowedMsgParcel,
116        reply: &mut BorrowedMsgParcel) -> FusionResult<()> {
117        call_debug_enter!("FusionBasicServer::control");
118        match BasicParamID::try_from(id) {
119            Ok(param) => {
120                match param {
121                    BasicParamID::AllocSocketPair => {
122                        info!(LOG_LABEL, "Alloc socket pair");
123                        self.alloc_socket_pair(data, reply)
124                    }
125                }
126            }
127            Err(_) => {
128                error!(LOG_LABEL, "Invalid param id: {}", id);
129                Err(FusionErrorCode::Fail)
130            }
131        }
132    }
133}
134