16f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/* 26f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org******************************************************************************** 36f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* Copyright (C) 2005-2013, International Business Machines 46f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* Corporation and others. All Rights Reserved. 56f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org******************************************************************************** 66f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* 76f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* File WINUTIL.CPP 86f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* 96f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org******************************************************************************** 106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org*/ 116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "unicode/utypes.h" 136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#if U_PLATFORM_HAS_WIN32_API 156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#if !UCONFIG_NO_FORMATTING 176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "winutil.h" 196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "locmap.h" 206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "unicode/uloc.h" 216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org# define WIN32_LEAN_AND_MEAN 236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org# define VC_EXTRALEAN 246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org# define NOUSER 256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org# define NOSERVICE 266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org# define NOIME 276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org# define NOMCX 286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org# include <windows.h> 296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org# include <stdio.h> 306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org# include <string.h> 316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic Win32Utilities::LCIDRecord *lcidRecords = NULL; 336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic int32_t lcidCount = 0; 346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic int32_t lcidMax = 0; 356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgBOOL CALLBACK EnumLocalesProc(LPSTR lpLocaleString) 376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{ 386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org char localeID[ULOC_FULLNAME_CAPACITY]; 396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t localeIDLen; 406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UErrorCode status = U_ZERO_ERROR; 416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (lcidCount >= lcidMax) { 436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org Win32Utilities::LCIDRecord *newRecords = new Win32Utilities::LCIDRecord[lcidMax + 32]; 446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org for (int i = 0; i < lcidMax; i += 1) { 466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org newRecords[i] = lcidRecords[i]; 476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org delete[] lcidRecords; 506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org lcidRecords = newRecords; 516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org lcidMax += 32; 526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org sscanf(lpLocaleString, "%8x", &lcidRecords[lcidCount].lcid); 556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org localeIDLen = uprv_convertToPosix(lcidRecords[lcidCount].lcid, localeID, sizeof(localeID)/sizeof(localeID[0]), &status); 576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (U_SUCCESS(status)) { 586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org lcidRecords[lcidCount].localeID = new char[localeIDLen + 1]; 596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org memcpy(lcidRecords[lcidCount].localeID, localeID, localeIDLen); 606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org lcidRecords[lcidCount].localeID[localeIDLen] = 0; 616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } else { 626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org lcidRecords[lcidCount].localeID = NULL; 636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org lcidCount += 1; 666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return TRUE; 686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgWin32Utilities::LCIDRecord *Win32Utilities::getLocales(int32_t &localeCount) 716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{ 726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org LCIDRecord *result; 736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org EnumSystemLocalesA(EnumLocalesProc, LCID_INSTALLED); 756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org localeCount = lcidCount; 776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org result = lcidRecords; 786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org lcidCount = lcidMax = 0; 806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org lcidRecords = NULL; 816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return result; 836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgvoid Win32Utilities::freeLocales(LCIDRecord *records) 866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{ 876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org for (int i = 0; i < lcidCount; i++) { 886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org delete lcidRecords[i].localeID; 896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org delete[] records; 916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#endif /* #if !UCONFIG_NO_FORMATTING */ 946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#endif /* U_PLATFORM_HAS_WIN32_API */ 96