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

Side by Side Diff: components/gcm_driver/registration_info.cc

Issue 1137463003: Support getting and deleting token for Instance ID. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Add new files Created 5 years, 7 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
OLDNEW
(Empty)
1 // Copyright 2014 The Chromium Authors. All rights reserved.
fgorski 2015/05/13 18:32:39 2015
jianli 2015/05/13 22:42:56 Done.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include "components/gcm_driver/registration_info.h"
6
7 #include "base/strings/string_util.h"
8
9 namespace gcm {
10
11 namespace {
12 const char kInsanceIDSerializationPrefix[] = "iid-";
13 const int kInsanceIDSerializationPrefixLength =
14 sizeof(kInsanceIDSerializationPrefix) / sizeof(char) - 1;
15 } // namespace
16
17 // static
18 scoped_ptr<RegistrationInfo> RegistrationInfo::BuildFromString(
19 const std::string& serialzied_key,
20 const std::string& serialzied_value,
21 std::string* registration_id) {
22 scoped_ptr<RegistrationInfo> registration;
23
24 if (StartsWithASCII(serialzied_key, kInsanceIDSerializationPrefix, true))
25 registration.reset(new InstanceIDTokenInfo);
26 else
27 registration.reset(new GCMRegistrationInfo);
28
29 if (!registration->Deserialize(serialzied_key,
30 serialzied_value,
31 registration_id))
32 registration.reset();
fgorski 2015/05/13 18:32:40 surround with {}
jianli 2015/05/13 22:42:56 Done.
33 return registration.Pass();
34 }
35
36 RegistrationInfo::RegistrationInfo() {
37 }
38
39 RegistrationInfo::~RegistrationInfo() {
40 }
41
42 // static
43 const GCMRegistrationInfo* GCMRegistrationInfo::FromRegistrationInfo(
44 const RegistrationInfo* registration_info) {
45 if (!registration_info || registration_info->GetType() != GCM_REGISTRATION)
46 return NULL;
47 return static_cast<const GCMRegistrationInfo*>(registration_info);
48 }
49
50 // static
51 GCMRegistrationInfo* GCMRegistrationInfo::FromRegistrationInfo(
52 RegistrationInfo* registration_info) {
53 if (!registration_info || registration_info->GetType() != GCM_REGISTRATION)
54 return NULL;
55 return static_cast<GCMRegistrationInfo*>(registration_info);
56 }
57
58 GCMRegistrationInfo::GCMRegistrationInfo() {
59 }
60
61 GCMRegistrationInfo::~GCMRegistrationInfo() {
62 }
63
64 RegistrationInfo::RegistrationType GCMRegistrationInfo::GetType() const {
65 return GCM_REGISTRATION;
66 }
67
68 std::string GCMRegistrationInfo::GetSerializedKey() const {
69 // Multiple registrations are not supported for legacy GCM. So the key is
70 // purely based on the application id.
71 return app_id;
72 }
73
74 std::string GCMRegistrationInfo::GetSerializedValue(
75 const std::string& registration_id) const {
76 if (sender_ids.empty() || registration_id.empty())
77 return std::string();
78
79 // Serialize as:
80 // sender1,sender2,...=reg_id
81 std::string value;
82 for (std::vector<std::string>::const_iterator iter = sender_ids.begin();
83 iter != sender_ids.end(); ++iter) {
84 DCHECK(!iter->empty() &&
85 iter->find(',') == std::string::npos &&
86 iter->find('=') == std::string::npos);
87 if (!value.empty())
88 value += ",";
89 value += *iter;
90 }
91
92 DCHECK(registration_id.find('=') == std::string::npos);
fgorski 2015/05/13 18:32:39 are we sure that is the case? Even if it had =, w
jianli 2015/05/13 22:42:56 I don't think registration ID will contain '='. Bu
93 value += '=';
94 value += registration_id;
95 return value;
96 }
97
98 bool GCMRegistrationInfo::Deserialize(
fgorski 2015/05/13 18:32:40 Will this deserialize what we have in store today?
jianli 2015/05/13 22:42:56 Yes. We still serialize and deserialize GCM regist
99 const std::string& serialzied_key,
100 const std::string& serialzied_value,
101 std::string* registration_id) {
102 if (serialzied_key.empty() || serialzied_value.empty())
103 return false;
104
105 // Application ID is same as the serialized key.
106 app_id = serialzied_key;
107
108 // Sender IDs and registration ID are constructed from the serialized value.
109 size_t pos = serialzied_value.find('=');
110 if (pos == std::string::npos)
111 return false;
112
113 std::string senders = serialzied_value.substr(0, pos);
114 std::string registration_id_str = serialzied_value.substr(pos + 1);
115
116 Tokenize(senders, ",", &sender_ids);
117
118 if (sender_ids.empty() || registration_id_str.empty()) {
119 sender_ids.clear();
120 registration_id_str.clear();
121 return false;
122 }
123
124 if (registration_id)
125 *registration_id = registration_id_str;
126
127 return true;
128 }
129
130 // static
131 const InstanceIDTokenInfo* InstanceIDTokenInfo::FromRegistrationInfo(
132 const RegistrationInfo* registration_info) {
133 if (!registration_info || registration_info->GetType() != INSTANCE_ID_TOKEN)
134 return NULL;
135 return static_cast<const InstanceIDTokenInfo*>(registration_info);
136 }
137
138 // static
139 InstanceIDTokenInfo* InstanceIDTokenInfo::FromRegistrationInfo(
140 RegistrationInfo* registration_info) {
141 if (!registration_info || registration_info->GetType() != INSTANCE_ID_TOKEN)
142 return NULL;
143 return static_cast<InstanceIDTokenInfo*>(registration_info);
144 }
145
146 InstanceIDTokenInfo::InstanceIDTokenInfo() {
147 }
148
149 InstanceIDTokenInfo::~InstanceIDTokenInfo() {
150 }
151
152 RegistrationInfo::RegistrationType InstanceIDTokenInfo::GetType() const {
153 return INSTANCE_ID_TOKEN;
154 }
155
156 std::string InstanceIDTokenInfo::GetSerializedKey() const {
157 DCHECK(authorized_entity.find(',') == std::string::npos &&
158 scope.find(',') == std::string::npos);
159
160 // Multiple registrations are supported for Instance ID. So the key is based
161 // on the combination of (app_id, authorized_entity, scope).
162
163 // Adds a prefix to differentiate easily with GCM registration key.
164 std::string key(kInsanceIDSerializationPrefix);
165 key += app_id;
166 key += ",";
167 key += authorized_entity;
168 key += ",";
169 key += scope;
170 return key;
171 }
172
173 std::string InstanceIDTokenInfo::GetSerializedValue(
174 const std::string& registration_id) const {
175 return registration_id;
176 }
177
178 bool InstanceIDTokenInfo::Deserialize(
179 const std::string& serialized_key,
180 const std::string& serialized_value,
181 std::string* registration_id) {
fgorski 2015/05/13 18:32:39 nit: token?
jianli 2015/05/13 22:42:56 I rather still call it registration_id since it is
182 if (serialized_key.empty() || serialized_value.empty())
183 return false;
184
185 if (!StartsWithASCII(serialized_key, kInsanceIDSerializationPrefix, true))
186 return false;
187
188 std::vector<std::string> fields;
189 Tokenize(serialized_key.substr(kInsanceIDSerializationPrefixLength),
190 ",",
191 &fields);
192 if (fields.size() != 3 || fields[0].empty() ||
193 fields[1].empty() || fields[2].empty())
194 return false;
fgorski 2015/05/13 18:32:40 {}
jianli 2015/05/13 22:42:56 Done.
195 app_id = fields[0];
196 authorized_entity = fields[1];
197 scope = fields[2];
198
199 // Registration ID is same as the serialized value;
200 if (registration_id)
201 *registration_id = serialized_value;
202
203 return true;
204 }
205
206 bool RegistrationInfoComparer::operator()(
207 const linked_ptr<RegistrationInfo>& a,
208 const linked_ptr<RegistrationInfo>& b) const {
209 DCHECK(a.get() && b.get());
210
211 // For GCMRegistrationInfo, the comparison is based on app_id only.
212 // For InstanceIDTokenInfo, the comparison is bsaed on
213 // <app_id, authorized_entity, scope>.
214 if (a->app_id < b->app_id)
215 return true;
216 if (a->app_id > b->app_id)
217 return false;
218
219 InstanceIDTokenInfo* iid_a =
220 InstanceIDTokenInfo::FromRegistrationInfo(a.get());
221 InstanceIDTokenInfo* iid_b =
222 InstanceIDTokenInfo::FromRegistrationInfo(b.get());
223
224 // !iid_a && !iid_b => false.
225 // !iid_a && iid_b => true.
fgorski 2015/05/13 18:32:40 add comment: GCM registrationID sort before instan
jianli 2015/05/13 22:42:56 Done.
226 if (!iid_a)
227 return iid_b != NULL;
228
229 // iid_a && !iid_b => false.
230 if (!iid_b)
231 return false;
232
233 // Otherwise, compare with authorized_entity and scope.
234 if (iid_a->authorized_entity < iid_b->authorized_entity)
235 return true;
236 if (iid_a->authorized_entity > iid_b->authorized_entity)
237 return false;
238 return iid_a->scope > iid_b->scope;
fgorski 2015/05/13 18:32:40 why not <, which would be natural way of doing it?
jianli 2015/05/13 22:42:56 It should be <. Sorry for my typo.
239 }
240
241 bool ExistsGCMRegistrationInMap(const RegistrationInfoMap& map,
242 const std::string& app_id) {
243 scoped_ptr<GCMRegistrationInfo> gcm_registration(new GCMRegistrationInfo);
244 gcm_registration->app_id = app_id;
245 return map.count(
246 make_linked_ptr<RegistrationInfo>(gcm_registration.release())) > 0;
247 }
248
249 } // namespace gcm
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698