public override Encoding GetEncoding(int codepage)
{
if (codepage < 0 || codepage > 65535)
{
return(null);
}
if (codepage == 0)
{
// Retrieve the system default non-unicode code page if possible, or return null,
// giving the rest of the EncodingProviders a chance to return a default.
int systemDefaultCodePage = SystemDefaultCodePage;
return(systemDefaultCodePage != 0 ?
GetEncoding(systemDefaultCodePage) :
null);
}
Encoding result = null;
_cacheLock.EnterUpgradeableReadLock();
try
{
if (_encodings.TryGetValue(codepage, out result))
{
return(result);
}
int i = BaseCodePageEncoding.GetCodePageByteSize(codepage);
if (i == 1)
{
result = new SBCSCodePageEncoding(codepage);
}
else if (i == 2)
{
result = new DBCSCodePageEncoding(codepage);
}
else
{
result = GetEncodingRare(codepage);
if (result == null)
{
return(null);
}
}
_cacheLock.EnterWriteLock();
try
{
Encoding cachedEncoding;
if (_encodings.TryGetValue(codepage, out cachedEncoding))
{
return(cachedEncoding);
}
_encodings.Add(codepage, result);
}
finally
{
_cacheLock.ExitWriteLock();
}
}
finally
{
_cacheLock.ExitUpgradeableReadLock();
}
return(result);
}