| Index: src/shared/Communication.h |
| =================================================================== |
| --- a/src/shared/Communication.h |
| +++ b/src/shared/Communication.h |
| @@ -1,12 +1,14 @@ |
| #ifndef COMMUNICATION_H |
| #define COMMUNICATION_H |
| +#include <memory> |
| #include <sstream> |
| +#include <stdexcept> |
| #include <stdint.h> |
| #include <string> |
| #include <vector> |
| #include <Windows.h> |
| namespace Communication |
| { |
| 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.
|
| @@ -20,45 +22,55 @@ namespace Communication |
| InputBuffer(const std::string& data) : buffer(data) {} |
| InputBuffer& operator>>(std::string& value) { return ReadString(value, TYPE_STRING); } |
| InputBuffer& operator>>(std::wstring& value) { return ReadString(value, TYPE_WSTRING); } |
| 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); } |
| private: |
| std::istringstream buffer; |
| + int32_t 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 :)
|
| + bool hasType; |
| + |
| + 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
|
| + { |
| + if (!hasType) |
| + ReadBinary(currentType); |
| + |
| + if (currentType != expectedType) |
| + { |
| + // Make sure we don't attempt to read the type again |
| + hasType = true; |
| + throw new std::runtime_error("Unexpected type found in input buffer"); |
| + } |
| + else |
| + hasType = false; |
| + } |
| template<class T> |
| InputBuffer& ReadString(T& value, ValueType expectedType) |
| { |
| - int32_t type; |
| - ReadBinary(type); |
| - if (type != expectedType) |
| - throw new std::runtime_error("Unexpected type found in input buffer"); |
| + CheckType(expectedType); |
| uint32_t 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); |
| if (buffer.fail()) |
| throw new std::runtime_error("Unexpected end of input buffer"); |
| value.assign(data.get(), length); |
| return *this; |
| } |
| template<class T> |
| InputBuffer& Read(T& value, ValueType expectedType) |
| { |
| - int32_t type; |
| - ReadBinary(type); |
| - if (type != expectedType) |
| - throw new std::runtime_error("Unexpected type found in input buffer"); |
| - |
| + CheckType(expectedType); |
| ReadBinary(value); |
| return *this; |
| } |
| template<class T> |
| void ReadBinary(T& value) |
| { |
| buffer.read(reinterpret_cast<char*>(&value), sizeof(T)); |
| @@ -114,13 +126,31 @@ namespace Communication |
| void WriteBinary(const T& value) |
| { |
| buffer.write(reinterpret_cast<const char*>(&value), sizeof(T)); |
| if (buffer.fail()) |
| throw new std::runtime_error("Unexpected error writing to output buffer"); |
| } |
| }; |
| - InputBuffer ReadMessage(HANDLE pipe); |
| - void WriteMessage(HANDLE pipe, OutputBuffer& message); |
| + class PipeConnectionError : public std::runtime_error |
| + { |
| + public: |
| + PipeConnectionError(); |
| + }; |
| + |
| + class Pipe |
| + { |
| + public: |
| + enum Mode {MODE_CREATE, MODE_CONNECT}; |
| + |
| + Pipe(const std::wstring& name, Mode mode); |
| + ~Pipe(); |
| + |
| + InputBuffer ReadMessage(); |
| + void WriteMessage(OutputBuffer& message); |
| + |
| + protected: |
| + HANDLE pipe; |
| + }; |
| } |
| #endif |