2
* Copyright © 2012-2013 Canonical Ltd.
4
* This program is free software: you can redistribute it and/or modify it
5
* under the terms of the GNU Lesser General Public License version 3,
6
* as published by the Free Software Foundation.
8
* This program is distributed in the hope that it will be useful,
9
* but WITHOUT ANY WARRANTY; without even the implied warranty of
10
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11
* GNU Lesser General Public License for more details.
13
* You should have received a copy of the GNU Lesser General Public License
14
* along with this program. If not, see <http://www.gnu.org/licenses/>.
16
* Authored by: Thomas Voß <thomas.voss@canonical.com>
18
#ifndef LOCATION_SERVICE_COM_UBUNTU_LOCATION_PROVIDERS_NET_CPP_GPS_XTRA_DOWNLOADER_H_
19
#define LOCATION_SERVICE_COM_UBUNTU_LOCATION_PROVIDERS_NET_CPP_GPS_XTRA_DOWNLOADER_H_
21
#include "android_hardware_abstraction_layer.h"
23
#include <core/net/http/client.h>
24
#include <core/net/http/request.h>
25
#include <core/net/http/response.h>
27
namespace com { namespace ubuntu { namespace location { namespace providers { namespace gps { namespace android {
28
struct NetCppGpsXtraDownloader : public GpsXtraDownloader
30
NetCppGpsXtraDownloader() : http_client{core::net::http::make_client()}
34
/** @brief Executes the actual download, throws if no xtra servers are given in the config. */
35
virtual std::vector<char> download_xtra_data(const Configuration& config) override
37
if (config.xtra_hosts.empty()) throw std::runtime_error
42
std::uniform_int_distribution<std::size_t> dist{0, config.xtra_hosts.size() - 1};
44
auto host = config.xtra_hosts.at(dist(dre));
46
auto rc = core::net::http::Request::Configuration::from_uri_as_string(host);
48
rc.header.add("Accept", "*/*");
49
rc.header.add("Accept", "application/vnd.wap.mms-message");
50
rc.header.add("Accept", "application/vnd.wap.sic");
51
rc.header.add(x_wap_profile_key, x_wap_profile_value);
53
auto request = http_client->get(rc);
54
request->set_timeout(config.timeout);
56
auto response = request->execute([](const core::net::http::Request::Progress&)
58
return core::net::http::Request::Progress::Next::continue_operation;
61
if (response.status != core::net::http::Status::ok)
63
std::stringstream ss{"Request for xtra data on "};
64
ss << host << " did not succeed: " << response.status;
65
throw std::runtime_error{ss.str()};
68
return std::vector<char>(response.body.begin(), response.body.end());
71
// Client instance to talk to xtra servers.
72
std::shared_ptr<core::net::http::Client> http_client;
73
// Random number generator for load balancing purposes.
74
std::default_random_engine dre;
78
#endif // LOCATION_SERVICE_COM_UBUNTU_LOCATION_PROVIDERS_NET_CPP_GPS_XTRA_DOWNLOADER_H_