/// <summary>
        /// We keep reader tool settings for each language in %localappdata%/SIL/Bloom.
        /// e.g., for language kaj, we would expect to find
        /// ReaderToolsSettings-kaj.json
        /// ReaderToolsWords-kaj.json
        /// and possibly a folder with allowed words lists for stages:
        /// Allowed Words-kaj.
        /// A typical reader tools BloomPack only has one of each, but we allow for the possibility of more.
        /// </summary>
        /// <param name="newlyAddedFolderOfThePack"></param>
        internal static void CopyReaderToolsSettingsToWhereTheyBelong(string newlyAddedFolderOfThePack)
        {
            var destFolder = ProjectContext.GetBloomAppDataFolder();

            foreach (var readerSettingsFile in Directory.GetFiles(newlyAddedFolderOfThePack, ReaderToolsSettingsPrefix + "*.json")
                     .Concat(Directory.GetFiles(newlyAddedFolderOfThePack, "ReaderToolsWords-*.json")))
            {
                try
                {
                    var readerSettingsFileName = Path.GetFileName(readerSettingsFile);
                    RobustFile.Copy(readerSettingsFile, Path.Combine(destFolder, readerSettingsFileName), true);
                    if (readerSettingsFileName.StartsWith(ReaderToolsSettingsPrefix))
                    {
                        var langCode =
                            Path.GetFileNameWithoutExtension(readerSettingsFileName.Substring(ReaderToolsSettingsPrefix.Length));

                        var allowedWordsSource = Path.Combine(newlyAddedFolderOfThePack, AllowedWordsFolderName);
                        var allowedWordsDest   = Path.Combine(destFolder, AllowedWordsFolderName + "-" + langCode);
                        CopyAllowedWords(allowedWordsSource, allowedWordsDest);
                    }
                }
                catch (IOException e)
                {
                    ProblemReportApi.ShowProblemDialog(null, e,
                                                       "Problem copying Reader Tools Settings from an installed BloomPack.", "nonfatal");
                }
            }
        }
Beispiel #2
0
        private string GetSampleTextsList(string settingsFilePath)
        {
            var path = Path.Combine(Path.GetDirectoryName(settingsFilePath), "Sample Texts");

            if (!Directory.Exists(path))
            {
                Directory.CreateDirectory(path);
            }

            var fileList1    = new List <string>();
            var langFileName = String.Format(DecodableReaderToolSettings.kSynphonyLanguageDataFileNameFormat,
                                             CurrentBook.BookData.Language1.Iso639Code);
            var langFile = Path.Combine(path, langFileName);

            // if the Sample Texts directory is empty, check for ReaderToolsWords-<iso>.json in ProjectContext.GetBloomAppDataFolder()
            if (DirectoryHelper.IsEmpty(path, true))
            {
                var bloomAppDirInfo = new DirectoryInfo(ProjectContext.GetBloomAppDataFolder());

                // get the most recent file
                var foundFile = bloomAppDirInfo.GetFiles(langFileName, SearchOption.AllDirectories).OrderByDescending(fi => fi.LastWriteTime).FirstOrDefault();

                if (foundFile != null)
                {
                    // copy it
                    RobustFile.Copy(Path.Combine(foundFile.DirectoryName, foundFile.Name), langFile);
                }

                return(String.Empty);
            }

            // first look for ReaderToolsWords-<iso>.json
            if (RobustFile.Exists(langFile))
            {
                fileList1.Add(langFile);
            }

            // next look for <language_name>_lang_data.js
            foreach (var file in Directory.GetFiles(path, "*" + kSynphonyFileNameSuffix))
            {
                if (!fileList1.Contains(file))
                {
                    fileList1.Add(file);
                }
            }

            // now add the rest
            foreach (var file in Directory.GetFiles(path))
            {
                if (!fileList1.Contains(file))
                {
                    fileList1.Add(file);
                }
            }

            return(String.Join("\r", fileList1.ToArray()));
        }
        /// <summary>
        /// If the collection has no reader tools at all, or if ones that came with the program are newer,
        /// copy the ones that came with the program.
        /// This is language-dependent, we'll typically only overwrite settings for an English collection.
        /// </summary>
        /// <param name="settings"></param>
        public static void CopyRelevantNewReaderSettings(CollectionSettings settings)
        {
            var readerToolsPath = GetReaderToolsSettingsFilePath(settings);
            var bloomFolder     = ProjectContext.GetBloomAppDataFolder();
            var newReaderTools  = Path.Combine(bloomFolder, Path.GetFileName(readerToolsPath));

            if (!RobustFile.Exists(newReaderTools))
            {
                return;
            }
            if (RobustFile.Exists(readerToolsPath) && RobustFile.GetLastWriteTime(readerToolsPath) > RobustFile.GetLastWriteTime(newReaderTools))
            {
                return;                 // don't overwrite newer existing settings?
            }
            RobustFile.Copy(newReaderTools, readerToolsPath, true);
        }
        internal static void CopyReaderToolsSettingsToWhereTheyBelong(string newlyAddedFolderOfThePack)
        {
            var destFolder = ProjectContext.GetBloomAppDataFolder();

            foreach (var readerSettingsFile in Directory.GetFiles(newlyAddedFolderOfThePack, ReaderToolsSettingsPrefix + "*.json")
                     .Concat(Directory.GetFiles(newlyAddedFolderOfThePack, "ReaderToolsWords-*.json")))
            {
                try
                {
                    RobustFile.Copy(readerSettingsFile, Path.Combine(destFolder, Path.GetFileName(readerSettingsFile)), true);
                }
                catch (IOException e)
                {
                    // If we can't do it, we can't. Don't worry about it in production.
#if DEBUG
                    Debug.Fail("Some file error copying reader settings");
#endif
                }
            }
        }
        /// <summary>
        /// If the collection has no reader tools at all, or if ones that came with the program are newer,
        /// copy the ones that came with the program.
        /// This is language-dependent, we'll typically only overwrite settings for an English collection.
        /// Or, if the language came as a bloompack, we may copy updated settings for a newer bloompack.
        /// Basically this copies the same set of files as CopyReaderToolsSettingsToWhereTheyBelong creates
        /// into the book's own folder.
        /// </summary>
        public static void CopyRelevantNewReaderSettings(CollectionSettings settings)
        {
            var readerToolsPath        = GetReaderToolsSettingsFilePath(settings);
            var bloomFolder            = ProjectContext.GetBloomAppDataFolder();
            var readerSettingsFileName = Path.GetFileName(readerToolsPath);
            var newReaderTools         = Path.Combine(bloomFolder, readerSettingsFileName);

            if (!RobustFile.Exists(newReaderTools))
            {
                return;
            }
            if (RobustFile.Exists(readerToolsPath) && RobustFile.GetLastWriteTime(readerToolsPath) > RobustFile.GetLastWriteTime(newReaderTools))
            {
                return;                 // don't overwrite newer existing settings?
            }
            RobustFile.Copy(newReaderTools, readerToolsPath, true);
            // If the settings file is being updated, we should update the corresponding allowed words, if any.
            var langCode = Path.GetFileNameWithoutExtension(readerSettingsFileName.Substring(ReaderToolsSettingsPrefix.Length));

            CopyAllowedWords(Path.Combine(bloomFolder, AllowedWordsFolderName + "-" + langCode), Path.Combine(Path.GetDirectoryName(readerToolsPath), AllowedWordsFolderName));
        }