void HeadersChanged (object o, HeaderListChangedEventArgs e)
{
InternetAddressList list;
byte[] rawValue;
int index = 0;
int number;
switch (e.Action) {
case HeaderListChangedAction.Added:
if (addresses.TryGetValue (e.Header.Field, out list)) {
AddAddresses (e.Header, list);
break;
}
rawValue = e.Header.RawValue;
switch (e.Header.Id) {
case HeaderId.MimeVersion:
MimeUtils.TryParse (rawValue, 0, rawValue.Length, out version);
break;
case HeaderId.References:
references.Changed -= ReferencesChanged;
foreach (var msgid in MimeUtils.EnumerateReferences (rawValue, 0, rawValue.Length))
references.Add (msgid);
references.Changed += ReferencesChanged;
break;
case HeaderId.InReplyTo:
inreplyto = MimeUtils.EnumerateReferences (rawValue, 0, rawValue.Length).FirstOrDefault ();
break;
case HeaderId.ResentMessageId:
resentMessageId = MimeUtils.ParseMessageId (rawValue, 0, rawValue.Length);
break;
case HeaderId.MessageId:
messageId = MimeUtils.ParseMessageId (rawValue, 0, rawValue.Length);
break;
case HeaderId.ResentSender:
MailboxAddress.TryParse (Headers.Options, rawValue, ref index, rawValue.Length, false, out resentSender);
break;
case HeaderId.Sender:
MailboxAddress.TryParse (Headers.Options, rawValue, ref index, rawValue.Length, false, out sender);
break;
case HeaderId.ResentDate:
DateUtils.TryParse (rawValue, 0, rawValue.Length, out resentDate);
break;
case HeaderId.Importance:
switch (e.Header.Value.ToLowerInvariant ().Trim ()) {
case "high": importance = MessageImportance.High; break;
case "low": importance = MessageImportance.Low; break;
default: importance = MessageImportance.Normal; break;
}
break;
case HeaderId.Priority:
switch (e.Header.Value.ToLowerInvariant ().Trim ()) {
case "non-urgent": priority = MessagePriority.NonUrgent; break;
case "urgent": priority = MessagePriority.Urgent; break;
default: priority = MessagePriority.Normal; break;
}
break;
case HeaderId.XPriority:
ParseUtils.SkipWhiteSpace (rawValue, ref index, rawValue.Length);
if (ParseUtils.TryParseInt32 (rawValue, ref index, rawValue.Length, out number)) {
xpriority = (XMessagePriority) Math.Min (Math.Max (number, 1), 5);
} else {
xpriority = XMessagePriority.Normal;
}
break;
case HeaderId.Date:
DateUtils.TryParse (rawValue, 0, rawValue.Length, out date);
break;
}
break;
case HeaderListChangedAction.Changed:
case HeaderListChangedAction.Removed:
if (addresses.TryGetValue (e.Header.Field, out list)) {
ReloadAddressList (e.Header.Id, list);
break;
}
ReloadHeader (e.Header.Id);
break;
case HeaderListChangedAction.Cleared:
foreach (var kvp in addresses) {
kvp.Value.Changed -= InternetAddressListChanged;
kvp.Value.Clear ();
kvp.Value.Changed += InternetAddressListChanged;
}
references.Changed -= ReferencesChanged;
references.Clear ();
references.Changed += ReferencesChanged;
resentDate = date = DateTimeOffset.MinValue;
importance = MessageImportance.Normal;
xpriority = XMessagePriority.Normal;
priority = MessagePriority.Normal;
resentMessageId = null;
resentSender = null;
inreplyto = null;
messageId = null;
version = null;
sender = null;
break;
default:
throw new ArgumentOutOfRangeException ();
}
}