1 /* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
2 /* vim: set ts=8 sts=2 et sw=2 tw=80: */
3 /* This Source Code Form is subject to the terms of the Mozilla Public
4 * License, v. 2.0. If a copy of the MPL was not distributed with this
5 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
6
7 #include "MLSFallback.h"
8 #include "nsGeoPosition.h"
9 #include "nsIGeolocationProvider.h"
10 #include "nsServiceManagerUtils.h"
11
NS_IMPL_ISUPPORTS(MLSFallback,nsITimerCallback,nsINamed)12 NS_IMPL_ISUPPORTS(MLSFallback, nsITimerCallback, nsINamed)
13
14 MLSFallback::MLSFallback(uint32_t delay) : mDelayMs(delay) {}
15
~MLSFallback()16 MLSFallback::~MLSFallback() {}
17
Startup(nsIGeolocationUpdate * aWatcher)18 nsresult MLSFallback::Startup(nsIGeolocationUpdate* aWatcher) {
19 if (mHandoffTimer || mMLSFallbackProvider) {
20 return NS_OK;
21 }
22
23 mUpdateWatcher = aWatcher;
24 return NS_NewTimerWithCallback(getter_AddRefs(mHandoffTimer), this, mDelayMs,
25 nsITimer::TYPE_ONE_SHOT);
26 }
27
Shutdown()28 nsresult MLSFallback::Shutdown() {
29 mUpdateWatcher = nullptr;
30
31 if (mHandoffTimer) {
32 mHandoffTimer->Cancel();
33 mHandoffTimer = nullptr;
34 }
35
36 nsresult rv = NS_OK;
37 if (mMLSFallbackProvider) {
38 rv = mMLSFallbackProvider->Shutdown();
39 mMLSFallbackProvider = nullptr;
40 }
41 return rv;
42 }
43
44 NS_IMETHODIMP
Notify(nsITimer * aTimer)45 MLSFallback::Notify(nsITimer* aTimer) { return CreateMLSFallbackProvider(); }
46
47 NS_IMETHODIMP
GetName(nsACString & aName)48 MLSFallback::GetName(nsACString& aName) {
49 aName.AssignLiteral("MLSFallback");
50 return NS_OK;
51 }
52
CreateMLSFallbackProvider()53 nsresult MLSFallback::CreateMLSFallbackProvider() {
54 if (mMLSFallbackProvider || !mUpdateWatcher) {
55 return NS_OK;
56 }
57
58 nsresult rv;
59 mMLSFallbackProvider =
60 do_CreateInstance("@mozilla.org/geolocation/mls-provider;1", &rv);
61 NS_ENSURE_SUCCESS(rv, rv);
62
63 if (mMLSFallbackProvider) {
64 rv = mMLSFallbackProvider->Startup();
65 if (NS_SUCCEEDED(rv)) {
66 mMLSFallbackProvider->Watch(mUpdateWatcher);
67 }
68 }
69 mUpdateWatcher = nullptr;
70 return rv;
71 }
72