1cc290419Sopenharmony_ci/*
2cc290419Sopenharmony_ci * Copyright (C) 2023 Huawei Device Co., Ltd.
3cc290419Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
4cc290419Sopenharmony_ci * you may not use this file except in compliance with the License.
5cc290419Sopenharmony_ci * You may obtain a copy of the License at
6cc290419Sopenharmony_ci *
7cc290419Sopenharmony_ci *     http://www.apache.org/licenses/LICENSE-2.0
8cc290419Sopenharmony_ci *
9cc290419Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software
10cc290419Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
11cc290419Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12cc290419Sopenharmony_ci * See the License for the specific language governing permissions and
13cc290419Sopenharmony_ci * limitations under the License.
14cc290419Sopenharmony_ci */
15cc290419Sopenharmony_ci//! task
16cc290419Sopenharmony_ci#![allow(missing_docs)]
17cc290419Sopenharmony_ci
18cc290419Sopenharmony_ciuse crate::daemon_lib::{auth, daemon_unity};
19cc290419Sopenharmony_ci
20cc290419Sopenharmony_ciuse crate::daemon_lib::shell::*;
21cc290419Sopenharmony_ci
22cc290419Sopenharmony_ciuse crate::daemon_lib::daemon_app::{self, AppTaskMap, DaemonAppTask};
23cc290419Sopenharmony_ciuse crate::daemon_lib::sys_para::*;
24cc290419Sopenharmony_ciuse crate::utils::hdc_log::*;
25cc290419Sopenharmony_ciuse crate::common::forward::{self, ForwardTaskMap, HdcForward};
26cc290419Sopenharmony_ciuse crate::common::hdcfile::{self, FileTaskMap, HdcFile};
27cc290419Sopenharmony_ciuse crate::common::jdwp;
28cc290419Sopenharmony_ciuse crate::config::*;
29cc290419Sopenharmony_ciuse crate::transfer;
30cc290419Sopenharmony_ci
31cc290419Sopenharmony_ciuse std::io::{self, Error, ErrorKind};
32cc290419Sopenharmony_ci
33cc290419Sopenharmony_ciasync fn daemon_shell_task(task_message: TaskMessage, session_id: u32) -> io::Result<()> {
34cc290419Sopenharmony_ci    match task_message.command {
35cc290419Sopenharmony_ci        HdcCommand::ShellInit => {
36cc290419Sopenharmony_ci            let pty_task = PtyTask::new(
37cc290419Sopenharmony_ci                session_id,
38cc290419Sopenharmony_ci                task_message.channel_id,
39cc290419Sopenharmony_ci                None,
40cc290419Sopenharmony_ci                HdcCommand::KernelEchoRaw,
41cc290419Sopenharmony_ci            );
42cc290419Sopenharmony_ci            PtyMap::put(session_id, task_message.channel_id, pty_task).await;
43cc290419Sopenharmony_ci        }
44cc290419Sopenharmony_ci        HdcCommand::UnityExecute => {
45cc290419Sopenharmony_ci            match String::from_utf8(task_message.payload) {
46cc290419Sopenharmony_ci                Ok(cmd_str) => {
47cc290419Sopenharmony_ci                    let shell_execute_task: ShellExecuteTask = ShellExecuteTask::new(
48cc290419Sopenharmony_ci                        session_id,
49cc290419Sopenharmony_ci                        task_message.channel_id,
50cc290419Sopenharmony_ci                        cmd_str,
51cc290419Sopenharmony_ci                        HdcCommand::KernelEchoRaw,
52cc290419Sopenharmony_ci                    );
53cc290419Sopenharmony_ci
54cc290419Sopenharmony_ci                    ShellExecuteMap::put(session_id, task_message.channel_id, shell_execute_task).await;
55cc290419Sopenharmony_ci                },
56cc290419Sopenharmony_ci                Err(_) => {
57cc290419Sopenharmony_ci                    crate::common::hdctransfer::echo_client(
58cc290419Sopenharmony_ci                        session_id,
59cc290419Sopenharmony_ci                        task_message.channel_id,
60cc290419Sopenharmony_ci                        "only support utf-8 chars",
61cc290419Sopenharmony_ci                        MessageLevel::Fail,
62cc290419Sopenharmony_ci                    )
63cc290419Sopenharmony_ci                    .await;
64cc290419Sopenharmony_ci                    let message = TaskMessage {
65cc290419Sopenharmony_ci                        channel_id: task_message.channel_id,
66cc290419Sopenharmony_ci                        command: HdcCommand::KernelChannelClose,
67cc290419Sopenharmony_ci                        payload: [1].to_vec(),
68cc290419Sopenharmony_ci                    };
69cc290419Sopenharmony_ci                    let _ = daemon_channel_close(message, session_id).await;
70cc290419Sopenharmony_ci                    return Err(Error::new(ErrorKind::Other, "Get an FromUtf8Error"));
71cc290419Sopenharmony_ci                }
72cc290419Sopenharmony_ci            }
73cc290419Sopenharmony_ci        }
74cc290419Sopenharmony_ci        _ => {
75cc290419Sopenharmony_ci            let channel_id = task_message.channel_id;
76cc290419Sopenharmony_ci            if let Some(pty_task) = PtyMap::get(session_id, channel_id).await {
77cc290419Sopenharmony_ci                let _ = &pty_task.tx.send(task_message.payload.clone()).await;
78cc290419Sopenharmony_ci                if task_message.payload[..].contains(&0x4_u8) {
79cc290419Sopenharmony_ci                    PtyMap::del(session_id, channel_id).await;
80cc290419Sopenharmony_ci                }
81cc290419Sopenharmony_ci                return Ok(());
82cc290419Sopenharmony_ci            } else {
83cc290419Sopenharmony_ci                return Err(Error::new(ErrorKind::Other, "invalid channel id"));
84cc290419Sopenharmony_ci            }
85cc290419Sopenharmony_ci        }
86cc290419Sopenharmony_ci    }
87cc290419Sopenharmony_ci    Ok(())
88cc290419Sopenharmony_ci}
89cc290419Sopenharmony_ci
90cc290419Sopenharmony_ciasync fn remove_task(session_id: u32, channel_id: u32) {
91cc290419Sopenharmony_ci    jdwp::stop_task(session_id, channel_id).await;
92cc290419Sopenharmony_ci    AppTaskMap::remove(session_id, channel_id).await;
93cc290419Sopenharmony_ci    FileTaskMap::remove(session_id, channel_id).await;
94cc290419Sopenharmony_ci    forward::free_channel_task(session_id, channel_id).await;
95cc290419Sopenharmony_ci    // shell & hilog task
96cc290419Sopenharmony_ci    if let Some(pty_task) = PtyMap::get(session_id, channel_id).await {
97cc290419Sopenharmony_ci        let _ = &pty_task.tx.send(vec![0x04_u8]).await;
98cc290419Sopenharmony_ci        PtyMap::del(session_id, channel_id).await;
99cc290419Sopenharmony_ci    }
100cc290419Sopenharmony_ci    ShellExecuteMap::del(session_id, channel_id).await;
101cc290419Sopenharmony_ci}
102cc290419Sopenharmony_ci
103cc290419Sopenharmony_ciasync fn daemon_channel_close(task_message: TaskMessage, session_id: u32) -> io::Result<()> {
104cc290419Sopenharmony_ci    // task stop:
105cc290419Sopenharmony_ci    crate::debug!(
106cc290419Sopenharmony_ci        "daemon_channel_close session_id {session_id}, channel_id {}",
107cc290419Sopenharmony_ci        task_message.channel_id
108cc290419Sopenharmony_ci    );
109cc290419Sopenharmony_ci
110cc290419Sopenharmony_ci    remove_task(session_id, task_message.channel_id).await;
111cc290419Sopenharmony_ci
112cc290419Sopenharmony_ci    if task_message.payload[0] > 0 {
113cc290419Sopenharmony_ci        let message = TaskMessage {
114cc290419Sopenharmony_ci            channel_id: task_message.channel_id,
115cc290419Sopenharmony_ci            command: HdcCommand::KernelChannelClose,
116cc290419Sopenharmony_ci            payload: vec![task_message.payload[0] - 1],
117cc290419Sopenharmony_ci        };
118cc290419Sopenharmony_ci        transfer::put(session_id, message).await;
119cc290419Sopenharmony_ci    }
120cc290419Sopenharmony_ci    Ok(())
121cc290419Sopenharmony_ci}
122cc290419Sopenharmony_ci
123cc290419Sopenharmony_ciasync fn daemon_file_task(task_message: TaskMessage, session_id: u32) -> io::Result<()> {
124cc290419Sopenharmony_ci    match task_message.command {
125cc290419Sopenharmony_ci        HdcCommand::AppCheck | HdcCommand::AppUninstall => {
126cc290419Sopenharmony_ci            if !AppTaskMap::exsit(session_id, task_message.channel_id).await {
127cc290419Sopenharmony_ci                let task = DaemonAppTask::new(session_id, task_message.channel_id);
128cc290419Sopenharmony_ci                AppTaskMap::put(session_id, task_message.channel_id, task).await;
129cc290419Sopenharmony_ci            }
130cc290419Sopenharmony_ci            daemon_app::command_dispatch(
131cc290419Sopenharmony_ci                session_id,
132cc290419Sopenharmony_ci                task_message.channel_id,
133cc290419Sopenharmony_ci                task_message.command,
134cc290419Sopenharmony_ci                &task_message.payload,
135cc290419Sopenharmony_ci                task_message.payload.len() as u16,
136cc290419Sopenharmony_ci            )
137cc290419Sopenharmony_ci            .await;
138cc290419Sopenharmony_ci            return Ok(());
139cc290419Sopenharmony_ci        }
140cc290419Sopenharmony_ci        HdcCommand::AppBegin | HdcCommand::AppData => {
141cc290419Sopenharmony_ci            daemon_app::command_dispatch(
142cc290419Sopenharmony_ci                session_id,
143cc290419Sopenharmony_ci                task_message.channel_id,
144cc290419Sopenharmony_ci                task_message.command,
145cc290419Sopenharmony_ci                &task_message.payload,
146cc290419Sopenharmony_ci                task_message.payload.len() as u16,
147cc290419Sopenharmony_ci            )
148cc290419Sopenharmony_ci            .await;
149cc290419Sopenharmony_ci            return Ok(());
150cc290419Sopenharmony_ci        }
151cc290419Sopenharmony_ci        HdcCommand::FileMode | HdcCommand::FileCheck | HdcCommand::FileInit => {
152cc290419Sopenharmony_ci            if !FileTaskMap::exsit(session_id, task_message.channel_id).await {
153cc290419Sopenharmony_ci                let mut task = HdcFile::new(session_id, task_message.channel_id);
154cc290419Sopenharmony_ci                task.transfer.server_or_daemon = false;
155cc290419Sopenharmony_ci                FileTaskMap::put(session_id, task_message.channel_id, task).await;
156cc290419Sopenharmony_ci            }
157cc290419Sopenharmony_ci
158cc290419Sopenharmony_ci            hdcfile::command_dispatch(
159cc290419Sopenharmony_ci                session_id,
160cc290419Sopenharmony_ci                task_message.channel_id,
161cc290419Sopenharmony_ci                task_message.command,
162cc290419Sopenharmony_ci                &task_message.payload,
163cc290419Sopenharmony_ci                task_message.payload.len() as u16,
164cc290419Sopenharmony_ci            )
165cc290419Sopenharmony_ci            .await;
166cc290419Sopenharmony_ci            return Ok(());
167cc290419Sopenharmony_ci        }
168cc290419Sopenharmony_ci        HdcCommand::ForwardInit | HdcCommand::ForwardCheck => {
169cc290419Sopenharmony_ci            let mut task = HdcForward::new(session_id, task_message.channel_id, false);
170cc290419Sopenharmony_ci            task.transfer.server_or_daemon = false;
171cc290419Sopenharmony_ci            ForwardTaskMap::update(session_id, task_message.channel_id, task).await;
172cc290419Sopenharmony_ci            forward::command_dispatch(
173cc290419Sopenharmony_ci                session_id,
174cc290419Sopenharmony_ci                task_message.channel_id,
175cc290419Sopenharmony_ci                task_message.command,
176cc290419Sopenharmony_ci                &task_message.payload,
177cc290419Sopenharmony_ci                task_message.payload.len() as u16,
178cc290419Sopenharmony_ci            )
179cc290419Sopenharmony_ci            .await;
180cc290419Sopenharmony_ci            return Ok(());
181cc290419Sopenharmony_ci        }
182cc290419Sopenharmony_ci        HdcCommand::ForwardCheckResult
183cc290419Sopenharmony_ci        | HdcCommand::ForwardActiveSlave
184cc290419Sopenharmony_ci        | HdcCommand::ForwardActiveMaster
185cc290419Sopenharmony_ci        | HdcCommand::ForwardData
186cc290419Sopenharmony_ci        | HdcCommand::ForwardFreeContext => {
187cc290419Sopenharmony_ci            forward::command_dispatch(
188cc290419Sopenharmony_ci                session_id,
189cc290419Sopenharmony_ci                task_message.channel_id,
190cc290419Sopenharmony_ci                task_message.command,
191cc290419Sopenharmony_ci                &task_message.payload,
192cc290419Sopenharmony_ci                task_message.payload.len() as u16,
193cc290419Sopenharmony_ci            )
194cc290419Sopenharmony_ci            .await;
195cc290419Sopenharmony_ci            return Ok(());
196cc290419Sopenharmony_ci        }
197cc290419Sopenharmony_ci        HdcCommand::FileBegin
198cc290419Sopenharmony_ci        | HdcCommand::FileData
199cc290419Sopenharmony_ci        | HdcCommand::FileFinish
200cc290419Sopenharmony_ci        | HdcCommand::DirMode => {
201cc290419Sopenharmony_ci            hdcfile::command_dispatch(
202cc290419Sopenharmony_ci                session_id,
203cc290419Sopenharmony_ci                task_message.channel_id,
204cc290419Sopenharmony_ci                task_message.command,
205cc290419Sopenharmony_ci                &task_message.payload,
206cc290419Sopenharmony_ci                task_message.payload.len() as u16,
207cc290419Sopenharmony_ci            )
208cc290419Sopenharmony_ci            .await;
209cc290419Sopenharmony_ci            return Ok(());
210cc290419Sopenharmony_ci        }
211cc290419Sopenharmony_ci        HdcCommand::UnityRunmode
212cc290419Sopenharmony_ci        | HdcCommand::UnityReboot
213cc290419Sopenharmony_ci        | HdcCommand::UnityRemount
214cc290419Sopenharmony_ci        | HdcCommand::UnityRootrun
215cc290419Sopenharmony_ci        | HdcCommand::JdwpList
216cc290419Sopenharmony_ci        | HdcCommand::JdwpTrack => {
217cc290419Sopenharmony_ci            daemon_unity::command_dispatch(
218cc290419Sopenharmony_ci                session_id,
219cc290419Sopenharmony_ci                task_message.channel_id,
220cc290419Sopenharmony_ci                task_message.command,
221cc290419Sopenharmony_ci                &task_message.payload,
222cc290419Sopenharmony_ci                task_message.payload.len() as u16,
223cc290419Sopenharmony_ci            )
224cc290419Sopenharmony_ci            .await;
225cc290419Sopenharmony_ci            return Ok(());
226cc290419Sopenharmony_ci        }
227cc290419Sopenharmony_ci        _ => {
228cc290419Sopenharmony_ci            crate::error!(
229cc290419Sopenharmony_ci                "other tasks, cmd {:?}. session_id {session_id}, channel_id {}",
230cc290419Sopenharmony_ci                task_message.command,
231cc290419Sopenharmony_ci                task_message.channel_id
232cc290419Sopenharmony_ci            );
233cc290419Sopenharmony_ci        }
234cc290419Sopenharmony_ci    }
235cc290419Sopenharmony_ci
236cc290419Sopenharmony_ci    Ok(())
237cc290419Sopenharmony_ci}
238cc290419Sopenharmony_ci
239cc290419Sopenharmony_ciasync fn daemon_hilog_task(task_message: TaskMessage, session_id: u32) -> io::Result<()> {
240cc290419Sopenharmony_ci    let cmd = if task_message.payload.len() == 1 && task_message.payload[0] == 104 {
241cc290419Sopenharmony_ci        // payload is 'h'
242cc290419Sopenharmony_ci        "hilog -h"
243cc290419Sopenharmony_ci    } else {
244cc290419Sopenharmony_ci        // blank or unknown payload, ignore
245cc290419Sopenharmony_ci        "hilog"
246cc290419Sopenharmony_ci    }
247cc290419Sopenharmony_ci    .to_string();
248cc290419Sopenharmony_ci    let pty_task = PtyTask::new(
249cc290419Sopenharmony_ci        session_id,
250cc290419Sopenharmony_ci        task_message.channel_id,
251cc290419Sopenharmony_ci        Some(cmd),
252cc290419Sopenharmony_ci        HdcCommand::KernelEchoRaw,
253cc290419Sopenharmony_ci    );
254cc290419Sopenharmony_ci    PtyMap::put(session_id, task_message.channel_id, pty_task).await;
255cc290419Sopenharmony_ci    Ok(())
256cc290419Sopenharmony_ci}
257cc290419Sopenharmony_ci
258cc290419Sopenharmony_ciasync fn daemon_bug_report_task(task_message: TaskMessage, session_id: u32) -> io::Result<()> {
259cc290419Sopenharmony_ci    let pty_task = PtyTask::new(
260cc290419Sopenharmony_ci        session_id,
261cc290419Sopenharmony_ci        task_message.channel_id,
262cc290419Sopenharmony_ci        Some("hidumper".to_string()),
263cc290419Sopenharmony_ci        HdcCommand::UnityBugreportData,
264cc290419Sopenharmony_ci    );
265cc290419Sopenharmony_ci    PtyMap::put(session_id, task_message.channel_id, pty_task).await;
266cc290419Sopenharmony_ci    Ok(())
267cc290419Sopenharmony_ci}
268cc290419Sopenharmony_ci
269cc290419Sopenharmony_cifn get_control_permission(param: &str) -> bool {
270cc290419Sopenharmony_ci    let (_, control_value) = get_dev_item(param, "_");
271cc290419Sopenharmony_ci    if control_value.trim().to_lowercase() == "false" {
272cc290419Sopenharmony_ci        return false;
273cc290419Sopenharmony_ci    }
274cc290419Sopenharmony_ci    true
275cc290419Sopenharmony_ci}
276cc290419Sopenharmony_ci
277cc290419Sopenharmony_cifn check_control(command: HdcCommand) -> bool {
278cc290419Sopenharmony_ci    let mut control_param = "";
279cc290419Sopenharmony_ci    match command {
280cc290419Sopenharmony_ci        HdcCommand::UnityRunmode
281cc290419Sopenharmony_ci        | HdcCommand::UnityReboot
282cc290419Sopenharmony_ci        | HdcCommand::UnityRemount
283cc290419Sopenharmony_ci        | HdcCommand::UnityRootrun
284cc290419Sopenharmony_ci        | HdcCommand::ShellInit
285cc290419Sopenharmony_ci        | HdcCommand::ShellData
286cc290419Sopenharmony_ci        | HdcCommand::UnityExecute
287cc290419Sopenharmony_ci        | HdcCommand::UnityHilog
288cc290419Sopenharmony_ci        | HdcCommand::UnityBugreportInit
289cc290419Sopenharmony_ci        | HdcCommand::JdwpList
290cc290419Sopenharmony_ci        | HdcCommand::JdwpTrack => {
291cc290419Sopenharmony_ci            control_param = ENV_SHELL_CONTROL;
292cc290419Sopenharmony_ci        }
293cc290419Sopenharmony_ci        HdcCommand::FileInit
294cc290419Sopenharmony_ci        | HdcCommand::FileCheck
295cc290419Sopenharmony_ci        | HdcCommand::FileData
296cc290419Sopenharmony_ci        | HdcCommand::FileBegin
297cc290419Sopenharmony_ci        | HdcCommand::FileFinish
298cc290419Sopenharmony_ci        | HdcCommand::AppCheck
299cc290419Sopenharmony_ci        | HdcCommand::AppData
300cc290419Sopenharmony_ci        | HdcCommand::AppUninstall => {
301cc290419Sopenharmony_ci            control_param = ENV_FILE_CONTROL;
302cc290419Sopenharmony_ci        }
303cc290419Sopenharmony_ci        HdcCommand::ForwardInit
304cc290419Sopenharmony_ci        | HdcCommand::ForwardCheck
305cc290419Sopenharmony_ci        | HdcCommand::ForwardCheckResult
306cc290419Sopenharmony_ci        | HdcCommand::ForwardActiveSlave
307cc290419Sopenharmony_ci        | HdcCommand::ForwardActiveMaster
308cc290419Sopenharmony_ci        | HdcCommand::ForwardData
309cc290419Sopenharmony_ci        | HdcCommand::ForwardFreeContext => {
310cc290419Sopenharmony_ci            control_param = ENV_FPORT_CONTROL;
311cc290419Sopenharmony_ci        }
312cc290419Sopenharmony_ci        _ => {}
313cc290419Sopenharmony_ci    }
314cc290419Sopenharmony_ci    // (_, run_debug) = crate::utils::get_dev_item(param);
315cc290419Sopenharmony_ci    if !control_param.is_empty() && !get_control_permission(control_param) {
316cc290419Sopenharmony_ci        return false;
317cc290419Sopenharmony_ci    }
318cc290419Sopenharmony_ci    true
319cc290419Sopenharmony_ci}
320cc290419Sopenharmony_ci
321cc290419Sopenharmony_cipub async fn dispatch_task(task_message: TaskMessage, session_id: u32) -> io::Result<()> {
322cc290419Sopenharmony_ci    let cmd = task_message.command;
323cc290419Sopenharmony_ci    let special_cmd =
324cc290419Sopenharmony_ci        (cmd == HdcCommand::KernelHandshake) || (cmd == HdcCommand::KernelChannelClose);
325cc290419Sopenharmony_ci    let auth_ok = auth::AuthStatusMap::get(session_id).await == auth::AuthStatus::Ok;
326cc290419Sopenharmony_ci
327cc290419Sopenharmony_ci    if !auth_ok && !special_cmd {
328cc290419Sopenharmony_ci        crate::error!("auth status is nok, cannt accept cmd: {}", cmd as u32);
329cc290419Sopenharmony_ci        crate::common::hdctransfer::echo_client(
330cc290419Sopenharmony_ci            session_id,
331cc290419Sopenharmony_ci            task_message.channel_id,
332cc290419Sopenharmony_ci            auth::get_auth_msg(session_id).await.as_str(),
333cc290419Sopenharmony_ci            MessageLevel::Fail,
334cc290419Sopenharmony_ci        )
335cc290419Sopenharmony_ci        .await;
336cc290419Sopenharmony_ci        transfer::put(
337cc290419Sopenharmony_ci            session_id,
338cc290419Sopenharmony_ci            auth::make_channel_close_message(task_message.channel_id).await,
339cc290419Sopenharmony_ci        )
340cc290419Sopenharmony_ci        .await;
341cc290419Sopenharmony_ci        return Err(Error::new(
342cc290419Sopenharmony_ci            ErrorKind::Other,
343cc290419Sopenharmony_ci            format!("auth status is nok, cannt accept cmd: {}", cmd as u32),
344cc290419Sopenharmony_ci        ));
345cc290419Sopenharmony_ci    }
346cc290419Sopenharmony_ci    if !check_control(task_message.command) {
347cc290419Sopenharmony_ci        crate::common::hdctransfer::echo_client(
348cc290419Sopenharmony_ci            session_id,
349cc290419Sopenharmony_ci            task_message.channel_id,
350cc290419Sopenharmony_ci            "debugging is not allowed",
351cc290419Sopenharmony_ci            MessageLevel::Fail,
352cc290419Sopenharmony_ci        )
353cc290419Sopenharmony_ci        .await;
354cc290419Sopenharmony_ci        crate::common::hdctransfer::transfer_task_finish(task_message.channel_id, session_id).await;
355cc290419Sopenharmony_ci        crate::debug!(
356cc290419Sopenharmony_ci            "check_permission param false: {}",
357cc290419Sopenharmony_ci            task_message.command as u32
358cc290419Sopenharmony_ci        );
359cc290419Sopenharmony_ci
360cc290419Sopenharmony_ci        return Ok(());
361cc290419Sopenharmony_ci    }
362cc290419Sopenharmony_ci    match task_message.command {
363cc290419Sopenharmony_ci        HdcCommand::KernelHandshake => auth::handshake_task(task_message, session_id).await,
364cc290419Sopenharmony_ci        HdcCommand::UnityHilog => daemon_hilog_task(task_message, session_id).await,
365cc290419Sopenharmony_ci        HdcCommand::UnityBugreportInit => daemon_bug_report_task(task_message, session_id).await,
366cc290419Sopenharmony_ci        HdcCommand::ShellInit | HdcCommand::ShellData | HdcCommand::UnityExecute => {
367cc290419Sopenharmony_ci            daemon_shell_task(task_message, session_id).await
368cc290419Sopenharmony_ci        }
369cc290419Sopenharmony_ci        HdcCommand::KernelChannelClose => daemon_channel_close(task_message, session_id).await,
370cc290419Sopenharmony_ci        HdcCommand::FileInit
371cc290419Sopenharmony_ci        | HdcCommand::FileCheck
372cc290419Sopenharmony_ci        | HdcCommand::FileData
373cc290419Sopenharmony_ci        | HdcCommand::FileBegin
374cc290419Sopenharmony_ci        | HdcCommand::FileFinish
375cc290419Sopenharmony_ci        | HdcCommand::FileMode
376cc290419Sopenharmony_ci        | HdcCommand::DirMode
377cc290419Sopenharmony_ci        | HdcCommand::AppCheck
378cc290419Sopenharmony_ci        | HdcCommand::AppData
379cc290419Sopenharmony_ci        | HdcCommand::AppUninstall
380cc290419Sopenharmony_ci        | HdcCommand::ForwardInit
381cc290419Sopenharmony_ci        | HdcCommand::ForwardCheck
382cc290419Sopenharmony_ci        | HdcCommand::ForwardCheckResult
383cc290419Sopenharmony_ci        | HdcCommand::ForwardActiveSlave
384cc290419Sopenharmony_ci        | HdcCommand::ForwardActiveMaster
385cc290419Sopenharmony_ci        | HdcCommand::ForwardData
386cc290419Sopenharmony_ci        | HdcCommand::ForwardFreeContext
387cc290419Sopenharmony_ci        | HdcCommand::UnityRunmode
388cc290419Sopenharmony_ci        | HdcCommand::UnityReboot
389cc290419Sopenharmony_ci        | HdcCommand::UnityRemount
390cc290419Sopenharmony_ci        | HdcCommand::UnityRootrun
391cc290419Sopenharmony_ci        | HdcCommand::JdwpList
392cc290419Sopenharmony_ci        | HdcCommand::JdwpTrack => daemon_file_task(task_message, session_id).await,
393cc290419Sopenharmony_ci        HdcCommand::KernelWakeupSlavetask => Ok(()),
394cc290419Sopenharmony_ci        _ => Err(Error::new(
395cc290419Sopenharmony_ci            ErrorKind::Other,
396cc290419Sopenharmony_ci            format!("unknown command: {}", task_message.command as u32),
397cc290419Sopenharmony_ci        )),
398cc290419Sopenharmony_ci    }
399cc290419Sopenharmony_ci}