1 // Copyright 2013 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
5 #include "cloud_print/gcp20/prototype/printer_state.h"
7 #include "base/file_util.h"
8 #include "base/json/json_reader.h"
9 #include "base/json/json_writer.h"
10 #include "base/logging.h"
11 #include "base/safe_numerics.h"
12 #include "base/values.h"
16 const char kRegistered[] = "registered";
17 const char kUser[] = "user";
18 const char kDeviceId[] = "device_id";
19 const char kRefreshToken[] = "refresh_token";
20 const char kXmppJid[] = "xmpp_jid";
21 const char kAccessToken[] = "access_token";
22 const char kAccessTokenUpdate[] = "access_token_update";
24 const char kLocalSettings[] = "local_settings";
25 const char kLocalSettingsLocalDiscovery[] = "local_discovery";
26 const char kLocalSettingsAccessTokenEnabled[] = "access_token_enabled";
27 const char kLocalSettingsLocalPrintingEnabled[] =
28 "printer/local_printing_enabled";
29 const char kLocalSettingsXmppTimeoutValue[] = "xmpp_timeout_value";
33 PrinterState::PrinterState()
34 : registration_state(UNREGISTERED),
35 confirmation_state(CONFIRMATION_PENDING) {
38 PrinterState::~PrinterState() {
41 namespace printer_state {
43 bool SaveToFile(const base::FilePath& path, const PrinterState& state) {
44 base::DictionaryValue json;
45 if (state.registration_state == PrinterState::REGISTERED) {
46 json.SetBoolean(kRegistered, true);
47 json.SetString(kUser, state.user);
48 json.SetString(kDeviceId, state.device_id);
49 json.SetString(kRefreshToken, state.refresh_token);
50 json.SetString(kXmppJid, state.xmpp_jid);
51 json.SetString(kAccessToken, state.access_token);
52 json.SetInteger(kAccessTokenUpdate,
53 static_cast<int>(state.access_token_update.ToTimeT()));
55 scoped_ptr<base::DictionaryValue> local_settings(new base::DictionaryValue);
56 local_settings->SetBoolean(kLocalSettingsLocalDiscovery,
57 state.local_settings.local_discovery);
58 local_settings->SetBoolean(kLocalSettingsAccessTokenEnabled,
59 state.local_settings.access_token_enabled);
60 local_settings->SetBoolean(kLocalSettingsLocalPrintingEnabled,
61 state.local_settings.local_printing_enabled);
62 local_settings->SetInteger(kLocalSettingsXmppTimeoutValue,
63 state.local_settings.xmpp_timeout_value);
64 json.Set(kLocalSettings, local_settings.release());
66 json.SetBoolean(kRegistered, false);
70 base::JSONWriter::WriteWithOptions(&json,
71 base::JSONWriter::OPTIONS_PRETTY_PRINT,
73 int size = base::checked_numeric_cast<int>(json_str.size());
74 return (file_util::WriteFile(path, json_str.data(), size) == size);
77 bool LoadFromFile(const base::FilePath& path, PrinterState* state) {
79 if (!base::ReadFileToString(path, &json_str)) {
80 LOG(ERROR) << "Cannot open file.";
84 scoped_ptr<base::Value> json_val(base::JSONReader::Read(json_str));
85 base::DictionaryValue* json = NULL;
86 if (!json_val || !json_val->GetAsDictionary(&json)) {
87 LOG(ERROR) << "Cannot read JSON dictionary from file.";
91 bool registered = false;
92 if (!json->GetBoolean(kRegistered, ®istered)) {
93 LOG(ERROR) << "Cannot parse |registered| state.";
101 if (!json->GetString(kUser, &user)) {
102 LOG(ERROR) << "Cannot parse |user|.";
106 std::string device_id;
107 if (!json->GetString(kDeviceId, &device_id)) {
108 LOG(ERROR) << "Cannot parse |device_id|.";
112 std::string refresh_token;
113 if (!json->GetString(kRefreshToken, &refresh_token)) {
114 LOG(ERROR) << "Cannot parse |refresh_token|.";
118 std::string xmpp_jid;
119 if (!json->GetString(kXmppJid, &xmpp_jid)) {
120 LOG(ERROR) << "Cannot parse |xmpp_jid|.";
124 std::string access_token;
125 if (!json->GetString(kAccessToken, &access_token)) {
126 LOG(ERROR) << "Cannot parse |access_token|.";
130 int access_token_update;
131 if (!json->GetInteger(kAccessTokenUpdate, &access_token_update)) {
132 LOG(ERROR) << "Cannot parse |access_token_update|.";
136 LocalSettings local_settings;
137 base::DictionaryValue* settings_dict;
138 if (!json->GetDictionary(kLocalSettings, &settings_dict)) {
139 LOG(WARNING) << "Cannot read |local_settings|. Reset to default.";
141 if (!settings_dict->GetBoolean(kLocalSettingsLocalDiscovery,
142 &local_settings.local_discovery) ||
143 !settings_dict->GetBoolean(kLocalSettingsAccessTokenEnabled,
144 &local_settings.access_token_enabled) ||
145 !settings_dict->GetBoolean(kLocalSettingsLocalPrintingEnabled,
146 &local_settings.local_printing_enabled) ||
147 !settings_dict->GetInteger(kLocalSettingsXmppTimeoutValue,
148 &local_settings.xmpp_timeout_value)) {
149 LOG(WARNING) << "Cannot parse |local_settings|. Reset to default.";
150 local_settings = LocalSettings();
154 *state = PrinterState();
155 state->registration_state = PrinterState::REGISTERED;
157 state->device_id = device_id;
158 state->refresh_token = refresh_token;
159 state->xmpp_jid = xmpp_jid;
160 state->access_token = access_token;
161 state->access_token_update = base::Time::FromTimeT(access_token_update);
162 state->local_settings = local_settings;
166 } // namespace printer_state