forked from mirrors/gecko-dev
The Windows and macOS location providers used to start the MLS provider (with a two-second delay) and then call the operating system's location provider, letting them race. Currently, however, we only start the MLS fallback provider after the system provider returns an error, so the two-second startup delay is just wasted time. I left the starup delay option in MLSFallback because the Linux gpsd provider still uses it to race MLS with the system's GPS provider. MozReview-Commit-ID: 3ZFeF1g6PoG --HG-- extra : rebase_source : ae7032fb86b9015686c160dd990dcb264fff742a extra : source : 90473706de0fc0af9866b05768b7700de0fd552f
92 lines
2 KiB
C++
92 lines
2 KiB
C++
/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
|
|
/* vim: set ts=8 sts=2 et sw=2 tw=80: */
|
|
/* This Source Code Form is subject to the terms of the Mozilla Public
|
|
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
|
|
|
|
#include "MLSFallback.h"
|
|
#include "nsGeoPosition.h"
|
|
#include "nsIGeolocationProvider.h"
|
|
#include "nsServiceManagerUtils.h"
|
|
|
|
NS_IMPL_ISUPPORTS(MLSFallback, nsITimerCallback, nsINamed)
|
|
|
|
MLSFallback::MLSFallback(uint32_t delay)
|
|
: mDelayMs(delay)
|
|
{
|
|
}
|
|
|
|
MLSFallback::~MLSFallback()
|
|
{
|
|
}
|
|
|
|
nsresult
|
|
MLSFallback::Startup(nsIGeolocationUpdate* aWatcher)
|
|
{
|
|
if (mHandoffTimer || mMLSFallbackProvider) {
|
|
return NS_OK;
|
|
}
|
|
|
|
mUpdateWatcher = aWatcher;
|
|
|
|
// No need to schedule a timer callback if there is no startup delay.
|
|
if (mDelayMs == 0) {
|
|
return CreateMLSFallbackProvider();
|
|
}
|
|
|
|
return NS_NewTimerWithCallback(getter_AddRefs(mHandoffTimer),
|
|
this, mDelayMs, nsITimer::TYPE_ONE_SHOT);
|
|
}
|
|
|
|
nsresult
|
|
MLSFallback::Shutdown()
|
|
{
|
|
mUpdateWatcher = nullptr;
|
|
|
|
if (mHandoffTimer) {
|
|
mHandoffTimer->Cancel();
|
|
mHandoffTimer = nullptr;
|
|
}
|
|
|
|
nsresult rv = NS_OK;
|
|
if (mMLSFallbackProvider) {
|
|
rv = mMLSFallbackProvider->Shutdown();
|
|
mMLSFallbackProvider = nullptr;
|
|
}
|
|
return rv;
|
|
}
|
|
|
|
NS_IMETHODIMP
|
|
MLSFallback::Notify(nsITimer* aTimer)
|
|
{
|
|
return CreateMLSFallbackProvider();
|
|
}
|
|
|
|
NS_IMETHODIMP
|
|
MLSFallback::GetName(nsACString& aName)
|
|
{
|
|
aName.AssignLiteral("MLSFallback");
|
|
return NS_OK;
|
|
}
|
|
|
|
nsresult
|
|
MLSFallback::CreateMLSFallbackProvider()
|
|
{
|
|
if (mMLSFallbackProvider || !mUpdateWatcher) {
|
|
return NS_OK;
|
|
}
|
|
|
|
nsresult rv;
|
|
mMLSFallbackProvider = do_CreateInstance("@mozilla.org/geolocation/mls-provider;1", &rv);
|
|
NS_ENSURE_SUCCESS(rv, rv);
|
|
|
|
if (mMLSFallbackProvider) {
|
|
rv = mMLSFallbackProvider->Startup();
|
|
if (NS_SUCCEEDED(rv)) {
|
|
mMLSFallbackProvider->Watch(mUpdateWatcher);
|
|
}
|
|
}
|
|
mUpdateWatcher = nullptr;
|
|
return rv;
|
|
}
|
|
|