cyfs_lib/trans/
output_request.rs

1use crate::*;
2use cyfs_base::*;
3
4use cyfs_bdt::{NdnTaskControlState, NdnTaskState};
5use cyfs_core::TransContext;
6use serde::{Deserialize, Serialize};
7use std::path::PathBuf;
8use std::str::FromStr;
9
10#[derive(Clone, Debug, Serialize, Deserialize)]
11pub struct TransTaskOnAirState {
12    pub download_percent: u32,
13    pub download_speed: u32,
14    pub upload_speed: u32,
15}
16
17#[derive(Clone, Debug, Serialize, Deserialize)]
18pub enum TransTaskState {
19    Pending,
20    Downloading(TransTaskOnAirState),
21    Paused,
22    Canceled,
23    Finished(u32/*upload_speed*/),
24    Err(BuckyErrorCode),
25}
26
27#[derive(Clone, Debug, Serialize, Deserialize)]
28pub enum TransTaskStatus {
29    Stopped,
30    Running,
31    Finished,
32    Failed,
33}
34
35pub struct TransTaskInfo {
36    pub task_id: String,
37    pub context: Option<String>,
38    pub object_id: ObjectId,
39    pub local_path: PathBuf,
40    pub device_list: Vec<DeviceId>,
41}
42/*
43#[serde(deserialize_with = "error_code_deserialize")]
44#[serde(serialize_with = "error_code_serialize")]
45fn error_code_serialize<S>(err: &BuckyErrorCode, s: S) -> Result<S::Ok, S::Error>
46where
47    S: Serializer,
48{
49    s.serialize_u16(err.as_u16())
50}
51
52fn error_code_deserialize<'de, D>(d: D) -> Result<BuckyErrorCode, D::Error>
53where
54    D: Deserializer<'de>,
55{
56    struct BuckyErrorCodeVisitor {}
57    impl<'de> Visitor<'de> for BuckyErrorCodeVisitor {
58        type Value = BuckyErrorCode;
59
60        fn expecting(&self, formatter: &mut std::fmt::Formatter) -> std::fmt::Result {
61            formatter.write_str("BuckyErrorCode")
62        }
63
64        fn visit_u16<E>(self, v: u16) -> Result<Self::Value, E>
65        where E: de::Error, {
66            Ok(BuckyErrorCode::from(v))
67        }
68    }
69
70    d.deserialize_u16(BuckyErrorCodeVisitor {})
71}
72*/
73
74#[derive(Clone, Debug)]
75pub enum TransTaskControlAction {
76    Start,
77    Stop,
78    Delete,
79}
80
81impl ToString for TransTaskControlAction {
82    fn to_string(&self) -> String {
83        (match *self {
84            Self::Start => "Start",
85            Self::Stop => "Stop",
86            Self::Delete => "Delete",
87        })
88        .to_owned()
89    }
90}
91
92impl FromStr for TransTaskControlAction {
93    type Err = BuckyError;
94
95    fn from_str(value: &str) -> Result<Self, Self::Err> {
96        let ret = match value {
97            "Start" => Self::Start,
98            "Stop" => Self::Stop,
99            "Delete" => Self::Delete,
100            v @ _ => {
101                let msg = format!("unknown TransTaskControlAction: {}", v);
102                error!("{}", msg);
103
104                return Err(BuckyError::new(BuckyErrorCode::InvalidData, msg));
105            }
106        };
107
108        Ok(ret)
109    }
110}
111
112pub struct TransGetContextOutputRequest {
113    pub common: NDNOutputRequestCommon,
114
115    // get TransContext object by object id
116    pub context_id: Option<ObjectId>,
117
118    // or get TransContext object by context_path excatly
119    pub context_path: Option<String>,
120}
121
122pub struct TransGetContextOutputResponse {
123    pub context: TransContext,
124}
125
126pub struct TransPutContextOutputRequest {
127    pub common: NDNOutputRequestCommon,
128    
129    pub context: TransContext,
130    pub access: Option<AccessString>,
131}
132
133#[derive(Debug)]
134pub struct TransCreateTaskOutputRequest {
135    pub common: NDNOutputRequestCommon,
136    pub object_id: ObjectId,
137    // 保存到的本地目录or文件
138    pub local_path: PathBuf,
139    pub device_list: Vec<DeviceId>,
140
141    pub group: Option<String>,
142    pub context: Option<String>,
143
144    // 任务创建完成之后自动启动任务
145    pub auto_start: bool,
146}
147
148#[derive(Debug, Serialize, Deserialize)]
149pub struct TransCreateTaskOutputResponse {
150    pub task_id: String,
151}
152
153pub struct TransTaskOutputRequest {
154    pub common: NDNOutputRequestCommon,
155    pub task_id: String,
156}
157
158// 控制传输一个任务的状态
159#[derive(Debug)]
160pub struct TransControlTaskOutputRequest {
161    // 用以处理acl
162    pub common: NDNOutputRequestCommon,
163    pub task_id: String,
164    pub action: TransTaskControlAction,
165}
166
167// get task state
168#[derive(Debug)]
169pub struct TransGetTaskStateOutputRequest {
170    // 用以处理acl
171    pub common: NDNOutputRequestCommon,
172    pub task_id: String,
173}
174
175#[derive(Clone, Debug, Serialize, Deserialize)]
176pub struct TransGetTaskStateOutputResponse {
177    pub state: TransTaskState,
178    pub group: Option<String>,
179}
180
181// query tasks
182#[derive(Debug)]
183pub struct TransQueryTasksOutputRequest {
184    pub common: NDNOutputRequestCommon,
185    pub task_status: Option<TransTaskStatus>,
186    pub range: Option<(u64, u32)>,
187}
188
189pub struct TransQueryTasksOutputResponse {
190    pub task_list: Vec<TransTaskInfo>,
191}
192
193// publish file
194#[derive(Debug)]
195pub struct TransPublishFileOutputRequest {
196    // 用以处理acl
197    pub common: NDNOutputRequestCommon,
198    // 文件所属者
199    pub owner: ObjectId,
200
201    // 文件的本地路径
202    pub local_path: PathBuf,
203    // chunk大小
204    pub chunk_size: u32,
205
206    pub chunk_method: TransPublishChunkMethod, 
207
208    pub access: Option<AccessString>,
209    
210    // 需要发布的文件对象ID,如果设置,内部不再计算文件对象
211    pub file_id: Option<ObjectId>,
212
213    // 关联的dirs
214    pub dirs: Option<Vec<FileDirRef>>,
215}
216
217#[derive(Debug, Serialize, Deserialize)]
218pub struct TransPublishFileOutputResponse {
219    pub file_id: ObjectId,
220}
221
222#[derive(Clone, Copy, Debug, Serialize, Deserialize)]
223pub enum TransTaskGroupType {
224    Download, 
225    Upload
226}
227
228
229impl ToString for TransTaskGroupType {
230    fn to_string(&self) -> String {
231        match self {
232            Self::Download => "download".to_owned(), 
233            Self::Upload => "upload".to_owned()
234        }
235        
236    }
237}
238
239impl FromStr for TransTaskGroupType {
240    type Err = BuckyError;
241
242    fn from_str(value: &str) -> Result<Self, Self::Err> {
243        let ret = match value {
244            "download" => Self::Download,
245            "upload" => Self::Upload,
246            v @ _ => {
247                let msg = format!("unknown trans group type: {}", v);
248                error!("{}", msg);
249
250                return Err(BuckyError::new(BuckyErrorCode::InvalidParam, msg));
251            }
252        };
253
254        Ok(ret)
255    }
256}
257
258// get task group state
259#[derive(Debug, Serialize, Deserialize)]
260pub struct TransGetTaskGroupStateOutputRequest {
261    pub common: NDNOutputRequestCommon,
262    pub group_type: TransTaskGroupType, 
263    pub group: String,
264    pub speed_when: Option<u64>,
265}
266
267#[derive(Debug, Serialize, Deserialize)]
268pub struct TransGetTaskGroupStateOutputResponse {
269    pub state: NdnTaskState,
270    pub control_state: NdnTaskControlState,
271    pub speed: Option<u32>,
272    pub cur_speed: u32,
273    pub history_speed: u32, 
274    pub transfered: u64
275}
276
277// control task group
278#[derive(Clone, Debug, Serialize, Deserialize)]
279pub enum TransTaskGroupControlAction {
280    Resume,
281    Cancel,
282    Pause,
283    Close, 
284    CloseRecursively
285}
286
287#[derive(Debug, Serialize, Deserialize)]
288pub struct TransControlTaskGroupOutputRequest {
289    pub common: NDNOutputRequestCommon,
290    pub group_type: TransTaskGroupType, 
291    pub group: String,
292    pub action: TransTaskGroupControlAction,
293}
294
295#[derive(Debug, Serialize, Deserialize)]
296pub struct TransControlTaskGroupOutputResponse {
297    pub control_state: NdnTaskControlState,
298}