We need you! We're working hard on the next version of Developer Fusion -
Let us know what you think we should be up to!
- namespace System.Globalization
- {
- using System.Runtime.Remoting;
- using System;
- using System.Text;
- using System.Threading;
- using System.Collections;
- using System.Runtime.InteropServices;
- using System.Runtime.CompilerServices;
- using System.Security;
- using System.Security.Permissions;
- using System.IO;
- using Microsoft.Win32;
- using System.Runtime.Versioning;
-
-
-
- internal class CultureTable : BaseInfoTable
- {
-
-
-
-
-
-
- internal const int ILANGUAGE = 0;
-
-
-
-
- private const CultureTypes CultureTypesMask = ~(CultureTypes.NeutralCultures | CultureTypes.SpecificCultures | CultureTypes.InstalledWin32Cultures | CultureTypes.UserCustomCulture | CultureTypes.ReplacementCultures | CultureTypes.WindowsOnlyCultures | CultureTypes.FrameworkCultures);
-
-
- private Hashtable hashByName;
- private Hashtable hashByRegionName;
- private Hashtable hashByLcid;
-
- unsafe private CultureNameOffsetItem* m_pCultureNameIndex;
- unsafe private RegionNameOffsetItem* m_pRegionNameIndex;
- unsafe private IetfNameOffsetItem* m_pIetfNameIndex;
- unsafe private IDOffsetItem* m_pCultureIDIndex;
-
- private static CultureTable m_defaultInstance;
-
- [ResourceExposure(ResourceScope.Machine)]
- [ResourceConsumption(ResourceScope.Machine)]
- static CultureTable()
- {
- m_defaultInstance = new CultureTable("culture.nlp", true);
- }
-
- [ResourceExposure(ResourceScope.Machine)]
- [ResourceConsumption(ResourceScope.Machine)]
- unsafe internal CultureTable(string fileName, bool fromAssembly) : base(fileName, fromAssembly)
- {
- if (!IsValid)
-
- return;
-
- hashByName = new Hashtable();
- hashByLcid = new Hashtable();
- hashByRegionName = new Hashtable();
-
-
- m_pCultureNameIndex = (CultureNameOffsetItem*)(m_pDataFileStart + m_pCultureHeader->cultureNameTableOffset);
- m_pRegionNameIndex = (RegionNameOffsetItem*)(m_pDataFileStart + m_pCultureHeader->regionNameTableOffset);
- m_pIetfNameIndex = (IetfNameOffsetItem*)(m_pDataFileStart + m_pCultureHeader->ietfNameTableOffset);
-
-
- m_pCultureIDIndex = (IDOffsetItem*)(m_pDataFileStart + m_pCultureHeader->cultureIDTableOffset);
- }
-
-
-
-
-
-
-
-
- internal const string TypeLoadExceptionMessage = "Failure has occurred while loading a type.";
-
- static internal CultureTable Default {
- get {
-
-
-
-
-
- if (m_defaultInstance == null)
- throw new TypeLoadException(TypeLoadExceptionMessage);
-
- return (m_defaultInstance);
- }
- }
-
- ////////////////////////////////////////////////////////////////////////
-
-
-
- ////////////////////////////////////////////////////////////////////////
- unsafe internal override void SetDataItemPointers()
- {
- if (Validate()) {
- m_itemSize = m_pCultureHeader->sizeCultureItem;
- m_numItem = m_pCultureHeader->numCultureItems;
- m_pDataPool = (ushort*)(m_pDataFileStart + m_pCultureHeader->offsetToDataPool);
- m_pItemData = m_pDataFileStart + m_pCultureHeader->offsetToCultureItemData;
- }
- else {
- m_valid = false;
- }
- }
-
- #region CustomCultureValidation
-
-
-
-
-
- unsafe private static string CheckAndGetTheString(ushort* pDataPool, uint offsetInPool, int poolSize)
- {
- if (offsetInPool + 2 > poolSize)
-
- return null;
-
- char* pCharValues = unchecked((char*)(pDataPool + offsetInPool));
- int stringLength = (int)pCharValues[0];
- if (offsetInPool + stringLength + 2 > poolSize)
-
- return null;
-
- return new string(pCharValues + 1, 0, stringLength);
- }
-
-
-
-
-
-
-
- unsafe private static bool ValidateString(ushort* pDataPool, uint offsetInPool, int poolSize)
- {
- if (offsetInPool + 2 > poolSize)
-
- return false;
-
- char* pCharValues = unchecked((char*)(pDataPool + offsetInPool));
- int stringLength = (int)pCharValues[0];
- if (offsetInPool + stringLength + 2 > poolSize)
-
- return false;
-
- return true;
- }
-
-
-
-
-
-
- unsafe private static bool ValidateUintArray(ushort* pDataPool, uint offsetInPool, int poolSize)
- {
- if (offsetInPool == 0)
- return true;
-
- if (offsetInPool + 2 > poolSize)
-
- return false;
-
-
-
-
- ushort* pCount = pDataPool + offsetInPool;
- if (((int)(pCount)&2) != 2)
- return false;
-
- int arrayLength = pCount[0];
- if (offsetInPool + (arrayLength * 2) + 2 > poolSize)
-
- return false;
-
- return true;
- }
-
-
-
-
-
-
- unsafe private static bool ValidateStringArray(ushort* pDataPool, uint offsetInPool, int poolSize)
- {
- if (!ValidateUintArray(pDataPool, offsetInPool, poolSize))
- return false;
-
-
- ushort* pCount = pDataPool + offsetInPool;
- int arrayLength = pCount[0];
-
- if (arrayLength == 0)
- return true;
-
-
- uint* uints = (uint*)(pCount + 1);
-
- for (int i = 0; i < arrayLength; i++) {
- if (!ValidateString(pDataPool, uints[i], poolSize))
- return false;
- }
-
- return true;
- }
-
-
-
-
-
-
- private static bool IsValidLcid(int lcid, bool canBeCustomLcid)
- {
- if (canBeCustomLcid && CultureTableRecord.IsCustomCultureId(lcid))
- return true;
-
- if (CultureTable.Default.IsExistingCulture(lcid))
- return true;
-
-
- return false;
- }
-
- const uint sizeofNameOffsetItem = 8;
-
-
-
-
-
-
- [ResourceExposure(ResourceScope.None)]
- [ResourceConsumption(ResourceScope.Machine, ResourceScope.Machine)]
- unsafe internal bool Validate()
- {
- if (memoryMapFile == null)
-
- return true;
-
- long fileSize = memoryMapFile.FileSize;
-
- if (sizeof(EndianessHeader) + sizeof(CultureTableHeader) + sizeof(CultureTableData) + 2 * sizeof(int) > fileSize)
- return false;
-
-
- EndianessHeader* pEndianHeader = (EndianessHeader*)m_pDataFileStart;
- #if BIGENDIAN
- if (pEndianHeader->beOffset > fileSize)
- return false;
- #else
- if (pEndianHeader->leOffset > fileSize)
- return false;
- #endif // BIGENDIAN
-
-
- if (m_pCultureHeader->offsetToCultureItemData + m_pCultureHeader->sizeCultureItem > fileSize) {
- return false;
- }
- if (m_pCultureHeader->cultureIDTableOffset > fileSize) {
- return false;
- }
- if (m_pCultureHeader->cultureNameTableOffset + sizeofNameOffsetItem > fileSize) {
- return false;
- }
- if (m_pCultureHeader->regionNameTableOffset > fileSize) {
- return false;
- }
- if (m_pCultureHeader->offsetToCalendarItemData + m_pCultureHeader->sizeCalendarItem > fileSize) {
- return false;
- }
- if (m_pCultureHeader->ietfNameTableOffset > fileSize) {
- return false;
- }
- if (m_pCultureHeader->offsetToDataPool > fileSize) {
- return false;
- }
-
- ushort* pDataPool = (ushort*)(m_pDataFileStart + m_pCultureHeader->offsetToDataPool);
-
- int poolSizeInChar = (int)(fileSize - ((long)pDataPool - (long)m_pDataFileStart)) / 2;
-
- if (poolSizeInChar <= 0)
- return false;
-
-
- uint sNameOffset = (uint)((char*)(m_pDataFileStart + m_pCultureHeader->cultureNameTableOffset))[0];
-
-
- CultureTableData* cultureData = (CultureTableData*)(m_pDataFileStart + m_pCultureHeader->offsetToCultureItemData);
-
- if (cultureData->iLanguage == 127 || !IsValidLcid(cultureData->iLanguage, true))
- return false;
-
- string cultureName = CheckAndGetTheString(pDataPool, cultureData->sName, poolSizeInChar);
- if (String.IsNullOrEmpty(cultureName))
- return false;
-
- if (sNameOffset != cultureData->sName) {
- if (!cultureName.Equals(CheckAndGetTheString(pDataPool, sNameOffset, poolSizeInChar)))
- return false;
- }
-
- string parentName = CheckAndGetTheString(pDataPool, cultureData->sParent, poolSizeInChar);
- if (parentName == null || parentName.Equals(cultureName, StringComparison.OrdinalIgnoreCase))
- return false;
-
- if (!IsValidLcid((int)cultureData->iTextInfo, false) || !IsValidLcid((int)cultureData->iCompareInfo, false))
- return false;
-
-
-
-
- if (!ValidateString(pDataPool, cultureData->waGrouping, poolSizeInChar)) {
- return false;
- }
- if (!ValidateString(pDataPool, cultureData->waMonetaryGrouping, poolSizeInChar)) {
- return false;
- }
- if (!ValidateString(pDataPool, cultureData->sListSeparator, poolSizeInChar)) {
- return false;
- }
- if (!ValidateString(pDataPool, cultureData->sDecimalSeparator, poolSizeInChar)) {
- return false;
- }
- if (!ValidateString(pDataPool, cultureData->sThousandSeparator, poolSizeInChar)) {
- return false;
- }
- if (!ValidateString(pDataPool, cultureData->sCurrency, poolSizeInChar)) {
- return false;
- }
- if (!ValidateString(pDataPool, cultureData->sMonetaryDecimal, poolSizeInChar)) {
- return false;
- }
- if (!ValidateString(pDataPool, cultureData->sMonetaryThousand, poolSizeInChar)) {
- return false;
- }
- if (!ValidateString(pDataPool, cultureData->sPositiveSign, poolSizeInChar)) {
- return false;
- }
- if (!ValidateString(pDataPool, cultureData->sNegativeSign, poolSizeInChar)) {
- return false;
- }
- if (!ValidateString(pDataPool, cultureData->sAM1159, poolSizeInChar)) {
- return false;
- }
- if (!ValidateString(pDataPool, cultureData->sPM2359, poolSizeInChar)) {
- return false;
- }
- if (!ValidateStringArray(pDataPool, cultureData->saNativeDigits, poolSizeInChar)) {
- return false;
- }
- if (!ValidateStringArray(pDataPool, cultureData->saTimeFormat, poolSizeInChar)) {
- return false;
- }
- if (!ValidateStringArray(pDataPool, cultureData->saShortDate, poolSizeInChar)) {
- return false;
- }
- if (!ValidateStringArray(pDataPool, cultureData->saLongDate, poolSizeInChar)) {
- return false;
- }
- if (!ValidateStringArray(pDataPool, cultureData->saYearMonth, poolSizeInChar)) {
- return false;
- }
- if (!ValidateStringArray(pDataPool, cultureData->saDuration, poolSizeInChar)) {
- return false;
- }
- if (!ValidateString(pDataPool, cultureData->waCalendars, poolSizeInChar)) {
- return false;
- }
- if (!ValidateString(pDataPool, cultureData->sAbbrevLang, poolSizeInChar)) {
- return false;
- }
- if (!ValidateString(pDataPool, cultureData->sISO639Language, poolSizeInChar)) {
- return false;
- }
- if (!ValidateString(pDataPool, cultureData->sEnglishLanguage, poolSizeInChar)) {
- return false;
- }
- if (!ValidateString(pDataPool, cultureData->sNativeLanguage, poolSizeInChar)) {
- return false;
- }
- if (!ValidateString(pDataPool, cultureData->sEnglishCountry, poolSizeInChar)) {
- return false;
- }
- if (!ValidateString(pDataPool, cultureData->sNativeCountry, poolSizeInChar)) {
- return false;
- }
- if (!ValidateString(pDataPool, cultureData->sAbbrevCountry, poolSizeInChar)) {
- return false;
- }
- if (!ValidateString(pDataPool, cultureData->sISO3166CountryName, poolSizeInChar)) {
- return false;
- }
- if (!ValidateString(pDataPool, cultureData->sIntlMonetarySymbol, poolSizeInChar)) {
- return false;
- }
- if (!ValidateString(pDataPool, cultureData->sEnglishCurrency, poolSizeInChar)) {
- return false;
- }
- if (!ValidateString(pDataPool, cultureData->sNativeCurrency, poolSizeInChar)) {
- return false;
- }
- if (!ValidateString(pDataPool, cultureData->waFontSignature, poolSizeInChar)) {
- return false;
- }
- if (!ValidateString(pDataPool, cultureData->sISO639Language2, poolSizeInChar)) {
- return false;
- }
- if (!ValidateString(pDataPool, cultureData->sISO3166CountryName2, poolSizeInChar)) {
- return false;
- }
- if (!ValidateStringArray(pDataPool, cultureData->saDayNames, poolSizeInChar)) {
- return false;
- }
- if (!ValidateStringArray(pDataPool, cultureData->saAbbrevDayNames, poolSizeInChar)) {
- return false;
- }
- if (!ValidateStringArray(pDataPool, cultureData->saMonthNames, poolSizeInChar)) {
- return false;
- }
- if (!ValidateStringArray(pDataPool, cultureData->saAbbrevMonthNames, poolSizeInChar)) {
- return false;
- }
- if (!ValidateStringArray(pDataPool, cultureData->saMonthGenitiveNames, poolSizeInChar)) {
- return false;
- }
- if (!ValidateStringArray(pDataPool, cultureData->saAbbrevMonthGenitiveNames, poolSizeInChar)) {
- return false;
- }
- if (!ValidateStringArray(pDataPool, cultureData->saNativeCalendarNames, poolSizeInChar)) {
- return false;
- }
- if (!ValidateStringArray(pDataPool, cultureData->saAltSortID, poolSizeInChar)) {
- return false;
- }
- if (!ValidateString(pDataPool, cultureData->sEnglishDisplayName, poolSizeInChar)) {
- return false;
- }
- if (!ValidateString(pDataPool, cultureData->sNativeDisplayName, poolSizeInChar)) {
- return false;
- }
- if (!ValidateString(pDataPool, cultureData->sPercent, poolSizeInChar)) {
- return false;
- }
- if (!ValidateString(pDataPool, cultureData->sNaN, poolSizeInChar)) {
- return false;
- }
- if (!ValidateString(pDataPool, cultureData->sPositiveInfinity, poolSizeInChar)) {
- return false;
- }
- if (!ValidateString(pDataPool, cultureData->sNegativeInfinity, poolSizeInChar)) {
- return false;
- }
- if (!ValidateString(pDataPool, cultureData->sMonthDay, poolSizeInChar)) {
- return false;
- }
- if (!ValidateString(pDataPool, cultureData->sAdEra, poolSizeInChar)) {
- return false;
- }
- if (!ValidateString(pDataPool, cultureData->sAbbrevAdEra, poolSizeInChar)) {
- return false;
- }
- if (!ValidateString(pDataPool, cultureData->sRegionName, poolSizeInChar)) {
- return false;
- }
- if (!ValidateString(pDataPool, cultureData->sConsoleFallbackName, poolSizeInChar)) {
- return false;
- }
- if (!ValidateStringArray(pDataPool, cultureData->saShortTime, poolSizeInChar)) {
- return false;
- }
- if (!ValidateStringArray(pDataPool, cultureData->saSuperShortDayNames, poolSizeInChar)) {
- return false;
- }
- if (!ValidateStringArray(pDataPool, cultureData->saDateWords, poolSizeInChar)) {
- return false;
- }
- if (!ValidateString(pDataPool, cultureData->sSpecificCulture, poolSizeInChar)) {
- return false;
- }
- if (!ValidateString(pDataPool, cultureData->sIetfLanguage, poolSizeInChar)) {
- return false;
- }
-
-
- return true;
- }
- #endregion CustomCultureValidation
-
-
-
- unsafe internal int GetDataItemFromCultureName(string name, out int culture, out string actualName)
- {
- BCLDebug.Assert(name != null, "CultureTable.GetDataItemFromCultureName(): name!=null");
- culture = -1;
- actualName = "";
-
- CultureTableItem cti = (CultureTableItem)hashByName[name];
- if (null != cti && 0 != cti.culture) {
- culture = cti.culture;
- actualName = cti.name;
- return (cti.dataItem);
- }
-
- int left = 0;
- int right = m_pCultureHeader->numCultureNames - 1;
-
- while (left <= right) {
- int mid = (left + right) / 2;
-
- int result = CompareStringToStringPoolStringBinary(name, m_pCultureNameIndex[mid].strOffset);
-
- if (result == 0) {
- cti = new CultureTableItem();
- int index = cti.dataItem = m_pCultureNameIndex[mid].dataItemIndex;
- culture = cti.culture = m_pCultureNameIndex[mid].actualCultureID;
- actualName = cti.name = GetStringPoolString(m_pCultureNameIndex[mid].strOffset);
-
-
-
-
-
-
-
-
- hashByName[name] = cti;
- return (index);
- }
- if (result < 0) {
- right = mid - 1;
- }
- else {
- left = mid + 1;
- }
- }
-
- culture = -1;
- return (-1);
- }
-
-
-
-
-
-
-
-
-
-
-
-
-
- unsafe internal int GetDataItemFromRegionName(string name)
- {
- BCLDebug.Assert(name != null, "CultureTable.GetDataItemFromRegionName(): name!=null");
-
- object dataItem;
- if ((dataItem = hashByRegionName[name]) != null) {
- return (Int32)dataItem;
- }
-
- int left = 0;
- int right = m_pCultureHeader->numRegionNames - 1;
-
- while (left <= right) {
- int mid = (left + right) / 2;
-
- int result = CompareStringToStringPoolStringBinary(name, m_pRegionNameIndex[mid].strOffset);
- if (result == 0) {
- int index = m_pRegionNameIndex[mid].dataItemIndex;
- hashByRegionName[name] = index;
-
-
- return (index);
- }
- if (result < 0) {
- right = mid - 1;
- }
- else {
- left = mid + 1;
- }
- }
- return (-1);
- }
-
-
-
-
-
-
-
-
-
-
-
-
-
- unsafe internal string LookupIetfName(string name)
- {
- BCLDebug.Assert(name != null, "CultureTable.LookupIetfName(): name!=null");
-
-
-
- int left = 0;
- int right = m_pCultureHeader->numIetfNames - 1;
-
- while (left <= right) {
- int mid = (left + right) / 2;
- int result = CompareStringToStringPoolStringBinary(name, m_pIetfNameIndex[mid].strIetfNameOffset);
-
- if (result == 0) {
-
- return GetStringPoolString(m_pIetfNameIndex[mid].strCultureNameOffset);
- }
- if (result < 0)
- right = mid - 1;
- else
- left = mid + 1;
- }
-
-
- return null;
- }
-
-
-
-
- unsafe internal int GetDataItemFromCultureID(int cultureID, out string actualName)
- {
- BCLDebug.Assert(cultureID != 0, "CultureTable.GetDataItemFromCultureID(): cultureID!=0");
-
- CultureTableItem cti = (CultureTableItem)hashByLcid[cultureID];
- if (null != cti && 0 != cti.culture) {
- actualName = cti.name;
- return (cti.dataItem);
- }
-
- int left = 0;
- int right = m_pCultureHeader->numCultureNames - 1;
-
- while (left <= right) {
- int mid = (left + right) / 2;
- int result = cultureID - this.m_pCultureIDIndex[mid].actualCultureID;
- if (result == 0) {
- cti = new CultureTableItem();
- int index = cti.dataItem = m_pCultureIDIndex[mid].dataItemIndex;
- int culture = cti.culture = cultureID;
-
- actualName = cti.name = GetStringPoolString(m_pCultureIDIndex[mid].strOffset);
-
- hashByLcid[cultureID] = cti;
- return (index);
- }
- if (result < 0) {
- right = mid - 1;
- }
- else {
- left = mid + 1;
- }
- }
-
- actualName = "";
- return (-1);
- }
-
-
- static internal bool IsInstalledLCID(int cultureID)
- {
- {
- return CultureInfo.IsValidLCID(cultureID, CultureInfo.LCID_INSTALLED);
- }
- }
-
-
-
-
- unsafe internal bool IsExistingCulture(int lcid)
- {
- if (lcid == 0)
- return false;
-
- string notUsed;
- return (GetDataItemFromCultureID(lcid, out notUsed) >= 0);
- }
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- [ResourceExposure(ResourceScope.None)]
- [ResourceConsumption(ResourceScope.Machine, ResourceScope.Machine)]
- &