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); }
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); }
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); }