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