From e77ddd3221df0fd5c843c8545228caf225b30777 Mon Sep 17 00:00:00 2001 From: Cheng Zhao Date: Wed, 10 Jan 2018 17:18:23 +0900 Subject: [PATCH] Pass multiple transactions at the same time This follows the design of SKPayment API. --- atom/browser/api/atom_api_in_app_purchase.cc | 6 ++--- atom/browser/api/atom_api_in_app_purchase.h | 5 ++-- atom/browser/mac/in_app_purchase_observer.h | 6 +++-- atom/browser/mac/in_app_purchase_observer.mm | 25 +++++++++----------- docs/api/in-app-purchase.md | 15 +++--------- docs/api/structures/transaction.md | 11 +++++++++ 6 files changed, 35 insertions(+), 33 deletions(-) create mode 100644 docs/api/structures/transaction.md diff --git a/atom/browser/api/atom_api_in_app_purchase.cc b/atom/browser/api/atom_api_in_app_purchase.cc index 9c10388bc6..aa6a89eeff 100644 --- a/atom/browser/api/atom_api_in_app_purchase.cc +++ b/atom/browser/api/atom_api_in_app_purchase.cc @@ -82,9 +82,9 @@ void InAppPurchase::PurchaseProduct(const std::string& product_id, in_app_purchase::PurchaseProduct(product_id, quantity, callback); } -void InAppPurchase::OnTransactionUpdated( - const in_app_purchase::Transaction& transaction) { - Emit("transaction-updated", transaction); +void InAppPurchase::OnTransactionsUpdated( + const std::vector& transactions) { + Emit("transactions-updated", transactions); } } // namespace api diff --git a/atom/browser/api/atom_api_in_app_purchase.h b/atom/browser/api/atom_api_in_app_purchase.h index 326c28ff02..3646c9b8e8 100644 --- a/atom/browser/api/atom_api_in_app_purchase.h +++ b/atom/browser/api/atom_api_in_app_purchase.h @@ -6,6 +6,7 @@ #define ATOM_BROWSER_API_ATOM_API_IN_APP_PURCHASE_H_ #include +#include #include "atom/browser/api/event_emitter.h" #include "atom/browser/mac/in_app_purchase.h" @@ -31,8 +32,8 @@ class InAppPurchase: public mate::EventEmitter, void PurchaseProduct(const std::string& product_id, mate::Arguments* args); // TransactionObserver: - void OnTransactionUpdated( - const in_app_purchase::Transaction& transaction) override; + void OnTransactionsUpdated( + const std::vector& transactions) override; private: DISALLOW_COPY_AND_ASSIGN(InAppPurchase); diff --git a/atom/browser/mac/in_app_purchase_observer.h b/atom/browser/mac/in_app_purchase_observer.h index 6bec6c237d..d2d0be2b0a 100644 --- a/atom/browser/mac/in_app_purchase_observer.h +++ b/atom/browser/mac/in_app_purchase_observer.h @@ -6,6 +6,7 @@ #define ATOM_BROWSER_MAC_IN_APP_PURCHASE_OBSERVER_H_ #include +#include #include "base/callback.h" #include "base/memory/weak_ptr.h" @@ -14,7 +15,7 @@ @class InAppTransactionObserver; #else // __OBJC__ class InAppTransactionObserver; -#endif // __OBJC__ +#endif // __OBJC__ namespace in_app_purchase { @@ -42,7 +43,8 @@ class TransactionObserver { TransactionObserver(); virtual ~TransactionObserver(); - virtual void OnTransactionUpdated(const Transaction& transaction) = 0; + virtual void OnTransactionsUpdated( + const std::vector& transactions) = 0; private: InAppTransactionObserver* obeserver_; diff --git a/atom/browser/mac/in_app_purchase_observer.mm b/atom/browser/mac/in_app_purchase_observer.mm index be9c4fa4c4..379f405c2b 100644 --- a/atom/browser/mac/in_app_purchase_observer.mm +++ b/atom/browser/mac/in_app_purchase_observer.mm @@ -18,7 +18,8 @@ namespace { using InAppTransactionCallback = - base::RepeatingCallback; + base::RepeatingCallback< + void(const std::vector&)>; } // namespace @@ -54,19 +55,17 @@ using InAppTransactionCallback = * * @param transaction - The transaction to pass to the callback. */ -- (void)runCallback:(SKPaymentTransaction*)transaction { - if (transaction == nil) { - return; - } - +- (void)runCallback:(NSArray*)transactions { // Convert the transaction. - in_app_purchase::Transaction transactionStruct; - transactionStruct = [self skPaymentTransactionToStruct:transaction]; + std::vector converted; + converted.reserve([transactions count]); + for (SKPaymentTransaction* transaction in transactions) { + converted.push_back([self skPaymentTransactionToStruct:transaction]); + } // Send the callback to the browser thread. content::BrowserThread::PostTask( - content::BrowserThread::UI, FROM_HERE, - base::Bind(callback_, transactionStruct)); + content::BrowserThread::UI, FROM_HERE, base::Bind(callback_, converted)); } /** @@ -157,9 +156,7 @@ using InAppTransactionCallback = */ - (void)paymentQueue:(SKPaymentQueue*)queue updatedTransactions:(NSArray*)transactions { - for (SKPaymentTransaction* transaction in transactions) { - [self runCallback:transaction]; - } + [self runCallback:transactions]; } @end @@ -172,7 +169,7 @@ namespace in_app_purchase { TransactionObserver::TransactionObserver() : weak_ptr_factory_(this) { obeserver_ = [[InAppTransactionObserver alloc] - initWithCallback:base::Bind(&TransactionObserver::OnTransactionUpdated, + initWithCallback:base::Bind(&TransactionObserver::OnTransactionsUpdated, weak_ptr_factory_.GetWeakPtr())]; } diff --git a/docs/api/in-app-purchase.md b/docs/api/in-app-purchase.md index 0dd1ea5fdf..c5c97cf203 100644 --- a/docs/api/in-app-purchase.md +++ b/docs/api/in-app-purchase.md @@ -8,23 +8,14 @@ Process: [Main](../glossary.md#main-process) The `inAppPurchase` module emits the following events: -### Event: 'transaction-updated' +### Event: 'transactions-updated' -Emitted when a transaction has been updated. +Emitted when one or more transactions have been updated. Returns: * `event` Event -* `transaction` Object - * `transactionIdentifier` String - * `transactionDate` String - * `originalTransactionIdentifier` String - * `transactionState` String - The transaction sate (`"purchasing"`, `"purchased"`, `"failed"`, `"restored"`, or `"deferred"`) - * `errorCode` Integer - * `errorMessage` String - * `payment` Object - * `productIdentifier` String - * `quantity` Integer +* `transactions` ([Transaction[]](structures/transaction.md) - Array of transactions. ## Methods diff --git a/docs/api/structures/transaction.md b/docs/api/structures/transaction.md new file mode 100644 index 0000000000..78ee4e8ad0 --- /dev/null +++ b/docs/api/structures/transaction.md @@ -0,0 +1,11 @@ +# Transaction Object + +* `transactionIdentifier` String +* `transactionDate` String +* `originalTransactionIdentifier` String +* `transactionState` String - The transaction sate (`"purchasing"`, `"purchased"`, `"failed"`, `"restored"`, or `"deferred"`) +* `errorCode` Integer +* `errorMessage` String +* `payment` Object + * `productIdentifier` String + * `quantity` Integer