Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(440)

Side by Side Diff: chrome/browser/autofill/wallet/wallet_items.cc

Issue 11293078: Integrating Online Wallet into Chrome. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: More fixes from code review Created 8 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
(Empty)
1 // Copyright (c) 2012 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.
4
5 #include "chrome/browser/autofill/wallet/wallet_items.h"
6
7 #include "base/logging.h"
8 #include "base/values.h"
9
10 namespace wallet {
11
12 WalletItems::MaskedInstrument::MaskedInstrument(
13 const std::string& descriptive_name,
14 WalletItems::MaskedInstrument::Type type,
15 std::vector<std::string> supported_currencies,
16 const std::string& last_four_digits,
17 int expiration_month,
18 int expiration_year,
19 const std::string& brand,
20 Address* address,
21 WalletItems::MaskedInstrument::Status status,
22 const std::string& object_id)
23 : descriptive_name_(descriptive_name),
24 type_(type),
25 supported_currencies_(supported_currencies),
26 last_four_digits_(last_four_digits),
27 expiration_month_(expiration_month),
28 expiration_year_(expiration_year),
29 brand_(brand),
30 address_(address),
31 status_(status),
32 object_id_(object_id) {
33 DCHECK(address_);
34 }
35
36 WalletItems::MaskedInstrument::~MaskedInstrument() {}
37
38 WalletItems::MaskedInstrument*
39 WalletItems::MaskedInstrument::CreateMaskedInstrument(
40 const base::DictionaryValue& dictionary) {
41 std::string descriptive_name;
42 if (!dictionary.GetString("descriptive_name", &descriptive_name))
43 DVLOG(1) << "Response from Google Wallet missing descriptive name";
44
45 std::string type_string;
46 Type type;
47 if (dictionary.GetString("type", &type_string)) {
48 type = TypeFromString(type_string);
49 } else {
50 DLOG(ERROR) << "Response from Google Wallet missing card type";
51 return NULL;
52 }
53
54 std::vector<std::string> supported_currencies;
55 const ListValue* supported_currency_list;
56 if (dictionary.GetList("supported_currency", &supported_currency_list)) {
57 for (size_t i = 0; i < supported_currency_list->GetSize(); i++) {
58 std::string currency;
59 if (supported_currency_list->GetString(i, &currency))
60 supported_currencies.push_back(currency);
61 }
62 } else {
63 DVLOG(1) << "Response from Google Wallet missing supported currency";
64 }
65
66 std::string last_four_digits;
67 if (!dictionary.GetString("last_four_digits", &last_four_digits)) {
68 DLOG(ERROR) << "Response from Google Wallet missing last four digits";
69 return NULL;
70 }
71
72 int expiration_month;
73 if (!dictionary.GetInteger("expiration_month", &expiration_month))
74 DVLOG(1) << "Response from Google Wallet missing expiration month";
75
76 int expiration_year;
77 if (!dictionary.GetInteger("expiration_year", &expiration_year))
78 DVLOG(1) << "Response from Google Wallet missing expiration year";
79
80 std::string brand;
81 if (!dictionary.GetString("brand", &brand))
82 DVLOG(1) << "Response from Google Wallet missing brand";
83
84 std::string status_string;
85 Status status;
86 if (dictionary.GetString("status", &status_string)) {
87 status = StatusFromString(status_string);
88 } else {
89 DLOG(ERROR) << "Response from Google Wallet missing status";
90 return NULL;
91 }
92
93 std::string object_id;
94 if (!dictionary.GetString("object_id", &object_id)) {
95 DLOG(ERROR) << "Response from Google Wallet missing object id";
96 return NULL;
97 }
98
99 const DictionaryValue* address_dict;
100 if (!dictionary.GetDictionary("billing_address", &address_dict)) {
101 DLOG(ERROR) << "Response from Google wallet missing address";
102 return NULL;
103 }
104 Address* address = Address::CreateDisplayAddress(*address_dict);
105
106 if (!address) {
107 DLOG(ERROR) << "Response from Google wallet contained malformed address";
108 return NULL;
109 }
110
111 return new MaskedInstrument(descriptive_name,
112 type,
113 supported_currencies,
114 last_four_digits,
115 expiration_month,
116 expiration_year,
117 brand,
118 address,
119 status,
120 object_id);
121 }
122
123 bool WalletItems::MaskedInstrument::operator==(
124 const WalletItems::MaskedInstrument& other) const {
125 if (descriptive_name_ != other.descriptive_name_)
126 return false;
127 if (type_ != other.type_)
128 return false;
129 if (supported_currencies_ != other.supported_currencies_)
130 return false;
131 if (last_four_digits_ != other.last_four_digits_)
132 return false;
133 if (expiration_month_ != other.expiration_month_)
134 return false;
135 if (expiration_year_ != other.expiration_year_)
136 return false;
137 if (brand_ != other.brand_)
138 return false;
139 if (address_.get()) {
140 if (other.address_.get()) {
141 if (*address_.get() != *other.address_.get())
142 return false;
143 } else {
144 return false;
145 }
146 } else if (other.address_.get()) {
147 return false;
148 }
149 if (status_ != other.status_)
150 return false;
151 if (object_id_ != other.object_id_)
152 return false;
153 return true;
154 }
155
156 bool WalletItems::MaskedInstrument::operator!=(
157 const WalletItems::MaskedInstrument& other) const {
158 return !(*this == other);
159 }
160
161 WalletItems::MaskedInstrument::Type
162 WalletItems::MaskedInstrument::TypeFromString(
Dan Beam 2012/12/05 19:34:59 nit: + 4 \s indent, I think
ahutter 2012/12/05 23:37:23 Done.
163 const std::string& type_string) {
164 if (type_string == "VISA")
165 return VISA;
166 if (type_string == "MASTER_CARD")
167 return MASTER_CARD;
168 if (type_string == "AMEX")
169 return AMEX;
170 if (type_string == "DISCOVER")
171 return DISCOVER;
172 if (type_string == "SOLO")
173 return SOLO;
174 if (type_string == "MAESTRO")
175 return MAESTRO;
176 if (type_string == "SWITCH")
177 return SWITCH;
178 return UNKNOWN;
179 }
180
181 WalletItems::MaskedInstrument::Status
182 WalletItems::MaskedInstrument::StatusFromString(
183 const std::string& status_string) {
184 if (status_string == "PENDING")
185 return PENDING;
186 if (status_string == "VALID")
187 return VALID;
188 if (status_string == "DECLINED")
189 return DECLINED;
190 if (status_string == "UNSUPPORTED_COUNTRY")
191 return UNSUPPORTED_COUNTRY;
192 if (status_string == "EXPIRED")
193 return EXPIRED;
194 if (status_string == "BILLING_INCOMPLETE")
195 return BILLING_INCOMPLETE;
196 return INAPPLICABLE;
197 }
198
199 WalletItems::LegalDocument::LegalDocument(const std::string& document_id,
200 const std::string& display_name,
201 const std::string& document_body)
202 : document_id_(document_id),
203 display_name_(display_name),
204 document_body_(document_body) {}
205
206 WalletItems::LegalDocument::~LegalDocument() {}
207
208 WalletItems::LegalDocument* WalletItems::LegalDocument::CreateLegalDocument(
209 const base::DictionaryValue& dictionary) {
210 std::string document_id;
211 if (!dictionary.GetString("legal_document_id", &document_id)) {
212 DLOG(ERROR) << "Response from Google Wallet missing legal document id";
213 return NULL;
214 }
215
216 std::string display_name;
217 if (!dictionary.GetString("display_name", &display_name)) {
218 DLOG(ERROR) << "Response from Google Wallet missing display name";
219 return NULL;
220 }
221
222 std::string document_body;
223 if (!dictionary.GetString("document", &document_body)) {
224 DLOG(ERROR) << "Response from Google Wallet missing document body";
225 return NULL;
226 }
227
228 return new WalletItems::LegalDocument(document_id,
229 display_name,
230 document_body);
231 }
232
233 bool WalletItems::LegalDocument::operator==(const LegalDocument& other) const {
234 return document_id_ == other.document_id_
235 && display_name_ == other.display_name_
236 && document_body_ == other.document_body_;
Dan Beam 2012/12/05 19:34:59 nit: && at ends
ahutter 2012/12/05 23:37:23 Done.
237 }
238
239 bool WalletItems::LegalDocument::operator!=(const LegalDocument& other) const {
240 return !(*this == other);
241 }
242
243 WalletItems::WalletItems(const std::vector<std::string>& required_actions,
244 const std::string& google_transaction_id,
245 const std::string& default_instrument_id,
246 const std::string& default_address_id)
247 : required_actions_(required_actions),
248 google_transaction_id_(google_transaction_id),
249 default_instrument_id_(default_instrument_id),
250 default_address_id_(default_address_id) {}
251
252 WalletItems::~WalletItems() {}
253
254 WalletItems* WalletItems::CreateWalletItems(
255 const base::DictionaryValue& dictionary) {
256 std::vector<std::string> required_action;
257 const ListValue* required_action_list;
258 if (dictionary.GetList("required_action", &required_action_list)) {
259 for (size_t i = 0; i < required_action_list->GetSize(); i++) {
260 std::string action;
261 if (required_action_list->GetString(i, &action))
262 required_action.push_back(action);
263 }
264 } else {
265 DVLOG(1) << "Response from Google wallet missing required actions";
266 }
267
268 std::string google_transaction_id;
269 if (!dictionary.GetString("google_transaction_id", &google_transaction_id)) {
270 DLOG(ERROR) << "Response from Google wallet missing google transaction id";
271 return NULL;
272 }
273
274 std::string default_instrument_id;
275 if (!dictionary.GetString("default_instrument_id", &default_instrument_id))
276 DVLOG(1) << "Response from Google wallet missing default instrument id";
277
278 std::string default_address_id;
279 if (!dictionary.GetString("default_address_id", &default_address_id))
280 DVLOG(1) << "Response from Google wallet missing default_address_id";
281
282 WalletItems* wallet_items = new WalletItems(required_action,
283 google_transaction_id,
284 default_instrument_id,
285 default_address_id);
286
287 const ListValue* instruments;
288 if (dictionary.GetList("instrument", &instruments)) {
289 for (size_t i = 0; i < instruments->GetSize(); i++) {
290 const DictionaryValue* instrument_dict;
291 if (instruments->GetDictionary(i, &instrument_dict)) {
292 MaskedInstrument* instrument =
293 MaskedInstrument::CreateMaskedInstrument(*instrument_dict);
Dan Beam 2012/12/05 19:34:59 nit: I think this is a bit risky for somebody to c
ahutter 2012/12/05 23:37:23 Done.
294 if (instrument)
295 wallet_items->AddInstrument(instrument);
296 else
297 DLOG(ERROR) << "Malformed instrument in response from Google Wallet";
298 }
299 }
300 } else {
301 DVLOG(1) << "Response from Google wallet missing instruments";
302 }
303
304 const ListValue* addresses;
305 if (dictionary.GetList("address", &addresses)) {
306 for (size_t i = 0; i < addresses->GetSize(); i++) {
307 const DictionaryValue* address_dict;
308 if (addresses->GetDictionary(i, &address_dict)) {
309 Address* address =
310 Address::CreateAddressWithID(*address_dict);
311 if (address)
312 wallet_items->AddAddress(address);
313 else
314 DLOG(ERROR) << "Malformed address in response from Google Wallet";
315 }
316 }
317 } else {
318 DVLOG(1) << "Response from Google wallet missing addresses";
319 }
320
321 const ListValue* legal_docs;
322 if (dictionary.GetList("required_legal_document", &legal_docs)) {
323 for (size_t i = 0; i < legal_docs->GetSize(); i++) {
324 const DictionaryValue* legal_doc_dict;
325 if (legal_docs->GetDictionary(i, &legal_doc_dict)) {
326 LegalDocument* legal_doc =
327 LegalDocument::CreateLegalDocument(*legal_doc_dict);
328 if (legal_doc) {
329 wallet_items->AddLegalDocument(legal_doc);
330 } else {
331 DLOG(ERROR) << "Malformed legal document in response from "
332 "Google wallet";
Dan Beam 2012/12/05 19:34:59 nit: fix indent DLOG(ERROR) << "Malformed legal
ahutter 2012/12/05 23:37:23 Done.
333 delete wallet_items;
Dan Beam 2012/12/05 19:34:59 same nit re: using scoped_ptr::~scoped_ptr vs. del
ahutter 2012/12/05 23:37:23 Done.
334 return NULL;
335 }
336 }
337 }
338 } else {
339 DVLOG(1) << "Response from Google wallet missing legal docs";
340 }
341
342 return wallet_items;
343 }
344
345 bool WalletItems::operator==(const WalletItems& other) const {
346 // TODO(ahutter): Check scoped vector equality.
347 return google_transaction_id_ == other.google_transaction_id_
348 && default_instrument_id_ == other.default_instrument_id_
349 && default_address_id_ == other.default_address_id_
350 && required_actions_ == required_actions_;
Dan Beam 2012/12/05 19:34:59 nit: ops at end
ahutter 2012/12/05 23:37:23 Done.
351 }
352 bool WalletItems::operator!=(const WalletItems& other) const {
353 return !(*this == other);
354 }
355
356 } // end wallet namespace
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698