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}