Title: [119249] trunk/Source/WebCore
Revision
119249
Author
[email protected]
Date
2012-06-01 10:05:37 -0700 (Fri, 01 Jun 2012)

Log Message

[GTK] Add a new and reusable Geoclue-based geolocation provider in WebCore
https://bugs.webkit.org/show_bug.cgi?id=87800

Reviewed by Carlos Garcia Campos.

Added new and reusable Geoclue-based geolocation provider to WebCore.

* GNUmakefile.am:
* GNUmakefile.list.am:
* platform/geoclue/GeolocationProviderGeoclue.cpp: Added.
(getPositionCallback):
(positionChangedCallback):
(GeolocationProviderGeoclue::GeolocationProviderGeoclue):
(GeolocationProviderGeoclue::~GeolocationProviderGeoclue):
(GeolocationProviderGeoclue::startUpdating):
(GeolocationProviderGeoclue::stopUpdating):
(GeolocationProviderGeoclue::setEnableHighAccuracy):
(GeolocationProviderGeoclue::setGeoclueClient):
(GeolocationProviderGeoclue::setGeocluePosition):
(GeolocationProviderGeoclue::updateClientRequirements):
(GeolocationProviderGeoclue::positionChanged):
(GeolocationProviderGeoclue::errorOccured):
* platform/geoclue/GeolocationProviderGeoclue.h: Added.
(WebCore):
(GeolocationProviderGeoclue):
* platform/geoclue/GeolocationProviderGeoclueClient.h: Added.
(WebCore):
(GeolocationProviderGeoclueClient):

Modified Paths

Added Paths

Diff

Modified: trunk/Source/WebCore/ChangeLog (119248 => 119249)


--- trunk/Source/WebCore/ChangeLog	2012-06-01 17:04:06 UTC (rev 119248)
+++ trunk/Source/WebCore/ChangeLog	2012-06-01 17:05:37 UTC (rev 119249)
@@ -1,3 +1,34 @@
+2012-06-01  Mario Sanchez Prada  <[email protected]>
+
+        [GTK] Add a new and reusable Geoclue-based geolocation provider in WebCore
+        https://bugs.webkit.org/show_bug.cgi?id=87800
+
+        Reviewed by Carlos Garcia Campos.
+
+        Added new and reusable Geoclue-based geolocation provider to WebCore.
+
+        * GNUmakefile.am:
+        * GNUmakefile.list.am:
+        * platform/geoclue/GeolocationProviderGeoclue.cpp: Added.
+        (getPositionCallback):
+        (positionChangedCallback):
+        (GeolocationProviderGeoclue::GeolocationProviderGeoclue):
+        (GeolocationProviderGeoclue::~GeolocationProviderGeoclue):
+        (GeolocationProviderGeoclue::startUpdating):
+        (GeolocationProviderGeoclue::stopUpdating):
+        (GeolocationProviderGeoclue::setEnableHighAccuracy):
+        (GeolocationProviderGeoclue::setGeoclueClient):
+        (GeolocationProviderGeoclue::setGeocluePosition):
+        (GeolocationProviderGeoclue::updateClientRequirements):
+        (GeolocationProviderGeoclue::positionChanged):
+        (GeolocationProviderGeoclue::errorOccured):
+        * platform/geoclue/GeolocationProviderGeoclue.h: Added.
+        (WebCore):
+        (GeolocationProviderGeoclue):
+        * platform/geoclue/GeolocationProviderGeoclueClient.h: Added.
+        (WebCore):
+        (GeolocationProviderGeoclueClient):
+
 2012-06-01  Thiago Marcos P. Santos  <[email protected]>
 
         [Qt] Remove deprecated Q_GLOBAL_STATIC_WITH_INITIALIZER

Modified: trunk/Source/WebCore/GNUmakefile.am (119248 => 119249)


--- trunk/Source/WebCore/GNUmakefile.am	2012-06-01 17:04:06 UTC (rev 119248)
+++ trunk/Source/WebCore/GNUmakefile.am	2012-06-01 17:05:37 UTC (rev 119249)
@@ -107,6 +107,7 @@
 	-I$(srcdir)/Source/WebCore/page/gtk \
 	-I$(srcdir)/Source/WebCore/platform/cairo \
 	-I$(srcdir)/Source/WebCore/platform/audio/gstreamer \
