// Token: 0x06000774 RID: 1908 RVA: 0x00034760 File Offset: 0x00032960
        private bool IsMessageInteresting(MapiEvent mapiEvent)
        {
            bool flag = ResourceCheck.IsEventConfigChange(mapiEvent);

            if (ObjectClass.IsMiddleTierRulesMessage(mapiEvent.ObjectClass) && !flag)
            {
                return(true);
            }
            if (!CalendarAssistant.ShouldProcessMessageClass(mapiEvent) && !flag)
            {
                return(false);
            }
            CachedState cachedState = AssistantsService.CachedObjectsList.GetCachedState(mapiEvent.MailboxGuid);
            bool?       flag2       = ResourceCheck.QuickCheckForAutomatedBooking(mapiEvent, cachedState);

            if (flag2 == null)
            {
                return(true);
            }
            if (flag2 == false)
            {
                cachedState.LockForRead();
                CalendarConfiguration calendarConfiguration;
                try
                {
                    calendarConfiguration = (cachedState.State[0] as CalendarConfiguration);
                }
                finally
                {
                    cachedState.ReleaseReaderLock();
                }
                return(!calendarConfiguration.SkipProcessing);
            }
            return(false);
        }
 // Token: 0x060007B1 RID: 1969 RVA: 0x0003701C File Offset: 0x0003521C
 private static bool ShouldIgnoreFolder(MailboxSession itemStore, StoreObjectId folderId)
 {
     foreach (DefaultFolderType defaultFolderType in OldMessageDeletion.FoldersToIgnore)
     {
         StoreObjectId defaultFolderId = itemStore.GetDefaultFolderId(defaultFolderType);
         if (defaultFolderId != null && defaultFolderId.Equals(folderId))
         {
             return(true);
         }
     }
     return(CalendarAssistant.IsDumpsterFolder(itemStore, folderId));
 }
        // Token: 0x06000783 RID: 1923 RVA: 0x0003546C File Offset: 0x0003366C
        private static bool ShouldIgnoreMessage(MailboxSession itemStore, StoreObjectId folderId, MeetingMessage mtgMessage)
        {
            foreach (DefaultFolderType defaultFolderType in CalendarAssistant.FoldersToIgnore)
            {
                StoreObjectId defaultFolderId = itemStore.GetDefaultFolderId(defaultFolderType);
                if (defaultFolderId != null && defaultFolderId.Equals(folderId))
                {
                    return(true);
                }
            }
            StoreObjectId defaultFolderId2 = itemStore.GetDefaultFolderId(DefaultFolderType.DeletedItems);

            if (defaultFolderId2 != null && defaultFolderId2.Equals(folderId) && mtgMessage != null && mtgMessage is MeetingRequest)
            {
                return(!OldMessageDeletion.IsSelfForwardedEvent(mtgMessage, itemStore));
            }
            return(CalendarAssistant.IsDumpsterFolder(itemStore, folderId));
        }
