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
3// found in the LICENSE file.
4
5#ifndef CHROMEOS_SYSTEM_NAME_VALUE_PAIRS_PARSER_H_
6#define CHROMEOS_SYSTEM_NAME_VALUE_PAIRS_PARSER_H_
7
8#include <map>
9#include <string>
10
11#include "base/basictypes.h"
12#include "chromeos/chromeos_export.h"
13
14namespace base {
15class FilePath;
16}
17
18namespace chromeos {
19namespace system {
20
21// The parser is used to get machine info as name-value pairs. Defined
22// here to be accessible by tests.
23class CHROMEOS_EXPORT NameValuePairsParser {
24 public:
25  typedef std::map<std::string, std::string> NameValueMap;
26
27  // The obtained info will be written into the given map.
28  explicit NameValuePairsParser(NameValueMap* map);
29
30  void AddNameValuePair(const std::string& key, const std::string& value);
31
32  // Executes tool and inserts (key, <output>) into map_.
33  // The program name (argv[0]) should be an absolute path. The function
34  // checks if the program exists before executing it as some programs
35  // don't exist on Linux desktop; returns false in that case.
36  bool GetSingleValueFromTool(int argc, const char* argv[],
37                              const std::string& key);
38
39  // Parses name-value pairs from the file.
40  // Returns false if there was any error in the file. Valid pairs will still be
41  // added to the map.
42  bool GetNameValuePairsFromFile(const base::FilePath& file_path,
43                                 const std::string& eq,
44                                 const std::string& delim);
45
46  // These will parse strings with output in the format:
47  // <key><EQ><value><DELIM>[<key><EQ><value>][...]
48  // e.g. ParseNameValuePairs("key1=value1 key2=value2", "=", " ")
49  // Returns false if there was any error in in_string. Valid pairs will still
50  // be added to the map.
51  bool ParseNameValuePairs(const std::string& in_string,
52                           const std::string& eq,
53                           const std::string& delim);
54
55  // This version allows for values which end with a comment
56  // beginning with comment_delim.
57  // e.g. "key2=value2 # Explanation of value\n"
58  // Returns false if there was any error in in_string. Valid pairs will still
59  // be added to the map.
60  bool ParseNameValuePairsWithComments(const std::string& in_string,
61                                       const std::string& eq,
62                                       const std::string& delim,
63                                       const std::string& comment_delim);
64
65  // Same as ParseNameValuePairsWithComments(), but uses the output of the given
66  // tool as the input to parse.
67  bool ParseNameValuePairsFromTool(
68      int argc,
69      const char* argv[],
70      const std::string& eq,
71      const std::string& delim,
72      const std::string& comment_delim);
73
74 private:
75  NameValueMap* map_;
76
77  DISALLOW_COPY_AND_ASSIGN(NameValuePairsParser);
78};
79
80}  // namespace system
81}  // namespace chromeos
82
83#endif  // CHROMEOS_SYSTEM_NAME_VALUE_PAIRS_PARSER_H_
84