Exemple #1
0
        protected override object InternalTryGetValue(PropertyBag.BasicPropertyStore propertyBag)
        {
            MeetingMessage meetingMessage = propertyBag.Context.StoreObject as MeetingMessage;

            if (meetingMessage != null)
            {
                return(meetingMessage.IsOutOfDate());
            }
            return(new PropertyError(this, PropertyErrorCode.GetCalculatedPropertyError));
        }
 protected internal override CalendarItemOccurrence RecoverDeletedOccurrence()
 {
     if (this.possibleDeletedOccurrenceId != null)
     {
         MailboxSession calendarMailboxSession = MeetingMessage.GetCalendarMailboxSession(this);
         for (int i = 0; i < 2; i++)
         {
             CalendarItem calendarItem = CalendarItem.Bind(calendarMailboxSession, StoreObjectId.FromProviderSpecificId(this.possibleDeletedOccurrenceId.ProviderLevelItemId, StoreObjectType.CalendarItem));
             try
             {
                 calendarItem.OpenAsReadWrite();
                 if (calendarItem.Recurrence != null)
                 {
                     InternalRecurrence internalRecurrence = (InternalRecurrence)calendarItem.Recurrence;
                     ExDateTime         occurrenceId       = ((OccurrenceStoreObjectId)this.possibleDeletedOccurrenceId).OccurrenceId;
                     if (internalRecurrence.IsValidOccurrenceId(occurrenceId))
                     {
                         if (internalRecurrence.IsOccurrenceDeleted(occurrenceId))
                         {
                             base.LocationIdentifierHelperInstance.SetLocationIdentifier(39541U, LastChangeAction.RecoverDeletedOccurance);
                             calendarItem.RecoverDeletedOccurrence(this.possibleDeletedOccurrenceId);
                             if (calendarItem.Save(SaveMode.ResolveConflicts).SaveStatus == SaveResult.IrresolvableConflict)
                             {
                                 goto IL_136;
                             }
                         }
                         CalendarItemOccurrence calendarItemOccurrence = CalendarItemOccurrence.Bind(calendarMailboxSession, this.possibleDeletedOccurrenceId, MeetingMessageSchema.Instance.AutoloadProperties);
                         calendarItemOccurrence.OpenAsReadWrite();
                         ExTraceGlobals.MeetingMessageTracer.Information <GlobalObjectId>((long)this.GetHashCode(), "Storage.MeetingMessage.RecoverDeletedOccurrence: GOID={0}; occurrence recovered.", this.GlobalObjectId);
                         return(calendarItemOccurrence);
                     }
                     ExTraceGlobals.MeetingMessageTracer.Information <GlobalObjectId>((long)this.GetHashCode(), "Storage.MeetingMessage.RecoverDeletedOccurrence: GOID={0}; occurrence id is invalid.", this.GlobalObjectId);
                     return(null);
                 }
             }
             catch (OccurrenceNotFoundException)
             {
                 ExTraceGlobals.MeetingMessageTracer.Information <GlobalObjectId>((long)this.GetHashCode(), "Storage.MeetingMessage.RecoverDeletedOccurrence: GOID={0}; occurrence not found.", this.GlobalObjectId);
                 return(null);
             }
             finally
             {
                 calendarItem.Dispose();
             }
             IL_136 :;
         }
     }
     ExTraceGlobals.MeetingMessageTracer.Information <GlobalObjectId>((long)this.GetHashCode(), "Storage.MeetingMessage.RecoverDeletedOccurrence: GOID={0}; occurrence not recovered.", this.GlobalObjectId);
     return(null);
 }
        protected static MailboxSession GetCalendarMailboxSession(MeetingMessage meetingMessage)
        {
            if (!(meetingMessage.Session is MailboxSession))
            {
                throw new NotSupportedException();
            }
            MailboxSession mailboxSession = (MailboxSession)meetingMessage.Session;

            if (meetingMessage.IsDelegated())
            {
                Participant       valueOrDefault = meetingMessage.GetValueOrDefault <Participant>(InternalSchema.ReceivedRepresenting);
                ExchangePrincipal principal      = MeetingMessage.InternalGetExchangePrincipal(valueOrDefault, mailboxSession);
                mailboxSession = mailboxSession.InternalGetDelegateSessionEntry(principal, OpenBy.Internal).MailboxSession;
            }
            return(mailboxSession);
        }
        protected override object InternalTryGetValue(PropertyBag.BasicPropertyStore propertyBag)
        {
            bool?  flag           = null;
            string valueOrDefault = propertyBag.GetValueOrDefault <string>(InternalSchema.ItemClass, string.Empty);

            if (ObjectClass.IsCalendarItemCalendarItemOccurrenceOrRecurrenceException(valueOrDefault) || ObjectClass.IsCalendarItemSeries(valueOrDefault))
            {
                AppointmentStateFlags valueOrDefault2 = propertyBag.GetValueOrDefault <AppointmentStateFlags>(InternalSchema.AppointmentStateInternal);
                flag = new bool?(IsOrganizerProperty.GetForCalendarItem(valueOrDefault, valueOrDefault2));
            }
            else if (ObjectClass.IsMeetingMessage(valueOrDefault))
            {
                MeetingMessage meetingMessage = propertyBag.Context.StoreObject as MeetingMessage;
                if (meetingMessage != null)
                {
                    CalendarItemBase calendarItemBase = null;
                    try
                    {
                        calendarItemBase = meetingMessage.GetCorrelatedItemInternal(true);
                    }
                    catch (CorruptDataException)
                    {
                    }
                    catch (CorrelationFailedException)
                    {
                    }
                    if (calendarItemBase != null)
                    {
                        flag = new bool?(calendarItemBase.IsOrganizer());
                    }
                    else if (!(meetingMessage is MeetingResponse))
                    {
                        flag = new bool?(meetingMessage.IsMailboxOwnerTheSender());
                    }
                }
            }
            if (flag != null)
            {
                return(flag);
            }
            return(new PropertyError(this, PropertyErrorCode.NotFound));
        }
        protected CalendarItemBase GetCalendarItemToUpdate(CalendarItemBase correlatedCalendarItem)
        {
            CalendarItemBase calendarItemBase = correlatedCalendarItem;

            if (calendarItemBase == null)
            {
                MailboxSession calendarMailboxSession = MeetingMessage.GetCalendarMailboxSession(this);
                if ((calendarItemBase = this.RecoverDeletedOccurrence()) == null)
                {
                    ExTraceGlobals.MeetingMessageTracer.Information <GlobalObjectId>((long)this.GetHashCode(), "Storage.MeetingMessage.GetCalendarItemToUpdate: GOID={0}. Creating calendar item", this.GlobalObjectId);
                    StoreObjectId parentFolderId = calendarMailboxSession.SafeGetDefaultFolderId(DefaultFolderType.Calendar);
                    calendarItemBase = (this.IsSeriesMessage ? CalendarItemSeries.CreateSeries(calendarMailboxSession, parentFolderId, false) : CalendarItem.CreateCalendarItem(calendarMailboxSession, parentFolderId, false));
                }
                else
                {
                    ExTraceGlobals.MeetingMessageTracer.Information <GlobalObjectId>((long)this.GetHashCode(), "Storage.MeetingMessage.GetCalendarItemToUpdate: GOID={0}. Recovered deleted occurrence.", this.GlobalObjectId);
                }
            }
            return(calendarItemBase);
        }
        private bool TryUpdateCalendarItemInternal(ref CalendarItemBase originalCalendarItem, bool shouldThrow, bool canUpdatePrincipalCalendar)
        {
            this.CheckDisposed("MeetingRequest::TryUpdateCalendarItem");
            bool flag = originalCalendarItem == null;
            CalendarProcessingSteps calendarProcessingSteps = CalendarProcessingSteps.None;

            ExTraceGlobals.MeetingMessageTracer.Information <GlobalObjectId>((long)this.GetHashCode(), "Storage.MeetingMessage.TryUpdateCalendarItemInternal: GOID={0}", this.GlobalObjectId);
            base.CheckPreConditionForDelegatedMeeting(canUpdatePrincipalCalendar);
            if (originalCalendarItem != this.externalCorrelatedCalendarItem)
            {
                throw new CalendarProcessingException(ServerStrings.ExInvalidCallToTryUpdateCalendarItem);
            }
            if (!this.CheckPreConditions(originalCalendarItem, shouldThrow, canUpdatePrincipalCalendar))
            {
                ExTraceGlobals.MeetingMessageTracer.Information <GlobalObjectId>((long)this.GetHashCode(), "Storage.MeetingMessage.TryUpdateCalendarItemInternal: GOID={0}; failed pre-conditions", this.GlobalObjectId);
                return(false);
            }
            if (originalCalendarItem != null)
            {
                originalCalendarItem.IsCorrelated = false;
            }
            calendarProcessingSteps |= CalendarProcessingSteps.PropsCheck;
            DelegateRuleType?delegateRuleType;

            if (MeetingMessage.TryGetDelegateRuleTypeFromSession(base.Session as MailboxSession, out delegateRuleType))
            {
                if (delegateRuleType == DelegateRuleType.ForwardAndSetAsInformationalUpdate)
                {
                    ExTraceGlobals.MeetingMessageTracer.Information((long)this.GetHashCode(), "Storage.MeetingMessage.TryUpdateCalendarItemInternal: Setting PrincipalWantsCopy on meetingmessage.");
                    MeetingMessageType valueOrDefault = base.GetValueOrDefault <MeetingMessageType>(InternalSchema.MeetingRequestType, MeetingMessageType.NewMeetingRequest);
                    base.LocationIdentifierHelperInstance.SetLocationIdentifier(53365U);
                    this[InternalSchema.OriginalMeetingType] = valueOrDefault;
                    this[InternalSchema.MeetingRequestType]  = MeetingMessageType.PrincipalWantsCopy;
                }
                calendarProcessingSteps |= CalendarProcessingSteps.PrincipalWantsCopyChecked;
            }
            int num = flag ? 1 : this.CompareToCalendarItem(originalCalendarItem);

            calendarProcessingSteps |= CalendarProcessingSteps.LookedForOutOfDate;
            if ((!base.CalendarProcessed && num == 0) || num > 0)
            {
                base.LocationIdentifierHelperInstance.SetLocationIdentifier(57461U, LastChangeAction.UpdateCalendarItem);
                this.UpdateCalendarItemInternal(ref originalCalendarItem);
                base.CalendarProcessed = true;
                if (originalCalendarItem != null)
                {
                    originalCalendarItem.LocationIdentifierHelperInstance.SetLocationIdentifier(32885U, LastChangeAction.UpdateCalendarItem);
                }
                MeetingMessageInstance.SetVersionInfo(originalCalendarItem);
                calendarProcessingSteps |= CalendarProcessingSteps.UpdatedCalItem;
            }
            else
            {
                ExTraceGlobals.MeetingMessageTracer.Information <GlobalObjectId, bool, int>((long)this.GetHashCode(), "Storage.MeetingMessage.TryUpdateCalendarItemInternal: GOID={0}; NOOP: calendarprocessed = {1}, originalCalendarItem={2}", this.GlobalObjectId, base.CalendarProcessed, (originalCalendarItem == null) ? -1 : originalCalendarItem.GetHashCode());
            }
            if (flag && originalCalendarItem != null)
            {
                this.externalCorrelatedCalendarItem = originalCalendarItem;
                calendarProcessingSteps            |= CalendarProcessingSteps.CreatedOnPrincipal;
            }
            if (originalCalendarItem != null)
            {
                originalCalendarItem.CharsetDetector.DetectionOptions = base.CharsetDetector.DetectionOptions;
            }
            this.SetCalendarProcessingSteps(calendarProcessingSteps);
            return(true);
        }
        internal override CalendarItemBase GetCorrelatedItemInternal(bool cache, bool shouldDetectDuplicateIds, out IEnumerable <VersionedId> detectedDuplicatesIds)
        {
            ExTraceGlobals.MeetingMessageTracer.Information <GlobalObjectId, bool>((long)this.GetHashCode(), "Storage.MeetingMessage.GetCorrelatedItem: GOID={0}; cache={1}", this.GlobalObjectId, cache);
            if (!(base.Session is MailboxSession))
            {
                detectedDuplicatesIds = null;
                return(null);
            }
            if (this.cachedCorrelatedItem != null)
            {
                if (!shouldDetectDuplicateIds)
                {
                    ExTraceGlobals.MeetingMessageTracer.Information <GlobalObjectId>((long)this.GetHashCode(), "Storage.MeetingMessage.GetCorrelatedItemInternal: GOID={0}. Returning cached correlated item.", this.GlobalObjectId);
                    CalendarItemBase result = this.cachedCorrelatedItem;
                    if (!cache)
                    {
                        this.cachedCorrelatedItem.SetDisposeTrackerStacktraceToCurrentLocation();
                        this.cachedCorrelatedItem = null;
                    }
                    detectedDuplicatesIds = Array <VersionedId> .Empty;
                    return(result);
                }
                ExTraceGlobals.MeetingMessageTracer.Information <GlobalObjectId>((long)this.GetHashCode(), "Storage.MeetingMessage.GetCorrelatedItemInternal: GOID={0}. Clearing cached item.", this.GlobalObjectId);
                this.cachedCorrelatedItem.Dispose();
                this.cachedCorrelatedItem = null;
            }
            MailboxSession calendarMailboxSession;

            try
            {
                calendarMailboxSession = MeetingMessage.GetCalendarMailboxSession(this);
            }
            catch (NotSupportedWithServerVersionException ex)
            {
                ExTraceGlobals.MeetingMessageTracer.Information((long)this.GetHashCode(), "MeetingMessage::GetCorrelatedItemInternal. Calendar mailbox session failed to open due to not supported server version.");
                throw new CorrelationFailedException(ex.LocalizedString, ex);
            }
            catch (AdUserNotFoundException ex2)
            {
                ExTraceGlobals.MeetingMessageTracer.Information((long)this.GetHashCode(), "MeetingMessage::GetCorrelatedItemInternal. Calendar mailbox session failed to open due to not being able to find the owner's mailbox.");
                throw new CorrelationFailedException(ex2.LocalizedString, ex2);
            }
            StoreObjectId defaultFolderId = calendarMailboxSession.GetDefaultFolderId(DefaultFolderType.Calendar);

            if (defaultFolderId == null)
            {
                ExTraceGlobals.MeetingMessageTracer.Information((long)this.GetHashCode(), "MeetingMessage::GetCorrelatedItemInternal. Calendar folder is not found. We treat it as correlated calendar item has been deleted.");
                detectedDuplicatesIds = null;
                return(null);
            }
            CalendarItemBase calendarItemBase = null;
            bool             flag             = false;

            try
            {
                using (CalendarFolder calendarFolder = CalendarFolder.Bind(calendarMailboxSession, defaultFolderId))
                {
                    int i = 0;
                    while (i < 2)
                    {
                        ExTraceGlobals.MeetingMessageTracer.Information <GlobalObjectId, int>((long)this.GetHashCode(), "Storage.MeetingMessage.GetCorrelatedItemInternal: GOID={0}. Retrying fetch count={1}", this.GlobalObjectId, i);
                        this.FetchCorrelatedItemId(calendarFolder, shouldDetectDuplicateIds, out detectedDuplicatesIds);
                        if (this.correlatedItemId != null)
                        {
                            try
                            {
                                calendarItemBase = CalendarItemBase.Bind(calendarMailboxSession, this.correlatedItemId.ObjectId);
                            }
                            catch (OccurrenceNotFoundException)
                            {
                                ExTraceGlobals.MeetingMessageTracer.Information <GlobalObjectId>((long)this.GetHashCode(), "Storage.MeetingMessage.GetCorrelatedItemInternal: GOID={0}. Occurrence not found.", this.GlobalObjectId);
                                this.possibleDeletedOccurrenceId = this.correlatedItemId.ObjectId;
                                this.correlatedItemId            = null;
                                break;
                            }
                            catch (ObjectNotFoundException)
                            {
                                ExTraceGlobals.MeetingMessageTracer.Information <GlobalObjectId>((long)this.GetHashCode(), "Storage.MeetingMessage.GetCorrelatedItemInternal: GOID={0}. Calendar item id was found but calendar item got deleted.", this.GlobalObjectId);
                                this.correlatedItemId = null;
                                goto IL_259;
                            }
                            catch (WrongObjectTypeException innerException)
                            {
                                throw new CorruptDataException(ServerStrings.ExNonCalendarItemReturned("Unknown"), innerException);
                            }
                            catch (ArgumentException)
                            {
                                throw new CorruptDataException(ServerStrings.ExNonCalendarItemReturned("Unknown"));
                            }
                            goto IL_20D;
IL_259:
                            i++;
                            continue;
IL_20D:
                            calendarItemBase.OpenAsReadWrite();
                            if (base.Id != null)
                            {
                                calendarItemBase.AssociatedItemId = base.Id;
                            }
                            if (cache)
                            {
                                ExTraceGlobals.MeetingMessageTracer.Information <GlobalObjectId>((long)this.GetHashCode(), "Storage.MeetingMessage.GetCorrelatedItemInternal: GOID={0}. Caching correlated calendar item.", this.GlobalObjectId);
                                this.cachedCorrelatedItem = calendarItemBase;
                            }
                            flag = true;
                            return(calendarItemBase);
                        }
                        break;
                    }
                }
            }
            finally
            {
                if (!flag)
                {
                    Util.DisposeIfPresent(calendarItemBase);
                }
            }
            detectedDuplicatesIds = null;
            return(null);
        }
