| Index: src/shared/Communication.h | 
| diff --git a/src/shared/Communication.h b/src/shared/Communication.h | 
| index 4caa442dfbfeef7abcb042709cdf84d07366476e..6e50c7e12fbf10f9948bf79eb846e9a9f7879893 100644 | 
| --- a/src/shared/Communication.h | 
| +++ b/src/shared/Communication.h | 
| @@ -8,6 +8,7 @@ | 
| #include <string> | 
| #include <vector> | 
| #include <Windows.h> | 
| +#include "Utils.h" | 
|  | 
| namespace Communication | 
| { | 
| @@ -38,7 +39,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; | 
|  | 
| @@ -54,12 +55,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; | 
| @@ -75,20 +89,16 @@ 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); | 
| +      buffer.read(&value[0], sizeof(std::string::value_type) * length); | 
| if (buffer.fail()) | 
| throw new std::runtime_error("Unexpected end of input buffer"); | 
| - | 
| -      value.assign(data.get(), length); | 
| return *this; | 
| } | 
|  | 
| @@ -138,8 +148,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); } | 
| @@ -150,15 +163,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"); | 
|  | 
|  |