< Summary

Line coverage
13%
Covered lines: 9
Uncovered lines: 59
Coverable lines: 68
Total lines: 168
Line coverage: 13.2%
Branch coverage
6%
Covered branches: 3
Total branches: 44
Branch coverage: 6.8%
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Metrics

MethodBranch coverage Cyclomatic complexity NPath complexity Sequence coverage
.ctor()100%110%
GetEncoding(...)0%220%
GetEncoding(...)0%220%
GetEncodings()100%110%
AddProvider(...)0%880%
GetEncodingFromProvider(...)16.66%6637.5%
GetEncodingListFromProviders()0%880%
GetEncodingFromProvider(...)0%660%
GetEncodingFromProvider(...)16.66%6637.5%
GetEncodingFromProvider(...)16.66%6637.5%

File(s)

https://raw.githubusercontent.com/dotnet/runtime/811a7eabb75c42db53440e8ba3f60c07511cfd1f/src/libraries/System.Private.CoreLib/src/System/Text/EncodingProvider.cs

#LineLine coverage
 1// Licensed to the .NET Foundation under one or more agreements.
 2// The .NET Foundation licenses this file to you under the MIT license.
 3
 4using System.Collections.Generic;
 5using System.Threading;
 6
 7namespace System.Text
 8{
 9    public abstract class EncodingProvider
 10    {
 11        private static EncodingProvider[]? s_providers;
 12
 013        public EncodingProvider() { }
 14        public abstract Encoding? GetEncoding(string name);
 15        public abstract Encoding? GetEncoding(int codepage);
 16
 17        // GetEncoding should return either valid encoding or null. shouldn't throw any exception except on null name
 18        public virtual Encoding? GetEncoding(string name, EncoderFallback encoderFallback, DecoderFallback decoderFallba
 19        {
 020            Encoding? enc = GetEncoding(name);
 021            if (enc != null)
 22            {
 023                enc = (Encoding)enc.Clone();
 024                enc.EncoderFallback = encoderFallback;
 025                enc.DecoderFallback = decoderFallback;
 26            }
 27
 028            return enc;
 29        }
 30
 31        public virtual Encoding? GetEncoding(int codepage, EncoderFallback encoderFallback, DecoderFallback decoderFallb
 32        {
 033            Encoding? enc = GetEncoding(codepage);
 034            if (enc != null)
 35            {
 036                enc = (Encoding)enc.Clone();
 037                enc.EncoderFallback = encoderFallback;
 038                enc.DecoderFallback = decoderFallback;
 39            }
 40
 041            return enc;
 42        }
 43
 044        public virtual IEnumerable<EncodingInfo> GetEncodings() => [];
 45
 46        internal static void AddProvider(EncodingProvider provider)
 47        {
 048            ArgumentNullException.ThrowIfNull(provider);
 49
 50            // Few providers are added in a typical app (typically just CodePagesEncodingProvider.Instance), and when th
 51            // they're generally not added concurrently.  So use an optimistic concurrency scheme rather than paying for
 52            // object allocation on the startup path.
 53
 054            if (s_providers is null &&
 055                Interlocked.CompareExchange(ref s_providers, [provider], null) is null)
 56            {
 057                return;
 58            }
 59
 60            while (true)
 61            {
 062                EncodingProvider[] providers = s_providers;
 63
 064                if (Array.IndexOf(providers, provider) >= 0)
 65                {
 066                    return;
 67                }
 68
 069                var newProviders = new EncodingProvider[providers.Length + 1];
 070                Array.Copy(providers, newProviders, providers.Length);
 071                newProviders[^1] = provider;
 72
 073                if (Interlocked.CompareExchange(ref s_providers, newProviders, providers) == providers)
 74                {
 075                    return;
 76                }
 77            }
 78        }
 79
 80        internal static Encoding? GetEncodingFromProvider(int codepage)
 81        {
 382            EncodingProvider[]? providers = s_providers;
 383            if (providers == null)
 384                return null;
 85
 086            foreach (EncodingProvider provider in providers)
 87            {
 088                Encoding? enc = provider.GetEncoding(codepage);
 089                if (enc != null)
 090                    return enc;
 91            }
 92
 093            return null;
 94        }
 95
 96        internal static Dictionary<int, EncodingInfo>? GetEncodingListFromProviders()
 97        {
 098            EncodingProvider[]? providers = s_providers;
 099            if (providers == null)
 0100                return null;
 101
 0102            Dictionary<int, EncodingInfo> result = new Dictionary<int, EncodingInfo>();
 103
 0104            foreach (EncodingProvider provider in providers)
 105            {
 0106                IEnumerable<EncodingInfo>? encodingInfoList = provider.GetEncodings();
 0107                if (encodingInfoList != null)
 108                {
 0109                    foreach (EncodingInfo ei in encodingInfoList)
 110                    {
 0111                        result.TryAdd(ei.CodePage, ei);
 112                    }
 113                }
 114            }
 115
 0116            return result;
 117        }
 118
 119        internal static Encoding? GetEncodingFromProvider(string encodingName)
 120        {
 0121            EncodingProvider[]? providers = s_providers;
 0122            if (providers == null)
 0123                return null;
 124
 0125            foreach (EncodingProvider provider in providers)
 126            {
 0127                Encoding? enc = provider.GetEncoding(encodingName);
 0128                if (enc != null)
 0129                    return enc;
 130            }
 131
 0132            return null;
 133        }
 134
 135        internal static Encoding? GetEncodingFromProvider(int codepage, EncoderFallback enc, DecoderFallback dec)
 136        {
 1137            EncodingProvider[]? providers = s_providers;
 1138            if (providers == null)
 1139                return null;
 140
 0141            foreach (EncodingProvider provider in providers)
 142            {
 0143                Encoding? encoding = provider.GetEncoding(codepage, enc, dec);
 0144                if (encoding != null)
 0145                    return encoding;
 146            }
 147
 0148            return null;
 149        }
 150
 151        internal static Encoding? GetEncodingFromProvider(string encodingName, EncoderFallback enc, DecoderFallback dec)
 152        {
 1153            EncodingProvider[]? providers = s_providers;
 1154            if (providers == null)
 1155                return null;
 156
 0157            foreach (EncodingProvider provider in providers)
 158            {
 0159                Encoding? encoding = provider.GetEncoding(encodingName, enc, dec);
 0160                if (encoding != null)
 0161                    return encoding;
 162            }
 163
 0164            return null;
 165        }
 166    }
 167}
 168