blob: 65ba4e777f61194fbbc457476f4ca23175aaf13c [file]
// Copyright 2017 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef SERVICES_DEVICE_GEOLOCATION_PUBLIC_IP_ADDRESS_GEOLOCATION_PROVIDER_H_
#define SERVICES_DEVICE_GEOLOCATION_PUBLIC_IP_ADDRESS_GEOLOCATION_PROVIDER_H_
#include <string>
#include "base/sequence_checker.h"
#include "mojo/public/cpp/bindings/receiver_set.h"
#include "mojo/public/cpp/bindings/unique_receiver_set.h"
#include "net/traffic_annotation/network_traffic_annotation.h"
#include "services/device/geolocation/public_ip_address_geolocator.h"
#include "services/device/geolocation/public_ip_address_location_notifier.h"
#include "services/device/public/mojom/geolocation.mojom.h"
#include "services/device/public/mojom/geolocation_client_id.mojom.h"
#include "services/device/public/mojom/public_ip_address_geolocation_provider.mojom.h"
namespace network {
class NetworkConnectionTracker;
}
namespace device {
// Implementation of PublicIpAddressGeolocationProvider Mojo interface that will
// provide mojom::Geolocation implementations that use IP-only geolocation.
// Binds multiple PublicIpAddressGeolocationProvider requests.
//
// Sequencing:
// * Must be used and destroyed on the same sequence.
// * Provides mojom::Geolocation instances that are bound on the same sequence.
class PublicIpAddressGeolocationProvider
: public mojom::PublicIpAddressGeolocationProvider {
public:
// Initialize PublicIpAddressGeolocationProvider using the specified Google
// |api_key| and |url_loader_factory| for network location requests.
PublicIpAddressGeolocationProvider(
scoped_refptr<network::SharedURLLoaderFactory> url_loader_factory,
network::NetworkConnectionTracker* network_connection_tracker,
const std::string& api_key);
PublicIpAddressGeolocationProvider(
const PublicIpAddressGeolocationProvider&) = delete;
PublicIpAddressGeolocationProvider& operator=(
const PublicIpAddressGeolocationProvider&) = delete;
~PublicIpAddressGeolocationProvider() override;
// Binds a PublicIpAddressGeolocationProvider request to this instance.
void Bind(mojo::PendingReceiver<mojom::PublicIpAddressGeolocationProvider>
receiver);
private:
SEQUENCE_CHECKER(sequence_checker_);
// mojom::PublicIpAddressGeolocationProvider implementation:
// Provides a Geolocation instance that performs IP-geolocation only.
void CreateGeolocation(
const net::MutablePartialNetworkTrafficAnnotationTag& tag,
mojo::PendingReceiver<mojom::Geolocation> receiver,
mojom::GeolocationClientId client_id) override;
// Central PublicIpAddressLocationNotifier for use by all implementations of
// mojom::Geolocation provided by the CreateGeolocation method.
// Note that this must be before the UniqueReceiverSet<mojom::Geolocation> as
// it must outlive the Geolocation implementations.
std::unique_ptr<PublicIpAddressLocationNotifier>
public_ip_address_location_notifier_;
mojo::ReceiverSet<mojom::PublicIpAddressGeolocationProvider>
provider_receiver_set_;
mojo::UniqueReceiverSet<mojom::Geolocation> geolocation_receiver_set_;
};
} // namespace device
#endif // SERVICES_DEVICE_GEOLOCATION_PUBLIC_IP_ADDRESS_GEOLOCATION_PROVIDER_H_