summaryrefslogtreecommitdiffstats
path: root/chromium/google_apis/gcm/base/mcs_util.cc
diff options
context:
space:
mode:
Diffstat (limited to 'chromium/google_apis/gcm/base/mcs_util.cc')
-rw-r--r--chromium/google_apis/gcm/base/mcs_util.cc61
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