| // Copyright 2018 The Chromium Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #include "chrome/credential_provider/gaiacp/internet_availability_checker.h" |
| |
| #include <atlbase.h> |
| #include <atlcom.h> |
| #include <netlistmgr.h> // For CLSID_NetworkListManager |
| #include <wrl/client.h> |
| |
| #include "chrome/credential_provider/gaiacp/gcp_utils.h" |
| #include "chrome/credential_provider/gaiacp/logging.h" |
| |
| namespace credential_provider { |
| |
| namespace { |
| |
| bool InternetConnectionAvailable() { |
| // If any errors occur, return that internet connection is available. At |
| // worst the credential provider will try to connect and fail. |
| |
| Microsoft::WRL::ComPtr<INetworkListManager> manager; |
| HRESULT hr = ::CoCreateInstance(CLSID_NetworkListManager, nullptr, CLSCTX_ALL, |
| IID_PPV_ARGS(&manager)); |
| if (FAILED(hr)) { |
| LOGFN(ERROR) << "CoCreateInstance(NetworkListManager) hr=" << putHR(hr); |
| return true; |
| } |
| |
| VARIANT_BOOL is_connected; |
| hr = manager->get_IsConnectedToInternet(&is_connected); |
| if (FAILED(hr)) { |
| LOGFN(ERROR) << "manager->get_IsConnectedToInternet hr=" << putHR(hr); |
| return true; |
| } |
| |
| // Normally VARIANT_TRUE/VARIANT_FALSE are used with the type VARIANT_BOOL |
| // but in this case the docs explicitly say to use FALSE. |
| // https://docs.microsoft.com/en-us/windows/desktop/api/Netlistmgr/ |
| // nf-netlistmgr-inetworklistmanager-get_isconnectedtointernet |
| return is_connected != FALSE; |
| } |
| |
| } // namespace |
| |
| // static |
| InternetAvailabilityChecker* InternetAvailabilityChecker::Get() { |
| return *GetInstanceStorage(); |
| } |
| |
| // static |
| InternetAvailabilityChecker** |
| InternetAvailabilityChecker::GetInstanceStorage() { |
| static InternetAvailabilityChecker instance; |
| static InternetAvailabilityChecker* instance_storage = &instance; |
| |
| return &instance_storage; |
| } |
| |
| InternetAvailabilityChecker::InternetAvailabilityChecker() = default; |
| |
| InternetAvailabilityChecker::~InternetAvailabilityChecker() = default; |
| |
| bool InternetAvailabilityChecker::HasInternetConnection() { |
| return InternetConnectionAvailable(); |
| } |
| |
| } // namespace credential_provider |