network_reachability.cpp 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112
  1. // This file is part of Desktop App Toolkit,
  2. // a set of libraries for developing nice desktop applications.
  3. //
  4. // For license and copyright information please follow this link:
  5. // https://github.com/desktop-app/legal/blob/master/LEGAL
  6. //
  7. #include "base/network_reachability.h"
  8. #include "base/platform/base_platform_network_reachability.h"
  9. #include "base/qt_signal_producer.h"
  10. #if QT_VERSION >= QT_VERSION_CHECK(6, 2, 0)
  11. #include <QtNetwork/QNetworkInformation>
  12. #elif QT_VERSION < QT_VERSION_CHECK(6, 0, 0) // Qt >= 6.2.0
  13. #include <QtNetwork/QNetworkConfigurationManager>
  14. #endif // Qt >= 6.2.0 || Qt < 6.0.0
  15. namespace base {
  16. namespace {
  17. std::weak_ptr<NetworkReachability> GlobalNetworkReachability;
  18. } // namespace
  19. #ifdef __GNUC__
  20. #pragma GCC diagnostic push
  21. #pragma GCC diagnostic ignored "-Wdeprecated-declarations"
  22. #elif defined __clang__ // __GNUC__
  23. #pragma clang diagnostic push
  24. #pragma clang diagnostic ignored "-Wdeprecated-declarations"
  25. #elif defined _MSC_VER // __GNUC__ || __clang__
  26. #pragma warning(push)
  27. #pragma warning(disable:4996)
  28. #endif // __GNUC__ || __clang__ || _MSC_VER
  29. struct NetworkReachability::Private {
  30. Private() : platformHelper(Platform::NetworkReachability::Create()) {
  31. }
  32. rpl::variable<bool> available = true;
  33. #if QT_VERSION < QT_VERSION_CHECK(6, 0, 0)
  34. QNetworkConfigurationManager configurationManager;
  35. #endif // Qt < 6.0.0
  36. std::unique_ptr<Platform::NetworkReachability> platformHelper;
  37. rpl::lifetime lifetime;
  38. };
  39. NetworkReachability::NetworkReachability()
  40. : _private(std::make_unique<Private>()) {
  41. if (_private->platformHelper) {
  42. _private->platformHelper->availableValue(
  43. ) | rpl::start_with_next([=](bool available) {
  44. _private->available = available;
  45. }, _private->lifetime);
  46. #if QT_VERSION >= QT_VERSION_CHECK(6, 2, 0)
  47. } else if (QNetworkInformation::load(
  48. QNetworkInformation::Feature::Reachability)) {
  49. _private->available = QNetworkInformation::instance()->reachability()
  50. == QNetworkInformation::Reachability::Online;
  51. base::qt_signal_producer(
  52. QNetworkInformation::instance(),
  53. &QNetworkInformation::reachabilityChanged
  54. ) | rpl::start_with_next([=](
  55. QNetworkInformation::Reachability newReachability) {
  56. _private->available = newReachability
  57. == QNetworkInformation::Reachability::Online;
  58. }, _private->lifetime);
  59. #elif QT_VERSION < QT_VERSION_CHECK(6, 0, 0) // Qt >= 6.2.0
  60. } else {
  61. _private->available = _private->configurationManager.isOnline();
  62. QObject::connect(
  63. &_private->configurationManager,
  64. &QNetworkConfigurationManager::onlineStateChanged,
  65. [=](bool isOnline) {
  66. _private->available = isOnline;
  67. });
  68. #endif // Qt >= 6.2.0 || Qt < 6.0.0
  69. }
  70. }
  71. NetworkReachability::~NetworkReachability() {
  72. }
  73. std::shared_ptr<NetworkReachability> NetworkReachability::Instance() {
  74. auto result = GlobalNetworkReachability.lock();
  75. if (!result) {
  76. GlobalNetworkReachability = result = std::make_shared<NetworkReachability>();
  77. }
  78. return result;
  79. }
  80. bool NetworkReachability::available() const {
  81. return _private->available.current();
  82. }
  83. rpl::producer<bool> NetworkReachability::availableChanges() const {
  84. return _private->available.changes();
  85. }
  86. rpl::producer<bool> NetworkReachability::availableValue() const {
  87. return _private->available.value();
  88. }
  89. #ifdef __GNUC__
  90. #pragma GCC diagnostic pop
  91. #elif defined __clang__ // __GNUC__
  92. #pragma clang diagnostic pop
  93. #elif defined _MSC_VER // __GNUC__ || __clang__
  94. #pragma warning(pop)
  95. #endif // __GNUC__ || __clang__ || _MSC_VER
  96. } // namespace base