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

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

Issue 4882650246414336: Issue 2005 - Refactor working with strings in InputBuffer and OutputBuffer
Patch Set: rebase Created April 2, 2015, 11:09 a.m.
Left:
Right:
Use n/p to move between diff chunks; N/P to move between comments.
Jump to:
View unified diff | Download patch
OLDNEW
1 /* 1 /*
2 * This file is part of Adblock Plus <https://adblockplus.org/>, 2 * This file is part of Adblock Plus <https://adblockplus.org/>,
3 * Copyright (C) 2006-2015 Eyeo GmbH 3 * Copyright (C) 2006-2015 Eyeo GmbH
4 * 4 *
5 * Adblock Plus is free software: you can redistribute it and/or modify 5 * Adblock Plus is free software: you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License version 3 as 6 * it under the terms of the GNU General Public License version 3 as
7 * published by the Free Software Foundation. 7 * published by the Free Software Foundation.
8 * 8 *
9 * Adblock Plus is distributed in the hope that it will be useful, 9 * Adblock Plus is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of 10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 * GNU General Public License for more details. 12 * GNU General Public License for more details.
13 * 13 *
14 * You should have received a copy of the GNU General Public License 14 * You should have received a copy of the GNU General Public License
15 * along with Adblock Plus. If not, see <http://www.gnu.org/licenses/>. 15 * along with Adblock Plus. If not, see <http://www.gnu.org/licenses/>.
16 */ 16 */
17 17
18 #ifndef COMMUNICATION_H 18 #ifndef COMMUNICATION_H
19 #define COMMUNICATION_H 19 #define COMMUNICATION_H
20 20
21 #include <memory> 21 #include <memory>
22 #include <sstream> 22 #include <sstream>
23 #include <stdexcept> 23 #include <stdexcept>
24 #include <stdint.h> 24 #include <stdint.h>
25 #include <string> 25 #include <string>
26 #include <vector> 26 #include <vector>
27 #include <Windows.h> 27 #include <Windows.h>
28 #include "Utils.h"
28 29
29 namespace Communication 30 namespace Communication
30 { 31 {
31 extern const std::wstring pipeName; 32 extern const std::wstring pipeName;
32 extern std::wstring browserSID; 33 extern std::wstring browserSID;
33 34
34 enum ProcType : uint32_t { 35 enum ProcType : uint32_t {
35 PROC_MATCHES, 36 PROC_MATCHES,
36 PROC_GET_ELEMHIDE_SELECTORS, 37 PROC_GET_ELEMHIDE_SELECTORS,
37 PROC_AVAILABLE_SUBSCRIPTIONS, 38 PROC_AVAILABLE_SUBSCRIPTIONS,
(...skipping 10 matching lines...) Expand all
48 PROC_SET_PREF, 49 PROC_SET_PREF,
49 PROC_GET_PREF, 50 PROC_GET_PREF,
50 PROC_IS_FIRST_RUN_ACTION_NEEDED, 51 PROC_IS_FIRST_RUN_ACTION_NEEDED,
51 PROC_CHECK_FOR_UPDATES, 52 PROC_CHECK_FOR_UPDATES,
52 PROC_GET_DOCUMENTATION_LINK, 53 PROC_GET_DOCUMENTATION_LINK,
53 PROC_TOGGLE_PLUGIN_ENABLED, 54 PROC_TOGGLE_PLUGIN_ENABLED,
54 PROC_GET_HOST, 55 PROC_GET_HOST,
55 PROC_COMPARE_VERSIONS 56 PROC_COMPARE_VERSIONS
56 }; 57 };
57 enum ValueType : uint32_t { 58 enum ValueType : uint32_t {
58 TYPE_PROC, TYPE_STRING, TYPE_WSTRING, TYPE_INT64, TYPE_INT32, TYPE_BOOL, TYP E_STRINGS 59 TYPE_PROC, TYPE_STRING, TYPE_INT64, TYPE_INT32, TYPE_BOOL, TYPE_STRINGS
59 }; 60 };
60 typedef uint32_t SizeType; 61 typedef uint32_t SizeType;
61 62
62 class InputBuffer 63 class InputBuffer
63 { 64 {
64 public: 65 public:
65 InputBuffer() : buffer(), hasType(false) {} 66 InputBuffer() : buffer(), hasType(false) {}
66 InputBuffer(const std::string& data) : buffer(data), hasType(false) {} 67 InputBuffer(const std::string& data) : buffer(data), hasType(false) {}
67 InputBuffer(const InputBuffer& copy) 68 InputBuffer(const InputBuffer& copy)
68 { 69 {
69 hasType = copy.hasType; 70 hasType = copy.hasType;
70 buffer = std::istringstream(copy.buffer.str()); 71 buffer = std::istringstream(copy.buffer.str());
71 currentType = copy.currentType; 72 currentType = copy.currentType;
72 } 73 }
73 InputBuffer& operator>>(ProcType& value) { return Read(value, TYPE_PROC); } 74 InputBuffer& operator>>(ProcType& value) { return Read(value, TYPE_PROC); }
74 InputBuffer& operator>>(std::string& value) { return ReadString(value, TYPE_ STRING); } 75 InputBuffer& operator>>(std::string& value) { return ReadString(value); }
75 InputBuffer& operator>>(std::wstring& value) { return ReadString(value, TYPE _WSTRING); } 76 InputBuffer& operator>>(std::wstring& value)
77 {
78 std::string tmpString;
79 operator>>(tmpString);
80 value = ToUtf16String(tmpString);
81 return *this;
82 }
76 InputBuffer& operator>>(int64_t& value) { return Read(value, TYPE_INT64); } 83 InputBuffer& operator>>(int64_t& value) { return Read(value, TYPE_INT64); }
77 InputBuffer& operator>>(int32_t& value) { return Read(value, TYPE_INT32); } 84 InputBuffer& operator>>(int32_t& value) { return Read(value, TYPE_INT32); }
78 InputBuffer& operator>>(bool& value) { return Read(value, TYPE_BOOL); } 85 InputBuffer& operator>>(bool& value) { return Read(value, TYPE_BOOL); }
79 InputBuffer& operator>>(std::vector<std::string>& value) { return ReadString s(value); } 86 InputBuffer& operator>>(std::vector<std::string>& value) { return ReadString s(value); }
87 InputBuffer& operator>>(std::vector<std::wstring>& value)
88 {
89 std::vector<std::string> tmpStrings;
90 operator>>(tmpStrings);
91 value = ToUtf16Strings(tmpStrings);
92 return *this;
93 }
80 InputBuffer& operator=(const InputBuffer& copy) 94 InputBuffer& operator=(const InputBuffer& copy)
81 { 95 {
82 hasType = copy.hasType; 96 hasType = copy.hasType;
83 buffer = std::istringstream(copy.buffer.str()); 97 buffer = std::istringstream(copy.buffer.str());
84 currentType = copy.currentType; 98 currentType = copy.currentType;
85 return *this; 99 return *this;
86 } 100 }
87 ValueType GetType(); 101 ValueType GetType();
88 private: 102 private:
89 std::istringstream buffer; 103 std::istringstream buffer;
90 ValueType currentType; 104 ValueType currentType;
91 bool hasType; 105 bool hasType;
92 106
93 void CheckType(ValueType expectedType); 107 void CheckType(ValueType expectedType);
94 108
95 template<class T> 109 InputBuffer& ReadString(std::string& value)
96 InputBuffer& ReadString(T& value, ValueType expectedType)
97 { 110 {
98 CheckType(expectedType); 111 CheckType(TYPE_STRING);
99 112
100 SizeType length; 113 SizeType length;
101 ReadBinary(length); 114 ReadBinary(length);
102 115 value.resize(length);
103 std::auto_ptr<T::value_type> data(new T::value_type[length]); 116 if (length > 0)
104 buffer.read(reinterpret_cast<char*>(data.get()), sizeof(T::value_type) * l ength); 117 {
105 if (buffer.fail()) 118 buffer.read(&value[0], length);
106 throw new std::runtime_error("Unexpected end of input buffer"); 119 if (buffer.fail())
107 120 throw new std::runtime_error("Unexpected end of input buffer");
108 value.assign(data.get(), length); 121 }
109 return *this; 122 return *this;
110 } 123 }
111 124
112 InputBuffer& ReadStrings(std::vector<std::string>& value) 125 InputBuffer& ReadStrings(std::vector<std::string>& value)
113 { 126 {
114 value.clear(); 127 value.clear();
115 CheckType(ValueType::TYPE_STRINGS); 128 CheckType(ValueType::TYPE_STRINGS);
116 129
117 SizeType length; 130 SizeType length;
118 ReadBinary(length); 131 ReadBinary(length);
(...skipping 29 matching lines...) Expand all
148 OutputBuffer() {} 161 OutputBuffer() {}
149 162
150 // Explicit copy constructor to allow returning OutputBuffer by value 163 // Explicit copy constructor to allow returning OutputBuffer by value
151 OutputBuffer(const OutputBuffer& copy) : buffer(copy.buffer.str()) {} 164 OutputBuffer(const OutputBuffer& copy) : buffer(copy.buffer.str()) {}
152 165
153 std::string Get() 166 std::string Get()
154 { 167 {
155 return buffer.str(); 168 return buffer.str();
156 } 169 }
157 OutputBuffer& operator<<(ProcType value) { return Write(value, TYPE_PROC); } 170 OutputBuffer& operator<<(ProcType value) { return Write(value, TYPE_PROC); }
158 OutputBuffer& operator<<(const std::string& value) { return WriteString(valu e, TYPE_STRING); } 171 OutputBuffer& operator<<(const std::string& value) { return WriteString(valu e); }
159 OutputBuffer& operator<<(const std::wstring& value) { return WriteString(val ue, TYPE_WSTRING); } 172 OutputBuffer& operator<<(const std::wstring& value)
173 {
174 return operator<<(ToUtf8String(value));
175 }
160 OutputBuffer& operator<<(int64_t value) { return Write(value, TYPE_INT64); } 176 OutputBuffer& operator<<(int64_t value) { return Write(value, TYPE_INT64); }
161 OutputBuffer& operator<<(int32_t value) { return Write(value, TYPE_INT32); } 177 OutputBuffer& operator<<(int32_t value) { return Write(value, TYPE_INT32); }
162 OutputBuffer& operator<<(bool value) { return Write(value, TYPE_BOOL); } 178 OutputBuffer& operator<<(bool value) { return Write(value, TYPE_BOOL); }
163 OutputBuffer& operator<<(const std::vector<std::string>& value) { return Wri teStrings(value); } 179 OutputBuffer& operator<<(const std::vector<std::string>& value) { return Wri teStrings(value); }
164 private: 180 private:
165 std::ostringstream buffer; 181 std::ostringstream buffer;
166 182
167 // Disallow copying 183 // Disallow copying
168 const OutputBuffer& operator=(const OutputBuffer&); 184 const OutputBuffer& operator=(const OutputBuffer&);
169 185
170 template<class T> 186 OutputBuffer& WriteString(const std::string& value)
171 OutputBuffer& WriteString(const T& value, ValueType type)
172 { 187 {
173 WriteBinary(type); 188 WriteBinary(TYPE_STRING);
174 189
175 SizeType length = static_cast<SizeType>(value.size()); 190 SizeType length = static_cast<SizeType>(value.size());
176 WriteBinary(length); 191 WriteBinary(length);
177 192 buffer.write(value.c_str(), length);
178 buffer.write(reinterpret_cast<const char*>(value.c_str()), sizeof(T::value _type) * length);
179 if (buffer.fail()) 193 if (buffer.fail())
180 throw new std::runtime_error("Unexpected error writing to output buffer" ); 194 throw new std::runtime_error("Unexpected error writing to output buffer" );
181 195
182 return *this; 196 return *this;
183 } 197 }
184 198
185 OutputBuffer& WriteStrings(const std::vector<std::string>& value) 199 OutputBuffer& WriteStrings(const std::vector<std::string>& value)
186 { 200 {
187 WriteBinary(ValueType::TYPE_STRINGS); 201 WriteBinary(ValueType::TYPE_STRINGS);
188 WriteBinary(static_cast<SizeType>(value.size())); 202 WriteBinary(static_cast<SizeType>(value.size()));
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after
238 252
239 InputBuffer ReadMessage(); 253 InputBuffer ReadMessage();
240 void WriteMessage(OutputBuffer& message); 254 void WriteMessage(OutputBuffer& message);
241 255
242 protected: 256 protected:
243 HANDLE pipe; 257 HANDLE pipe;
244 }; 258 };
245 } 259 }
246 260
247 #endif 261 #endif
OLDNEW

Powered by Google App Engine
This is Rietveld