Beispiel #1
0
        private IOutlookSynchronizer CreateTaskSynchronizer(Options options, AvailableSynchronizerComponents componentsToFill)
        {
            var mappingParameters = GetMappingParameters <TaskMappingConfiguration> (options);

            var atypeRepository = new OutlookTaskRepository(_outlookSession, options.OutlookFolderEntryId, options.OutlookFolderStoreId, _daslFilterProvider);

            var calDavDataAccess = new CalDavDataAccess(
                new Uri(options.CalenderUrl),
                CreateWebDavClient(
                    options.UserName,
                    options.GetEffectivePassword(_outlookAccountPasswordProvider),
                    options.CalenderUrl,
                    _calDavConnectTimeout,
                    options.ServerAdapterType,
                    options.CloseAfterEachRequest,
                    options.PreemptiveAuthentication,
                    options.ForceBasicAuthentication,
                    options.ProxyOptions));

            componentsToFill.CalDavDataAccess = calDavDataAccess;

            var btypeRepository = new CalDavRepository(
                calDavDataAccess,
                new iCalendarSerializer(),
                CalDavRepository.EntityType.Todo,
                NullDateTimeRangeProvider.Instance,
                false);

            var outlookEventRelationDataFactory = new OutlookEventRelationDataFactory();
            var syncStateFactory = new EntitySyncStateFactory <string, DateTime, TaskItemWrapper, WebResourceName, string, IICalendar> (
                new TaskMapper(_outlookSession.Application.TimeZones.CurrentTimeZone.ID, mappingParameters),
                atypeRepository,
                btypeRepository,
                outlookEventRelationDataFactory,
                ExceptionHandler.Instance);

            var storageDataDirectory = _profileDataDirectoryFactory(options.Id);

            var btypeIdEqualityComparer = WebResourceName.Comparer;
            var atypeIdEqualityComparer = EqualityComparer <string> .Default;

            var synchronizer = new Synchronizer <string, DateTime, TaskItemWrapper, WebResourceName, string, IICalendar> (
                atypeRepository,
                btypeRepository,
                InitialTaskSyncStateCreationStrategyFactory.Create(
                    syncStateFactory,
                    syncStateFactory.Environment,
                    options.SynchronizationMode,
                    options.ConflictResolution),
                new EntityRelationDataAccess <string, DateTime, OutlookEventRelationData, WebResourceName, string> (storageDataDirectory),
                outlookEventRelationDataFactory,
                new InitialTaskEntityMatcher(btypeIdEqualityComparer),
                atypeIdEqualityComparer,
                btypeIdEqualityComparer,
                _totalProgressFactory,
                ExceptionHandler.Instance);

            return(new OutlookSynchronizer <WebResourceName, string> (synchronizer));
        }
        public IOutlookSynchronizer CreateSynchronizer(Options options, GeneralOptions generalOptions, out AvailableSynchronizerComponents synchronizerComponents)
        {
            if (options == null)
            {
                throw new ArgumentNullException(nameof(options));
            }
            if (generalOptions == null)
            {
                throw new ArgumentNullException(nameof(generalOptions));
            }

            synchronizerComponents = new AvailableSynchronizerComponents();

            OlItemType defaultItemType;
            string     folderName;

            using (var outlookFolderWrapper = GenericComObjectWrapper.Create((Folder)_outlookSession.GetFolderFromID(options.OutlookFolderEntryId, options.OutlookFolderStoreId)))
            {
                defaultItemType = outlookFolderWrapper.Inner.DefaultItemType;
                folderName      = outlookFolderWrapper.Inner.Name;
            }

            switch (defaultItemType)
            {
            case OlItemType.olAppointmentItem:
                return(CreateEventSynchronizer(options, generalOptions, synchronizerComponents));

            case OlItemType.olTaskItem:
                if (options.ServerAdapterType == ServerAdapterType.GoogleTaskApi)
                {
                    return(CreateGoogleTaskSynchronizer(options));
                }
                else
                {
                    return(CreateTaskSynchronizer(options, generalOptions, synchronizerComponents));
                }

            case OlItemType.olContactItem:
                if (options.ServerAdapterType == ServerAdapterType.GoogleContactApi)
                {
                    return(CreateGoogleContactSynchronizer(options, synchronizerComponents));
                }
                else
                {
                    return(CreateContactSynchronizer(options, generalOptions, synchronizerComponents));
                }

            default:
                throw new NotSupportedException(
                          string.Format(
                              "The folder '{0}' contains an item type ('{1}'), whis is not supported for synchronization",
                              folderName,
                              defaultItemType));
            }
        }
