1*f6dc9357SAndroid Build Coastguard Worker // Windows/ResourceString.cpp
2*f6dc9357SAndroid Build Coastguard Worker
3*f6dc9357SAndroid Build Coastguard Worker #include "StdAfx.h"
4*f6dc9357SAndroid Build Coastguard Worker
5*f6dc9357SAndroid Build Coastguard Worker #ifndef _UNICODE
6*f6dc9357SAndroid Build Coastguard Worker #include "../Common/StringConvert.h"
7*f6dc9357SAndroid Build Coastguard Worker #endif
8*f6dc9357SAndroid Build Coastguard Worker
9*f6dc9357SAndroid Build Coastguard Worker #include "ResourceString.h"
10*f6dc9357SAndroid Build Coastguard Worker
11*f6dc9357SAndroid Build Coastguard Worker extern HINSTANCE g_hInstance;
12*f6dc9357SAndroid Build Coastguard Worker #ifndef _UNICODE
13*f6dc9357SAndroid Build Coastguard Worker extern bool g_IsNT;
14*f6dc9357SAndroid Build Coastguard Worker #endif
15*f6dc9357SAndroid Build Coastguard Worker
16*f6dc9357SAndroid Build Coastguard Worker namespace NWindows {
17*f6dc9357SAndroid Build Coastguard Worker
18*f6dc9357SAndroid Build Coastguard Worker #ifndef _UNICODE
19*f6dc9357SAndroid Build Coastguard Worker
MyLoadStringA(HINSTANCE hInstance,UINT resourceID)20*f6dc9357SAndroid Build Coastguard Worker static CSysString MyLoadStringA(HINSTANCE hInstance, UINT resourceID)
21*f6dc9357SAndroid Build Coastguard Worker {
22*f6dc9357SAndroid Build Coastguard Worker CSysString s;
23*f6dc9357SAndroid Build Coastguard Worker int size = 128;
24*f6dc9357SAndroid Build Coastguard Worker int len;
25*f6dc9357SAndroid Build Coastguard Worker do
26*f6dc9357SAndroid Build Coastguard Worker {
27*f6dc9357SAndroid Build Coastguard Worker size <<= 1;
28*f6dc9357SAndroid Build Coastguard Worker len = ::LoadString(hInstance, resourceID, s.GetBuf((unsigned)size - 1), size);
29*f6dc9357SAndroid Build Coastguard Worker }
30*f6dc9357SAndroid Build Coastguard Worker while (size - len <= 1);
31*f6dc9357SAndroid Build Coastguard Worker s.ReleaseBuf_CalcLen((unsigned)len);
32*f6dc9357SAndroid Build Coastguard Worker return s;
33*f6dc9357SAndroid Build Coastguard Worker }
34*f6dc9357SAndroid Build Coastguard Worker
35*f6dc9357SAndroid Build Coastguard Worker #endif
36*f6dc9357SAndroid Build Coastguard Worker
37*f6dc9357SAndroid Build Coastguard Worker static const int kStartSize = 256;
38*f6dc9357SAndroid Build Coastguard Worker
MyLoadString2(HINSTANCE hInstance,UINT resourceID,UString & s)39*f6dc9357SAndroid Build Coastguard Worker static void MyLoadString2(HINSTANCE hInstance, UINT resourceID, UString &s)
40*f6dc9357SAndroid Build Coastguard Worker {
41*f6dc9357SAndroid Build Coastguard Worker int size = kStartSize;
42*f6dc9357SAndroid Build Coastguard Worker int len;
43*f6dc9357SAndroid Build Coastguard Worker do
44*f6dc9357SAndroid Build Coastguard Worker {
45*f6dc9357SAndroid Build Coastguard Worker size <<= 1;
46*f6dc9357SAndroid Build Coastguard Worker len = ::LoadStringW(hInstance, resourceID, s.GetBuf((unsigned)size - 1), size);
47*f6dc9357SAndroid Build Coastguard Worker }
48*f6dc9357SAndroid Build Coastguard Worker while (size - len <= 1);
49*f6dc9357SAndroid Build Coastguard Worker s.ReleaseBuf_CalcLen((unsigned)len);
50*f6dc9357SAndroid Build Coastguard Worker }
51*f6dc9357SAndroid Build Coastguard Worker
52*f6dc9357SAndroid Build Coastguard Worker // NT4 doesn't support LoadStringW(,,, 0) to get pointer to resource string. So we don't use it.
53*f6dc9357SAndroid Build Coastguard Worker
MyLoadString(UINT resourceID)54*f6dc9357SAndroid Build Coastguard Worker UString MyLoadString(UINT resourceID)
55*f6dc9357SAndroid Build Coastguard Worker {
56*f6dc9357SAndroid Build Coastguard Worker #ifndef _UNICODE
57*f6dc9357SAndroid Build Coastguard Worker if (!g_IsNT)
58*f6dc9357SAndroid Build Coastguard Worker return GetUnicodeString(MyLoadStringA(g_hInstance, resourceID));
59*f6dc9357SAndroid Build Coastguard Worker else
60*f6dc9357SAndroid Build Coastguard Worker #endif
61*f6dc9357SAndroid Build Coastguard Worker {
62*f6dc9357SAndroid Build Coastguard Worker {
63*f6dc9357SAndroid Build Coastguard Worker wchar_t s[kStartSize];
64*f6dc9357SAndroid Build Coastguard Worker s[0] = 0;
65*f6dc9357SAndroid Build Coastguard Worker int len = ::LoadStringW(g_hInstance, resourceID, s, kStartSize);
66*f6dc9357SAndroid Build Coastguard Worker if (kStartSize - len > 1)
67*f6dc9357SAndroid Build Coastguard Worker return s;
68*f6dc9357SAndroid Build Coastguard Worker }
69*f6dc9357SAndroid Build Coastguard Worker UString dest;
70*f6dc9357SAndroid Build Coastguard Worker MyLoadString2(g_hInstance, resourceID, dest);
71*f6dc9357SAndroid Build Coastguard Worker return dest;
72*f6dc9357SAndroid Build Coastguard Worker }
73*f6dc9357SAndroid Build Coastguard Worker }
74*f6dc9357SAndroid Build Coastguard Worker
MyLoadString(HINSTANCE hInstance,UINT resourceID,UString & dest)75*f6dc9357SAndroid Build Coastguard Worker void MyLoadString(HINSTANCE hInstance, UINT resourceID, UString &dest)
76*f6dc9357SAndroid Build Coastguard Worker {
77*f6dc9357SAndroid Build Coastguard Worker dest.Empty();
78*f6dc9357SAndroid Build Coastguard Worker #ifndef _UNICODE
79*f6dc9357SAndroid Build Coastguard Worker if (!g_IsNT)
80*f6dc9357SAndroid Build Coastguard Worker MultiByteToUnicodeString2(dest, MyLoadStringA(hInstance, resourceID));
81*f6dc9357SAndroid Build Coastguard Worker else
82*f6dc9357SAndroid Build Coastguard Worker #endif
83*f6dc9357SAndroid Build Coastguard Worker {
84*f6dc9357SAndroid Build Coastguard Worker {
85*f6dc9357SAndroid Build Coastguard Worker wchar_t s[kStartSize];
86*f6dc9357SAndroid Build Coastguard Worker s[0] = 0;
87*f6dc9357SAndroid Build Coastguard Worker int len = ::LoadStringW(hInstance, resourceID, s, kStartSize);
88*f6dc9357SAndroid Build Coastguard Worker if (kStartSize - len > 1)
89*f6dc9357SAndroid Build Coastguard Worker {
90*f6dc9357SAndroid Build Coastguard Worker dest = s;
91*f6dc9357SAndroid Build Coastguard Worker return;
92*f6dc9357SAndroid Build Coastguard Worker }
93*f6dc9357SAndroid Build Coastguard Worker }
94*f6dc9357SAndroid Build Coastguard Worker MyLoadString2(hInstance, resourceID, dest);
95*f6dc9357SAndroid Build Coastguard Worker }
96*f6dc9357SAndroid Build Coastguard Worker }
97*f6dc9357SAndroid Build Coastguard Worker
MyLoadString(UINT resourceID,UString & dest)98*f6dc9357SAndroid Build Coastguard Worker void MyLoadString(UINT resourceID, UString &dest)
99*f6dc9357SAndroid Build Coastguard Worker {
100*f6dc9357SAndroid Build Coastguard Worker MyLoadString(g_hInstance, resourceID, dest);
101*f6dc9357SAndroid Build Coastguard Worker }
102*f6dc9357SAndroid Build Coastguard Worker
103*f6dc9357SAndroid Build Coastguard Worker }
104