Home | History | Annotate | Download | only in chromeos
      1 // Copyright (c) 2011 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 #include "chrome/browser/chromeos/name_value_pairs_parser.h"
      6 
      7 #include "base/command_line.h"
      8 #include "base/logging.h"
      9 #include "base/process_util.h"
     10 #include "base/string_tokenizer.h"
     11 #include "base/string_util.h"
     12 #include "base/threading/thread_restrictions.h"
     13 
     14 namespace chromeos {  // NOLINT
     15 
     16 namespace {
     17 
     18 const char kQuoteChars[] = "\"";
     19 
     20 }  // namespace
     21 
     22 NameValuePairsParser::NameValuePairsParser(NameValueMap* map)
     23     : map_(map) {
     24 }
     25 
     26 void NameValuePairsParser::AddNameValuePair(const std::string& key,
     27                                             const std::string& value) {
     28   (*map_)[key] = value;
     29   VLOG(1) << "name: " << key << ", value: " << value;
     30 }
     31 
     32 bool NameValuePairsParser::ParseNameValuePairs(const std::string& in_string,
     33                                                const std::string& eq,
     34                                                const std::string& delim) {
     35   // Set up the pair tokenizer.
     36   StringTokenizer pair_toks(in_string, delim);
     37   pair_toks.set_quote_chars(kQuoteChars);
     38   // Process token pairs.
     39   while (pair_toks.GetNext()) {
     40     std::string pair(pair_toks.token());
     41     if (pair.find(eq) == 0) {
     42       LOG(WARNING) << "Empty key: '" << pair << "'. Aborting.";
     43       return false;
     44     }
     45     StringTokenizer keyvalue(pair, eq);
     46     std::string key,value;
     47     if (keyvalue.GetNext()) {
     48       TrimString(keyvalue.token(), kQuoteChars, &key);
     49       if (keyvalue.GetNext()) {
     50         TrimString(keyvalue.token(), kQuoteChars, &value);
     51         if (keyvalue.GetNext()) {
     52           LOG(WARNING) << "Multiple key tokens: '" << pair << "'. Aborting.";
     53           return false;
     54         }
     55       }
     56     }
     57     if (key.empty()) {
     58       LOG(WARNING) << "Invalid token pair: '" << pair << "'. Aborting.";
     59       return false;
     60     }
     61     AddNameValuePair(key, value);
     62   }
     63   return true;
     64 }
     65 
     66 bool NameValuePairsParser::GetSingleValueFromTool(int argc,
     67                                                   const char* argv[],
     68                                                   const std::string& key) {
     69   CommandLine command_line(argc, argv);
     70   std::string output_string;
     71   // TODO(stevenjb,satorux): Make this non blocking: crosbug.com/5603.
     72   base::ThreadRestrictions::ScopedAllowIO allow_io_for_thread_join;
     73   if (argc < 1 || !base::GetAppOutput(command_line, &output_string)) {
     74     LOG(WARNING) << "Error excuting: " << command_line.command_line_string();
     75     return false;
     76   }
     77   TrimWhitespaceASCII(output_string, TRIM_ALL, &output_string);
     78   AddNameValuePair(key, output_string);
     79   return true;
     80 }
     81 
     82 bool NameValuePairsParser::ParseNameValuePairsFromTool(
     83     int argc,
     84     const char* argv[],
     85     const std::string& eq,
     86     const std::string& delim) {
     87   CommandLine command_line(argc, argv);
     88   std::string output_string;
     89   // TODO(stevenjb,satorux): Make this non blocking: crosbug.com/5603.
     90   base::ThreadRestrictions::ScopedAllowIO allow_io_for_thread_join;
     91   if (argc < 1 || !base::GetAppOutput(command_line, &output_string)) {
     92     LOG(WARNING) << "Error excuting: " << command_line.command_line_string();
     93     return false;
     94   }
     95   if (!ParseNameValuePairs(output_string, eq, delim)) {
     96     LOG(WARNING) << "Error parsing values while excuting: "
     97                  << command_line.command_line_string();
     98     return false;
     99   }
    100   return true;
    101 }
    102 
    103 }  // namespace chromeos
    104