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