예제 #1
0
        private DbSetSettings GetSettings(bool cached)
        {
            if (cached)
            {
                if (_settingsCached == null)
                {
                    _settingsCached = GetSettings(false);
                }
                return(_settingsCached);
            }

            var fileName = _fileManager.CombineDirectories(_inDir, FileEngineDefaults.SetSettingsName);

            if (!_fileManager.FileExists(fileName))
            {
                ChangeSettings(new DbSetSettings(), false);
            }
            try {
                var serializer = new XmlSerializer(typeof(DbSetSettings));
                var settings   = new XmlReaderSettings();
                using (var textReader = new StreamReader(_fileManager.FileReadStream(fileName)))
                {
                    var xmlReader = XmlReader.Create(textReader, settings);
                    return((serializer.Deserialize(xmlReader) as DbSetSettings) ?? new DbSetSettings());
                }
            }
            catch (InvalidOperationException)  // XML niet in juiste format
            {
                //ChangeSettings(nieuw, false);
                return(new DbSetSettings());
            }
        }
예제 #2
0
        public void ShouldSyncLibraryWhenShareImportCompletedIsWithSuccess()
        {
            // Arrange
            IMediaPortalServices mediaPortalServices = Substitute.For <IMediaPortalServices>();

            mediaPortalServices.GetTraktUserHomePath().Returns(DataPath);
            SetSettings(mediaPortalServices, new TraktPluginSettings {
                IsAutomaticLibrarySyncEnabled = true, ShowAutomaticSyncNotifications = true
            });

            IAsynchronousMessageQueue messageQueue = GetMockedMsgQueue(mediaPortalServices);

            IFileOperations fileOperations = Substitute.For <IFileOperations>();

            fileOperations.FileExists(Path.Combine(DataPath, FileName.Authorization.Value)).Returns(true);

            ILibrarySynchronization librarySynchronization = Substitute.For <ILibrarySynchronization>();

            librarySynchronization.SyncMovies().Returns(new TraktSyncMoviesResult());
            librarySynchronization.SyncSeries().Returns(new TraktSyncEpisodesResult());

            TraktSyncHandlerManager traktScrobbleHandler = new TraktSyncHandlerManager(mediaPortalServices, librarySynchronization, fileOperations);

            // Act
            // send share import completed message
            messageQueue.MessageReceivedProxy += Raise.Event <MessageReceivedHandler>(new AsynchronousMessageQueue(new object(), new[] { "ContentDirectory" }),
                                                                                      GetSystemMessageForMessageType(ContentDirectoryMessaging.MessageType.ShareImportCompleted));

            // Assert
            mediaPortalServices.GetTraktNotificationModel().Received().ShowNotification(Arg.Any <TraktSyncLibrarySuccessNotification>(), Arg.Any <TimeSpan>());
        }
        public void StartScrobble(TraktPluginSettings settings, MediaItem mediaItem, ITraktClient traktClient, ITraktNotification notification)
        {
            // Arrange
            IMediaPortalServices mediaPortalServices = Substitute.For <IMediaPortalServices>();

            mediaPortalServices.GetTraktUserHomePath().Returns(DataPath);
            SetSettings(mediaPortalServices, settings);
            SetPlayerAndContentDirForMovie(mediaPortalServices, mediaItem);

            IAsynchronousMessageQueue messageQueue = GetMockedMsgQueue(mediaPortalServices);

            IFileOperations fileOperations = Substitute.For <IFileOperations>();

            fileOperations.FileExists(Path.Combine(DataPath, FileName.Authorization.Value)).Returns(true);

            TraktScrobbleHandlerManager      traktScrobbleHandler = new TraktScrobbleHandlerManager(mediaPortalServices, traktClient, fileOperations);
            TraktScrobbleStartedNotification expectedNotification = (TraktScrobbleStartedNotification)notification;

            // Act
            // start the player
            messageQueue.MessageReceivedProxy += Raise.Event <MessageReceivedHandler>(new AsynchronousMessageQueue(new object(), new[] { "PlayerManager" }),
                                                                                      GetSystemMessageForMessageType(PlayerManagerMessaging.MessageType.PlayerStarted));

            // Assert
            mediaPortalServices.GetTraktNotificationModel().Received()
            .ShowNotification(Arg.Is <TraktScrobbleStartedNotification>(x => x.IsSuccess == expectedNotification.IsSuccess &&
                                                                        x.Message == expectedNotification.Message &&
                                                                        x.ActionType == expectedNotification.ActionType &&
                                                                        x.Progress == expectedNotification.Progress &&
                                                                        x.SuperLayerScreenName == expectedNotification.SuperLayerScreenName),
                              Arg.Any <TimeSpan>());
        }