+	-I$(srcdir)/Source/WebCore/platform/geoclue \
 	-I$(srcdir)/Source/WebCore/platform/graphics/cairo \
 	-I$(srcdir)/Source/WebCore/platform/graphics/glx \
 	-I$(srcdir)/Source/WebCore/platform/graphics/gstreamer \

Modified: trunk/Source/WebCore/GNUmakefile.list.am (119248 => 119249)


--- trunk/Source/WebCore/GNUmakefile.list.am	2012-06-01 17:04:06 UTC (rev 119248)
+++ trunk/Source/WebCore/GNUmakefile.list.am	2012-06-01 17:05:37 UTC (rev 119249)
@@ -4707,6 +4707,9 @@
 	Source/WebCore/page/gtk/DragControllerGtk.cpp \
 	Source/WebCore/page/gtk/EventHandlerGtk.cpp \
 	Source/WebCore/platform/cairo/WidgetBackingStore.h \
+	Source/WebCore/platform/geoclue/GeolocationProviderGeoclue.h \
+	Source/WebCore/platform/geoclue/GeolocationProviderGeoclue.cpp \
+	Source/WebCore/platform/geoclue/GeolocationProviderGeoclueClient.h \
 	Source/WebCore/platform/graphics/cairo/GraphicsContextCairo.cpp \
 	Source/WebCore/platform/graphics/cairo/GraphicsContextPlatformPrivateCairo.h \
 	Source/WebCore/platform/graphics/gstreamer/GStreamerGWorld.cpp \

Added: trunk/Source/WebCore/platform/geoclue/GeolocationProviderGeoclue.cpp (0 => 119249)


