Chromium Code Reviews| Index: components/gcm_driver/gcm_driver_desktop.cc |
| diff --git a/components/gcm_driver/gcm_driver_desktop.cc b/components/gcm_driver/gcm_driver_desktop.cc |
| index 599957d2a5979fced996c2440031f4cee4344b7c..f5a1ce6fbbfd5204338452d23754fc6755304778 100644 |
| --- a/components/gcm_driver/gcm_driver_desktop.cc |
| +++ b/components/gcm_driver/gcm_driver_desktop.cc |
| @@ -54,7 +54,8 @@ class GCMDriverDesktop::IOWorker : public GCMClient::Delegate { |
| const std::string& message_id, |
| GCMClient::Result result) override; |
| void OnMessageReceived(const std::string& app_id, |
| - const IncomingMessage& message) override; |
| + const IncomingMessage& message, |
| + const MessageReceiptCallback& callback) override; |
| void OnMessagesDeleted(const std::string& app_id) override; |
| void OnMessageSendError( |
| const std::string& app_id, |
| @@ -111,6 +112,8 @@ class GCMDriverDesktop::IOWorker : public GCMClient::Delegate { |
| void RecordDecryptionFailure(const std::string& app_id, |
| GCMEncryptionProvider::DecryptionResult result); |
| + void SendMessageReceipt(const MessageReceiptCallback& callback, |
| + GCMMessageStatus status); |
| // For testing purpose. Can be called from UI thread. Use with care. |
| GCMClient* gcm_client_for_testing() const { return gcm_client_.get(); } |
| @@ -233,15 +236,13 @@ void GCMDriverDesktop::IOWorker::OnSendFinished(const std::string& app_id, |
| void GCMDriverDesktop::IOWorker::OnMessageReceived( |
| const std::string& app_id, |
| - const IncomingMessage& message) { |
| + const IncomingMessage& message, |
| + const MessageReceiptCallback& callback) { |
| DCHECK(io_thread_->RunsTasksOnCurrentThread()); |
| - ui_thread_->PostTask( |
| - FROM_HERE, |
| - base::Bind(&GCMDriverDesktop::MessageReceived, |
| - service_, |
| - app_id, |
| - message)); |
| + ui_thread_->PostTask(FROM_HERE, |
| + base::Bind(&GCMDriverDesktop::MessageReceived, service_, |
| + app_id, message, callback)); |
| } |
| void GCMDriverDesktop::IOWorker::OnMessagesDeleted(const std::string& app_id) { |
| @@ -510,6 +511,16 @@ void GCMDriverDesktop::IOWorker::RecordDecryptionFailure( |
| gcm_client_->RecordDecryptionFailure(app_id, result); |
| } |
| +void GCMDriverDesktop::IOWorker::SendMessageReceipt( |
| + const MessageReceiptCallback& callback, |
| + GCMMessageStatus status) { |
| + DCHECK(io_thread_->RunsTasksOnCurrentThread()); |
| + |
| + // The callback was created by the GCMClient on the IO thead so it is safe to |
| + // invoke from here. |
| + callback.Run(status); |
| +} |
| + |
| GCMDriverDesktop::GCMDriverDesktop( |
| std::unique_ptr<GCMClientFactory> gcm_client_factory, |
| const GCMClient::ChromeBuildInfo& chrome_build_info, |
| @@ -1216,14 +1227,15 @@ void GCMDriverDesktop::RemoveCachedData() { |
| } |
| void GCMDriverDesktop::MessageReceived(const std::string& app_id, |
| - const IncomingMessage& message) { |
| + const IncomingMessage& message, |
| + const MessageReceiptCallback& callback) { |
| DCHECK(ui_thread_->RunsTasksOnCurrentThread()); |
| // Drop the event if the service has been stopped. |
| if (!gcm_started_) |
| return; |
| - DispatchMessage(app_id, message); |
| + DispatchMessage(app_id, message, callback); |
|
Peter Beverloo
2017/02/08 17:09:09
The |callback| passed to DispatchMessage any beyon
harkness
2017/02/09 16:27:30
Good point, I hadn't considered that there was a s
|
| } |
| void GCMDriverDesktop::MessagesDeleted(const std::string& app_id) { |
| @@ -1342,4 +1354,14 @@ bool GCMDriverDesktop::TokenTupleComparer::operator()( |
| return std::get<2>(a) < std::get<2>(b); |
| } |
| +void GCMDriverDesktop::DoSendMessageReceipt( |
| + const MessageReceiptCallback& callback, |
| + GCMMessageStatus status) { |
| + DCHECK(ui_thread_->RunsTasksOnCurrentThread()); |
| + |
| + io_thread_->PostTask( |
| + FROM_HERE, |
| + base::Bind(&GCMDriverDesktop::IOWorker::SendMessageReceipt, |
| + base::Unretained(io_worker_.get()), callback, status)); |
| +} |
| } // namespace gcm |