示例#1
0
        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));
        }
示例#2
0
 internal static bool TryParse(string rawString, out MessageTrackingEvent enumValue)
 {
     return(EventTypeParser.dictionary.TryGetValue(rawString, out enumValue));
 }
示例#3
0
        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);
        }