File: name_value_pairs_parser.h

package info (click to toggle)
chromium 139.0.7258.127-1
  • links: PTS, VCS
  • area: main
  • in suites:
  • size: 6,122,068 kB
  • sloc: cpp: 35,100,771; ansic: 7,163,530; javascript: 4,103,002; python: 1,436,920; asm: 946,517; xml: 746,709; pascal: 187,653; perl: 88,691; sh: 88,436; objc: 79,953; sql: 51,488; cs: 44,583; fortran: 24,137; makefile: 22,147; tcl: 15,277; php: 13,980; yacc: 8,984; ruby: 7,485; awk: 3,720; lisp: 3,096; lex: 1,327; ada: 727; jsp: 228; sed: 36
file content (103 lines) | stat: -rw-r--r-- 4,026 bytes parent folder | download | duplicates (6)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
// Copyright 2012 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef CHROMEOS_ASH_COMPONENTS_SYSTEM_NAME_VALUE_PAIRS_PARSER_H_
#define CHROMEOS_ASH_COMPONENTS_SYSTEM_NAME_VALUE_PAIRS_PARSER_H_

#include <string>
#include <vector>

#include "base/command_line.h"
#include "base/component_export.h"
#include "base/containers/flat_map.h"
#include "base/gtest_prod_util.h"
#include "base/memory/raw_ptr.h"

namespace base {
class FilePath;
}

namespace ash::system {

// The name value pairs formats the parser understands.
enum class NameValuePairsFormat {
  // Values produced by the VPD filtering tool.
  // Each key and value is surrounded by double quotes ('"'), and separated by
  // an equal ('=') sign. There is no whitespace around the quoted key or value.
  kVpdDump,
  // Values produced by write-machine-info in the machine-info file.
  // The base for this format is that of |kVpdDump|, with the additional
  // provision that keys may be unquoted.
  kMachineInfo,
  // Values produced by the crossystem tool.
  // Each key and value is unquoted, and separated by an equal ('=') sign.
  // Whitespace is allowed, and used, around key and value, and is not part of
  // either. Comments are supported and start with a sharp ('#') character and
  // run to the end of the line.
  kCrossystem
};

// The parser is used to get machine info as name-value pairs. Defined here to
// be accessible by tests.
class COMPONENT_EXPORT(CHROMEOS_ASH_COMPONENTS_SYSTEM) NameValuePairsParser {
 public:
  using NameValueMap = base::flat_map<std::string, std::string>;

  // The obtained info will be written into the given map.
  explicit NameValuePairsParser(NameValueMap* map);

  ~NameValuePairsParser();

  NameValuePairsParser(const NameValuePairsParser&) = delete;
  NameValuePairsParser& operator=(const NameValuePairsParser&) = delete;

  // Parses name-value pairs in the specified |format| from a file.
  //
  // Returns false if there was any error when parsing the file. Valid pairs
  // will still be added to the map.
  bool ParseNameValuePairsFromFile(const base::FilePath& file_path,
                                   NameValuePairsFormat format);

  // Parses name-value pairs in the specified |format| from the standard output
  // of a tool invocation specified by |command|.
  //
  // Returns false if there was any error in the command invocation or when
  // parsing its output. Valid pairs will still be added to the map.
  bool ParseNameValuePairsFromTool(const base::CommandLine& command,
                                   NameValuePairsFormat format);

  // Parses name-value pairs in the specified |format| from a string.
  //
  // Returns false if there was any error in the command invocation or when
  // parsing its output. Valid pairs will still be added to the map.
  bool ParseNameValuePairsFromString(const std::string& string,
                                     NameValuePairsFormat format);

  // Delete all pairs with |value|.
  void DeletePairsWithValue(const std::string& value);

 private:
  FRIEND_TEST_ALL_PREFIXES(VpdDumpNameValuePairsParserTest,
                           TestParseNameValuePairs);
  FRIEND_TEST_ALL_PREFIXES(NameValuePairsParser,
                           TestParseNameValuePairsInVpdDumpFormat);
  FRIEND_TEST_ALL_PREFIXES(NameValuePairsParser, TestParseErrorInVpdDumpFormat);
  FRIEND_TEST_ALL_PREFIXES(NameValuePairsParser,
                           TestParseNameValuePairsInMachineInfoFormat);
  FRIEND_TEST_ALL_PREFIXES(NameValuePairsParser,
                           TestParseNameValuePairsFromCrossytemTool);

  friend class NameValuePairsParserFuzzer;

  void AddNameValuePair(const std::string& key, const std::string& value);

  bool ParseNameValuePairs(const std::string& input,
                           NameValuePairsFormat format);

  raw_ptr<NameValueMap> map_;
};

}  // namespace ash::system

#endif  // CHROMEOS_ASH_COMPONENTS_SYSTEM_NAME_VALUE_PAIRS_PARSER_H_