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