| Index: chrome/browser/ui/android/autofill/autofill_dialog_result.cc | 
| diff --git a/chrome/browser/ui/android/autofill/autofill_dialog_result.cc b/chrome/browser/ui/android/autofill/autofill_dialog_result.cc | 
| new file mode 100644 | 
| index 0000000000000000000000000000000000000000..0a0430ee4ae25406fbc06bc66de327bdf984606a | 
| --- /dev/null | 
| +++ b/chrome/browser/ui/android/autofill/autofill_dialog_result.cc | 
| @@ -0,0 +1,138 @@ | 
| +// Copyright (c) 2013 The Chromium Authors. All rights reserved. | 
| +// Use of this source code is governed by a BSD-style license that can be | 
| +// found in the LICENSE file. | 
| + | 
| +#include "chrome/browser/ui/android/autofill/autofill_dialog_result.h" | 
| + | 
| +#include "base/android/jni_android.h" | 
| +#include "base/android/jni_array.h" | 
| +#include "base/android/jni_string.h" | 
| +#include "base/android/scoped_java_ref.h" | 
| +#include "base/bind.h" | 
| +#include "base/logging.h" | 
| +#include "base/strings/utf_string_conversions.h" | 
| +#include "chrome/browser/ui/autofill/data_model_wrapper.h" | 
| +#include "components/autofill/content/browser/wallet/full_wallet.h" | 
| +#include "components/autofill/core/browser/credit_card.h" | 
| +#include "components/autofill/core/common/form_data.h" | 
| +#include "jni/AutofillDialogResult_jni.h" | 
| +#include "ui/base/l10n/l10n_util.h" | 
| + | 
| +namespace autofill { | 
| + | 
| +namespace { | 
| + | 
| +std::string ConvertNullOrJavaStringToUTF8(JNIEnv* env, jstring str) { | 
| +  return str ? base::android::ConvertJavaStringToUTF8(env, str) : std::string(); | 
| +} | 
| + | 
| +base::string16 ConvertNullOrJavaStringToUTF16(JNIEnv* env, jstring str) { | 
| +  return str ? base::android::ConvertJavaStringToUTF16(env, str) | 
| +             : base::string16(); | 
| +} | 
| + | 
| +#define FETCH_JFIELD(env, jobj, cls, getter) \ | 
| +    (Java_##cls##_get##getter((env), (jobj))) | 
| + | 
| +#define FETCH_JSTRING(utf, env, jobj, cls, getter) \ | 
| +    (ConvertNullOrJavaStringTo##utf( \ | 
| +        (env), FETCH_JFIELD((env), (jobj), cls, getter).obj())) | 
| + | 
| +scoped_ptr<wallet::Address> ParseJavaWalletAddress( | 
| +    JNIEnv* env, jobject address) { | 
| +  if (!address) | 
| +    return scoped_ptr<wallet::Address>(); | 
| + | 
| +  const base::string16 recipient_name = | 
| +      FETCH_JSTRING(UTF16, env, address, ResultAddress, Name); | 
| +  const base::string16 address_line_1 = | 
| +      FETCH_JSTRING(UTF16, env, address, ResultAddress, Address1); | 
| +  const base::string16 address_line_2 = | 
| +      FETCH_JSTRING(UTF16, env, address, ResultAddress, Address2); | 
| +  const base::string16 locality_name = | 
| +      FETCH_JSTRING(UTF16, env, address, ResultAddress, City); | 
| +  const base::string16 administrative_area_name = | 
| +      FETCH_JSTRING(UTF16, env, address, ResultAddress, State); | 
| +  const base::string16 postal_code_number = | 
| +      FETCH_JSTRING(UTF16, env, address, ResultAddress, PostalCode); | 
| +  const base::string16 phone_number = | 
| +      FETCH_JSTRING(UTF16, env, address, ResultAddress, PhoneNumber); | 
| +  const std::string country_name_code = | 
| +      FETCH_JSTRING(UTF8, env, address, ResultAddress, CountryCode); | 
| +  DCHECK(!country_name_code.empty()); | 
| + | 
| +  return scoped_ptr<wallet::Address>(new wallet::Address( | 
| +      country_name_code, | 
| +      recipient_name, | 
| +      address_line_1, | 
| +      address_line_2, | 
| +      locality_name, | 
| +      administrative_area_name, | 
| +      postal_code_number, | 
| +      phone_number, | 
| +      std::string())); | 
| +} | 
| + | 
| +scoped_ptr<wallet::FullWallet> ParseJavaWallet(JNIEnv* env, jobject wallet) { | 
| +  const ScopedJavaLocalRef<jobject> billing_address( | 
| +      FETCH_JFIELD(env, wallet, ResultWallet, BillingAddress)); | 
| +  const ScopedJavaLocalRef<jobject> shipping_address( | 
| +      FETCH_JFIELD(env, wallet, ResultWallet, ShippingAddress)); | 
| +  const ScopedJavaLocalRef<jobject> card( | 
| +      FETCH_JFIELD(env, wallet, ResultWallet, Card)); | 
| + | 
| +  const int expiration_month = | 
| +      FETCH_JFIELD(env, card.obj(), ResultCard, ExpirationMonth); | 
| +  const int expiration_year = | 
| +      FETCH_JFIELD(env, card.obj(), ResultCard, ExpirationYear); | 
| +  const std::string pan = | 
| +      FETCH_JSTRING(UTF8, env, card.obj(), ResultCard, Pan); | 
| +  const std::string cvn = | 
| +      FETCH_JSTRING(UTF8, env, card.obj(), ResultCard, Cvn); | 
| + | 
| +  return wallet::FullWallet::CreateFullWalletFromClearText( | 
| +      expiration_month, | 
| +      expiration_year, | 
| +      pan, | 
| +      cvn, | 
| +      ParseJavaWalletAddress(env, billing_address.obj()), | 
| +      ParseJavaWalletAddress(env, shipping_address.obj())); | 
| +} | 
| + | 
| +base::string16 ParseWalletEmail(JNIEnv* env, jobject wallet) { | 
| +  return FETCH_JSTRING(UTF16, env, wallet, ResultWallet, Email); | 
| +} | 
| + | 
| +std::string ParseGoogleTransactionId(JNIEnv* env, jobject wallet) { | 
| +  return FETCH_JSTRING(UTF8, env, wallet, ResultWallet, GoogleTransactionId); | 
| +} | 
| + | 
| +#undef FETCH_JSTRING | 
| +#undef FETCH_FIELD | 
| + | 
| +}  // namespace | 
| + | 
| +// static | 
| +scoped_ptr<wallet::FullWallet> AutofillDialogResult::ConvertFromJava( | 
| +    JNIEnv* env, jobject wallet) { | 
| +  return ParseJavaWallet(env, wallet); | 
| +} | 
| + | 
| +// static | 
| +base::string16 AutofillDialogResult::GetWalletEmail( | 
| +    JNIEnv* env, jobject wallet) { | 
| +  return ParseWalletEmail(env, wallet); | 
| +} | 
| + | 
| +// static | 
| +std::string AutofillDialogResult::GetWalletGoogleTransactionId( | 
| +    JNIEnv* env, jobject wallet) { | 
| +  return ParseGoogleTransactionId(env, wallet); | 
| +} | 
| + | 
| +// static | 
| +bool AutofillDialogResult::RegisterAutofillDialogResult(JNIEnv* env) { | 
| +  return RegisterNativesImpl(env); | 
| +} | 
| + | 
| +}  // namespace autofill | 
|  |