1b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* 2b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru******************************************************************************** 359d709d503bab6e2b61931737e662dd293b40578ccornelius* Copyright (C) 2005-2013, International Business Machines 4b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru* Corporation and others. All Rights Reserved. 5b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru******************************************************************************** 6b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru* 7b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru* File WINUTIL.CPP 8b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru* 9b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru******************************************************************************** 10b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru*/ 11b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 12b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/utypes.h" 13b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1483a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius#if U_PLATFORM_HAS_WIN32_API 15b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 16b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#if !UCONFIG_NO_FORMATTING 17b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 18b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "winutil.h" 19b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "locmap.h" 2050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho#include "unicode/uloc.h" 21b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 22b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru# define WIN32_LEAN_AND_MEAN 23b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru# define VC_EXTRALEAN 24b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru# define NOUSER 25b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru# define NOSERVICE 26b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru# define NOIME 27b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru# define NOMCX 28b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru# include <windows.h> 29b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru# include <stdio.h> 3050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho# include <string.h> 31b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 32b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic Win32Utilities::LCIDRecord *lcidRecords = NULL; 33b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic int32_t lcidCount = 0; 34b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic int32_t lcidMax = 0; 35b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 36b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruBOOL CALLBACK EnumLocalesProc(LPSTR lpLocaleString) 37b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 3859d709d503bab6e2b61931737e662dd293b40578ccornelius char localeID[ULOC_FULLNAME_CAPACITY]; 3959d709d503bab6e2b61931737e662dd293b40578ccornelius int32_t localeIDLen; 40b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode status = U_ZERO_ERROR; 41b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 42b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (lcidCount >= lcidMax) { 43b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru Win32Utilities::LCIDRecord *newRecords = new Win32Utilities::LCIDRecord[lcidMax + 32]; 44b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 45b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for (int i = 0; i < lcidMax; i += 1) { 46b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru newRecords[i] = lcidRecords[i]; 47b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 48b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 49b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete[] lcidRecords; 50b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru lcidRecords = newRecords; 51b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru lcidMax += 32; 52b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 53b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 54b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru sscanf(lpLocaleString, "%8x", &lcidRecords[lcidCount].lcid); 55b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 5659d709d503bab6e2b61931737e662dd293b40578ccornelius localeIDLen = uprv_convertToPosix(lcidRecords[lcidCount].lcid, localeID, sizeof(localeID)/sizeof(localeID[0]), &status); 5759d709d503bab6e2b61931737e662dd293b40578ccornelius if (U_SUCCESS(status)) { 5859d709d503bab6e2b61931737e662dd293b40578ccornelius lcidRecords[lcidCount].localeID = new char[localeIDLen + 1]; 5959d709d503bab6e2b61931737e662dd293b40578ccornelius memcpy(lcidRecords[lcidCount].localeID, localeID, localeIDLen); 6059d709d503bab6e2b61931737e662dd293b40578ccornelius lcidRecords[lcidCount].localeID[localeIDLen] = 0; 6159d709d503bab6e2b61931737e662dd293b40578ccornelius } else { 6259d709d503bab6e2b61931737e662dd293b40578ccornelius lcidRecords[lcidCount].localeID = NULL; 6359d709d503bab6e2b61931737e662dd293b40578ccornelius } 64b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 65b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru lcidCount += 1; 66b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 67b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return TRUE; 68b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 69b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 70b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruWin32Utilities::LCIDRecord *Win32Utilities::getLocales(int32_t &localeCount) 71b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 72b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru LCIDRecord *result; 73b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 74b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru EnumSystemLocalesA(EnumLocalesProc, LCID_INSTALLED); 75b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 76b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru localeCount = lcidCount; 77b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru result = lcidRecords; 78b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 79b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru lcidCount = lcidMax = 0; 80b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru lcidRecords = NULL; 81b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 82b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return result; 83b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 84b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 85b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid Win32Utilities::freeLocales(LCIDRecord *records) 86b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 8750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho for (int i = 0; i < lcidCount; i++) { 8850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho delete lcidRecords[i].localeID; 8950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 90b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete[] records; 91b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 92b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 93b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif /* #if !UCONFIG_NO_FORMATTING */ 94b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 9583a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius#endif /* U_PLATFORM_HAS_WIN32_API */ 96