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

Side by Side Diff: chrome/browser/notifications/sync_notifier/synced_notification_app_info_service.cc

Issue 193773003: Turn on and use the AppInfo data. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Turn on app info: fix windows build Created 6 years, 9 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 2014 The Chromium Authors. All rights reserved. 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 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 // The SyncedNotificationAppInfoService brings down read only metadata from the 5 // The SyncedNotificationAppInfoService brings down read only metadata from the
6 // sync server with information about the services sending synced notifications. 6 // sync server with information about the services sending synced notifications.
7 7
8 #include "chrome/browser/notifications/sync_notifier/synced_notification_app_inf o_service.h" 8 #include "chrome/browser/notifications/sync_notifier/synced_notification_app_inf o_service.h"
9 9
10 #include "chrome/browser/browser_process.h" 10 #include "chrome/browser/browser_process.h"
11 #include "chrome/browser/notifications/sync_notifier/chrome_notifier_service.h"
12 #include "chrome/browser/notifications/sync_notifier/chrome_notifier_service_fac tory.h"
11 #include "chrome/browser/profiles/profile.h" 13 #include "chrome/browser/profiles/profile.h"
12 #include "sync/api/sync_change.h" 14 #include "sync/api/sync_change.h"
13 #include "sync/api/sync_change_processor.h" 15 #include "sync/api/sync_change_processor.h"
14 #include "sync/api/sync_error_factory.h" 16 #include "sync/api/sync_error_factory.h"
15 #include "sync/protocol/sync.pb.h" 17 #include "sync/protocol/sync.pb.h"
16 #include "sync/protocol/synced_notification_app_info_specifics.pb.h" 18 #include "sync/protocol/synced_notification_app_info_specifics.pb.h"
17 #include "url/gurl.h" 19 #include "url/gurl.h"
18 20
19 namespace notifier { 21 namespace notifier {
20 22
23 bool SyncedNotificationAppInfoService::avoid_bitmap_fetching_for_test_ = false;
dewittj 2014/03/17 21:43:43 maybe a better way to do this is to have a bitmapf
Pete Williamson 2014/03/21 01:22:31 In my opinion the simplicity of having a flag is b
24
21 SyncedNotificationAppInfoService::SyncedNotificationAppInfoService( 25 SyncedNotificationAppInfoService::SyncedNotificationAppInfoService(
22 Profile* profile) 26 Profile* profile)
23 : profile_(profile) {} 27 : profile_(profile), chrome_notifier_service_(NULL) {}
24 28
25 SyncedNotificationAppInfoService::~SyncedNotificationAppInfoService() {} 29 SyncedNotificationAppInfoService::~SyncedNotificationAppInfoService() {}
26 30
27 // Methods from BrowserContextKeyedService. 31 // Methods from BrowserContextKeyedService.
28 void SyncedNotificationAppInfoService::Shutdown() {} 32 void SyncedNotificationAppInfoService::Shutdown() {}
29 33
30 // syncer::SyncableService implementation. 34 // syncer::SyncableService implementation.
31 35
32 // This is called at startup to sync with the sync data. This code is not thread 36 // This is called at startup to sync with the sync data. This code is not thread
33 // safe, it should only be called by sync on the browser thread. 37 // safe, it should only be called by sync on the browser thread.
(...skipping 115 matching lines...) Expand 10 before | Expand all | Expand 10 after
149 // Process each incoming app_info protobuf. 153 // Process each incoming app_info protobuf.
150 const std::string& name = incoming->settings_display_name(); 154 const std::string& name = incoming->settings_display_name();
151 DCHECK_GT(name.length(), 0U); 155 DCHECK_GT(name.length(), 0U);
152 if (name.length() == 0) { 156 if (name.length() == 0) {
153 // If there is no unique id (name), there is nothing we can do. 157 // If there is no unique id (name), there is nothing we can do.
154 return; 158 return;
155 } 159 }
156 160
157 SyncedNotificationAppInfo* found = FindSyncedNotificationAppInfoByName(name); 161 SyncedNotificationAppInfo* found = FindSyncedNotificationAppInfoByName(name);
158 162
159 if (NULL != found) { 163 std::vector<std::string> old_app_ids;
164 std::vector<std::string> new_app_ids;
165 std::vector<std::string> added_app_ids;
166 std::vector<std::string> removed_app_ids;
167
168 incoming->GetAppIdList(&new_app_ids);
169
170 if (NULL == found) {
171 added_app_ids = new_app_ids;
172 } else {
160 // When we have an update, some app id types may be added or removed. 173 // When we have an update, some app id types may be added or removed.
161 // Append to lists of added and removed types. 174 // Append to lists of added and removed types.
175 found->GetAppIdList(&old_app_ids);
176 incoming->GetAppIdList(&new_app_ids);
162 FreeSyncedNotificationAppInfoByName(name); 177 FreeSyncedNotificationAppInfoByName(name);
178
179 // Pre-reserve enough space in the output vectors because set_difference
180 // uses assignment to array elements, not push_back.
dewittj 2014/03/17 21:43:43 Consider using std::back_inserter here, like this:
Pete Williamson 2014/03/21 01:22:31 Done. Good catch, I'd forgotten about back_insert
181 size_t max_added_size = new_app_ids.size();
182 size_t max_removed_size = old_app_ids.size();
183 for (size_t ii = 0; ii < max_added_size; ++ii) {
184 added_app_ids.push_back(std::string());
185 }
186 for (size_t jj = 0; jj < max_removed_size; ++jj) {
187 removed_app_ids.push_back(std::string());
188 }
189
190 // Set up for a set difference by sorting the lists.
191 std::sort(old_app_ids.begin(), old_app_ids.end());
192 std::sort(new_app_ids.begin(), new_app_ids.end());
193
194 // Calculate which app ids are removed (in old, but not in new app ids).
195 std::set_difference(old_app_ids.begin(),
196 old_app_ids.end(),
197 new_app_ids.begin(),
198 new_app_ids.end(),
199 removed_app_ids.begin());
200
201 // Calculate which app_ids are added (in new, but not in old app ids).
202 std::set_difference(new_app_ids.begin(),
203 new_app_ids.end(),
204 old_app_ids.begin(),
205 old_app_ids.end(),
206 added_app_ids.begin());
207 }
208
209 // Put these lists into the app_info object.
210 incoming->SetAddedAppIds(added_app_ids);
211 incoming->SetRemovedAppIds(removed_app_ids);
212
213 // Start bitmap fetch.
214 if (!avoid_bitmap_fetching_for_test_) {
215 incoming->QueueBitmapFetchJobs();
216 incoming->StartBitmapFetch();
217 } else {
218 OnBitmapFetchesDone(incoming->added_app_ids(), incoming->removed_app_ids());
163 } 219 }
164 220
165 sending_service_infos_.push_back(incoming.release()); 221 sending_service_infos_.push_back(incoming.release());
222 }
166 223
224 void SyncedNotificationAppInfoService::OnBitmapFetchesDone(
225 std::vector<std::string> added_app_ids,
226 std::vector<std::string> removed_app_ids) {
167 // Tell the Chrome Notifier Service so it can show any notifications that were 227 // Tell the Chrome Notifier Service so it can show any notifications that were
168 // waiting for the app id to arrive, and to remave any notifications that are 228 // waiting for the app id to arrive, and to remave any notifications that are
169 // no longer supported. 229 // no longer supported.
170 // TODO(petewil): Notify CNS of added ids 230 if (chrome_notifier_service_ != NULL) {
171 // TODO(petewil): Notify CNS of deleted ids. 231 chrome_notifier_service_->SetAddedAppIds(added_app_ids);
232 chrome_notifier_service_->SetRemovedAppIds(removed_app_ids);
233 }
172 } 234 }
173 235
174 // Static Method. Convert from a server protobuf to our internal format. 236 // Static Method. Convert from a server protobuf to our internal format.
175 scoped_ptr<SyncedNotificationAppInfo> 237 scoped_ptr<SyncedNotificationAppInfo>
176 SyncedNotificationAppInfoService::CreateSyncedNotificationAppInfoFromProtobuf( 238 SyncedNotificationAppInfoService::CreateSyncedNotificationAppInfoFromProtobuf(
177 const sync_pb::SyncedNotificationAppInfo& server_app_info) { 239 const sync_pb::SyncedNotificationAppInfo& server_app_info) {
178 240
179 // Check for mandatory fields in the sync_data object. 241 // Check for mandatory fields in the sync_data object.
180 std::string display_name; 242 std::string display_name;
181 if (server_app_info.has_settings_display_name()) { 243 if (server_app_info.has_settings_display_name()) {
182 display_name = server_app_info.settings_display_name(); 244 display_name = server_app_info.settings_display_name();
183 } 245 }
184 scoped_ptr<SyncedNotificationAppInfo> app_info; 246 scoped_ptr<SyncedNotificationAppInfo> app_info;
185 if (display_name.length() == 0) 247 if (display_name.length() == 0)
186 return app_info.Pass(); 248 return app_info.Pass();
187 249
188 // Create a new app info object based on the supplied protobuf. 250 // Create a new app info object based on the supplied protobuf.
189 app_info.reset(new SyncedNotificationAppInfo(display_name)); 251 app_info.reset(new SyncedNotificationAppInfo(profile_, display_name, this));
190 252
191 // TODO(petewil): Eventually we will add the monochrome icon here, and we may 253 // TODO(petewil): Eventually we will add the monochrome icon here, and we may
192 // need to fetch the correct url for the current DPI. 254 // need to fetch the correct url for the current DPI.
193 // Add the icon URL, if any. 255 // Add the icon URL, if any.
194 if (server_app_info.has_icon()) { 256 if (server_app_info.has_icon()) {
195 std::string icon_url = server_app_info.icon().url(); 257 std::string icon_url = server_app_info.icon().url();
196 app_info->SetSettingsIcon(GURL(icon_url)); 258 app_info->SetSettingsIcon(GURL(icon_url));
197 } 259 }
198 260
199 // Add all the AppIds from the protobuf. 261 // Add all the AppIds from the protobuf.
(...skipping 15 matching lines...) Expand all
215 it != sending_service_infos_.end(); 277 it != sending_service_infos_.end();
216 ++it) { 278 ++it) {
217 SyncedNotificationAppInfo* app_info = *it; 279 SyncedNotificationAppInfo* app_info = *it;
218 if (name == app_info->settings_display_name()) 280 if (name == app_info->settings_display_name())
219 return *it; 281 return *it;
220 } 282 }
221 283
222 return NULL; 284 return NULL;
223 } 285 }
224 286
287 // This returns a pointer into a vector that we own. Caller must not free it.
288 // Returns NULL if no match is found.
289 notifier::SyncedNotificationAppInfo*
290 SyncedNotificationAppInfoService::FindSyncedNotificationAppInfoByAppId(
291 const std::string& app_id) {
292 for (ScopedVector<SyncedNotificationAppInfo>::const_iterator it =
293 sending_service_infos_.begin();
294 it != sending_service_infos_.end();
295 ++it) {
296 SyncedNotificationAppInfo* app_info = *it;
297 if (app_info->HasAppId(app_id))
298 return *it;
299 }
300
301 return NULL;
302 }
303
304 // Lookup the sending service name for a given app id.
305 std::string SyncedNotificationAppInfoService::FindSendingServiceNameFromAppId(
306 const std::string app_id) {
307 for (ScopedVector<SyncedNotificationAppInfo>::const_iterator it =
308 sending_service_infos_.begin();
309 it != sending_service_infos_.end();
310 ++it) {
311 SyncedNotificationAppInfo* app_info = *it;
312 if (app_info->HasAppId(app_id))
313 return app_info->settings_display_name();
314 }
315
316 return std::string();
317 }
318
225 void SyncedNotificationAppInfoService::FreeSyncedNotificationAppInfoByName( 319 void SyncedNotificationAppInfoService::FreeSyncedNotificationAppInfoByName(
226 const std::string& name) { 320 const std::string& name) {
227 ScopedVector<SyncedNotificationAppInfo>::iterator it = 321 ScopedVector<SyncedNotificationAppInfo>::iterator it =
228 sending_service_infos_.begin(); 322 sending_service_infos_.begin();
229 for (; it != sending_service_infos_.end(); ++it) { 323 for (; it != sending_service_infos_.end(); ++it) {
230 SyncedNotificationAppInfo* app_info = *it; 324 SyncedNotificationAppInfo* app_info = *it;
231 if (name == app_info->settings_display_name()) { 325 if (name == app_info->settings_display_name()) {
232 sending_service_infos_.erase(it); 326 sending_service_infos_.erase(it);
233 return; 327 return;
234 } 328 }
235 } 329 }
236 } 330 }
237 331
332 std::vector<std::string>
333 SyncedNotificationAppInfoService::GetAllSendingServiceNames() {
334 std::vector<std::string> names;
335 ScopedVector<SyncedNotificationAppInfo>::iterator it =
336 sending_service_infos_.begin();
337
338 for (; it != sending_service_infos_.end(); ++it) {
339 SyncedNotificationAppInfo* app_info = *it;
340 names.push_back(app_info->settings_display_name());
341 }
342
343 return names;
344 }
345
238 // Add a new app info to our data structure. This takes ownership 346 // Add a new app info to our data structure. This takes ownership
239 // of the passed in pointer. 347 // of the passed in pointer.
240 void SyncedNotificationAppInfoService::Add( 348 void SyncedNotificationAppInfoService::Add(
241 scoped_ptr<SyncedNotificationAppInfo> app_info) { 349 scoped_ptr<SyncedNotificationAppInfo> app_info) {
242 sending_service_infos_.push_back(app_info.release()); 350 sending_service_infos_.push_back(app_info.release());
243 } 351 }
244 352
245 } // namespace notifier 353 } // namespace notifier
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698