Merge pull request #2826 from mattleibow/mono.options-update
[mono.git] / mcs / class / System.Web / System.Web.Mail / MailAddress.cs
1 //
2 // System.Web.Mail.MailAddress.cs
3 //
4 // Author(s):
5 //   Per Arneng <pt99par@student.bth.se>
6 //
7 //
8
9 //
10 // Permission is hereby granted, free of charge, to any person obtaining
11 // a copy of this software and associated documentation files (the
12 // "Software"), to deal in the Software without restriction, including
13 // without limitation the rights to use, copy, modify, merge, publish,
14 // distribute, sublicense, and/or sell copies of the Software, and to
15 // permit persons to whom the Software is furnished to do so, subject to
16 // the following conditions:
17 // 
18 // The above copyright notice and this permission notice shall be
19 // included in all copies or substantial portions of the Software.
20 // 
21 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
22 // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
23 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
24 // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
25 // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
26 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
27 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
28 //
29 using System;
30 using System.Text;
31
32 namespace System.Web.Mail {
33
34     // Reperesents a mail address
35     internal class MailAddress {
36         
37         protected string user;
38         protected string host;
39         protected string name;
40         
41         public string User {
42             get { return user; }
43             set { user = value; }
44         }
45
46         public string Host {
47             get { return host; }
48             set { host = value; }
49         }
50
51         public string Name {
52             get { return name; }
53             set { name = value; }
54         }
55
56         public string Address {
57                 get { return String.Concat (user, "@", host); }
58             set {
59                 
60                 string[] parts = value.Split( new char[] { '@' } );
61                 
62                 if( parts.Length != 2 ) 
63                     throw new FormatException( "Invalid e-mail address: '" + value + "'.");
64                 
65                 user = parts[ 0 ];
66                 host = parts[ 1 ];
67             }
68         }
69
70         public static MailAddress Parse( string str ) {
71             if (str == null || str.Trim () == "")
72                 return null;
73
74             MailAddress addr = new MailAddress();
75             string address = null;
76             string nameString = null;
77             string[] parts = str.Split( new char[] { ' ', '<' } );
78             
79             // find the address: xxx@xx.xxx
80             // and put to gether all the parts
81             // before the address as nameString
82             foreach( string part in parts ) {
83                 
84                 if( part.IndexOf( '@' ) > 0 ) {
85                     address = part;
86                     break;
87                 }
88                 
89                 nameString = nameString + part + " ";
90             }
91
92             if( address == null ) 
93                 throw new FormatException( "Invalid e-mail address: '" + str + "'.");
94             
95             address = address.Trim( new char[] { '<' , '>' , '(' , ')' } );
96             
97             addr.Address = address;
98             
99             if( nameString != null ) {
100                 addr.Name = nameString.Trim( new char[] { ' ' , '"' } );
101                 addr.Name = ( addr.Name.Length == 0 ? null : addr.Name ); 
102             }
103             
104             
105             return addr;
106         } 
107     
108     
109         public override string ToString() {
110             
111             string retString = "";
112         
113             if( name == null ) {
114                 
115                     retString = String.Concat ("<", this.Address, ">");
116             
117             } else {
118                 
119                 string personName = this.Name;
120
121                 if( MailUtil.NeedEncoding( personName ))
122                     personName = "=?" + Encoding.Default.BodyName + "?B?" + MailUtil.Base64Encode(personName) + "?=";
123
124                 retString = "\"" + personName + "\" <" + this.Address + ">";
125             }
126             
127             return retString;
128         }
129     }
130
131 }