| OLD | NEW |
| 1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 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 "components/gcm_driver/gcm_client_impl.h" | 5 #include "components/gcm_driver/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/location.h" | 9 #include "base/location.h" |
| 10 #include "base/logging.h" | 10 #include "base/logging.h" |
| (...skipping 283 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 294 } | 294 } |
| 295 | 295 |
| 296 GCMClientImpl::GCMClientImpl(scoped_ptr<GCMInternalsBuilder> internals_builder) | 296 GCMClientImpl::GCMClientImpl(scoped_ptr<GCMInternalsBuilder> internals_builder) |
| 297 : internals_builder_(internals_builder.Pass()), | 297 : internals_builder_(internals_builder.Pass()), |
| 298 state_(UNINITIALIZED), | 298 state_(UNINITIALIZED), |
| 299 delegate_(NULL), | 299 delegate_(NULL), |
| 300 start_mode_(DELAYED_START), | 300 start_mode_(DELAYED_START), |
| 301 clock_(internals_builder_->BuildClock()), | 301 clock_(internals_builder_->BuildClock()), |
| 302 gcm_store_reset_(false), | 302 gcm_store_reset_(false), |
| 303 url_request_context_getter_(NULL), | 303 url_request_context_getter_(NULL), |
| 304 pending_registration_requests_deleter_(&pending_registration_requests_), | |
| 305 pending_unregistration_requests_deleter_( | |
| 306 &pending_unregistration_requests_), | |
| 307 periodic_checkin_ptr_factory_(this), | 304 periodic_checkin_ptr_factory_(this), |
| 308 destroying_gcm_store_ptr_factory_(this), | 305 destroying_gcm_store_ptr_factory_(this), |
| 309 weak_ptr_factory_(this) { | 306 weak_ptr_factory_(this) { |
| 310 } | 307 } |
| 311 | 308 |
| 312 GCMClientImpl::~GCMClientImpl() { | 309 GCMClientImpl::~GCMClientImpl() { |
| 313 } | 310 } |
| 314 | 311 |
| 315 void GCMClientImpl::Initialize( | 312 void GCMClientImpl::Initialize( |
| 316 const ChromeBuildInfo& chrome_build_info, | 313 const ChromeBuildInfo& chrome_build_info, |
| (...skipping 514 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 831 | 828 |
| 832 void GCMClientImpl::ResetCache() { | 829 void GCMClientImpl::ResetCache() { |
| 833 weak_ptr_factory_.InvalidateWeakPtrs(); | 830 weak_ptr_factory_.InvalidateWeakPtrs(); |
| 834 periodic_checkin_ptr_factory_.InvalidateWeakPtrs(); | 831 periodic_checkin_ptr_factory_.InvalidateWeakPtrs(); |
| 835 device_checkin_info_.Reset(); | 832 device_checkin_info_.Reset(); |
| 836 connection_factory_.reset(); | 833 connection_factory_.reset(); |
| 837 delegate_->OnDisconnected(); | 834 delegate_->OnDisconnected(); |
| 838 mcs_client_.reset(); | 835 mcs_client_.reset(); |
| 839 checkin_request_.reset(); | 836 checkin_request_.reset(); |
| 840 // Delete all of the pending registration and unregistration requests. | 837 // Delete all of the pending registration and unregistration requests. |
| 841 STLDeleteValues(&pending_registration_requests_); | 838 pending_registration_requests_.clear(); |
| 842 STLDeleteValues(&pending_unregistration_requests_); | 839 pending_unregistration_requests_.clear(); |
| 843 } | 840 } |
| 844 | 841 |
| 845 void GCMClientImpl::Register( | 842 void GCMClientImpl::Register( |
| 846 const linked_ptr<RegistrationInfo>& registration_info) { | 843 const linked_ptr<RegistrationInfo>& registration_info) { |
| 847 DCHECK_EQ(state_, READY); | 844 DCHECK_EQ(state_, READY); |
| 848 | 845 |
| 849 // Find and use the cached registration ID. | 846 // Find and use the cached registration ID. |
| 850 RegistrationInfoMap::const_iterator registrations_iter = | 847 RegistrationInfoMap::const_iterator registrations_iter = |
| 851 registrations_.find(registration_info); | 848 registrations_.find(registration_info); |
| 852 if (registrations_iter != registrations_.end()) { | 849 if (registrations_iter != registrations_.end()) { |
| (...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 909 ConstructGCMVersion(chrome_build_info_.version), | 906 ConstructGCMVersion(chrome_build_info_.version), |
| 910 instance_id_token_info->options)); | 907 instance_id_token_info->options)); |
| 911 source_to_record = instance_id_token_info->authorized_entity; | 908 source_to_record = instance_id_token_info->authorized_entity; |
| 912 } | 909 } |
| 913 | 910 |
| 914 RegistrationRequest::RequestInfo request_info( | 911 RegistrationRequest::RequestInfo request_info( |
| 915 device_checkin_info_.android_id, | 912 device_checkin_info_.android_id, |
| 916 device_checkin_info_.secret, | 913 device_checkin_info_.secret, |
| 917 registration_info->app_id); | 914 registration_info->app_id); |
| 918 | 915 |
| 919 RegistrationRequest* registration_request = | 916 scoped_ptr<RegistrationRequest> registration_request(new RegistrationRequest( |
| 920 new RegistrationRequest(gservices_settings_.GetRegistrationURL(), | 917 gservices_settings_.GetRegistrationURL(), request_info, |
| 921 request_info, | 918 request_handler.Pass(), GetGCMBackoffPolicy(), |
| 922 request_handler.Pass(), | 919 base::Bind(&GCMClientImpl::OnRegisterCompleted, |
| 923 GetGCMBackoffPolicy(), | 920 weak_ptr_factory_.GetWeakPtr(), registration_info), |
| 924 base::Bind(&GCMClientImpl::OnRegisterCompleted, | 921 kMaxRegistrationRetries, url_request_context_getter_, &recorder_, |
| 925 weak_ptr_factory_.GetWeakPtr(), | 922 source_to_record)); |
| 926 registration_info), | |
| 927 kMaxRegistrationRetries, | |
| 928 url_request_context_getter_, | |
| 929 &recorder_, | |
| 930 source_to_record); | |
| 931 pending_registration_requests_[registration_info] = registration_request; | |
| 932 registration_request->Start(); | 923 registration_request->Start(); |
| 924 pending_registration_requests_.insert(registration_info, |
| 925 registration_request.Pass()); |
| 933 } | 926 } |
| 934 | 927 |
| 935 void GCMClientImpl::OnRegisterCompleted( | 928 void GCMClientImpl::OnRegisterCompleted( |
| 936 const linked_ptr<RegistrationInfo>& registration_info, | 929 const linked_ptr<RegistrationInfo>& registration_info, |
| 937 RegistrationRequest::Status status, | 930 RegistrationRequest::Status status, |
| 938 const std::string& registration_id) { | 931 const std::string& registration_id) { |
| 939 DCHECK(delegate_); | 932 DCHECK(delegate_); |
| 940 | 933 |
| 941 Result result; | 934 Result result; |
| 942 PendingRegistrationRequests::iterator iter = | 935 PendingRegistrationRequests::const_iterator iter = |
| 943 pending_registration_requests_.find(registration_info); | 936 pending_registration_requests_.find(registration_info); |
| 944 if (iter == pending_registration_requests_.end()) | 937 if (iter == pending_registration_requests_.end()) |
| 945 result = UNKNOWN_ERROR; | 938 result = UNKNOWN_ERROR; |
| 946 else if (status == RegistrationRequest::INVALID_SENDER) | 939 else if (status == RegistrationRequest::INVALID_SENDER) |
| 947 result = INVALID_PARAMETER; | 940 result = INVALID_PARAMETER; |
| 948 else if (registration_id.empty()) | 941 else if (registration_id.empty()) |
| 949 result = SERVER_ERROR; | 942 result = SERVER_ERROR; |
| 950 else | 943 else |
| 951 result = SUCCESS; | 944 result = SUCCESS; |
| 952 | 945 |
| 953 if (result == SUCCESS) { | 946 if (result == SUCCESS) { |
| 954 // Cache it. | 947 // Cache it. |
| 955 registrations_[registration_info] = registration_id; | 948 registrations_[registration_info] = registration_id; |
| 956 | 949 |
| 957 // Save it in the persistent store. | 950 // Save it in the persistent store. |
| 958 gcm_store_->AddRegistration( | 951 gcm_store_->AddRegistration( |
| 959 registration_info->GetSerializedKey(), | 952 registration_info->GetSerializedKey(), |
| 960 registration_info->GetSerializedValue(registration_id), | 953 registration_info->GetSerializedValue(registration_id), |
| 961 base::Bind(&GCMClientImpl::UpdateRegistrationCallback, | 954 base::Bind(&GCMClientImpl::UpdateRegistrationCallback, |
| 962 weak_ptr_factory_.GetWeakPtr())); | 955 weak_ptr_factory_.GetWeakPtr())); |
| 963 } | 956 } |
| 964 | 957 |
| 965 delegate_->OnRegisterFinished( | 958 delegate_->OnRegisterFinished( |
| 966 registration_info, | 959 registration_info, |
| 967 result == SUCCESS ? registration_id : std::string(), | 960 result == SUCCESS ? registration_id : std::string(), |
| 968 result); | 961 result); |
| 969 | 962 |
| 970 if (iter != pending_registration_requests_.end()) { | 963 if (iter != pending_registration_requests_.end()) |
| 971 delete iter->second; | |
| 972 pending_registration_requests_.erase(iter); | 964 pending_registration_requests_.erase(iter); |
| 973 } | |
| 974 } | 965 } |
| 975 | 966 |
| 976 void GCMClientImpl::Unregister( | 967 void GCMClientImpl::Unregister( |
| 977 const linked_ptr<RegistrationInfo>& registration_info) { | 968 const linked_ptr<RegistrationInfo>& registration_info) { |
| 978 DCHECK_EQ(state_, READY); | 969 DCHECK_EQ(state_, READY); |
| 979 if (pending_unregistration_requests_.count(registration_info) == 1) | 970 if (pending_unregistration_requests_.count(registration_info) == 1) |
| 980 return; | 971 return; |
| 981 | 972 |
| 982 // Remove from the cache and persistent store. | 973 // Remove from the cache and persistent store. |
| 983 registrations_.erase(registration_info); | 974 registrations_.erase(registration_info); |
| (...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1035 instance_id_token_info->authorized_entity, | 1026 instance_id_token_info->authorized_entity, |
| 1036 instance_id_token_info->scope, | 1027 instance_id_token_info->scope, |
| 1037 ConstructGCMVersion(chrome_build_info_.version))); | 1028 ConstructGCMVersion(chrome_build_info_.version))); |
| 1038 } | 1029 } |
| 1039 | 1030 |
| 1040 UnregistrationRequest::RequestInfo request_info( | 1031 UnregistrationRequest::RequestInfo request_info( |
| 1041 device_checkin_info_.android_id, | 1032 device_checkin_info_.android_id, |
| 1042 device_checkin_info_.secret, | 1033 device_checkin_info_.secret, |
| 1043 registration_info->app_id); | 1034 registration_info->app_id); |
| 1044 | 1035 |
| 1045 UnregistrationRequest* unregistration_request = new UnregistrationRequest( | 1036 scoped_ptr<UnregistrationRequest> unregistration_request( |
| 1046 gservices_settings_.GetRegistrationURL(), | 1037 new UnregistrationRequest( |
| 1047 request_info, | 1038 gservices_settings_.GetRegistrationURL(), request_info, |
| 1048 request_handler.Pass(), | 1039 request_handler.Pass(), GetGCMBackoffPolicy(), |
| 1049 GetGCMBackoffPolicy(), | 1040 base::Bind(&GCMClientImpl::OnUnregisterCompleted, |
| 1050 base::Bind(&GCMClientImpl::OnUnregisterCompleted, | 1041 weak_ptr_factory_.GetWeakPtr(), registration_info), |
| 1051 weak_ptr_factory_.GetWeakPtr(), | 1042 url_request_context_getter_, &recorder_)); |
| 1052 registration_info), | |
| 1053 url_request_context_getter_, | |
| 1054 &recorder_); | |
| 1055 pending_unregistration_requests_[registration_info] = unregistration_request; | |
| 1056 unregistration_request->Start(); | 1043 unregistration_request->Start(); |
| 1044 pending_unregistration_requests_.insert(registration_info, |
| 1045 unregistration_request.Pass()); |
| 1057 } | 1046 } |
| 1058 | 1047 |
| 1059 void GCMClientImpl::OnUnregisterCompleted( | 1048 void GCMClientImpl::OnUnregisterCompleted( |
| 1060 const linked_ptr<RegistrationInfo>& registration_info, | 1049 const linked_ptr<RegistrationInfo>& registration_info, |
| 1061 UnregistrationRequest::Status status) { | 1050 UnregistrationRequest::Status status) { |
| 1062 DVLOG(1) << "Unregister completed for app: " << registration_info->app_id | 1051 DVLOG(1) << "Unregister completed for app: " << registration_info->app_id |
| 1063 << " with " << (status ? "success." : "failure."); | 1052 << " with " << (status ? "success." : "failure."); |
| 1064 delegate_->OnUnregisterFinished( | 1053 delegate_->OnUnregisterFinished( |
| 1065 registration_info, | 1054 registration_info, |
| 1066 status == UnregistrationRequest::SUCCESS ? SUCCESS : SERVER_ERROR); | 1055 status == UnregistrationRequest::SUCCESS ? SUCCESS : SERVER_ERROR); |
| 1067 | 1056 |
| 1068 PendingUnregistrationRequests::iterator iter = | 1057 pending_unregistration_requests_.erase(registration_info); |
| 1069 pending_unregistration_requests_.find(registration_info); | |
| 1070 if (iter == pending_unregistration_requests_.end()) | |
| 1071 return; | |
| 1072 | |
| 1073 delete iter->second; | |
| 1074 pending_unregistration_requests_.erase(iter); | |
| 1075 } | 1058 } |
| 1076 | 1059 |
| 1077 void GCMClientImpl::OnGCMStoreDestroyed(bool success) { | 1060 void GCMClientImpl::OnGCMStoreDestroyed(bool success) { |
| 1078 DLOG_IF(ERROR, !success) << "GCM store failed to be destroyed!"; | 1061 DLOG_IF(ERROR, !success) << "GCM store failed to be destroyed!"; |
| 1079 UMA_HISTOGRAM_BOOLEAN("GCM.StoreDestroySucceeded", success); | 1062 UMA_HISTOGRAM_BOOLEAN("GCM.StoreDestroySucceeded", success); |
| 1080 } | 1063 } |
| 1081 | 1064 |
| 1082 void GCMClientImpl::Send(const std::string& app_id, | 1065 void GCMClientImpl::Send(const std::string& app_id, |
| 1083 const std::string& receiver_id, | 1066 const std::string& receiver_id, |
| 1084 const OutgoingMessage& message) { | 1067 const OutgoingMessage& message) { |
| (...skipping 261 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1346 bool GCMClientImpl::HasStandaloneRegisteredApp() const { | 1329 bool GCMClientImpl::HasStandaloneRegisteredApp() const { |
| 1347 if (registrations_.empty()) | 1330 if (registrations_.empty()) |
| 1348 return false; | 1331 return false; |
| 1349 // Note that account mapper is not counted as a standalone app since it is | 1332 // Note that account mapper is not counted as a standalone app since it is |
| 1350 // automatically started when other app uses GCM. | 1333 // automatically started when other app uses GCM. |
| 1351 return registrations_.size() > 1 || | 1334 return registrations_.size() > 1 || |
| 1352 !ExistsGCMRegistrationInMap(registrations_, kGCMAccountMapperAppId); | 1335 !ExistsGCMRegistrationInMap(registrations_, kGCMAccountMapperAppId); |
| 1353 } | 1336 } |
| 1354 | 1337 |
| 1355 } // namespace gcm | 1338 } // namespace gcm |
| OLD | NEW |