Index: src/shared/Communication.h |
diff --git a/src/shared/Communication.h b/src/shared/Communication.h |
index f55861c634117dbb620703a76988e81a4b14da5a..1e2344db47815060189fb639c3cdfa92fe7ef8cb 100644 |
--- a/src/shared/Communication.h |
+++ b/src/shared/Communication.h |
@@ -14,7 +14,7 @@ |
* You should have received a copy of the GNU General Public License |
* along with Adblock Plus. If not, see <http://www.gnu.org/licenses/>. |
*/ |
- |
+ |
#ifndef COMMUNICATION_H |
#define COMMUNICATION_H |
@@ -25,6 +25,7 @@ |
#include <string> |
#include <vector> |
#include <Windows.h> |
+#include "Utils.h" |
namespace Communication |
{ |
@@ -55,7 +56,7 @@ namespace Communication |
PROC_COMPARE_VERSIONS |
}; |
enum ValueType : uint32_t { |
- TYPE_PROC, TYPE_STRING, TYPE_WSTRING, TYPE_INT64, TYPE_INT32, TYPE_BOOL, TYPE_STRINGS |
+ TYPE_PROC, TYPE_STRING, TYPE_INT64, TYPE_INT32, TYPE_BOOL, TYPE_STRINGS |
}; |
typedef uint32_t SizeType; |
@@ -71,12 +72,25 @@ namespace Communication |
currentType = copy.currentType; |
} |
InputBuffer& operator>>(ProcType& value) { return Read(value, TYPE_PROC); } |
- InputBuffer& operator>>(std::string& value) { return ReadString(value, TYPE_STRING); } |
- InputBuffer& operator>>(std::wstring& value) { return ReadString(value, TYPE_WSTRING); } |
+ InputBuffer& operator>>(std::string& value) { return ReadString(value); } |
+ InputBuffer& operator>>(std::wstring& value) |
+ { |
+ std::string tmpString; |
+ operator>>(tmpString); |
+ value = ToUtf16String(tmpString); |
+ return *this; |
+ } |
InputBuffer& operator>>(int64_t& value) { return Read(value, TYPE_INT64); } |
InputBuffer& operator>>(int32_t& value) { return Read(value, TYPE_INT32); } |
InputBuffer& operator>>(bool& value) { return Read(value, TYPE_BOOL); } |
InputBuffer& operator>>(std::vector<std::string>& value) { return ReadStrings(value); } |
+ InputBuffer& operator>>(std::vector<std::wstring>& value) |
+ { |
+ std::vector<std::string> tmpStrings; |
+ operator>>(tmpStrings); |
+ value = ToUtf16Strings(tmpStrings); |
+ return *this; |
+ } |
InputBuffer& operator=(const InputBuffer& copy) |
{ |
hasType = copy.hasType; |
@@ -92,20 +106,19 @@ namespace Communication |
void CheckType(ValueType expectedType); |
- template<class T> |
- InputBuffer& ReadString(T& value, ValueType expectedType) |
+ InputBuffer& ReadString(std::string& value) |
{ |
- CheckType(expectedType); |
+ CheckType(TYPE_STRING); |
SizeType length; |
ReadBinary(length); |
- |
- std::auto_ptr<T::value_type> data(new T::value_type[length]); |
- buffer.read(reinterpret_cast<char*>(data.get()), sizeof(T::value_type) * length); |
+ value.resize(length); |
+ if (length > 0) |
+ { |
+ buffer.read(&value[0], length); |
+ } |
if (buffer.fail()) |
throw new std::runtime_error("Unexpected end of input buffer"); |
- |
- value.assign(data.get(), length); |
return *this; |
} |
@@ -155,8 +168,11 @@ namespace Communication |
return buffer.str(); |
} |
OutputBuffer& operator<<(ProcType value) { return Write(value, TYPE_PROC); } |
- OutputBuffer& operator<<(const std::string& value) { return WriteString(value, TYPE_STRING); } |
- OutputBuffer& operator<<(const std::wstring& value) { return WriteString(value, TYPE_WSTRING); } |
+ OutputBuffer& operator<<(const std::string& value) { return WriteString(value); } |
+ OutputBuffer& operator<<(const std::wstring& value) |
+ { |
+ return operator<<(ToUtf8String(value)); |
+ } |
OutputBuffer& operator<<(int64_t value) { return Write(value, TYPE_INT64); } |
OutputBuffer& operator<<(int32_t value) { return Write(value, TYPE_INT32); } |
OutputBuffer& operator<<(bool value) { return Write(value, TYPE_BOOL); } |
@@ -167,15 +183,13 @@ namespace Communication |
// Disallow copying |
const OutputBuffer& operator=(const OutputBuffer&); |
- template<class T> |
- OutputBuffer& WriteString(const T& value, ValueType type) |
+ OutputBuffer& WriteString(const std::string& value) |
{ |
- WriteBinary(type); |
+ WriteBinary(TYPE_STRING); |
SizeType length = static_cast<SizeType>(value.size()); |
WriteBinary(length); |
- |
- buffer.write(reinterpret_cast<const char*>(value.c_str()), sizeof(T::value_type) * length); |
+ buffer.write(value.c_str(), length); |
if (buffer.fail()) |
throw new std::runtime_error("Unexpected error writing to output buffer"); |