VirtualBox

source: vbox/trunk/src/VBox/Runtime/r3/win/RTLocaleQueryUserCountryCode-win.cpp@ 76553

Last change on this file since 76553 was 76553, checked in by vboxsync, 6 years ago

scm --update-copyright-year

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 4.6 KB
Line 
1/* $Id: RTLocaleQueryUserCountryCode-win.cpp 76553 2019-01-01 01:45:53Z vboxsync $ */
2/** @file
3 * IPRT - RTLocaleQueryUserCountryCode, ring-3, Windows.
4 */
5
6/*
7 * Copyright (C) 2017-2019 Oracle Corporation
8 *
9 * This file is part of VirtualBox Open Source Edition (OSE), as
10 * available from http://www.virtualbox.org. This file is free software;
11 * you can redistribute it and/or modify it under the terms of the GNU
12 * General Public License (GPL) as published by the Free Software
13 * Foundation, in version 2 as it comes in the "COPYING" file of the
14 * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
15 * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
16 *
17 * The contents of this file may alternatively be used under the terms
18 * of the Common Development and Distribution License Version 1.0
19 * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
20 * VirtualBox OSE distribution, in which case the provisions of the
21 * CDDL are applicable instead of those of the GPL.
22 *
23 * You may elect to license modified versions of this file under the
24 * terms and conditions of either the GPL or the CDDL or both.
25 */
26
27
28/*********************************************************************************************************************************
29* Header Files *
30*********************************************************************************************************************************/
31#include <iprt/win/windows.h>
32
33#include <iprt/locale.h>
34#include "internal/iprt.h"
35
36#include <iprt/ctype.h>
37#include <iprt/errcore.h>
38#include <iprt/string.h>
39
40#include "internal-r3-win.h"
41
42
43/*********************************************************************************************************************************
44* Structures and Typedefs *
45*********************************************************************************************************************************/
46typedef GEOID (WINAPI *PFNGETUSERGEOID)(GEOCLASS);
47typedef INT (WINAPI *PFNGETGEOINFOW)(GEOID,GEOTYPE,LPWSTR,INT,LANGID);
48
49
50/*********************************************************************************************************************************
51* Global Variables *
52*********************************************************************************************************************************/
53/** Pointer to GetUserGeoID. */
54static PFNGETUSERGEOID g_pfnGetUserGeoID = NULL;
55/** Pointer to GetGeoInfoW. */
56static PFNGETGEOINFOW g_pfnGetGeoInfoW = NULL;
57/** Set if we've tried to resolve the APIs. */
58static bool volatile g_fResolvedApis = false;
59
60
61RTDECL(int) RTLocaleQueryUserCountryCode(char pszCountryCode[3])
62{
63 /*
64 * Get API pointers.
65 */
66 PFNGETUSERGEOID pfnGetUserGeoID;
67 PFNGETGEOINFOW pfnGetGeoInfoW;
68 if (g_fResolvedApis)
69 {
70 pfnGetUserGeoID = g_pfnGetUserGeoID;
71 pfnGetGeoInfoW = g_pfnGetGeoInfoW;
72 }
73 else
74 {
75 pfnGetUserGeoID = (PFNGETUSERGEOID)GetProcAddress(g_hModKernel32, "GetUserGeoID");
76 pfnGetGeoInfoW = (PFNGETGEOINFOW)GetProcAddress(g_hModKernel32, "GetGeoInfoW");
77 g_pfnGetUserGeoID = pfnGetUserGeoID;
78 g_pfnGetGeoInfoW = pfnGetGeoInfoW;
79 g_fResolvedApis = true;
80 }
81
82 int rc;
83 if ( pfnGetGeoInfoW
84 && pfnGetUserGeoID)
85 {
86 /*
87 * Call the API and retrieve the two letter ISO country code.
88 */
89 GEOID idGeo = pfnGetUserGeoID(GEOCLASS_NATION);
90 if (idGeo != GEOID_NOT_AVAILABLE)
91 {
92 RTUTF16 wszName[16];
93 RT_ZERO(wszName);
94 DWORD cwcReturned = pfnGetGeoInfoW(idGeo, GEO_ISO2, wszName, RT_ELEMENTS(wszName), LOCALE_NEUTRAL);
95 if ( cwcReturned >= 2
96 && cwcReturned <= 3
97 && wszName[2] == '\0'
98 && wszName[1] != '\0'
99 && RT_C_IS_ALPHA(wszName[1])
100 && wszName[0] != '\0'
101 && RT_C_IS_ALPHA(wszName[0]) )
102 {
103 pszCountryCode[0] = RT_C_TO_UPPER(wszName[0]);
104 pszCountryCode[1] = RT_C_TO_UPPER(wszName[1]);
105 pszCountryCode[2] = '\0';
106 return VINF_SUCCESS;
107 }
108 AssertMsgFailed(("cwcReturned=%d err=%u wszName='%.16ls'\n", cwcReturned, GetLastError(), wszName));
109 }
110 rc = VERR_NOT_AVAILABLE;
111 }
112 else
113 rc = VERR_NOT_SUPPORTED;
114 pszCountryCode[0] = 'Z';
115 pszCountryCode[1] = 'Z';
116 pszCountryCode[2] = '\0';
117 return rc;
118}
119
Note: See TracBrowser for help on using the repository browser.

© 2024 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette