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