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", ¤t)) { 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