// Token: 0x060007BD RID: 1981 RVA: 0x00037EC4 File Offset: 0x000360C4 private static List <VersionedId> GetOldMeetingMessages(MailboxSession mailboxSession, MeetingMessage item, byte[] globalObjectId, int rumSequenceNumber, out OldMessageDeletion.LatestItemInfo latestItemInfo) { SortBy[] array = new SortBy[2]; latestItemInfo.FullUpdateDeleted = false; latestItemInfo.RollingHighlight = (int)Utils.SafeGetProperty(item, CalendarItemBaseSchema.ChangeHighlight, 0); latestItemInfo.LatestOldStartTime = ExDateTime.MinValue; latestItemInfo.LatestOldEndTime = ExDateTime.MinValue; latestItemInfo.LatestOldLocationStr = string.Empty; latestItemInfo.LatestSequenceNumber = -1; latestItemInfo.LatestItemId = item.Id; latestItemInfo.LatestClientSubmitTime = (ExDateTime)Utils.SafeGetProperty(item, ItemSchema.SentTime, ExDateTime.MinValue); ExDateTime valueOrDefault = item.GetValueOrDefault <ExDateTime>(CalendarItemBaseSchema.OwnerCriticalChangeTime, ExDateTime.MinValue); VersionedId id = item.Id; array[0] = new SortBy(CalendarItemBaseSchema.GlobalObjectId, SortOrder.Ascending); array[1] = new SortBy(CalendarItemBaseSchema.AppointmentSequenceNumber, SortOrder.Descending); ComparisonFilter seekFilter = new ComparisonFilter(ComparisonOperator.Equal, CalendarItemBaseSchema.GlobalObjectId, globalObjectId); List <VersionedId> list = new List <VersionedId>(); using (Folder folder = Folder.Bind(mailboxSession, item.ParentId)) { using (QueryResult queryResult = folder.ItemQuery(ItemQueryType.None, null, array, OldMessageDeletion.OMDColumnsToQuery)) { queryResult.SeekToCondition(SeekReference.OriginBeginning, seekFilter); bool flag = true; while (flag) { IStorePropertyBag[] propertyBags = queryResult.GetPropertyBags(25); if (propertyBags.Length <= 1) { break; } foreach (IStorePropertyBag storePropertyBag in propertyBags) { string valueOrDefault2 = storePropertyBag.GetValueOrDefault <string>(OldMessageDeletion.OMDColumnsToQuery[0], null); if (!string.IsNullOrEmpty(valueOrDefault2) && (ObjectClass.IsMeetingRequest(valueOrDefault2) || ObjectClass.IsMeetingCancellation(valueOrDefault2))) { byte[] valueOrDefault3 = storePropertyBag.GetValueOrDefault <byte[]>(OldMessageDeletion.OMDColumnsToQuery[2], null); if (!OldMessageDeletion.GlobalObjectIdMatches(globalObjectId, valueOrDefault3)) { flag = false; break; } VersionedId valueOrDefault4 = storePropertyBag.GetValueOrDefault <VersionedId>(OldMessageDeletion.OMDColumnsToQuery[1], null); if (valueOrDefault4 != null && !id.Equals(valueOrDefault4)) { int valueOrDefault5 = storePropertyBag.GetValueOrDefault <int>(OldMessageDeletion.OMDColumnsToQuery[3], -1); if (valueOrDefault5 != -1) { if (valueOrDefault5 > rumSequenceNumber) { latestItemInfo.LatestSequenceNumber = valueOrDefault5; return(null); } if (valueOrDefault5 == rumSequenceNumber) { ExDateTime valueOrDefault6 = storePropertyBag.GetValueOrDefault <ExDateTime>(OldMessageDeletion.OMDColumnsToQuery[8], ExDateTime.MinValue); if (valueOrDefault6 > valueOrDefault) { latestItemInfo.LatestSequenceNumber = valueOrDefault5; return(null); } } if (latestItemInfo.LatestSequenceNumber == -1) { ExDateTime valueOrDefault7 = storePropertyBag.GetValueOrDefault <ExDateTime>(OldMessageDeletion.OMDColumnsToQuery[9], ExDateTime.MinValue); if (valueOrDefault7 != ExDateTime.MinValue) { latestItemInfo.LatestOldStartTime = valueOrDefault7; } ExDateTime valueOrDefault8 = storePropertyBag.GetValueOrDefault <ExDateTime>(OldMessageDeletion.OMDColumnsToQuery[10], ExDateTime.MinValue); if (valueOrDefault7 != ExDateTime.MinValue) { latestItemInfo.LatestOldEndTime = valueOrDefault8; } string valueOrDefault9 = storePropertyBag.GetValueOrDefault <string>(OldMessageDeletion.OMDColumnsToQuery[11], null); if (!string.IsNullOrEmpty(valueOrDefault9)) { latestItemInfo.LatestOldLocationStr = valueOrDefault9; } } latestItemInfo.RollingHighlight |= storePropertyBag.GetValueOrDefault <int>(OldMessageDeletion.OMDColumnsToQuery[4], 0); MeetingMessageType valueOrDefault10 = storePropertyBag.GetValueOrDefault <MeetingMessageType>(OldMessageDeletion.OMDColumnsToQuery[13], MeetingMessageType.None); latestItemInfo.FullUpdateDeleted |= (valueOrDefault10 == MeetingMessageType.FullUpdate || valueOrDefault10 == MeetingMessageType.NewMeetingRequest); list.Add(valueOrDefault4); } } } } } } } return(list); }
// Token: 0x060007B7 RID: 1975 RVA: 0x00037A84 File Offset: 0x00035C84 private void HandleResponsesWithSameSequenceNumber(MailboxSession itemStore, MeetingMessage item, VersionedId iid, object[] rowProperties, string sentRepresenting, ref OldMessageDeletion.LatestItemInfo latestInfo, List <VersionedId> itemsToDelete, ref bool hasAttachments, ref bool hasBody) { if (!this.SentRepresentingMatches(sentRepresenting, rowProperties[5])) { return; } if (rowProperties[6] is PropertyError || !(rowProperties[6] is ExDateTime)) { return; } if (rowProperties[7] is PropertyError || !(rowProperties[7] is bool) || (bool)rowProperties[7]) { return; } try { using (MeetingResponse meetingResponse = MeetingResponse.Bind(item.Session, iid)) { if (meetingResponse.Body.Size > 0L) { return; } } } catch (VirusDetectedException e) { OldMessageDeletion.Tracer.TraceError <object, VersionedId>((long)this.GetHashCode(), "{0}: A virus was detected in the CalendarItem associated with this message {1}. This message will be skipped.", TraceContext.Get(), iid); CalendarAssistantLog.LogEntry(itemStore, e, false, "A virus was detected in the CalendarItem associated with this message {0}. This message will be skipped.", new object[] { iid }); return; } catch (VirusMessageDeletedException e2) { OldMessageDeletion.Tracer.TraceError <object, VersionedId>((long)this.GetHashCode(), "{0}: A virus was detected in the CalendarItem associated with this message and was deleted {1}. This message will be skipped.", TraceContext.Get(), iid); CalendarAssistantLog.LogEntry(itemStore, e2, false, "A virus was detected in the CalendarItem associated with this message and was deleted {0}. This message will be skipped.", new object[] { iid }); return; } catch (StoragePermanentException ex) { OldMessageDeletion.Tracer.TraceError <object, StoragePermanentException>((long)this.GetHashCode(), "{0}: Exception caught when opening response and getting the body: {1}", TraceContext.Get(), ex); CalendarAssistantLog.LogEntry(itemStore, ex, false, "Exception caught when opening response and getting the body for message id {0}", new object[] { iid }); return; } catch (StorageTransientException ex2) { OldMessageDeletion.Tracer.TraceError <object, StorageTransientException>((long)this.GetHashCode(), "{0}: Exception caught when opening response and getting the body: {1}", TraceContext.Get(), ex2); CalendarAssistantLog.LogEntry(itemStore, ex2, false, "Exception caught when opening response and getting the body for message id {0}", new object[] { iid }); return; } if (latestInfo.LatestClientSubmitTime < (ExDateTime)rowProperties[6]) { if (!hasAttachments && !hasBody) { itemsToDelete.Add(latestInfo.LatestItemId); latestInfo.LatestItemId = iid; latestInfo.LatestClientSubmitTime = (ExDateTime)rowProperties[6]; hasAttachments = false; hasBody = false; return; } } else { itemsToDelete.Add(iid); } }
// Token: 0x060007B6 RID: 1974 RVA: 0x0003766C File Offset: 0x0003586C internal static void ApplyRollingHighlight(MeetingRequest meetingRequest, string internetMessageId, CalendarItemBase originalCalItem, OldMessageDeletion.LatestItemInfo latestInfo) { int i = 3; MeetingRequest meetingRequest2 = meetingRequest; CalendarAssistant.TracerPfd.TracePfd <int, object, string>(0L, "PFD IWC {0} {1} Applying the rolling highlight to the item{2}", 18583, TraceContext.Get(), internetMessageId); if (meetingRequest2 != null) { int hashCode = meetingRequest.GetHashCode(); PropertyDefinition changeHighlight = CalendarItemBaseSchema.ChangeHighlight; while (i > 0) { try { if (meetingRequest2 == null) { meetingRequest2 = MeetingRequest.Bind(meetingRequest.Session, meetingRequest.Id); meetingRequest2.OpenAsReadWrite(); } if (latestInfo.RollingHighlight != 0) { int num = (int)Utils.SafeGetProperty(meetingRequest2, changeHighlight, 0); if ((num & 8) == 0 && (latestInfo.RollingHighlight & 8) != 0) { if (!string.IsNullOrEmpty(latestInfo.LatestOldLocationStr)) { meetingRequest2[CalendarItemBaseSchema.OldLocation] = latestInfo.LatestOldLocationStr; } else { latestInfo.RollingHighlight &= -9; } } if ((num & 3) == 0 && (latestInfo.RollingHighlight & 3) != 0) { if (latestInfo.LatestOldStartTime != ExDateTime.MinValue && latestInfo.LatestOldEndTime != ExDateTime.MinValue) { meetingRequest2[MeetingRequestSchema.OldStartWhole] = latestInfo.LatestOldStartTime; meetingRequest2[MeetingRequestSchema.OldEndWhole] = latestInfo.LatestOldEndTime; } else { latestInfo.RollingHighlight &= -4; } } num |= latestInfo.RollingHighlight; meetingRequest2[changeHighlight] = num; if (meetingRequest2.MeetingRequestType != MeetingMessageType.PrincipalWantsCopy) { ChangeHighlightHelper changeHighlightHelper = new ChangeHighlightHelper(num); MeetingMessageType suggestedMeetingType = changeHighlightHelper.SuggestedMeetingType; meetingRequest2.MeetingRequestType = suggestedMeetingType; } } if (originalCalItem != null && meetingRequest2.MeetingRequestType != MeetingMessageType.NewMeetingRequest && meetingRequest2.MeetingRequestType != MeetingMessageType.PrincipalWantsCopy) { ResponseType responseType = originalCalItem.ResponseType; if (responseType == ResponseType.NotResponded || responseType == ResponseType.None) { meetingRequest2.MeetingRequestType = MeetingMessageType.FullUpdate; meetingRequest2[ItemSchema.IconIndex] = CalendarItemBase.CalculateMeetingRequestIcon(meetingRequest2); } } if (!meetingRequest2.IsDirty) { break; } ConflictResolutionResult saveResults = meetingRequest2.Save(SaveMode.ResolveConflicts); meetingRequest2.Load(); if (CalendarProcessing.CheckSaveResults(meetingRequest2, saveResults, internetMessageId)) { break; } i--; if (meetingRequest2 != meetingRequest && meetingRequest2 != null) { meetingRequest2.Dispose(); } meetingRequest2 = null; } catch (ObjectExistedException ex) { MailboxSession session = meetingRequest.Session as MailboxSession; OldMessageDeletion.Tracer.TraceError((long)hashCode, "{0}: Exception thrown when rolling forward the change highlight on item: {1}, attempt: {2}, exception = {3}", new object[] { TraceContext.Get(), internetMessageId, 4 - i, ex }); CalendarAssistantLog.LogEntry(session, ex, false, "Exception thrown when rolling forward the change highlight on item: {0}, attempt: {1}", new object[] { internetMessageId, 4 - i }); i--; if (meetingRequest2 != meetingRequest && meetingRequest2 != null) { meetingRequest2.Dispose(); meetingRequest2 = null; } } catch (SaveConflictException ex2) { MailboxSession session2 = meetingRequest.Session as MailboxSession; OldMessageDeletion.Tracer.TraceError((long)hashCode, "{0}: Exception thrown when rolling forward the change highlight on item: {1}, attempt: {2}, exception = {3}", new object[] { TraceContext.Get(), internetMessageId, 4 - i, ex2 }); CalendarAssistantLog.LogEntry(session2, ex2, false, "Exception thrown when rolling forward the change highlight on item: {0}, attempt: {1}", new object[] { internetMessageId, 4 - i }); i--; if (meetingRequest2 != meetingRequest && meetingRequest2 != null) { meetingRequest2.Dispose(); meetingRequest2 = null; } } catch (ObjectNotFoundException ex3) { MailboxSession session3 = meetingRequest.Session as MailboxSession; OldMessageDeletion.Tracer.TraceError((long)hashCode, "{0}: Exception thrown when rolling forward the change highlight on item: {1}, attempt: {2}, exception = {3}", new object[] { TraceContext.Get(), internetMessageId, 4 - i, ex3 }); CalendarAssistantLog.LogEntry(session3, ex3, false, "Exception thrown when rolling forward the change highlight on item: {0}, attempt: {1}", new object[] { internetMessageId, 4 - i }); break; } finally { if (meetingRequest2 != meetingRequest && meetingRequest2 != null) { meetingRequest2.Dispose(); } } } } }
// Token: 0x060007B5 RID: 1973 RVA: 0x0003739C File Offset: 0x0003559C private void DetermineIfWeDelete(List <VersionedId> itemsToDelete, MeetingMessage item, object[] rowProperties, ExDateTime itemOwnerChangeTime, string sentRepresenting, int itemSequenceNumber, ref OldMessageDeletion.LatestItemInfo latestInfo, ref bool hasAttachments, ref bool hasBody) { bool flag = item is MeetingRequest; bool flag2 = item is MeetingResponse; object obj = rowProperties[0]; MailboxSession itemStore = item.Session as MailboxSession; if (rowProperties[1] != null && !(rowProperties[1] is PropertyError)) { VersionedId versionedId = (VersionedId)rowProperties[1]; if (versionedId.Equals(latestInfo.LatestItemId)) { return; } int num = 0; bool flag3 = false; if (!(rowProperties[3] is PropertyError) && rowProperties[3] is int) { num = (int)rowProperties[3]; flag3 = true; if (latestInfo.LatestSequenceNumber < num) { if (rowProperties[9] is ExDateTime) { latestInfo.LatestOldStartTime = (ExDateTime)rowProperties[9]; latestInfo.LatestSequenceNumber = num; } if (rowProperties[10] is ExDateTime) { latestInfo.LatestOldEndTime = (ExDateTime)rowProperties[10]; latestInfo.LatestSequenceNumber = num; } if (rowProperties[11] is string && !string.IsNullOrEmpty((string)rowProperties[11])) { latestInfo.LatestOldLocationStr = (string)rowProperties[11]; latestInfo.LatestSequenceNumber = num; } } } bool flag4 = false; bool flag5 = false; bool flag6 = false; if (flag3) { flag4 = (num == itemSequenceNumber); flag5 = (num < itemSequenceNumber); } else if (!(rowProperties[6] is PropertyError) && rowProperties[6] is ExDateTime && latestInfo.LatestClientSubmitTime >= (ExDateTime)rowProperties[6]) { flag6 = true; } if (flag5 || flag6) { if (!flag2) { if (flag && !(rowProperties[4] is PropertyError) && rowProperties[4] is int) { latestInfo.RollingHighlight |= (int)rowProperties[4]; } object obj2 = rowProperties[13]; if (obj2 is int) { MeetingMessageType meetingMessageType = (MeetingMessageType)obj2; latestInfo.FullUpdateDeleted |= (meetingMessageType == MeetingMessageType.FullUpdate || meetingMessageType == MeetingMessageType.NewMeetingRequest); } itemsToDelete.Add(versionedId); return; } if (!this.SentRepresentingMatches(sentRepresenting, rowProperties[5])) { return; } itemsToDelete.Add(versionedId); return; } else if (flag4) { if (flag2) { this.HandleResponsesWithSameSequenceNumber(itemStore, item, versionedId, rowProperties, sentRepresenting, ref latestInfo, itemsToDelete, ref hasAttachments, ref hasBody); return; } if (flag && !(rowProperties[4] is PropertyError) && rowProperties[4] is int) { latestInfo.RollingHighlight |= (int)rowProperties[4]; } if (!(rowProperties[8] is PropertyError) && rowProperties[8] is ExDateTime) { ExDateTime t = (ExDateTime)rowProperties[8]; if (t < itemOwnerChangeTime) { if (!(rowProperties[4] is PropertyError) && rowProperties[4] is int) { latestInfo.RollingHighlight |= (int)rowProperties[4]; } object obj3 = rowProperties[13]; if (obj3 is int) { MeetingMessageType meetingMessageType2 = (MeetingMessageType)obj3; latestInfo.FullUpdateDeleted |= (meetingMessageType2 == MeetingMessageType.FullUpdate || meetingMessageType2 == MeetingMessageType.NewMeetingRequest); } itemsToDelete.Add(versionedId); } } } } }
// Token: 0x060007B4 RID: 1972 RVA: 0x000371A0 File Offset: 0x000353A0 private List <VersionedId> QueryMatchingItems(MailboxSession itemStore, MeetingMessage item, byte[] itemGlobalObjId, string sentRepresenting, int itemSequenceNumber, ref OldMessageDeletion.LatestItemInfo latestInfo) { ExDateTime utcNow = ExDateTime.UtcNow; List <VersionedId> list = new List <VersionedId>(); bool flag = true; bool flag2 = (bool)Utils.SafeGetProperty(item, MessageItemSchema.MapiHasAttachment, false); bool flag3 = item.Body != null && item.Body.Size > 0L; bool flag4 = item is MeetingRequest; bool flag5 = item is MeetingResponse; bool flag6 = item is MeetingCancellation; SortBy[] sortColumns = new SortBy[] { new SortBy(CalendarItemBaseSchema.GlobalObjectId, SortOrder.Ascending), new SortBy(StoreObjectSchema.ItemClass, SortOrder.Descending) }; ComparisonFilter seekFilter = new ComparisonFilter(ComparisonOperator.Equal, CalendarItemBaseSchema.GlobalObjectId, itemGlobalObjId); using (Folder folder = Folder.Bind(itemStore, item.ParentId)) { using (QueryResult queryResult = folder.ItemQuery(ItemQueryType.None, null, sortColumns, OldMessageDeletion.OMDColumnsToQuery)) { queryResult.SeekToCondition(SeekReference.OriginBeginning, seekFilter); while (flag) { object[][] rows = queryResult.GetRows(25); if (rows.Length < 1) { break; } ExDateTime itemOwnerChangeTime = (ExDateTime)Utils.SafeGetProperty(item, CalendarItemBaseSchema.OwnerCriticalChangeTime, utcNow); foreach (object[] array in rows) { string text = array[0] as string; if (!string.IsNullOrEmpty(text)) { if (!itemStore.IsGroupMailbox()) { if ((flag4 || flag6) && !ObjectClass.IsMeetingRequest(text) && !ObjectClass.IsMeetingCancellation(text)) { flag = false; break; } if (flag5 && !ObjectClass.IsMeetingResponse(text)) { goto IL_186; } } byte[] rowGlobalObjectId = (array[2] is byte[]) ? (array[2] as byte[]) : null; if (!OldMessageDeletion.GlobalObjectIdMatches(itemGlobalObjId, rowGlobalObjectId)) { flag = false; break; } this.DetermineIfWeDelete(list, item, array, itemOwnerChangeTime, sentRepresenting, itemSequenceNumber, ref latestInfo, ref flag2, ref flag3); } IL_186 :; } } } } return(list); }
// Token: 0x060007B3 RID: 1971 RVA: 0x0003708C File Offset: 0x0003528C private void QueryAndDeleteMatchingItems(MailboxSession itemStore, MeetingMessage item, CalendarItemBase originalCalendarItem, byte[] itemGloblObjectId, string internetMessageId, string sentRepresenting, int itemSequenceNumber, ref OldMessageDeletion.LatestItemInfo latestInfo) { try { List <VersionedId> list = this.QueryMatchingItems(itemStore, item, itemGloblObjectId, sentRepresenting, itemSequenceNumber, ref latestInfo); if (item is MeetingRequest && itemSequenceNumber >= latestInfo.LatestSequenceNumber) { OldMessageDeletion.ApplyRollingHighlight((MeetingRequest)item, internetMessageId, originalCalendarItem, latestInfo); } if (list != null && list.Count != 0) { StoreId[] array = list.ToArray(); OldMessageDeletion.Tracer.TraceDebug <object, ArrayTracer <StoreId> >((long)this.GetHashCode(), "{0}: Deleting message: {1}", TraceContext.Get(), new ArrayTracer <StoreId>(array)); CalendarAssistant.TracerPfd.TracePfd <int, object, ArrayTracer <StoreId> >((long)this.GetHashCode(), "PFD IWC {0} {1}: Deleting message: {2}", 29847, TraceContext.Get(), new ArrayTracer <StoreId>(array)); AggregateOperationResult aggregateOperationResult = itemStore.Delete(DeleteItemFlags.MoveToDeletedItems, array); OldMessageDeletion.Tracer.TraceDebug <object, OperationResult>((long)this.GetHashCode(), "{0}: Deleting items returned: {1}", TraceContext.Get(), aggregateOperationResult.OperationResult); CalendarAssistantPerformanceCounters.MeetingMessagesDeleted.IncrementBy((long)list.Count); } } catch (ObjectNotFoundException arg) { OldMessageDeletion.Tracer.TraceDebug <object, ObjectNotFoundException>((long)this.GetHashCode(), "{0}: Stopped OMD because we encountered an exception: {1}", TraceContext.Get(), arg); } }