| // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file | |
| // for details. All rights reserved. Use of this source code is governed by a | |
| // BSD-style license that can be found in the LICENSE file. | |
| part of $LIBRARYNAME; | |
| $(ANNOTATIONS)$(NATIVESPEC)$(CLASS_MODIFIERS)class $CLASSNAME$EXTENDS$IMPLEMENTS { | |
| Future<Geoposition> getCurrentPosition({bool enableHighAccuracy, | |
| Duration timeout, Duration maximumAge}) { | |
| var options = {}; | |
| if (enableHighAccuracy != null) { | |
| options['enableHighAccuracy'] = enableHighAccuracy; | |
| } | |
| if (timeout != null) { | |
| options['timeout'] = timeout.inMilliseconds; | |
| } | |
| if (maximumAge != null) { | |
| options['maximumAge'] = maximumAge.inMilliseconds; | |
| } | |
| var completer = new Completer<Geoposition>(); | |
| try { | |
| _getCurrentPosition( | |
| (position) { | |
| completer.complete(_ensurePosition(position)); | |
| }, | |
| (error) { | |
| completer.completeError(error); | |
| }, | |
| options); | |
| } catch (e, stacktrace) { | |
| completer.completeError(e, stacktrace); | |
| } | |
| return completer.future; | |
| } | |
| Stream<Geoposition> watchPosition({bool enableHighAccuracy, | |
| Duration timeout, Duration maximumAge}) { | |
| var options = {}; | |
| if (enableHighAccuracy != null) { | |
| options['enableHighAccuracy'] = enableHighAccuracy; | |
| } | |
| if (timeout != null) { | |
| options['timeout'] = timeout.inMilliseconds; | |
| } | |
| if (maximumAge != null) { | |
| options['maximumAge'] = maximumAge.inMilliseconds; | |
| } | |
| int watchId; | |
| // TODO(jacobr): it seems like a bug that we have to specifiy the static | |
| // type here for controller.stream to have the right type. | |
| // dartbug.com/26278 | |
| StreamController<Geoposition> controller; | |
| controller = new StreamController<Geoposition>(sync: true, | |
| onListen: () { | |
| assert(watchId == null); | |
| watchId = _watchPosition( | |
| (position) { | |
| controller.add(_ensurePosition(position)); | |
| }, | |
| (error) { | |
| controller.addError(error); | |
| }, | |
| options); | |
| }, | |
| onCancel: () { | |
| assert(watchId != null); | |
| _clearWatch(watchId); | |
| }); | |
| return controller.stream; | |
| } | |
| Geoposition _ensurePosition(domPosition) { | |
| try { | |
| // Firefox may throw on this. | |
| if (domPosition is Geoposition) { | |
| return domPosition; | |
| } | |
| } catch(e) {} | |
| return new _GeopositionWrapper(domPosition); | |
| } | |
| $!MEMBERS} | |
| /** | |
| * Wrapper for Firefox- it returns an object which we cannot map correctly. | |
| * Basically Firefox was returning a [xpconnect wrapped nsIDOMGeoPosition] but | |
| * which has further oddities. | |
| */ | |
| class _GeopositionWrapper implements Geoposition { | |
| var _ptr; | |
| _GeopositionWrapper(this._ptr); | |
| Coordinates get coords => JS('Coordinates', '#.coords', _ptr); | |
| int get timestamp => JS('int', '#.timestamp', _ptr); | |
| } |