| Index: google_apis/gcm/engine/gcm_store_impl.cc
|
| diff --git a/google_apis/gcm/engine/gcm_store_impl.cc b/google_apis/gcm/engine/gcm_store_impl.cc
|
| index 78c78ff2d28bbb4bca3cd35e6f6fb89156d86a26..daf7d362fd90adb3005a612c7d894a872e4e2fd4 100644
|
| --- a/google_apis/gcm/engine/gcm_store_impl.cc
|
| +++ b/google_apis/gcm/engine/gcm_store_impl.cc
|
| @@ -124,8 +124,7 @@ class GCMStoreImpl::Backend
|
|
|
| bool LoadDeviceCredentials(uint64* android_id, uint64* security_token);
|
| bool LoadIncomingMessages(std::vector<std::string>* incoming_messages);
|
| - bool LoadOutgoingMessages(
|
| - std::map<std::string, google::protobuf::MessageLite*>* outgoing_messages);
|
| + bool LoadOutgoingMessages(OutgoingMessageMap* outgoing_messages);
|
| bool LoadNextSerialNumber(int64* next_serial_number);
|
| bool LoadUserSerialNumberMap(
|
| std::map<std::string, int64>* user_serial_number_map);
|
| @@ -144,10 +143,12 @@ GCMStoreImpl::Backend::Backend(
|
| GCMStoreImpl::Backend::~Backend() {}
|
|
|
| void GCMStoreImpl::Backend::Load(const LoadCallback& callback) {
|
| - LoadResult result;
|
| + scoped_ptr<LoadResult> result(new LoadResult());
|
| if (db_.get()) {
|
| LOG(ERROR) << "Attempting to reload open database.";
|
| - foreground_task_runner_->PostTask(FROM_HERE, base::Bind(callback, result));
|
| + foreground_task_runner_->PostTask(FROM_HERE,
|
| + base::Bind(callback,
|
| + base::Passed(&result)));
|
| return;
|
| }
|
|
|
| @@ -160,51 +161,55 @@ void GCMStoreImpl::Backend::Load(const LoadCallback& callback) {
|
| if (!status.ok()) {
|
| LOG(ERROR) << "Failed to open database " << path_.value() << ": "
|
| << status.ToString();
|
| - foreground_task_runner_->PostTask(FROM_HERE, base::Bind(callback, result));
|
| + foreground_task_runner_->PostTask(FROM_HERE,
|
| + base::Bind(callback,
|
| + base::Passed(&result)));
|
| return;
|
| }
|
| db_.reset(db);
|
|
|
| - if (!LoadDeviceCredentials(&result.device_android_id,
|
| - &result.device_security_token) ||
|
| - !LoadIncomingMessages(&result.incoming_messages) ||
|
| - !LoadOutgoingMessages(&result.outgoing_messages) ||
|
| + if (!LoadDeviceCredentials(&result->device_android_id,
|
| + &result->device_security_token) ||
|
| + !LoadIncomingMessages(&result->incoming_messages) ||
|
| + !LoadOutgoingMessages(&result->outgoing_messages) ||
|
| !LoadNextSerialNumber(
|
| - &result.serial_number_mappings.next_serial_number) ||
|
| + &result->serial_number_mappings.next_serial_number) ||
|
| !LoadUserSerialNumberMap(
|
| - &result.serial_number_mappings.user_serial_numbers)) {
|
| - result.device_android_id = 0;
|
| - result.device_security_token = 0;
|
| - result.incoming_messages.clear();
|
| - STLDeleteContainerPairSecondPointers(result.outgoing_messages.begin(),
|
| - result.outgoing_messages.end());
|
| - result.outgoing_messages.clear();
|
| - foreground_task_runner_->PostTask(FROM_HERE, base::Bind(callback, result));
|
| + &result->serial_number_mappings.user_serial_numbers)) {
|
| + result->device_android_id = 0;
|
| + result->device_security_token = 0;
|
| + result->incoming_messages.clear();
|
| + result->outgoing_messages.clear();
|
| + foreground_task_runner_->PostTask(FROM_HERE,
|
| + base::Bind(callback,
|
| + base::Passed(&result)));
|
| return;
|
| }
|
|
|
| // Only record histograms if GCM had already been set up for this device.
|
| - if (result.device_android_id != 0 && result.device_security_token != 0) {
|
| + if (result->device_android_id != 0 && result->device_security_token != 0) {
|
| int64 file_size = 0;
|
| if (base::GetFileSize(path_, &file_size)) {
|
| UMA_HISTOGRAM_COUNTS("GCM.StoreSizeKB",
|
| static_cast<int>(file_size / 1024));
|
| }
|
| UMA_HISTOGRAM_COUNTS("GCM.RestoredOutgoingMessages",
|
| - result.outgoing_messages.size());
|
| + result->outgoing_messages.size());
|
| UMA_HISTOGRAM_COUNTS("GCM.RestoredIncomingMessages",
|
| - result.incoming_messages.size());
|
| + result->incoming_messages.size());
|
| UMA_HISTOGRAM_COUNTS(
|
| "GCM.NumUsers",
|
| - result.serial_number_mappings.user_serial_numbers.size());
|
| + result->serial_number_mappings.user_serial_numbers.size());
|
| }
|
|
|
| - DVLOG(1) << "Succeeded in loading " << result.incoming_messages.size()
|
| + DVLOG(1) << "Succeeded in loading " << result->incoming_messages.size()
|
| << " unacknowledged incoming messages and "
|
| - << result.outgoing_messages.size()
|
| + << result->outgoing_messages.size()
|
| << " unacknowledged outgoing messages.";
|
| - result.success = true;
|
| - foreground_task_runner_->PostTask(FROM_HERE, base::Bind(callback, result));
|
| + result->success = true;
|
| + foreground_task_runner_->PostTask(FROM_HERE,
|
| + base::Bind(callback,
|
| + base::Passed(&result)));
|
| return;
|
| }
|
|
|
| @@ -522,7 +527,7 @@ bool GCMStoreImpl::Backend::LoadIncomingMessages(
|
| }
|
|
|
| bool GCMStoreImpl::Backend::LoadOutgoingMessages(
|
| - std::map<std::string, google::protobuf::MessageLite*>* outgoing_messages) {
|
| + OutgoingMessageMap* outgoing_messages) {
|
| leveldb::ReadOptions read_options;
|
| read_options.verify_checksums = true;
|
|
|
| @@ -547,7 +552,7 @@ bool GCMStoreImpl::Backend::LoadOutgoingMessages(
|
| }
|
| DVLOG(1) << "Found outgoing message with id " << id << " of type "
|
| << base::IntToString(tag);
|
| - (*outgoing_messages)[id] = message.release();
|
| + (*outgoing_messages)[id] = make_linked_ptr(message.release());
|
| }
|
|
|
| return true;
|
| @@ -763,17 +768,17 @@ void GCMStoreImpl::RemoveUserSerialNumber(const std::string& username,
|
| }
|
|
|
| void GCMStoreImpl::LoadContinuation(const LoadCallback& callback,
|
| - const LoadResult& result) {
|
| - if (!result.success) {
|
| - callback.Run(result);
|
| + scoped_ptr<LoadResult> result) {
|
| + if (!result->success) {
|
| + callback.Run(result.Pass());
|
| return;
|
| }
|
| int num_throttled_apps = 0;
|
| - for (std::map<std::string, google::protobuf::MessageLite*>::const_iterator
|
| - iter = result.outgoing_messages.begin();
|
| - iter != result.outgoing_messages.end(); ++iter) {
|
| + for (OutgoingMessageMap::const_iterator
|
| + iter = result->outgoing_messages.begin();
|
| + iter != result->outgoing_messages.end(); ++iter) {
|
| const mcs_proto::DataMessageStanza* data_message =
|
| - reinterpret_cast<mcs_proto::DataMessageStanza*>(iter->second);
|
| + reinterpret_cast<mcs_proto::DataMessageStanza*>(iter->second.get());
|
| DCHECK(!data_message->from().empty());
|
| if (app_message_counts_.count(data_message->from()) == 0)
|
| app_message_counts_[data_message->from()] = 1;
|
| @@ -783,7 +788,7 @@ void GCMStoreImpl::LoadContinuation(const LoadCallback& callback,
|
| num_throttled_apps++;
|
| }
|
| UMA_HISTOGRAM_COUNTS("GCM.NumThrottledApps", num_throttled_apps);
|
| - callback.Run(result);
|
| + callback.Run(result.Pass());
|
| }
|
|
|
| void GCMStoreImpl::AddOutgoingMessageContinuation(
|
|
|