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

Side by Side Diff: chrome/browser/sync/notifier/server_notifier_thread.cc

Issue 2817037: Refactored ChromeInvalidationClient to have its own listener type. (Closed)
Patch Set: Addressed nick's comments Created 10 years, 5 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
1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2010 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 "chrome/browser/sync/notifier/server_notifier_thread.h" 5 #include "chrome/browser/sync/notifier/server_notifier_thread.h"
6 6
7 #include <string> 7 #include <string>
8 #include <vector> 8 #include <vector>
9 9
10 #include "base/logging.h" 10 #include "base/logging.h"
11 #include "chrome/browser/sync/notifier/cache_invalidation_packet_handler.h"
12 #include "chrome/browser/sync/notifier/chrome_invalidation_client.h" 11 #include "chrome/browser/sync/notifier/chrome_invalidation_client.h"
13 #include "chrome/browser/sync/notifier/chrome_system_resources.h"
14 #include "chrome/browser/sync/notifier/invalidation_util.h"
15 #include "chrome/browser/sync/syncable/model_type.h"
16 #include "chrome/common/net/notifier/listener/notification_defines.h" 12 #include "chrome/common/net/notifier/listener/notification_defines.h"
17 #include "google/cacheinvalidation/invalidation-client-impl.h"
18 #include "talk/xmpp/jid.h"
19 13
20 namespace sync_notifier { 14 namespace sync_notifier {
21 15
22 ServerNotifierThread::ServerNotifierThread() {} 16 ServerNotifierThread::ServerNotifierThread() {}
23 17
24 ServerNotifierThread::~ServerNotifierThread() {} 18 ServerNotifierThread::~ServerNotifierThread() {}
25 19
26 void ServerNotifierThread::ListenForUpdates() { 20 void ServerNotifierThread::ListenForUpdates() {
27 DCHECK_EQ(MessageLoop::current(), parent_message_loop_); 21 DCHECK_EQ(MessageLoop::current(), parent_message_loop_);
28 worker_message_loop()->PostTask( 22 worker_message_loop()->PostTask(
(...skipping 20 matching lines...) Expand all
49 MediatorThreadImpl::Logout(); 43 MediatorThreadImpl::Logout();
50 } 44 }
51 45
52 void ServerNotifierThread::SendNotification( 46 void ServerNotifierThread::SendNotification(
53 const OutgoingNotificationData& data) { 47 const OutgoingNotificationData& data) {
54 DCHECK_EQ(MessageLoop::current(), parent_message_loop_); 48 DCHECK_EQ(MessageLoop::current(), parent_message_loop_);
55 NOTREACHED() << "Shouldn't send notifications if " 49 NOTREACHED() << "Shouldn't send notifications if "
56 << "ServerNotifierThread is used"; 50 << "ServerNotifierThread is used";
57 } 51 }
58 52
59 void ServerNotifierThread::Invalidate( 53 void ServerNotifierThread::OnInvalidate(syncable::ModelType model_type) {
60 const invalidation::Invalidation& invalidation,
61 invalidation::Closure* callback) {
62 DCHECK_EQ(MessageLoop::current(), worker_message_loop()); 54 DCHECK_EQ(MessageLoop::current(), worker_message_loop());
63 CHECK(invalidation::IsCallbackRepeatable(callback)); 55 LOG(INFO) << "OnInvalidate: " << syncable::ModelTypeToString(model_type);
64 LOG(INFO) << "Invalidate: " << InvalidationToString(invalidation);
65 // TODO(akalin): Signal notification only for the invalidated types. 56 // TODO(akalin): Signal notification only for the invalidated types.
66 parent_message_loop_->PostTask( 57 parent_message_loop_->PostTask(
67 FROM_HERE, 58 FROM_HERE,
68 NewRunnableMethod( 59 NewRunnableMethod(
69 this, 60 this,
70 &ServerNotifierThread::SignalIncomingNotification)); 61 &ServerNotifierThread::SignalIncomingNotification));
71 RunAndDeleteClosure(callback);
72 } 62 }
73 63
74 void ServerNotifierThread::InvalidateAll( 64 void ServerNotifierThread::OnInvalidateAll() {
75 invalidation::Closure* callback) {
76 DCHECK_EQ(MessageLoop::current(), worker_message_loop()); 65 DCHECK_EQ(MessageLoop::current(), worker_message_loop());
77 CHECK(invalidation::IsCallbackRepeatable(callback)); 66 LOG(INFO) << "OnInvalidateAll";
78 LOG(INFO) << "InvalidateAll";
79 parent_message_loop_->PostTask( 67 parent_message_loop_->PostTask(
80 FROM_HERE, 68 FROM_HERE,
81 NewRunnableMethod( 69 NewRunnableMethod(
82 this, 70 this,
83 &ServerNotifierThread::SignalIncomingNotification)); 71 &ServerNotifierThread::SignalIncomingNotification));
84 RunAndDeleteClosure(callback);
85 }
86
87 void ServerNotifierThread::AllRegistrationsLost(
88 invalidation::Closure* callback) {
89 DCHECK_EQ(MessageLoop::current(), worker_message_loop());
90 CHECK(invalidation::IsCallbackRepeatable(callback));
91 LOG(INFO) << "AllRegistrationsLost; reregistering";
92 RegisterTypes();
93 RunAndDeleteClosure(callback);
94 }
95
96 void ServerNotifierThread::RegistrationLost(
97 const invalidation::ObjectId& object_id,
98 invalidation::Closure* callback) {
99 DCHECK_EQ(MessageLoop::current(), worker_message_loop());
100 CHECK(invalidation::IsCallbackRepeatable(callback));
101 LOG(INFO) << "RegistrationLost; reregistering: "
102 << ObjectIdToString(object_id);
103 RegisterTypes();
104 RunAndDeleteClosure(callback);
105 } 72 }
106 73
107 void ServerNotifierThread::StartInvalidationListener() { 74 void ServerNotifierThread::StartInvalidationListener() {
108 DCHECK_EQ(MessageLoop::current(), worker_message_loop()); 75 DCHECK_EQ(MessageLoop::current(), worker_message_loop());
109 76
110 StopInvalidationListener(); 77 StopInvalidationListener();
111 chrome_invalidation_client_.reset(new ChromeInvalidationClient()); 78 chrome_invalidation_client_.reset(new ChromeInvalidationClient());
112 79
113 // TODO(akalin): Make cache_guid() part of the client ID. If we do 80 // TODO(akalin): Make cache_guid() part of the client ID. If we do
114 // so and we somehow propagate it up to the server somehow, we can 81 // so and we somehow propagate it up to the server somehow, we can
115 // make it so that we won't receive any notifications that were 82 // make it so that we won't receive any notifications that were
116 // generated from our own changes. 83 // generated from our own changes.
117 const std::string kClientId = "server_notifier_thread"; 84 const std::string kClientId = "server_notifier_thread";
118 chrome_invalidation_client_->Start(kClientId, this, xmpp_client()); 85 chrome_invalidation_client_->Start(kClientId, this, xmpp_client());
119 } 86 }
120 87
121 void ServerNotifierThread::RegisterTypesAndSignalSubscribed() { 88 void ServerNotifierThread::RegisterTypesAndSignalSubscribed() {
122 DCHECK_EQ(MessageLoop::current(), worker_message_loop()); 89 DCHECK_EQ(MessageLoop::current(), worker_message_loop());
123 RegisterTypes(); 90 chrome_invalidation_client_->RegisterTypes();
124 parent_message_loop_->PostTask( 91 parent_message_loop_->PostTask(
125 FROM_HERE, 92 FROM_HERE,
126 NewRunnableMethod( 93 NewRunnableMethod(
127 this, 94 this,
128 &ServerNotifierThread::SignalSubscribed)); 95 &ServerNotifierThread::SignalSubscribed));
129 } 96 }
130 97
131 void ServerNotifierThread::RegisterTypes() {
132 DCHECK_EQ(MessageLoop::current(), worker_message_loop());
133
134 // TODO(akalin): Make this configurable instead of listening to
135 // notifications for all possible types.
136 for (int i = syncable::FIRST_REAL_MODEL_TYPE;
137 i < syncable::MODEL_TYPE_COUNT; ++i) {
138 syncable::ModelType model_type = syncable::ModelTypeFromInt(i);
139 std::string notification_type;
140 if (!syncable::RealModelTypeToNotificationType(
141 model_type, &notification_type)) {
142 LOG(ERROR) << "Could not get notification type for model type "
143 << syncable::ModelTypeToString(model_type);
144 continue;
145 }
146 invalidation::ObjectId object_id;
147 object_id.mutable_name()->set_string_value(notification_type);
148 object_id.set_source(invalidation::ObjectId::CHROME_SYNC);
149 chrome_invalidation_client_->Register(
150 object_id,
151 invalidation::NewPermanentCallback(
152 this, &ServerNotifierThread::RegisterCallback));
153 }
154 }
155
156 void ServerNotifierThread::RegisterCallback(
157 const invalidation::RegistrationUpdateResult& result) {
158 DCHECK_EQ(MessageLoop::current(), worker_message_loop());
159 // TODO(akalin): Do something meaningful here.
160 LOG(INFO) << "Registered: " << RegistrationUpdateResultToString(result);
161 }
162
163 void ServerNotifierThread::SignalSubscribed() { 98 void ServerNotifierThread::SignalSubscribed() {
164 DCHECK_EQ(MessageLoop::current(), parent_message_loop_); 99 DCHECK_EQ(MessageLoop::current(), parent_message_loop_);
165 if (delegate_) { 100 if (delegate_) {
166 delegate_->OnSubscriptionStateChange(true); 101 delegate_->OnSubscriptionStateChange(true);
167 } 102 }
168 } 103 }
169 104
170 void ServerNotifierThread::SignalIncomingNotification() { 105 void ServerNotifierThread::SignalIncomingNotification() {
171 DCHECK_EQ(MessageLoop::current(), parent_message_loop_); 106 DCHECK_EQ(MessageLoop::current(), parent_message_loop_);
172 if (delegate_) { 107 if (delegate_) {
173 // TODO(akalin): Fill this in with something meaningful. 108 // TODO(akalin): Fill this in with something meaningful.
174 IncomingNotificationData notification_data; 109 IncomingNotificationData notification_data;
175 delegate_->OnIncomingNotification(notification_data); 110 delegate_->OnIncomingNotification(notification_data);
176 } 111 }
177 } 112 }
178 113
179 void ServerNotifierThread::StopInvalidationListener() { 114 void ServerNotifierThread::StopInvalidationListener() {
180 DCHECK_EQ(MessageLoop::current(), worker_message_loop()); 115 DCHECK_EQ(MessageLoop::current(), worker_message_loop());
181
182 if (chrome_invalidation_client_.get()) {
183 // TODO(akalin): Need to do unregisters here?
184 chrome_invalidation_client_->Stop();
185 }
186 chrome_invalidation_client_.reset(); 116 chrome_invalidation_client_.reset();
187 } 117 }
188 118
189 } // namespace sync_notifier 119 } // namespace sync_notifier
OLDNEW
« no previous file with comments | « chrome/browser/sync/notifier/server_notifier_thread.h ('k') | chrome/browser/sync/tools/sync_listen_notifications.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698