mirror of
https://github.com/HowardHinnant/date.git
synced 2025-08-02 20:24:27 +02:00
Merge pull request #63 from gmcode/gmchanges
Fix a todo and a few micro optimisations. Trying harder to locate unz…
This commit is contained in:
41
tz.cpp
41
tz.cpp
@@ -312,7 +312,7 @@ public:
|
|||||||
|
|
||||||
// WARNING: this function is not a general-purpose function.
|
// WARNING: this function is not a general-purpose function.
|
||||||
// It has a hard-coded value size limit that should be sufficient for our use cases.
|
// It has a hard-coded value size limit that should be sufficient for our use cases.
|
||||||
bool get_string(const wchar_t* key_name, std::string& value)
|
bool get_string(const wchar_t* key_name, std::string& value, std::wstring_convert<std::codecvt_utf8_utf16<wchar_t>>& converter)
|
||||||
{
|
{
|
||||||
value.clear();
|
value.clear();
|
||||||
wchar_t value_buffer[256];
|
wchar_t value_buffer[256];
|
||||||
@@ -324,7 +324,6 @@ public:
|
|||||||
{
|
{
|
||||||
// Function does not guarantee to null terminate.
|
// Function does not guarantee to null terminate.
|
||||||
value_buffer[size/sizeof(value_buffer[0])] = L'\0';
|
value_buffer[size/sizeof(value_buffer[0])] = L'\0';
|
||||||
std::wstring_convert<std::codecvt_utf8_utf16<wchar_t>> converter;
|
|
||||||
value = converter.to_bytes(value_buffer);
|
value = converter.to_bytes(value_buffer);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@@ -468,6 +467,7 @@ get_windows_timezone_info(std::vector<detail::timezone_info>& tz_list)
|
|||||||
DWORD size;
|
DWORD size;
|
||||||
wchar_t zone_key_name[256];
|
wchar_t zone_key_name[256];
|
||||||
std::wstring value;
|
std::wstring value;
|
||||||
|
std::wstring_convert<std::codecvt_utf8_utf16<wchar_t>> converter;
|
||||||
|
|
||||||
// Iterate through the list of keys of the parent time zones key to get
|
// Iterate through the list of keys of the parent time zones key to get
|
||||||
// each key that identifies each individual timezone.
|
// each key that identifies each individual timezone.
|
||||||
@@ -484,7 +484,6 @@ get_windows_timezone_info(std::vector<detail::timezone_info>& tz_list)
|
|||||||
+ get_win32_message(status));
|
+ get_win32_message(status));
|
||||||
if (status == ERROR_NO_MORE_ITEMS)
|
if (status == ERROR_NO_MORE_ITEMS)
|
||||||
break;
|
break;
|
||||||
std::wstring_convert<std::codecvt_utf8_utf16<wchar_t>> converter;
|
|
||||||
tz.timezone_id = converter.to_bytes(zone_key_name);
|
tz.timezone_id = converter.to_bytes(zone_key_name);
|
||||||
|
|
||||||
full_zone_key_name = zones_key_name;
|
full_zone_key_name = zones_key_name;
|
||||||
@@ -499,13 +498,13 @@ get_windows_timezone_info(std::vector<detail::timezone_info>& tz_list)
|
|||||||
if (zone_key.open(full_zone_key_name.c_str()) != ERROR_SUCCESS)
|
if (zone_key.open(full_zone_key_name.c_str()) != ERROR_SUCCESS)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
if (!zone_key.get_string(L"Std", tz.standard_name))
|
if (!zone_key.get_string(L"Std", tz.standard_name, converter))
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
#if 0
|
#if 0
|
||||||
// TBD these fields are not required yet.
|
// TBD these fields are not required yet.
|
||||||
// They might be useful for test cases though.
|
// They might be useful for test cases though.
|
||||||
if (!zone_key.get_string("Display", tz.display_name))
|
if (!zone_key.get_string("Display", tz.display_name, converter))
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
if (!zone_key.get_binary("TZI", &tz.tzi, sizeof(TZI)))
|
if (!zone_key.get_binary("TZI", &tz.tzi, sizeof(TZI)))
|
||||||
@@ -2328,7 +2327,11 @@ move_file(const std::string& from, const std::string& to)
|
|||||||
return !!::MoveFile(from.c_str(), to.c_str());
|
return !!::MoveFile(from.c_str(), to.c_str());
|
||||||
# endif // !USE_SHELL_API
|
# endif // !USE_SHELL_API
|
||||||
#else // !WIN32
|
#else // !WIN32
|
||||||
|
# if USE_SHELL_API
|
||||||
return std::system(("mv " + from + " " + to).c_str()) == EXIT_SUCCESS;
|
return std::system(("mv " + from + " " + to).c_str()) == EXIT_SUCCESS;
|
||||||
|
# else
|
||||||
|
return rename(from, to) == 0);
|
||||||
|
# endif
|
||||||
#endif // !WIN32
|
#endif // !WIN32
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -2337,13 +2340,37 @@ move_file(const std::string& from, const std::string& to)
|
|||||||
#if _WIN32
|
#if _WIN32
|
||||||
|
|
||||||
// Note folder can and usually does contain spaces.
|
// Note folder can and usually does contain spaces.
|
||||||
// Note assume's 7 zip is in the default installation location.
|
|
||||||
// TODO! consider more certain means of finding it such as looking in the registry.
|
|
||||||
static
|
static
|
||||||
std::string
|
std::string
|
||||||
get_unzip_program()
|
get_unzip_program()
|
||||||
{
|
{
|
||||||
std::string path;
|
std::string path;
|
||||||
|
|
||||||
|
// 7-Zip appears to note its location in the registry.
|
||||||
|
// If that doesn't work, fall through and take a guess, but it will likely be wrong.
|
||||||
|
HKEY hKey = nullptr;
|
||||||
|
if (RegOpenKeyExA(HKEY_LOCAL_MACHINE, "SOFTWARE\\7-Zip", 0, KEY_READ, &hKey) == ERROR_SUCCESS)
|
||||||
|
{
|
||||||
|
char value_buffer[MAX_PATH + 1]; // fyi 260 at time of writing.
|
||||||
|
// in/out parameter. Documentation say that size is a count of bytes not chars.
|
||||||
|
DWORD size = sizeof(value_buffer) - sizeof(value_buffer[0]);
|
||||||
|
DWORD tzi_type = REG_SZ;
|
||||||
|
// Testing shows Path key value is "C:\Program Files\7-Zip\" i.e. always with trailing \.
|
||||||
|
bool got_value = (RegQueryValueExA(hKey, "Path", nullptr, &tzi_type,
|
||||||
|
reinterpret_cast<LPBYTE>(value_buffer), &size) == ERROR_SUCCESS);
|
||||||
|
RegCloseKey(hKey); // Close now incase of throw later.
|
||||||
|
if (got_value)
|
||||||
|
{
|
||||||
|
// Function does not guarantee to null terminate.
|
||||||
|
value_buffer[size / sizeof(value_buffer[0])] = '\0';
|
||||||
|
path = value_buffer;
|
||||||
|
if (!path.empty())
|
||||||
|
{
|
||||||
|
path += "7z.exe";
|
||||||
|
return path;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
path += get_program_folder();
|
path += get_program_folder();
|
||||||
path += folder_delimiter;
|
path += folder_delimiter;
|
||||||
path += "7-Zip\\7z.exe";
|
path += "7-Zip\\7z.exe";
|
||||||
|
Reference in New Issue
Block a user