diff options
Diffstat (limited to 'chromium/google_apis/gcm/base/mcs_util.cc')
-rw-r--r-- | chromium/google_apis/gcm/base/mcs_util.cc | 61 |
1 files changed, 45 insertions, 16 deletions
diff --git a/chromium/google_apis/gcm/base/mcs_util.cc b/chromium/google_apis/gcm/base/mcs_util.cc index 736556079f8..b578e573922 100644 --- a/chromium/google_apis/gcm/base/mcs_util.cc +++ b/chromium/google_apis/gcm/base/mcs_util.cc @@ -8,6 +8,8 @@ #include "base/logging.h" #include "base/strings/string_number_conversions.h" #include "base/strings/stringprintf.h" +#include "base/time/clock.h" +#include "base/time/time.h" namespace gcm { @@ -37,17 +39,21 @@ const char* kProtoNames[] = { COMPILE_ASSERT(arraysize(kProtoNames) == kNumProtoTypes, ProtoNamesMustIncludeAllTags); -// TODO(zea): replace these with proper values. -const char kLoginId[] = "login-1"; +const char kLoginId[] = "chrome-"; const char kLoginDomain[] = "mcs.android.com"; const char kLoginDeviceIdPrefix[] = "android-"; -const char kLoginSettingName[] = "new_vc"; -const char kLoginSettingValue[] = "1"; +const char kLoginSettingDefaultName[] = "new_vc"; +const char kLoginSettingDefaultValue[] = "1"; + +// Maximum amount of time to save an unsent outgoing message for. +const int kMaxTTLSeconds = 4 * 7 * 24 * 60 * 60; // 4 weeks. } // namespace -scoped_ptr<mcs_proto::LoginRequest> BuildLoginRequest(uint64 auth_id, - uint64 auth_token) { +scoped_ptr<mcs_proto::LoginRequest> BuildLoginRequest( + uint64 auth_id, + uint64 auth_token, + const std::string& version_string) { // Create a hex encoded auth id for the device id field. std::string auth_id_hex; auth_id_hex = base::StringPrintf("%" PRIx64, auth_id); @@ -58,12 +64,10 @@ scoped_ptr<mcs_proto::LoginRequest> BuildLoginRequest(uint64 auth_id, scoped_ptr<mcs_proto::LoginRequest> login_request( new mcs_proto::LoginRequest()); - // TODO(zea): set better values. - login_request->set_account_id(1000000); login_request->set_adaptive_heartbeat(false); login_request->set_auth_service(mcs_proto::LoginRequest::ANDROID_ID); login_request->set_auth_token(auth_token_str); - login_request->set_id(kLoginId); + login_request->set_id(kLoginId + version_string); login_request->set_domain(kLoginDomain); login_request->set_device_id(kLoginDeviceIdPrefix + auth_id_hex); login_request->set_network_type(1); @@ -72,8 +76,8 @@ scoped_ptr<mcs_proto::LoginRequest> BuildLoginRequest(uint64 auth_id, login_request->set_use_rmq2(true); login_request->add_setting(); - login_request->mutable_setting(0)->set_name(kLoginSettingName); - login_request->mutable_setting(0)->set_value(kLoginSettingValue); + login_request->mutable_setting(0)->set_name(kLoginSettingDefaultName); + login_request->mutable_setting(0)->set_value(kLoginSettingDefaultValue); return login_request.Pass(); } @@ -209,25 +213,50 @@ void SetLastStreamIdReceived(uint32 val, if (protobuf->GetTypeName() == kProtoNames[kIqStanzaTag]) { reinterpret_cast<mcs_proto::IqStanza*>(protobuf)-> set_last_stream_id_received(val); - return; + return; } else if (protobuf->GetTypeName() == kProtoNames[kHeartbeatPingTag]) { reinterpret_cast<mcs_proto::HeartbeatPing*>(protobuf)-> set_last_stream_id_received(val); - return; + return; } else if (protobuf->GetTypeName() == kProtoNames[kHeartbeatAckTag]) { reinterpret_cast<mcs_proto::HeartbeatAck*>(protobuf)-> set_last_stream_id_received(val); - return; + return; } else if (protobuf->GetTypeName() == kProtoNames[kDataMessageStanzaTag]) { reinterpret_cast<mcs_proto::DataMessageStanza*>(protobuf)-> set_last_stream_id_received(val); - return; + return; } else if (protobuf->GetTypeName() == kProtoNames[kLoginResponseTag]) { reinterpret_cast<mcs_proto::LoginResponse*>(protobuf)-> set_last_stream_id_received(val); - return; + return; } NOTREACHED(); } +bool HasTTLExpired(const google::protobuf::MessageLite& protobuf, + base::Clock* clock) { + if (protobuf.GetTypeName() != kProtoNames[kDataMessageStanzaTag]) + return false; + uint64 ttl = GetTTL(protobuf); + uint64 sent = + reinterpret_cast<const mcs_proto::DataMessageStanza*>(&protobuf)->sent(); + DCHECK(sent); + return ttl > 0 && + clock->Now() > + base::Time::FromInternalValue( + (sent + ttl) * base::Time::kMicrosecondsPerSecond); +} + +int GetTTL(const google::protobuf::MessageLite& protobuf) { + if (protobuf.GetTypeName() != kProtoNames[kDataMessageStanzaTag]) + return 0; + const mcs_proto::DataMessageStanza* data_message = + reinterpret_cast<const mcs_proto::DataMessageStanza*>(&protobuf); + if (!data_message->has_ttl()) + return kMaxTTLSeconds; + DCHECK_LE(data_message->ttl(), kMaxTTLSeconds); + return data_message->ttl(); +} + } // namespace gcm |