Exemplo n.º 1
0
        private Tuple <CultureInfo, String> LoadDictionaryImpl(string lexiconFilePath)
        {
            if (_isDisposed)
            {
                return(new Tuple <CultureInfo, string>(null, null));
            }

            try
            {
                new FileIOPermission(FileIOPermissionAccess.Read, lexiconFilePath).Demand();
            }
            catch (SecurityException se)
            {
                throw new ArgumentException(SR.Get(SRID.CustomDictionaryFailedToLoadDictionaryUri, lexiconFilePath), se);
            }

            if (!File.Exists(lexiconFilePath))
            {
                throw new ArgumentException(SR.Get(SRID.CustomDictionaryFailedToLoadDictionaryUri, lexiconFilePath));
            }

            bool   fileCopied             = false;
            string lexiconPrivateCopyPath = null;

            try
            {
                CultureInfo culture = null;

                // Read the first line of the file and detect culture, if specified
                using (FileStream stream = new FileStream(lexiconFilePath, FileMode.Open, FileAccess.Read))
                {
                    string line = null;
                    using (StreamReader reader = new StreamReader(stream))
                    {
                        line    = reader.ReadLine();
                        culture = WinRTSpellerInterop.TryParseLexiconCulture(line);
                    }
                }

                // Make a temp file and copy the original file over.
                // Ensure that the copy has Unicode (UTF16-LE) encoding
                lexiconPrivateCopyPath = WinRTSpellerInterop.GetTempFileName(extension: "dic");

                new FileIOPermission(FileIOPermissionAccess.Read | FileIOPermissionAccess.Write, lexiconPrivateCopyPath).Assert();
                try
                {
                    WinRTSpellerInterop.CopyToUnicodeFile(lexiconFilePath, lexiconPrivateCopyPath);
                    fileCopied = true;
                }
                finally
                {
                    CodeAccessPermission.RevertAssert();
                }

                // Add the temp file (with .dic extension) just created to a cache,
                // then pass it along to IUserDictionariesRegistrar

                _customDictionaryFilesLock.WaitOne();
                try
                {
                    if (!_customDictionaryFiles.ContainsKey(culture))
                    {
                        _customDictionaryFiles[culture] = new List <string>();
                    }

                    _customDictionaryFiles[culture].Add(lexiconPrivateCopyPath);
                }
                finally
                {
                    _customDictionaryFilesLock.Release();
                }

                SpellCheckerFactory.RegisterUserDictionary(lexiconPrivateCopyPath, culture.IetfLanguageTag);

                return(new Tuple <CultureInfo, string>(culture, lexiconPrivateCopyPath));
            }
            catch (Exception e) when((e is SecurityException) || (e is ArgumentException) || !fileCopied)
            {
                // IUserDictionariesRegistrar.RegisterUserDictionary can
                // throw ArgumentException on failure. Cleanup the temp file if
                // we successfully created one.
                if (lexiconPrivateCopyPath != null)
                {
                    File.Delete(lexiconPrivateCopyPath);
                }

                throw new ArgumentException(SR.Get(SRID.CustomDictionaryFailedToLoadDictionaryUri, lexiconFilePath), e);
            }
        }
        /// <summary>
        ///     Actual implementation of loading a dictionary
        /// </summary>
        /// <param name="lexiconFilePath"></param>
        /// <param name="dictionaryLoadedCallback"></param>
        /// <param name="callbackParam"></param>
        /// <returns>
        ///     A tuple of cultureinfo detected from <paramref name="lexiconFilePath"/> and
        ///     a temp file path which holds a copy of <paramref name="lexiconFilePath"/>
        ///
        ///     If no culture is specified in the first line of <paramref name="lexiconFilePath"/>
        ///     in the format #LID nnnn (where nnnn = decimal LCID of the culture), then invariant
        ///     culture is returned.
        /// </returns>
        /// <remarks>
        ///     At the end of this method, we guarantee that <paramref name="lexiconFilePath"/>
        ///     can be reclaimed (i.e., potentially deleted) by the caller.
        /// </remarks>
        private Tuple<string, string> LoadDictionaryImpl(string lexiconFilePath)
        {
            if (_isDisposed)
            {
                return new Tuple<string, string>(null, null);
            }

            if (!File.Exists(lexiconFilePath))
            {
                throw new ArgumentException(SR.Get(SRID.CustomDictionaryFailedToLoadDictionaryUri, lexiconFilePath));
            }

            bool fileCopied = false;
            string lexiconPrivateCopyPath = null;

            try
            {
                CultureInfo culture = null;

                // Read the first line of the file and detect culture, if specified
                using (FileStream stream = new FileStream(lexiconFilePath, FileMode.Open, FileAccess.Read))
                {
                    string line = null;
                    using (StreamReader reader = new StreamReader(stream))
                    {
                        line = reader.ReadLine();
                        culture = WinRTSpellerInterop.TryParseLexiconCulture(line);
                    }
                }

                string ietfLanguageTag = culture.IetfLanguageTag;

                // Make a temp file and copy the original file over.
                // Ensure that the copy has Unicode (UTF16-LE) encoding
                using (FileStream lexiconPrivateCopyStream = FileHelper.CreateAndOpenTemporaryFile(out lexiconPrivateCopyPath, extension: "dic"))
                {
                    WinRTSpellerInterop.CopyToUnicodeFile(lexiconFilePath, lexiconPrivateCopyStream);
                    fileCopied = true;
                }

                // Add the temp file (with .dic extension) just created to a cache,
                // then pass it along to IUserDictionariesRegistrar

                if (!_customDictionaryFiles.ContainsKey(ietfLanguageTag))
                {
                    _customDictionaryFiles[ietfLanguageTag] = new List<string>();
                }

                _customDictionaryFiles[ietfLanguageTag].Add(lexiconPrivateCopyPath);

                using (new SpellerCOMActionTraceLogger(this, SpellerCOMActionTraceLogger.Actions.RegisterUserDictionary))
                {
                    SpellCheckerFactory.RegisterUserDictionary(lexiconPrivateCopyPath, ietfLanguageTag);
                }

                return new Tuple<string, string>(ietfLanguageTag, lexiconPrivateCopyPath);
            }
            catch (Exception e) when ((e is ArgumentException) || !fileCopied)
            {
                // IUserDictionariesRegistrar.RegisterUserDictionary can
                // throw ArgumentException on failure. Cleanup the temp file if
                // we successfully created one.
                if (lexiconPrivateCopyPath != null)
                {
                    FileHelper.DeleteTemporaryFile(lexiconPrivateCopyPath);
                }

                throw new ArgumentException(SR.Get(SRID.CustomDictionaryFailedToLoadDictionaryUri, lexiconFilePath), e);
            }
        }
        private Tuple <string, string> LoadDictionaryImpl(string lexiconFilePath)
        {
            if (this._isDisposed)
            {
                return(new Tuple <string, string>(null, null));
            }
            try
            {
                new FileIOPermission(FileIOPermissionAccess.Read, lexiconFilePath).Demand();
            }
            catch (SecurityException innerException)
            {
                throw new ArgumentException(SR.Get("CustomDictionaryFailedToLoadDictionaryUri", new object[]
                {
                    lexiconFilePath
                }), innerException);
            }
            if (!File.Exists(lexiconFilePath))
            {
                throw new ArgumentException(SR.Get("CustomDictionaryFailedToLoadDictionaryUri", new object[]
                {
                    lexiconFilePath
                }));
            }
            bool   flag = false;
            string text = null;
            Tuple <string, string> result;

            try
            {
                CultureInfo cultureInfo = null;
                using (FileStream fileStream = new FileStream(lexiconFilePath, FileMode.Open, FileAccess.Read))
                {
                    using (StreamReader streamReader = new StreamReader(fileStream))
                    {
                        string line = streamReader.ReadLine();
                        cultureInfo = WinRTSpellerInterop.TryParseLexiconCulture(line);
                    }
                }
                string ietfLanguageTag = cultureInfo.IetfLanguageTag;
                using (FileStream fileStream2 = FileHelper.CreateAndOpenTemporaryFile(out text, FileAccess.Write, FileOptions.None, "dic", "WPF"))
                {
                    WinRTSpellerInterop.CopyToUnicodeFile(lexiconFilePath, fileStream2);
                    flag = true;
                }
                if (!this._customDictionaryFiles.ContainsKey(ietfLanguageTag))
                {
                    this._customDictionaryFiles[ietfLanguageTag] = new List <string>();
                }
                this._customDictionaryFiles[ietfLanguageTag].Add(text);
                using (new SpellerCOMActionTraceLogger(this, SpellerCOMActionTraceLogger.Actions.RegisterUserDictionary))
                {
                    SpellCheckerFactory.RegisterUserDictionary(text, ietfLanguageTag, true);
                }
                result = new Tuple <string, string>(ietfLanguageTag, text);
            }
            catch (Exception ex) when(ex is SecurityException || ex is ArgumentException || !flag)
            {
                if (text != null)
                {
                    FileHelper.DeleteTemporaryFile(text);
                }
                throw new ArgumentException(SR.Get("CustomDictionaryFailedToLoadDictionaryUri", new object[]
                {
                    lexiconFilePath
                }), ex);
            }
            return(result);
        }