| Left: | ||
| Right: | 
| LEFT | RIGHT | 
|---|---|
| 1 #ifndef COMMUNICATION_H | 1 #ifndef COMMUNICATION_H | 
| 2 #define COMMUNICATION_H | 2 #define COMMUNICATION_H | 
| 3 | 3 | 
| 4 #include <memory> | 4 #include <memory> | 
| 5 #include <sstream> | 5 #include <sstream> | 
| 6 #include <stdexcept> | 6 #include <stdexcept> | 
| 7 #include <stdint.h> | 7 #include <stdint.h> | 
| 8 #include <string> | 8 #include <string> | 
| 9 #include <vector> | 9 #include <vector> | 
| 10 #include <Windows.h> | 10 #include <Windows.h> | 
| 11 | 11 | 
| 12 namespace Communication | 12 namespace Communication | 
| 13 { | 13 { | 
| 14 extern const std::wstring pipeName; | 14 extern const std::wstring pipeName; | 
| 
 
Felix Dahlke
2013/06/03 12:18:47
Since we're really always using the same pipeName,
 
Wladimir Palant
2013/06/03 14:00:26
The tests use a different pipe name.
 
 | |
| 15 const int bufferSize = 1024; | |
| 
 
Felix Dahlke
2013/06/03 12:18:47
This is only being used in Communication.cpp, I'd
 
Wladimir Palant
2013/06/03 14:00:26
True.
 
 | |
| 16 | 15 | 
| 17 enum ValueType {TYPE_STRING, TYPE_WSTRING, TYPE_INT64, TYPE_INT32, TYPE_BOOL}; | 16 enum ProcType : uint32_t { | 
| 17 PROC_MATCHES, | |
| 18 PROC_GET_ELEMHIDE_SELECTORS, | |
| 19 PROC_AVAILABLE_SUBSCRIPTIONS, | |
| 20 PROC_LISTED_SUBSCRIPTIONS, | |
| 21 PROC_SET_SUBSCRIPTION, | |
| 22 PROC_UPDATE_ALL_SUBSCRIPTIONS, | |
| 23 PROC_GET_EXCEPTION_DOMAINS, | |
| 24 PROC_ADD_FILTER, | |
| 25 }; | |
| 26 enum ValueType : uint32_t { | |
| 27 TYPE_PROC, TYPE_STRING, TYPE_WSTRING, TYPE_INT64, TYPE_INT32, TYPE_BOOL | |
| 28 }; | |
| 29 typedef uint32_t SizeType; | |
| 18 | 30 | 
| 19 class InputBuffer | 31 class InputBuffer | 
| 20 { | 32 { | 
| 21 public: | 33 public: | 
| 22 InputBuffer(const std::string& data) : buffer(data) {} | 34 InputBuffer(const std::string& data) : buffer(data), hasType(false) {} | 
| 35 InputBuffer& operator>>(ProcType& value) { return Read(value, TYPE_PROC); } | |
| 23 InputBuffer& operator>>(std::string& value) { return ReadString(value, TYPE_ STRING); } | 36 InputBuffer& operator>>(std::string& value) { return ReadString(value, TYPE_ STRING); } | 
| 24 InputBuffer& operator>>(std::wstring& value) { return ReadString(value, TYPE _WSTRING); } | 37 InputBuffer& operator>>(std::wstring& value) { return ReadString(value, TYPE _WSTRING); } | 
| 25 InputBuffer& operator>>(int64_t& value) { return Read(value, TYPE_INT64); } | 38 InputBuffer& operator>>(int64_t& value) { return Read(value, TYPE_INT64); } | 
| 26 InputBuffer& operator>>(int32_t& value) { return Read(value, TYPE_INT32); } | 39 InputBuffer& operator>>(int32_t& value) { return Read(value, TYPE_INT32); } | 
| 27 InputBuffer& operator>>(bool& value) { return Read(value, TYPE_BOOL); } | 40 InputBuffer& operator>>(bool& value) { return Read(value, TYPE_BOOL); } | 
| 28 private: | 41 private: | 
| 29 std::istringstream buffer; | 42 std::istringstream buffer; | 
| 30 int32_t currentType; | 43 ValueType currentType; | 
| 
 
Felix Dahlke
2013/06/03 12:18:47
I'd like to have the typedef here I asked for in t
 
Wladimir Palant
2013/06/03 14:00:26
You are getting it in the other review :)
 
 | |
| 31 bool hasType; | 44 bool hasType; | 
| 32 | 45 | 
| 33 void CheckType(ValueType expectedType) | 46 void CheckType(ValueType expectedType); | 
| 
 
Felix Dahlke
2013/06/03 12:18:47
I'd prefer to see this function in the cpp, it's a
 
 | |
| 34 { | |
| 35 if (!hasType) | |
| 36 ReadBinary(currentType); | |
| 37 | |
| 38 if (currentType != expectedType) | |
| 39 { | |
| 40 // Make sure we don't attempt to read the type again | |
| 41 hasType = true; | |
| 42 throw new std::runtime_error("Unexpected type found in input buffer"); | |
| 43 } | |
| 44 else | |
| 45 hasType = false; | |
| 46 } | |
| 47 | 47 | 
| 48 template<class T> | 48 template<class T> | 
| 49 InputBuffer& ReadString(T& value, ValueType expectedType) | 49 InputBuffer& ReadString(T& value, ValueType expectedType) | 
| 50 { | 50 { | 
| 51 CheckType(expectedType); | 51 CheckType(expectedType); | 
| 52 | 52 | 
| 53 uint32_t length; | 53 SizeType length; | 
| 54 ReadBinary(length); | 54 ReadBinary(length); | 
| 55 | 55 | 
| 56 std::auto_ptr<T::value_type> data(new T::value_type[length]); | 56 std::auto_ptr<T::value_type> data(new T::value_type[length]); | 
| 57 buffer.read(reinterpret_cast<char*>(data.get()), sizeof(T::value_type) * l ength); | 57 buffer.read(reinterpret_cast<char*>(data.get()), sizeof(T::value_type) * l ength); | 
| 58 if (buffer.fail()) | 58 if (buffer.fail()) | 
| 59 throw new std::runtime_error("Unexpected end of input buffer"); | 59 throw new std::runtime_error("Unexpected end of input buffer"); | 
| 60 | 60 | 
| 61 value.assign(data.get(), length); | 61 value.assign(data.get(), length); | 
| 62 return *this; | 62 return *this; | 
| 63 } | 63 } | 
| (...skipping 20 matching lines...) Expand all Loading... | |
| 84 public: | 84 public: | 
| 85 OutputBuffer() {} | 85 OutputBuffer() {} | 
| 86 | 86 | 
| 87 // Explicit copy constructor to allow returning OutputBuffer by value | 87 // Explicit copy constructor to allow returning OutputBuffer by value | 
| 88 OutputBuffer(const OutputBuffer& copy) : buffer(copy.buffer.str()) {} | 88 OutputBuffer(const OutputBuffer& copy) : buffer(copy.buffer.str()) {} | 
| 89 | 89 | 
| 90 std::string Get() | 90 std::string Get() | 
| 91 { | 91 { | 
| 92 return buffer.str(); | 92 return buffer.str(); | 
| 93 } | 93 } | 
| 94 OutputBuffer& operator<<(ProcType value) { return Write(value, TYPE_PROC); } | |
| 94 OutputBuffer& operator<<(const std::string& value) { return WriteString(valu e, TYPE_STRING); } | 95 OutputBuffer& operator<<(const std::string& value) { return WriteString(valu e, TYPE_STRING); } | 
| 95 OutputBuffer& operator<<(const std::wstring& value) { return WriteString(val ue, TYPE_WSTRING); } | 96 OutputBuffer& operator<<(const std::wstring& value) { return WriteString(val ue, TYPE_WSTRING); } | 
| 96 OutputBuffer& operator<<(int64_t value) { return Write(value, TYPE_INT64); } | 97 OutputBuffer& operator<<(int64_t value) { return Write(value, TYPE_INT64); } | 
| 97 OutputBuffer& operator<<(int32_t value) { return Write(value, TYPE_INT32); } | 98 OutputBuffer& operator<<(int32_t value) { return Write(value, TYPE_INT32); } | 
| 98 OutputBuffer& operator<<(bool value) { return Write(value, TYPE_BOOL); } | 99 OutputBuffer& operator<<(bool value) { return Write(value, TYPE_BOOL); } | 
| 99 private: | 100 private: | 
| 100 std::ostringstream buffer; | 101 std::ostringstream buffer; | 
| 101 | 102 | 
| 103 // Disallow copying | |
| 104 const OutputBuffer& operator=(const OutputBuffer&); | |
| 105 | |
| 102 template<class T> | 106 template<class T> | 
| 103 OutputBuffer& WriteString(const T& value, int32_t type) | 107 OutputBuffer& WriteString(const T& value, ValueType type) | 
| 104 { | 108 { | 
| 105 WriteBinary(type); | 109 WriteBinary(type); | 
| 106 | 110 | 
| 107 uint32_t length = value.size(); | 111 SizeType length = value.size(); | 
| 108 WriteBinary(length); | 112 WriteBinary(length); | 
| 109 | 113 | 
| 110 buffer.write(reinterpret_cast<const char*>(value.c_str()), sizeof(T::value _type) * length); | 114 buffer.write(reinterpret_cast<const char*>(value.c_str()), sizeof(T::value _type) * length); | 
| 111 if (buffer.fail()) | 115 if (buffer.fail()) | 
| 112 throw new std::runtime_error("Unexpected error writing to output buffer" ); | 116 throw new std::runtime_error("Unexpected error writing to output buffer" ); | 
| 113 | 117 | 
| 114 return *this; | 118 return *this; | 
| 115 } | 119 } | 
| 116 | 120 | 
| 117 template<class T> | 121 template<class T> | 
| 118 OutputBuffer& Write(const T value, int32_t type) | 122 OutputBuffer& Write(const T value, ValueType type) | 
| 119 { | 123 { | 
| 120 WriteBinary(type); | 124 WriteBinary(type); | 
| 121 WriteBinary(value); | 125 WriteBinary(value); | 
| 122 return *this; | 126 return *this; | 
| 123 } | 127 } | 
| 124 | 128 | 
| 125 template<class T> | 129 template<class T> | 
| 126 void WriteBinary(const T& value) | 130 void WriteBinary(const T& value) | 
| 127 { | 131 { | 
| 128 buffer.write(reinterpret_cast<const char*>(&value), sizeof(T)); | 132 buffer.write(reinterpret_cast<const char*>(&value), sizeof(T)); | 
| (...skipping 18 matching lines...) Expand all Loading... | |
| 147 | 151 | 
| 148 InputBuffer ReadMessage(); | 152 InputBuffer ReadMessage(); | 
| 149 void WriteMessage(OutputBuffer& message); | 153 void WriteMessage(OutputBuffer& message); | 
| 150 | 154 | 
| 151 protected: | 155 protected: | 
| 152 HANDLE pipe; | 156 HANDLE pipe; | 
| 153 }; | 157 }; | 
| 154 } | 158 } | 
| 155 | 159 | 
| 156 #endif | 160 #endif | 
| LEFT | RIGHT |