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: if (ParseUtils.TryParseInt32 (rawValue, ref index, rawValue.Length, out number)) { if (number >= 1 && number <= 5) xpriority = (XPriority) number; else xpriority = XPriority.Normal; } else { xpriority = XPriority.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; priority = MessagePriority.Normal; xpriority = XPriority.Normal; resentMessageId = null; resentSender = null; inreplyto = null; messageId = null; version = null; sender = null; break; default: throw new ArgumentOutOfRangeException (); } }
void ReloadHeader (HeaderId id) { if (id == HeaderId.Unknown) return; switch (id) { case HeaderId.ResentMessageId: resentMessageId = null; break; case HeaderId.ResentSender: resentSender = null; break; case HeaderId.ResentDate: resentDate = DateTimeOffset.MinValue; break; case HeaderId.References: references.Changed -= ReferencesChanged; references.Clear (); references.Changed += ReferencesChanged; break; case HeaderId.InReplyTo: inreplyto = null; break; case HeaderId.MessageId: messageId = null; break; case HeaderId.Sender: sender = null; break; case HeaderId.Importance: importance = MessageImportance.Normal; break; case HeaderId.Priority: priority = MessagePriority.Normal; break; case HeaderId.XPriority: xpriority = XPriority.Normal; break; case HeaderId.Date: date = DateTimeOffset.MinValue; break; } foreach (var header in Headers) { if (header.Id != id) continue; var rawValue = header.RawValue; int number, index = 0; switch (id) { case HeaderId.MimeVersion: if (MimeUtils.TryParse (rawValue, 0, rawValue.Length, out version)) return; 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); if (resentMessageId != null) return; break; case HeaderId.MessageId: messageId = MimeUtils.ParseMessageId (rawValue, 0, rawValue.Length); if (messageId != null) return; break; case HeaderId.ResentSender: MailboxAddress.TryParse (Headers.Options, rawValue, ref index, rawValue.Length, false, out resentSender); if (resentSender != null) return; break; case HeaderId.Sender: MailboxAddress.TryParse (Headers.Options, rawValue, ref index, rawValue.Length, false, out sender); if (sender != null) return; break; case HeaderId.ResentDate: if (DateUtils.TryParse (rawValue, 0, rawValue.Length, out resentDate)) return; break; case HeaderId.Importance: switch (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 (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: if (ParseUtils.TryParseInt32 (rawValue, ref index, rawValue.Length, out number)) { if (number >= 1 && number <= 5) xpriority = (XPriority) number; else xpriority = XPriority.Normal; } else { xpriority = XPriority.Normal; } break; case HeaderId.Date: if (DateUtils.TryParse (rawValue, 0, rawValue.Length, out date)) return; break; } } }