Beispiel #3
0
        private IOutlookSynchronizer CreateEventSynchronizer(Options options, AvailableSynchronizerComponents componentsToFill)
        {
            var calDavDataAccess = new CalDavDataAccess(
                new Uri(options.CalenderUrl),
                CreateWebDavClient(options, _calDavConnectTimeout, _outlookAccountPasswordProvider));

            componentsToFill.CalDavDataAccess = calDavDataAccess;

            var storageDataDirectory = _profileDataDirectoryFactory(options.Id);

            var entityRelationDataAccess = new EntityRelationDataAccess <string, DateTime, OutlookEventRelationData, WebResourceName, string> (storageDataDirectory);

            return(CreateEventSynchronizer(options, calDavDataAccess, entityRelationDataAccess));
        }
        private IOutlookSynchronizer CreateGoogleContactSynchronizer(Options options, AvailableSynchronizerComponents componentsToFill)
        {
            var atypeRepository = new OutlookContactRepository <GoogleContactContext> (
                _outlookSession,
                options.OutlookFolderEntryId,
                options.OutlookFolderStoreId,
                _daslFilterProvider);

            IWebProxy proxy = options.ProxyOptions != null?CreateProxy(options.ProxyOptions) : null;

            var googleApiExecutor = new GoogleApiOperationExecutor(
                System.Threading.Tasks.Task.Run(() => OAuth.Google.GoogleHttpClientFactory.LoginToContactsService(options.UserName, proxy).Result).Result);

            var mappingParameters = GetMappingParameters <ContactMappingConfiguration> (options);

            var atypeIdEqulityComparer  = EqualityComparer <string> .Default;
            var btypeIdEqualityComparer = EqualityComparer <string> .Default;

            var btypeRepository = new GoogleContactRepository(googleApiExecutor, options.UserName, mappingParameters, btypeIdEqualityComparer);

            var entityMapper = new GoogleContactEntityMapper(mappingParameters);

            var entityRelationDataFactory = new GoogleContactRelationDataFactory();

            var syncStateFactory = new EntitySyncStateFactory <string, DateTime, ContactItemWrapper, string, GoogleContactVersion, GoogleContactWrapper> (
                entityMapper,
                entityRelationDataFactory,
                ExceptionHandler.Instance);

            var storageDataDirectory = _profileDataDirectoryFactory(options.Id);

            var storageDataAccess = new EntityRelationDataAccess <string, DateTime, GoogleContactRelationData, string, GoogleContactVersion> (storageDataDirectory);

            var atypeWriteRepository = BatchEntityRepositoryAdapter.Create <ContactItemWrapper, string, DateTime, GoogleContactContext> (atypeRepository);

            var synchronizer = new Synchronizer <string, DateTime, ContactItemWrapper, string, GoogleContactVersion, GoogleContactWrapper, GoogleContactContext> (
                atypeRepository,
                btypeRepository,
                atypeWriteRepository,
                btypeRepository,
                InitialSyncStateCreationStrategyFactory <string, DateTime, ContactItemWrapper, string, GoogleContactVersion, GoogleContactWrapper> .Create(
                    syncStateFactory,
                    syncStateFactory.Environment,
                    options.SynchronizationMode,
                    options.ConflictResolution,
                    e => new GoogleContactConflictInitialSyncStateCreationStrategyAutomatic(e)),
                storageDataAccess,
                entityRelationDataFactory,
                new InitialGoogleContactEntityMatcher(btypeIdEqualityComparer),
                atypeIdEqulityComparer,
                btypeIdEqualityComparer,
                _totalProgressFactory,
                ExceptionHandler.Instance,
                new GoogleContactContextFactory(googleApiExecutor, btypeIdEqualityComparer, options.UserName),
                EqualityComparer <DateTime> .Default,
                new GoogleContactVersionComparer());

            return(new OutlookSynchronizer <string, GoogleContactVersion> (synchronizer));
        }
        private IOutlookSynchronizer CreateContactSynchronizer(Options options, GeneralOptions generalOptions, AvailableSynchronizerComponents componentsToFill)
        {
            var atypeRepository = new OutlookContactRepository <int> (
                _outlookSession,
                options.OutlookFolderEntryId,
                options.OutlookFolderStoreId,
                _daslFilterProvider);

            var cardDavDataAccess = new CardDavDataAccess(
                new Uri(options.CalenderUrl),
                CreateWebDavClient(
                    options.UserName,
                    options.GetEffectivePassword(_outlookAccountPasswordProvider),
                    options.CalenderUrl,
                    _calDavConnectTimeout,
                    options.ServerAdapterType,
                    options.CloseAfterEachRequest,
                    options.PreemptiveAuthentication,
                    options.ForceBasicAuthentication,
                    options.ProxyOptions,
                    generalOptions.AcceptInvalidCharsInServerResponse));

            componentsToFill.CardDavDataAccess = cardDavDataAccess;

            IEntityRepository <vCard, WebResourceName, string, int> btypeRepository = new CardDavRepository(
                cardDavDataAccess);

            var mappingParameters = GetMappingParameters <ContactMappingConfiguration> (options);

            var entityMapper = new ContactEntityMapper(mappingParameters);

            var entityRelationDataFactory = new OutlookContactRelationDataFactory();

            var syncStateFactory = new EntitySyncStateFactory <string, DateTime, ContactItemWrapper, WebResourceName, string, vCard> (
                entityMapper,
                entityRelationDataFactory,
                ExceptionHandler.Instance);

            var btypeIdEqualityComparer = WebResourceName.Comparer;
            var atypeIdEqulityComparer  = EqualityComparer <string> .Default;

            var storageDataDirectory = _profileDataDirectoryFactory(options.Id);

            var storageDataAccess = new EntityRelationDataAccess <string, DateTime, OutlookContactRelationData, WebResourceName, string> (storageDataDirectory);

            var atypeWriteRepository = BatchEntityRepositoryAdapter.Create(atypeRepository);
            var btypeWriteRepository = BatchEntityRepositoryAdapter.Create(btypeRepository);

            var synchronizer = new Synchronizer <string, DateTime, ContactItemWrapper, WebResourceName, string, vCard, int> (
                atypeRepository,
                btypeRepository,
                atypeWriteRepository,
                btypeWriteRepository,
                InitialSyncStateCreationStrategyFactory <string, DateTime, ContactItemWrapper, WebResourceName, string, vCard> .Create(
                    syncStateFactory,
                    syncStateFactory.Environment,
                    options.SynchronizationMode,
                    options.ConflictResolution,
                    e => new ContactConflictInitialSyncStateCreationStrategyAutomatic(e)),
                storageDataAccess,
                entityRelationDataFactory,
                new InitialContactEntityMatcher(btypeIdEqualityComparer),
                atypeIdEqulityComparer,
                btypeIdEqualityComparer,
                _totalProgressFactory,
                ExceptionHandler.Instance,
                NullSynchronizationContextFactory.Instance,
                EqualityComparer <DateTime> .Default,
                EqualityComparer <string> .Default);

            return(new OutlookSynchronizer <WebResourceName, string> (synchronizer));
        }
        private IOutlookSynchronizer CreateTaskSynchronizer(Options options, GeneralOptions generalOptions, AvailableSynchronizerComponents componentsToFill)
        {
            var mappingParameters = GetMappingParameters <TaskMappingConfiguration> (options);

            var atypeRepository = new OutlookTaskRepository(_outlookSession, options.OutlookFolderEntryId, options.OutlookFolderStoreId, _daslFilterProvider, mappingParameters);



            ICalDavDataAccess calDavDataAccess;
            var calendarUrl = new Uri(options.CalenderUrl);

            if (calendarUrl.Scheme == Uri.UriSchemeFile)
            {
                calDavDataAccess = new FileSystemDavDataAccess(calendarUrl);
            }
            else
            {
                calDavDataAccess = new CalDavDataAccess(
                    calendarUrl,
                    CreateWebDavClient(
                        options.UserName,
                        options.GetEffectivePassword(_outlookAccountPasswordProvider),
                        options.CalenderUrl,
                        generalOptions.CalDavConnectTimeout,
                        options.ServerAdapterType,
                        options.CloseAfterEachRequest,
                        options.PreemptiveAuthentication,
                        options.ForceBasicAuthentication,
                        options.ProxyOptions,
                        generalOptions.EnableClientCertificate,
                        generalOptions.AcceptInvalidCharsInServerResponse));
            }

            componentsToFill.CalDavDataAccess = calDavDataAccess;

            var btypeRepository = new CalDavRepository <int> (
                calDavDataAccess,
                new iCalendarSerializer(),
                CalDavRepository.EntityType.Todo,
                NullDateTimeRangeProvider.Instance,
                false,
                options.IsChunkedSynchronizationEnabled ? new ChunkedExecutor(options.ChunkSize) : NullChunkedExecutor.Instance);

            var relationDataFactory = new TaskRelationDataFactory();
            var syncStateFactory    = new EntitySyncStateFactory <string, DateTime, TaskItemWrapper, WebResourceName, string, IICalendar> (
                new TaskMapper(_outlookSession.Application.TimeZones.CurrentTimeZone.ID, mappingParameters),
                relationDataFactory,
                ExceptionHandler.Instance);

            var storageDataDirectory = _profileDataDirectoryFactory(options.Id);

            var btypeIdEqualityComparer = WebResourceName.Comparer;
            var atypeIdEqualityComparer = EqualityComparer <string> .Default;

            var atypeWriteRepository = BatchEntityRepositoryAdapter.Create(atypeRepository);
            var btypeWriteRepository = BatchEntityRepositoryAdapter.Create(btypeRepository);

            var synchronizer = new Synchronizer <string, DateTime, TaskItemWrapper, WebResourceName, string, IICalendar, int> (
                atypeRepository,
                btypeRepository,
                atypeWriteRepository,
                btypeWriteRepository,
                InitialSyncStateCreationStrategyFactory <string, DateTime, TaskItemWrapper, WebResourceName, string, IICalendar> .Create(
                    syncStateFactory,
                    syncStateFactory.Environment,
                    options.SynchronizationMode,
                    options.ConflictResolution,
                    e => new TaskConflictInitialSyncStateCreationStrategyAutomatic(e)),
                new EntityRelationDataAccess <string, DateTime, TaskRelationData, WebResourceName, string> (storageDataDirectory),
                relationDataFactory,
                new InitialTaskEntityMatcher(btypeIdEqualityComparer),
                atypeIdEqualityComparer,
                btypeIdEqualityComparer,
                _totalProgressFactory,
                ExceptionHandler.Instance,
                NullSynchronizationContextFactory.Instance,
                EqualityComparer <DateTime> .Default,
                EqualityComparer <string> .Default,
                syncStateFactory);

            return(new OutlookSynchronizer <WebResourceName, string> (synchronizer));
        }
        private async Task <IOutlookSynchronizer> CreateEventSynchronizer(Options options, GeneralOptions generalOptions, AvailableSynchronizerComponents componentsToFill)
        {
            ICalDavDataAccess calDavDataAccess;

            var calendarUrl = new Uri(options.CalenderUrl);

            if (calendarUrl.Scheme == Uri.UriSchemeFile)
            {
                calDavDataAccess = new FileSystemDavDataAccess(calendarUrl);
            }
            else
            {
                calDavDataAccess = new CalDavDataAccess(
                    calendarUrl,
                    CreateWebDavClient(options, _outlookAccountPasswordProvider, generalOptions));
            }

            componentsToFill.CalDavDataAccess = calDavDataAccess;

            var storageDataDirectory = _profileDataDirectoryFactory(options.Id);

            var entityRelationDataAccess = new EntityRelationDataAccess <AppointmentId, DateTime, OutlookEventRelationData, WebResourceName, string> (storageDataDirectory);

            return(await CreateEventSynchronizer(options, calDavDataAccess, entityRelationDataAccess));
        }