Exemple #8
0
 protected override void InternalUpdateSequencingProperties(bool isToAllAttendees, MeetingMessage message, int minSequenceNumber, int?seriesSequenceNumber = null)
 {
     if (seriesSequenceNumber != null)
     {
         this.SeriesSequenceNumber = seriesSequenceNumber.Value;
         message[InternalSchema.AppointmentSequenceNumber] = seriesSequenceNumber.Value;
     }
 }
        protected override void InternalUpdateSequencingProperties(bool isToAllAttendees, MeetingMessage message, int minSequenceNumber, int?seriesSequenceNumber = null)
        {
            ExDateTime now = ExDateTime.GetNow(base.PropertyBag.ExTimeZone);

            base.OwnerCriticalChangeTime = now;
            int appointmentSequenceNumber     = base.AppointmentSequenceNumber;
            int appointmentLastSequenceNumber = this.AppointmentLastSequenceNumber;
            int valueOrDefault = base.GetValueOrDefault <int>(InternalSchema.CdoSequenceNumber);
            int num            = Math.Max(minSequenceNumber, Math.Max(appointmentSequenceNumber, Math.Max(appointmentLastSequenceNumber, valueOrDefault)));

            if (base.MeetingRequestWasSent)
            {
                base.LocationIdentifierHelperInstance.SetLocationIdentifier(40959U);
                num++;
            }
            if (isToAllAttendees)
            {
                base.LocationIdentifierHelperInstance.SetLocationIdentifier(51573U);
                this[InternalSchema.AppointmentSequenceTime] = now;
                base.AppointmentSequenceNumber = num;
            }
            this.AppointmentLastSequenceNumber = num;
            if (message != null)
            {
                message[InternalSchema.OwnerCriticalChangeTime]   = now;
                message[InternalSchema.AppointmentSequenceNumber] = num;
                ExDateTime?valueAsNullable = base.GetValueAsNullable <ExDateTime>(InternalSchema.AppointmentSequenceTime);
                message[InternalSchema.AppointmentSequenceTime] = ((valueAsNullable != null) ? valueAsNullable.Value : now);
            }
            base.LocationIdentifierHelperInstance.SetLocationIdentifier(37237U, LastChangeAction.UpdateSequenceNumber);
        }
Exemple #10
0
 public IMeetingMessage BindToMeetingMessage(IStoreSession session, StoreId storeId)
 {
     return(MeetingMessage.Bind((StoreSession)session, storeId));
 }
 public new static MeetingMessage Bind(StoreSession session, StoreId storeId, params PropertyDefinition[] propsToReturn)
 {
     return(MeetingMessage.Bind(session, storeId, (ICollection <PropertyDefinition>)propsToReturn));
 }
 public new static MeetingMessage Bind(StoreSession session, StoreId storeId)
 {
     return(MeetingMessage.Bind(session, storeId, null));
 }
        public static bool IsDelegateOnlyFromSession(MailboxSession session)
        {
            DelegateRuleType?delegateRuleType;

            return(MeetingMessage.TryGetDelegateRuleTypeFromSession(session, out delegateRuleType) && delegateRuleType == DelegateRuleType.ForwardAndDelete);
        }