rust_rcs_core/internet/
name_addr.rs

1// Copyright 2023 宋昊文
2//
3// Licensed under the Apache License, Version 2.0 (the "License");
4// you may not use this file except in compliance with the License.
5// You may obtain a copy of the License at
6//
7//     http://www.apache.org/licenses/LICENSE-2.0
8//
9// Unless required by applicable law or agreed to in writing, software
10// distributed under the License is distributed on an "AS IS" BASIS,
11// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12// See the License for the specific language governing permissions and
13// limitations under the License.
14
15use std::io::Read;
16
17use crate::internet::syntax;
18use crate::io::{DynamicChain, Serializable};
19
20use super::parameter::ParameterParser;
21
22pub struct NameAddr<'a> {
23    pub display_name: Option<&'a [u8]>,
24    pub uri_part: Option<NameAddrUri<'a>>,
25}
26
27impl<'a> NameAddr<'a> {
28    fn from_name_uri(name: Option<&'a [u8]>, uri: Option<&'a [u8]>) -> NameAddr<'a> {
29        if let Some(uri) = uri {
30            if let Some(idx) = syntax::index_with_token_escaping(uri, b';') {
31                NameAddr {
32                    display_name: name,
33                    uri_part: Some(NameAddrUri {
34                        uri: &uri[..idx],
35                        // uri_parameters: parameter::parse_parameters(&uri[idx + 1..], b';'),
36                        uri_parameters: &uri[idx + 1..],
37                    }),
38                }
39            } else {
40                NameAddr {
41                    display_name: name,
42                    uri_part: Some(NameAddrUri {
43                        uri,
44                        uri_parameters: &[],
45                    }),
46                }
47            }
48        } else {
49            NameAddr {
50                display_name: name,
51                uri_part: None,
52            }
53        }
54    }
55
56    // pub fn uri_part_to_string(&self) -> Option<Vec<u8>> {
57    //     if let Some(uri_part) = &self.uri_part {
58    //         let (uri, uri_parameters) = uri_part;
59    //         let mut uri = uri.to_vec();
60    //         for p in uri_parameters {
61    //             uri.extend(b";");
62    //             uri.extend_from_slice(p.name);
63    //             if let Some(v) = p.value {
64    //                 uri.extend(b"=");
65    //                 uri.extend_from_slice(v);
66    //             }
67    //         }
68    //         return Some(uri);
69    //     }
70
71    //     None
72    // }
73
74    pub fn get_readers(&'a self, readers: &mut Vec<Box<dyn Read + Send + 'a>>) {
75        if let Some(display_name) = self.display_name {
76            readers.push(Box::new(&b"\""[..]));
77            readers.push(Box::new(&display_name[..]));
78            readers.push(Box::new(&b"\""[..]));
79            if let Some(_) = self.uri_part {
80                readers.push(Box::new(&b", "[..]));
81            }
82        }
83
84        if let Some(uri_part) = &self.uri_part {
85            readers.push(Box::new(&b"<"[..]));
86            uri_part.get_readers(readers);
87            readers.push(Box::new(&b">"[..]));
88        }
89
90        // if let Some(uri_part) = self.uri_part {
91        //     let uri_part_reader = uri_part.reader();
92        //     NameAddrReader{
93        //         display_name: self.display_name,
94        //         uri_part: Some(uri_part_reader),
95        //         uri_part_length: uri_part.estimated_size(),
96        //         pos: 0,
97        //     }
98        // } else {
99        //     NameAddrReader{
100        //         display_name: self.display_name,
101        //         uri_part: None,
102        //         uri_part_length: 0,
103        //         pos: 0,
104        //     }
105        // }
106    }
107}
108
109pub struct NameAddrUri<'a> {
110    pub uri: &'a [u8],
111    pub uri_parameters: &'a [u8],
112}
113
114impl<'a> NameAddrUri<'a> {
115    pub fn get_parameter_iterator(&'a self) -> ParameterParser<'a> {
116        ParameterParser::new(self.uri_parameters, b';', false)
117    }
118
119    pub fn get_readers(&'a self, readers: &mut Vec<Box<dyn Read + Send + 'a>>) {
120        readers.push(Box::new(&self.uri[..]));
121        readers.push(Box::new(&self.uri_parameters[..]));
122
123        // for p in self.get_parameter_iterator() {
124        //     readers.push(Box::new(p.reader()));
125        // }
126    }
127}
128
129pub trait AsNameAddr<'a> {
130    type Target;
131    fn as_name_addresses(&'a self) -> Vec<Self::Target>;
132}
133
134impl<'a> AsNameAddr<'a> for [u8] {
135    type Target = NameAddr<'a>;
136    fn as_name_addresses(&'a self) -> Vec<NameAddr> {
137        let mut name_addresses = Vec::new();
138
139        let mut i = 0;
140
141        let mut quoted_name: Option<&[u8]> = None;
142        let mut bracket_uri: Option<&[u8]> = None;
143
144        let mut uri_spec_start_index = 0;
145
146        while i < self.len() {
147            let c = self[i];
148
149            if c == b'"' {
150                if let Some(idx) = syntax::index_with_character_escaping(&self[i + 1..], b'"') {
151                    quoted_name = Some(&self[i + 1..i + idx + 1]);
152                    i = i + idx;
153                }
154            } else if c == b'<' {
155                if let Some(idx) = syntax::index_with_character_escaping(&self[i + 1..], b'>') {
156                    bracket_uri = Some(&self[i + 1..i + idx + 1]);
157                    i = i + idx;
158                }
159            } else if c == b',' || i + 1 == self.len() {
160                match (quoted_name.take(), bracket_uri.take()) {
161                    (Some(quoted_name), Some(bracket_uri)) => {
162                        let name = syntax::unquote(quoted_name);
163                        let uri = syntax::undo_bracket(bracket_uri);
164                        let name_addr = NameAddr::from_name_uri(Some(name), Some(uri));
165                        name_addresses.push(name_addr);
166                    }
167
168                    (Some(quoted_name), None) => {
169                        let name = syntax::unquote(quoted_name);
170                        let name_addr = NameAddr::from_name_uri(Some(name), None);
171                        name_addresses.push(name_addr);
172                    }
173
174                    (None, Some(bracket_uri)) => {
175                        let uri = syntax::undo_bracket(bracket_uri);
176                        let name_addr = NameAddr::from_name_uri(None, Some(uri));
177                        name_addresses.push(name_addr);
178                    }
179
180                    (None, None) => {
181                        let end = if i + 1 == self.len() { i + 1 } else { i };
182                        let uri = syntax::trim(&self[uri_spec_start_index..end]);
183                        let name_addr = NameAddr::from_name_uri(None, Some(uri));
184                        name_addresses.push(name_addr);
185                    }
186                }
187
188                uri_spec_start_index = i + 1;
189            }
190
191            i = i + 1;
192        }
193
194        name_addresses
195    }
196}
197
198impl<'a> Serializable for NameAddr<'a> {
199    // fn serialize(&self) -> Vec<u8> {
200    //     let mut data = Vec::with_capacity(self.estimated_size());
201    //     if let Some(display_name) = self.display_name {
202    //         data.extend(b"\"");
203    //         data.extend_from_slice(display_name);
204    //         data.extend(b"\"");
205    //         if let Some(_) = self.uri_part {
206    //             data.extend(b", ");
207    //         }
208    //     }
209    //     if let Some(uri_part_string) = self.uri_part_to_string() {
210    //         data.extend(b"<");
211    //         data.extend(uri_part_string);
212    //         data.extend(b">");
213    //     }
214    //     data
215    // }
216
217    fn estimated_size(&self) -> usize {
218        let mut size = 0;
219        if let Some(display_name) = self.display_name {
220            size += 1;
221            size += display_name.len();
222            size += 1;
223            if let Some(_) = self.uri_part {
224                size += 2;
225            }
226        }
227        if let Some(uri_part) = &self.uri_part {
228            size += 1;
229            size += uri_part.estimated_size();
230            size += 1;
231        }
232        // if let Some(uri_part_string) = self.uri_part_to_string() {
233        //     size += 1;
234        //     size += uri_part_string.len();
235        //     size += 1;
236        // }
237        size
238    }
239}
240
241impl<'a> Serializable for NameAddrUri<'a> {
242    fn estimated_size(&self) -> usize {
243        let mut size = 0;
244        size += self.uri.len();
245        for parameter in self.get_parameter_iterator() {
246            size += 1;
247            size += parameter.name.len();
248            if let Some(v) = parameter.value {
249                size += 1;
250                size += v.len();
251            }
252        }
253
254        size
255    }
256}
257
258// pub struct NameAddrReader<'a> {
259//     display_name: Option<&'a [u8]>,
260//     uri_part: Option<NameAddrUriReader<'a>>,
261//     uri_part_length: usize,
262//     pos: usize,
263// }
264
265// impl<'a> Read for NameAddrReader<'a> {
266//     fn read(&mut self, buf: &mut [u8]) -> std::io::Result<usize> {
267//         let mut i = 0;
268//         let mut first_part_size = 0;
269//         if let Some(display_name) = self.display_name {
270//             while self.pos + i < 1 && i < buf.len() {
271//                 buf[i] = b'\"';
272//                 i += 1;
273//             }
274//             while self.pos + i >= 1 && self.pos + i < 1 + display_name.len() && i < buf.len() {
275//                 buf[i] = display_name[self.pos + i - 1];
276//                 i += 1;
277//             }
278//             while self.pos + i >= 1 + display_name.len() && self.pos + i < 1 + display_name.len() + 1 && i < buf.len() {
279//                 buf[i] = b'\"';
280//                 i += 1;
281//             }
282//             if let Some(_) = self.uri_part {
283//                 while self.pos + i >= 1 + display_name.len() + 1 && self.pos + i < 1 + display_name.len() + 1 + 2 && i < buf.len() {
284//                     if self.pos + i == 1 + display_name.len() + 1 {
285//                         buf[i] = b',';
286//                     } else if self.pos + i == 1 + display_name.len() + 1 + 1 {
287//                         buf[i] = b' ';
288//                     }
289//                     i += 1;
290//                 }
291//                 first_part_size = 1 + display_name.len() + 1 + 2;
292//             } else {
293//                 first_part_size = 1 + display_name.len() + 1;
294//             }
295//         }
296//         if self.pos + i >= first_part_size {
297//             if let Some(uri_part) = self.uri_part {
298//                 while self.pos + i >= first_part_size + 1 && i < buf.len() {
299//                     buf[i] = b'<';
300//                     i += 1;
301//                 }
302//                 while i < buf.len() {
303//                     match uri_part.read(&mut buf[i..]) {
304//                         Ok(r) => {
305//                             if r == 0 {
306//                                 break;
307//                             } else {
308//                                 i += r;
309//                             }
310//                         }
311
312//                         Err(e) => {
313//                             return Err(e);
314//                         }
315//                     }
316//                 }
317//                 while self.pos +i >= first_part_size + 1 + self.uri_part_length && self.pos + i < first_part_size + 1 + self.uri_part_length + 1 && i < buf.len() {
318//                     buf[i] = b'>';
319//                     i += 1;
320//                 }
321//             }
322//         }
323//         self.pos += i;
324//         Ok(i)
325//     }
326// }
327
328pub struct NameAddrUriReader<'a> {
329    uri: &'a [u8],
330    chain: DynamicChain<'a>,
331    pos: usize,
332}
333
334impl<'a> Read for NameAddrUriReader<'a> {
335    fn read(&mut self, buf: &mut [u8]) -> std::io::Result<usize> {
336        let mut i = 0;
337        while self.pos + i < self.uri.len() && i < buf.len() {
338            buf[i] = self.uri[self.pos + i];
339            i += 1;
340        }
341        if self.pos + i >= self.uri.len() {
342            while i < buf.len() {
343                match self.chain.read(&mut buf[i..]) {
344                    Ok(r) => {
345                        if r == 0 {
346                            break;
347                        } else {
348                            i += r;
349                        }
350                    }
351                    Err(e) => {
352                        return Err(e);
353                    }
354                }
355            }
356        }
357        self.pos += i;
358        Ok(i)
359    }
360}