| 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 "google_apis/gcm/engine/gcm_store_impl.h" | 5 #include "google_apis/gcm/engine/gcm_store_impl.h" |
| 6 | 6 |
| 7 #include "base/basictypes.h" | 7 #include "base/basictypes.h" |
| 8 #include "base/bind.h" | 8 #include "base/bind.h" |
| 9 #include "base/callback.h" | 9 #include "base/callback.h" |
| 10 #include "base/files/file_path.h" | 10 #include "base/files/file_path.h" |
| (...skipping 152 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 163 void SetGServicesSettings( | 163 void SetGServicesSettings( |
| 164 const std::map<std::string, std::string>& settings, | 164 const std::map<std::string, std::string>& settings, |
| 165 const std::string& digest, | 165 const std::string& digest, |
| 166 const UpdateCallback& callback); | 166 const UpdateCallback& callback); |
| 167 void AddAccountMapping(const AccountMapping& account_mapping, | 167 void AddAccountMapping(const AccountMapping& account_mapping, |
| 168 const UpdateCallback& callback); | 168 const UpdateCallback& callback); |
| 169 void RemoveAccountMapping(const std::string& account_id, | 169 void RemoveAccountMapping(const std::string& account_id, |
| 170 const UpdateCallback& callback); | 170 const UpdateCallback& callback); |
| 171 void SetLastTokenFetchTime(const base::Time& time, | 171 void SetLastTokenFetchTime(const base::Time& time, |
| 172 const UpdateCallback& callback); | 172 const UpdateCallback& callback); |
| 173 void SetValue(const std::string& key, |
| 174 const std::string& value, |
| 175 const UpdateCallback& callback); |
| 173 | 176 |
| 174 private: | 177 private: |
| 175 friend class base::RefCountedThreadSafe<Backend>; | 178 friend class base::RefCountedThreadSafe<Backend>; |
| 176 ~Backend(); | 179 ~Backend(); |
| 177 | 180 |
| 178 bool LoadDeviceCredentials(uint64* android_id, uint64* security_token); | 181 bool LoadDeviceCredentials(uint64* android_id, uint64* security_token); |
| 179 bool LoadRegistrations(RegistrationInfoMap* registrations); | 182 bool LoadRegistrations(RegistrationInfoMap* registrations); |
| 180 bool LoadIncomingMessages(std::vector<std::string>* incoming_messages); | 183 bool LoadIncomingMessages(std::vector<std::string>* incoming_messages); |
| 181 bool LoadOutgoingMessages(OutgoingMessageMap* outgoing_messages); | 184 bool LoadOutgoingMessages(OutgoingMessageMap* outgoing_messages); |
| 182 bool LoadLastCheckinInfo(base::Time* last_checkin_time, | 185 bool LoadLastCheckinInfo(base::Time* last_checkin_time, |
| (...skipping 457 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 640 const leveldb::Status s = | 643 const leveldb::Status s = |
| 641 db_->Put(write_options, | 644 db_->Put(write_options, |
| 642 MakeSlice(kLastTokenFetchTimeKey), | 645 MakeSlice(kLastTokenFetchTimeKey), |
| 643 MakeSlice(base::Int64ToString(time.ToInternalValue()))); | 646 MakeSlice(base::Int64ToString(time.ToInternalValue()))); |
| 644 | 647 |
| 645 if (!s.ok()) | 648 if (!s.ok()) |
| 646 LOG(ERROR) << "LevelDB setting last token fetching time: " << s.ToString(); | 649 LOG(ERROR) << "LevelDB setting last token fetching time: " << s.ToString(); |
| 647 foreground_task_runner_->PostTask(FROM_HERE, base::Bind(callback, s.ok())); | 650 foreground_task_runner_->PostTask(FROM_HERE, base::Bind(callback, s.ok())); |
| 648 } | 651 } |
| 649 | 652 |
| 653 void GCMStoreImpl::Backend::SetValue(const std::string& key, |
| 654 const std::string& value, |
| 655 const UpdateCallback& callback) { |
| 656 DVLOG(1) << "Injecting a value to GCM Store for testing. Key: " |
| 657 << key << ", Value: " << value; |
| 658 if (!db_.get()) { |
| 659 LOG(ERROR) << "GCMStore db doesn't exist."; |
| 660 foreground_task_runner_->PostTask(FROM_HERE, base::Bind(callback, false)); |
| 661 return; |
| 662 } |
| 663 |
| 664 leveldb::WriteOptions write_options; |
| 665 write_options.sync = true; |
| 666 |
| 667 const leveldb::Status s = |
| 668 db_->Put(write_options, MakeSlice(key), MakeSlice(value)); |
| 669 |
| 670 if (!s.ok()) |
| 671 LOG(ERROR) << "LevelDB had problems injecting a value: " << s.ToString(); |
| 672 foreground_task_runner_->PostTask(FROM_HERE, base::Bind(callback, s.ok())); |
| 673 } |
| 674 |
| 650 bool GCMStoreImpl::Backend::LoadDeviceCredentials(uint64* android_id, | 675 bool GCMStoreImpl::Backend::LoadDeviceCredentials(uint64* android_id, |
| 651 uint64* security_token) { | 676 uint64* security_token) { |
| 652 leveldb::ReadOptions read_options; | 677 leveldb::ReadOptions read_options; |
| 653 read_options.verify_checksums = true; | 678 read_options.verify_checksums = true; |
| 654 | 679 |
| 655 std::string result; | 680 std::string result; |
| 656 leveldb::Status s = db_->Get(read_options, MakeSlice(kDeviceAIDKey), &result); | 681 leveldb::Status s = db_->Get(read_options, MakeSlice(kDeviceAIDKey), &result); |
| 657 if (s.ok()) { | 682 if (s.ok()) { |
| 658 if (!base::StringToUint64(result, android_id)) { | 683 if (!base::StringToUint64(result, android_id)) { |
| 659 LOG(ERROR) << "Failed to restore device id."; | 684 LOG(ERROR) << "Failed to restore device id."; |
| (...skipping 106 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 766 base::Time* last_checkin_time, | 791 base::Time* last_checkin_time, |
| 767 std::set<std::string>* accounts) { | 792 std::set<std::string>* accounts) { |
| 768 leveldb::ReadOptions read_options; | 793 leveldb::ReadOptions read_options; |
| 769 read_options.verify_checksums = true; | 794 read_options.verify_checksums = true; |
| 770 | 795 |
| 771 std::string result; | 796 std::string result; |
| 772 leveldb::Status s = db_->Get(read_options, | 797 leveldb::Status s = db_->Get(read_options, |
| 773 MakeSlice(kLastCheckinTimeKey), | 798 MakeSlice(kLastCheckinTimeKey), |
| 774 &result); | 799 &result); |
| 775 int64 time_internal = 0LL; | 800 int64 time_internal = 0LL; |
| 776 if (s.ok() && !base::StringToInt64(result, &time_internal)) | 801 if (s.ok() && !base::StringToInt64(result, &time_internal)) { |
| 777 LOG(ERROR) << "Failed to restore last checkin time. Using default = 0."; | 802 LOG(ERROR) << "Failed to restore last checkin time. Using default = 0."; |
| 803 time_internal = 0LL; |
| 804 } |
| 778 | 805 |
| 779 // In case we cannot read last checkin time, we default it to 0, as we don't | 806 // In case we cannot read last checkin time, we default it to 0, as we don't |
| 780 // want that situation to cause the whole load to fail. | 807 // want that situation to cause the whole load to fail. |
| 781 *last_checkin_time = base::Time::FromInternalValue(time_internal); | 808 *last_checkin_time = base::Time::FromInternalValue(time_internal); |
| 782 | 809 |
| 783 accounts->clear(); | 810 accounts->clear(); |
| 784 s = db_->Get(read_options, MakeSlice(kLastCheckinAccountsKey), &result); | 811 s = db_->Get(read_options, MakeSlice(kLastCheckinAccountsKey), &result); |
| 785 if (!s.ok()) | 812 if (!s.ok()) |
| 786 DVLOG(1) << "No accounts where stored during last run."; | 813 DVLOG(1) << "No accounts where stored during last run."; |
| 787 | 814 |
| (...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 845 | 872 |
| 846 bool GCMStoreImpl::Backend::LoadLastTokenFetchTime( | 873 bool GCMStoreImpl::Backend::LoadLastTokenFetchTime( |
| 847 base::Time* last_token_fetch_time) { | 874 base::Time* last_token_fetch_time) { |
| 848 leveldb::ReadOptions read_options; | 875 leveldb::ReadOptions read_options; |
| 849 read_options.verify_checksums = true; | 876 read_options.verify_checksums = true; |
| 850 | 877 |
| 851 std::string result; | 878 std::string result; |
| 852 leveldb::Status s = | 879 leveldb::Status s = |
| 853 db_->Get(read_options, MakeSlice(kLastTokenFetchTimeKey), &result); | 880 db_->Get(read_options, MakeSlice(kLastTokenFetchTimeKey), &result); |
| 854 int64 time_internal = 0LL; | 881 int64 time_internal = 0LL; |
| 855 if (s.ok() && !base::StringToInt64(result, &time_internal)) | 882 if (s.ok() && !base::StringToInt64(result, &time_internal)) { |
| 856 LOG(ERROR) << "Failed to restore last checkin time. Using default = 0."; | 883 LOG(ERROR) << |
| 884 "Failed to restore last token fetching time. Using default = 0."; |
| 885 time_internal = 0LL; |
| 886 } |
| 857 | 887 |
| 858 // In case we cannot read last token fetching time, we default it to 0. | 888 // In case we cannot read last token fetching time, we default it to 0. |
| 859 *last_token_fetch_time = base::Time::FromInternalValue(time_internal); | 889 *last_token_fetch_time = base::Time::FromInternalValue(time_internal); |
| 860 | 890 |
| 861 return true; | 891 return true; |
| 862 } | 892 } |
| 863 | 893 |
| 864 GCMStoreImpl::GCMStoreImpl( | 894 GCMStoreImpl::GCMStoreImpl( |
| 865 const base::FilePath& path, | 895 const base::FilePath& path, |
| 866 scoped_refptr<base::SequencedTaskRunner> blocking_task_runner, | 896 scoped_refptr<base::SequencedTaskRunner> blocking_task_runner, |
| (...skipping 216 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1083 void GCMStoreImpl::SetLastTokenFetchTime(const base::Time& time, | 1113 void GCMStoreImpl::SetLastTokenFetchTime(const base::Time& time, |
| 1084 const UpdateCallback& callback) { | 1114 const UpdateCallback& callback) { |
| 1085 blocking_task_runner_->PostTask( | 1115 blocking_task_runner_->PostTask( |
| 1086 FROM_HERE, | 1116 FROM_HERE, |
| 1087 base::Bind(&GCMStoreImpl::Backend::SetLastTokenFetchTime, | 1117 base::Bind(&GCMStoreImpl::Backend::SetLastTokenFetchTime, |
| 1088 backend_, | 1118 backend_, |
| 1089 time, | 1119 time, |
| 1090 callback)); | 1120 callback)); |
| 1091 } | 1121 } |
| 1092 | 1122 |
| 1123 void GCMStoreImpl::SetValueForTesting(const std::string& key, |
| 1124 const std::string& value, |
| 1125 const UpdateCallback& callback) { |
| 1126 blocking_task_runner_->PostTask( |
| 1127 FROM_HERE, |
| 1128 base::Bind(&GCMStoreImpl::Backend::SetValue, |
| 1129 backend_, |
| 1130 key, |
| 1131 value, |
| 1132 callback)); |
| 1133 } |
| 1134 |
| 1093 void GCMStoreImpl::LoadContinuation(const LoadCallback& callback, | 1135 void GCMStoreImpl::LoadContinuation(const LoadCallback& callback, |
| 1094 scoped_ptr<LoadResult> result) { | 1136 scoped_ptr<LoadResult> result) { |
| 1095 if (!result->success) { | 1137 if (!result->success) { |
| 1096 callback.Run(result.Pass()); | 1138 callback.Run(result.Pass()); |
| 1097 return; | 1139 return; |
| 1098 } | 1140 } |
| 1099 int num_throttled_apps = 0; | 1141 int num_throttled_apps = 0; |
| 1100 for (OutgoingMessageMap::const_iterator | 1142 for (OutgoingMessageMap::const_iterator |
| 1101 iter = result->outgoing_messages.begin(); | 1143 iter = result->outgoing_messages.begin(); |
| 1102 iter != result->outgoing_messages.end(); ++iter) { | 1144 iter != result->outgoing_messages.end(); ++iter) { |
| (...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1137 removed_message_counts.begin(); | 1179 removed_message_counts.begin(); |
| 1138 iter != removed_message_counts.end(); ++iter) { | 1180 iter != removed_message_counts.end(); ++iter) { |
| 1139 DCHECK_NE(app_message_counts_.count(iter->first), 0U); | 1181 DCHECK_NE(app_message_counts_.count(iter->first), 0U); |
| 1140 app_message_counts_[iter->first] -= iter->second; | 1182 app_message_counts_[iter->first] -= iter->second; |
| 1141 DCHECK_GE(app_message_counts_[iter->first], 0); | 1183 DCHECK_GE(app_message_counts_[iter->first], 0); |
| 1142 } | 1184 } |
| 1143 callback.Run(true); | 1185 callback.Run(true); |
| 1144 } | 1186 } |
| 1145 | 1187 |
| 1146 } // namespace gcm | 1188 } // namespace gcm |
| OLD | NEW |