Beispiel #8
0
        private IOutlookSynchronizer CreateContactSynchronizer(Options options, GeneralOptions generalOptions, AvailableSynchronizerComponents componentsToFill)
        {
            var atypeRepository = new OutlookContactRepository <ICardDavRepositoryLogger> (
                _outlookSession,
                options.OutlookFolderEntryId,
                options.OutlookFolderStoreId,
                _daslFilterProvider,
                _queryFolderStrategy);

            ICardDavDataAccess cardDavDataAccess;
            var serverUrl = new Uri(options.CalenderUrl);

            IWebDavClient webDavClientOrNullIfFileAccess = null;

            if (serverUrl.Scheme == Uri.UriSchemeFile)
            {
                cardDavDataAccess = new FileSystemDavDataAccess(serverUrl);
            }
            else
            {
                webDavClientOrNullIfFileAccess = CreateWebDavClient(
                    options.UserName,
                    options.GetEffectivePassword(_outlookAccountPasswordProvider),
                    options.CalenderUrl,
                    generalOptions.CalDavConnectTimeout,
                    options.ServerAdapterType,
                    options.CloseAfterEachRequest,
                    options.PreemptiveAuthentication,
                    options.ForceBasicAuthentication,
                    options.ProxyOptions,
                    generalOptions.EnableClientCertificate,
                    generalOptions.AcceptInvalidCharsInServerResponse);

                cardDavDataAccess = new CardDavDataAccess(
                    serverUrl,
                    webDavClientOrNullIfFileAccess,
                    contentType => contentType != "text/x-vlist");
            }
            componentsToFill.CardDavDataAccess = cardDavDataAccess;

            var chunkedExecutor = options.IsChunkedSynchronizationEnabled ? new ChunkedExecutor(options.ChunkSize) : NullChunkedExecutor.Instance;

            var cardDavRepository = new CardDavRepository(
                cardDavDataAccess,
                chunkedExecutor);
            var btypeRepository =
                new LoggingCardDavRepositoryDecorator(
                    cardDavRepository);

            componentsToFill.CardDavEntityRepository = cardDavRepository;

            var mappingParameters = GetMappingParameters <ContactMappingConfiguration> (options);

            var entityMapper = new ContactEntityMapper(mappingParameters);

            var entityRelationDataFactory = new OutlookContactRelationDataFactory();

            var syncStateFactory = new EntitySyncStateFactory <string, DateTime, ContactItemWrapper, WebResourceName, string, vCard, ICardDavRepositoryLogger> (
                entityMapper,
                entityRelationDataFactory,
                ExceptionHandler.Instance);

            var btypeIdEqualityComparer = WebResourceName.Comparer;
            var atypeIdEqulityComparer  = EqualityComparer <string> .Default;

            var storageDataDirectory = _profileDataDirectoryFactory(options.Id);

            var storageDataAccess = new EntityRelationDataAccess <string, DateTime, OutlookContactRelationData, WebResourceName, string> (storageDataDirectory);

            var atypeWriteRepository = BatchEntityRepositoryAdapter.Create(atypeRepository);
            var btypeWriteRepository = BatchEntityRepositoryAdapter.Create(btypeRepository);

            var synchronizer = new Synchronizer <string, DateTime, ContactItemWrapper, WebResourceName, string, vCard, ICardDavRepositoryLogger> (
                atypeRepository,
                btypeRepository,
                atypeWriteRepository,
                btypeWriteRepository,
                InitialSyncStateCreationStrategyFactory <string, DateTime, ContactItemWrapper, WebResourceName, string, vCard, ICardDavRepositoryLogger> .Create(
                    syncStateFactory,
                    syncStateFactory.Environment,
                    options.SynchronizationMode,
                    options.ConflictResolution,
                    e => new ContactConflictInitialSyncStateCreationStrategyAutomatic(e)),
                storageDataAccess,
                entityRelationDataFactory,
                new InitialContactEntityMatcher(btypeIdEqualityComparer),
                atypeIdEqulityComparer,
                btypeIdEqualityComparer,
                _totalProgressFactory,
                EqualityComparer <DateTime> .Default,
                EqualityComparer <string> .Default,
                syncStateFactory);

            if (mappingParameters.MapDistributionLists)
            {
                CardDavEntityRepository <DistributionList, int, DistributionListSychronizationContext> bDistListRepository;

                // TODO: muss auch für das file funktionieren
                ICardDavDataAccess distListDataAccess = new CardDavDataAccess(
                    serverUrl,
                    webDavClientOrNullIfFileAccess,
                    contentType => contentType == "text/x-vlist");

                componentsToFill.DistListDataAccess = distListDataAccess;

                switch (mappingParameters.DistributionListType)
                {
                case DistributionListType.Sogo:
                    bDistListRepository = new SogoDistributionListRepository(distListDataAccess, chunkedExecutor);
                    break;

                default:
                    throw new NotImplementedException($"{nameof(DistributionListType)} '{mappingParameters.DistributionListType}' not implemented.");
                }

                var distributionListSynchronizer = CreateDistListSynchronizer(options, generalOptions, bDistListRepository);

                return(new OutlookSynchronizer <WebResourceName, string>(
                           new ContactAndDistListSynchronizer(
                               synchronizer,
                               distributionListSynchronizer,
                               new EmailAddressCacheDataAccess(Path.Combine(storageDataDirectory, "emailAddressCache.xml")),
                               btypeRepository,
                               storageDataAccess,
                               atypeRepository,
                               _outlookSession)));
            }
            else
            {
                return(new OutlookSynchronizer <WebResourceName, string>(
                           new ContextCreatingSynchronizerDecorator <string, DateTime, ContactItemWrapper, WebResourceName, string, vCard, ICardDavRepositoryLogger>(
                               synchronizer,
                               new SynchronizationContextFactory <ICardDavRepositoryLogger>(() => NullCardDavRepositoryLogger.Instance))));
            }
        }