internal unsafe void InitializeBaseInfoTablePointers(String fileName, bool fromAssembly) { if (fromAssembly) { m_pDataFileStart = GlobalizationAssembly.GetGlobalizationResourceBytePtr(typeof(BaseInfoTable).Assembly, fileName); } else { this.memoryMapFile = new MemoryMapFile(fileName); if (this.memoryMapFile.FileSize == 0) { m_valid = false; return; } this.m_pDataFileStart = this.memoryMapFile.GetBytePtr(); } EndianessHeader *pEndianHeader = (EndianessHeader *)m_pDataFileStart; // Set up pointer to the CultureTableHeader #if BIGENDIAN BCLDebug.Assert(pEndianHeader->beOffset != 0, "Big-Endian data is expected."); m_pCultureHeader = (CultureTableHeader *)(m_pDataFileStart + pEndianHeader->beOffset); #else BCLDebug.Assert(pEndianHeader->leOffset != 0, "Little-Endian data is expected."); m_pCultureHeader = (CultureTableHeader *)(m_pDataFileStart + pEndianHeader->leOffset); #endif // Set up misc pointers and variables. // Different data items for calendar and culture, so they each have their own setting thingy. SetDataItemPointers(); }
internal unsafe void InitializeBaseInfoTablePointers(string fileName, bool fromAssembly) { if (fromAssembly) { this.m_pDataFileStart = GlobalizationAssembly.GetGlobalizationResourceBytePtr(typeof(BaseInfoTable).Assembly, fileName); } else { this.memoryMapFile = new AgileSafeNativeMemoryHandle(fileName); if (this.memoryMapFile.FileSize == 0L) { this.m_valid = false; return; } this.m_pDataFileStart = this.memoryMapFile.GetBytePtr(); } EndianessHeader *pDataFileStart = (EndianessHeader *)this.m_pDataFileStart; this.m_pCultureHeader = (CultureTableHeader *)(this.m_pDataFileStart + pDataFileStart->leOffset); this.SetDataItemPointers(); }
internal unsafe bool Validate() { if (memoryMapFile == null) // we only validate custom cultures. { return(true); } long fileSize = memoryMapFile.FileSize; if (sizeof(EndianessHeader) + sizeof(CultureTableHeader) + sizeof(CultureTableData) + 2 * sizeof(int) > fileSize) { return(false); } // EndianessHeader EndianessHeader *pEndianHeader = (EndianessHeader *)m_pDataFileStart; #if BIGENDIAN if (pEndianHeader->beOffset > fileSize) { return(false); } #else if (pEndianHeader->leOffset > fileSize) { return(false); } #endif // BIGENDIAN // CultureTableHeader 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; // number of characters in the pool if (poolSizeInChar <= 0) { return(false); } // SNAME uint sNameOffset = (uint)((char *)(m_pDataFileStart + m_pCultureHeader->cultureNameTableOffset))[0]; // CultureTableData CultureTableData *cultureData = (CultureTableData *)(m_pDataFileStart + m_pCultureHeader->offsetToCultureItemData); if (cultureData->iLanguage == 0x7F || !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); } // We could use the reflection instead of checking each field manually but this was hurting // the performance (almost 35% from the creation time) 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); } /* * Object cultureTableData = (object) *cultureData; * Type type = cultureTableData.GetType(); * FieldInfo[] fields = type.GetFields(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance); * * for (int i=0; i<fields.Length; i++) * { * BCLDebug.Assert( * fields[i].Name[0] == 'i' || * fields[i].Name[0] == 's' || * fields[i].Name[0] == 'w' , "Invalid structure field name."); * * if (fields[i].Name.Length<2 || (fields[i].Name[0] != 's' && fields[i].Name[0] != 'w')) * continue; * * Object objectValue = type.InvokeMember( * fields[i].Name, * BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.GetField, * null, * cultureTableData, * null, * CultureInfo.InvariantCulture); * int value; * * if (fields[i].FieldType == typeof(System.UInt16)) * value = (int) (ushort) objectValue; * else if (fields[i].FieldType == typeof(System.UInt32)) * value = (int) (uint) objectValue; * else * return false; * * bool result = false; * if (fields[i].Name[0] == 's') * { * if (fields[i].Name[1] == 'a') * result = ValidateStringArray(value, poolSizeInChar); * else * result = ValidateString(value, poolSizeInChar); * } * else * { * BCLDebug.Assert(fields[i].Name[1] == 'a', "Expected field starts with wa."); * result = ValidateString(value, poolSizeInChar); * } * * if (!result) * return false; * } */ return(true); }