diff options
author | jianli <jianli@chromium.org> | 2015-05-11 14:14:13 -0700 |
---|---|---|
committer | Commit bot <commit-bot@chromium.org> | 2015-05-11 21:14:58 +0000 |
commit | 10018b2d2d5954cb697ccad19eef63919aef0786 (patch) | |
tree | 7f5f4fa86eacf75884463c87438ddfe84b1fd4f1 /components/gcm_driver/instance_id/instance_id_impl.cc | |
parent | e8624082aaf1743e46f2868f807ac164c587d77b (diff) | |
download | chromium_src-10018b2d2d5954cb697ccad19eef63919aef0786.zip chromium_src-10018b2d2d5954cb697ccad19eef63919aef0786.tar.gz chromium_src-10018b2d2d5954cb697ccad19eef63919aef0786.tar.bz2 |
Persist Instance ID data to GCM store.
BUG=477084
TEST=new tests
TBR=asvitkine@chromium.org
Review URL: https://codereview.chromium.org/1126233004
Cr-Commit-Position: refs/heads/master@{#329233}
Diffstat (limited to 'components/gcm_driver/instance_id/instance_id_impl.cc')
-rw-r--r-- | components/gcm_driver/instance_id/instance_id_impl.cc | 82 |
1 files changed, 75 insertions, 7 deletions
diff --git a/components/gcm_driver/instance_id/instance_id_impl.cc b/components/gcm_driver/instance_id/instance_id_impl.cc index 0ebcdf8..b77cf3f 100644 --- a/components/gcm_driver/instance_id/instance_id_impl.cc +++ b/components/gcm_driver/instance_id/instance_id_impl.cc @@ -9,6 +9,7 @@ #include "base/bind.h" #include "base/logging.h" #include "base/message_loop/message_loop.h" +#include "base/strings/string_number_conversions.h" #include "components/gcm_driver/gcm_driver_desktop.h" #include "crypto/random.h" @@ -23,19 +24,50 @@ InstanceID* InstanceID::Create(const std::string& app_id, InstanceIDImpl::InstanceIDImpl(const std::string& app_id, gcm::GCMDriver* gcm_driver) : InstanceID(app_id), - gcm_driver_(gcm_driver) { + gcm_driver_(gcm_driver), + load_from_store_(false), + weak_ptr_factory_(this) { + gcm_driver_->GetInstanceIDStore()->GetInstanceIDData( + app_id, + base::Bind(&InstanceIDImpl::GetInstanceIDDataCompleted, + weak_ptr_factory_.GetWeakPtr())); } InstanceIDImpl::~InstanceIDImpl() { } -std::string InstanceIDImpl::GetID() { +void InstanceIDImpl::GetID(const GetIDCallback& callback) { + if (!delayed_task_controller_.CanRunTaskWithoutDelay()) { + delayed_task_controller_.AddTask( + base::Bind(&InstanceIDImpl::DoGetID, + weak_ptr_factory_.GetWeakPtr(), + callback)); + return; + } + + DoGetID(callback); +} + +void InstanceIDImpl::DoGetID(const GetIDCallback& callback) { EnsureIDGenerated(); - return id_; + callback.Run(id_); +} + +void InstanceIDImpl::GetCreationTime(const GetCreationTimeCallback& callback) { + if (!delayed_task_controller_.CanRunTaskWithoutDelay()) { + delayed_task_controller_.AddTask( + base::Bind(&InstanceIDImpl::DoGetCreationTime, + weak_ptr_factory_.GetWeakPtr(), + callback)); + return; + } + + DoGetCreationTime(callback); } -base::Time InstanceIDImpl::GetCreationTime() { - return creation_time_; +void InstanceIDImpl::DoGetCreationTime( + const GetCreationTimeCallback& callback) { + callback.Run(creation_time_); } void InstanceIDImpl::GetToken( @@ -53,7 +85,8 @@ void InstanceIDImpl::DeleteToken(const std::string& authorized_entity, } void InstanceIDImpl::DeleteID(const DeleteIDCallback& callback) { - // TODO(jianli): Delete the ID from the store. + gcm_driver_->GetInstanceIDStore()->RemoveInstanceIDData(app_id()); + id_.clear(); creation_time_ = base::Time(); @@ -62,6 +95,12 @@ void InstanceIDImpl::DeleteID(const DeleteIDCallback& callback) { base::Bind(callback, InstanceID::SUCCESS)); } +void InstanceIDImpl::GetInstanceIDDataCompleted( + const std::string& instance_id_data) { + Deserialize(instance_id_data); + delayed_task_controller_.SetReady(); +} + void InstanceIDImpl::EnsureIDGenerated() { if (!id_.empty()) return; @@ -91,7 +130,36 @@ void InstanceIDImpl::EnsureIDGenerated() { creation_time_ = base::Time::Now(); - // TODO(jianli): Save the ID to the store. + // Save to the persistent store. + gcm_driver_->GetInstanceIDStore()->AddInstanceIDData( + app_id(), SerializeAsString()); +} + +std::string InstanceIDImpl::SerializeAsString() const { + std::string serialized_data; + serialized_data += id_; + serialized_data += ","; + serialized_data += base::Int64ToString(creation_time_.ToInternalValue()); + return serialized_data; +} + +void InstanceIDImpl::Deserialize(const std::string& serialized_data) { + if (serialized_data.empty()) + return; + std::size_t pos = serialized_data.find(','); + if (pos == std::string::npos) { + DVLOG(1) << "Failed to deserialize the InstanceID data: " + serialized_data; + return; + } + + id_ = serialized_data.substr(0, pos); + + int64 time_internal = 0LL; + if (!base::StringToInt64(serialized_data.substr(pos + 1), &time_internal)) { + DVLOG(1) << "Failed to deserialize the InstanceID data: " + serialized_data; + return; + } + creation_time_ = base::Time::FromInternalValue(time_internal); } } // namespace instance_id |