tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

ResourceString.cpp (2087B)


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