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

Side by Side Diff: chromeos/dbus/shill_service_client.cc

Issue 12220025: Shill: ShillServiceClient destroys ShillClientHelpers when they are not need. (Closed) Base URL: http://git.chromium.org/chromium/src.git@master
Patch Set: Created 7 years, 10 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) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 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 "chromeos/dbus/shill_service_client.h" 5 #include "chromeos/dbus/shill_service_client.h"
6 6
7 #include "base/bind.h" 7 #include "base/bind.h"
8 #include "base/chromeos/chromeos_version.h" 8 #include "base/chromeos/chromeos_version.h"
9 #include "base/message_loop.h" 9 #include "base/message_loop.h"
10 #include "base/stl_util.h" 10 #include "base/stl_util.h"
(...skipping 22 matching lines...) Expand all
33 // "org.freedesktop.DBus.Error.UnknownMethod". crbug.com/130660 33 // "org.freedesktop.DBus.Error.UnknownMethod". crbug.com/130660
34 if (error_name == DBUS_ERROR_UNKNOWN_METHOD) 34 if (error_name == DBUS_ERROR_UNKNOWN_METHOD)
35 VLOG(1) << log_string; 35 VLOG(1) << log_string;
36 else 36 else
37 LOG(ERROR) << log_string; 37 LOG(ERROR) << log_string;
38 38
39 base::DictionaryValue empty_dictionary; 39 base::DictionaryValue empty_dictionary;
40 callback.Run(DBUS_METHOD_CALL_FAILURE, empty_dictionary); 40 callback.Run(DBUS_METHOD_CALL_FAILURE, empty_dictionary);
41 } 41 }
42 42
43 // ShillClientHelper callback wrappers.
44 // For each one of the different callback types in ShillClientHelper, we define
45 // a wrapper that attachs a clousure to the given callback. It allows to call a
stevenjb 2013/02/06 01:05:53 s/It allows to/This allows it to/
deymo 2013/02/06 05:44:45 Done.
46 // second callback (the clousure) after the first callback is called. This is
47 // used to get a notification in the ShillServiceClient when a MethodCall
48 // returns.
49
50 // * Wrapper for DictionaryValueCallback.
51 void RunDictionaryValueCallback(
52 base::ScopedClosureRunner* closure_runner,
53 const ShillClientHelper::DictionaryValueCallback& callback,
54 DBusMethodCallStatus call_status,
55 const DictionaryValue& argument) {
56 callback.Run(call_status, argument);
57 }
58
59 ShillClientHelper::DictionaryValueCallback
60 AttachClosureToDictionaryValueCallabck(
stevenjb 2013/02/06 01:05:53 s/abck/back
deymo 2013/02/06 05:44:45 =)
61 const ShillClientHelper::DictionaryValueCallback& callback,
62 const base::Closure& closure) {
63 return base::Bind(&RunDictionaryValueCallback,
64 base::Owned(new base::ScopedClosureRunner(closure)), callback);
65 }
66
67 // * Wrapper for ListValueCallback
68 void RunListValueCallback(
69 base::ScopedClosureRunner* closure_runner,
70 const ShillClientHelper::ListValueCallback& callback,
71 const ListValue& argument) {
72 callback.Run(argument);
73 }
74
75 ShillClientHelper::ListValueCallback AttachClosureToListValueCallback(
76 const ShillClientHelper::ListValueCallback& callback,
77 const base::Closure& closure) {
78 return base::Bind(&RunListValueCallback,
79 base::Owned(new base::ScopedClosureRunner(closure)), callback);
80 }
81
82 // * Wrapper for ErrorCallback
83 void RunErrorCallback(
84 base::ScopedClosureRunner* closure_runner,
85 const ShillClientHelper::ErrorCallback& callback,
86 const std::string& error_name,
87 const std::string& error_message) {
88 callback.Run(error_name, error_message);
89 }
90
91 ShillClientHelper::ErrorCallback AttachClosureToErrorCallback(
92 const ShillClientHelper::ErrorCallback& callback,
93 const base::Closure& closure) {
94 return base::Bind(&RunErrorCallback,
95 base::Owned(new base::ScopedClosureRunner(closure)), callback);
96 }
97
98 // * Wrapper for Closure
99 void RunClosure(base::ScopedClosureRunner* closure_runner,
100 const base::Closure& callback) {
101 callback.Run();
102 }
103
104 base::Closure AttachClosureToClosure(
105 const base::Closure& callback,
106 const base::Closure& closure) {
107 return base::Bind(&RunClosure,
108 base::Owned(new base::ScopedClosureRunner(closure)), callback);
109 }
110
43 // The ShillServiceClient implementation. 111 // The ShillServiceClient implementation.
44 class ShillServiceClientImpl : public ShillServiceClient { 112 class ShillServiceClientImpl : public ShillServiceClient {
45 public: 113 public:
46 explicit ShillServiceClientImpl(dbus::Bus* bus) 114 explicit ShillServiceClientImpl(dbus::Bus* bus)
47 : bus_(bus), 115 : bus_(bus),
48 helpers_deleter_(&helpers_) { 116 helpers_deleter_(&helpers_),
117 weak_ptr_factory_(this) {
49 } 118 }
50 119
51 ///////////////////////////////////// 120 /////////////////////////////////////
52 // ShillServiceClient overrides. 121 // ShillServiceClient overrides.
53 virtual void AddPropertyChangedObserver( 122 virtual void AddPropertyChangedObserver(
54 const dbus::ObjectPath& service_path, 123 const dbus::ObjectPath& service_path,
55 ShillPropertyChangedObserver* observer) OVERRIDE { 124 ShillPropertyChangedObserver* observer) OVERRIDE {
56 GetHelper(service_path)->AddPropertyChangedObserver(observer); 125 GetHelper(service_path)->AddPropertyChangedObserver(observer);
57 } 126 }
58 127
59 virtual void RemovePropertyChangedObserver( 128 virtual void RemovePropertyChangedObserver(
60 const dbus::ObjectPath& service_path, 129 const dbus::ObjectPath& service_path,
61 ShillPropertyChangedObserver* observer) OVERRIDE { 130 ShillPropertyChangedObserver* observer) OVERRIDE {
62 GetHelper(service_path)->RemovePropertyChangedObserver(observer); 131 GetHelper(service_path)->RemovePropertyChangedObserver(observer);
63 } 132 }
64 133
65 virtual void GetProperties(const dbus::ObjectPath& service_path, 134 virtual void GetProperties(const dbus::ObjectPath& service_path,
66 const DictionaryValueCallback& callback) OVERRIDE { 135 const DictionaryValueCallback& callback) OVERRIDE {
67 dbus::MethodCall method_call(flimflam::kFlimflamServiceInterface, 136 dbus::MethodCall method_call(flimflam::kFlimflamServiceInterface,
68 flimflam::kGetPropertiesFunction); 137 flimflam::kGetPropertiesFunction);
69 GetHelper(service_path)->CallDictionaryValueMethodWithErrorCallback( 138 GetHelper(service_path)->CallDictionaryValueMethodWithErrorCallback(
70 &method_call, 139 &method_call,
71 base::Bind(callback, DBUS_METHOD_CALL_SUCCESS), 140 base::Bind(
72 base::Bind(&OnGetPropertiesError, service_path, callback)); 141 AttachClosureToDictionaryValueCallabck(callback,
142 base::Bind(&ShillServiceClientImpl::HelperStatusUpdated,
143 weak_ptr_factory_.GetWeakPtr(), service_path)),
144 DBUS_METHOD_CALL_SUCCESS),
145 AttachClosureToErrorCallback(
146 base::Bind(&OnGetPropertiesError, service_path, callback),
147 base::Bind(&ShillServiceClientImpl::HelperStatusUpdated,
148 weak_ptr_factory_.GetWeakPtr(), service_path)));
stevenjb 2013/02/06 01:05:53 Rather than passing HelperStatusUpdate in each of
deymo 2013/02/06 05:44:45 If we do that we still need to pass the service_pa
stevenjb 2013/02/06 17:10:20 That sounds like it would be fine. It's definitely
73 } 149 }
74 150
75 virtual void SetProperty(const dbus::ObjectPath& service_path, 151 virtual void SetProperty(const dbus::ObjectPath& service_path,
76 const std::string& name, 152 const std::string& name,
77 const base::Value& value, 153 const base::Value& value,
78 const base::Closure& callback, 154 const base::Closure& callback,
79 const ErrorCallback& error_callback) OVERRIDE { 155 const ErrorCallback& error_callback) OVERRIDE {
80 dbus::MethodCall method_call(flimflam::kFlimflamServiceInterface, 156 dbus::MethodCall method_call(flimflam::kFlimflamServiceInterface,
81 flimflam::kSetPropertyFunction); 157 flimflam::kSetPropertyFunction);
82 dbus::MessageWriter writer(&method_call); 158 dbus::MessageWriter writer(&method_call);
83 writer.AppendString(name); 159 writer.AppendString(name);
84 ShillClientHelper::AppendValueDataAsVariant(&writer, value); 160 ShillClientHelper::AppendValueDataAsVariant(&writer, value);
85 GetHelper(service_path)->CallVoidMethodWithErrorCallback(&method_call, 161 GetHelper(service_path)->CallVoidMethodWithErrorCallback(
86 callback, 162 &method_call,
87 error_callback); 163 AttachClosureToClosure(callback,
hashimoto 2013/02/06 03:29:06 I think ScopedClosureRunner runs the closure on it
deymo 2013/02/06 05:44:45 Yes, the ScopedClosureRunner will run allways... b
164 base::Bind(&ShillServiceClientImpl::HelperStatusUpdated,
165 weak_ptr_factory_.GetWeakPtr(), service_path)),
166 AttachClosureToErrorCallback(error_callback,
167 base::Bind(&ShillServiceClientImpl::HelperStatusUpdated,
168 weak_ptr_factory_.GetWeakPtr(), service_path)));
88 } 169 }
89 170
90 virtual void ClearProperty(const dbus::ObjectPath& service_path, 171 virtual void ClearProperty(const dbus::ObjectPath& service_path,
91 const std::string& name, 172 const std::string& name,
92 const base::Closure& callback, 173 const base::Closure& callback,
93 const ErrorCallback& error_callback) OVERRIDE { 174 const ErrorCallback& error_callback) OVERRIDE {
94 dbus::MethodCall method_call(flimflam::kFlimflamServiceInterface, 175 dbus::MethodCall method_call(flimflam::kFlimflamServiceInterface,
95 flimflam::kClearPropertyFunction); 176 flimflam::kClearPropertyFunction);
96 dbus::MessageWriter writer(&method_call); 177 dbus::MessageWriter writer(&method_call);
97 writer.AppendString(name); 178 writer.AppendString(name);
98 GetHelper(service_path)->CallVoidMethodWithErrorCallback(&method_call, 179 GetHelper(service_path)->CallVoidMethodWithErrorCallback(
99 callback, 180 &method_call,
100 error_callback); 181 AttachClosureToClosure(callback,
182 base::Bind(&ShillServiceClientImpl::HelperStatusUpdated,
183 weak_ptr_factory_.GetWeakPtr(), service_path)),
184 AttachClosureToErrorCallback(error_callback,
185 base::Bind(&ShillServiceClientImpl::HelperStatusUpdated,
186 weak_ptr_factory_.GetWeakPtr(), service_path)));
101 } 187 }
102 188
103 189
104 virtual void ClearProperties(const dbus::ObjectPath& service_path, 190 virtual void ClearProperties(const dbus::ObjectPath& service_path,
105 const std::vector<std::string>& names, 191 const std::vector<std::string>& names,
106 const ListValueCallback& callback, 192 const ListValueCallback& callback,
107 const ErrorCallback& error_callback) OVERRIDE { 193 const ErrorCallback& error_callback) OVERRIDE {
108 dbus::MethodCall method_call(flimflam::kFlimflamServiceInterface, 194 dbus::MethodCall method_call(flimflam::kFlimflamServiceInterface,
109 shill::kClearPropertiesFunction); 195 shill::kClearPropertiesFunction);
110 dbus::MessageWriter writer(&method_call); 196 dbus::MessageWriter writer(&method_call);
111 writer.AppendArrayOfStrings(names); 197 writer.AppendArrayOfStrings(names);
112 GetHelper(service_path)->CallListValueMethodWithErrorCallback( 198 GetHelper(service_path)->CallListValueMethodWithErrorCallback(
113 &method_call, 199 &method_call,
114 callback, 200 AttachClosureToListValueCallback(callback,
115 error_callback); 201 base::Bind(&ShillServiceClientImpl::HelperStatusUpdated,
202 weak_ptr_factory_.GetWeakPtr(), service_path)),
203 AttachClosureToErrorCallback(error_callback,
204 base::Bind(&ShillServiceClientImpl::HelperStatusUpdated,
205 weak_ptr_factory_.GetWeakPtr(), service_path)));
116 } 206 }
117 207
118 virtual void Connect(const dbus::ObjectPath& service_path, 208 virtual void Connect(const dbus::ObjectPath& service_path,
119 const base::Closure& callback, 209 const base::Closure& callback,
120 const ErrorCallback& error_callback) OVERRIDE { 210 const ErrorCallback& error_callback) OVERRIDE {
121 dbus::MethodCall method_call(flimflam::kFlimflamServiceInterface, 211 dbus::MethodCall method_call(flimflam::kFlimflamServiceInterface,
122 flimflam::kConnectFunction); 212 flimflam::kConnectFunction);
123 GetHelper(service_path)->CallVoidMethodWithErrorCallback( 213 GetHelper(service_path)->CallVoidMethodWithErrorCallback(
124 &method_call, callback, error_callback); 214 &method_call,
215 AttachClosureToClosure(callback,
216 base::Bind(&ShillServiceClientImpl::HelperStatusUpdated,
217 weak_ptr_factory_.GetWeakPtr(), service_path)),
218 AttachClosureToErrorCallback(error_callback,
219 base::Bind(&ShillServiceClientImpl::HelperStatusUpdated,
220 weak_ptr_factory_.GetWeakPtr(), service_path)));
125 } 221 }
126 222
127 virtual void Disconnect(const dbus::ObjectPath& service_path, 223 virtual void Disconnect(const dbus::ObjectPath& service_path,
128 const base::Closure& callback, 224 const base::Closure& callback,
129 const ErrorCallback& error_callback) OVERRIDE { 225 const ErrorCallback& error_callback) OVERRIDE {
130 dbus::MethodCall method_call(flimflam::kFlimflamServiceInterface, 226 dbus::MethodCall method_call(flimflam::kFlimflamServiceInterface,
131 flimflam::kDisconnectFunction); 227 flimflam::kDisconnectFunction);
132 GetHelper(service_path)->CallVoidMethodWithErrorCallback(&method_call, 228 GetHelper(service_path)->CallVoidMethodWithErrorCallback(
133 callback, 229 &method_call,
134 error_callback); 230 AttachClosureToClosure(callback,
231 base::Bind(&ShillServiceClientImpl::HelperStatusUpdated,
232 weak_ptr_factory_.GetWeakPtr(), service_path)),
233 AttachClosureToErrorCallback(error_callback,
234 base::Bind(&ShillServiceClientImpl::HelperStatusUpdated,
235 weak_ptr_factory_.GetWeakPtr(), service_path)));
135 } 236 }
136 237
137 virtual void Remove(const dbus::ObjectPath& service_path, 238 virtual void Remove(const dbus::ObjectPath& service_path,
138 const base::Closure& callback, 239 const base::Closure& callback,
139 const ErrorCallback& error_callback) OVERRIDE { 240 const ErrorCallback& error_callback) OVERRIDE {
140 dbus::MethodCall method_call(flimflam::kFlimflamServiceInterface, 241 dbus::MethodCall method_call(flimflam::kFlimflamServiceInterface,
141 flimflam::kRemoveServiceFunction); 242 flimflam::kRemoveServiceFunction);
142 GetHelper(service_path)->CallVoidMethodWithErrorCallback(&method_call, 243 GetHelper(service_path)->CallVoidMethodWithErrorCallback(
143 callback, 244 &method_call,
144 error_callback); 245 AttachClosureToClosure(callback,
246 base::Bind(&ShillServiceClientImpl::HelperStatusUpdated,
247 weak_ptr_factory_.GetWeakPtr(), service_path)),
248 AttachClosureToErrorCallback(error_callback,
249 base::Bind(&ShillServiceClientImpl::HelperStatusUpdated,
250 weak_ptr_factory_.GetWeakPtr(), service_path)));
145 } 251 }
146 252
147 virtual void ActivateCellularModem( 253 virtual void ActivateCellularModem(
148 const dbus::ObjectPath& service_path, 254 const dbus::ObjectPath& service_path,
149 const std::string& carrier, 255 const std::string& carrier,
150 const base::Closure& callback, 256 const base::Closure& callback,
151 const ErrorCallback& error_callback) OVERRIDE { 257 const ErrorCallback& error_callback) OVERRIDE {
152 dbus::MethodCall method_call(flimflam::kFlimflamServiceInterface, 258 dbus::MethodCall method_call(flimflam::kFlimflamServiceInterface,
153 flimflam::kActivateCellularModemFunction); 259 flimflam::kActivateCellularModemFunction);
154 dbus::MessageWriter writer(&method_call); 260 dbus::MessageWriter writer(&method_call);
155 writer.AppendString(carrier); 261 writer.AppendString(carrier);
156 GetHelper(service_path)->CallVoidMethodWithErrorCallback(&method_call, 262 GetHelper(service_path)->CallVoidMethodWithErrorCallback(
157 callback, 263 &method_call,
158 error_callback); 264 AttachClosureToClosure(callback,
265 base::Bind(&ShillServiceClientImpl::HelperStatusUpdated,
266 weak_ptr_factory_.GetWeakPtr(), service_path)),
267 AttachClosureToErrorCallback(error_callback,
268 base::Bind(&ShillServiceClientImpl::HelperStatusUpdated,
269 weak_ptr_factory_.GetWeakPtr(), service_path)));
159 } 270 }
160 271
161 virtual bool CallActivateCellularModemAndBlock( 272 virtual bool CallActivateCellularModemAndBlock(
162 const dbus::ObjectPath& service_path, 273 const dbus::ObjectPath& service_path,
163 const std::string& carrier) OVERRIDE { 274 const std::string& carrier) OVERRIDE {
164 dbus::MethodCall method_call(flimflam::kFlimflamServiceInterface, 275 dbus::MethodCall method_call(flimflam::kFlimflamServiceInterface,
165 flimflam::kActivateCellularModemFunction); 276 flimflam::kActivateCellularModemFunction);
166 dbus::MessageWriter writer(&method_call); 277 dbus::MessageWriter writer(&method_call);
167 writer.AppendString(carrier); 278 writer.AppendString(carrier);
168 return GetHelper(service_path)->CallVoidMethodAndBlock(&method_call); 279 bool result = GetHelper(service_path)->CallVoidMethodAndBlock(&method_call);
280 HelperStatusUpdated(service_path);
281 return result;
169 } 282 }
170 283
171 virtual ShillServiceClient::TestInterface* GetTestInterface() OVERRIDE { 284 virtual ShillServiceClient::TestInterface* GetTestInterface() OVERRIDE {
172 return NULL; 285 return NULL;
173 } 286 }
174 287
175 private: 288 private:
176 typedef std::map<std::string, ShillClientHelper*> HelperMap; 289 typedef std::map<std::string, ShillClientHelper*> HelperMap;
177 290
178 // Returns the corresponding ShillClientHelper for the profile. 291 // Returns the corresponding ShillClientHelper for the profile.
179 ShillClientHelper* GetHelper(const dbus::ObjectPath& service_path) { 292 ShillClientHelper* GetHelper(const dbus::ObjectPath& service_path) {
180 HelperMap::iterator it = helpers_.find(service_path.value()); 293 HelperMap::iterator it = helpers_.find(service_path.value());
181 if (it != helpers_.end()) 294 if (it != helpers_.end())
182 return it->second; 295 return it->second;
183 296
184 // There is no helper for the profile, create it. 297 // There is no helper for the profile, create it.
185 dbus::ObjectProxy* object_proxy = 298 dbus::ObjectProxy* object_proxy =
186 bus_->GetObjectProxy(flimflam::kFlimflamServiceName, service_path); 299 bus_->GetObjectProxy(flimflam::kFlimflamServiceName, service_path);
187 ShillClientHelper* helper = new ShillClientHelper(bus_, object_proxy); 300 ShillClientHelper* helper = new ShillClientHelper(bus_, object_proxy);
188 helper->MonitorPropertyChanged(flimflam::kFlimflamServiceInterface); 301 helper->MonitorPropertyChanged(flimflam::kFlimflamServiceInterface);
189 helpers_.insert(HelperMap::value_type(service_path.value(), helper)); 302 helpers_.insert(HelperMap::value_type(service_path.value(), helper));
190 return helper; 303 return helper;
191 } 304 }
192 305
306 // This function should be called every time the IsObserved or the
307 // IsWaitingResponse helper's properties may have changed. If both are
308 // false, the cached helper can be safely removed and this function removes
309 // it in such case.
stevenjb 2013/02/06 01:05:53 nit: s/and this function removes it in such case//
310 void HelperStatusUpdated(const dbus::ObjectPath& service_path) {
hashimoto 2013/02/06 03:29:06 nit: This method should better named MaybeRemoveHe
deymo 2013/02/06 05:44:45 I think the name should be more like "OnHelperStat
hashimoto 2013/02/07 05:20:31 Callback methods are named "OnXXX" when it is hard
311 HelperMap::iterator it = helpers_.find(service_path.value());
312 if (it == helpers_.end())
313 return;
314
315 ShillClientHelper* const helper = it->second;
316 if (!helper->IsObserved() and !helper->IsWaitingResponse()) {
hashimoto 2013/02/06 03:29:06 nit: s/and/&&/
deymo 2013/02/06 05:44:45 Very expressive method names + too much time codin
317 helpers_.erase(it);
318 delete helper;
319 bus_->RemoveObjectProxy(flimflam::kFlimflamServiceName, service_path,
320 base::Bind(&base::DoNothing));
321 }
322 }
323
193 dbus::Bus* bus_; 324 dbus::Bus* bus_;
194 HelperMap helpers_; 325 HelperMap helpers_;
195 STLValueDeleter<HelperMap> helpers_deleter_; 326 STLValueDeleter<HelperMap> helpers_deleter_;
196 327
328 // Note: This should remain the last member so it'll be destroyed and
329 // invalidate its weak pointers before any other members are destroyed.
330 base::WeakPtrFactory<ShillServiceClientImpl> weak_ptr_factory_;
331
197 DISALLOW_COPY_AND_ASSIGN(ShillServiceClientImpl); 332 DISALLOW_COPY_AND_ASSIGN(ShillServiceClientImpl);
198 }; 333 };
199 334
200 // A stub implementation of ShillServiceClient. 335 // A stub implementation of ShillServiceClient.
201 class ShillServiceClientStubImpl : public ShillServiceClient, 336 class ShillServiceClientStubImpl : public ShillServiceClient,
202 public ShillServiceClient::TestInterface { 337 public ShillServiceClient::TestInterface {
203 public: 338 public:
204 ShillServiceClientStubImpl() : weak_ptr_factory_(this) { 339 ShillServiceClientStubImpl() : weak_ptr_factory_(this) {
205 SetDefaultProperties(); 340 SetDefaultProperties();
206 } 341 }
(...skipping 323 matching lines...) Expand 10 before | Expand all | Expand 10 after
530 ShillServiceClient* ShillServiceClient::Create( 665 ShillServiceClient* ShillServiceClient::Create(
531 DBusClientImplementationType type, 666 DBusClientImplementationType type,
532 dbus::Bus* bus) { 667 dbus::Bus* bus) {
533 if (type == REAL_DBUS_CLIENT_IMPLEMENTATION) 668 if (type == REAL_DBUS_CLIENT_IMPLEMENTATION)
534 return new ShillServiceClientImpl(bus); 669 return new ShillServiceClientImpl(bus);
535 DCHECK_EQ(STUB_DBUS_CLIENT_IMPLEMENTATION, type); 670 DCHECK_EQ(STUB_DBUS_CLIENT_IMPLEMENTATION, type);
536 return new ShillServiceClientStubImpl(); 671 return new ShillServiceClientStubImpl();
537 } 672 }
538 673
539 } // namespace chromeos 674 } // namespace chromeos
OLDNEW
« chromeos/dbus/shill_client_helper.cc ('K') | « chromeos/dbus/shill_client_helper.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698