Rietveld Code Review Tool
Help | Bug tracker | Discussion group | Source code

Side by Side Diff: src/shared/Communication.h

Issue 10824027: Implement better marshaling (Closed)
Patch Set: Created June 3, 2013, 12:05 p.m.
Left:
Right:
Use n/p to move between diff chunks; N/P to move between comments.
Jump to:
View unified diff | Download patch
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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;
15 const int bufferSize = 1024; 15 const int bufferSize = 1024;
16 16
17 enum ValueType {TYPE_STRING, TYPE_WSTRING, TYPE_INT64, TYPE_INT32, TYPE_BOOL}; 17 enum {TYPE_STRING, TYPE_WSTRING, TYPE_INT64, TYPE_INT32, TYPE_BOOL};
18 typedef int32_t ValueType;
19 typedef uint32_t SizeType;
18 20
19 class InputBuffer 21 class InputBuffer
20 { 22 {
21 public: 23 public:
22 InputBuffer(const std::string& data) : buffer(data), hasType(false) {} 24 InputBuffer(const std::string& data) : buffer(data), hasType(false) {}
23 InputBuffer& operator>>(std::string& value) { return ReadString(value, TYPE_ STRING); } 25 InputBuffer& operator>>(std::string& value) { return ReadString(value, TYPE_ STRING); }
24 InputBuffer& operator>>(std::wstring& value) { return ReadString(value, TYPE _WSTRING); } 26 InputBuffer& operator>>(std::wstring& value) { return ReadString(value, TYPE _WSTRING); }
25 InputBuffer& operator>>(int64_t& value) { return Read(value, TYPE_INT64); } 27 InputBuffer& operator>>(int64_t& value) { return Read(value, TYPE_INT64); }
26 InputBuffer& operator>>(int32_t& value) { return Read(value, TYPE_INT32); } 28 InputBuffer& operator>>(int32_t& value) { return Read(value, TYPE_INT32); }
27 InputBuffer& operator>>(bool& value) { return Read(value, TYPE_BOOL); } 29 InputBuffer& operator>>(bool& value) { return Read(value, TYPE_BOOL); }
28 private: 30 private:
29 std::istringstream buffer; 31 std::istringstream buffer;
30 int32_t currentType; 32 ValueType currentType;
31 bool hasType; 33 bool hasType;
32 34
33 void CheckType(ValueType expectedType) 35 void CheckType(ValueType expectedType)
34 { 36 {
35 if (!hasType) 37 if (!hasType)
36 ReadBinary(currentType); 38 ReadBinary(currentType);
37 39
38 if (currentType != expectedType) 40 if (currentType != expectedType)
39 { 41 {
40 // Make sure we don't attempt to read the type again 42 // Make sure we don't attempt to read the type again
41 hasType = true; 43 hasType = true;
42 throw new std::runtime_error("Unexpected type found in input buffer"); 44 throw new std::runtime_error("Unexpected type found in input buffer");
43 } 45 }
44 else 46 else
45 hasType = false; 47 hasType = false;
46 } 48 }
47 49
48 template<class T> 50 template<class T>
49 InputBuffer& ReadString(T& value, ValueType expectedType) 51 InputBuffer& ReadString(T& value, ValueType expectedType)
50 { 52 {
51 CheckType(expectedType); 53 CheckType(expectedType);
52 54
53 uint32_t length; 55 SizeType length;
54 ReadBinary(length); 56 ReadBinary(length);
55 57
56 std::auto_ptr<T::value_type> data(new T::value_type[length]); 58 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); 59 buffer.read(reinterpret_cast<char*>(data.get()), sizeof(T::value_type) * l ength);
58 if (buffer.fail()) 60 if (buffer.fail())
59 throw new std::runtime_error("Unexpected end of input buffer"); 61 throw new std::runtime_error("Unexpected end of input buffer");
60 62
61 value.assign(data.get(), length); 63 value.assign(data.get(), length);
62 return *this; 64 return *this;
63 } 65 }
(...skipping 28 matching lines...) Expand all
92 return buffer.str(); 94 return buffer.str();
93 } 95 }
94 OutputBuffer& operator<<(const std::string& value) { return WriteString(valu e, TYPE_STRING); } 96 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); } 97 OutputBuffer& operator<<(const std::wstring& value) { return WriteString(val ue, TYPE_WSTRING); }
96 OutputBuffer& operator<<(int64_t value) { return Write(value, TYPE_INT64); } 98 OutputBuffer& operator<<(int64_t value) { return Write(value, TYPE_INT64); }
97 OutputBuffer& operator<<(int32_t value) { return Write(value, TYPE_INT32); } 99 OutputBuffer& operator<<(int32_t value) { return Write(value, TYPE_INT32); }
98 OutputBuffer& operator<<(bool value) { return Write(value, TYPE_BOOL); } 100 OutputBuffer& operator<<(bool value) { return Write(value, TYPE_BOOL); }
99 private: 101 private:
100 std::ostringstream buffer; 102 std::ostringstream buffer;
101 103
104 // Disallow copying
105 const OutputBuffer& operator=(const OutputBuffer&);
106
102 template<class T> 107 template<class T>
103 OutputBuffer& WriteString(const T& value, int32_t type) 108 OutputBuffer& WriteString(const T& value, ValueType type)
104 { 109 {
105 WriteBinary(type); 110 WriteBinary(type);
106 111
107 uint32_t length = value.size(); 112 SizeType length = value.size();
108 WriteBinary(length); 113 WriteBinary(length);
109 114
110 buffer.write(reinterpret_cast<const char*>(value.c_str()), sizeof(T::value _type) * length); 115 buffer.write(reinterpret_cast<const char*>(value.c_str()), sizeof(T::value _type) * length);
111 if (buffer.fail()) 116 if (buffer.fail())
112 throw new std::runtime_error("Unexpected error writing to output buffer" ); 117 throw new std::runtime_error("Unexpected error writing to output buffer" );
113 118
114 return *this; 119 return *this;
115 } 120 }
116 121
117 template<class T> 122 template<class T>
118 OutputBuffer& Write(const T value, int32_t type) 123 OutputBuffer& Write(const T value, ValueType type)
Felix Dahlke 2013/06/03 12:23:54 Shouldn't value be passed by reference?
Wladimir Palant 2013/06/03 12:25:55 Given that this function is meant for primitive ty
Felix Dahlke 2013/06/04 06:41:38 Right, didn't think of that. Won't hurt, but it wo
119 { 124 {
120 WriteBinary(type); 125 WriteBinary(type);
121 WriteBinary(value); 126 WriteBinary(value);
122 return *this; 127 return *this;
123 } 128 }
124 129
125 template<class T> 130 template<class T>
126 void WriteBinary(const T& value) 131 void WriteBinary(const T& value)
127 { 132 {
128 buffer.write(reinterpret_cast<const char*>(&value), sizeof(T)); 133 buffer.write(reinterpret_cast<const char*>(&value), sizeof(T));
(...skipping 18 matching lines...) Expand all
147 152
148 InputBuffer ReadMessage(); 153 InputBuffer ReadMessage();
149 void WriteMessage(OutputBuffer& message); 154 void WriteMessage(OutputBuffer& message);
150 155
151 protected: 156 protected:
152 HANDLE pipe; 157 HANDLE pipe;
153 }; 158 };
154 } 159 }
155 160
156 #endif 161 #endif
OLDNEW
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld