1 // Copyright (c) Microsoft. All rights reserved.
2 // Licensed under the MIT license. See LICENSE file in the project root for full license information.
7 using System.Collections;
8 using System.Collections.Generic;
10 [System.Runtime.InteropServices.ComVisible(true)]
11 public abstract class EncodingProvider
13 public EncodingProvider() { }
14 public abstract Encoding GetEncoding(string name);
15 public abstract Encoding GetEncoding(int codepage);
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 decoderFallback)
20 Encoding enc = GetEncoding(name);
23 enc = (Encoding)GetEncoding(name).Clone();
24 enc.EncoderFallback = encoderFallback;
25 enc.DecoderFallback = decoderFallback;
31 public virtual Encoding GetEncoding(int codepage, EncoderFallback encoderFallback, DecoderFallback decoderFallback)
33 Encoding enc = GetEncoding(codepage);
36 enc = (Encoding)GetEncoding(codepage).Clone();
37 enc.EncoderFallback = encoderFallback;
38 enc.DecoderFallback = decoderFallback;
44 internal static void AddProvider(EncodingProvider provider)
47 throw new ArgumentNullException("provider");
49 lock (s_InternalSyncObject)
51 if (s_providers == null)
53 s_providers = new EncodingProvider[1] { provider };
57 if (Array.IndexOf(s_providers, provider) >= 0)
62 var providers = new EncodingProvider[s_providers.Length + 1];
63 Array.Copy(s_providers, providers, s_providers.Length);
64 providers[providers.Length - 1] = provider;
65 s_providers = providers;
69 internal static Encoding GetEncodingFromProvider(int codepage)
71 if (s_providers == null)
74 var providers = s_providers;
75 foreach (EncodingProvider provider in providers)
77 Encoding enc = provider.GetEncoding(codepage);
85 internal static Encoding GetEncodingFromProvider(string encodingName)
87 if (s_providers == null)
90 var providers = s_providers;
91 foreach (EncodingProvider provider in providers)
93 Encoding enc = provider.GetEncoding(encodingName);
101 internal static Encoding GetEncodingFromProvider(int codepage, EncoderFallback enc, DecoderFallback dec)
103 if (s_providers == null)
106 var providers = s_providers;
107 foreach (EncodingProvider provider in providers)
109 Encoding encing = provider.GetEncoding(codepage, enc, dec);
117 internal static Encoding GetEncodingFromProvider(string encodingName, EncoderFallback enc, DecoderFallback dec)
119 if (s_providers == null)
122 var providers = s_providers;
123 foreach (EncodingProvider provider in providers)
125 Encoding encoding = provider.GetEncoding(encodingName, enc, dec);
126 if (encoding != null)
133 private static Object s_InternalSyncObject = new Object();
134 private static volatile EncodingProvider[] s_providers;