1use std::cmp::{max, min};
6use std::ops::Range;
7
8use embedder_traits::{EmbedderControlId, EmbedderControlResponse, FilePickerRequest};
9use ipc_channel::ipc::IpcSender;
10use malloc_size_of_derive::MallocSizeOf;
11use num_traits::ToPrimitive;
12use profile_traits::generic_callback::GenericCallback;
13use serde::{Deserialize, Serialize};
14use servo_base::generic_channel::GenericSender;
15use servo_url::ImmutableOrigin;
16use uuid::Uuid;
17
18use crate::blob_url_store::{BlobBuf, BlobURLStoreError};
19
20#[derive(Clone)]
22pub enum FileTokenCheck {
23 NotRequired,
27 Required(Uuid),
29 ShouldFail,
33}
34
35#[derive(Clone, Copy, Debug, Deserialize, MallocSizeOf, Serialize)]
39pub struct RelativePos {
40 pub start: i64,
43 pub end: Option<i64>,
47}
48
49impl RelativePos {
50 pub fn full_range() -> RelativePos {
52 RelativePos {
53 start: 0,
54 end: None,
55 }
56 }
57
58 pub fn from_opts(start: Option<i64>, end: Option<i64>) -> RelativePos {
60 RelativePos {
61 start: start.unwrap_or(0),
62 end,
63 }
64 }
65
66 pub fn slice_inner(&self, rel_pos: &RelativePos) -> RelativePos {
68 RelativePos {
69 start: self.start + rel_pos.start,
70 end: match (self.end, rel_pos.end) {
71 (Some(old_end), Some(rel_end)) => Some(old_end + rel_end),
72 (old, None) => old,
73 (None, rel) => rel,
74 },
75 }
76 }
77
78 pub fn to_abs_range(&self, size: usize) -> Range<usize> {
81 let size = size as i64;
82
83 let start = {
84 if self.start < 0 {
85 max(size + self.start, 0)
86 } else {
87 min(self.start, size)
88 }
89 };
90
91 let end = match self.end {
92 Some(rel_end) => {
93 if rel_end < 0 {
94 max(size + rel_end, 0)
95 } else {
96 min(rel_end, size)
97 }
98 },
99 None => size,
100 };
101
102 let span: i64 = max(end - start, 0);
103
104 Range {
105 start: start.to_usize().unwrap(),
106 end: (start + span).to_usize().unwrap(),
107 }
108 }
109
110 pub fn to_abs_blob_range(&self, size: usize) -> Range<usize> {
114 let orig_range = self.to_abs_range(size);
115 let start = orig_range.start;
116 let end = usize::min(orig_range.end + 1, size);
117 Range { start, end }
118 }
119}
120
121#[derive(Debug, Deserialize, Serialize)]
122pub enum FileManagerThreadMsg {
123 SelectFiles(
125 EmbedderControlId,
126 FilePickerRequest,
127 GenericCallback<EmbedderControlResponse>,
128 ),
129
130 ReadFile(
132 IpcSender<FileManagerResult<ReadFileProgress>>,
133 Uuid,
134 ImmutableOrigin,
135 ),
136
137 PromoteMemory(Uuid, BlobBuf, bool, ImmutableOrigin),
139
140 AddSlicedURLEntry(
143 Uuid,
144 RelativePos,
145 GenericSender<Result<Uuid, BlobURLStoreError>>,
146 ImmutableOrigin,
147 ),
148
149 DecRef(
151 Uuid,
152 ImmutableOrigin,
153 GenericSender<Result<(), BlobURLStoreError>>,
154 ),
155
156 ActivateBlobURL(
158 Uuid,
159 IpcSender<Result<(), BlobURLStoreError>>,
160 ImmutableOrigin,
161 ),
162
163 RevokeBlobURL(
165 Uuid,
166 ImmutableOrigin,
167 GenericSender<Result<(), BlobURLStoreError>>,
168 ),
169}
170
171#[derive(Debug, Deserialize, Serialize)]
172pub enum ReadFileProgress {
173 Meta(BlobBuf),
174 Partial(Vec<u8>),
175 EOF,
176}
177
178pub type FileManagerResult<T> = Result<T, FileManagerThreadError>;
179
180#[derive(Debug, Deserialize, Serialize)]
181pub enum FileManagerThreadError {
182 InvalidSelection,
184 UserCancelled,
186 FileSystemError(String),
188 BlobURLStoreError(BlobURLStoreError),
190}