15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)#ifndef CHROMEOS_SYSTEM_NAME_VALUE_PAIRS_PARSER_H_
6a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)#define CHROMEOS_SYSTEM_NAME_VALUE_PAIRS_PARSER_H_
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <map>
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string>
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/basictypes.h"
12a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)#include "chromeos/chromeos_export.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace base {
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class FilePath;
162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace chromeos {
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace system {
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The parser is used to get machine info as name-value pairs. Defined
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// here to be accessible by tests.
23a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)class CHROMEOS_EXPORT NameValuePairsParser {
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  typedef std::map<std::string, std::string> NameValueMap;
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The obtained info will be written into the given map.
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  explicit NameValuePairsParser(NameValueMap* map);
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void AddNameValuePair(const std::string& key, const std::string& value);
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Executes tool and inserts (key, <output>) into map_.
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The program name (argv[0]) should be an absolute path. The function
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // checks if the program exists before executing it as some programs
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // don't exist on Linux desktop; returns false in that case.
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool GetSingleValueFromTool(int argc, const char* argv[],
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              const std::string& key);
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Parses name-value pairs from the file.
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns false if there was any error in the file. Valid pairs will still be
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // added to the map.
422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool GetNameValuePairsFromFile(const base::FilePath& file_path,
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                 const std::string& eq,
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                 const std::string& delim);
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // These will parse strings with output in the format:
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // <key><EQ><value><DELIM>[<key><EQ><value>][...]
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // e.g. ParseNameValuePairs("key1=value1 key2=value2", "=", " ")
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns false if there was any error in in_string. Valid pairs will still
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // be added to the map.
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool ParseNameValuePairs(const std::string& in_string,
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           const std::string& eq,
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           const std::string& delim);
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // This version allows for values which end with a comment
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // beginning with comment_delim.
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // e.g. "key2=value2 # Explanation of value\n"
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns false if there was any error in in_string. Valid pairs will still
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // be added to the map.
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool ParseNameValuePairsWithComments(const std::string& in_string,
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                       const std::string& eq,
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                       const std::string& delim,
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                       const std::string& comment_delim);
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Same as ParseNameValuePairsWithComments(), but uses the output of the given
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // tool as the input to parse.
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool ParseNameValuePairsFromTool(
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      int argc,
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const char* argv[],
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const std::string& eq,
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const std::string& delim,
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const std::string& comment_delim);
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NameValueMap* map_;
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(NameValuePairsParser);
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace system
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace chromeos
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
83a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)#endif  // CHROMEOS_SYSTEM_NAME_VALUE_PAIRS_PARSER_H_
84