1 | /// List of allowed mimes. |
2 | pub static ALLOWED_MIME_TYPES: [&str; 3] = |
3 | ["text/plain;charset=utf-8" , "UTF8_STRING" , "text/plain" ]; |
4 | |
5 | /// Mime type supported by clipboard. |
6 | #[derive (Clone, Copy, Eq, PartialEq, Debug)] |
7 | pub enum MimeType { |
8 | /// text/plain;charset=utf-8 mime type. |
9 | /// |
10 | /// The primary mime type used by most clients |
11 | TextPlainUtf8 = 0, |
12 | /// UTF8_STRING mime type. |
13 | /// |
14 | /// Some X11 clients are using only this mime type, so we |
15 | /// should have it as a fallback just in case. |
16 | Utf8String = 1, |
17 | /// text/plain mime type. |
18 | /// |
19 | /// Fallback without charset parameter. |
20 | TextPlain = 2, |
21 | } |
22 | |
23 | impl MimeType { |
24 | /// Find first allowed mime type among the `offered_mime_types`. |
25 | /// |
26 | /// `find_allowed()` searches for mime type clipboard supports, if we have a |
27 | /// match, returns `Some(MimeType)`, otherwise `None`. |
28 | pub fn find_allowed(offered_mime_types: &[String]) -> Option<Self> { |
29 | let mut fallback: Option = None; |
30 | for offered_mime_type: &String in offered_mime_types.iter() { |
31 | if offered_mime_type == ALLOWED_MIME_TYPES[Self::TextPlainUtf8 as usize] { |
32 | return Some(Self::TextPlainUtf8); |
33 | } else if offered_mime_type == ALLOWED_MIME_TYPES[Self::Utf8String as usize] { |
34 | return Some(Self::Utf8String); |
35 | } else if offered_mime_type == ALLOWED_MIME_TYPES[Self::TextPlain as usize] { |
36 | // Only use this mime type as a fallback. |
37 | fallback = Some(Self::TextPlain); |
38 | } |
39 | } |
40 | |
41 | fallback |
42 | } |
43 | } |
44 | |
45 | impl std::fmt::Display for MimeType { |
46 | fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { |
47 | write!(f, " {}" , ALLOWED_MIME_TYPES[*self as usize]) |
48 | } |
49 | } |
50 | |
51 | /// Normalize CR and CRLF into LF. |
52 | /// |
53 | /// 'text' mime types require CRLF line ending according to |
54 | /// RFC-2046, however the platform line terminator and what applications |
55 | /// expect is LF. |
56 | pub fn normalize_to_lf(text: String) -> String { |
57 | text.replace(" \r\n" , " \n" ).replace(from:' \r' , to:" \n" ) |
58 | } |
59 | |