Index: src/Utils.cpp |
=================================================================== |
--- a/src/Utils.cpp |
+++ b/src/Utils.cpp |
@@ -21,16 +21,17 @@ |
#include "Utils.h" |
#ifdef _WIN32 |
#include <Windows.h> |
#include <Shlwapi.h> |
#include <algorithm> |
#include <cctype> |
#include <functional> |
+#include <stdexcept> |
#endif |
using namespace AdblockPlus; |
std::string Utils::Slurp(std::ios& stream) |
{ |
std::stringstream content; |
@@ -48,51 +49,44 @@ std::string Utils::FromV8String(v8::Hand |
} |
v8::Local<v8::String> Utils::ToV8String(const std::string& str) |
{ |
return v8::String::New(str.c_str(), str.length()); |
} |
#ifdef _WIN32 |
-std::wstring Utils::ToUTF16String(const std::string& str, unsigned long length) |
+std::wstring Utils::ToUTF16String(const std::string& str) |
{ |
+ size_t length = str.size(); |
if (length == 0) |
return std::wstring(); |
- DWORD utf16StringLength = 0; |
- std::wstring utf16String; |
- utf16StringLength = MultiByteToWideChar(CP_UTF8, 0, str.c_str(), length, &utf16String[0], utf16StringLength); |
- if (utf16StringLength > 0) |
- { |
- utf16String.resize(utf16StringLength); |
- utf16StringLength = MultiByteToWideChar(CP_UTF8, 0, str.c_str(), length, &utf16String[0], utf16StringLength); |
- return utf16String; |
- } |
- std::runtime_error("ToUTF16String failed. Can't determine the length of the buffer needed\n"); |
- return 0; |
+ |
+ DWORD utf16StringLength = MultiByteToWideChar(CP_UTF8, 0, str.c_str(), length, NULL, 0); |
+ if (utf16StringLength == 0) |
+ throw std::runtime_error("ToUTF16String failed. Can't determine the length of the buffer needed."); |
+ |
+ std::wstring utf16String(utf16StringLength, L'\0'); |
+ MultiByteToWideChar(CP_UTF8, 0, str.c_str(), length, &utf16String[0], utf16StringLength); |
+ return utf16String; |
} |
- |
- |
-std::string Utils::ToUTF8String(const std::wstring& str, unsigned long length) |
+std::string Utils::ToUTF8String(const std::wstring& str) |
{ |
+ size_t length = str.size(); |
if (length == 0) |
return std::string(); |
- DWORD utf8StringLength = 0; |
- std::string utf8String; |
- utf8StringLength = WideCharToMultiByte(CP_UTF8, 0, str.c_str(), length, &utf8String[0], utf8StringLength, 0, 0); |
- if (utf8StringLength > 0) |
- { |
- utf8String.resize(utf8StringLength); |
- utf8StringLength = WideCharToMultiByte(CP_UTF8, 0, str.c_str(), length, &utf8String[0], utf8StringLength, 0, 0); |
- return utf8String; |
- } |
- std::runtime_error("ToUTF8String failed. Can't determine the length of the buffer needed\n"); |
- return 0; |
+ DWORD utf8StringLength = WideCharToMultiByte(CP_UTF8, 0, str.c_str(), length, NULL, 0, 0, 0); |
+ if (utf8StringLength == 0) |
+ throw std::runtime_error("ToUTF8String failed. Can't determine the length of the buffer needed."); |
+ |
+ std::string utf8String(utf8StringLength, '\0'); |
+ WideCharToMultiByte(CP_UTF8, 0, str.c_str(), length, &utf8String[0], utf8StringLength, 0, 0); |
+ return utf8String; |
} |
std::wstring Utils::CanonizeUrl(std::wstring url) |
{ |
HRESULT hr; |
std::wstring canonizedUrl; |
DWORD canonizedUrlLength = 2049; // de-facto limit of url length |