protected override Node DisambiguateParentRecord(LinkedList <Node> possibleParents, Node node) { MessageTrackingLogEntry messageTrackingLogEntry = (MessageTrackingLogEntry)node.Value; if (possibleParents == null || possibleParents.Count == 0) { return(null); } MessageTrackingEvent eventId = messageTrackingLogEntry.EventId; if (eventId <= MessageTrackingEvent.REDIRECT) { switch (eventId) { case MessageTrackingEvent.RECEIVE: return(this.FindParentMatchingParameters(messageTrackingLogEntry, null, EventTree.receiveEventMatchingTypes, EventTree.EventMatchingCondition.MustMatch, null, possibleParents)); case MessageTrackingEvent.SEND: break; case MessageTrackingEvent.FAIL: return(this.FindParentMatchingParameters(messageTrackingLogEntry, new long?(messageTrackingLogEntry.InternalMessageId), EventTree.beginModerationEventType, EventTree.EventMatchingCondition.MustNotMatch, null, possibleParents)); default: if (eventId == MessageTrackingEvent.REDIRECT) { if (messageTrackingLogEntry.RecipientAddresses == null || messageTrackingLogEntry.RecipientAddresses.Length == 0) { return(null); } foreach (Node node2 in possibleParents) { MessageTrackingLogEntry messageTrackingLogEntry2 = (MessageTrackingLogEntry)node2.Value; if (messageTrackingLogEntry2.EventId == MessageTrackingEvent.REDIRECT && messageTrackingLogEntry2.RelatedRecipientAddress != null && !messageTrackingLogEntry2.RelatedRecipientAddress.Equals(messageTrackingLogEntry2.RecipientAddresses[0])) { return(node2); } } return(this.FindParentMatchingParameters(messageTrackingLogEntry, null, EventTree.redirectEventType, EventTree.EventMatchingCondition.MustNotMatch, null, possibleParents)); } break; } } else { switch (eventId) { case MessageTrackingEvent.DUPLICATEDELIVER: return(this.FindParentMatchingParameters(messageTrackingLogEntry, new long?(messageTrackingLogEntry.ServerLogKeyMailItemId), EventTree.deliveryEventTypes, EventTree.EventMatchingCondition.MustNotMatch, null, possibleParents)); case MessageTrackingEvent.RESUBMIT: if (messageTrackingLogEntry.Source == MessageTrackingSource.REDUNDANCY) { return(this.FindParentMatchingParameters(messageTrackingLogEntry, null, EventTree.haResubmitEventMatchingTypes, EventTree.EventMatchingCondition.MustMatch, null, possibleParents)); } break; case MessageTrackingEvent.INITMESSAGECREATED: break; case MessageTrackingEvent.MODERATORREJECT: return(this.FindParentMatchingParameters(messageTrackingLogEntry, null, EventTree.beginModerationEventType, EventTree.EventMatchingCondition.MustMatch, null, possibleParents)); case MessageTrackingEvent.MODERATORAPPROVE: return(this.FindParentMatchingParameters(messageTrackingLogEntry, null, EventTree.beginModerationEventType, EventTree.EventMatchingCondition.MustMatch, null, possibleParents)); default: if (eventId == MessageTrackingEvent.HAREDIRECT) { return(null); } if (eventId == MessageTrackingEvent.HARECEIVE) { return(this.FindParentMatchingParameters(messageTrackingLogEntry, null, EventTree.haReceiveEventMatchingTypes, EventTree.EventMatchingCondition.MustMatch, null, possibleParents)); } break; } } return(this.FindParentMatchingParameters(messageTrackingLogEntry, new long?(messageTrackingLogEntry.ServerLogKeyMailItemId), null, EventTree.EventMatchingCondition.MustMatch, null, possibleParents)); }
internal static bool TryParse(string rawString, out MessageTrackingEvent enumValue) { return(EventTypeParser.dictionary.TryGetValue(rawString, out enumValue)); }
public List <MessageTrackingLogEntry> ProcessEntries() { List <MessageTrackingLogEntry> list = new List <MessageTrackingLogEntry>(); if (this.entriesForMailItem == null || this.entriesForMailItem.Count == 0) { TraceWrapper.SearchLibraryTracer.TraceDebug(this.GetHashCode(), "No entries for tracker, finishing the tree at this node", new object[0]); return(list); } this.FixupFederatedDeliveryEvents(); this.entriesForMailItem.Sort((MessageTrackingLogEntry left, MessageTrackingLogEntry right) => this.LogEntryComparer(left, right)); foreach (MessageTrackingLogEntry messageTrackingLogEntry in this.entriesForMailItem) { if (!this.ShouldSkipEvent(messageTrackingLogEntry)) { messageTrackingLogEntry.ProcessedBy = this.tree; MessageTrackingEvent eventId = messageTrackingLogEntry.EventId; if (messageTrackingLogEntry.EventId == MessageTrackingEvent.SUBMIT) { if (messageTrackingLogEntry.RecipientAddresses == null || messageTrackingLogEntry.RecipientAddresses.Length == 0) { messageTrackingLogEntry.RecipientAddresses = MailItemTracker.emptyRecipientList; } if (this.tree.Root != null) { list.Add(messageTrackingLogEntry); return(list); } } bool flag; if (eventId == MessageTrackingEvent.EXPAND || eventId == MessageTrackingEvent.RESOLVE) { string text = messageTrackingLogEntry.RelatedRecipientAddress; if (messageTrackingLogEntry.RecipientAddresses == null || messageTrackingLogEntry.RecipientAddresses.Length == 0) { TraceWrapper.SearchLibraryTracer.TraceDebug(this.GetHashCode(), "No recipients in EXPAND event. Removing parent from leaf node dictionary.", new object[0]); this.tree.RemoveKeyFromLeafSet(text); continue; } int num = messageTrackingLogEntry.RecipientAddresses.Length; Node[] array = new Node[num]; for (int i = 0; i < num; i++) { string key = messageTrackingLogEntry.RecipientAddresses[i]; Node node = new Node(key, text, messageTrackingLogEntry.Clone()); array[i] = node; } flag = this.tree.InsertAllChildrenForOneNode(text, array); if (flag && eventId == MessageTrackingEvent.EXPAND && string.IsNullOrEmpty(messageTrackingLogEntry.FederatedDeliveryAddress)) { this.tree.DropRecipientDueToPotentialDuplication(text); } } else { if (messageTrackingLogEntry.RecipientAddresses == null || messageTrackingLogEntry.RecipientAddresses.Length == 0) { TraceWrapper.SearchLibraryTracer.TraceError <MessageTrackingLogEntry>(this.GetHashCode(), "A Message Tracking Log Entry of type other than SUBMIT or EXPAND had no recipients: {0}.\n", messageTrackingLogEntry); continue; } bool entryIsStoreDriverReceiveEvent = eventId == MessageTrackingEvent.RECEIVE && messageTrackingLogEntry.Source == MessageTrackingSource.STOREDRIVER; bool entryIsAgentReceiveEvent = eventId == MessageTrackingEvent.RECEIVE && messageTrackingLogEntry.Source == MessageTrackingSource.AGENT; int num2 = 0; HashSet <string> hashSet = null; if (eventId == MessageTrackingEvent.RECEIVE) { hashSet = new HashSet <string>(StringComparer.OrdinalIgnoreCase); } for (int j = 0; j < messageTrackingLogEntry.RecipientAddresses.Length; j++) { if (hashSet == null || hashSet.Add(messageTrackingLogEntry.RecipientAddresses[j])) { string text = messageTrackingLogEntry.RecipientAddresses[j]; Node node2; if (eventId == MessageTrackingEvent.REDIRECT) { node2 = new Node(messageTrackingLogEntry.RelatedRecipientAddress, text, messageTrackingLogEntry.Clone()); } else { node2 = new Node(messageTrackingLogEntry.RecipientAddresses[j], text, messageTrackingLogEntry.Clone()); } MessageTrackingLogEntry messageTrackingLogEntry2 = (MessageTrackingLogEntry)node2.Value; this.SetPerRecipientProperties(node2, j, entryIsStoreDriverReceiveEvent, entryIsAgentReceiveEvent); if (this.tree.Insert(node2)) { num2++; } } } flag = (num2 == messageTrackingLogEntry.RecipientAddresses.Length); } if (!flag && ServerCache.Instance.ReportNonFatalBugs) { string extraData = string.Format(CultureInfo.InvariantCulture, "Not all entries can be inserted into the tree. total number of entries is {0}, Message id = {1}, server = {2}", new object[] { this.entriesForMailItem.Count, this.entriesForMailItem[0].MessageId, this.entriesForMailItem[0].Server }); DiagnosticWatson.SendWatsonWithoutCrash(new InvalidOperationException(), "RecipInsertFailure", TimeSpan.FromHours(3.0), extraData); } if (messageTrackingLogEntry.IsTerminalEvent) { list.Add(messageTrackingLogEntry); } } } return(list); }