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