EncodingProvider.cs 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136
  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. // See the LICENSE file in the project root for more information.
  4. using System;
  5. using System.Collections;
  6. using System.Collections.Generic;
  7. namespace System.Text
  8. {
  9. public abstract class EncodingProvider
  10. {
  11. public EncodingProvider() { }
  12. public abstract Encoding GetEncoding(string name);
  13. public abstract Encoding GetEncoding(int codepage);
  14. // GetEncoding should return either valid encoding or null. shouldn't throw any exception except on null name
  15. public virtual Encoding GetEncoding(string name, EncoderFallback encoderFallback, DecoderFallback decoderFallback)
  16. {
  17. Encoding enc = GetEncoding(name);
  18. if (enc != null)
  19. {
  20. enc = (Encoding)GetEncoding(name).Clone();
  21. enc.EncoderFallback = encoderFallback;
  22. enc.DecoderFallback = decoderFallback;
  23. }
  24. return enc;
  25. }
  26. public virtual Encoding GetEncoding(int codepage, EncoderFallback encoderFallback, DecoderFallback decoderFallback)
  27. {
  28. Encoding enc = GetEncoding(codepage);
  29. if (enc != null)
  30. {
  31. enc = (Encoding)GetEncoding(codepage).Clone();
  32. enc.EncoderFallback = encoderFallback;
  33. enc.DecoderFallback = decoderFallback;
  34. }
  35. return enc;
  36. }
  37. internal static void AddProvider(EncodingProvider provider)
  38. {
  39. if (provider == null)
  40. throw new ArgumentNullException(nameof(provider));
  41. lock (s_InternalSyncObject)
  42. {
  43. if (s_providers == null)
  44. {
  45. s_providers = new EncodingProvider[1] { provider };
  46. return;
  47. }
  48. if (Array.IndexOf(s_providers, provider) >= 0)
  49. {
  50. return;
  51. }
  52. EncodingProvider[] providers = new EncodingProvider[s_providers.Length + 1];
  53. Array.Copy(s_providers, providers, s_providers.Length);
  54. providers[providers.Length - 1] = provider;
  55. s_providers = providers;
  56. }
  57. }
  58. internal static Encoding GetEncodingFromProvider(int codepage)
  59. {
  60. if (s_providers == null)
  61. return null;
  62. EncodingProvider[] providers = s_providers;
  63. foreach (EncodingProvider provider in providers)
  64. {
  65. Encoding enc = provider.GetEncoding(codepage);
  66. if (enc != null)
  67. return enc;
  68. }
  69. return null;
  70. }
  71. internal static Encoding GetEncodingFromProvider(string encodingName)
  72. {
  73. if (s_providers == null)
  74. return null;
  75. EncodingProvider[] providers = s_providers;
  76. foreach (EncodingProvider provider in providers)
  77. {
  78. Encoding enc = provider.GetEncoding(encodingName);
  79. if (enc != null)
  80. return enc;
  81. }
  82. return null;
  83. }
  84. internal static Encoding GetEncodingFromProvider(int codepage, EncoderFallback enc, DecoderFallback dec)
  85. {
  86. if (s_providers == null)
  87. return null;
  88. EncodingProvider[] providers = s_providers;
  89. foreach (EncodingProvider provider in providers)
  90. {
  91. Encoding encing = provider.GetEncoding(codepage, enc, dec);
  92. if (encing != null)
  93. return encing;
  94. }
  95. return null;
  96. }
  97. internal static Encoding GetEncodingFromProvider(string encodingName, EncoderFallback enc, DecoderFallback dec)
  98. {
  99. if (s_providers == null)
  100. return null;
  101. EncodingProvider[] providers = s_providers;
  102. foreach (EncodingProvider provider in providers)
  103. {
  104. Encoding encoding = provider.GetEncoding(encodingName, enc, dec);
  105. if (encoding != null)
  106. return encoding;
  107. }
  108. return null;
  109. }
  110. private static object s_InternalSyncObject = new object();
  111. private static volatile EncodingProvider[] s_providers;
  112. }
  113. }