private static bool TryEnqueueNextHopAfterSubmit(MessageTrackingLogEntry submitEvent, TrackingContext context, Queue <MailItemTracker> remainingTrackers)
 {
     return(LogDataAnalyzer.TryEnqueueNextHopAfterSubmitInternal(submitEvent, context, remainingTrackers, false));
 }
        private static bool TryEnqueueNextHopAfterModeratorApprove(MessageTrackingLogEntry approvalEvent, TrackingContext context, Queue <MailItemTracker> remainingTrackers)
        {
            ILogReader logReader = RpcLogReader.GetLogReader(approvalEvent.Server, context.DirectoryContext);

            if (logReader == null)
            {
                return(false);
            }
            List <MessageTrackingLogEntry> messageLog = context.Cache.GetMessageLog(RpcReason.None, logReader, TrackingLogPrefix.MSGTRK, approvalEvent.MessageId, new MessageTrackingSource?(MessageTrackingSource.STOREDRIVER), SearchMessageTrackingReportImpl.SubmitEventFilterSet);

            if (messageLog.Count == 0)
            {
                TraceWrapper.SearchLibraryTracer.TraceError <string>(0, "Moderator approval event found, but no matching submission of the message back into transport was found on mailbox server {0}.", approvalEvent.Server);
                return(false);
            }
            MessageTrackingLogEntry messageTrackingLogEntry = null;

            foreach (MessageTrackingLogEntry messageTrackingLogEntry2 in messageLog)
            {
                if (!LogDataAnalyzer.IsEntryProcessed(messageTrackingLogEntry2, context.Tree))
                {
                    messageTrackingLogEntry             = messageTrackingLogEntry2;
                    messageTrackingLogEntry.ProcessedBy = context.Tree;
                    break;
                }
            }
            if (messageTrackingLogEntry == null)
            {
                TraceWrapper.SearchLibraryTracer.TraceError(0, "All submission events found after processing moderator approval had already been processed.", new object[0]);
                return(false);
            }
            ILogReader logReader2 = RpcLogReader.GetLogReader(messageTrackingLogEntry.NextHopFqdnOrName, context.DirectoryContext);

            if (logReader2 == null)
            {
                return(false);
            }
            List <MessageTrackingLogEntry> messageLog2 = context.Cache.GetMessageLog(RpcReason.None, logReader2, TrackingLogPrefix.MSGTRK, approvalEvent.OrigMessageId, new MessageTrackingSource?(MessageTrackingSource.APPROVAL), SearchMessageTrackingReportImpl.ReceiveEventFilterSet);

            if (messageLog2.Count == 0)
            {
                TraceWrapper.SearchLibraryTracer.TraceError(0, "No Approval Received events found", new object[0]);
                return(false);
            }
            foreach (MessageTrackingLogEntry messageTrackingLogEntry3 in messageLog2)
            {
                if (!LogDataAnalyzer.IsEntryProcessed(messageTrackingLogEntry3, context.Tree) && approvalEvent.MessageId.Equals(messageTrackingLogEntry3.InitMessageId, StringComparison.Ordinal))
                {
                    if (logReader.MtrSchemaVersion >= MtrSchemaVersion.E15RTM)
                    {
                        if (!LogDataAnalyzer.TryEnqueueNextHopAfterSubmitInternal(messageTrackingLogEntry3, context, remainingTrackers, true))
                        {
                            continue;
                        }
                    }
                    else
                    {
                        List <MessageTrackingLogEntry> messageLog3 = context.Cache.GetMessageLog(RpcReason.None, logReader2, TrackingLogPrefix.MSGTRK, approvalEvent.OrigMessageId, messageTrackingLogEntry3.ServerLogKeyMailItemId);
                        if (messageLog3.Count == 0)
                        {
                            continue;
                        }
                        MailItemTracker item = new MailItemTracker(messageLog3, context.Tree);
                        remainingTrackers.Enqueue(item);
                    }
                    return(true);
                }
            }
            TraceWrapper.SearchLibraryTracer.TraceError(0, "No unprocessed Approval Received events found", new object[0]);
            return(false);
        }