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

Side by Side Diff: google_apis/gcm/engine/user_list.cc

Issue 135303002: Adding a user list (to be consumed by GCM Client Implementation) (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 6 years, 11 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.
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 "google_apis/gcm/engine/user_list.h"
6
7 #include "base/bind.h"
8 #include "base/files/file_path.h"
9 #include "base/location.h"
10 #include "base/logging.h"
11 #include "base/memory/scoped_ptr.h"
12 #include "base/message_loop/message_loop_proxy.h"
13 #include "base/sequenced_task_runner.h"
14 #include "base/strings/string_number_conversions.h"
15 #include "base/strings/string_piece.h"
16 #include "third_party/leveldatabase/src/include/leveldb/db.h"
17
18 namespace {
19 const int64 kSerialNumberMissing = -1;
20 } // namespace
21
22 namespace gcm {
23
24 UserList::UserDelegate::UserDelegate(const std::string& username,
25 GCMClient::Delegate* delegate)
26 : username(username),
27 serial_number(kSerialNumberMissing),
28 delegate(delegate) {}
29
30 UserList::UserDelegate::UserDelegate(const std::string& username,
31 int64 serial_number)
32 : username(username), serial_number(serial_number), delegate(NULL) {}
jianli 2014/01/13 19:19:55 nit: try not to put everything in one line such th
fgorski 2014/01/14 22:25:42 Done. However "git cl format" reverts that change.
33
34 UserList::UserDelegate::~UserDelegate() {}
jianli 2014/01/13 19:19:55 nit: try not to put {} in one line such that we ca
fgorski 2014/01/14 22:25:42 Done. Again "git cl format" does that, not me.
35
36 UserList::UserList(GCMStore* gcm_store) : gcm_store_(gcm_store) {}
Nicolas Zea 2014/01/13 19:26:06 initialize next_serial_number_ to 0 (or possibly -
fgorski 2014/01/14 22:25:42 Done.
37
38 UserList::~UserList() {}
39
40 void UserList::Initialize(const GCMStore::LoadResult& result) {
41 if (result.success) {
jianli 2014/01/13 19:19:55 nit: It would be better to return upon error first
fgorski 2014/01/14 22:25:42 Removed the checked as we no longer have access to
42 next_serial_number_ = result.next_serial_number;
43 for (std::map<std::string, int64>::const_iterator iter =
44 result.user_serial_numbers.begin();
45 iter != result.user_serial_numbers.end();
46 ++iter) {
47 SetSerialNumber(iter->first, iter->second);
48 }
49 } else {
50 LOG(ERROR) << "Loading of GCM User List completed with error.";
51 }
52 }
53
54 void UserList::AddDelegate(const std::string& username,
55 GCMClient::Delegate* delegate) {
56 DCHECK(!username.empty());
57 DCHECK(delegate);
58
59 DelegateList::iterator iter = GetByUsernameForUpdate(username);
60 if (iter == delegates_.end())
jianli 2014/01/13 19:19:55 nit: if you add brackets for one part, you'd bette
fgorski 2014/01/14 22:25:42 Done.
61 delegates_.insert(iter, UserDelegate(username, delegate));
62 else {
63 DCHECK(!iter->delegate);
64 iter->delegate = delegate;
65 }
66 }
67
68 void UserList::AddSerialNumber(const std::string& username,
69 int64 serial_number,
70 const GCMStore::UpdateCallback& callback) {
71 SetSerialNumber(username, serial_number);
72 gcm_store_->AddUserSerialNumber(username, serial_number, callback);
73 }
74
75 GCMClient::Delegate* UserList::GetDelegateBySerialNumber(int64 serial_number)
76 const {
77 for (DelegateList::const_iterator iter = delegates_.begin();
78 iter != delegates_.end();
79 ++iter) {
80 if (iter->serial_number == serial_number)
81 return iter->delegate;
82 }
83 return NULL;
84 }
85
86 GCMClient::Delegate* UserList::GetDelegateByUsername(
87 const std::string& username) const {
88 DelegateList::const_iterator iter = GetByUsername(username);
89 if (iter != delegates_.end())
90 return iter->delegate;
91 return NULL;
92 }
93
94 bool UserList::GetSerialNumberForUsername(const std::string& username,
95 int64* serial_number) const {
96 DelegateList::const_iterator iter = GetByUsername(username);
97 if (iter == delegates_.end() || iter->serial_number == kSerialNumberMissing)
98 return false;
99 *serial_number = iter->serial_number;
100 return true;
101 }
102
103 int64 UserList::GetNextSerialNumber() {
104 int64 serial_number = next_serial_number_++;
105 gcm_store_->SetNextSerialNumber(
106 serial_number,
107 base::Bind(&UserList::NextSerialNumberUpdateCompleted,
108 base::Unretained(this)));
109 return serial_number;
110 }
111
112 UserList::DelegateList::const_iterator UserList::GetByUsername(
113 const std::string& username) const {
114 for (DelegateList::const_iterator iter = delegates_.begin();
115 iter != delegates_.end();
116 ++iter) {
117 if (iter->username == username)
118 return iter;
119 }
120 return delegates_.end();
121 }
122
123 UserList::DelegateList::iterator UserList::GetByUsernameForUpdate(
124 const std::string& username) {
125 for (DelegateList::iterator iter = delegates_.begin();
126 iter != delegates_.end();
127 ++iter) {
128 if (iter->username == username)
129 return iter;
130 }
131 return delegates_.end();
132 }
133
134 void UserList::NextSerialNumberUpdateCompleted(bool success) {
135 // TODO(fgorski) We could retry the update if it is unsuccessful.
136 // I should change the callback to a method that gives a pair: success, and
137 // assigned serial_number, that way the registration can ensure not to have
138 // collisions. Fetcher is expected to be slower anyway.
139 DCHECK(success) << "Updating the next serial number failed.";
140 }
141
142 void UserList::SetSerialNumber(const std::string& username,
143 int64 serial_number) {
144 DCHECK(!username.empty());
145 DCHECK_GT(serial_number, 0L);
146
147 DelegateList::iterator iter = GetByUsernameForUpdate(username);
148 if (iter == delegates_.end()) {
149 delegates_.insert(iter, UserDelegate(username, serial_number));
150 } else {
151 DCHECK_EQ(iter->serial_number, kSerialNumberMissing);
152 iter->serial_number = serial_number;
153 }
154 }
155
156 } // namespace gcm
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698