Updated Branches: refs/heads/dev 3d62bc46d -> f5a26ebf7
add ubuntu platform Project: http://git-wip-us.apache.org/repos/asf/cordova-plugin-geolocation/repo Commit: http://git-wip-us.apache.org/repos/asf/cordova-plugin-geolocation/commit/04b60f87 Tree: http://git-wip-us.apache.org/repos/asf/cordova-plugin-geolocation/tree/04b60f87 Diff: http://git-wip-us.apache.org/repos/asf/cordova-plugin-geolocation/diff/04b60f87 Branch: refs/heads/dev Commit: 04b60f870679e0756d1aa7e1b5e20cb5a437597d Parents: 236ec15 Author: Maxim Ermilov <[email protected]> Authored: Mon Jan 20 18:25:05 2014 +0400 Committer: Maxim Ermilov <[email protected]> Committed: Mon Jan 20 18:25:05 2014 +0400 ---------------------------------------------------------------------- plugin.xml | 22 ++++++++ src/ubuntu/geolocation.cpp | 119 ++++++++++++++++++++++++++++++++++++++++ src/ubuntu/geolocation.h | 69 +++++++++++++++++++++++ 3 files changed, 210 insertions(+) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/cordova-plugin-geolocation/blob/04b60f87/plugin.xml ---------------------------------------------------------------------- diff --git a/plugin.xml b/plugin.xml index 3f9877b..57558c2 100644 --- a/plugin.xml +++ b/plugin.xml @@ -148,6 +148,28 @@ xmlns:android="http://schemas.android.com/apk/res/android" </platform> + <!-- ubuntu --> + <platform name="ubuntu"> + <js-module src="www/Coordinates.js" name="Coordinates"> + <clobbers target="Coordinates" /> + </js-module> + + <js-module src="www/PositionError.js" name="PositionError"> + <clobbers target="PositionError" /> + </js-module> + + <js-module src="www/Position.js" name="Position"> + <clobbers target="Position" /> + </js-module> + + <js-module src="www/geolocation.js" name="geolocation"> + <clobbers target="navigator.geolocation" /> + </js-module> + + <source-file src="src/ubuntu/geolocation.cpp" /> + <header-file src="src/ubuntu/geolocation.h" /> + </platform>--> + <!-- wp7 --> <platform name="wp7"> http://git-wip-us.apache.org/repos/asf/cordova-plugin-geolocation/blob/04b60f87/src/ubuntu/geolocation.cpp ---------------------------------------------------------------------- diff --git a/src/ubuntu/geolocation.cpp b/src/ubuntu/geolocation.cpp new file mode 100644 index 0000000..c820cfe --- /dev/null +++ b/src/ubuntu/geolocation.cpp @@ -0,0 +1,119 @@ +/* + * + * Copyright 2013 Canonical Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + * +*/ + +#include <QUuid> + +#include "geolocation.h" + +Geolocation::Geolocation(Cordova *cordova): CPlugin(cordova), + _geoPositionInfoSource(QGeoPositionInfoSource::createDefaultSource(this)) { + if (_geoPositionInfoSource.data() != 0) { + QObject::connect(_geoPositionInfoSource.data(), SIGNAL(positionUpdated(QGeoPositionInfo)), this, SLOT(positionUpdated(QGeoPositionInfo))); + QObject::connect(_geoPositionInfoSource.data(), SIGNAL(updateTimeout()), this, SLOT(updateTimeout())); + } +} + +void Geolocation::addWatch(int scId, int ecId, const QString &id, bool enableHighAccuracy) { + Q_UNUSED(enableHighAccuracy); + + assert(_id2sc.find(id) == _id2sc.end()); + + if (!_geoPositionInfoSource.data()) { + QVariantMap err; + err.insert("code", POSITION_UNAVAILABLE); + err.insert("message", "unavailable"); + + this->cb(ecId, err); + return; + } + + _id2sc[id] = scId; + _id2ec[id] = ecId; +} + +void Geolocation::clearWatch(int scId, int ecId, const QString &id) { + _id2sc.remove(id); + _id2ec.remove(id); +} + +void Geolocation::getLocation(int scId, int ecId, bool enableHighAccuracy, qint64 maximumAge) { + Q_UNUSED(maximumAge); + Q_UNUSED(enableHighAccuracy); + + if (!_geoPositionInfoSource.data()) { + QVariantMap err; + err.insert("code", POSITION_UNAVAILABLE); + err.insert("message", "unavailable"); + + this->cb(ecId, err); + return; + } + + _geoPositionInfoSource->requestUpdate(); + + QString id = QString("_INTERNAL_") + QUuid::createUuid().toString(); + + _id2sc[id] = scId; + _id2ec[id] = ecId; + _singleUpdate.insert(id); +} + +void Geolocation::positionUpdated(const QGeoPositionInfo &update) { + QGeoCoordinate coordinate = update.coordinate(); + + QVariantMap p; + + p.insert("latitude", coordinate.latitude()); + p.insert("longitude", coordinate.longitude()); + p.insert("altitude", coordinate.altitude()); + + if (update.hasAttribute(QGeoPositionInfo::VerticalAccuracy)) + p.insert("accuracy", update.attribute(QGeoPositionInfo::VerticalAccuracy)); + if (update.hasAttribute(QGeoPositionInfo::Direction)) + p.insert("heading", update.attribute(QGeoPositionInfo::Direction)); + if (update.hasAttribute(QGeoPositionInfo::GroundSpeed)) + p.insert("velocity", update.attribute(QGeoPositionInfo::GroundSpeed)); + if (update.hasAttribute(QGeoPositionInfo::HorizontalAccuracy)) + p.insert("altitudeAccuracy", update.attribute(QGeoPositionInfo::HorizontalAccuracy)); + p.insert("timestamp", update.timestamp().toMSecsSinceEpoch()); + + for (const QString &id: _id2sc.keys()) { + int scId = _id2sc[id]; + this->cb(scId, p); + if (_singleUpdate.contains(id)) { + _singleUpdate.remove(id); + _id2sc.remove(id); + _id2ec.remove(id); + } + } +} + +void Geolocation::updateTimeout() { + QVariantMap err; + err.insert("code", TIMEOUT); + err.insert("message", "timeout"); + + for (int ecId: _id2ec) { + this->cb(ecId, err); + } + + _id2ec.clear(); + _id2sc.clear(); + _singleUpdate.clear(); +} http://git-wip-us.apache.org/repos/asf/cordova-plugin-geolocation/blob/04b60f87/src/ubuntu/geolocation.h ---------------------------------------------------------------------- diff --git a/src/ubuntu/geolocation.h b/src/ubuntu/geolocation.h new file mode 100644 index 0000000..7345bec --- /dev/null +++ b/src/ubuntu/geolocation.h @@ -0,0 +1,69 @@ +/* + * + * Copyright 2013 Canonical Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + * +*/ + +#ifndef GEOLOCATION_H_SVO2013 +#define GEOLOCATION_H_SVO2013 + +#include <QGeoPositionInfoSource> +#include <QGeoPositionInfo> +#include <QtCore> +#include <cassert> + +#include <cplugin.h> + +class Geolocation: public CPlugin { + Q_OBJECT +public: + explicit Geolocation(Cordova *cordova); + + virtual const QString fullName() override { + return Geolocation::fullID(); + } + + virtual const QString shortName() override { + return "Geolocation"; + } + + static const QString fullID() { + return "Geolocation"; + } + +public slots: + void getLocation(int scId, int ecId, bool enableHighAccuracy, qint64 maximumAge); + void addWatch(int scId, int ecId, const QString &id, bool enableHighAccuracy); + void clearWatch(int scId, int ecId, const QString &id); + +protected slots: + void positionUpdated(const QGeoPositionInfo &update); + void updateTimeout(); + +private: + QMap<QString, int> _id2sc; + QMap<QString, int> _id2ec; + QSet<QString> _singleUpdate; + QSharedPointer<QGeoPositionInfoSource> _geoPositionInfoSource; + + enum PositionError { + PERMISSION_DENIED = 1, + POSITION_UNAVAILABLE = 2, + TIMEOUT = 3 + }; +}; + +#endif
