예제 #1
0
        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;
                }
            }
        }
예제 #2
0
        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));
        }
예제 #3
0
        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);
        }
예제 #4
0
        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));
        }
예제 #5
0
        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));
        }
예제 #6
0
        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));
        }
예제 #7
0
        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);
            }
        }
예제 #8
0
        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));
        }
예제 #9
0
        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));
        }