13551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved. 23551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 33551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)// found in the LICENSE file. 43551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 53551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "cloud_print/gcp20/prototype/printer_state.h" 63551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 71320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "base/files/file_util.h" 83551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "base/json/json_reader.h" 93551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "base/json/json_writer.h" 103551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "base/logging.h" 115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "base/numerics/safe_conversions.h" 123551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "base/values.h" 133551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 143551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)namespace { 153551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 163551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)const char kRegistered[] = "registered"; 173551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)const char kUser[] = "user"; 183551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)const char kDeviceId[] = "device_id"; 193551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)const char kRefreshToken[] = "refresh_token"; 203551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)const char kXmppJid[] = "xmpp_jid"; 213551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)const char kAccessToken[] = "access_token"; 223551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)const char kAccessTokenUpdate[] = "access_token_update"; 233551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 243551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)const char kLocalSettings[] = "local_settings"; 25f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)const char kCdd[] = "cdd"; 263551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)const char kLocalSettingsLocalDiscovery[] = "local_discovery"; 273551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)const char kLocalSettingsAccessTokenEnabled[] = "access_token_enabled"; 283551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)const char kLocalSettingsLocalPrintingEnabled[] = 293551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) "printer/local_printing_enabled"; 303551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)const char kLocalSettingsXmppTimeoutValue[] = "xmpp_timeout_value"; 313551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 323551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)} // namespace 333551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 343551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)PrinterState::PrinterState() 353551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) : registration_state(UNREGISTERED), 363551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) confirmation_state(CONFIRMATION_PENDING) { 373551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)} 383551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 393551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)PrinterState::~PrinterState() { 403551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)} 413551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 423551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)namespace printer_state { 433551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 443551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)bool SaveToFile(const base::FilePath& path, const PrinterState& state) { 453551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) base::DictionaryValue json; 463551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) if (state.registration_state == PrinterState::REGISTERED) { 473551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) json.SetBoolean(kRegistered, true); 483551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) json.SetString(kUser, state.user); 493551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) json.SetString(kDeviceId, state.device_id); 503551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) json.SetString(kRefreshToken, state.refresh_token); 513551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) json.SetString(kXmppJid, state.xmpp_jid); 523551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) json.SetString(kAccessToken, state.access_token); 533551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) json.SetInteger(kAccessTokenUpdate, 543551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) static_cast<int>(state.access_token_update.ToTimeT())); 553551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 563551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) scoped_ptr<base::DictionaryValue> local_settings(new base::DictionaryValue); 573551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) local_settings->SetBoolean(kLocalSettingsLocalDiscovery, 583551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) state.local_settings.local_discovery); 593551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) local_settings->SetBoolean(kLocalSettingsAccessTokenEnabled, 603551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) state.local_settings.access_token_enabled); 613551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) local_settings->SetBoolean(kLocalSettingsLocalPrintingEnabled, 623551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) state.local_settings.local_printing_enabled); 633551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) local_settings->SetInteger(kLocalSettingsXmppTimeoutValue, 643551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) state.local_settings.xmpp_timeout_value); 653551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) json.Set(kLocalSettings, local_settings.release()); 663551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) } else { 673551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) json.SetBoolean(kRegistered, false); 683551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) } 693551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 70f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (state.cdd.get()) 71f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) json.Set(kCdd, state.cdd->DeepCopy()); 72f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 733551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) std::string json_str; 743551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) base::JSONWriter::WriteWithOptions(&json, 753551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) base::JSONWriter::OPTIONS_PRETTY_PRINT, 763551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) &json_str); 775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) int size = base::checked_cast<int>(json_str.size()); 78a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return (base::WriteFile(path, json_str.data(), size) == size); 793551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)} 803551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 813551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)bool LoadFromFile(const base::FilePath& path, PrinterState* state) { 823551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) std::string json_str; 8358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) if (!base::ReadFileToString(path, &json_str)) { 843551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) LOG(ERROR) << "Cannot open file."; 853551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) return false; 863551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) } 873551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 883551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) scoped_ptr<base::Value> json_val(base::JSONReader::Read(json_str)); 893551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) base::DictionaryValue* json = NULL; 903551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) if (!json_val || !json_val->GetAsDictionary(&json)) { 913551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) LOG(ERROR) << "Cannot read JSON dictionary from file."; 923551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) return false; 933551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) } 943551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 953551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) bool registered = false; 963551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) if (!json->GetBoolean(kRegistered, ®istered)) { 973551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) LOG(ERROR) << "Cannot parse |registered| state."; 983551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) return false; 993551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) } 1003551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 1013551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) if (!registered) 1023551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) return true; 1033551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 1043551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) std::string user; 1053551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) if (!json->GetString(kUser, &user)) { 1063551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) LOG(ERROR) << "Cannot parse |user|."; 1073551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) return false; 1083551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) } 1093551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 1103551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) std::string device_id; 1113551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) if (!json->GetString(kDeviceId, &device_id)) { 1123551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) LOG(ERROR) << "Cannot parse |device_id|."; 1133551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) return false; 1143551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) } 1153551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 1163551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) std::string refresh_token; 1173551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) if (!json->GetString(kRefreshToken, &refresh_token)) { 1183551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) LOG(ERROR) << "Cannot parse |refresh_token|."; 1193551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) return false; 1203551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) } 1213551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 1223551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) std::string xmpp_jid; 1233551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) if (!json->GetString(kXmppJid, &xmpp_jid)) { 1243551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) LOG(ERROR) << "Cannot parse |xmpp_jid|."; 1253551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) return false; 1263551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) } 1273551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 1283551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) std::string access_token; 1293551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) if (!json->GetString(kAccessToken, &access_token)) { 1303551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) LOG(ERROR) << "Cannot parse |access_token|."; 1313551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) return false; 1323551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) } 1333551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 1343551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) int access_token_update; 1353551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) if (!json->GetInteger(kAccessTokenUpdate, &access_token_update)) { 1363551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) LOG(ERROR) << "Cannot parse |access_token_update|."; 1373551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) return false; 1383551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) } 1393551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 1403551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) LocalSettings local_settings; 1413551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) base::DictionaryValue* settings_dict; 1423551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) if (!json->GetDictionary(kLocalSettings, &settings_dict)) { 1433551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) LOG(WARNING) << "Cannot read |local_settings|. Reset to default."; 1443551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) } else { 1453551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) if (!settings_dict->GetBoolean(kLocalSettingsLocalDiscovery, 1463551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) &local_settings.local_discovery) || 1473551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) !settings_dict->GetBoolean(kLocalSettingsAccessTokenEnabled, 1483551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) &local_settings.access_token_enabled) || 1493551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) !settings_dict->GetBoolean(kLocalSettingsLocalPrintingEnabled, 1503551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) &local_settings.local_printing_enabled) || 1513551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) !settings_dict->GetInteger(kLocalSettingsXmppTimeoutValue, 1523551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) &local_settings.xmpp_timeout_value)) { 1533551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) LOG(WARNING) << "Cannot parse |local_settings|. Reset to default."; 1543551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) local_settings = LocalSettings(); 1553551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) } 1563551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) } 1573551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 158f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) base::DictionaryValue* cdd_dict = NULL; 159f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (!json->GetDictionary(kCdd, &cdd_dict)) 160f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) LOG(WARNING) << "Cannot read |cdd|. Reset to default."; 161f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 1623551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) *state = PrinterState(); 1633551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) state->registration_state = PrinterState::REGISTERED; 1643551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) state->user = user; 1653551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) state->device_id = device_id; 1663551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) state->refresh_token = refresh_token; 1673551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) state->xmpp_jid = xmpp_jid; 1683551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) state->access_token = access_token; 1693551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) state->access_token_update = base::Time::FromTimeT(access_token_update); 1703551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) state->local_settings = local_settings; 171f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (cdd_dict) 172f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) state->cdd.reset(cdd_dict->DeepCopy()); 1733551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) return true; 1743551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)} 1753551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 1763551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)} // namespace printer_state 1773551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 178