138
139
return provider_selection_policy->determine_provider_selection_for_criteria(criteria, *this);
141
bool cul::Engine::has_provider(const cul::Provider::Ptr& provider) noexcept
143
return providers.count(provider) > 0;
146
void cul::Engine::add_provider(const cul::Provider::Ptr& provider)
142
void cul::Engine::add_provider(const cul::Provider::Ptr& impl)
149
145
throw std::runtime_error("Cannot add null provider");
147
auto provider = std::make_shared<StateTrackingProvider>(impl);
151
149
// We synchronize to the engine state.
152
150
if (provider->requires(Provider::Requirements::satellites) && configuration.satellite_based_positioning_state == SatelliteBasedPositioningState::off)
153
151
provider->state_controller()->disable();
207
205
updates.last_known_location = update_policy->verify_update(src);
210
std::lock_guard<std::mutex> lg(guard);
211
providers.emplace(provider, std::move(ProviderConnections{cp, ch, cv, cr, cs, cpr}));
214
void cul::Engine::remove_provider(const cul::Provider::Ptr& provider) noexcept
216
std::lock_guard<std::mutex> lg(guard);
218
auto it = providers.find(provider);
219
if (it != providers.end())
208
auto cps = provider->state().changed().connect([this](const StateTrackingProvider::State&)
210
bool is_any_active = false;
212
std::lock_guard<std::recursive_mutex> lg(guard);
213
for (const auto& pair : providers)
214
is_any_active = pair.first->state() == StateTrackingProvider::State::active;
216
configuration.engine_state = is_any_active ? Engine::Status::active : Engine::Status::on;
219
std::lock_guard<std::recursive_mutex> lg(guard);
220
providers.emplace(provider, std::move(ProviderConnections{cp, ch, cv, cr, cs, cpr, cps}));
225
223
void cul::Engine::for_each_provider(const std::function<void(const Provider::Ptr&)>& enumerator) const noexcept
227
std::lock_guard<std::mutex> lg(guard);
225
std::lock_guard<std::recursive_mutex> lg(guard);
228
226
for (const auto& provider : providers)