1use std::cmp::{max, min};
6use std::ops::Range;
7use std::path::PathBuf;
8use std::time::SystemTime;
9
10use base::id::WebViewId;
11use embedder_traits::FilterPattern;
12use ipc_channel::ipc::IpcSender;
13use malloc_size_of_derive::MallocSizeOf;
14use num_traits::ToPrimitive;
15use serde::{Deserialize, Serialize};
16use uuid::Uuid;
17
18use crate::blob_url_store::{BlobBuf, BlobURLStoreError};
19
20pub type FileOrigin = String;
24
25pub enum FileTokenCheck {
27 NotRequired,
31 Required(Uuid),
33 ShouldFail,
37}
38
39#[derive(Clone, Copy, Debug, Deserialize, MallocSizeOf, Serialize)]
43pub struct RelativePos {
44 pub start: i64,
47 pub end: Option<i64>,
51}
52
53impl RelativePos {
54 pub fn full_range() -> RelativePos {
56 RelativePos {
57 start: 0,
58 end: None,
59 }
60 }
61
62 pub fn from_opts(start: Option<i64>, end: Option<i64>) -> RelativePos {
64 RelativePos {
65 start: start.unwrap_or(0),
66 end,
67 }
68 }
69
70 pub fn slice_inner(&self, rel_pos: &RelativePos) -> RelativePos {
72 RelativePos {
73 start: self.start + rel_pos.start,
74 end: match (self.end, rel_pos.end) {
75 (Some(old_end), Some(rel_end)) => Some(old_end + rel_end),
76 (old, None) => old,
77 (None, rel) => rel,
78 },
79 }
80 }
81
82 pub fn to_abs_range(&self, size: usize) -> Range<usize> {
85 let size = size as i64;
86
87 let start = {
88 if self.start < 0 {
89 max(size + self.start, 0)
90 } else {
91 min(self.start, size)
92 }
93 };
94
95 let end = match self.end {
96 Some(rel_end) => {
97 if rel_end < 0 {
98 max(size + rel_end, 0)
99 } else {
100 min(rel_end, size)
101 }
102 },
103 None => size,
104 };
105
106 let span: i64 = max(end - start, 0);
107
108 Range {
109 start: start.to_usize().unwrap(),
110 end: (start + span).to_usize().unwrap(),
111 }
112 }
113
114 pub fn to_abs_blob_range(&self, size: usize) -> Range<usize> {
118 let orig_range = self.to_abs_range(size);
119 let start = orig_range.start;
120 let end = usize::min(orig_range.end + 1, size);
121 Range { start, end }
122 }
123}
124
125#[derive(Debug, Deserialize, Serialize)]
127pub struct SelectedFile {
128 pub id: Uuid,
129 pub filename: PathBuf,
130 pub modified: SystemTime,
131 pub size: u64,
132 pub type_string: String,
134}
135
136#[derive(Debug, Deserialize, Serialize)]
137pub enum FileManagerThreadMsg {
138 SelectFile(
140 WebViewId,
141 Vec<FilterPattern>,
142 IpcSender<FileManagerResult<SelectedFile>>,
143 FileOrigin,
144 Option<PathBuf>,
145 ),
146
147 SelectFiles(
149 WebViewId,
150 Vec<FilterPattern>,
151 IpcSender<FileManagerResult<Vec<SelectedFile>>>,
152 FileOrigin,
153 Option<Vec<PathBuf>>,
154 ),
155
156 ReadFile(
158 IpcSender<FileManagerResult<ReadFileProgress>>,
159 Uuid,
160 FileOrigin,
161 ),
162
163 PromoteMemory(Uuid, BlobBuf, bool, FileOrigin),
165
166 AddSlicedURLEntry(
169 Uuid,
170 RelativePos,
171 IpcSender<Result<Uuid, BlobURLStoreError>>,
172 FileOrigin,
173 ),
174
175 DecRef(Uuid, FileOrigin, IpcSender<Result<(), BlobURLStoreError>>),
177
178 ActivateBlobURL(Uuid, IpcSender<Result<(), BlobURLStoreError>>, FileOrigin),
180
181 RevokeBlobURL(Uuid, FileOrigin, IpcSender<Result<(), BlobURLStoreError>>),
183}
184
185#[derive(Debug, Deserialize, Serialize)]
186pub enum ReadFileProgress {
187 Meta(BlobBuf),
188 Partial(Vec<u8>),
189 EOF,
190}
191
192pub type FileManagerResult<T> = Result<T, FileManagerThreadError>;
193
194#[derive(Debug, Deserialize, Serialize)]
195pub enum FileManagerThreadError {
196 InvalidSelection,
198 UserCancelled,
200 FileSystemError(String),
202 BlobURLStoreError(BlobURLStoreError),
204}