1ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch// Copyright 2013 The Chromium Authors. All rights reserved.
2ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch// Use of this source code is governed by a BSD-style license that can be
3ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch// found in the LICENSE file.
4ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
5ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#include "cloud_print/gcp20/prototype/cloud_print_response_parser.h"
6ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
7ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#include "base/json/json_reader.h"
8ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#include "base/json/json_writer.h"
93240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch#include "base/logging.h"
103551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "base/strings/string_number_conversions.h"
11ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#include "base/values.h"
12ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
13ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdochnamespace cloud_print_response_parser {
14ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
15558790d6acca3451cf3a6b497803a5f07d0bec58Ben MurdochJob::Job() {
16558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch}
17558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
18558790d6acca3451cf3a6b497803a5f07d0bec58Ben MurdochJob::~Job() {
19558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch}
20558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
213240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch// Parses json base::Value to base::DictionaryValue.
223240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch// If |success| value in JSON dictionary is |false| then |message| will
233240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch// contain |message| from the JSON dictionary.
243240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch// Returns |true| if no parsing error occurred.
25ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdochbool GetJsonDictinaryAndCheckSuccess(base::Value* json,
26558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch                                     std::string* error_description,
273240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch                                     bool* json_success,
283240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch                                     std::string* message,
29ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch                                     base::DictionaryValue** dictionary) {
30ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  base::DictionaryValue* response_dictionary = NULL;
31ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  if (!json || !json->GetAsDictionary(&response_dictionary)) {
32558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch    *error_description = "No JSON dictionary response received.";
33ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    return false;
34ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  }
35ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
363240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch  bool response_json_success = false;
373240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch  if (!response_dictionary->GetBoolean("success", &response_json_success)) {
38558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch    *error_description = "Cannot parse success state.";
39ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    return false;
40ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  }
41ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
423240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch  if (!response_json_success) {
433240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch    std::string response_message;
443240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch    if (!response_dictionary->GetString("message", &response_message)) {
453240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch      *error_description = "Cannot parse message from response.";
463240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch      return false;
473240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch    }
483240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch    *message = response_message;
49ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  }
50ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
513240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch  *json_success = response_json_success;
52ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  *dictionary = response_dictionary;
53ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  return true;
54ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch}
55ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
56ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdochbool ParseRegisterStartResponse(const std::string& response,
57558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch                                std::string* error_description,
583240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch                                std::string* polling_url,
593240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch                                std::string* registration_token,
603240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch                                std::string* complete_invite_url,
613240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch                                std::string* device_id) {
62ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  scoped_ptr<base::Value> json(base::JSONReader::Read(response));
63ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  base::DictionaryValue* response_dictionary = NULL;
643240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch  bool json_success;
653240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch  std::string message;
66558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  if (!GetJsonDictinaryAndCheckSuccess(json.get(), error_description,
673240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch                                       &json_success, &message,
68ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch                                       &response_dictionary)) {
69ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    return false;
70ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  }
713240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch  if (!json_success) {
723240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch    *error_description = message;
733240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch    return false;
743240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch  }
75ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
763240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch  std::string response_registration_token;
77ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  if (!response_dictionary->GetString("registration_token",
783240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch                                      &response_registration_token)) {
79558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch    *error_description = "No registration_token specified.";
80ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    return false;
81ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  }
82ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
833240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch  std::string response_complete_invite_url;
84ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  if (!response_dictionary->GetString("complete_invite_url",
853240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch                                      &response_complete_invite_url)) {
86558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch    *error_description = "No complete_invite_url specified.";
87ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    return false;
88ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  }
89ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
903240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch  std::string response_polling_url;
913240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch  if (!response_dictionary->GetString("polling_url", &response_polling_url)) {
92558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch    *error_description = "No polling_url specified.";
93ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    return false;
94ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  }
95ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
96ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  base::ListValue* list = NULL;
97ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  if (!response_dictionary->GetList("printers", &list)) {
98558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch    *error_description = "No printers list specified.";
99ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    return false;
100ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  }
101ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
102ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  base::DictionaryValue* printer = NULL;
1033240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch  if (!list->GetDictionary(0, &printer)) {
1043240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch    *error_description = "Printers list is empty or printer is not dictionary.";
105ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    return false;
106ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  }
107ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
1083240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch  std::string id;
1093240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch  if (!printer->GetString("id", &id)) {
110558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch    *error_description = "No id specified.";
111ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    return false;
112ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  }
113ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
1143240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch  if (id.empty()) {
115558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch    *error_description = "id is empty.";
116ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    return false;
117ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  }
118ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
1193240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch  *polling_url = response_polling_url;
1203240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch  *registration_token = response_registration_token;
1213240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch  *complete_invite_url = response_complete_invite_url;
1223240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch  *device_id = id;
123ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  return true;
124ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch}
125ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
126ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdochbool ParseRegisterCompleteResponse(const std::string& response,
127558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch                                   std::string* error_description,
1283240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch                                   std::string* authorization_code,
1293240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch                                   std::string* xmpp_jid) {
130ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  scoped_ptr<base::Value> json(base::JSONReader::Read(response));
131ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  base::DictionaryValue* response_dictionary = NULL;
1323240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch  bool json_success;
1333240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch  std::string message;
134558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  if (!GetJsonDictinaryAndCheckSuccess(json.get(), error_description,
1353240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch                                       &json_success, &message,
136ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch                                       &response_dictionary)) {
137ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    return false;
138ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  }
1393240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch  if (!json_success) {
1403240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch    *error_description = message;
1413240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch    return false;
1423240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch  }
143ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
1443240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch  std::string response_authorization_code;
145ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  if (!response_dictionary->GetString("authorization_code",
1463240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch                                      &response_authorization_code)) {
147558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch    *error_description = "Cannot parse authorization_code.";
148ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    return false;
149ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  }
150ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
1513240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch  std::string response_xmpp_jid;
1523240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch  if (!response_dictionary->GetString("xmpp_jid", &response_xmpp_jid)) {
153a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    *error_description = "Cannot parse xmpp jid.";
154a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    return false;
155a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  }
156a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
1573240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch  *authorization_code = response_authorization_code;
1583240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch  *xmpp_jid = response_xmpp_jid;
159ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  return true;
160ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch}
161ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
162558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdochbool ParseFetchResponse(const std::string& response,
163558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch                        std::string* error_description,
1643240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch                        std::vector<Job>* list) {
165558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  scoped_ptr<base::Value> json(base::JSONReader::Read(response));
166558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  base::DictionaryValue* response_dictionary = NULL;
1673240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch  bool json_success;
1683240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch  std::string message;
1693240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch  if (!GetJsonDictinaryAndCheckSuccess(json.get(), error_description,
1703240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch                                       &json_success, &message,
1713240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch                                       &response_dictionary)) {
172558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch    return false;
173558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  }
174558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
1753240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch  if (!json_success) {  // Let's suppose we have no jobs to proceed.
1763240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch    list->clear();
177558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch    return true;
178558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  }
179558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
180558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  base::ListValue* jobs = NULL;
181558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  if (!response_dictionary->GetList("jobs", &jobs)) {
182558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch    *error_description = "Cannot parse jobs list.";
183558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch    return false;
184558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  }
185558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
1863240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch  std::vector<Job> job_list(jobs->GetSize());
1873551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  std::string create_time_str;
1883240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch  for (size_t idx = 0; idx < job_list.size(); ++idx) {
189558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch    base::DictionaryValue* job = NULL;
190558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch    jobs->GetDictionary(idx, &job);
1913240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch    if (!job->GetString("id", &job_list[idx].job_id) ||
1923551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        !job->GetString("createTime", &create_time_str) ||
1933240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch        !job->GetString("fileUrl", &job_list[idx].file_url) ||
1943240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch        !job->GetString("ticketUrl", &job_list[idx].ticket_url) ||
1953240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch        !job->GetString("title", &job_list[idx].title)) {
196558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch      *error_description = "Cannot parse job info.";
197558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch      return false;
198558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch    }
1993551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    int64 create_time_ms = 0;
2003551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    if (!base::StringToInt64(create_time_str, &create_time_ms)) {
2013551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      *error_description = "Cannot convert time.";
2023551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      return false;
2033551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    }
2043551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    job_list[idx].create_time =
2053551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        base::Time::UnixEpoch() +
2063551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        base::TimeDelta::FromMilliseconds(create_time_ms);
207558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  }
208558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
2093240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch  *list = job_list;
2103551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  return true;
2113551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)}
2123551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
2133551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)bool ParseLocalSettingsResponse(const std::string& response,
2143551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)                                std::string* error_description,
2153551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)                                LocalSettings::State* state,
2163551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)                                LocalSettings* settings) {
2173551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  scoped_ptr<base::Value> json(base::JSONReader::Read(response));
2183551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  base::DictionaryValue* response_dictionary = NULL;
2193551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  bool json_success;
2203551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  std::string message;
2213551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  if (!GetJsonDictinaryAndCheckSuccess(json.get(), error_description,
2223551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)                                       &json_success, &message,
2233551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)                                       &response_dictionary)) {
2243551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    return false;
2253551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  }
2263551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
2273551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  if (!json_success) {  // Let's suppose our printer was deleted.
2283551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    *state = LocalSettings::PRINTER_DELETED;
2293551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    return true;
2303551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  }
2313551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
2323551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  base::ListValue* list = NULL;
2333551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  if (!response_dictionary->GetList("printers", &list)) {
2343551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    *error_description = "No printers list specified.";
2353551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    return false;
2363551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  }
2373551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
2383551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  base::DictionaryValue* printer = NULL;
2393551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  if (!list->GetDictionary(0, &printer)) {
2403551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    *error_description = "Printers list is empty or printer is not dictionary.";
2413551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    return false;
2423551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  }
2433551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
2443551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  base::DictionaryValue* local_settings_dict = NULL;
2453551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  if (!printer->GetDictionary("local_settings", &local_settings_dict)) {
2463551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    *error_description = "No local_settings found.";
2473551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    return false;
2483551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  }
2493551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
2503551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  base::DictionaryValue* current = NULL;
2513551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  if (!local_settings_dict->GetDictionary("current", &current)) {
2523551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    *error_description = "No *current* local settings found.";
2533551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    return false;
2543551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  }
2553551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
2563551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  LocalSettings::State settings_state;
2573551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  base::DictionaryValue* pending = NULL;
2583551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  base::DictionaryValue* settings_to_parse = NULL;
2593551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  if (local_settings_dict->GetDictionary("pending", &pending)) {
2603551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    settings_to_parse = pending;
2613551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    settings_state = LocalSettings::PENDING;
2623551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  } else {
2633551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    settings_to_parse = current;
2643551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    settings_state = LocalSettings::CURRENT;
2653551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  }
2663551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
2673551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  LocalSettings local_settings;
2683551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  if (!settings_to_parse->GetBoolean("local_discovery",
2693551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)                                     &local_settings.local_discovery) ||
2703551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      !settings_to_parse->GetBoolean("access_token_enabled",
2713551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)                                     &local_settings.access_token_enabled) ||
2723551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      !settings_to_parse->GetBoolean("printer/local_printing_enabled",
2733551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)                                     &local_settings.local_printing_enabled) ||
2743551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      !settings_to_parse->GetInteger("xmpp_timeout_value",
2753551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)                                     &local_settings.xmpp_timeout_value)) {
2763551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    *error_description = "Cannot parse local_settings info.";
2773551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    return false;
2783551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  }
279558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
2803551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  *state = settings_state;
2813551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  *settings = local_settings;
282558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  return true;
283558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch}
284558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
285ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch}  // namespace cloud_print_response_parser
286ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
287