• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright 2015 The Chromium OS Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 
5 #ifndef CHROMIUMOS_WIDE_PROFILING_DATA_READER_H_
6 #define CHROMIUMOS_WIDE_PROFILING_DATA_READER_H_
7 
8 #include <stddef.h>
9 #include <stdint.h>
10 
11 #include "binary_data_utils.h"
12 #include "compat/string.h"
13 
14 namespace quipper {
15 
16 class DataReader {
17  public:
DataReader()18   DataReader() : is_cross_endian_(false) {}
~DataReader()19   virtual ~DataReader() {}
20 
21   // Moves the data read pointer to |offset| bytes from the beginning of the
22   // data.
23   virtual void SeekSet(size_t offset) = 0;
24 
25   // Returns the position of the data read pointer, in bytes from the beginning
26   // of the data.
27   virtual size_t Tell() const = 0;
28 
size()29   virtual size_t size() const { return size_; }
30 
31   // Reads raw data into |dest|. Returns true if it managed to read |size|
32   // bytes.
33   virtual bool ReadData(const size_t size, void* dest) = 0;
34 
35   // Reads raw data into a string.
36   virtual bool ReadDataString(const size_t size, string* dest);
37 
38   // Like ReadData(), but prints an error if it doesn't read all |size| bytes.
39   virtual bool ReadDataValue(const size_t size, const string& value_name,
40                              void* dest);
41 
42   // Read integers with endian swapping.
ReadUint16(uint16_t * value)43   bool ReadUint16(uint16_t* value) { return ReadIntValue(value); }
ReadUint32(uint32_t * value)44   bool ReadUint32(uint32_t* value) { return ReadIntValue(value); }
ReadUint64(uint64_t * value)45   bool ReadUint64(uint64_t* value) { return ReadIntValue(value); }
46 
47   // Read a string. Returns true if it managed to read |size| bytes (excluding
48   // null terminator). The actual string may be shorter than the number of bytes
49   // requested.
50   virtual bool ReadString(const size_t size, string* str) = 0;
51 
52   // Reads a string from data into |dest| at the current offset. The string in
53   // data is prefixed with a 32-bit size field. The size() of |*dest| after the
54   // read will be the null-terminated string length of the underlying string
55   // data, and not necessarily the same as the size field in the data.
56   bool ReadStringWithSizeFromData(string* dest);
57 
is_cross_endian()58   bool is_cross_endian() const { return is_cross_endian_; }
59 
set_is_cross_endian(bool value)60   void set_is_cross_endian(bool value) { is_cross_endian_ = value; }
61 
62  protected:
63   // Size of the data source.
64   size_t size_;
65 
66  private:
67   // Like ReadData(), but used specifically to read integers. Will swap byte
68   // order if necessary.
69   // For type-safety this one private and let public member functions call it.
70   template <typename T>
ReadIntValue(T * dest)71   bool ReadIntValue(T* dest) {
72     if (!ReadData(sizeof(T), dest)) return false;
73     *dest = MaybeSwap(*dest, is_cross_endian_);
74     return true;
75   }
76 
77   // For cross-endian data reading.
78   bool is_cross_endian_;
79 };
80 
81 }  // namespace quipper
82 
83 #endif  // CHROMIUMOS_WIDE_PROFILING_DATA_READER_H_
84