OLD | NEW |
---|---|
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #ifndef BASE_PICKLE_H__ | 5 #ifndef BASE_PICKLE_H__ |
6 #define BASE_PICKLE_H__ | 6 #define BASE_PICKLE_H__ |
7 | 7 |
8 #include <string> | 8 #include <string> |
9 | 9 |
10 #include "base/base_export.h" | 10 #include "base/base_export.h" |
11 #include "base/basictypes.h" | 11 #include "base/basictypes.h" |
12 #include "base/compiler_specific.h" | 12 #include "base/compiler_specific.h" |
13 #include "base/gtest_prod_util.h" | 13 #include "base/gtest_prod_util.h" |
14 #include "base/logging.h" | 14 #include "base/logging.h" |
15 #include "base/strings/string16.h" | 15 #include "base/strings/string16.h" |
16 | 16 |
17 class Pickle; | 17 class Pickle; |
18 | 18 |
19 // PickleIterator reads data from a Pickle. The Pickle object must remain valid | 19 // PickleIterator reads data from a Pickle. The Pickle object must remain valid |
20 // while the PickleIterator object is in use. | 20 // while the PickleIterator object is in use. |
21 class BASE_EXPORT PickleIterator { | 21 class BASE_EXPORT PickleIterator { |
22 public: | 22 public: |
23 PickleIterator() : read_ptr_(NULL), read_end_ptr_(NULL) {} | 23 PickleIterator() : payload_ptr_(NULL), read_index_(0), end_index_(0) {} |
24 explicit PickleIterator(const Pickle& pickle); | 24 explicit PickleIterator(const Pickle& pickle); |
25 | 25 |
26 // Methods for reading the payload of the Pickle. To read from the start of | 26 // Methods for reading the payload of the Pickle. To read from the start of |
27 // the Pickle, create a PickleIterator from a Pickle. If successful, these | 27 // the Pickle, create a PickleIterator from a Pickle. If successful, these |
28 // methods return true. Otherwise, false is returned to indicate that the | 28 // methods return true. Otherwise, false is returned to indicate that the |
29 // result could not be extracted. | 29 // result could not be extracted. It is not possible to read from iterator |
30 // after that. | |
30 bool ReadBool(bool* result) WARN_UNUSED_RESULT; | 31 bool ReadBool(bool* result) WARN_UNUSED_RESULT; |
31 bool ReadInt(int* result) WARN_UNUSED_RESULT; | 32 bool ReadInt(int* result) WARN_UNUSED_RESULT; |
32 bool ReadLong(long* result) WARN_UNUSED_RESULT; | 33 bool ReadLong(long* result) WARN_UNUSED_RESULT; |
33 bool ReadUInt16(uint16* result) WARN_UNUSED_RESULT; | 34 bool ReadUInt16(uint16* result) WARN_UNUSED_RESULT; |
34 bool ReadUInt32(uint32* result) WARN_UNUSED_RESULT; | 35 bool ReadUInt32(uint32* result) WARN_UNUSED_RESULT; |
35 bool ReadInt64(int64* result) WARN_UNUSED_RESULT; | 36 bool ReadInt64(int64* result) WARN_UNUSED_RESULT; |
36 bool ReadUInt64(uint64* result) WARN_UNUSED_RESULT; | 37 bool ReadUInt64(uint64* result) WARN_UNUSED_RESULT; |
37 bool ReadFloat(float* result) WARN_UNUSED_RESULT; | 38 bool ReadFloat(float* result) WARN_UNUSED_RESULT; |
38 bool ReadString(std::string* result) WARN_UNUSED_RESULT; | 39 bool ReadString(std::string* result) WARN_UNUSED_RESULT; |
39 bool ReadWString(std::wstring* result) WARN_UNUSED_RESULT; | 40 bool ReadWString(std::wstring* result) WARN_UNUSED_RESULT; |
(...skipping 16 matching lines...) Expand all Loading... | |
56 private: | 57 private: |
57 // Aligns 'i' by rounding it up to the next multiple of 'alignment' | 58 // Aligns 'i' by rounding it up to the next multiple of 'alignment' |
58 static size_t AlignInt(size_t i, int alignment) { | 59 static size_t AlignInt(size_t i, int alignment) { |
59 return i + (alignment - (i % alignment)) % alignment; | 60 return i + (alignment - (i % alignment)) % alignment; |
60 } | 61 } |
61 | 62 |
62 // Read Type from Pickle. | 63 // Read Type from Pickle. |
63 template <typename Type> | 64 template <typename Type> |
64 inline bool ReadBuiltinType(Type* result); | 65 inline bool ReadBuiltinType(Type* result); |
65 | 66 |
67 // Advance read_index_ but do not allow it to exceed end_index_. | |
68 // Keeps read_index_ aligned. | |
69 inline void Advance(size_t size); | |
70 | |
66 // Get read pointer for Type and advance read pointer. | 71 // Get read pointer for Type and advance read pointer. |
67 template<typename Type> | 72 template<typename Type> |
68 inline const char* GetReadPointerAndAdvance(); | 73 inline const char* GetReadPointerAndAdvance(); |
69 | 74 |
70 // Get read pointer for |num_bytes| and advance read pointer. This method | 75 // Get read pointer for |num_bytes| and advance read pointer. This method |
71 // checks num_bytes for negativity and wrapping. | 76 // checks num_bytes for negativity and wrapping. |
72 const char* GetReadPointerAndAdvance(int num_bytes); | 77 const char* GetReadPointerAndAdvance(int num_bytes); |
73 | 78 |
74 // Get read pointer for (num_elements * size_element) bytes and advance read | 79 // Get read pointer for (num_elements * size_element) bytes and advance read |
75 // pointer. This method checks for int overflow, negativity and wrapping. | 80 // pointer. This method checks for int overflow, negativity and wrapping. |
76 inline const char* GetReadPointerAndAdvance(int num_elements, | 81 inline const char* GetReadPointerAndAdvance(int num_elements, |
77 size_t size_element); | 82 size_t size_element); |
78 | 83 |
79 // Pointers to the Pickle data. | 84 // Pointers to the Pickle data. |
80 const char* read_ptr_; | 85 const char* payload_ptr_; |
jar (doing other things)
2014/05/29 01:51:16
nit: Now that we're not advancing this ptr, perha
halyavin
2014/05/29 07:34:55
Done.
| |
81 const char* read_end_ptr_; | 86 size_t read_index_; |
87 size_t end_index_; | |
82 | 88 |
83 FRIEND_TEST_ALL_PREFIXES(PickleTest, GetReadPointerAndAdvance); | 89 FRIEND_TEST_ALL_PREFIXES(PickleTest, GetReadPointerAndAdvance); |
84 }; | 90 }; |
85 | 91 |
86 // This class provides facilities for basic binary value packing and unpacking. | 92 // This class provides facilities for basic binary value packing and unpacking. |
87 // | 93 // |
88 // The Pickle class supports appending primitive values (ints, strings, etc.) | 94 // The Pickle class supports appending primitive values (ints, strings, etc.) |
89 // to a pickle instance. The Pickle instance grows its internal memory buffer | 95 // to a pickle instance. The Pickle instance grows its internal memory buffer |
90 // dynamically to hold the sequence of primitive values. The internal memory | 96 // dynamically to hold the sequence of primitive values. The internal memory |
91 // buffer is exposed as the "data" of the Pickle. This "data" can be passed | 97 // buffer is exposed as the "data" of the Pickle. This "data" can be passed |
(...skipping 178 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
270 DCHECK_EQ(header_size_, sizeof(T)); | 276 DCHECK_EQ(header_size_, sizeof(T)); |
271 return static_cast<T*>(header_); | 277 return static_cast<T*>(header_); |
272 } | 278 } |
273 template <class T> | 279 template <class T> |
274 const T* headerT() const { | 280 const T* headerT() const { |
275 DCHECK_EQ(header_size_, sizeof(T)); | 281 DCHECK_EQ(header_size_, sizeof(T)); |
276 return static_cast<const T*>(header_); | 282 return static_cast<const T*>(header_); |
277 } | 283 } |
278 | 284 |
279 // The payload is the pickle data immediately following the header. | 285 // The payload is the pickle data immediately following the header. |
280 size_t payload_size() const { return header_->payload_size; } | 286 size_t payload_size() const { |
287 return header_ ? header_->payload_size : 0; | |
288 } | |
281 | 289 |
282 const char* payload() const { | 290 const char* payload() const { |
283 return reinterpret_cast<const char*>(header_) + header_size_; | 291 return reinterpret_cast<const char*>(header_) + header_size_; |
284 } | 292 } |
285 | 293 |
286 // Returns the address of the byte immediately following the currently valid | 294 // Returns the address of the byte immediately following the currently valid |
287 // header + payload. | 295 // header + payload. |
288 const char* end_of_payload() const { | 296 const char* end_of_payload() const { |
289 // This object may be invalid. | 297 // This object may be invalid. |
290 return header_ ? payload() + payload_size() : NULL; | 298 return header_ ? payload() + payload_size() : NULL; |
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
339 } | 347 } |
340 inline void WriteBytesCommon(const void* data, size_t length); | 348 inline void WriteBytesCommon(const void* data, size_t length); |
341 | 349 |
342 FRIEND_TEST_ALL_PREFIXES(PickleTest, Resize); | 350 FRIEND_TEST_ALL_PREFIXES(PickleTest, Resize); |
343 FRIEND_TEST_ALL_PREFIXES(PickleTest, FindNext); | 351 FRIEND_TEST_ALL_PREFIXES(PickleTest, FindNext); |
344 FRIEND_TEST_ALL_PREFIXES(PickleTest, FindNextWithIncompleteHeader); | 352 FRIEND_TEST_ALL_PREFIXES(PickleTest, FindNextWithIncompleteHeader); |
345 FRIEND_TEST_ALL_PREFIXES(PickleTest, FindNextOverflow); | 353 FRIEND_TEST_ALL_PREFIXES(PickleTest, FindNextOverflow); |
346 }; | 354 }; |
347 | 355 |
348 #endif // BASE_PICKLE_H__ | 356 #endif // BASE_PICKLE_H__ |
OLD | NEW |