예제 #1
0
        public Task <IEnumerable <EntityVersion <AppointmentId, DateTime> > > GetVersions(IEnumerable <IdWithAwarenessLevel <AppointmentId> > idsOfEntitiesToQuery, IEventSynchronizationContext context)
        {
            var result = new List <EntityVersion <AppointmentId, DateTime> >();

            foreach (var id in idsOfEntitiesToQuery)
            {
                var appointment = _session.GetAppointmentItemOrNull(id.Id.EntryId, _folderId, _folderStoreId);
                if (appointment != null)
                {
                    try
                    {
                        if (_configuration.IsCategoryFilterSticky && id.IsKnown || DoesMatchCategoryCriterion(appointment))
                        {
                            result.Add(EntityVersion.Create(id.Id, appointment.LastModificationTime));
                            context.AnnounceAppointment(AppointmentSlim.FromAppointmentItem(appointment));
                        }
                    }
                    finally
                    {
                        Marshal.FinalReleaseComObject(appointment);
                    }
                }
            }

            return(Task.FromResult <IEnumerable <EntityVersion <AppointmentId, DateTime> > > (result));
        }
예제 #2
0
 private static Tuple <DateTime, DateTime, string> GetDuplicationRelevantData(AppointmentSlim item)
 {
     return(Tuple
            .Create(
                item.Start,
                item.End,
                item.Subject));
 }
        public void AnnounceAppointment(AppointmentSlim appointment)
        {
            var hashCode = GetHashCode(appointment);

            if (hashCode.HasValue)
            {
                _hashesById[appointment.Version.Id] = hashCode.Value;
            }
        }
        public async Task <EntityVersion <AppointmentId, DateTime> > Create(Func <IAppointmentItemWrapper, Task <IAppointmentItemWrapper> > entityInitializer, IEventSynchronizationContext context)
        {
            IAppointmentItemWrapper newAppointmentItemWrapper;

            using (var folderWrapper = CreateFolderWrapper())
            {
                newAppointmentItemWrapper = _comWrapperFactory.Create(
                    _useDefaultFolderItemType
                        ? (AppointmentItem)folderWrapper.Inner.Items.Add()
                        : (AppointmentItem)folderWrapper.Inner.Items.Add(OlItemType.olAppointmentItem),
                    entryId => _session.GetAppointmentItem(entryId, _folderStoreId));
            }

            using (newAppointmentItemWrapper)
            {
                try
                {
                    var initializedWrapper = await entityInitializer(newAppointmentItemWrapper);

                    using (initializedWrapper)
                    {
                        initializedWrapper.SaveAndReload();
                        context.DuplicateEventCleaner.AnnounceAppointment(AppointmentSlim.FromAppointmentItem(initializedWrapper.Inner));
                        var result = new EntityVersion <AppointmentId, DateTime>(
                            new AppointmentId(initializedWrapper.Inner.EntryID, initializedWrapper.Inner.GlobalAppointmentID),
                            initializedWrapper.Inner.LastModificationTime.ToUniversalTime());
                        return(result);
                    }
                }
                catch
                {
                    try
                    {
                        newAppointmentItemWrapper.Inner.Delete();
                    }
                    catch (System.Exception x)
                    {
                        s_logger.Error("Error while deleting leftover entity", x);
                    }

                    throw;
                }
            }
        }
예제 #5
0
        public async Task <EntityVersion <AppointmentId, DateTime> > TryUpdate(
            AppointmentId entityId,
            DateTime entityVersion,
            IAppointmentItemWrapper entityToUpdate,
            Func <IAppointmentItemWrapper, Task <IAppointmentItemWrapper> > entityModifier,
            IEventSynchronizationContext context)
        {
            entityToUpdate = await entityModifier(entityToUpdate);

            entityToUpdate.Inner.Save();
            context.AnnounceAppointment(AppointmentSlim.FromAppointmentItem(entityToUpdate.Inner));

            var newAppointmentId = new AppointmentId(entityToUpdate.Inner.EntryID, entityToUpdate.Inner.GlobalAppointmentID);

            if (!entityId.Equals(newAppointmentId))
            {
                context.AnnounceAppointmentDeleted(entityId);
            }

            return(new EntityVersion <AppointmentId, DateTime> (
                       newAppointmentId,
                       entityToUpdate.Inner.LastModificationTime));
        }
예제 #6
0
        public async Task <EntityVersion <AppointmentId, DateTime> > Create(Func <IAppointmentItemWrapper, Task <IAppointmentItemWrapper> > entityInitializer, IEventSynchronizationContext context)
        {
            IAppointmentItemWrapper newAppointmentItemWrapper;

            using (var folderWrapper = CreateFolderWrapper())
            {
                newAppointmentItemWrapper = _comWrapperFactory.Create(
                    (AppointmentItem)folderWrapper.Inner.Items.Add(OlItemType.olAppointmentItem),
                    entryId => _session.GetAppointmentItem(entryId, _folderStoreId));
            }

            using (newAppointmentItemWrapper)
            {
                using (var initializedWrapper = await entityInitializer(newAppointmentItemWrapper))
                {
                    initializedWrapper.SaveAndReload();
                    context.AnnounceAppointment(AppointmentSlim.FromAppointmentItem(initializedWrapper.Inner));
                    var result = new EntityVersion <AppointmentId, DateTime>(
                        new AppointmentId(initializedWrapper.Inner.EntryID, initializedWrapper.Inner.GlobalAppointmentID),
                        initializedWrapper.Inner.LastModificationTime);
                    return(result);
                }
            }
        }
예제 #7
0
 public void AnnounceAppointment(AppointmentSlim appointment)
 {
 }
        private static Tuple <DateTime, DateTime, string> GetDuplicationRelevantDataOrNull(AppointmentSlim item)
        {
            if (item.Start == null || item.End == null)
            {
                return(null);
            }

            return(Tuple
                   .Create(
                       item.Start.Value,
                       item.End.Value,
                       item.Subject));
        }
 private int?GetHashCode(AppointmentSlim item)
 {
     return(GetDuplicationRelevantDataOrNull(item)?.GetHashCode());
 }
예제 #10
0
 public void AnnounceAppointment(AppointmentSlim appointment)
 {
     _hashesById[appointment.Version.Id] = GetHashCode(appointment);
 }
예제 #11
0
 private int GetHashCode(AppointmentSlim item)
 {
     return(GetDuplicationRelevantData(item).GetHashCode());
 }