internal List <MeetingValidationResult> Run() { CalendarValidator.< > c__DisplayClass6 CS$ < > 8__locals1 = new CalendarValidator.< > c__DisplayClass6(); CS$ < > 8__locals1.< > 4__this = this; CS$ < > 8__locals1.results = new List <MeetingValidationResult>(); using (SessionManager sessionManager = this.independentSession ? new SessionManager(this.mailboxUser.ExchangePrincipal, "Client=ResourceHealth;Action=Meeting Validator") : new SessionManager(this.mailboxSession)) { if (sessionManager.PrimarySession.Session.GetDefaultFolderId(DefaultFolderType.Calendar) == null) { CS$ < > 8__locals1.meetings = new List <MeetingData>(); } else { using (CalendarFolder calendarFolder = CalendarFolder.Bind(sessionManager.PrimarySession.Session, DefaultFolderType.Calendar)) { if (this.validatingRange) { CS$ < > 8__locals1.meetings = CalendarQuery.GetMeetingsInRange(sessionManager.PrimarySession.Session, this.mailboxUser, calendarFolder, this.rangeStart, this.rangeEnd, this.locationToFilterWith, this.subjectToFilterWith, CS$ < > 8__locals1.results); } else { CS$ < > 8__locals1.meetings = CalendarQuery.GetCorrelatedMeetings(sessionManager.PrimarySession.Session, this.mailboxUser, this.meetingToValidate); } if (CS$ < > 8__locals1.meetings.Count > 0) { try { CS$ < > 8__locals1.meetings.Sort(); if (CS$ < > 8__locals1.meetings.Count > Configuration.MaxMeetingsToProcessIncludingDuplicates) { CS$ < > 8__locals1.meetings = CS$ < > 8__locals1.meetings.GetRange(0, Configuration.MaxMeetingsToProcessIncludingDuplicates); } Util.CoreCatchMeIfYouCan(delegate { CS$ < > 8__locals1.results.AddRange(CS$ < > 8__locals1.< > 4__this.RemoveDuplicates(sessionManager.PrimarySession.Session, CS$ < > 8__locals1.meetings)); }, "CalendarValidator"); }
internal static List <MeetingData> GetMeetingsInRange(MailboxSession session, UserObject mailboxUser, CalendarFolder calendarFolder, ExDateTime rangeStart, ExDateTime rangeEnd, string locationToFilterWith, string subjectToFilterWith, List <MeetingValidationResult> results) { object[][] array = null; List <MeetingData> list = new List <MeetingData>(); HashSet <StoreId> hashSet = new HashSet <StoreId>(); if (results == null) { return(list); } array = CalendarQuery.GetRecurringMasters(calendarFolder, CalendarQuery.CalendarQueryProps); foreach (object[] array3 in array) { if (!ObjectClass.IsCalendarItemSeries((string)array3[29])) { string text; if (!CalendarQuery.ArePropertiesValid(array3, out text)) { StoreId storeId = (StoreId)array3[0]; MeetingData meetingData = MeetingData.CreateInstance(mailboxUser, storeId); results.Add(new MeetingValidationResult(rangeStart, rangeEnd, mailboxUser, meetingData, false, text)); } else { string location = (string)array3[8]; string text2 = (string)array3[9]; if (CalendarQuery.ShouldContinueLocationSubjectFilters(locationToFilterWith, subjectToFilterWith, location, text2)) { StoreId storeId = (StoreId)array3[0]; bool flag = (bool)array3[3]; if (flag) { CalendarItem calendarItem = null; string empty = string.Empty; try { calendarItem = CalendarItem.Bind(session, storeId, CalendarQuery.CalendarQueryProps); if (calendarItem.Recurrence != null) { IList <OccurrenceInfo> modifiedOccurrences = calendarItem.Recurrence.GetModifiedOccurrences(); foreach (OccurrenceInfo occurrenceInfo in modifiedOccurrences) { StoreId versionedId = occurrenceInfo.VersionedId; hashSet.Add(versionedId); } OccurrenceInfo firstOccurrence; OccurrenceInfo occurrenceInfo2; try { firstOccurrence = calendarItem.Recurrence.GetFirstOccurrence(); if (calendarItem.Recurrence.Range is NoEndRecurrenceRange) { occurrenceInfo2 = null; } else { occurrenceInfo2 = calendarItem.Recurrence.GetLastOccurrence(); } } catch (RecurrenceHasNoOccurrenceException) { goto IL_350; } catch (InvalidOperationException) { MeetingData meetingData2 = MeetingData.CreateInstance(mailboxUser, storeId); results.Add(new MeetingValidationResult(rangeStart, rangeEnd, mailboxUser, meetingData2, false, string.Format("GetMeetingsInRange: InvalidOperationException: no end occurence, Subject=\"{0}\"", text2))); goto IL_350; } if ((occurrenceInfo2 == null || !(occurrenceInfo2.StartTime < rangeStart)) && !(firstOccurrence.EndTime >= rangeEnd)) { QueryResultPropertyBag queryResultPropertyBag = new QueryResultPropertyBag(session, CalendarQuery.CalendarQueryProps); queryResultPropertyBag.SetQueryResultRow(array3); MeetingData item = MeetingData.CreateInstance(mailboxUser, calendarItem); list.Add(item); foreach (OccurrenceInfo occurrenceInfo3 in modifiedOccurrences) { if (!(occurrenceInfo3.StartTime > rangeEnd) && !(occurrenceInfo3.StartTime < rangeStart)) { MeetingData item2 = MeetingData.CreateInstance(mailboxUser, occurrenceInfo3.VersionedId, calendarItem.GlobalObjectId, CalendarItemType.Exception); list.Add(item2); } } } } } catch (RecurrenceFormatException exception) { MeetingData item3 = MeetingData.CreateInstance(mailboxUser, storeId, null, exception); list.Add(item3); } catch (ObjectNotFoundException exception2) { MeetingData meetingData3 = MeetingData.CreateInstance(mailboxUser, storeId, null, exception2); list.Add(meetingData3); results.Add(new MeetingValidationResult(rangeStart, rangeEnd, mailboxUser, meetingData3, false, string.Format("GetMeetingsInRange: ObjectNotFoundException - could not find this meeting, Subject=\"{0}\"", text2))); } catch (CorruptDataException arg) { text = string.Format("GetMeetingsInRange: Subject=\"{0}\", CorruptDataException: {1}", text2, arg); MeetingValidationResult mvresultWithMoreCalItemData = CalendarQuery.GetMVResultWithMoreCalItemData(session, mailboxUser, storeId, text, text2, rangeStart, rangeEnd); results.Add(mvresultWithMoreCalItemData); } catch (ArgumentException exception3) { MeetingData meetingData4 = MeetingData.CreateInstance(mailboxUser, storeId, null, exception3); list.Add(meetingData4); results.Add(new MeetingValidationResult(rangeStart, rangeEnd, mailboxUser, meetingData4, false, string.Format("GetMeetingsInRange: ArgumentException - could not bind this meeting, Subject=\"{0}\"", text2))); } catch (AccessDeniedException arg2) { MeetingData meetingData5 = MeetingData.CreateInstance(mailboxUser, storeId); results.Add(new MeetingValidationResult(rangeStart, rangeEnd, mailboxUser, meetingData5, false, string.Format("GetMeetingsInRange: AccessDeniedException: {0}", arg2))); } finally { if (calendarItem != null) { calendarItem.Dispose(); } } } } } } IL_350 :; } try { array = calendarFolder.GetCalendarView(rangeStart, rangeEnd, CalendarQuery.CalendarQueryProps); } catch (Exception arg3) { MeetingData meetingData6 = MeetingData.CreateInstance(mailboxUser, null); results.Add(new MeetingValidationResult(rangeStart, rangeEnd, mailboxUser, meetingData6, false, string.Format("GetMeetingsInRange: Exception: {0}", arg3))); return(list); } foreach (object[] array5 in array) { if (!ObjectClass.IsCalendarItemSeries((string)array5[29])) { string errorDescription; if (!CalendarQuery.ArePropertiesValid(array5, out errorDescription)) { StoreId storeId2 = (StoreId)array5[0]; MeetingData meetingData7 = MeetingData.CreateInstance(mailboxUser, storeId2); results.Add(new MeetingValidationResult(rangeStart, rangeEnd, mailboxUser, meetingData7, false, errorDescription)); } else { string location2 = (string)array5[8]; string subject = (string)array5[9]; if (CalendarQuery.ShouldContinueLocationSubjectFilters(locationToFilterWith, subjectToFilterWith, location2, subject)) { StoreId storeId2 = (StoreId)array5[0]; bool flag2 = (bool)array5[3]; if (flag2) { byte[] array6 = (byte[])array5[1]; GlobalObjectId globalObjectId; try { globalObjectId = new GlobalObjectId(array6); } catch (CorruptDataException arg4) { MeetingData meetingData8 = MeetingData.CreateInstance(mailboxUser, storeId2); results.Add(new MeetingValidationResult(rangeStart, rangeEnd, mailboxUser, meetingData8, false, string.Format("GetMeetingsInRange: CorruptDataException: The Global Object ID is invalid ({0}). Error: {1}", GlobalObjectId.ByteArrayToHexString(array6), arg4))); goto IL_54A; } int value = (int)array5[30]; CalendarItemType calendarItemType = (CalendarItemType)array5[5]; if (calendarItemType == CalendarItemType.Single) { int appointmentSequenceNumber = (int)array5[15]; ExDateTime lastModifiedTime = (ExDateTime)array5[14]; ExDateTime ownerCriticalChangeTime = (ExDateTime)array5[17]; int documentId = (int)array5[33]; MeetingData item4 = MeetingData.CreateInstance(mailboxUser, storeId2, globalObjectId, appointmentSequenceNumber, lastModifiedTime, ownerCriticalChangeTime, CalendarItemType.Single, subject, new int?(value), documentId); list.Add(item4); } else if (calendarItemType == CalendarItemType.Exception) { if (!hashSet.Contains(storeId2)) { MeetingData item5 = MeetingData.CreateInstance(mailboxUser, storeId2, globalObjectId, CalendarItemType.Exception); list.Add(item5); } } else if (calendarItemType == CalendarItemType.Occurrence) { MeetingData item6 = MeetingData.CreateInstance(mailboxUser, storeId2, globalObjectId, CalendarItemType.Occurrence); list.Add(item6); } } } } } IL_54A :; } return(list); }
internal static bool ArePropertiesValid(CalendarItemBase item, out string errorString) { return(CalendarQuery.ArePropertiesValid(item.GetProperties(CalendarQuery.CalendarQueryProps), out errorString)); }
internal override void ValidateMeetings(ref Dictionary <GlobalObjectId, List <Attendee> > organizerRumsSent, Action <long> onItemRepaired) { bool shouldProcessMailbox = CalendarParticipant.InternalShouldProcessMailbox(this.ExchangePrincipal); SessionManager.SessionData sessionData = this.sessionManager[this.ExchangePrincipal]; foreach (CalendarInstanceContext calendarInstanceContext in base.ItemList.Values) { string empty = string.Empty; CalendarLocalItem calendarLocalItem = new CalendarLocalItem(this.ExchangePrincipal, sessionData.Session); calendarInstanceContext.ValidationContext.CalendarInstance = calendarLocalItem; calendarInstanceContext.ValidationContext.CalendarInstance.ShouldProcessMailbox = shouldProcessMailbox; try { using (CalendarFolder calendarFolder = CalendarFolder.Bind(sessionData.Session, DefaultFolderType.Calendar, null)) { calendarLocalItem.CalendarFolderId = calendarFolder.Id.ObjectId.ProviderLevelItemId; CalendarItemBase calendarItemBase = CalendarQuery.FindMatchingItem(sessionData.Session, calendarFolder, calendarInstanceContext.ValidationContext.BaseItem.CalendarItemType, calendarInstanceContext.ValidationContext.BaseItem.GlobalObjectId.Bytes, ref empty); if (calendarInstanceContext.ValidationContext.OppositeRole == RoleType.Organizer) { if (calendarItemBase != null) { calendarInstanceContext.ValidationContext.OppositeRoleOrganizerIsValid = calendarItemBase.IsOrganizer(); } else { calendarInstanceContext.ValidationContext.OppositeRoleOrganizerIsValid = this.IsOrganizerValid(sessionData.Session, calendarInstanceContext); } calendarInstanceContext.ValidationContext.OppositeItem = (calendarInstanceContext.ValidationContext.OppositeRoleOrganizerIsValid ? calendarItemBase : null); } else { calendarInstanceContext.ValidationContext.OppositeItem = calendarItemBase; } calendarInstanceContext.ValidationContext.ErrorString = empty; } } catch (StorageTransientException ex) { string text = string.Format("Could not open item store session or calendar, exception = {0}", ex.GetType()); Globals.ConsistencyChecksTracer.TraceError((long)this.GetHashCode(), text); calendarInstanceContext.ValidationContext.CalendarInstance.LoadInconsistency = Inconsistency.CreateInstance(calendarInstanceContext.ValidationContext.OppositeRole, text, CalendarInconsistencyFlag.StorageException, calendarInstanceContext.ValidationContext); } catch (RecurrenceFormatException ex2) { string text2 = string.Format("Could not open item store session or calendar due recurrence format error, exception = {0}", ex2.GetType()); Globals.ConsistencyChecksTracer.TraceError((long)this.GetHashCode(), text2); calendarInstanceContext.ValidationContext.CalendarInstance.LoadInconsistency = ((calendarInstanceContext.ValidationContext.OppositeRole == RoleType.Attendee) ? Inconsistency.CreateInstance(calendarInstanceContext.ValidationContext.OppositeRole, text2, CalendarInconsistencyFlag.RecurrenceBlob, calendarInstanceContext.ValidationContext) : null); } catch (StoragePermanentException ex3) { string text3 = string.Format("Could not open item store session or calendar, exception = {0}", ex3.GetType()); Globals.ConsistencyChecksTracer.TraceError((long)this.GetHashCode(), text3); calendarInstanceContext.ValidationContext.CalendarInstance.LoadInconsistency = Inconsistency.CreateInstance(calendarInstanceContext.ValidationContext.OppositeRole, text3, CalendarInconsistencyFlag.StorageException, calendarInstanceContext.ValidationContext); } catch (ArgumentException arg) { Globals.ConsistencyChecksTracer.TraceError <RoleType, ArgumentException>((long)this.GetHashCode(), "Could not open item store session or calendar for {0}, exception = {1}", calendarInstanceContext.ValidationContext.OppositeRole, arg); } finally { base.ValidateInstance(calendarInstanceContext, organizerRumsSent, onItemRepaired); if (calendarInstanceContext.ValidationContext.OppositeItem != null) { calendarInstanceContext.ValidationContext.OppositeItem.Dispose(); calendarInstanceContext.ValidationContext.OppositeItem = null; } } } }