зеркало из https://github.com/mozilla/gecko-dev.git
Bug 478923 - Maemo Geolocation Provider support to support latest Geolocation specification. r/sr=jst
This commit is contained in:
Родитель
b5a365d327
Коммит
4a6980c573
|
@ -433,6 +433,7 @@ enum nsDOMClassInfoID {
|
|||
// Geolocation
|
||||
eDOMClassInfo_GeoGeolocation_id,
|
||||
eDOMClassInfo_GeoPosition_id,
|
||||
eDOMClassInfo_GeoPositionCoords_id,
|
||||
eDOMClassInfo_GeoPositionError_id,
|
||||
|
||||
// @font-face in CSS
|
||||
|
|
|
@ -461,6 +461,7 @@
|
|||
// Geolocation
|
||||
#include "nsIDOMGeoGeolocation.h"
|
||||
#include "nsIDOMGeoPosition.h"
|
||||
#include "nsIDOMGeoPositionCoords.h"
|
||||
#include "nsIDOMGeoPositionError.h"
|
||||
|
||||
// Workers
|
||||
|
@ -1279,6 +1280,9 @@ static nsDOMClassInfoData sClassInfoData[] = {
|
|||
NS_DEFINE_CLASSINFO_DATA(GeoPosition, nsDOMGenericSH,
|
||||
DOM_DEFAULT_SCRIPTABLE_FLAGS)
|
||||
|
||||
NS_DEFINE_CLASSINFO_DATA(GeoPositionCoords, nsDOMGenericSH,
|
||||
DOM_DEFAULT_SCRIPTABLE_FLAGS)
|
||||
|
||||
NS_DEFINE_CLASSINFO_DATA(GeoPositionError, nsDOMGenericSH,
|
||||
DOM_DEFAULT_SCRIPTABLE_FLAGS)
|
||||
|
||||
|
@ -3550,6 +3554,10 @@ nsDOMClassInfo::Init()
|
|||
DOM_CLASSINFO_MAP_ENTRY(nsIDOMGeoPosition)
|
||||
DOM_CLASSINFO_MAP_END
|
||||
|
||||
DOM_CLASSINFO_MAP_BEGIN(GeoPositionCoords, nsIDOMGeoPositionCoords)
|
||||
DOM_CLASSINFO_MAP_ENTRY(nsIDOMGeoPositionCoords)
|
||||
DOM_CLASSINFO_MAP_END
|
||||
|
||||
DOM_CLASSINFO_MAP_BEGIN(GeoPositionError, nsIDOMGeoPositionError)
|
||||
DOM_CLASSINFO_MAP_ENTRY(nsIDOMGeoPositionError)
|
||||
DOM_CLASSINFO_MAP_END
|
||||
|
|
|
@ -34,34 +34,132 @@
|
|||
*
|
||||
* ***** END LICENSE BLOCK ***** */
|
||||
|
||||
|
||||
|
||||
#include "MaemoLocationProvider.h"
|
||||
#include "nsGeolocation.h"
|
||||
#include "nsIClassInfo.h"
|
||||
#include "nsDOMClassInfoID.h"
|
||||
|
||||
////////////////////////////////////////////////////
|
||||
// nsGeoPositionCoords
|
||||
////////////////////////////////////////////////////
|
||||
|
||||
class nsGeoPositionCoords : public nsIDOMGeoPositionCoords
|
||||
{
|
||||
public:
|
||||
NS_DECL_ISUPPORTS
|
||||
NS_DECL_NSIDOMGEOPOSITIONCOORDS
|
||||
|
||||
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(){}
|
||||
|
||||
private:
|
||||
double mLat, mLong, mAlt, mHError, mVError, mHeading, mSpeed;
|
||||
};
|
||||
|
||||
NS_INTERFACE_MAP_BEGIN(nsGeoPositionCoords)
|
||||
NS_INTERFACE_MAP_ENTRY_AMBIGUOUS(nsISupports, nsIDOMGeoPositionCoords)
|
||||
NS_INTERFACE_MAP_ENTRY(nsIDOMGeoPositionCoords)
|
||||
NS_DOM_INTERFACE_MAP_ENTRY_CLASSINFO(GeoPositionCoords)
|
||||
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
|
||||
////////////////////////////////////////////////////
|
||||
|
||||
/**
|
||||
* Simple object that holds a single point in space.
|
||||
*/
|
||||
class nsGeoPosition : public nsIDOMGeoPosition
|
||||
{
|
||||
public:
|
||||
NS_DECL_ISUPPORTS
|
||||
NS_DECL_NSIDOMGEOPOSITION
|
||||
|
||||
nsGeoPosition(double aLat, double aLong, double aAlt, double aHError, double aVError, double aHeading, double aSpeed, long long aTimestamp)
|
||||
: mLat(aLat), mLong(aLong), mAlt(aAlt), mHError(aHError), mVError(aVError), mHeading(aHeading), mSpeed(aSpeed), mTimestamp(aTimestamp){};
|
||||
nsGeoPosition(double aLat, double aLong,
|
||||
double aAlt, double aHError,
|
||||
double aVError, double aHeading,
|
||||
double aSpeed, long long aTimestamp)
|
||||
: mLat(aLat),
|
||||
mLong(aLong),
|
||||
mAlt(aAlt),
|
||||
mHError(aHError),
|
||||
mVError(aVError),
|
||||
mHeading(aHeading),
|
||||
mSpeed(aSpeed),
|
||||
mTimestamp(aTimestamp)
|
||||
{
|
||||
}
|
||||
|
||||
private:
|
||||
~nsGeoPosition(){}
|
||||
~nsGeoPosition()
|
||||
{
|
||||
}
|
||||
double mLat, mLong, mAlt, mHError, mVError, mHeading, mSpeed;
|
||||
long long mTimestamp;
|
||||
nsRefPtr<nsGeoPositionCoords> mCoords;
|
||||
};
|
||||
|
||||
NS_INTERFACE_MAP_BEGIN(nsGeoPosition)
|
||||
|
@ -70,57 +168,24 @@ NS_INTERFACE_MAP_BEGIN(nsGeoPosition)
|
|||
NS_DOM_INTERFACE_MAP_ENTRY_CLASSINFO(GeoPosition)
|
||||
NS_INTERFACE_MAP_END
|
||||
|
||||
NS_IMPL_THREADSAFE_ADDREF(nsGeoPosition)
|
||||
NS_IMPL_THREADSAFE_RELEASE(nsGeoPosition)
|
||||
NS_IMPL_ADDREF(nsGeoPosition)
|
||||
NS_IMPL_RELEASE(nsGeoPosition)
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsGeoPosition::GetLatitude(double *aLatitude)
|
||||
nsGeoPosition::GetCoords(nsIDOMGeoPositionCoords * *aCoords)
|
||||
{
|
||||
*aLatitude = mLat;
|
||||
if (mCoords == nsnull)
|
||||
mCoords = new nsGeoPositionCoords(mLat,
|
||||
mLong,
|
||||
mAlt,
|
||||
mHError,
|
||||
mVError,
|
||||
mHeading,
|
||||
mSpeed);
|
||||
NS_IF_ADDREF(*aCoords = mCoords);
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsGeoPosition::GetLongitude(double *aLongitude)
|
||||
{
|
||||
*aLongitude = mLong;
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsGeoPosition::GetAltitude(double *aAltitude)
|
||||
{
|
||||
*aAltitude = mAlt;
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsGeoPosition::GetAccuracy(double *aAccuracy)
|
||||
{
|
||||
*aAccuracy = mHError;
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsGeoPosition::GetAltitudeAccuracy(double *aAltitudeAccuracy)
|
||||
{
|
||||
*aAltitudeAccuracy = mVError;
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsGeoPosition::GetHeading(double *aHeading)
|
||||
{
|
||||
*aHeading = mHeading;
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsGeoPosition::GetSpeed(double *aSpeed)
|
||||
{
|
||||
*aSpeed = mSpeed;
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsGeoPosition::GetTimestamp(DOMTimeStamp* aTimestamp)
|
||||
|
@ -133,7 +198,9 @@ nsGeoPosition::GetTimestamp(DOMTimeStamp* aTimestamp)
|
|||
NS_IMPL_ISUPPORTS1(MaemoLocationProvider, nsIGeolocationProvider)
|
||||
|
||||
MaemoLocationProvider::MaemoLocationProvider()
|
||||
: mGPSDevice(nsnull), mLocationCallbackHandle(0), mHasSeenLocation(PR_FALSE)
|
||||
: mGPSDevice(nsnull),
|
||||
mHasSeenLocation(PR_FALSE),
|
||||
mLastSeenTime(0)
|
||||
{
|
||||
}
|
||||
|
||||
|
@ -141,16 +208,24 @@ MaemoLocationProvider::~MaemoLocationProvider()
|
|||
{
|
||||
}
|
||||
|
||||
void location_changed (LocationGPSDevice *device, gpointer userdata)
|
||||
static void location_changed(LocationGPSDevice *device, gpointer userdata)
|
||||
{
|
||||
if (!userdata || !device || !device->fix) {
|
||||
return;
|
||||
}
|
||||
|
||||
// printf ("Latitude: %.5f\nLongitude: %.5f\nAltitude: %.2f\n",
|
||||
// device->fix->latitude, device->fix->longitude, device->fix->altitude);
|
||||
|
||||
MaemoLocationProvider* provider = (MaemoLocationProvider*) userdata;
|
||||
nsRefPtr<nsGeoPosition> somewhere = new nsGeoPosition(device->fix->latitude,
|
||||
device->fix->longitude,
|
||||
device->fix->altitude,
|
||||
device->fix->eph,
|
||||
device->fix->epv,
|
||||
0,0,
|
||||
device->fix->time);
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
PR_Now());
|
||||
provider->Update(somewhere);
|
||||
}
|
||||
|
||||
|
@ -158,15 +233,14 @@ NS_IMETHODIMP MaemoLocationProvider::Startup()
|
|||
{
|
||||
if (!mGPSDevice)
|
||||
{
|
||||
// if we are already started, don't do anything
|
||||
memset(&mGPSBT, 0, sizeof(gpsbt_t));
|
||||
int result = gpsbt_start(NULL, 0, 0, 0, NULL, 0, 0, &mGPSBT);
|
||||
if (result <0)
|
||||
return NS_ERROR_NOT_AVAILABLE;
|
||||
|
||||
mGPSDevice = (LocationGPSDevice*) g_object_new (LOCATION_TYPE_GPS_DEVICE, NULL);
|
||||
mLocationCallbackHandle = g_signal_connect (mGPSDevice, "changed", G_CALLBACK (location_changed), this->mCallback);
|
||||
|
||||
mCallbackChanged = g_signal_connect(mGPSDevice,
|
||||
"changed",
|
||||
G_CALLBACK(location_changed),
|
||||
this);
|
||||
}
|
||||
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
|
@ -178,34 +252,38 @@ NS_IMETHODIMP MaemoLocationProvider::IsReady(PRBool *_retval NS_OUTPARAM)
|
|||
|
||||
NS_IMETHODIMP MaemoLocationProvider::Watch(nsIGeolocationUpdate *callback)
|
||||
{
|
||||
mCallback = callback; // weak ref
|
||||
return NS_OK;
|
||||
}
|
||||
if (mCallback)
|
||||
return NS_OK;
|
||||
|
||||
/* readonly attribute nsIDOMGeoPosition currentPosition; */
|
||||
NS_IMETHODIMP MaemoLocationProvider::GetCurrentPosition(nsIDOMGeoPosition * *aCurrentPosition)
|
||||
{
|
||||
NS_IF_ADDREF(*aCurrentPosition = mLastPosition);
|
||||
mCallback = callback;
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP MaemoLocationProvider::Shutdown()
|
||||
{
|
||||
if (mGPSDevice && mLocationCallbackHandle) {
|
||||
g_signal_handler_disconnect(mGPSDevice, mLocationCallbackHandle);
|
||||
if (mGPSDevice)
|
||||
{
|
||||
g_signal_handler_disconnect(mGPSDevice, mCallbackChanged);
|
||||
|
||||
g_object_unref(mGPSDevice);
|
||||
gpsbt_stop(&mGPSBT);
|
||||
mLocationCallbackHandle = 0;
|
||||
mGPSDevice = nsnull;
|
||||
|
||||
mHasSeenLocation = PR_FALSE;
|
||||
|
||||
mCallback = nsnull;
|
||||
}
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
void MaemoLocationProvider::Update(nsIDOMGeoPosition* aPosition)
|
||||
{
|
||||
if ((PR_Now() - mLastSeenTime) / PR_USEC_PER_SEC < 5)
|
||||
return;
|
||||
|
||||
mHasSeenLocation = PR_TRUE;
|
||||
mLastPosition = aPosition;
|
||||
|
||||
if (mCallback)
|
||||
mCallback->Update(aPosition);
|
||||
|
||||
mLastSeenTime = PR_Now();
|
||||
}
|
||||
|
|
|
@ -36,6 +36,7 @@
|
|||
|
||||
#include "nsIGeolocationProvider.h"
|
||||
#include "nsIDOMGeoPosition.h"
|
||||
|
||||
#include "nsCOMPtr.h"
|
||||
|
||||
#include <glib.h>
|
||||
|
@ -63,13 +64,13 @@ public:
|
|||
private:
|
||||
~MaemoLocationProvider();
|
||||
|
||||
nsCOMPtr<nsIDOMGeoPosition> mLastPosition;
|
||||
nsCOMPtr<nsIGeolocationUpdate> mCallback;
|
||||
|
||||
nsIGeolocationUpdate* mCallback; // weak reference by contract.
|
||||
|
||||
|
||||
gpsbt_t mGPSBT;
|
||||
LocationGPSDevice *mGPSDevice;
|
||||
gulong mLocationCallbackHandle;
|
||||
|
||||
gulong mCallbackChanged;
|
||||
|
||||
PRBool mHasSeenLocation;
|
||||
PRTime mLastSeenTime;
|
||||
|
||||
};
|
||||
|
|
|
@ -637,7 +637,6 @@ nsGeolocation::Update(nsIDOMGeoPosition *aSomewhere)
|
|||
geoService->SetCachedPosition(aSomewhere);
|
||||
}
|
||||
|
||||
|
||||
if (!OwnerStillExists())
|
||||
{
|
||||
Shutdown();
|
||||
|
|
Загрузка…
Ссылка в новой задаче