public FreeBusyApplication(ClientContext clientContext, FreeBusyViewOptions freeBusyView, bool defaultFreeBusyOnly, QueryType queryType) : base(true)
 {
     this.freeBusyView        = freeBusyView;
     this.clientContext       = clientContext;
     this.defaultFreeBusyOnly = defaultFreeBusyOnly;
     this.queryType           = queryType;
 }
        internal void Validate()
        {
            if (this.requestedView == FreeBusyViewType.None)
            {
                throw new InvalidFreeBusyViewTypeException();
            }
            FreeBusyViewOptions.IsMerged(this.requestedView);
            if (this.requestedView == FreeBusyViewType.None)
            {
                throw new ArgumentException("RequestedView can not be None", "RequestedView");
            }
            if (this.mergedFreeBusyIntervalInMinutes < 5 || this.mergedFreeBusyIntervalInMinutes > 1440)
            {
                throw new InvalidMergedFreeBusyIntervalException(5, 1440);
            }
            if (this.timeWindow == null)
            {
                throw new MissingArgumentException(Strings.descMissingArgument("FreeBusyViewOptions.TimeWindow"));
            }
            this.timeWindow.Validate("FreeBusyViewOptions.TimeWindow");
            TimeSpan timeSpan = this.timeWindow.EndTime.Subtract(this.timeWindow.StartTime);

            if (timeSpan.Days > Configuration.MaximumQueryIntervalDays)
            {
                throw new TimeIntervalTooBigException("FreeBusyViewOptions.TimeWindow", Configuration.MaximumQueryIntervalDays, timeSpan.Days);
            }
            if (timeSpan.TotalMinutes < (double)this.mergedFreeBusyIntervalInMinutes)
            {
                throw new InvalidMergedFreeBusyIntervalException(5, 1440);
            }
        }
Example #3
0
        protected override AvailabilityQueryResult ExecuteInternal()
        {
            AvailabilityQueryResult availabilityQueryResult = AvailabilityQueryResult.Create();

            this.internalFreeBusyView = (this.desiredFreeBusyView ?? FreeBusyViewOptions.CreateDefaultForMeetingSuggestions(this.desiredSuggestionsView.DetailedSuggestionsWindow));
            this.ExecuteFreeBusyQuery(availabilityQueryResult);
            if (this.desiredSuggestionsView != null)
            {
                this.ExecuteMeetingSuggestionsQuery(availabilityQueryResult);
            }
            if (this.desiredFreeBusyView == null)
            {
                availabilityQueryResult.FreeBusyResults = null;
            }
            return(availabilityQueryResult);
        }
Example #4
0
        private static FreeBusyViewType GetReturnView(FreeBusyViewType requestedView, FreeBusyPermissionLevel freeBusyPermissionLevel)
        {
            FreeBusyViewType freeBusyViewType = FreeBusyViewType.None;

            switch (freeBusyPermissionLevel)
            {
            case FreeBusyPermissionLevel.None:
                freeBusyViewType = FreeBusyViewType.None;
                break;

            case FreeBusyPermissionLevel.Simple:
                freeBusyViewType = FreeBusyViewType.FreeBusy;
                break;

            case FreeBusyPermissionLevel.Detail:
            case FreeBusyPermissionLevel.Owner:
                freeBusyViewType = FreeBusyViewType.Detailed;
                break;
            }
            bool flag = FreeBusyViewOptions.IsMerged(requestedView);
            int  num;
            int  num2;

            if (flag)
            {
                num  = (int)(requestedView | FreeBusyViewType.MergedOnly);
                num2 = (int)(freeBusyViewType | FreeBusyViewType.MergedOnly);
            }
            else
            {
                num  = (int)requestedView;
                num2 = (int)freeBusyViewType;
            }
            int result;

            if (num <= num2)
            {
                result = num;
            }
            else
            {
                result = num2;
            }
            return((FreeBusyViewType)result);
        }
Example #5
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));
        }
Example #6
0
 internal CalendarQuery(ClientContext clientContext, FreeBusyViewOptions requestedFreeBusyView, bool defaultFreeBusyOnly, DateTime deadline) : base(clientContext, deadline)
 {
     this.requestedFreeBusyView = requestedFreeBusyView;
     this.defaultFreeBusyOnly   = defaultFreeBusyOnly;
 }