Index: chrome/browser/speech/speech_recognition_request.cc |
diff --git a/chrome/browser/speech/speech_recognition_request.cc b/chrome/browser/speech/speech_recognition_request.cc |
index adf473facd2a4022721b4fc41e141844dc6bb6c6..60ace07acb127ee903a5bb9189ca21ecad2531c9 100644 |
--- a/chrome/browser/speech/speech_recognition_request.cc |
+++ b/chrome/browser/speech/speech_recognition_request.cc |
@@ -16,10 +16,10 @@ namespace { |
const char* const kHypothesesString = "hypotheses"; |
const char* const kUtteranceString = "utterance"; |
+const char* const kConfidenceString = "confidence"; |
-bool ParseServerResponse(const std::string& response_body, string16* value) { |
- DCHECK(value); |
- |
+bool ParseServerResponse(const std::string& response_body, |
+ speech_input::SpeechInputResultArray* result) { |
if (response_body.empty()) { |
LOG(WARNING) << "ParseServerResponse: Response was empty."; |
return false; |
@@ -61,21 +61,38 @@ bool ParseServerResponse(const std::string& response_body, string16* value) { |
return false; |
} |
- Value* first_hypotheses = NULL; |
- if (!hypotheses_list->Get(0, &first_hypotheses)) { |
- LOG(WARNING) << "ParseServerResponse: Unable to read hypotheses value."; |
- return false; |
+ size_t index = 0; |
+ for (; index < hypotheses_list->GetSize(); ++index) { |
+ Value* hypothesis = NULL; |
+ if (!hypotheses_list->Get(index, &hypothesis)) { |
+ LOG(WARNING) << "ParseServerResponse: Unable to read hypothesis value."; |
+ break; |
+ } |
+ DCHECK(hypothesis); |
+ if (!hypothesis->IsType(Value::TYPE_DICTIONARY)) { |
+ LOG(WARNING) << "ParseServerResponse: Unexpected value type " |
+ << hypothesis->GetType(); |
+ break; |
+ } |
+ |
+ const DictionaryValue* hypothesis_value = |
+ static_cast<DictionaryValue*>(hypothesis); |
+ string16 utterance; |
+ if (!hypothesis_value->GetString(kUtteranceString, &utterance)) { |
+ LOG(WARNING) << "ParseServerResponse: Missing utterance value."; |
+ break; |
+ } |
+ |
+ // It is not an error if the 'confidence' field is missing. |
+ double confidence = 0.0; |
+ hypothesis_value->GetReal(kConfidenceString, &confidence); |
+ |
+ result->push_back(speech_input::SpeechInputResultItem(utterance, |
+ confidence)); |
} |
- DCHECK(first_hypotheses); |
- if (!first_hypotheses->IsType(Value::TYPE_DICTIONARY)) { |
- LOG(WARNING) << "ParseServerResponse: Unexpected value type " |
- << first_hypotheses->GetType(); |
- return false; |
- } |
- const DictionaryValue* first_hypotheses_value = |
- static_cast<DictionaryValue*>(first_hypotheses); |
- if (!first_hypotheses_value->GetString(kUtteranceString, value)) { |
- LOG(WARNING) << "ParseServerResponse: Missing utterance value."; |
+ |
+ if (index < hypotheses_list->GetSize()) { |
+ result->clear(); |
return false; |
} |
@@ -129,13 +146,13 @@ void SpeechRecognitionRequest::OnURLFetchComplete( |
DCHECK(url_.possibly_invalid_spec() == url.possibly_invalid_spec()); |
bool error = !status.is_success() || response_code != 200; |
- string16 value; |
+ SpeechInputResultArray result; |
if (!error) |
- error = !ParseServerResponse(data, &value); |
+ error = !ParseServerResponse(data, &result); |
url_fetcher_.reset(); |
DVLOG(1) << "SpeechRecognitionRequest: Invoking delegate with result."; |
- delegate_->SetRecognitionResult(error, value); |
+ delegate_->SetRecognitionResult(error, result); |
} |
} // namespace speech_input |