JLChen
2021-11-04 d3713a9e02760ac9f5c0551ca72be0bdda3ba91c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
/*
 * Copyright 2012 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.
 */
 
#import "ZXEmailAddressParsedResult.h"
#import "ZXEmailAddressResultParser.h"
#import "ZXEmailDoCoMoResultParser.h"
#import "ZXResult.h"
 
static NSCharacterSet *ZX_EMAIL_ADDRESS_RESULT_COMMA = nil;
 
@implementation ZXEmailAddressResultParser
 
+ (void)initialize {
  if ([self class] != [ZXEmailAddressResultParser class]) return;
 
  ZX_EMAIL_ADDRESS_RESULT_COMMA = [NSCharacterSet characterSetWithCharactersInString:@","];
}
 
- (ZXParsedResult *)parse:(ZXResult *)result {
  NSString *rawText = [ZXResultParser massagedText:result];
  if ([rawText hasPrefix:@"mailto:"] || [rawText hasPrefix:@"MAILTO:"]) {
    // If it starts with mailto:, assume it is definitely trying to be an email address
    NSString *hostEmail = [rawText substringFromIndex:7];
    NSUInteger queryStart = [hostEmail rangeOfString:@"?"].location;
    if (queryStart != NSNotFound) {
      hostEmail = [hostEmail substringToIndex:queryStart];
    }
    hostEmail = [[self class] urlDecode:hostEmail];
    NSArray *tos;
    if (hostEmail.length > 0) {
      tos = [hostEmail componentsSeparatedByCharactersInSet:ZX_EMAIL_ADDRESS_RESULT_COMMA];
    }
    NSMutableDictionary *nameValues = [self parseNameValuePairs:rawText];
    NSArray *ccs;
    NSArray *bccs;
    NSString *subject = nil;
    NSString *body = nil;
    if (nameValues != nil) {
      if (!tos) {
        NSString *tosString = nameValues[@"to"];
        if (tosString) {
          tos = [tosString componentsSeparatedByCharactersInSet:ZX_EMAIL_ADDRESS_RESULT_COMMA];
        }
      }
      NSString *ccString = nameValues[@"cc"];
      if (ccString) {
        ccs = [ccString componentsSeparatedByCharactersInSet:ZX_EMAIL_ADDRESS_RESULT_COMMA];
      }
      NSString *bccString = nameValues[@"bcc"];
      if (bccString) {
        bccs = [bccString componentsSeparatedByCharactersInSet:ZX_EMAIL_ADDRESS_RESULT_COMMA];
      }
      subject = nameValues[@"subject"];
      body = nameValues[@"body"];
    }
    return [[ZXEmailAddressParsedResult alloc] initWithTos:tos ccs:ccs bccs:bccs subject:subject body:body];
  } else {
    if (![ZXEmailDoCoMoResultParser isBasicallyValidEmailAddress:rawText]) {
      return nil;
    }
    return [[ZXEmailAddressParsedResult alloc] initWithTo:rawText];
  }
}
 
@end