Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(273)

Side by Side Diff: sync/internal_api/public/base/invalidation.cc

Issue 23441042: Refactor common invalidation framework types (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Rebase Created 7 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright 2012 The Chromium Authors. All rights reserved. 1 // Copyright 2012 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 "sync/internal_api/public/base/invalidation.h" 5 #include "sync/internal_api/public/base/invalidation.h"
6 6
7 #include <cstddef> 7 #include <cstddef>
8
9 #include "base/json/json_string_value_serializer.h"
8 #include "base/rand_util.h" 10 #include "base/rand_util.h"
9 #include "base/strings/string_number_conversions.h" 11 #include "base/strings/string_number_conversions.h"
10 #include "base/values.h" 12 #include "base/values.h"
13 #include "sync/notifier/invalidation_util.h"
11 14
12 namespace syncer { 15 namespace syncer {
13 16
14 namespace { 17 namespace {
15 // Hopefully enough bytes for uniqueness. 18 const char kObjectIdKey[] = "objectId";
16 const size_t kBytesInHandle = 16; 19 const char kIsUnknownVersionKey[] = "isUnknownVersion";
17 } // namespace 20 const char kVersionKey[] = "version";
18 21 const char kPayloadKey[] = "payload";
19 AckHandle AckHandle::CreateUnique() {
20 // This isn't a valid UUID, so we don't attempt to format it like one.
21 uint8 random_bytes[kBytesInHandle];
22 base::RandBytes(random_bytes, sizeof(random_bytes));
23 return AckHandle(base::HexEncode(random_bytes, sizeof(random_bytes)),
24 base::Time::Now());
25 } 22 }
26 23
27 AckHandle AckHandle::InvalidAckHandle() { 24 Invalidation Invalidation::Init(
28 return AckHandle(std::string(), base::Time()); 25 const invalidation::ObjectId& id,
26 int64 version,
27 const std::string& payload) {
28 return Invalidation(id, false, version, payload, AckHandle::CreateUnique());
29 } 29 }
30 30
31 bool AckHandle::Equals(const AckHandle& other) const { 31 Invalidation Invalidation::InitUnknownVersion(
32 return state_ == other.state_ && timestamp_ == other.timestamp_; 32 const invalidation::ObjectId& id) {
33 return Invalidation(id, true, -1, "", AckHandle::CreateUnique());
tim (not reviewing) 2013/09/20 21:53:46 std::string vs ""
rlarocque 2013/09/23 18:38:19 Done.
33 } 34 }
34 35
35 scoped_ptr<base::DictionaryValue> AckHandle::ToValue() const { 36 Invalidation::Invalidation()
36 scoped_ptr<base::DictionaryValue> value(new base::DictionaryValue()); 37 : ack_handle_(AckHandle::InvalidAckHandle()) {}
37 value->SetString("state", state_); 38
38 value->SetString("timestamp", 39 Invalidation::~Invalidation() {}
39 base::Int64ToString(timestamp_.ToInternalValue())); 40
40 return value.Pass(); 41 invalidation::ObjectId Invalidation::GetObjectId() const {
tim (not reviewing) 2013/09/20 21:53:46 style guide would have this called id(). Or objec
rlarocque 2013/09/23 18:38:19 True. Lately, I've been reluctant to follow that
42 return id_;
41 } 43 }
42 44
43 bool AckHandle::ResetFromValue(const base::DictionaryValue& value) { 45 bool Invalidation::IsUnknownVersion() const {
44 if (!value.GetString("state", &state_)) 46 return is_unknown_version_;
45 return false;
46 std::string timestamp_as_string;
47 if (!value.GetString("timestamp", &timestamp_as_string))
48 return false;
49 int64 timestamp_value;
50 if (!base::StringToInt64(timestamp_as_string, &timestamp_value))
51 return false;
52 timestamp_ = base::Time::FromInternalValue(timestamp_value);
53 return true;
54 } 47 }
55 48
56 bool AckHandle::IsValid() const { 49 int64 Invalidation::GetVersion() const {
57 return !state_.empty(); 50 DCHECK(!is_unknown_version_);
tim (not reviewing) 2013/09/20 21:53:46 should be named version()... this is logically jus
rlarocque 2013/09/23 18:38:19 Done.
51 return version_;
58 } 52 }
59 53
60 AckHandle::AckHandle(const std::string& state, base::Time timestamp) 54 const std::string& Invalidation::GetPayload() const {
61 : state_(state), timestamp_(timestamp) { 55 DCHECK(!is_unknown_version_);
56 return payload_;
62 } 57 }
63 58
64 AckHandle::~AckHandle() { 59 const AckHandle& Invalidation::GetAckHandle() const {
60 return ack_handle_;
65 } 61 }
66 62
67 const int64 Invalidation::kUnknownVersion = -1; 63 void Invalidation::SetAckHandle(const AckHandle& ack_handle) {
68 64 ack_handle_ = ack_handle;
69 Invalidation::Invalidation()
70 : version(kUnknownVersion), ack_handle(AckHandle::InvalidAckHandle()) {
71 } 65 }
72 66
73 Invalidation::~Invalidation() { 67 bool Invalidation::operator==(const Invalidation& other) const {
74 } 68 return id_ == other.id_
75 69 && is_unknown_version_ == other.is_unknown_version_
76 bool Invalidation::Equals(const Invalidation& other) const { 70 && version_ == other.version_
77 return (version == other.version) && (payload == other.payload) && 71 && payload_ == other.payload_;
tim (not reviewing) 2013/09/20 21:53:46 You're not including ack_handle_, was that intenti
rlarocque 2013/09/23 18:38:19 It was more or less intentional. The decision wil
tim (not reviewing) 2013/09/24 21:16:54 That makes sense. However in general, and especia
rlarocque 2013/09/25 00:40:00 Fixed. I had to add some boilerplate to get some
78 ack_handle.Equals(other.ack_handle);
79 } 72 }
80 73
81 scoped_ptr<base::DictionaryValue> Invalidation::ToValue() const { 74 scoped_ptr<base::DictionaryValue> Invalidation::ToValue() const {
82 scoped_ptr<base::DictionaryValue> value(new base::DictionaryValue()); 75 scoped_ptr<base::DictionaryValue> value(new base::DictionaryValue());
83 value->SetString("version", base::Int64ToString(version)); 76 value->Set(kObjectIdKey, ObjectIdToValue(id_).release());
84 value->SetString("payload", payload); 77 if (is_unknown_version_) {
85 value->Set("ackHandle", ack_handle.ToValue().release()); 78 value->SetBoolean(kIsUnknownVersionKey, true);
79 } else {
80 value->SetBoolean(kIsUnknownVersionKey, false);
81 value->SetString(kVersionKey, base::Int64ToString(version_));
82 value->SetString(kPayloadKey, payload_);
83 }
86 return value.Pass(); 84 return value.Pass();
87 } 85 }
88 86
89 bool Invalidation::ResetFromValue(const base::DictionaryValue& value) { 87 bool Invalidation::ResetFromValue(const base::DictionaryValue& value) {
90 const base::DictionaryValue* ack_handle_value = NULL; 88 const base::DictionaryValue* object_id_dict;
91 std::string version_as_string; 89 if (!value.GetDictionary(kObjectIdKey, &object_id_dict)
92 if (value.GetString("version", &version_as_string)) { 90 || !ObjectIdFromValue(*object_id_dict, &id_)) {
93 if (!base::StringToInt64(version_as_string, &version)) 91 DLOG(WARNING) << "Failed to parse id";
92 return false;
93 }
94 if (!value.GetBoolean(kIsUnknownVersionKey, &is_unknown_version_)) {
95 DLOG(WARNING) << "Failed to parse is_unknown_version flag";
96 return false;
97 }
98 if (is_unknown_version_) {
99 version_ = -1;
100 payload_ = "";
tim (not reviewing) 2013/09/20 21:53:46 std::string
rlarocque 2013/09/23 18:38:19 Done.
101 } else {
102 std::string version_as_string;
103 if (!value.GetString(kVersionKey, &version_as_string)
104 || !base::StringToInt64(version_as_string, &version_)) {
105 DLOG(WARNING) << "Failed to parse version";
94 return false; 106 return false;
95 } else { 107 }
96 version = kUnknownVersion; 108 if (!value.GetString(kPayloadKey, &payload_)) {
109 DLOG(WARNING) << "Failed to parse payload";
110 return false;
111 }
97 } 112 }
98 return 113 return true;
99 value.GetString("payload", &payload) &&
100 value.GetDictionary("ackHandle", &ack_handle_value) &&
101 ack_handle.ResetFromValue(*ack_handle_value);
102 } 114 }
103 115
116 std::string Invalidation::ToString() const {
117 std::string output;
118 JSONStringValueSerializer serializer(&output);
119 serializer.set_pretty_print(true);
120 serializer.Serialize(*ToValue().get());
121 return output;
122 }
123
124 Invalidation::Invalidation(
125 const invalidation::ObjectId& id,
126 bool is_unknown_version,
127 int64 version,
128 const std::string& payload,
129 AckHandle ack_handle)
130 : id_(id),
131 is_unknown_version_(is_unknown_version),
132 version_(version),
133 payload_(payload),
134 ack_handle_(ack_handle) {}
135
104 } // namespace syncer 136 } // namespace syncer
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698