Ejemplo n.º 4
0
        // Token: 0x06000790 RID: 1936 RVA: 0x00035684 File Offset: 0x00033884
        public void ProcessMeetingMessage(MailboxSession itemStore, MeetingMessage mtgMessage, ref CalendarItemBase originalCalItem, CalendarConfiguration mailboxConfig, IEnumerable <VersionedId> duplicates, bool performOmd, bool honorExternalMeetingMessageProcessingConfig)
        {
            bool isProcessed = mtgMessage.IsProcessed;
            bool flag        = this.PreProcessMessage(itemStore, mtgMessage, isProcessed, mtgMessage.CalendarProcessed);
            bool flag2       = false;

            if (!flag)
            {
                flag2 = CalendarProcessing.IsAutoAcceptanceProcessingRequired(itemStore, mtgMessage, originalCalItem);
            }
            if (flag || flag2)
            {
                int num = mailboxConfig.DefaultReminderTime;
                if (num < 0 || num > 2629800)
                {
                    num = CalendarProcessing.DefaultReminderMinutesBeforeStart;
                }
                int num2 = 3;
                int i    = num2;
                if (this.honorProcessingConfiguration && originalCalItem == null && !mailboxConfig.AddNewRequestsTentatively && !mtgMessage.IsRepairUpdateMessage)
                {
                    CalendarProcessing.ProcessingTracer.TraceDebug((long)mtgMessage.GetHashCode(), "{0}: Skipping processing because user settings for adding new items is false.", new object[]
                    {
                        TraceContext.Get()
                    });
                    return;
                }
                if (honorExternalMeetingMessageProcessingConfig && mtgMessage.SkipMessage(mailboxConfig.ProcessExternalMeetingMessages, originalCalItem))
                {
                    CalendarProcessing.ProcessingTracer.TraceDebug <object, bool>((long)mtgMessage.GetHashCode(), "{0}: Skipping processing because user settings for processing external items is false. IsRepairUpdateMessage: {1}", TraceContext.Get(), mtgMessage.IsRepairUpdateMessage);
                    return;
                }
                while (i > 0)
                {
                    try
                    {
                        if (flag)
                        {
                            if (!this.DoProcessingLogic(itemStore, mtgMessage, ref originalCalItem, num, ref i))
                            {
                                this.TraceDebugAndPfd(mtgMessage.GetHashCode(), string.Format("{0}: completedProcessing = {1}", TraceContext.Get(), false));
                                continue;
                            }
                            flag = false;
                            this.TraceDebugAndPfd(mtgMessage.GetHashCode(), string.Format("{0}: completedProcessing = {1}", TraceContext.Get(), true));
                            flag2 = CalendarProcessing.IsAutoAcceptanceProcessingRequired(itemStore, mtgMessage, originalCalItem);
                        }
                        if (flag2)
                        {
                            CalendarProcessing.AutoAcceptEvents(itemStore, originalCalItem);
                            flag2 = false;
                        }
                        if (!flag && !flag2)
                        {
                            break;
                        }
                    }
                    catch (ObjectExistedException exception)
                    {
                        this.TraceAndLogException(exception, itemStore, mtgMessage, i);
                        i--;
                    }
                    catch (SaveConflictException ex)
                    {
                        this.TraceAndLogException(ex, itemStore, mtgMessage, i);
                        i--;
                        if (originalCalItem != null)
                        {
                            originalCalItem.Dispose();
                            originalCalItem = null;
                        }
                        if (!CalendarAssistant.GetCalendarItem(mtgMessage, CalendarProcessing.UnexpectedPathTracer, ref originalCalItem, duplicates != null, out duplicates))
                        {
                            throw new SkipException(Strings.descSkipExceptionFailedToLoadCalItem, ex);
                        }
                        if (originalCalItem != null)
                        {
                            originalCalItem.OpenAsReadWrite();
                        }
                    }
                    catch (QuotaExceededException exception2)
                    {
                        this.TraceAndLogException(exception2, itemStore, mtgMessage, i);
                        i = -1;
                    }
                    catch (ObjectNotFoundException ex2)
                    {
                        this.TraceAndLogException(ex2, itemStore, mtgMessage, i);
                        throw new SkipException(ex2);
                    }
                    catch (VirusDetectedException exception3)
                    {
                        this.TraceAndLogException(exception3, itemStore, mtgMessage, i);
                        i = -1;
                    }
                    catch (VirusMessageDeletedException exception4)
                    {
                        this.TraceAndLogException(exception4, itemStore, mtgMessage, i);
                        i = -1;
                    }
                    catch (DataValidationException ex3)
                    {
                        this.TraceAndLogException(ex3, itemStore, mtgMessage, i);
                        throw new SkipException(ex3);
                    }
                    catch (RecurrenceException ex4)
                    {
                        this.TraceAndLogException(ex4, itemStore, mtgMessage, i);
                        throw new SkipException(ex4);
                    }
                }
                if (flag && i == 0)
                {
                    string internetMessageId = mtgMessage.InternetMessageId;
                    CalendarProcessing.ProcessingTracer.TraceDebug <object, string>((long)mtgMessage.GetHashCode(), "{0}: Attempting a third time to process message, but without the catch blocks: {1}", TraceContext.Get(), internetMessageId);
                    this.DoProcessingLogic(itemStore, mtgMessage, ref originalCalItem, num, ref i);
                }
            }
            if (ObjectClass.IsMeetingCancellationSeries(mtgMessage.ClassName) || ObjectClass.IsMeetingRequestSeries(mtgMessage.ClassName))
            {
                this.TryUnparkInstanceMessages(itemStore, mtgMessage.GetValueOrDefault <string>(MeetingMessageSchema.SeriesId), mtgMessage.GetValueOrDefault <int>(MeetingMessageSchema.SeriesSequenceNumber));
            }
            if (performOmd)
            {
                this.OldMessageDeletion.PerformCleanUp(itemStore, mtgMessage, mailboxConfig, originalCalItem, duplicates);
            }
        }
        // Token: 0x06000780 RID: 1920 RVA: 0x000351F4 File Offset: 0x000333F4
        internal static bool GetCalendarItem(MeetingMessage mtgMessage, Trace tracer, ref CalendarItemBase originalCalItem, bool shouldDetectDuplicateIds, out IEnumerable <VersionedId> detectedDuplicatesIds)
        {
            Exception ex;

            return(CalendarAssistant.GetCalendarItem(mtgMessage, tracer, ref originalCalItem, shouldDetectDuplicateIds, out detectedDuplicatesIds, out ex));
        }
        // Token: 0x06000779 RID: 1913 RVA: 0x00034A3C File Offset: 0x00032C3C
        private void HandleMeetingMessage(MapiEvent mapiEvent, MailboxSession itemStore, StoreObject item, List <KeyValuePair <string, object> > customDataToLog)
        {
            if (item == null)
            {
                string objectClass = mapiEvent.ObjectClass;
            }
            else
            {
                string className = item.ClassName;
            }
            if (itemStore.GetDefaultFolderId(DefaultFolderType.Calendar) == null)
            {
                CalendarAssistant.GeneralTracer.TraceDebug((long)this.GetHashCode(), "{0}: Calendar folder does not exist. Skipping processing.", new object[]
                {
                    TraceContext.Get()
                });
                CalendarAssistantLog.LogEntry(itemStore, "Could not get default folder id", new object[0]);
                return;
            }
            if (item == null)
            {
                return;
            }
            MeetingMessage meetingMessage = item as MeetingMessage;

            if (meetingMessage != null && meetingMessage.IsArchiveMigratedMessage)
            {
                CalendarAssistant.CachedStateTracer.TraceDebug((long)this.GetHashCode(), "{0}: Skipping the processing of the meeting item as this is an EHA migration traffic.", new object[]
                {
                    TraceContext.Get()
                });
                return;
            }
            CachedState cachedState = AssistantsService.CachedObjectsList.GetCachedState(mapiEvent.MailboxGuid);
            bool        flag        = ResourceCheck.DetailedCheckForAutomatedBooking(mapiEvent, itemStore, item, cachedState);

            if (itemStore != null)
            {
                string legacyDn = itemStore.MailboxOwner.LegacyDn;
            }
            if (flag)
            {
                CalendarAssistant.CachedStateTracer.TraceDebug((long)this.GetHashCode(), "{0}: Updated the cachedState object, but this is a resource mailbox.", new object[]
                {
                    TraceContext.Get()
                });
                return;
            }
            cachedState.LockForRead();
            CalendarConfiguration calendarConfiguration;

            try
            {
                calendarConfiguration = (cachedState.State[0] as CalendarConfiguration);
            }
            finally
            {
                cachedState.ReleaseReaderLock();
            }
            if (calendarConfiguration.SkipProcessing)
            {
                CalendarAssistant.CachedStateTracer.TraceDebug((long)this.GetHashCode(), "{0}: SkipProcessing is set.", new object[]
                {
                    TraceContext.Get()
                });
                return;
            }
            if (CalendarAssistant.ShouldIgnoreMessage(itemStore, item.ParentId, meetingMessage))
            {
                return;
            }
            string text = (string)Utils.SafeGetProperty(item, ItemSchema.InternetMessageId, "<null>");

            if (CalendarAssistant.ShouldProcessMessageClass(mapiEvent) && CalendarAssistant.ShouldProcessSeriesMessages(mapiEvent, itemStore))
            {
                bool     flag2  = false;
                DateTime utcNow = DateTime.UtcNow;
                if (meetingMessage != null)
                {
                    CalendarItemBase calendarItemBase = null;
                    try
                    {
                        if (meetingMessage.IsDelegated())
                        {
                            this.calProcessor.OldMessageDeletion.PerformCleanUp(itemStore, item, calendarConfiguration, calendarItemBase, null);
                        }
                        else
                        {
                            IEnumerable <VersionedId> duplicates;
                            bool calendarItem = CalendarAssistant.GetCalendarItem(meetingMessage, CalendarAssistant.UnexpectedPathTracer, ref calendarItemBase, true, out duplicates);
                            if (calendarItem)
                            {
                                this.calProcessor.ProcessMeetingMessage(itemStore, meetingMessage, ref calendarItemBase, calendarConfiguration, duplicates, true, itemStore.MailboxOwner.IsResource.Value);
                            }
                        }
                    }
                    catch (OccurrenceCrossingBoundaryException ex)
                    {
                        CalendarAssistant.ProcessingTracer.TraceDebug <object, VersionedId>((long)meetingMessage.GetHashCode(), "{0}: Found an overlapping occurrence while processing message ID={1}. Cleaning things up and retrying", TraceContext.Get(), meetingMessage.Id);
                        StringBuilder stringBuilder = new StringBuilder(1024);
                        stringBuilder.AppendFormat("Found an overlapping occurrence while processing message ID={0}.", meetingMessage.Id);
                        if (ex.OccurrenceInfo == null)
                        {
                            CalendarAssistant.UnexpectedPathTracer.TraceError((long)this.GetHashCode(), "{0}: Unexpected: Handling OccurrenceCrossingBoundaryException, the OccurrenceInfo is null.", new object[]
                            {
                                TraceContext.Get()
                            });
                            stringBuilder.Append("Unexpected: Handling OccurrenceCrossingBoundaryException, the OccurrenceInfo is null.");
                        }
                        else
                        {
                            VersionedId versionedId = ex.OccurrenceInfo.VersionedId;
                            AggregateOperationResult aggregateOperationResult = meetingMessage.Session.Delete(DeleteItemFlags.MoveToDeletedItems, new StoreId[]
                            {
                                versionedId
                            });
                            CalendarAssistant.ProcessingTracer.TraceDebug <object, OperationResult>((long)this.GetHashCode(), "{0}: Deleting the occurrence when handling an OccurrenceCrossingBoundaryException, returned:{1}", TraceContext.Get(), aggregateOperationResult.OperationResult);
                            stringBuilder.AppendFormat("Deleting the occurrence when handling an OccurrenceCrossingBoundaryException, returned: {0}", aggregateOperationResult.OperationResult);
                        }
                        CalendarAssistantLog.LogEntry(itemStore, ex, false, stringBuilder.ToString(), new object[0]);
                    }
                    catch (CorruptDataException ex2)
                    {
                        CalendarAssistant.ProcessingTracer.TraceDebug <object, CorruptDataException>((long)this.GetHashCode(), "{0}: Got a corrupt message, exception data:{1}", TraceContext.Get(), ex2);
                        CalendarAssistantLog.LogEntry(itemStore, ex2, false, "Got a corrupt message ID = {0}.", new object[]
                        {
                            meetingMessage.Id
                        });
                    }
                    finally
                    {
                        if (calendarItemBase != null)
                        {
                            calendarItemBase.Dispose();
                            calendarItemBase = null;
                        }
                    }
                    flag2 = true;
                }
                else if (item is MeetingInquiryMessage)
                {
                    MeetingInquiryMessage meetingInquiryMessage = (MeetingInquiryMessage)item;
                    try
                    {
                        this.calProcessor.ProcessMeetingInquiryMessage(this.cvsGateway, itemStore, meetingInquiryMessage);
                    }
                    catch (CalendarVersionStoreNotPopulatedException ex3)
                    {
                        CalendarAssistant.ProcessingTracer.TraceWarning <object, CalendarVersionStoreNotPopulatedException>((long)this.GetHashCode(), "{0}: Failed to process an inquiry message, because the CVS is not populated yet. {1}", TraceContext.Get(), ex3);
                        CalendarAssistantLog.LogEntry(itemStore, ex3, false, "Failed to process an inquiry message ID = {0}, because the CVS is not populated yet.", new object[]
                        {
                            meetingInquiryMessage.Id
                        });
                    }
                    this.calProcessor.OldMessageDeletion.DeleteMessage(itemStore, item);
                    flag2 = true;
                }
                else
                {
                    CalendarAssistant.UnexpectedPathTracer.TraceError((long)this.GetHashCode(), "{0}: Unexpected: Message class matched, but is not the correct object type. Ignoring message.", new object[]
                    {
                        TraceContext.Get()
                    });
                    CalendarAssistantLog.LogEntry(itemStore, "Unexpected: Message class matched, but is not the correct object type. Ignoring message ID = {0}.", new object[]
                    {
                        item.Id
                    });
                }
                if (flag2)
                {
                    TimeSpan timeSpan = DateTime.UtcNow.Subtract(utcNow);
                    CalendarAssistantPerformanceCounters.LastCalAssistantProcessingTime.RawValue = (long)timeSpan.TotalMilliseconds;
                    CalendarAssistantPerformanceCounters.AverageCalAssistantProcessingTime.IncrementBy((long)timeSpan.TotalMilliseconds);
                    CalendarAssistantPerformanceCounters.AverageCalAssistantProcessingTimeBase.Increment();
                    CalendarAssistantPerformanceCounters.MeetingMessagesProcessed.Increment();
                }
                CalendarAssistant.GeneralTracer.TraceDebug <object, string>((long)this.GetHashCode(), "{0}: Finished processing message. InternetMessgeID = {1}", TraceContext.Get(), text);
                CalendarAssistant.TracerPfd.TracePfd <int, object, string>((long)this.GetHashCode(), "PFD IWC {0} {1}: Finished processing message. InternetMessgeID = {2}", 21655, TraceContext.Get(), text);
            }
        }