| Left: | ||
| Right: |
| OLD | NEW |
|---|---|
| 1 #ifndef COMMUNICATION_H | 1 #ifndef COMMUNICATION_H |
| 2 #define COMMUNICATION_H | 2 #define COMMUNICATION_H |
| 3 | 3 |
| 4 #include <sstream> | |
| 5 #include <stdint.h> | |
| 4 #include <string> | 6 #include <string> |
| 5 #include <vector> | 7 #include <vector> |
| 6 #include <Windows.h> | 8 #include <Windows.h> |
| 7 | 9 |
| 8 namespace Communication | 10 namespace Communication |
| 9 { | 11 { |
| 10 extern const std::wstring pipeName; | 12 extern const std::wstring pipeName; |
| 11 const int bufferSize = 1024; | 13 const int bufferSize = 1024; |
| 12 | 14 |
| 13 std::string MarshalStrings(const std::vector<std::string>& strings); | 15 enum ValueType {TYPE_STRING, TYPE_WSTRING, TYPE_INT64, TYPE_INT32, TYPE_BOOL}; |
| 14 std::vector<std::string> UnmarshalStrings(const std::string& message); | 16 |
| 15 std::string ReadMessage(HANDLE pipe); | 17 class InputBuffer |
| 16 void WriteMessage(HANDLE pipe, const std::string& message); | 18 { |
| 19 public: | |
| 20 InputBuffer(const std::string& data) : buffer(data) {} | |
| 21 InputBuffer& operator>>(std::string& value) { return ReadString(value, TYPE_ STRING); } | |
| 22 InputBuffer& operator>>(std::wstring& value) { return ReadString(value, TYPE _WSTRING); } | |
| 23 InputBuffer& operator>>(int64_t& value) { return Read(value, TYPE_INT64); } | |
| 24 InputBuffer& operator>>(int32_t& value) { return Read(value, TYPE_INT32); } | |
| 25 InputBuffer& operator>>(bool& value) { return Read(value, TYPE_BOOL); } | |
| 26 private: | |
| 27 std::istringstream buffer; | |
| 28 | |
| 29 template<class T> | |
| 30 InputBuffer& ReadString(T& value, ValueType expectedType) | |
|
Felix Dahlke
2013/06/03 11:25:41
I'd just call this "ReadArray", since it would wor
Wladimir Palant
2013/06/03 11:53:00
Nope - this is expecting std::base_string rather t
| |
| 31 { | |
| 32 int32_t type; | |
|
Felix Dahlke
2013/06/03 11:25:41
Should be ValueType, not int32_t I guess?
Wladimir Palant
2013/06/03 11:53:00
I'm not sure whether the internal representation o
Felix Dahlke
2013/06/03 12:02:09
Fair enough. But I'd want a typedef then :)
| |
| 33 ReadBinary(type); | |
| 34 if (type != expectedType) | |
| 35 throw new std::runtime_error("Unexpected type found in input buffer"); | |
| 36 | |
| 37 uint32_t length; | |
|
Felix Dahlke
2013/06/03 11:25:41
Would prefer a typedef for this.
| |
| 38 ReadBinary(length); | |
| 39 | |
| 40 std::auto_ptr<T::value_type> data(new T::value_type[length]); | |
| 41 buffer.read(reinterpret_cast<char*>(data.get()), sizeof(T::value_type) * l ength); | |
| 42 if (buffer.fail()) | |
| 43 throw new std::runtime_error("Unexpected end of input buffer"); | |
| 44 | |
| 45 value.assign(data.get(), length); | |
|
Felix Dahlke
2013/06/03 11:25:41
Based on some quick searching, only std::basic_str
Wladimir Palant
2013/06/03 11:53:00
See above - this function is used both for std::st
Felix Dahlke
2013/06/03 12:02:09
I thought basic_string was a base class, but it's
| |
| 46 return *this; | |
| 47 } | |
| 48 | |
| 49 template<class T> | |
| 50 InputBuffer& Read(T& value, ValueType expectedType) | |
| 51 { | |
| 52 int32_t type; | |
|
Felix Dahlke
2013/06/03 11:25:41
Like above, I think this should be ValueType
| |
| 53 ReadBinary(type); | |
| 54 if (type != expectedType) | |
| 55 throw new std::runtime_error("Unexpected type found in input buffer"); | |
| 56 | |
| 57 ReadBinary(value); | |
| 58 return *this; | |
| 59 } | |
| 60 | |
| 61 template<class T> | |
| 62 void ReadBinary(T& value) | |
| 63 { | |
| 64 buffer.read(reinterpret_cast<char*>(&value), sizeof(T)); | |
| 65 if (buffer.fail()) | |
| 66 throw new std::runtime_error("Unexpected end of input buffer"); | |
| 67 } | |
| 68 }; | |
| 69 | |
| 70 class OutputBuffer | |
| 71 { | |
| 72 public: | |
| 73 OutputBuffer() {} | |
| 74 | |
| 75 // Explicit copy constructor to allow returning OutputBuffer by value | |
|
Felix Dahlke
2013/06/03 11:25:41
I find this kind of obvious :P
Wladimir Palant
2013/06/03 11:53:00
It wasn't to me :)
| |
| 76 OutputBuffer(const OutputBuffer& copy) : buffer(copy.buffer.str()) {} | |
|
Felix Dahlke
2013/06/03 11:25:41
We should implement the copy assign operator as we
Wladimir Palant
2013/06/03 11:53:00
I think I'm fine with copy assignment failing - I
Felix Dahlke
2013/06/03 12:02:09
Assignment won't fail if the copy assignment opera
| |
| 77 | |
| 78 std::string Get() | |
| 79 { | |
| 80 return buffer.str(); | |
| 81 } | |
| 82 OutputBuffer& operator<<(const std::string& value) { return WriteString(valu e, TYPE_STRING); } | |
| 83 OutputBuffer& operator<<(const std::wstring& value) { return WriteString(val ue, TYPE_WSTRING); } | |
| 84 OutputBuffer& operator<<(int64_t value) { return Write(value, TYPE_INT64); } | |
| 85 OutputBuffer& operator<<(int32_t value) { return Write(value, TYPE_INT32); } | |
| 86 OutputBuffer& operator<<(bool value) { return Write(value, TYPE_BOOL); } | |
| 87 private: | |
| 88 std::ostringstream buffer; | |
| 89 | |
| 90 template<class T> | |
| 91 OutputBuffer& WriteString(const T& value, int32_t type) | |
|
Felix Dahlke
2013/06/03 11:25:41
Should be ValueType instead of int32_t I guess.
| |
| 92 { | |
| 93 WriteBinary(type); | |
| 94 | |
| 95 uint32_t length = value.size(); | |
| 96 WriteBinary(length); | |
| 97 | |
| 98 buffer.write(reinterpret_cast<const char*>(value.c_str()), sizeof(T::value _type) * length); | |
|
Felix Dahlke
2013/06/03 11:25:41
AFAIK, only std::basic_string has c_str(). So no n
Wladimir Palant
2013/06/03 11:53:00
See above - both std::string and std::wstring are
| |
| 99 if (buffer.fail()) | |
| 100 throw new std::runtime_error("Unexpected error writing to output buffer" ); | |
| 101 | |
| 102 return *this; | |
| 103 } | |
| 104 | |
| 105 template<class T> | |
| 106 OutputBuffer& Write(const T value, int32_t type) | |
|
Felix Dahlke
2013/06/03 11:25:41
Should be ValueType instead of int32_t I think. Al
| |
| 107 { | |
| 108 WriteBinary(type); | |
| 109 WriteBinary(value); | |
| 110 return *this; | |
| 111 } | |
| 112 | |
| 113 template<class T> | |
| 114 void WriteBinary(const T& value) | |
| 115 { | |
| 116 buffer.write(reinterpret_cast<const char*>(&value), sizeof(T)); | |
| 117 if (buffer.fail()) | |
| 118 throw new std::runtime_error("Unexpected error writing to output buffer" ); | |
| 119 } | |
| 120 }; | |
| 121 | |
| 122 InputBuffer ReadMessage(HANDLE pipe); | |
| 123 void WriteMessage(HANDLE pipe, OutputBuffer& message); | |
| 17 } | 124 } |
| 18 | 125 |
| 19 #endif | 126 #endif |
| OLD | NEW |