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