/* * Copyright 2008 ZXing authors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ // package com.google.zxing.client.result; // import com.google.zxing.RXingResult; // import java.util.ArrayList; // import java.util.Collection; // import java.util.List; // import java.util.Map; /** *

Parses an "sms:" URI result, which specifies a number to SMS. * See RFC 5724 on this.

* *

This class supports "via" syntax for numbers, which is not part of the spec. * For example "+12125551212;via=+12124440101" may appear as a number. * It also supports a "subject" query parameter, which is not mentioned in the spec. * These are included since they were mentioned in earlier IETF drafts and might be * used.

* *

This actually also parses URIs starting with "mms:" and treats them all the same way, * and effectively converts them to an "sms:" URI for purposes of forwarding to the platform.

* * @author Sean Owen */ // public final class SMSMMSRXingResultParser extends RXingResultParser { use crate::RXingResult; use super::{ParsedClientResult, ResultParser, SMSParsedRXingResult}; // @Override pub fn parse(result: &RXingResult) -> Option { let raw_text = ResultParser::getMassagedText(result); if !(raw_text.starts_with("sms:") || raw_text.starts_with("SMS:") || raw_text.starts_with("mms:") || raw_text.starts_with("MMS:")) { return None; } let mut subject = "".to_owned(); let mut body = "".to_owned(); let mut querySyntax = false; // Check up front if this is a URI syntax string with query arguments if let Some(name_value_pairs) = ResultParser::parseNameValuePairs(&raw_text) { if !name_value_pairs.is_empty() { subject = String::from(name_value_pairs.get("subject").unwrap_or(&"".to_owned())); body = String::from(name_value_pairs.get("body").unwrap_or(&"".to_owned())); querySyntax = true; } } // Drop sms, query portion let query_start = raw_text[4..].find('?'); let sms_uriwithout_query; // If it's not query syntax, the question mark is part of the subject or message if query_start.is_none() || !querySyntax { sms_uriwithout_query = &raw_text[4..]; } else { sms_uriwithout_query = &raw_text[4..4 + query_start.unwrap_or(0)]; } let mut last_comma: i32 = -1; let mut comma: i32 = sms_uriwithout_query[(last_comma + 1) as usize..] .find(',') .unwrap_or(0) as i32; let mut numbers = Vec::with_capacity(1); let mut vias = Vec::with_capacity(1); while comma > last_comma { comma = sms_uriwithout_query[(last_comma + 1) as usize..] .find(',') .unwrap_or(0) as i32; //sms_uriwithout_query.indexOf(',', lastComma + 1); let number_part = &sms_uriwithout_query[(last_comma + 1) as usize..(last_comma + 1 + comma) as usize]; add_number_via(&mut numbers, &mut vias, number_part); last_comma = comma; } add_number_via( &mut numbers, &mut vias, &sms_uriwithout_query[(if last_comma > 0 { last_comma + 1 } else { last_comma }) as usize..], ); Some(ParsedClientResult::SMSResult( SMSParsedRXingResult::with_arrays(numbers, vias, subject.to_owned(), body.to_owned()), )) // return new SMSParsedRXingResult(numbers.toArray(EMPTY_STR_ARRAY), // vias.toArray(EMPTY_STR_ARRAY), // subject, // body); } fn add_number_via(numbers: &mut Vec, vias: &mut Vec, number_part: &str) { if number_part.is_empty() { return; } if let Some(number_end) = number_part.find(';') { // if numberEnd < 0 { numbers.push(number_part[..number_end].to_string()); let maybe_via = &number_part[number_end + 1..]; let via = if maybe_via.starts_with("via=") { &maybe_via[4..] } else { "" }; if !via.is_empty() { vias.push(via.to_owned()); } } else { numbers.push(number_part.to_owned()); //vias.push("".to_owned()); } } // }