예제 #4
0
 private void SetFileOperationsForFile(IFileOperations fileOperations, string path, string fileName)
 {
     fileOperations.FileExists(Arg.Is <string>(x => x.Equals(Path.Combine(path, fileName))))
     .Returns(true);
     fileOperations.FileReadAllText(Arg.Is <string>(x => x.Equals(Path.Combine(path, fileName))))
     .Returns(File.ReadAllText(TestUtility.GetTestDataPath(Path.Combine(@"Cache\", fileName)), Encoding.UTF8));
 }
        public void EnableTraktScrobbleHandlerWhenUserChanged()
        {
            // Arrange
            IMediaPortalServices mediaPortalServices = Substitute.For <IMediaPortalServices>();

            mediaPortalServices.GetTraktUserHomePath().Returns(DataPath);
            TraktPluginSettings settings = new TraktPluginSettings
            {
                IsScrobbleEnabled = false
            };
            ITraktSettingsChangeWatcher settingsChangeWatcher = Substitute.For <ITraktSettingsChangeWatcher>();

            settingsChangeWatcher.TraktSettings.Returns(settings);
            mediaPortalServices.GetTraktSettingsWatcher().Returns(settingsChangeWatcher);

            IUserMessageHandler userMessageHandler = Substitute.For <IUserMessageHandler>();

            mediaPortalServices.GetUserMessageHandler().Returns(userMessageHandler);

            ITraktClient    traktClient    = Substitute.For <ITraktClient>();
            IFileOperations fileOperations = Substitute.For <IFileOperations>();

            fileOperations.FileExists(Path.Combine(DataPath, FileName.Authorization.Value)).Returns(true);

            TraktScrobbleHandlerManager traktScrobbleHandler = new TraktScrobbleHandlerManager(mediaPortalServices, traktClient, fileOperations);

            // Act
            settings.IsScrobbleEnabled           = true;
            userMessageHandler.UserChangedProxy += Raise.Event();

            // Assert
            Assert.True(traktScrobbleHandler.IsActive);
        }
예제 #6
0
        public void EnterModelContext(NavigationContext oldContext, NavigationContext newContext)
        {
            // clear the PIN code text box, necessary when entering the plugin
            PinCode = string.Empty;

            string authFilePath        = Path.Combine(_mediaPortalServices.GetTraktUserHomePath(), FileName.Authorization.Value);
            bool   savedAuthFileExists = _fileOperations.FileExists(authFilePath);

            if (!savedAuthFileExists)
            {
                TestStatus       = "[Trakt.NotAuthorized]";
                IsUserAuthorized = false;
            }
            else
            {
                string savedAuthorization         = _fileOperations.FileReadAllText(authFilePath);
                ITraktAuthorization savedAuthFile = TraktSerializationService.DeserializeAsync <ITraktAuthorization>(savedAuthorization).Result;
                if (savedAuthFile.IsRefreshPossible)
                {
                    TestStatus       = "[Trakt.AlreadyAuthorized]";
                    IsUserAuthorized = true;
                }
                else
                {
                    TestStatus       = "[Trakt.SavedAuthIsNotValid]";
                    IsUserAuthorized = false;
                }
            }
        }
예제 #7
0
        public void ShouldEnableTraktSyncHandlerWhenSettingsChange()
        {
            // Arrange
            IMediaPortalServices mediaPortalServices = Substitute.For <IMediaPortalServices>();

            mediaPortalServices.GetTraktUserHomePath().Returns(DataPath);
            TraktPluginSettings settings = new TraktPluginSettings
            {
                IsAutomaticLibrarySyncEnabled = false
            };
            ITraktSettingsChangeWatcher settingsChangeWatcher = Substitute.For <ITraktSettingsChangeWatcher>();

            settingsChangeWatcher.TraktSettings.Returns(settings);
            mediaPortalServices.GetTraktSettingsWatcher().Returns(settingsChangeWatcher);

            ISettingsManager settingsManager = Substitute.For <ISettingsManager>();

            settingsManager.Load <TraktPluginSettings>().Returns(settings);
            mediaPortalServices.GetSettingsManager().Returns(settingsManager);

            ILibrarySynchronization librarySynchronization = Substitute.For <ILibrarySynchronization>();
            IFileOperations         fileOperations         = Substitute.For <IFileOperations>();

            fileOperations.FileExists(Path.Combine(DataPath, FileName.Authorization.Value)).Returns(true);

            TraktSyncHandlerManager traktSyncHandler = new TraktSyncHandlerManager(mediaPortalServices, librarySynchronization, fileOperations);

            // Act
            settings.IsAutomaticLibrarySyncEnabled      = true;
            settingsChangeWatcher.TraktSettingsChanged += Raise.Event();

            // Assert
            Assert.True(traktSyncHandler.IsActive);
        }
예제 #8
0
        private IList <MediaLibraryEpisode> ReadSavedWatchedEpisodes(string path)
        {
            IList <MediaLibraryEpisode> watchedEpisodes;

            string watchedEpisodesPath = Path.Combine(path, FileName.WatchedEpisodes.Value);

            if (_fileOperations.FileExists(watchedEpisodesPath))
            {
                string watchedEpisodesJson = _fileOperations.FileReadAllText(watchedEpisodesPath);
                watchedEpisodes = JsonConvert.DeserializeObject <List <MediaLibraryEpisode> >(watchedEpisodesJson);
            }
            else
            {
                throw new PathNotFoundException("Watched series path not found.");
            }

            return(watchedEpisodes);
        }
        private static Instellingen LoadFromXmlFile(IFileOperations fileManager, string instellingenFile, string maskFile)
        {
            Instellingen instellingen;

            if (!fileManager.FileExists(instellingenFile))
                return null;

            var serializer = new XmlSerializer(typeof(Instellingen));
            var settings = new XmlReaderSettings();

            using (var textReader = new StreamReader(fileManager.FileReadStream(instellingenFile)))
            {
                using (var xmlReader = XmlReader.Create(textReader, settings))
                {
                    instellingen = serializer.Deserialize(xmlReader) as Instellingen;
                }
            }
            if (instellingen == null)
                return null;

            if (!fileManager.FileExists(maskFile))
                return instellingen;

            using (var maskStream = fileManager.FileReadStream(maskFile))
            {
                var xdoc = new XmlDocument();
                xdoc.Load(maskStream);
                var root = xdoc.DocumentElement;

                if (root == null)
                    return instellingen;
                var masklist = root.GetElementsByTagName("Mask");
                foreach (XmlNode mask in masklist)
                {
                    var nameNode = mask.SelectSingleNode("Name");
                    var realnameNode = mask.SelectSingleNode("RealName");
                    if (nameNode != null && realnameNode != null)
                        instellingen.AddMask(new Mapmask(nameNode.InnerText, realnameNode.InnerText));
                }
            }

            return instellingen;
        }
예제 #10
0
        public void Should_ThrowPathNotFoundException_When_WatchedEpisodesFileNotFound()
        {
            // Arrange
            IMediaPortalServices mediaPortalServices = Substitute.For <IMediaPortalServices>();

            string          savedEpisodesPath = Path.Combine(FakePath, FileName.WatchedEpisodes.Value);
            IFileOperations fileOperations    = Substitute.For <IFileOperations>();

            fileOperations.FileExists(savedEpisodesPath).Returns(false);
            IMoverOperations operations = new MoverOperations(mediaPortalServices, fileOperations);

            // Act & Assert
            Assert.Throws <PathNotFoundException>(() => operations.RestoreWatchedSeries(FakePath));
        }
예제 #11
0
        public void Should_MarkFourEpisodesAsWatched_When_FourEpisodesRestored()
        {
            // Arrange
            IMediaPortalServices mediaPortalServices = Substitute.For <IMediaPortalServices>();
            IContentDirectory    contentDirectory    = Substitute.For <IContentDirectory>();
            IList <MediaItem>    databaseMediaItems  = new List <MediaItem>
            {
                new MockedDatabaseEpisode("272127", 1, new List <int> {
                    7, 8
                }, 0).Episode,
                new MockedDatabaseEpisode("317653", 1, new List <int> {
                    1
                }, 0).Episode,
                new MockedDatabaseEpisode("317653", 1, new List <int> {
                    2
                }, 0).Episode,
                new MockedDatabaseEpisode("275271", 2, new List <int> {
                    11, 12
                }, 0).Episode
            };

            contentDirectory.SearchAsync(Arg.Any <MediaItemQuery>(), true, null, false).Returns(databaseMediaItems);
            mediaPortalServices.GetServerConnectionManager().ContentDirectory.Returns(contentDirectory);
            mediaPortalServices.MarkAsWatched(Arg.Any <MediaItem>()).Returns(true);

            string          savedEpisodesPath = Path.Combine(FakePath, FileName.WatchedEpisodes.Value);
            IFileOperations fileOperations    = Substitute.For <IFileOperations>();

            fileOperations.FileExists(savedEpisodesPath).Returns(true);
            string watchedEpisodesJson =
                "[{\"show_imdb\":\"tt6682754\",\"show_tvdb\":317653,\"show_title\":\"Je-an-Claude Van Johnson\",\"season\":1,\"number\":1}," +
                "{\"show_imdb\":\"tt3155320\",\"show_tvdb\":272127,\"show_title\":\"Extant\",\"season\":1,\"number\":7}," +
                "{\"show_imdb\":\"tt3155320\",\"show_tvdb\":272127,\"show_title\":\"Extant\",\"season\":1,\"number\":8}," +
                "{\"show_imdb\":\"tt6682754\",\"show_tvdb\":317653,\"show_title\":\"Jean-Claude Van Johnson\",\"season\":1,\"number\":2}]";

            fileOperations.FileReadAllText(savedEpisodesPath).Returns(watchedEpisodesJson);

            IMoverOperations operations = new MoverOperations(mediaPortalServices, fileOperations);

            // Act
            RestoreResult result = operations.RestoreWatchedSeries(FakePath);

            // Assert
            Assert.Equal(4, result.MarkedWatchedCount);
            Assert.Equal(4, result.SavedWatchedCount);
        }
예제 #12
0
        private void ConfigureHandler()
        {
            string authorizationFilePath = Path.Combine(_mediaPortalServices.GetTraktUserHomePath(), FileName.Authorization.Value);
            bool   isUserAuthorized      = _fileOperations.FileExists(authorizationFilePath);
            bool   isScrobbleEnabled     = _mediaPortalServices.GetTraktSettingsWatcher().TraktSettings.IsScrobbleEnabled;

            if (isUserAuthorized && isScrobbleEnabled)
            {
                SubscribeToMessages();
                IsActive = true;
                _mediaPortalServices.GetLogger().Info("Trakt: enabled trakt scrobble handler.");
            }
            else
            {
                UnsubscribeFromMessages();
                IsActive = false;
                _mediaPortalServices.GetLogger().Info("Trakt: disabled trakt scrobble handler.");
            }
        }
예제 #13
0
        public void Should_MarkOneMovieAsWatched_When_OneMovieRestored()
        {
            // Arrange
            IMediaPortalServices mediaPortalServices = Substitute.For <IMediaPortalServices>();
            IContentDirectory    contentDirectory    = Substitute.For <IContentDirectory>();
            IList <MediaItem>    databaseMediaItems  = new List <MediaItem>
            {
                new MockedDatabaseMovie(new MediaLibraryMovie {
                    Imdb = "tt0268380", Title = "Ice Age", Tmdb = null, Year = 2002
                }, 0).Movie,
                new MockedDatabaseMovie(new MediaLibraryMovie {
                    Imdb = "tt0457939", Title = "Title_2", Tmdb = null, Year = 2016
                }, 0).Movie,
                new MockedDatabaseMovie(new MediaLibraryMovie {
                    Imdb = "tt1355630", Title = "Title_3", Tmdb = null, Year = 2013
                }, 0).Movie
            };

            contentDirectory.SearchAsync(Arg.Any <MediaItemQuery>(), true, null, false).Returns(databaseMediaItems);
            mediaPortalServices.GetServerConnectionManager().ContentDirectory.Returns(contentDirectory);
            mediaPortalServices.MarkAsWatched(Arg.Any <MediaItem>()).Returns(true);

            string          savedMoviesPath = Path.Combine(FakePath, FileName.WatchedMovies.Value);
            IFileOperations fileOperations  = Substitute.For <IFileOperations>();

            fileOperations.FileExists(savedMoviesPath).Returns(true);
            string watchedMoviesJson =
                "[{\"imdb\":\"tt0268380\",\"tmdb\":null,\"title\":\"Ice Age\",\"year\":2002}]";

            fileOperations.FileReadAllText(savedMoviesPath).Returns(watchedMoviesJson);

            IMoverOperations operations = new MoverOperations(mediaPortalServices, fileOperations);

            // Act
            RestoreResult result = operations.RestoreWatchedMovies(FakePath);

            // Assert
            Assert.Equal(1, result.MarkedWatchedCount);
            Assert.Equal(1, result.SavedWatchedCount);
        }
        private static Instellingen LoadFromJsonFile(IFileOperations fileManager, string instellingenFile, string maskFile)
        {
            try {
                SaveInstellingen saveInstellingen;

                if (!fileManager.FileExists(instellingenFile))
                {
                    return(null);
                }

                using (var file = new StreamReader(fileManager.FileReadStream(instellingenFile)))
                {
                    var serializer = new JsonSerializer();
                    saveInstellingen = (SaveInstellingen)serializer.Deserialize(file, typeof(SaveInstellingen));
                }
                if (saveInstellingen == null)
                {
                    return(null);
                }
                var instellingen = new Instellingen()
                {
                    DatabasePad                       = saveInstellingen.DatabasePad ?? Instellingen.Default.DatabasePad,
                    BijbelPad                         = saveInstellingen.BijbelPad ?? Instellingen.Default.BijbelPad,
                    TemplateTheme                     = saveInstellingen.TemplateTheme ?? Instellingen.Default.TemplateTheme,
                    TemplateLied                      = saveInstellingen.TemplateLied ?? Instellingen.Default.TemplateLied,
                    TemplateBijbeltekst               = saveInstellingen.TemplateBijbeltekst ?? Instellingen.Default.TemplateBijbeltekst,
                    TekstChar_a_OnARow                = saveInstellingen.TekstChar_a_OnARow ?? Instellingen.Default.TekstChar_a_OnARow,
                    TekstFontName                     = saveInstellingen.TekstFontName ?? Instellingen.Default.TekstFontName,
                    TekstFontPointSize                = saveInstellingen.TekstFontPointSize ?? Instellingen.Default.TekstFontPointSize,
                    RegelsPerLiedSlide                = saveInstellingen.RegelsPerLiedSlide ?? Instellingen.Default.RegelsPerLiedSlide,
                    RegelsPerBijbeltekstSlide         = saveInstellingen.RegelsPerBijbeltekstSlide ?? Instellingen.Default.RegelsPerBijbeltekstSlide,
                    Een2eCollecte                     = saveInstellingen.Een2eCollecte ?? Instellingen.Default.Een2eCollecte,
                    DeTekstVraag                      = saveInstellingen.DeTekstVraag ?? Instellingen.Default.DeTekstVraag,
                    DeLezenVraag                      = saveInstellingen.DeLezenVraag ?? Instellingen.Default.DeLezenVraag,
                    GebruikDisplayNameVoorZoeken      = saveInstellingen.GebruikDisplayNameVoorZoeken ?? Instellingen.Default.GebruikDisplayNameVoorZoeken,
                    ToonBijbeltekstenInLiturgie       = saveInstellingen.ToonBijbeltekstenInLiturgie ?? Instellingen.Default.ToonBijbeltekstenInLiturgie,
                    ToonGeenVersenBijVolledigeContent = saveInstellingen.ToonGeenVersenBijVolledigeContent ?? Instellingen.Default.ToonGeenVersenBijVolledigeContent,
                    StandaardTeksten                  = saveInstellingen.StandaardTeksten ?? Instellingen.Default.StandaardTeksten,
                    VersOnderbrekingOverSlidesHeen    = saveInstellingen.VersOnderbrekingOverSlidesHeen ?? Instellingen.Default.VersOnderbrekingOverSlidesHeen,
                    ToonAlsLiedOnderbrokenWordt       = saveInstellingen.ToonAlsLiedOnderbrokenWordt ?? Instellingen.Default.ToonAlsLiedOnderbrokenWordt,
                };

                if (!fileManager.FileExists(maskFile))
                {
                    return(instellingen);
                }

                using (var file = new StreamReader(fileManager.FileReadStream(maskFile)))
                {
                    var serializer = new JsonSerializer();
                    foreach (var mask in (SaveMask[])serializer.Deserialize(file, typeof(SaveMask[])))
                    {
                        instellingen.AddMask(new Mapmask(mask.Name, mask.RealName));
                    }
                }

                return(instellingen);
            }
            catch (Exception exc)
            {
                FoutmeldingSchrijver.Log(exc);
            }
            return(null);
        }
예제 #15
0
        private bool IsCacheInitialized(string file)
        {
            string filePath = Path.Combine(_mediaPortalServices.GetTraktUserHomePath(), file);

            return(_fileOperations.FileExists(filePath));
        }
        private static bool WriteToJsonFile(IFileOperations fileManager, string instellingenFile, string maskFile, Instellingen instellingen)
        {
            try
            {
                // verwijder oude bestand (zelfde effect als overschreven worden)
                if (fileManager.FileExists(instellingenFile))
                {
                    fileManager.Delete(instellingenFile);
                }

                var saveInstellingen = new SaveInstellingen()
                {
                    DatabasePad                       = instellingen.DatabasePad,
                    BijbelPad                         = instellingen.BijbelPad,
                    TemplateTheme                     = instellingen.TemplateTheme,
                    TemplateLied                      = instellingen.TemplateLied,
                    TemplateBijbeltekst               = instellingen.TemplateBijbeltekst,
                    TekstChar_a_OnARow                = instellingen.TekstChar_a_OnARow,
                    TekstFontName                     = instellingen.TekstFontName,
                    TekstFontPointSize                = instellingen.TekstFontPointSize,
                    RegelsPerLiedSlide                = instellingen.RegelsPerLiedSlide,
                    RegelsPerBijbeltekstSlide         = instellingen.RegelsPerBijbeltekstSlide,
                    Een2eCollecte                     = instellingen.Een2eCollecte,
                    DeTekstVraag                      = instellingen.DeTekstVraag,
                    DeLezenVraag                      = instellingen.DeLezenVraag,
                    GebruikDisplayNameVoorZoeken      = instellingen.GebruikDisplayNameVoorZoeken,
                    ToonBijbeltekstenInLiturgie       = instellingen.ToonBijbeltekstenInLiturgie,
                    StandaardTeksten                  = instellingen.StandaardTeksten,
                    ToonGeenVersenBijVolledigeContent = instellingen.ToonGeenVersenBijVolledigeContent,
                    VersOnderbrekingOverSlidesHeen    = instellingen.VersOnderbrekingOverSlidesHeen,
                    ToonAlsLiedOnderbrokenWordt       = instellingen.ToonAlsLiedOnderbrokenWordt
                };

                //schrijf instellingen weg
                using (var sw = new StreamWriter(fileManager.FileWriteStream(instellingenFile)))
                {
                    var serializer = new JsonSerializer();
                    serializer.Serialize(sw, saveInstellingen);
                    sw.Flush();
                }

                var saveMasks = instellingen.Masks.Select(m => new SaveMask()
                {
                    Name = m.Name, RealName = m.RealName
                }).ToArray();

                //schrijf Masks weg
                using (var sw = new StreamWriter(fileManager.FileWriteStream(maskFile)))
                {
                    var serializer = new JsonSerializer();
                    serializer.Serialize(sw, saveMasks);
                    sw.Flush();
                }

                return(true);
            }
            catch (PathTooLongException)
            {
                return(false);
            }
        }
        private static bool WriteToXmlFile(IFileOperations fileManager, string instellingenFile, string maskFile, Instellingen instellingen)
        {
            try
            {
                // verwijder oude bestand (zelfde effect als overschreven worden)
                if (fileManager.FileExists(instellingenFile))
                    fileManager.Delete(instellingenFile);

                //schrijf instellingen weg
                var serializer = new XmlSerializer(typeof(Instellingen));
                using (var sw = new StreamWriter(fileManager.FileWriteStream(instellingenFile)))
                {
                    serializer.Serialize(sw, instellingen);
                    sw.Flush();
                }

                //schrijf Masks weg
                using (var xw = XmlWriter.Create(maskFile, new XmlWriterSettings() { Indent = true }))
                {
                    xw.WriteStartDocument();
                    xw.WriteStartElement("Masks");
                    foreach (var mask in instellingen.Masks)
                    {
                        xw.WriteStartElement("Mask");
                        xw.WriteStartElement("Name");
                        xw.WriteString(mask.Name);
                        xw.WriteEndElement();
                        xw.WriteStartElement("RealName");
                        xw.WriteString(mask.RealName);
                        xw.WriteEndElement();
                        xw.WriteEndElement();
                    }
                    xw.WriteEndElement();
                    xw.WriteEndDocument();

                    xw.Flush();
                }

                return true;
            }
            catch (PathTooLongException)
            {
                return false;
            }
        }