--- trunk/Source/WebCore/platform/geoclue/GeolocationProviderGeoclue.cpp	                        (rev 0)
+++ trunk/Source/WebCore/platform/geoclue/GeolocationProviderGeoclue.cpp	2012-06-01 17:05:37 UTC (rev 119249)
@@ -0,0 +1,181 @@
+/*
+ * Copyright (C) 2012 Igalia S.L.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+ * THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include "config.h"
+#include "GeolocationProviderGeoclue.h"
+
+#if ENABLE(GEOLOCATION)
+
+#include <wtf/gobject/GOwnPtr.h>
+
+using namespace WebCore;
+
+static void getPositionCallback(GeocluePosition* position, GeocluePositionFields fields, int timestamp, double latitude, double longitude, double altitude, GeoclueAccuracy* accuracy, GError* error, GeolocationProviderGeoclue* provider)
+{
+    if (error) {
+        provider->errorOccurred(error->message);
+        g_error_free(error);
+        return;
+    }
+    provider->positionChanged(position, fields, timestamp, latitude, longitude, altitude, accuracy);
+}
+
+static void positionChangedCallback(GeocluePosition* position, GeocluePositionFields fields, int timestamp, double latitude, double longitude, double altitude, GeoclueAccuracy* accuracy, GeolocationProviderGeoclue* provider)
+{
+    provider->positionChanged(position, fields, timestamp, latitude, longitude, altitude, accuracy);
+}
+
+static void createGeocluePositionCallback(GeoclueMasterClient*, GeocluePosition* position, GError *error, GeolocationProviderGeoclue* provider)
+{
+    if (error) {
+        provider->errorOccurred(error->message);
+        g_error_free(error);
+        return;
+    }
+    provider->initializeGeocluePosition(position);
+}
+
+static void geoclueClientSetRequirementsCallback(GeoclueMasterClient* client, GError* error, GeolocationProviderGeoclue* provider)
+{
+    if (error) {
+        provider->errorOccurred(error->message);
+        g_error_free(error);
+    }
+}
+
+static void createGeoclueClientCallback(GeoclueMaster*, GeoclueMasterClient* client, char*, GError* error, GeolocationProviderGeoclue* provider)
+{
+    if (error) {
+        provider->errorOccurred(error->message);
+        g_error_free(error);
+        return;
+    }
+    provider->initializeGeoclueClient(client);
+}
+
+GeolocationProviderGeoclue::GeolocationProviderGeoclue(GeolocationProviderGeoclueClient* client)
+    : m_client(client)
+    , m_geoclueClient(0)
+    , m_geocluePosition(0)
+    , m_latitude(0)
+    , m_longitude(0)
+    , m_altitude(0)
+    , m_accuracy(0)
+    , m_altitudeAccuracy(0)
+    , m_timestamp(0)
+    , m_enableHighAccuracy(false)
+    , m_isUpdating(false)
+{
+    ASSERT(m_client);
+}
+
+GeolocationProviderGeoclue::~GeolocationProviderGeoclue()
+{
+}
+
+void GeolocationProviderGeoclue::startUpdating()
+{
+    ASSERT(!m_geoclueClient);
+
+    GRefPtr<GeoclueMaster> master = adoptGRef(geoclue_master_get_default());
+    geoclue_master_create_client_async(master.get(), reinterpret_cast<GeoclueCreateClientCallback>(createGeoclueClientCallback), this);
+    m_isUpdating = true;
+}
+
+void GeolocationProviderGeoclue::stopUpdating()
+{
+    m_geocluePosition.clear();
+    m_geoclueClient.clear();
+    m_isUpdating = false;
+}
+
+void GeolocationProviderGeoclue::setEnableHighAccuracy(bool enable)
+{
+    m_enableHighAccuracy = enable;
+
+    // If we're already updating we should report the new requirements in order
+    // to change to a more suitable provider if needed. If not, return.
+    if (!m_isUpdating)
+        return;
+
+    updateClientRequirements();
+}
+
+void GeolocationProviderGeoclue::initializeGeoclueClient(GeoclueMasterClient* geoclueClient)
+{
+    ASSERT(GEOCLUE_IS_MASTER_CLIENT(geoclueClient));
+
+    // Store the GeoclueMasterClient object as created by GeoClue.
+    m_geoclueClient = adoptGRef(geoclueClient);
+
+    // Set the requirement for the client and ask it to create a position associated to it.
+    updateClientRequirements();
+    geoclue_master_client_create_position_async(m_geoclueClient.get(), reinterpret_cast<CreatePositionCallback>(createGeocluePositionCallback), this);
+}
+
+void GeolocationProviderGeoclue::initializeGeocluePosition(GeocluePosition* geocluePosition)
+{
+    ASSERT(GEOCLUE_IS_POSITION(geocluePosition));
+
+    // Stores the GeocluePosition object associated with the GeoclueMasterClient.
+    m_geocluePosition = adoptGRef(geocluePosition);
+
+    // Get the initial position and keep updated of further changes.
+    geoclue_position_get_position_async(m_geocluePosition.get(), reinterpret_cast<GeocluePositionCallback>(getPositionCallback), this);
+    g_signal_connect(m_geocluePosition.get(), "position-changed", G_CALLBACK(positionChangedCallback), this);
+}
+
+void GeolocationProviderGeoclue::updateClientRequirements()
+{
+    if (!m_geoclueClient)
+        return;
+
+    GeoclueAccuracyLevel accuracyLevel = m_enableHighAccuracy ? GEOCLUE_ACCURACY_LEVEL_DETAILED : GEOCLUE_ACCURACY_LEVEL_LOCALITY;
+    geoclue_master_client_set_requirements_async(m_geoclueClient.get(), accuracyLevel, 0, false, GEOCLUE_RESOURCE_ALL, reinterpret_cast<GeoclueSetRequirementsCallback>(geoclueClientSetRequirementsCallback), this);
+}
+
+void GeolocationProviderGeoclue::positionChanged(GeocluePosition* position, GeocluePositionFields fields, int timestamp, double latitude, double longitude, double altitude, GeoclueAccuracy* accuracy)
+{
+    if (!(fields & GEOCLUE_POSITION_FIELDS_LATITUDE && fields & GEOCLUE_POSITION_FIELDS_LONGITUDE)) {
+        errorOccurred("Position could not be determined.");
+        return;
+    }
+
+    m_timestamp = timestamp;
+    m_latitude = latitude;
+    m_longitude = longitude;
+    m_altitude = altitude;
+
+    geoclue_accuracy_get_details(accuracy, 0, &m_accuracy, &m_altitudeAccuracy);
+
+    m_client->notifyPositionChanged(m_timestamp, m_latitude, m_longitude, m_altitude, m_accuracy, m_altitudeAccuracy);
+}
+
+void GeolocationProviderGeoclue::errorOccurred(const char* message)
+{
+    m_client->notifyErrorOccurred(message);
+}
+
+#endif // ENABLE(GEOLOCATION)

Added: trunk/Source/WebCore/platform/geoclue/GeolocationProviderGeoclue.h (0 => 119249)


--- trunk/Source/WebCore/platform/geoclue/GeolocationProviderGeoclue.h	                        (rev 0)
+++ trunk/Source/WebCore/platform/geoclue/GeolocationProviderGeoclue.h	2012-06-01 17:05:37 UTC (rev 119249)
@@ -0,0 +1,69 @@
+/*
+ * Copyright (C) 2012 Igalia S.L.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public License
+ * along with this library; see the file COPYING.LIB.  If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+#ifndef GeolocationProviderGeoclue_h
+#define GeolocationProviderGeoclue_h
+
+#if ENABLE(GEOLOCATION)
+
+#include "GeolocationProviderGeoclueClient.h"
+#include <geoclue/geoclue-master.h>
+#include <geoclue/geoclue-position.h>
+#include <wtf/gobject/GRefPtr.h>
+
+namespace WebCore {
+
+class GeolocationProviderGeoclue {
+public:
+    GeolocationProviderGeoclue(GeolocationProviderGeoclueClient*);
+    ~GeolocationProviderGeoclue();
+
+    void startUpdating();
+    void stopUpdating();
+    void setEnableHighAccuracy(bool);
+
+    // To be used from signal callbacks.
+    void initializeGeoclueClient(GeoclueMasterClient*);
+    void initializeGeocluePosition(GeocluePosition*);
+    void updateClientRequirements();
+    void positionChanged(GeocluePosition*, GeocluePositionFields, int, double, double, double, GeoclueAccuracy*);
+    void errorOccurred(const char*);
+
+private:
+    GeolocationProviderGeoclueClient* m_client;
+
+    GRefPtr<GeoclueMasterClient> m_geoclueClient;
+    GRefPtr<GeocluePosition> m_geocluePosition;
+
+    double m_latitude;
+    double m_longitude;
+    double m_altitude;
+    double m_accuracy;
+    double m_altitudeAccuracy;
+    int m_timestamp;
+
+    bool m_enableHighAccuracy;
+    bool m_isUpdating;
+};
+
+} // namespace WebCore
+
+#endif // ENABLE(GEOLOCATION)
+
+#endif // GeolocationProviderGeoclue_h

Added: trunk/Source/WebCore/platform/geoclue/GeolocationProviderGeoclueClient.h (0 => 119249)


--- trunk/Source/WebCore/platform/geoclue/GeolocationProviderGeoclueClient.h	                        (rev 0)
+++ trunk/Source/WebCore/platform/geoclue/GeolocationProviderGeoclueClient.h	2012-06-01 17:05:37 UTC (rev 119249)
@@ -0,0 +1,37 @@
+/*
+ * Copyright (C) 2012 Igalia S.L.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public License
+ * along with this library; see the file COPYING.LIB.  If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+#ifndef GeolocationProviderGeoclueClient_h
+#define GeolocationProviderGeoclueClient_h
+
+#if ENABLE(GEOLOCATION)
+
+namespace WebCore {
+
+class GeolocationProviderGeoclueClient {
+public:
+    virtual void notifyPositionChanged(int timestamp, double latitude, double longitude, double altitude, double accuracy, double altitudeAccuracy) = 0;
+    virtual void notifyErrorOccurred(const char* message) = 0;
+};
+
+} // namespace WebCore
+
+#endif // ENABLE(GEOLOCATION)
+
+#endif // GeolocationProviderGeoclueClient_h
_______________________________________________
webkit-changes mailing list
[email protected]
http://lists.webkit.org/mailman/listinfo.cgi/webkit-changes

Reply via email to