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//! Drag Server implementation. 17 18#![allow(dead_code)] 19#![allow(unused_variables)] 20// FIXME: need abi_stable crate or thin_trait_object crate 21#![allow(improper_ctypes_definitions)] 22 23use std::ffi::{ c_char, CString }; 24use hilog_rust::{ info, error, hilog, HiLogLabel, LogType }; 25use ipc_rust::{ BorrowedMsgParcel, Serialize, Deserialize }; 26use fusion_data_rust::{ IPlugin, CallingContext, DragData }; 27use fusion_utils_rust::{ call_debug_enter, FusionResult, FusionErrorCode }; 28use fusion_plugin_manager_rust::export_plugin; 29 30const LOG_LABEL: HiLogLabel = HiLogLabel { 31 log_type: LogType::LogCore, 32 domain: 0xD002220, 33 tag: "FusionDragServer" 34}; 35 36/// Implementation of drag service. 37/// 38/// # Functions provided by drag service: 39/// 40/// * Start drag and put service in DRAG mode. 41/// * Stop drag and reset mode of service. 42/// * Add listener for drag events. 43/// * Remove listener of drag events. 44/// * Set visibility of drag window. 45/// * Update shadow. 46/// 47/// For integration with `intention framework`, we have to map functions 48/// mention above to [`IPlugin`] as: 49/// 50/// * `IPlugin::start` to start drag and put service in DRAG mode. 51/// * `IPlugin::stop` to start drag and reset mode of service. 52/// * `IPlugin::add_watch` to add listener for drag events. 53/// * `IPlugin::remove_watch` to remove listener of drag events. 54/// * `IPlugin::set_param` to set visibility of drag window, using 55/// [`DRAG_WINDOW_VISIBILITY`] as parameter ID. 56/// * `IPlugin::set_param` to update shadow, using [`UPDATE_SHADOW`] 57/// as parameter ID. 58/// 59/// Default action for unmapped interfaces of [`IPlugin`] is simply to 60/// fail and return error. 61/// 62#[derive(Default)] 63pub struct FusionDragServer(i32); 64 65impl IPlugin for FusionDragServer { 66 fn enable(&self, context: &CallingContext, data: &BorrowedMsgParcel, 67 reply: &mut BorrowedMsgParcel) -> FusionResult<()> { 68 call_debug_enter!("FusionDragServer::enable"); 69 Ok(()) 70 } 71 72 fn disable(&self, context: &CallingContext, data: &BorrowedMsgParcel, 73 reply: &mut BorrowedMsgParcel) -> FusionResult<()> { 74 call_debug_enter!("FusionDragServer::disable"); 75 Ok(()) 76 } 77 78 fn start(&self, context: &CallingContext, data: &BorrowedMsgParcel, 79 reply: &mut BorrowedMsgParcel) -> FusionResult<()> { 80 call_debug_enter!("FusionDragServer::start"); 81 match DragData::deserialize(data) { 82 Ok(drag_data) => { 83 info!(LOG_LABEL, "In FusionDragServer::start(): call start_drag()"); 84 info!(LOG_LABEL, "{}", drag_data); 85 match 0u32.serialize(reply) { 86 Ok(_) => { 87 Ok(()) 88 } 89 Err(_) => { 90 error!(LOG_LABEL, "Failed to serialize reply"); 91 Err(FusionErrorCode::Fail) 92 } 93 } 94 } 95 Err(_) => { 96 error!(LOG_LABEL, "In FusionDragServer::start(): DragData::deserialize() failed"); 97 Err(FusionErrorCode::Fail) 98 } 99 } 100 } 101 102 fn stop(&self, context: &CallingContext, data: &BorrowedMsgParcel, 103 reply: &mut BorrowedMsgParcel) -> FusionResult<()> { 104 call_debug_enter!("FusionDragServer::stop"); 105 Ok(()) 106 } 107 108 fn add_watch(&self, context: &CallingContext, id: u32, data: &BorrowedMsgParcel, 109 reply: &mut BorrowedMsgParcel) -> FusionResult<()> { 110 call_debug_enter!("FusionDragServer::add_watch"); 111 Ok(()) 112 } 113 114 fn remove_watch(&self, context: &CallingContext, id: u32, data: &BorrowedMsgParcel, 115 reply: &mut BorrowedMsgParcel) -> FusionResult<()> { 116 call_debug_enter!("FusionDragServer::remove_watch"); 117 Ok(()) 118 } 119 120 fn set_param(&self, context: &CallingContext, id: u32, data: &BorrowedMsgParcel, 121 reply: &mut BorrowedMsgParcel) -> FusionResult<()> { 122 call_debug_enter!("FusionDragServer::set_param"); 123 Ok(()) 124 } 125 126 fn get_param(&self, context: &CallingContext, id: u32, data: &BorrowedMsgParcel, 127 reply: &mut BorrowedMsgParcel) -> FusionResult<()> { 128 call_debug_enter!("FusionDragServer::get_param"); 129 Ok(()) 130 } 131 132 fn control(&self, context: &CallingContext, id: u32, data: &BorrowedMsgParcel, 133 reply: &mut BorrowedMsgParcel) -> FusionResult<()> { 134 call_debug_enter!("FusionDragServer::control"); 135 Ok(()) 136 } 137} 138 139export_plugin!(FusionDragServer); 140