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

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: Fixes from latest 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 const 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 const 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;
Dan Beam 2012/12/06 21:59:24 nit: I'd personally group all critical failures at
Dan Beam 2012/12/06 22:00:14 whooops! I meant group all critical failures at th
ahutter 2012/12/06 22:44:19 Done.
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(
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_;
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 scoped_ptr<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 scoped_ptr<MaskedInstrument> instrument(
293 MaskedInstrument::CreateMaskedInstrument(*instrument_dict));
294 if (instrument.get())
295 wallet_items->AddInstrument(instrument.release());
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 scoped_ptr<Address> address(
310 Address::CreateAddressWithID(*address_dict));
311 if (address.get())
312 wallet_items->AddAddress(address.release());
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 scoped_ptr<LegalDocument> legal_doc(
327 LegalDocument::CreateLegalDocument(*legal_doc_dict));
328 if (legal_doc.get()) {
329 wallet_items->AddLegalDocument(legal_doc.release());
330 } else {
331 DLOG(ERROR) << "Malformed legal document in response from "
332 "Google wallet";
333 return NULL;
334 }
335 }
336 }
337 } else {
338 DVLOG(1) << "Response from Google wallet missing legal docs";
339 }
340
341 return wallet_items.release();
342 }
343
344 bool WalletItems::operator==(const WalletItems& other) const {
345 // TODO(ahutter): Check scoped vector equality.
346 return google_transaction_id_ == other.google_transaction_id_ &&
347 default_instrument_id_ == other.default_instrument_id_ &&
348 default_address_id_ == other.default_address_id_ &&
349 required_actions_ == required_actions_;
350 }
351 bool WalletItems::operator!=(const WalletItems& other) const {
352 return !(*this == other);
353 }
354
355 } // end wallet namespace
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698