WebKitGeolocationProvider.cpp [plain text]
#include "config.h"
#include "WebKitGeolocationProvider.h"
#include "WebGeolocationManagerProxy.h"
#include "WebGeolocationPosition.h"
using namespace WebKit;
#if ENABLE(GEOLOCATION)
static inline WebKitGeolocationProvider* toGeolocationProvider(const void* clientInfo)
{
return static_cast<WebKitGeolocationProvider*>(const_cast<void*>(clientInfo));
}
static void startUpdatingCallback(WKGeolocationManagerRef, const void* clientInfo)
{
toGeolocationProvider(clientInfo)->startUpdating();
}
static void stopUpdatingCallback(WKGeolocationManagerRef, const void* clientInfo)
{
toGeolocationProvider(clientInfo)->stopUpdating();
}
WebKitGeolocationProvider::~WebKitGeolocationProvider()
{
m_provider.stopUpdating();
WKGeolocationManagerSetProvider(toAPI(m_geolocationManager.get()), nullptr);
}
Ref<WebKitGeolocationProvider> WebKitGeolocationProvider::create(WebGeolocationManagerProxy* geolocationManager)
{
return adoptRef(*new WebKitGeolocationProvider(geolocationManager));
}
WebKitGeolocationProvider::WebKitGeolocationProvider(WebGeolocationManagerProxy* geolocationManager)
: m_geolocationManager(geolocationManager)
, m_provider(this)
{
ASSERT(geolocationManager);
WKGeolocationProviderV1 wkGeolocationProvider = {
{
1, this, },
startUpdatingCallback,
stopUpdatingCallback,
0 };
WKGeolocationManagerSetProvider(toAPI(geolocationManager), &wkGeolocationProvider.base);
}
void WebKitGeolocationProvider::startUpdating()
{
m_provider.startUpdating();
}
void WebKitGeolocationProvider::stopUpdating()
{
m_provider.stopUpdating();
}
void WebKitGeolocationProvider::notifyPositionChanged(int timestamp, double latitude, double longitude, double altitude, double accuracy, double altitudeAccuracy)
{
RefPtr<WebGeolocationPosition> position = WebGeolocationPosition::create(timestamp, latitude, longitude, accuracy, true, altitude, true, altitudeAccuracy, false, 0, false, 0);
m_geolocationManager->providerDidChangePosition(position.get());
}
void WebKitGeolocationProvider::notifyErrorOccurred(const char* )
{
m_geolocationManager->providerDidFailToDeterminePosition();
}
#endif // ENABLE(GEOLOCATION)