summaryrefslogtreecommitdiff
path: root/src/mscorlib/src/System/Text/BaseCodePageEncoding.cs
diff options
context:
space:
mode:
Diffstat (limited to 'src/mscorlib/src/System/Text/BaseCodePageEncoding.cs')
-rw-r--r--src/mscorlib/src/System/Text/BaseCodePageEncoding.cs332
1 files changed, 0 insertions, 332 deletions
diff --git a/src/mscorlib/src/System/Text/BaseCodePageEncoding.cs b/src/mscorlib/src/System/Text/BaseCodePageEncoding.cs
deleted file mode 100644
index 0a42237dc1..0000000000
--- a/src/mscorlib/src/System/Text/BaseCodePageEncoding.cs
+++ /dev/null
@@ -1,332 +0,0 @@
-// Licensed to the .NET Foundation under one or more agreements.
-// The .NET Foundation licenses this file to you under the MIT license.
-// See the LICENSE file in the project root for more information.
-
-#if FEATURE_CODEPAGES_FILE
-namespace System.Text
-{
- using System;
- using System.Diagnostics;
- using System.Diagnostics.Contracts;
- using System.Globalization;
- using System.Runtime.InteropServices;
- using System.Security;
- using System.Collections;
- using System.Runtime.CompilerServices;
- using System.Runtime.Serialization;
- using System.Runtime.Versioning;
- using System.Security.Permissions;
- using Microsoft.Win32.SafeHandles;
-
- // Our input file data structures look like:
- //
- // Header Structure Looks Like:
- // struct NLSPlusHeader
- // {
- // WORD[16] filename; // 32 bytes
- // WORD[4] version; // 8 bytes = 40 // I.e: 3, 2, 0, 0
- // WORD count; // 2 bytes = 42 // Number of code page index's that'll follow
- // }
- //
- // Each code page section looks like:
- // struct NLSCodePageIndex
- // {
- // WORD[16] codePageName; // 32 bytes
- // WORD codePage; // +2 bytes = 34
- // WORD byteCount; // +2 bytes = 36
- // DWORD offset; // +4 bytes = 40 // Bytes from beginning of FILE.
- // }
- //
- // Each code page then has its own header
- // struct NLSCodePage
- // {
- // WORD[16] codePageName; // 32 bytes
- // WORD[4] version; // 8 bytes = 40 // I.e: 3.2.0.0
- // WORD codePage; // 2 bytes = 42
- // WORD byteCount; // 2 bytes = 44 // 1 or 2 byte code page (SBCS or DBCS)
- // WORD unicodeReplace; // 2 bytes = 46 // default replacement unicode character
- // WORD byteReplace; // 2 bytes = 48 // default replacement byte(s)
- // BYTE[] data; // data section
- // }
-
- [Serializable]
- internal abstract class BaseCodePageEncoding : EncodingNLS, ISerializable
- {
- // Static & Const stuff
- internal const String CODE_PAGE_DATA_FILE_NAME = "codepages.nlp";
- [NonSerialized]
- protected int dataTableCodePage;
-
- // Variables to help us allocate/mark our memory section correctly
- [NonSerialized]
- protected bool bFlagDataTable = true;
- [NonSerialized]
- protected int iExtraBytes = 0;
-
- // Our private unicode to bytes best fit array and visa versa.
- [NonSerialized]
- protected char[] arrayUnicodeBestFit = null;
- [NonSerialized]
- protected char[] arrayBytesBestFit = null;
-
- // This is used to help ISCII, EUCJP and ISO2022 figure out they're MlangEncodings
- [NonSerialized]
- protected bool m_bUseMlangTypeForSerialization = false;
-
- static BaseCodePageEncoding()
- {
- }
-
- //
- // This is the header for the native data table that we load from CODE_PAGE_DATA_FILE_NAME.
- //
- // Explicit layout is used here since a syntax like char[16] can not be used in sequential layout.
- [StructLayout(LayoutKind.Explicit)]
- internal unsafe struct CodePageDataFileHeader
- {
- [FieldOffset(0)]
- internal char TableName; // WORD[16]
- [FieldOffset(0x20)]
- internal ushort Version; // WORD[4]
- [FieldOffset(0x28)]
- internal short CodePageCount; // WORD
- [FieldOffset(0x2A)]
- internal short unused1; // Add a unused WORD so that CodePages is aligned with DWORD boundary.
- // Otherwise, 64-bit version will fail.
- [FieldOffset(0x2C)]
- internal CodePageIndex CodePages; // Start of code page index
- }
-
- [StructLayout(LayoutKind.Explicit, Pack=2)]
- internal unsafe struct CodePageIndex
- {
- [FieldOffset(0)]
- internal char CodePageName; // WORD[16]
- [FieldOffset(0x20)]
- internal short CodePage; // WORD
- [FieldOffset(0x22)]
- internal short ByteCount; // WORD
- [FieldOffset(0x24)]
- internal int Offset; // DWORD
- }
-
- [StructLayout(LayoutKind.Explicit)]
- internal unsafe struct CodePageHeader
- {
- [FieldOffset(0)]
- internal char CodePageName; // WORD[16]
- [FieldOffset(0x20)]
- internal ushort VersionMajor; // WORD
- [FieldOffset(0x22)]
- internal ushort VersionMinor; // WORD
- [FieldOffset(0x24)]
- internal ushort VersionRevision;// WORD
- [FieldOffset(0x26)]
- internal ushort VersionBuild; // WORD
- [FieldOffset(0x28)]
- internal short CodePage; // WORD
- [FieldOffset(0x2a)]
- internal short ByteCount; // WORD // 1 or 2 byte code page (SBCS or DBCS)
- [FieldOffset(0x2c)]
- internal char UnicodeReplace; // WORD // default replacement unicode character
- [FieldOffset(0x2e)]
- internal ushort ByteReplace; // WORD // default replacement bytes
- [FieldOffset(0x30)]
- internal short FirstDataWord; // WORD[]
- }
-
- // Initialize our global stuff
- unsafe static CodePageDataFileHeader* m_pCodePageFileHeader =
- (CodePageDataFileHeader*)GlobalizationAssembly.GetGlobalizationResourceBytePtr(
- typeof(CharUnicodeInfo).Assembly, CODE_PAGE_DATA_FILE_NAME);
-
- // Real variables
- [NonSerialized]
- unsafe protected CodePageHeader* pCodePage = null;
-
- // Safe handle wrapper around section map view
- [NonSerialized]
- protected SafeViewOfFileHandle safeMemorySectionHandle = null;
-
- // Safe handle wrapper around mapped file handle
- [NonSerialized]
- protected SafeFileMappingHandle safeFileMappingHandle = null;
-
- internal BaseCodePageEncoding(int codepage) : this(codepage, codepage)
- {
- }
-
- internal BaseCodePageEncoding(int codepage, int dataCodePage) :
- base(codepage == 0? Microsoft.Win32.Win32Native.GetACP(): codepage)
- {
- // Remember number of code page that we'll be using the table for.
- dataTableCodePage = dataCodePage;
- LoadCodePageTables();
- }
-
- // Constructor called by serialization.
- internal BaseCodePageEncoding(SerializationInfo info, StreamingContext context) : base(0)
- {
- // We cannot ever call this, we've proxied ourselved to CodePageEncoding
- throw new ArgumentNullException("this");
- }
-
- // ISerializable implementation
- void ISerializable.GetObjectData(SerializationInfo info, StreamingContext context)
- {
- // Make sure to get the base stuff too This throws if info is null
- SerializeEncoding(info, context);
- Debug.Assert(info!=null, "[BaseCodePageEncoding.GetObjectData] Expected null info to throw");
-
- // Just need Everett maxCharSize (BaseCodePageEncoding) or m_maxByteSize (MLangBaseCodePageEncoding)
- info.AddValue(m_bUseMlangTypeForSerialization ? "m_maxByteSize" : "maxCharSize",
- this.IsSingleByte ? 1 : 2);
-
- // Use this class or MLangBaseCodePageEncoding as our deserializer.
- info.SetType(m_bUseMlangTypeForSerialization ? typeof(MLangCodePageEncoding) :
- typeof(CodePageEncoding));
- }
-
- // We need to load tables for our code page
- private unsafe void LoadCodePageTables()
- {
- CodePageHeader* pCodePage = FindCodePage(dataTableCodePage);
-
- // Make sure we have one
- if (pCodePage == null)
- {
- // Didn't have one
- throw new NotSupportedException(
- Environment.GetResourceString("NotSupported_NoCodepageData", CodePage));
- }
-
- // Remember our code page
- this.pCodePage = pCodePage;
-
- // We had it, so load it
- LoadManagedCodePage();
- }
-
- // Look up the code page pointer
- private static unsafe CodePageHeader* FindCodePage(int codePage)
- {
- // We'll have to loop through all of the m_pCodePageIndex[] items to find our code page, this isn't
- // binary or anything so its not monsterously fast.
- for (int i = 0; i < m_pCodePageFileHeader->CodePageCount; i++)
- {
- CodePageIndex* pCodePageIndex = (&(m_pCodePageFileHeader->CodePages)) + i;
-
- if (pCodePageIndex->CodePage == codePage)
- {
- // Found it!
- CodePageHeader* pCodePage =
- (CodePageHeader*)((byte*)m_pCodePageFileHeader + pCodePageIndex->Offset);
- return pCodePage;
- }
- }
-
- // Couldn't find it
- return null;
- }
-
- // Get our code page byte count
- internal static unsafe int GetCodePageByteSize(int codePage)
- {
- // Get our code page info
- CodePageHeader* pCodePage = FindCodePage(codePage);
-
- // If null return 0
- if (pCodePage == null)
- return 0;
-
- Debug.Assert(pCodePage->ByteCount == 1 || pCodePage->ByteCount == 2,
- "[BaseCodePageEncoding] Code page (" + codePage + ") has invalid byte size (" + pCodePage->ByteCount + ") in table");
- // Return what it says for byte count
- return pCodePage->ByteCount;
- }
-
- // We have a managed code page entry, so load our tables
- protected abstract unsafe void LoadManagedCodePage();
-
- // Allocate memory to load our code page
- protected unsafe byte* GetSharedMemory(int iSize)
- {
- // Build our name
- String strName = GetMemorySectionName();
-
- IntPtr mappedFileHandle;
-
- // This gets shared memory for our map. If its can't, it gives us clean memory.
- Byte *pMemorySection = EncodingTable.nativeCreateOpenFileMapping(strName, iSize, out mappedFileHandle);
- Debug.Assert(pMemorySection != null,
- "[BaseCodePageEncoding.GetSharedMemory] Expected non-null memory section to be opened");
-
- // If that failed, we have to die.
- if (pMemorySection == null)
- throw new OutOfMemoryException(
- Environment.GetResourceString("Arg_OutOfMemoryException"));
-
- // if we have null file handle. this means memory was allocated after
- // failing to open the mapped file.
-
- if (mappedFileHandle != IntPtr.Zero)
- {
- safeMemorySectionHandle = new SafeViewOfFileHandle((IntPtr) pMemorySection, true);
- safeFileMappingHandle = new SafeFileMappingHandle(mappedFileHandle, true);
- }
-
- return pMemorySection;
- }
-
- protected unsafe virtual String GetMemorySectionName()
- {
- int iUseCodePage = this.bFlagDataTable ? dataTableCodePage : CodePage;
-
- String strName = String.Format(CultureInfo.InvariantCulture, "NLS_CodePage_{0}_{1}_{2}_{3}_{4}",
- iUseCodePage, this.pCodePage->VersionMajor, this.pCodePage->VersionMinor,
- this.pCodePage->VersionRevision, this.pCodePage->VersionBuild);
-
- return strName;
- }
-
- protected abstract unsafe void ReadBestFitTable();
-
- internal override char[] GetBestFitUnicodeToBytesData()
- {
- // Read in our best fit table if necessary
- if (arrayUnicodeBestFit == null) ReadBestFitTable();
-
- Debug.Assert(arrayUnicodeBestFit != null,
- "[BaseCodePageEncoding.GetBestFitUnicodeToBytesData]Expected non-null arrayUnicodeBestFit");
-
- // Normally we don't have any best fit data.
- return arrayUnicodeBestFit;
- }
-
- internal override char[] GetBestFitBytesToUnicodeData()
- {
- // Read in our best fit table if necessary
- if (arrayBytesBestFit == null) ReadBestFitTable();
-
- Debug.Assert(arrayBytesBestFit != null,
- "[BaseCodePageEncoding.GetBestFitBytesToUnicodeData]Expected non-null arrayBytesBestFit");
-
- // Normally we don't have any best fit data.
- return arrayBytesBestFit;
- }
-
- // During the AppDomain shutdown the Encoding class may already finalized and the memory section
- // is invalid. so we detect that by validating the memory section handle then re-initialize the memory
- // section by calling LoadManagedCodePage() method and eventually the mapped file handle and
- // the memory section pointer will get finalized one more time.
- internal unsafe void CheckMemorySection()
- {
- if (safeMemorySectionHandle != null && safeMemorySectionHandle.DangerousGetHandle() == IntPtr.Zero)
- {
- LoadManagedCodePage();
- }
- }
- }
-}
-
-#endif // FEATURE_CODEPAGES_FILE