private static void AddAppointmentToFreeBusyString(ExDateTime windowStart, ExDateTime windowEnd, ExDateTime startTime, ExDateTime endTime, BusyType busyType, int mergedFreeBusyInterval, char[] freeBusyValues, ExchangeVersionType requestedSchemaVersion) { TimeSpan timeSpan = startTime - windowStart; TimeSpan timeSpan2 = endTime - windowStart; int num = (int)timeSpan.TotalMinutes / mergedFreeBusyInterval; int num2 = (int)(timeSpan2.TotalMinutes / (double)mergedFreeBusyInterval) - 1; if (timeSpan2.TotalMinutes % (double)mergedFreeBusyInterval > 0.0) { num2++; } if (num < 0) { num = 0; } if (num2 >= freeBusyValues.Length) { num2 = freeBusyValues.Length - 1; } char c = (char)(busyType + 48); for (int i = num; i <= num2; i++) { if (MergedFreeBusy.MergedFreeBusyWeight(freeBusyValues[i], requestedSchemaVersion) < MergedFreeBusy.MergedFreeBusyWeight(c, requestedSchemaVersion)) { freeBusyValues[i] = c; } } }
public static FreeBusyQueryResult MergeGroupMemberResults(ExTimeZone timeZone, int mergedFreeBusyInterval, ExDateTime startTime, ExDateTime endTime, FreeBusyQuery[] freeBusyQueryMembers, ExchangeVersionType requestSchemaVersion) { int num = MergedFreeBusy.NumberOfSlots(startTime, endTime, mergedFreeBusyInterval); char[] array = new char[num]; char c = (requestSchemaVersion < ExchangeVersionType.Exchange2012) ? '4' : '5'; for (int i = 0; i < num; i++) { array[i] = c; } foreach (FreeBusyQuery freeBusyQuery in freeBusyQueryMembers) { if (freeBusyQuery.Result != null) { string text = freeBusyQuery.Result.MergedFreeBusy; if (text == null) { text = MergedFreeBusy.BuildMergedFreeBusyString(timeZone, mergedFreeBusyInterval, startTime, endTime, num, freeBusyQuery.Result.CalendarEventArray, freeBusyQuery.Result.ExceptionInfo != null, null, requestSchemaVersion); } for (int k = 0; k < array.Length; k++) { if (MergedFreeBusy.MergedFreeBusyWeight(array[k], requestSchemaVersion) < MergedFreeBusy.MergedFreeBusyWeight(text[k], requestSchemaVersion)) { array[k] = text[k]; } } } } return(new FreeBusyQueryResult(FreeBusyViewType.MergedOnly, null, new string(array), null)); }
private void AddAttendeeDataToList(MailboxData mailboxData, FreeBusyQuery freeBusyQuery, List <AttendeeData> attendeeDataList) { if (freeBusyQuery.Result == null) { AvailabilityQuery.MeetingSuggestionsTracer.TraceError <object, EmailAddress>((long)this.GetHashCode(), "{0}: Null freebusyquery result for attendee {1}, treating as if we got no data for this attendee", TraceContext.Get(), freeBusyQuery.Email); } string text = (freeBusyQuery.Result != null) ? freeBusyQuery.Result.MergedFreeBusy : null; if (string.IsNullOrEmpty(text) || (this.desiredSuggestionsView.GlobalObjectId != null && mailboxData.AttendeeType == MeetingAttendeeType.Organizer)) { text = MergedFreeBusy.GenerateMergedFreeBusyString(base.ClientContext.TimeZone, this.internalFreeBusyView.MergedFreeBusyIntervalInMinutes, new ExDateTime(base.ClientContext.TimeZone, this.internalFreeBusyView.TimeWindow.StartTime), new ExDateTime(base.ClientContext.TimeZone, this.internalFreeBusyView.TimeWindow.EndTime), (freeBusyQuery.Result != null) ? freeBusyQuery.Result.CalendarEventArrayInternal : null, freeBusyQuery.Result == null || freeBusyQuery.Result.ExceptionInfo != null, this.desiredSuggestionsView.GlobalObjectIdByteArray, base.ClientContext.RequestSchemaVersion); } AttendeeData item = new AttendeeData(mailboxData.AttendeeType, freeBusyQuery.Email.Address, mailboxData.ExcludeConflicts, new ExDateTime(base.ClientContext.TimeZone, this.internalFreeBusyView.TimeWindow.StartTime), new ExDateTime(base.ClientContext.TimeZone, this.internalFreeBusyView.TimeWindow.EndTime), text, base.ClientContext.RequestSchemaVersion, this.GetAttendeeWorkHours(freeBusyQuery)); attendeeDataList.Add(item); }
internal static string GetMergedFreeBusyString(EmailAddress emailAddress, CalendarFolder calendarFolder, ExTimeZone timeZone, ExDateTime windowStart, ExDateTime windowEnd) { CalendarEvent[] calendarEventArray = null; int mergedFreeBusyInterval = 5; bool exceptionOccurred = false; try { calendarEventArray = InternalCalendarQuery.GetCalendarEvents(emailAddress, calendarFolder, windowStart, windowEnd, FreeBusyViewType.FreeBusyMerged, true, ExchangeVersionType.Exchange2012); } catch (ResultSetTooBigException) { exceptionOccurred = true; } return(MergedFreeBusy.GenerateMergedFreeBusyString(timeZone, mergedFreeBusyInterval, windowStart, windowEnd, calendarEventArray, exceptionOccurred, null, ExchangeVersionType.Exchange2012)); }
private static string BuildMergedFreeBusyString(ExTimeZone timeZone, int mergedFreeBusyInterval, ExDateTime windowStart, ExDateTime windowEnd, int numberOfFreeBusySlots, CalendarEvent[] calendarEventArray, bool exceptionOccurred, byte[] globalObjectId, ExchangeVersionType requestedSchemaVersion) { char[] array = new char[numberOfFreeBusySlots]; char c; if (requestedSchemaVersion < ExchangeVersionType.Exchange2012) { c = (exceptionOccurred ? '4' : '0'); } else { c = (exceptionOccurred ? '5' : '0'); } for (int i = 0; i < numberOfFreeBusySlots; i++) { array[i] = c; } if (!exceptionOccurred && calendarEventArray != null) { int num = calendarEventArray.Length; int j = 0; while (j < num) { if (globalObjectId == null) { goto IL_72; } byte[] globalObjectId2 = calendarEventArray[j].GlobalObjectId; if (globalObjectId2 == null || !ArrayComparer <byte> .Comparer.Equals(globalObjectId2, globalObjectId)) { goto IL_72; } IL_B3: j++; continue; IL_72: ExDateTime startTime = new ExDateTime(timeZone, calendarEventArray[j].StartTime); ExDateTime endTime = new ExDateTime(timeZone, calendarEventArray[j].EndTime); BusyType busyType = calendarEventArray[j].BusyType; MergedFreeBusy.AddAppointmentToFreeBusyString(windowStart, windowEnd, startTime, endTime, busyType, mergedFreeBusyInterval, array, requestedSchemaVersion); goto IL_B3; } } return(new string(array)); }
internal static string FromPublicFolderFreeBusyProperty(ExTimeZone timeZone, int mergedFreeBusyInterval, ExDateTime windowStart, ExDateTime windowEnd, PublicFolderFreeBusy freeBusyData, bool exceptionOccurred) { int num = MergedFreeBusy.NumberOfSlots(windowStart, windowEnd, mergedFreeBusyInterval); char[] array = new char[num]; char c = exceptionOccurred ? '4' : '0'; for (int i = 0; i < num; i++) { array[i] = c; } if (exceptionOccurred || freeBusyData == null || freeBusyData.Appointments == null || freeBusyData.Appointments.Count == 0) { return(new string(array)); } foreach (PublicFolderFreeBusyAppointment publicFolderFreeBusyAppointment in freeBusyData.Appointments) { MergedFreeBusy.AddAppointmentToFreeBusyString(windowStart, windowEnd, publicFolderFreeBusyAppointment.StartTime, publicFolderFreeBusyAppointment.EndTime, (BusyType)publicFolderFreeBusyAppointment.BusyType, mergedFreeBusyInterval, array, ExchangeVersionType.Exchange2007); } return(new string(array)); }
private void ExecuteFreeBusyQuery(AvailabilityQueryResult availabilityQueryResult) { Stopwatch stopwatch = Stopwatch.StartNew(); AvailabilityQuery.CalendarViewTracer.TraceDebug((long)this.GetHashCode(), "{0}: Entering AvailabilityQuery.ExecuteFreeBusyQuery()", new object[] { TraceContext.Get() }); base.RequestLogger.AppendToLog <int>("AddressCount", this.MailboxArray.Length); base.RequestLogger.AppendToLog <string>("MessageId", base.ClientContext.MessageId); base.RequestLogger.AppendToLog <string>("Requester", base.ClientContext.IdentityForFilteredTracing); try { Guid serverRequestId = Microsoft.Exchange.Diagnostics.Trace.TraceCasStart(this.casTraceEventType); QueryType queryType = ((this.desiredFreeBusyView != null) ? QueryType.FreeBusy : ((QueryType)0)) | ((this.desiredSuggestionsView != null) ? QueryType.MeetingSuggestions : ((QueryType)0)); ADObjectId adobjectId = null; OrganizationId organizationId = OrganizationId.ForestWideOrgId; if (base.ClientContext is InternalClientContext && !this.IsCrossForestRequest) { adobjectId = base.ClientContext.QueryBaseDN; organizationId = base.ClientContext.OrganizationId; } if (VariantConfiguration.GetSnapshot(MachineSettingsContext.Local, null, null).Global.MultiTenancy.Enabled&& (organizationId == null || organizationId == OrganizationId.ForestWideOrgId)) { AvailabilityQuery.CalendarViewTracer.TraceDebug <object, EmailAddress>((long)this.GetHashCode(), "{0}: Looking up the OrgId for address {1}", TraceContext.Get(), this.mailboxArray[0].Email); organizationId = this.GetTargetOrganizationIdFromCache(this.mailboxArray[0].Email); } if (organizationId != null && organizationId.OrganizationalUnit != null) { base.RequestLogger.AppendToLog <string>("ORG", organizationId.OrganizationalUnit.Name); } AvailabilityQuery.CalendarViewTracer.TraceDebug((long)this.GetHashCode(), "{0}: Ad scoping for the requester {1}: QueryBaseDN: {2}, OrganizationId: {3}", new object[] { TraceContext.Get(), base.ClientContext.ToString(), (adobjectId == null) ? "<NULL>" : adobjectId.ToString(), organizationId }); FreeBusyApplication freeBusyApplication = new FreeBusyApplication(base.ClientContext, this.internalFreeBusyView, this.defaultFreeBusyOnly, queryType); try { this.queryPrepareDeadline = this.queryPrepareDeadline.AddMilliseconds(-this.PreExecutionTimeTaken); this.requestProcessingDeadline = this.requestProcessingDeadline.AddMilliseconds(-this.PreExecutionTimeTaken); using (RequestDispatcher requestDispatcher = new RequestDispatcher(base.RequestLogger)) { FreeBusyRecipientQuery freeBusyRecipientQuery = new FreeBusyRecipientQuery(base.ClientContext, adobjectId, organizationId, this.queryPrepareDeadline); RecipientQueryResults recipientQueryResults = freeBusyRecipientQuery.Query(this.mailboxArray); QueryGenerator queryGenerator = new QueryGenerator(freeBusyApplication, base.ClientContext, base.RequestLogger, requestDispatcher, this.queryPrepareDeadline, this.requestProcessingDeadline, recipientQueryResults); bool flag = false; try { BaseQuery[] queries = queryGenerator.GetQueries(); this.freeBusyQueryArray = FreeBusyApplication.ConvertBaseToFreeBusyQuery(queries); if (base.ClientContext.Budget != null) { base.ClientContext.Budget.EndLocal(); flag = true; } requestDispatcher.Execute(this.requestProcessingDeadline, base.HttpResponse); this.individualMailboxesProcessed = queryGenerator.UniqueQueriesCount; } finally { if (flag) { base.ClientContext.Budget.StartLocal("AvailabilityQuery.ExecuteFreeBusyQuery", default(TimeSpan)); } requestDispatcher.LogStatistics(base.RequestLogger); } } } finally { freeBusyApplication.LogThreadsUsage(base.RequestLogger); } foreach (FreeBusyQuery freeBusyQuery in this.freeBusyQueryArray) { if (freeBusyQuery.AttendeeKind == AttendeeKind.Group) { FreeBusyQueryResult resultOnFirstCall; if (freeBusyQuery.GroupMembersForFreeBusy != null) { resultOnFirstCall = MergedFreeBusy.MergeGroupMemberResults(base.ClientContext.TimeZone, this.internalFreeBusyView.MergedFreeBusyIntervalInMinutes, new ExDateTime(base.ClientContext.TimeZone, this.internalFreeBusyView.TimeWindow.StartTime), new ExDateTime(base.ClientContext.TimeZone, this.internalFreeBusyView.TimeWindow.EndTime), freeBusyQuery.GroupMembersForFreeBusy, base.ClientContext.RequestSchemaVersion); } else { resultOnFirstCall = new FreeBusyQueryResult(FreeBusyViewType.None, null, null, null); } freeBusyQuery.SetResultOnFirstCall(resultOnFirstCall); } } availabilityQueryResult.FreeBusyResults = new FreeBusyQueryResult[this.freeBusyQueryArray.Length]; for (int j = 0; j < this.freeBusyQueryArray.Length; j++) { availabilityQueryResult.FreeBusyResults[j] = this.freeBusyQueryArray[j].Result; } this.TraceExecuteFreeBusyQueryStop(serverRequestId); AvailabilityQuery.CalendarViewTracer.TraceDebug((long)this.GetHashCode(), "{0}: Leaving AvailabilityQuery.ExecuteFreeBusyQuery()", new object[] { TraceContext.Get() }); } finally { base.RequestLogger.CalculateQueryStatistics(this.freeBusyQueryArray); base.LogFailures(availabilityQueryResult, base.RequestLogger.ExceptionData); stopwatch.Stop(); base.RequestLogger.AppendToLog <long>("TAQ", stopwatch.ElapsedMilliseconds); } }
private FreeBusyQueryResult InternalGetCalendarData(FreeBusyQuery freeBusyQuery, MailboxSession session) { FreeBusyViewType freeBusyViewType = FreeBusyViewType.None; CalendarEvent[] calendarEventArray = null; string mergedFreeBusy = null; WorkingHours workingHours = null; EmailAddress email = freeBusyQuery.Email; StoreObjectId associatedFolderId = freeBusyQuery.RecipientData.AssociatedFolderId; StoreObjectId defaultFolderId = session.GetDefaultFolderId(DefaultFolderType.Calendar); if (defaultFolderId == null) { return(this.HandleException(email, new NoCalendarException())); } if (associatedFolderId != null && !associatedFolderId.Equals(defaultFolderId)) { return(this.HandleException(email, new NotDefaultCalendarException())); } session.ExTimeZone = this.clientContext.TimeZone; using (CalendarFolder calendarFolder = CalendarFolder.Bind(session, DefaultFolderType.Calendar, CalendarQuery.CalendarFolderQueryProps)) { TimeSpan t = this.deadline - DateTime.UtcNow; if (t <= TimeSpan.Zero) { return(this.HandleException(email, new TimeoutExpiredException("Determine-Allowed-Access"))); } FreeBusyPermissionLevel freeBusyPermissionLevel = FreeBusyPermission.DetermineAllowedAccess(this.clientContext, session, calendarFolder, freeBusyQuery, this.defaultFreeBusyOnly); CalendarQuery.CalendarViewTracer.TraceDebug((long)this.GetHashCode(), "{0}: AccessCheck returned {1} for user {2} on mailbox {3}", new object[] { TraceContext.Get(), freeBusyPermissionLevel, this.clientContext, email }); if (freeBusyPermissionLevel == FreeBusyPermissionLevel.None) { CalendarQuery.CalendarViewTracer.TraceDebug <object, EmailAddress>((long)this.GetHashCode(), "{0}: No mailbox data will be returned for mailbox {1} since the granted access level to caller is None.", TraceContext.Get(), email); return(new FreeBusyQueryResult(new NoFreeBusyAccessException(44348U))); } t = this.deadline - DateTime.UtcNow; if (t <= TimeSpan.Zero) { return(this.HandleException(email, new TimeoutExpiredException("Get-Calendar-View"))); } freeBusyViewType = CalendarQuery.GetReturnView(this.requestedFreeBusyView.RequestedView, freeBusyPermissionLevel); ExDateTime windowStart = new ExDateTime(this.clientContext.TimeZone, this.requestedFreeBusyView.TimeWindow.StartTime); ExDateTime windowEnd = new ExDateTime(this.clientContext.TimeZone, this.requestedFreeBusyView.TimeWindow.EndTime); try { calendarEventArray = InternalCalendarQuery.GetCalendarEvents(email, calendarFolder, windowStart, windowEnd, freeBusyViewType, freeBusyPermissionLevel == FreeBusyPermissionLevel.Owner, this.clientContext.RequestSchemaVersion); } catch (ResultSetTooBigException e) { return(this.HandleException(email, e)); } if (FreeBusyViewOptions.IsMerged(freeBusyViewType)) { t = this.deadline - DateTime.UtcNow; if (t <= TimeSpan.Zero) { return(this.HandleException(email, new TimeoutExpiredException("Generate-Merged-FreeBusy"))); } int mergedFreeBusyIntervalInMinutes = this.requestedFreeBusyView.MergedFreeBusyIntervalInMinutes; mergedFreeBusy = MergedFreeBusy.GenerateMergedFreeBusyString(this.clientContext.TimeZone, mergedFreeBusyIntervalInMinutes, windowStart, windowEnd, calendarEventArray, false, null, this.clientContext.RequestSchemaVersion); } t = this.deadline - DateTime.UtcNow; if (t <= TimeSpan.Zero) { return(this.HandleException(email, new TimeoutExpiredException("Getting-Work-Hours"))); } workingHours = this.GetWorkingHours(email, session, calendarFolder); } return(new FreeBusyQueryResult(freeBusyViewType, calendarEventArray, mergedFreeBusy, workingHours)); }
public static string GenerateMergedFreeBusyString(ExTimeZone timeZone, int mergedFreeBusyInterval, ExDateTime windowStart, ExDateTime windowEnd, CalendarEvent[] calendarEventArray, bool exceptionOccurred, byte[] globalObjectId, ExchangeVersionType requestedSchemaVersion) { int numberOfFreeBusySlots = MergedFreeBusy.NumberOfSlots(windowStart, windowEnd, mergedFreeBusyInterval); return(MergedFreeBusy.BuildMergedFreeBusyString(timeZone, mergedFreeBusyInterval, windowStart, windowEnd, numberOfFreeBusySlots, calendarEventArray, exceptionOccurred, globalObjectId, requestedSchemaVersion)); }