/// <summary> /// Default constructor. /// </summary> /// <param name="fieldName">Header field name. For example: "To".</param> /// <param name="values">Addresses collection.</param> /// <exception cref="ArgumentNullException">Is raised when <b>filedName</b> or <b>values</b> is null reference.</exception> /// <exception cref="ArgumentException">Is raised when any of the arguments has invalid value.</exception> public Mail_h_AddressList(string fieldName,Mail_t_AddressList values) { if(fieldName == null){ throw new ArgumentNullException("fieldName"); } if(fieldName == string.Empty){ throw new ArgumentException("Argument 'fieldName' value must be specified."); } if(values == null){ throw new ArgumentNullException("values"); } m_Name = fieldName; m_pAddresses = values; }
/// <summary> /// Parses <b>address-list</b> from specified string value. /// </summary> /// <param name="value">The <b>address-list</b> string value.</param> /// <returns></returns> /// <exception cref="ArgumentNullException">Is raised when <b>value</b> is null reference.</exception> /// <exception cref="ParseException">Is raised when <b>value</b> is not valid <b>address-list</b> value.</exception> public static Mail_t_AddressList Parse(string value) { if(value == null){ throw new ArgumentNullException("value"); } /* RFC 5322 3.4. address = mailbox / group mailbox = name-addr / addr-spec name-addr = [display-name] angle-addr angle-addr = [CFWS] "<" addr-spec ">" [CFWS] / obs-angle-addr group = display-name ":" [group-list] ";" [CFWS] display-name = phrase mailbox-list = (mailbox *("," mailbox)) / obs-mbox-list address-list = (address *("," address)) / obs-addr-list group-list = mailbox-list / CFWS / obs-group-list */ MIME_Reader r = new MIME_Reader(value); Mail_t_AddressList retVal = new Mail_t_AddressList(); while(true){ string word = r.QuotedReadToDelimiter(new char[]{',','<',':'}); // We processed all data. if(word == null && r.Available == 0){ break; } // group else if(r.Peek(true) == ':'){ Mail_t_Group group = new Mail_t_Group(word != null ? MIME_Encoding_EncodedWord.DecodeS(TextUtils.UnQuoteString(word)) : null); // Consume ':' r.Char(true); while(true){ word = r.QuotedReadToDelimiter(new char[]{',','<',':',';'}); // We processed all data. if((word == null && r.Available == 0) || r.Peek(false) == ';'){ break; } // In valid address list value. else if(word == string.Empty){ throw new ParseException("Invalid address-list value '" + value + "'."); } // name-addr else if(r.Peek(true) == '<'){ group.Members.Add(new Mail_t_Mailbox(word != null ? MIME_Encoding_EncodedWord.DecodeS(TextUtils.UnQuoteString(word)) : null,r.ReadParenthesized())); } // addr-spec else{ group.Members.Add(new Mail_t_Mailbox(null,word)); } // We reached at the end of group. if(r.Peek(true) == ';'){ r.Char(true); break; } // We have more addresses. if(r.Peek(true) == ','){ r.Char(false); } } retVal.Add(group); } // name-addr else if(r.Peek(true) == '<'){ retVal.Add(new Mail_t_Mailbox(word != null ? MIME_Encoding_EncodedWord.DecodeS(TextUtils.UnQuoteString(word.Trim())) : null,r.ReadParenthesized())); } // addr-spec else{ retVal.Add(new Mail_t_Mailbox(null,word)); } // We have more addresses. if(r.Peek(true) == ','){ r.Char(false); } } return retVal; }