diff -r 000000000000 -r 6474c204b198 dom/system/qt/QTMLocationProvider.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/dom/system/qt/QTMLocationProvider.cpp Wed Dec 31 06:09:35 2014 +0100 @@ -0,0 +1,101 @@ +/* -*- Mode: c++; c-basic-offset: 4; tab-width: 20; indent-tabs-mode: nil; -*- + * 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 "QTMLocationProvider.h" +#include "nsGeoPosition.h" + +using namespace mozilla; + +NS_IMPL_ISUPPORTS(QTMLocationProvider, nsIGeolocationProvider) + +QTMLocationProvider::QTMLocationProvider() +{ + if (QMetaType::type("QGeoPositionInfo") == QMetaType::UnknownType) { + qRegisterMetaType("QGeoPositionInfo"); + } + mLocation = QGeoPositionInfoSource::createDefaultSource(this); + if (mLocation) + connect(mLocation, SIGNAL(positionUpdated(QGeoPositionInfo)), this, SLOT(positionUpdated(QGeoPositionInfo))); +} + +QTMLocationProvider::~QTMLocationProvider() +{ + delete mLocation; +} + +void +QTMLocationProvider::positionUpdated(const QGeoPositionInfo &geoPosition) +{ + if (!geoPosition.isValid()) { + NS_WARNING("Invalida geoposition received"); + return; + } + + QGeoCoordinate coord = geoPosition.coordinate(); + double latitude = coord.latitude(); + double longitude = coord.longitude(); + double altitude = coord.altitude(); + double accuracy = geoPosition.attribute(QGeoPositionInfo::HorizontalAccuracy); + double altitudeAccuracy = geoPosition.attribute(QGeoPositionInfo::VerticalAccuracy); + double heading = geoPosition.attribute(QGeoPositionInfo::Direction); + + bool providesSpeed = geoPosition.hasAttribute(QGeoPositionInfo::GroundSpeed); + double speed = geoPosition.attribute(QGeoPositionInfo::GroundSpeed); + + nsRefPtr p = + new nsGeoPosition(latitude, longitude, + altitude, accuracy, + altitudeAccuracy, heading, + speed, geoPosition.timestamp().toTime_t()); + if (mCallback) { + mCallback->Update(p); + } +} + +NS_IMETHODIMP +QTMLocationProvider::Startup() +{ + if (!mLocation) + return NS_ERROR_NOT_IMPLEMENTED; + + // Not all versions of qt5positioning set default prefered method + // thus this workaround initializing QGeoPositionSource explicitly + SetHighAccuracy(false); + mLocation->startUpdates(); + + return NS_OK; +} + +NS_IMETHODIMP +QTMLocationProvider::Watch(nsIGeolocationUpdate* aCallback) +{ + mCallback = aCallback; + + return NS_OK; +} + +NS_IMETHODIMP +QTMLocationProvider::Shutdown() +{ + if (!mLocation) + return NS_ERROR_NOT_IMPLEMENTED; + + mLocation->stopUpdates(); + mCallback = nullptr; + + return NS_OK; +} + +NS_IMETHODIMP +QTMLocationProvider::SetHighAccuracy(bool aHigh) +{ + if (!mLocation) + return NS_ERROR_NOT_IMPLEMENTED; + + mLocation->setPreferredPositioningMethods(aHigh ? + QGeoPositionInfoSource::SatellitePositioningMethods : + QGeoPositionInfoSource::AllPositioningMethods); + return NS_OK; +}