OLD | NEW |
---|---|
1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "google_apis/gcm/gcm_client_impl.h" | 5 #include "google_apis/gcm/gcm_client_impl.h" |
6 | 6 |
7 #include "base/bind.h" | 7 #include "base/bind.h" |
8 #include "base/files/file_path.h" | 8 #include "base/files/file_path.h" |
9 #include "base/logging.h" | 9 #include "base/logging.h" |
10 #include "base/memory/scoped_ptr.h" | 10 #include "base/memory/scoped_ptr.h" |
(...skipping 128 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
139 clock, | 139 clock, |
140 connection_factory, | 140 connection_factory, |
141 gcm_store, | 141 gcm_store, |
142 recorder)); | 142 recorder)); |
143 } | 143 } |
144 | 144 |
145 scoped_ptr<ConnectionFactory> GCMInternalsBuilder::BuildConnectionFactory( | 145 scoped_ptr<ConnectionFactory> GCMInternalsBuilder::BuildConnectionFactory( |
146 const std::vector<GURL>& endpoints, | 146 const std::vector<GURL>& endpoints, |
147 const net::BackoffEntry::Policy& backoff_policy, | 147 const net::BackoffEntry::Policy& backoff_policy, |
148 scoped_refptr<net::HttpNetworkSession> network_session, | 148 scoped_refptr<net::HttpNetworkSession> network_session, |
149 net::NetLog* net_log) { | 149 net::NetLog* net_log, |
150 GCMStatsRecorder* recorder) { | |
150 return make_scoped_ptr<ConnectionFactory>( | 151 return make_scoped_ptr<ConnectionFactory>( |
151 new ConnectionFactoryImpl(endpoints, | 152 new ConnectionFactoryImpl(endpoints, |
152 backoff_policy, | 153 backoff_policy, |
153 network_session, | 154 network_session, |
154 net_log)); | 155 net_log, |
156 recorder)); | |
155 } | 157 } |
156 | 158 |
157 GCMClientImpl::GCMClientImpl(scoped_ptr<GCMInternalsBuilder> internals_builder) | 159 GCMClientImpl::GCMClientImpl(scoped_ptr<GCMInternalsBuilder> internals_builder) |
158 : internals_builder_(internals_builder.Pass()), | 160 : internals_builder_(internals_builder.Pass()), |
159 state_(UNINITIALIZED), | 161 state_(UNINITIALIZED), |
160 clock_(internals_builder_->BuildClock()), | 162 clock_(internals_builder_->BuildClock()), |
161 url_request_context_getter_(NULL), | 163 url_request_context_getter_(NULL), |
162 pending_registration_requests_deleter_(&pending_registration_requests_), | 164 pending_registration_requests_deleter_(&pending_registration_requests_), |
163 pending_unregistration_requests_deleter_( | 165 pending_unregistration_requests_deleter_( |
164 &pending_unregistration_requests_), | 166 &pending_unregistration_requests_), |
(...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
233 | 235 |
234 void GCMClientImpl::InitializeMCSClient( | 236 void GCMClientImpl::InitializeMCSClient( |
235 scoped_ptr<GCMStore::LoadResult> result) { | 237 scoped_ptr<GCMStore::LoadResult> result) { |
236 std::vector<GURL> endpoints; | 238 std::vector<GURL> endpoints; |
237 endpoints.push_back(GURL(kMCSEndpointMain)); | 239 endpoints.push_back(GURL(kMCSEndpointMain)); |
238 endpoints.push_back(GURL(kMCSEndpointFallback)); | 240 endpoints.push_back(GURL(kMCSEndpointFallback)); |
239 connection_factory_ = internals_builder_->BuildConnectionFactory( | 241 connection_factory_ = internals_builder_->BuildConnectionFactory( |
240 endpoints, | 242 endpoints, |
241 kDefaultBackoffPolicy, | 243 kDefaultBackoffPolicy, |
242 network_session_, | 244 network_session_, |
243 net_log_.net_log()); | 245 net_log_.net_log(), |
246 &recorder_); | |
244 mcs_client_ = internals_builder_->BuildMCSClient( | 247 mcs_client_ = internals_builder_->BuildMCSClient( |
245 chrome_build_proto_.chrome_version(), | 248 chrome_build_proto_.chrome_version(), |
246 clock_.get(), | 249 clock_.get(), |
247 connection_factory_.get(), | 250 connection_factory_.get(), |
248 gcm_store_.get(), | 251 gcm_store_.get(), |
249 &recorder_).Pass(); | 252 &recorder_).Pass(); |
250 | 253 |
251 mcs_client_->Initialize( | 254 mcs_client_->Initialize( |
252 base::Bind(&GCMClientImpl::OnMCSError, weak_ptr_factory_.GetWeakPtr()), | 255 base::Bind(&GCMClientImpl::OnMCSError, weak_ptr_factory_.GetWeakPtr()), |
253 base::Bind(&GCMClientImpl::OnMessageReceivedFromMCS, | 256 base::Bind(&GCMClientImpl::OnMessageReceivedFromMCS, |
(...skipping 156 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
410 DCHECK_EQ(0u, pending_registration_requests_.count(app_id)); | 413 DCHECK_EQ(0u, pending_registration_requests_.count(app_id)); |
411 | 414 |
412 RegistrationRequest* registration_request = | 415 RegistrationRequest* registration_request = |
413 new RegistrationRequest(request_info, | 416 new RegistrationRequest(request_info, |
414 kDefaultBackoffPolicy, | 417 kDefaultBackoffPolicy, |
415 base::Bind(&GCMClientImpl::OnRegisterCompleted, | 418 base::Bind(&GCMClientImpl::OnRegisterCompleted, |
416 weak_ptr_factory_.GetWeakPtr(), | 419 weak_ptr_factory_.GetWeakPtr(), |
417 app_id, | 420 app_id, |
418 sender_ids), | 421 sender_ids), |
419 kMaxRegistrationRetries, | 422 kMaxRegistrationRetries, |
420 url_request_context_getter_); | 423 url_request_context_getter_, |
424 &recorder_); | |
421 pending_registration_requests_[app_id] = registration_request; | 425 pending_registration_requests_[app_id] = registration_request; |
422 registration_request->Start(); | 426 registration_request->Start(); |
423 } | 427 } |
424 | 428 |
425 void GCMClientImpl::OnRegisterCompleted( | 429 void GCMClientImpl::OnRegisterCompleted( |
426 const std::string& app_id, | 430 const std::string& app_id, |
427 const std::vector<std::string>& sender_ids, | 431 const std::vector<std::string>& sender_ids, |
428 RegistrationRequest::Status status, | 432 RegistrationRequest::Status status, |
429 const std::string& registration_id) { | 433 const std::string& registration_id) { |
430 DCHECK(delegate_); | 434 DCHECK(delegate_); |
(...skipping 145 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
576 stats.is_recording = recorder_.is_recording(); | 580 stats.is_recording = recorder_.is_recording(); |
577 stats.gcm_client_state = GetStateString(); | 581 stats.gcm_client_state = GetStateString(); |
578 stats.connection_client_created = mcs_client_.get() != NULL; | 582 stats.connection_client_created = mcs_client_.get() != NULL; |
579 if (mcs_client_.get()) { | 583 if (mcs_client_.get()) { |
580 stats.connection_state = mcs_client_->GetStateString(); | 584 stats.connection_state = mcs_client_->GetStateString(); |
581 stats.send_queue_size = mcs_client_->GetSendQueueSize(); | 585 stats.send_queue_size = mcs_client_->GetSendQueueSize(); |
582 stats.resend_queue_size = mcs_client_->GetResendQueueSize(); | 586 stats.resend_queue_size = mcs_client_->GetResendQueueSize(); |
583 } | 587 } |
584 if (device_checkin_info_.android_id > 0) | 588 if (device_checkin_info_.android_id > 0) |
585 stats.android_id = device_checkin_info_.android_id; | 589 stats.android_id = device_checkin_info_.android_id; |
586 recorder_.CollectSendingActivities(&stats.sending_activities); | 590 recorder_.CollectActivities(&stats.connection_activities, |
591 &stats.registration_activities, | |
592 &stats.receiving_activities, | |
593 &stats.sending_activities); | |
587 | 594 |
588 for (RegistrationInfoMap::const_iterator it = registrations_.begin(); | 595 for (RegistrationInfoMap::const_iterator it = registrations_.begin(); |
589 it != registrations_.end(); ++it) { | 596 it != registrations_.end(); ++it) { |
590 stats.registered_app_ids.push_back(it->first); | 597 stats.registered_app_ids.push_back(it->first); |
591 } | 598 } |
592 return stats; | 599 return stats; |
593 } | 600 } |
594 | 601 |
595 void GCMClientImpl::OnMessageReceivedFromMCS(const gcm::MCSMessage& message) { | 602 void GCMClientImpl::OnMessageReceivedFromMCS(const gcm::MCSMessage& message) { |
596 switch (message.tag()) { | 603 switch (message.tag()) { |
(...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
660 if (iter != message_data.end()) { | 667 if (iter != message_data.end()) { |
661 message_type = DecodeMessageType(iter->second); | 668 message_type = DecodeMessageType(iter->second); |
662 message_data.erase(iter); | 669 message_data.erase(iter); |
663 } | 670 } |
664 | 671 |
665 switch (message_type) { | 672 switch (message_type) { |
666 case DATA_MESSAGE: | 673 case DATA_MESSAGE: |
667 HandleIncomingDataMessage(data_message_stanza, message_data); | 674 HandleIncomingDataMessage(data_message_stanza, message_data); |
668 break; | 675 break; |
669 case DELETED_MESSAGES: | 676 case DELETED_MESSAGES: |
677 recorder_.RecordDataDeletedMessage(data_message_stanza.category(), | |
678 data_message_stanza.from(), | |
679 data_message_stanza.ByteSize()); | |
670 delegate_->OnMessagesDeleted(data_message_stanza.category()); | 680 delegate_->OnMessagesDeleted(data_message_stanza.category()); |
671 break; | 681 break; |
672 case SEND_ERROR: | 682 case SEND_ERROR: |
673 HandleIncomingSendError(data_message_stanza, message_data); | 683 HandleIncomingSendError(data_message_stanza, message_data); |
674 break; | 684 break; |
675 case UNKNOWN: | 685 case UNKNOWN: |
676 default: // Treat default the same as UNKNOWN. | 686 default: // Treat default the same as UNKNOWN. |
677 DVLOG(1) << "Unknown message_type received. Message ignored. " | 687 DVLOG(1) << "Unknown message_type received. Message ignored. " |
678 << "App ID: " << data_message_stanza.category() << "."; | 688 << "App ID: " << data_message_stanza.category() << "."; |
679 break; | 689 break; |
680 } | 690 } |
681 } | 691 } |
682 | 692 |
683 void GCMClientImpl::HandleIncomingDataMessage( | 693 void GCMClientImpl::HandleIncomingDataMessage( |
684 const mcs_proto::DataMessageStanza& data_message_stanza, | 694 const mcs_proto::DataMessageStanza& data_message_stanza, |
685 MessageData& message_data) { | 695 MessageData& message_data) { |
686 std::string app_id = data_message_stanza.category(); | 696 std::string app_id = data_message_stanza.category(); |
687 | 697 |
688 // Drop the message when the app is not registered for the sender of the | 698 // Drop the message when the app is not registered for the sender of the |
689 // message. | 699 // message. |
690 RegistrationInfoMap::iterator iter = registrations_.find(app_id); | 700 RegistrationInfoMap::iterator iter = registrations_.find(app_id); |
691 if (iter == registrations_.end() || | 701 if (iter == registrations_.end() || |
692 std::find(iter->second->sender_ids.begin(), | 702 std::find(iter->second->sender_ids.begin(), |
693 iter->second->sender_ids.end(), | 703 iter->second->sender_ids.end(), |
694 data_message_stanza.from()) == iter->second->sender_ids.end()) { | 704 data_message_stanza.from()) == iter->second->sender_ids.end()) { |
705 recorder_.RecordDataRecieved(app_id, data_message_stanza.from(), | |
706 data_message_stanza.ByteSize(), false); | |
695 return; | 707 return; |
696 } | 708 } |
697 | 709 |
698 IncomingMessage incoming_message; | 710 IncomingMessage incoming_message; |
699 incoming_message.sender_id = data_message_stanza.from(); | 711 incoming_message.sender_id = data_message_stanza.from(); |
700 if (data_message_stanza.has_token()) | 712 if (data_message_stanza.has_token()) |
701 incoming_message.collapse_key = data_message_stanza.token(); | 713 incoming_message.collapse_key = data_message_stanza.token(); |
702 incoming_message.data = message_data; | 714 incoming_message.data = message_data; |
715 recorder_.RecordDataRecieved(app_id, data_message_stanza.from(), | |
jianli
2014/04/23 17:22:35
You can combine both recording into one by introdu
juyik
2014/04/23 21:36:56
Done.
| |
716 data_message_stanza.ByteSize(), true); | |
703 delegate_->OnMessageReceived(app_id, incoming_message); | 717 delegate_->OnMessageReceived(app_id, incoming_message); |
704 } | 718 } |
705 | 719 |
706 void GCMClientImpl::HandleIncomingSendError( | 720 void GCMClientImpl::HandleIncomingSendError( |
707 const mcs_proto::DataMessageStanza& data_message_stanza, | 721 const mcs_proto::DataMessageStanza& data_message_stanza, |
708 MessageData& message_data) { | 722 MessageData& message_data) { |
709 SendErrorDetails send_error_details; | 723 SendErrorDetails send_error_details; |
710 send_error_details.additional_data = message_data; | 724 send_error_details.additional_data = message_data; |
711 send_error_details.result = SERVER_ERROR; | 725 send_error_details.result = SERVER_ERROR; |
712 | 726 |
713 MessageData::iterator iter = | 727 MessageData::iterator iter = |
714 send_error_details.additional_data.find(kSendErrorMessageIdKey); | 728 send_error_details.additional_data.find(kSendErrorMessageIdKey); |
715 if (iter != send_error_details.additional_data.end()) { | 729 if (iter != send_error_details.additional_data.end()) { |
716 send_error_details.message_id = iter->second; | 730 send_error_details.message_id = iter->second; |
717 send_error_details.additional_data.erase(iter); | 731 send_error_details.additional_data.erase(iter); |
718 } | 732 } |
719 | 733 |
720 recorder_.RecordIncomingSendError( | 734 recorder_.RecordIncomingSendError( |
721 data_message_stanza.category(), | 735 data_message_stanza.category(), |
722 data_message_stanza.to(), | 736 data_message_stanza.to(), |
723 data_message_stanza.id()); | 737 data_message_stanza.id()); |
724 delegate_->OnMessageSendError(data_message_stanza.category(), | 738 delegate_->OnMessageSendError(data_message_stanza.category(), |
725 send_error_details); | 739 send_error_details); |
726 } | 740 } |
727 | 741 |
728 } // namespace gcm | 742 } // namespace gcm |
OLD | NEW |