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, &registered)) {
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