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

Side by Side Diff: device/battery/battery_status_manager_linux.cc

Issue 2795713003: Do not call GetDisplayDevice for older UPower versions. (Closed)
Patch Set: Rebase, remove auto-reset Created 3 years, 8 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
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 #include "device/battery/battery_status_manager_linux.h" 5 #include "device/battery/battery_status_manager_linux.h"
6 6
7 #include <stddef.h> 7 #include <stddef.h>
8 #include <stdint.h> 8 #include <stdint.h>
9 9
10 #include <limits> 10 #include <limits>
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after
54 UPowerProperties::~UPowerProperties() {} 54 UPowerProperties::~UPowerProperties() {}
55 55
56 base::Version UPowerProperties::daemon_version() { 56 base::Version UPowerProperties::daemon_version() {
57 return (daemon_version_.is_valid() || daemon_version_.GetAndBlock()) 57 return (daemon_version_.is_valid() || daemon_version_.GetAndBlock())
58 ? base::Version(daemon_version_.value()) 58 ? base::Version(daemon_version_.value())
59 : base::Version(); 59 : base::Version();
60 } 60 }
61 61
62 class UPowerObject { 62 class UPowerObject {
63 public: 63 public:
64 typedef dbus::PropertySet::PropertyChangedCallback PropertyChangedCallback; 64 using PropertyChangedCallback = dbus::PropertySet::PropertyChangedCallback;
65 65
66 UPowerObject(dbus::Bus* dbus, 66 UPowerObject(dbus::Bus* dbus,
67 const PropertyChangedCallback property_changed_callback); 67 const PropertyChangedCallback property_changed_callback);
68 ~UPowerObject(); 68 ~UPowerObject();
69 69
70 std::vector<dbus::ObjectPath> EnumerateDevices(); 70 std::vector<dbus::ObjectPath> EnumerateDevices();
71 dbus::ObjectPath GetDisplayDevice(); 71 dbus::ObjectPath GetDisplayDevice();
72 72
73 dbus::ObjectProxy* proxy() { return proxy_; } 73 dbus::ObjectProxy* proxy() { return proxy_; }
74 UPowerProperties* properties() { return properties_.get(); } 74 UPowerProperties* properties() { return properties_.get(); }
(...skipping 143 matching lines...) Expand 10 before | Expand all | Expand 10 after
218 : default_value; 218 : default_value;
219 } 219 }
220 220
221 uint32_t BatteryProperties::type(uint32_t default_value) { 221 uint32_t BatteryProperties::type(uint32_t default_value) {
222 return (type_.is_valid() || type_.GetAndBlock()) ? type_.value() 222 return (type_.is_valid() || type_.GetAndBlock()) ? type_.value()
223 : default_value; 223 : default_value;
224 } 224 }
225 225
226 class BatteryObject { 226 class BatteryObject {
227 public: 227 public:
228 typedef dbus::PropertySet::PropertyChangedCallback PropertyChangedCallback; 228 using PropertyChangedCallback = dbus::PropertySet::PropertyChangedCallback;
229 229
230 BatteryObject(dbus::Bus* dbus, 230 BatteryObject(dbus::Bus* dbus,
231 const dbus::ObjectPath& device_path, 231 const dbus::ObjectPath& device_path,
232 const PropertyChangedCallback& property_changed_callback); 232 const PropertyChangedCallback& property_changed_callback);
233 ~BatteryObject(); 233 ~BatteryObject();
234 234
235 bool IsValid(); 235 bool IsValid();
236 236
237 dbus::ObjectProxy* proxy() { return proxy_; } 237 dbus::ObjectProxy* proxy() { return proxy_; }
238 BatteryProperties* properties() { return properties_.get(); } 238 BatteryProperties* properties() { return properties_.get(); }
(...skipping 88 matching lines...) Expand 10 before | Expand all | Expand 10 after
327 327
328 void StartListening() { 328 void StartListening() {
329 DCHECK(OnWatcherThread()); 329 DCHECK(OnWatcherThread());
330 330
331 if (upower_) 331 if (upower_)
332 return; 332 return;
333 333
334 if (!system_bus_) 334 if (!system_bus_)
335 InitDBus(); 335 InitDBus();
336 336
337 upower_.reset(new UPowerObject(system_bus_.get(), 337 upower_ = base::MakeUnique<UPowerObject>(
338 UPowerObject::PropertyChangedCallback())); 338 system_bus_.get(), UPowerObject::PropertyChangedCallback());
339 upower_->proxy()->ConnectToSignal( 339 upower_->proxy()->ConnectToSignal(
340 kUPowerServiceName, kUPowerSignalDeviceAdded, 340 kUPowerServiceName, kUPowerSignalDeviceAdded,
341 base::Bind(&BatteryStatusNotificationThread::DeviceAdded, 341 base::Bind(&BatteryStatusNotificationThread::DeviceAdded,
342 base::Unretained(this)), 342 base::Unretained(this)),
343 base::Bind(&BatteryStatusNotificationThread::OnSignalConnected, 343 base::Bind(&BatteryStatusNotificationThread::OnSignalConnected,
344 base::Unretained(this))); 344 base::Unretained(this)));
345 upower_->proxy()->ConnectToSignal( 345 upower_->proxy()->ConnectToSignal(
346 kUPowerServiceName, kUPowerSignalDeviceRemoved, 346 kUPowerServiceName, kUPowerSignalDeviceRemoved,
347 base::Bind(&BatteryStatusNotificationThread::DeviceRemoved, 347 base::Bind(&BatteryStatusNotificationThread::DeviceRemoved,
348 base::Unretained(this)), 348 base::Unretained(this)),
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after
390 // - Or it may be a new device; then the previously monitored BatteryObject 390 // - Or it may be a new device; then the previously monitored BatteryObject
391 // instance (if any) is released on leaving this function. 391 // instance (if any) is released on leaving this function.
392 // - Or we may not find a battery device; then on leaving this function 392 // - Or we may not find a battery device; then on leaving this function
393 // battery_ will be nullptr and the previously monitored BatteryObject 393 // battery_ will be nullptr and the previously monitored BatteryObject
394 // instance (if any) is no longer a battery and will be released. 394 // instance (if any) is no longer a battery and will be released.
395 std::unique_ptr<BatteryObject> current = std::move(battery_); 395 std::unique_ptr<BatteryObject> current = std::move(battery_);
396 auto UseCurrentOrCreateBattery = 396 auto UseCurrentOrCreateBattery =
397 [&current, this](const dbus::ObjectPath& device_path) { 397 [&current, this](const dbus::ObjectPath& device_path) {
398 if (current && current->proxy()->object_path() == device_path) 398 if (current && current->proxy()->object_path() == device_path)
399 return std::move(current); 399 return std::move(current);
400 else 400 return CreateBattery(device_path);
401 return CreateBattery(device_path);
402 }; 401 };
403 402
404 dbus::ObjectPath display_device_path = upower_->GetDisplayDevice(); 403 dbus::ObjectPath display_device_path;
404 if (!IsDaemonVersionBelow_0_99())
405 display_device_path = upower_->GetDisplayDevice();
405 if (display_device_path.IsValid()) { 406 if (display_device_path.IsValid()) {
406 std::unique_ptr<BatteryObject> battery = 407 auto battery = UseCurrentOrCreateBattery(display_device_path);
407 UseCurrentOrCreateBattery(display_device_path);
408 if (battery->IsValid()) 408 if (battery->IsValid())
409 battery_ = std::move(battery); 409 battery_ = std::move(battery);
410 } 410 }
411 411
412 if (!battery_) { 412 if (!battery_) {
413 int num_batteries = 0; 413 int num_batteries = 0;
414 for (const auto& device_path : upower_->EnumerateDevices()) { 414 for (const auto& device_path : upower_->EnumerateDevices()) {
415 std::unique_ptr<BatteryObject> battery = 415 auto battery = UseCurrentOrCreateBattery(device_path);
416 UseCurrentOrCreateBattery(device_path);
417
418 if (!battery->IsValid()) 416 if (!battery->IsValid())
419 continue; 417 continue;
420 418
421 if (battery_) { 419 if (battery_) {
422 // TODO(timvolodine): add support for multiple batteries. Currently we 420 // TODO(timvolodine): add support for multiple batteries. Currently we
423 // only collect information from the first battery we encounter 421 // only collect information from the first battery we encounter
424 // (crbug.com/400780). 422 // (crbug.com/400780).
425 LOG(WARNING) << "multiple batteries found, " 423 LOG(WARNING) << "multiple batteries found, "
426 << "using status data of the first battery only."; 424 << "using status data of the first battery only.";
427 } else { 425 } else {
428 battery_ = std::move(battery); 426 battery_ = std::move(battery);
429 } 427 }
430 num_batteries++; 428 num_batteries++;
431 } 429 }
432 430
433 UpdateNumberBatteriesHistogram(num_batteries); 431 UpdateNumberBatteriesHistogram(num_batteries);
434 } 432 }
435 433
436 if (battery_) { 434 if (!battery_) {
437 battery_->properties()->ConnectSignals();
438 NotifyBatteryStatus();
439 } else {
440 callback_.Run(mojom::BatteryStatus()); 435 callback_.Run(mojom::BatteryStatus());
441 return; 436 return;
442 } 437 }
443 438
439 battery_->properties()->ConnectSignals();
440 NotifyBatteryStatus();
441
444 if (IsDaemonVersionBelow_0_99()) { 442 if (IsDaemonVersionBelow_0_99()) {
445 // UPower Version 0.99 replaced the Changed signal with the 443 // UPower Version 0.99 replaced the Changed signal with the
446 // PropertyChanged signal. For older versions we need to listen 444 // PropertyChanged signal. For older versions we need to listen
447 // to the Changed signal. 445 // to the Changed signal.
448 battery_->proxy()->ConnectToSignal( 446 battery_->proxy()->ConnectToSignal(
449 kUPowerDeviceInterfaceName, kUPowerDeviceSignalChanged, 447 kUPowerDeviceInterfaceName, kUPowerDeviceSignalChanged,
450 base::Bind(&BatteryStatusNotificationThread::BatteryChanged, 448 base::Bind(&BatteryStatusNotificationThread::BatteryChanged,
451 base::Unretained(this)), 449 base::Unretained(this)),
452 base::Bind(&BatteryStatusNotificationThread::OnSignalConnected, 450 base::Bind(&BatteryStatusNotificationThread::OnSignalConnected,
453 base::Unretained(this))); 451 base::Unretained(this)));
(...skipping 15 matching lines...) Expand all
469 FROM_HERE, base::Bind(&dbus::Bus::ShutdownAndBlock, system_bus_)); 467 FROM_HERE, base::Bind(&dbus::Bus::ShutdownAndBlock, system_bus_));
470 system_bus_ = NULL; 468 system_bus_ = NULL;
471 } 469 }
472 470
473 void OnSignalConnected(const std::string& interface_name, 471 void OnSignalConnected(const std::string& interface_name,
474 const std::string& signal_name, 472 const std::string& signal_name,
475 bool success) {} 473 bool success) {}
476 474
477 std::unique_ptr<BatteryObject> CreateBattery( 475 std::unique_ptr<BatteryObject> CreateBattery(
478 const dbus::ObjectPath& device_path) { 476 const dbus::ObjectPath& device_path) {
479 std::unique_ptr<BatteryObject> battery(new BatteryObject( 477 return base::MakeUnique<BatteryObject>(
480 system_bus_.get(), device_path, 478 system_bus_.get(), device_path,
481 base::Bind(&BatteryStatusNotificationThread::BatteryPropertyChanged, 479 base::Bind(&BatteryStatusNotificationThread::BatteryPropertyChanged,
482 base::Unretained(this)))); 480 base::Unretained(this)));
483 return battery;
484 } 481 }
485 482
486 void DeviceAdded(dbus::Signal* signal /* unused */) { 483 void DeviceAdded(dbus::Signal* signal /* unused */) {
487 // Re-iterate all devices to see if we need to monitor the added battery 484 // Re-iterate all devices to see if we need to monitor the added battery
488 // instead of the currently monitored battery. 485 // instead of the currently monitored battery.
489 FindBatteryDevice(); 486 FindBatteryDevice();
490 } 487 }
491 488
492 void DeviceRemoved(dbus::Signal* signal) { 489 void DeviceRemoved(dbus::Signal* signal) {
493 if (!battery_) 490 if (!battery_)
(...skipping 88 matching lines...) Expand 10 before | Expand all | Expand 10 after
582 notifier_thread_->task_runner()->PostTask( 579 notifier_thread_->task_runner()->PostTask(
583 FROM_HERE, base::Bind(&BatteryStatusNotificationThread::StopListening, 580 FROM_HERE, base::Bind(&BatteryStatusNotificationThread::StopListening,
584 base::Unretained(notifier_thread_.get()))); 581 base::Unretained(notifier_thread_.get())));
585 } 582 }
586 583
587 bool BatteryStatusManagerLinux::StartNotifierThreadIfNecessary() { 584 bool BatteryStatusManagerLinux::StartNotifierThreadIfNecessary() {
588 if (notifier_thread_) 585 if (notifier_thread_)
589 return true; 586 return true;
590 587
591 base::Thread::Options thread_options(base::MessageLoop::TYPE_IO, 0); 588 base::Thread::Options thread_options(base::MessageLoop::TYPE_IO, 0);
592 notifier_thread_.reset(new BatteryStatusNotificationThread(callback_)); 589 auto notifier_thread =
593 if (!notifier_thread_->StartWithOptions(thread_options)) { 590 base::MakeUnique<BatteryStatusNotificationThread>(callback_);
594 notifier_thread_.reset(); 591 if (!notifier_thread->StartWithOptions(thread_options)) {
595 LOG(ERROR) << "Could not start the " << kBatteryNotifierThreadName 592 LOG(ERROR) << "Could not start the " << kBatteryNotifierThreadName
596 << " thread"; 593 << " thread";
597 return false; 594 return false;
598 } 595 }
596 notifier_thread_ = std::move(notifier_thread);
599 return true; 597 return true;
600 } 598 }
601 599
602 base::Thread* BatteryStatusManagerLinux::GetNotifierThreadForTesting() { 600 base::Thread* BatteryStatusManagerLinux::GetNotifierThreadForTesting() {
603 return notifier_thread_.get(); 601 return notifier_thread_.get();
604 } 602 }
605 603
606 // static 604 // static
607 std::unique_ptr<BatteryStatusManagerLinux> 605 std::unique_ptr<BatteryStatusManagerLinux>
608 BatteryStatusManagerLinux::CreateForTesting( 606 BatteryStatusManagerLinux::CreateForTesting(
609 const BatteryStatusService::BatteryUpdateCallback& callback, 607 const BatteryStatusService::BatteryUpdateCallback& callback,
610 dbus::Bus* bus) { 608 dbus::Bus* bus) {
611 std::unique_ptr<BatteryStatusManagerLinux> manager( 609 auto manager = base::MakeUnique<BatteryStatusManagerLinux>(callback);
612 new BatteryStatusManagerLinux(callback)); 610 if (!manager->StartNotifierThreadIfNecessary())
613 if (manager->StartNotifierThreadIfNecessary()) 611 return nullptr;
614 manager->notifier_thread_->SetDBusForTesting(bus); 612 manager->notifier_thread_->SetDBusForTesting(bus);
615 else
616 manager.reset();
617 return manager; 613 return manager;
618 } 614 }
619 615
620 // static 616 // static
621 std::unique_ptr<BatteryStatusManager> BatteryStatusManager::Create( 617 std::unique_ptr<BatteryStatusManager> BatteryStatusManager::Create(
622 const BatteryStatusService::BatteryUpdateCallback& callback) { 618 const BatteryStatusService::BatteryUpdateCallback& callback) {
623 return std::unique_ptr<BatteryStatusManager>( 619 return base::MakeUnique<BatteryStatusManagerLinux>(callback);
624 new BatteryStatusManagerLinux(callback));
625 } 620 }
626 621
627 } // namespace device 622 } // namespace device
OLDNEW
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698