diff options
Diffstat (limited to 'dom/geolocation/nsGeoPosition.cpp')
-rw-r--r-- | dom/geolocation/nsGeoPosition.cpp | 263 |
1 files changed, 263 insertions, 0 deletions
diff --git a/dom/geolocation/nsGeoPosition.cpp b/dom/geolocation/nsGeoPosition.cpp new file mode 100644 index 000000000..c4732457a --- /dev/null +++ b/dom/geolocation/nsGeoPosition.cpp @@ -0,0 +1,263 @@ +/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/* vim: set ts=8 sts=2 et sw=2 tw=80: */ +/* 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 "nsGeoPosition.h" + +#include "mozilla/dom/PositionBinding.h" +#include "mozilla/dom/CoordinatesBinding.h" + +//////////////////////////////////////////////////// +// nsGeoPositionCoords +//////////////////////////////////////////////////// +nsGeoPositionCoords::nsGeoPositionCoords(double aLat, double aLong, + double aAlt, double aHError, + double aVError, double aHeading, + double aSpeed) + : mLat(aLat) + , mLong(aLong) + , mAlt(aAlt) + , mHError(aHError) + , mVError(aVError) + , mHeading(aHeading) + , mSpeed(aSpeed) +{ +} + +nsGeoPositionCoords::~nsGeoPositionCoords() +{ +} + +NS_INTERFACE_MAP_BEGIN(nsGeoPositionCoords) +NS_INTERFACE_MAP_ENTRY_AMBIGUOUS(nsISupports, nsIDOMGeoPositionCoords) +NS_INTERFACE_MAP_ENTRY(nsIDOMGeoPositionCoords) +NS_INTERFACE_MAP_END + +NS_IMPL_ADDREF(nsGeoPositionCoords) +NS_IMPL_RELEASE(nsGeoPositionCoords) + +NS_IMETHODIMP +nsGeoPositionCoords::GetLatitude(double *aLatitude) +{ + *aLatitude = mLat; + return NS_OK; +} + +NS_IMETHODIMP +nsGeoPositionCoords::GetLongitude(double *aLongitude) +{ + *aLongitude = mLong; + return NS_OK; +} + +NS_IMETHODIMP +nsGeoPositionCoords::GetAltitude(double *aAltitude) +{ + *aAltitude = mAlt; + return NS_OK; +} + +NS_IMETHODIMP +nsGeoPositionCoords::GetAccuracy(double *aAccuracy) +{ + *aAccuracy = mHError; + return NS_OK; +} + +NS_IMETHODIMP +nsGeoPositionCoords::GetAltitudeAccuracy(double *aAltitudeAccuracy) +{ + *aAltitudeAccuracy = mVError; + return NS_OK; +} + +NS_IMETHODIMP +nsGeoPositionCoords::GetHeading(double *aHeading) +{ + *aHeading = mHeading; + return NS_OK; +} + +NS_IMETHODIMP +nsGeoPositionCoords::GetSpeed(double *aSpeed) +{ + *aSpeed = mSpeed; + return NS_OK; +} + +//////////////////////////////////////////////////// +// nsGeoPosition +//////////////////////////////////////////////////// + +nsGeoPosition::nsGeoPosition(double aLat, double aLong, + double aAlt, double aHError, + double aVError, double aHeading, + double aSpeed, long long aTimestamp) : + mTimestamp(aTimestamp) +{ + mCoords = new nsGeoPositionCoords(aLat, aLong, + aAlt, aHError, + aVError, aHeading, + aSpeed); +} + +nsGeoPosition::nsGeoPosition(nsIDOMGeoPositionCoords *aCoords, + long long aTimestamp) : + mTimestamp(aTimestamp), + mCoords(aCoords) +{ +} + +nsGeoPosition::nsGeoPosition(nsIDOMGeoPositionCoords *aCoords, + DOMTimeStamp aTimestamp) : + mTimestamp(aTimestamp), + mCoords(aCoords) +{ +} + +nsGeoPosition::~nsGeoPosition() +{ +} + +NS_INTERFACE_MAP_BEGIN(nsGeoPosition) +NS_INTERFACE_MAP_ENTRY_AMBIGUOUS(nsISupports, nsIDOMGeoPosition) +NS_INTERFACE_MAP_ENTRY(nsIDOMGeoPosition) +NS_INTERFACE_MAP_END + +NS_IMPL_ADDREF(nsGeoPosition) +NS_IMPL_RELEASE(nsGeoPosition) + +NS_IMETHODIMP +nsGeoPosition::GetTimestamp(DOMTimeStamp* aTimestamp) +{ + *aTimestamp = mTimestamp; + return NS_OK; +} + +NS_IMETHODIMP +nsGeoPosition::GetCoords(nsIDOMGeoPositionCoords * *aCoords) +{ + NS_IF_ADDREF(*aCoords = mCoords); + return NS_OK; +} + +namespace mozilla { +namespace dom { + + +NS_IMPL_CYCLE_COLLECTION_WRAPPERCACHE(Position, mParent, mCoordinates) +NS_IMPL_CYCLE_COLLECTING_ADDREF(Position) +NS_IMPL_CYCLE_COLLECTING_RELEASE(Position) +NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION(Position) + NS_WRAPPERCACHE_INTERFACE_MAP_ENTRY + NS_INTERFACE_MAP_ENTRY(nsISupports) +NS_INTERFACE_MAP_END + +Position::Position(nsISupports* aParent, nsIDOMGeoPosition* aGeoPosition) + : mParent(aParent) + , mGeoPosition(aGeoPosition) +{ +} + +Position::~Position() +{ +} + +nsISupports* +Position::GetParentObject() const +{ + return mParent; +} + +JSObject* +Position::WrapObject(JSContext* aCx, JS::Handle<JSObject*> aGivenProto) +{ + return PositionBinding::Wrap(aCx, this, aGivenProto); +} + +Coordinates* +Position::Coords() +{ + if (!mCoordinates) { + nsCOMPtr<nsIDOMGeoPositionCoords> coords; + mGeoPosition->GetCoords(getter_AddRefs(coords)); + MOZ_ASSERT(coords, "coords should not be null"); + + mCoordinates = new Coordinates(this, coords); + } + + return mCoordinates; +} + +uint64_t +Position::Timestamp() const +{ + uint64_t rv; + + mGeoPosition->GetTimestamp(&rv); + return rv; +} + +NS_IMPL_CYCLE_COLLECTION_WRAPPERCACHE(Coordinates, mPosition) +NS_IMPL_CYCLE_COLLECTING_ADDREF(Coordinates) +NS_IMPL_CYCLE_COLLECTING_RELEASE(Coordinates) +NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION(Coordinates) + NS_WRAPPERCACHE_INTERFACE_MAP_ENTRY + NS_INTERFACE_MAP_ENTRY(nsISupports) +NS_INTERFACE_MAP_END + +Coordinates::Coordinates(Position* aPosition, nsIDOMGeoPositionCoords* aCoords) + : mPosition(aPosition) + , mCoords(aCoords) +{ +} + +Coordinates::~Coordinates() +{ +} + +Position* +Coordinates::GetParentObject() const +{ + return mPosition; +} + +JSObject* +Coordinates::WrapObject(JSContext* aCx, JS::Handle<JSObject*> aGivenProto) +{ + return CoordinatesBinding::Wrap(aCx, this, aGivenProto); +} + +#define GENERATE_COORDS_WRAPPED_GETTER(name) \ +double \ +Coordinates::name() const \ +{ \ + double rv; \ + mCoords->Get##name(&rv); \ + return rv; \ +} + +#define GENERATE_COORDS_WRAPPED_GETTER_NULLABLE(name) \ +Nullable<double> \ +Coordinates::Get##name() const \ +{ \ + double rv; \ + mCoords->Get##name(&rv); \ + return Nullable<double>(rv); \ +} + +GENERATE_COORDS_WRAPPED_GETTER(Latitude) +GENERATE_COORDS_WRAPPED_GETTER(Longitude) +GENERATE_COORDS_WRAPPED_GETTER_NULLABLE(Altitude) +GENERATE_COORDS_WRAPPED_GETTER(Accuracy) +GENERATE_COORDS_WRAPPED_GETTER_NULLABLE(AltitudeAccuracy) +GENERATE_COORDS_WRAPPED_GETTER_NULLABLE(Heading) +GENERATE_COORDS_WRAPPED_GETTER_NULLABLE(Speed) + +#undef GENERATE_COORDS_WRAPPED_GETTER +#undef GENERATE_COORDS_WRAPPED_GETTER_NULLABLE + +} // namespace dom +} // namespace mozilla |